summaryrefslogtreecommitdiff
path: root/shared-module
diff options
context:
space:
mode:
authorsommersoft <sommersoft@gmail.com>2019-03-01 21:24:30 -0600
committersommersoft <sommersoft@gmail.com>2019-03-01 21:24:30 -0600
commita44bfc2730c246738dd8d636d18ffb6591673864 (patch)
tree786621e0549a8f2dee327fc0d04bd2c5786c8d10 /shared-module
parent4d47ce5c60d5e024b9a95f58372bfbb27772ef1a (diff)
parent17bf2afa414d605676643be301a05d74c3b68290 (diff)
Merge branch 'master' of https://github.com/adafruit/circuitpython into new_freq_in
Diffstat (limited to 'shared-module')
-rw-r--r--shared-module/_pew/PewPew.c125
-rw-r--r--shared-module/_pew/PewPew.h48
-rw-r--r--shared-module/_pew/__init__.c85
-rw-r--r--shared-module/_pew/__init__.h32
-rw-r--r--shared-module/displayio/OnDiskBitmap.c120
-rw-r--r--shared-module/displayio/OnDiskBitmap.h4
6 files changed, 371 insertions, 43 deletions
diff --git a/shared-module/_pew/PewPew.c b/shared-module/_pew/PewPew.c
new file mode 100644
index 000000000..c1d6aa5c3
--- /dev/null
+++ b/shared-module/_pew/PewPew.c
@@ -0,0 +1,125 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Radomir Dopieralski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+
+#include "py/mpstate.h"
+#include "py/runtime.h"
+#include "__init__.h"
+#include "PewPew.h"
+
+#include "shared-bindings/digitalio/Pull.h"
+#include "shared-bindings/digitalio/DigitalInOut.h"
+#include "shared-bindings/util.h"
+#include "samd/timers.h"
+#include "supervisor/shared/translate.h"
+#include "timer_handler.h"
+
+
+static uint8_t pewpew_tc_index = 0xff;
+
+
+void pewpew_interrupt_handler(uint8_t index) {
+ if (index != pewpew_tc_index) {
+ return;
+ }
+ Tc* tc = tc_insts[index];
+ if (!tc->COUNT16.INTFLAG.bit.MC0) {
+ return;
+ }
+
+ pew_tick();
+
+ // Clear the interrupt bit.
+ tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0;
+}
+
+void pew_init() {
+ pew_obj_t* pew = MP_STATE_VM(pew_singleton);
+
+ common_hal_digitalio_digitalinout_switch_to_input(pew->buttons, PULL_UP);
+
+ for (size_t i = 0; i < pew->rows_size; ++i) {
+ digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pew->rows[i]);
+ common_hal_digitalio_digitalinout_switch_to_output(pin, false,
+ DRIVE_MODE_PUSH_PULL);
+ }
+ for (size_t i = 0; i < pew->cols_size; ++i) {
+ digitalio_digitalinout_obj_t *pin = MP_OBJ_TO_PTR(pew->cols[i]);
+ common_hal_digitalio_digitalinout_switch_to_output(pin, true,
+ DRIVE_MODE_OPEN_DRAIN);
+ }
+ if (pewpew_tc_index == 0xff) {
+ // Find a spare timer.
+ uint8_t index = find_free_timer();
+ if (index == 0xff) {
+ mp_raise_RuntimeError(translate(""));
+ }
+ Tc *tc = tc_insts[index];
+
+ pewpew_tc_index = index;
+ set_timer_handler(true, index, TC_HANDLER_PEW);
+
+ // We use GCLK0 for SAMD21 and GCLK1 for SAMD51 because they both run
+ // at 48mhz making our math the same across the boards.
+ #ifdef SAMD21
+ turn_on_clocks(true, index, 0);
+ #endif
+ #ifdef SAMD51
+ turn_on_clocks(true, index, 1);
+ #endif
+
+
+ #ifdef SAMD21
+ tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16 |
+ TC_CTRLA_PRESCALER_DIV64 |
+ TC_CTRLA_WAVEGEN_MFRQ;
+ #endif
+ #ifdef SAMD51
+ tc_reset(tc);
+ tc_set_enable(tc, false);
+ tc->COUNT16.CTRLA.reg = TC_CTRLA_MODE_COUNT16
+ | TC_CTRLA_PRESCALER_DIV64;
+ tc->COUNT16.WAVE.reg = TC_WAVE_WAVEGEN_MFRQ;
+ #endif
+
+ tc_set_enable(tc, true);
+ tc->COUNT16.CC[0].reg = 160;
+
+ // Clear our interrupt in case it was set earlier
+ tc->COUNT16.INTFLAG.reg = TC_INTFLAG_MC0;
+ tc->COUNT16.INTENSET.reg = TC_INTENSET_MC0;
+ tc_enable_interrupts(pewpew_tc_index);
+ }
+}
+
+void pew_reset(void) {
+ if (pewpew_tc_index != 0xff) {
+ tc_reset(tc_insts[pewpew_tc_index]);
+ pewpew_tc_index = 0xff;
+ }
+ MP_STATE_VM(pew_singleton) = NULL;
+}
diff --git a/shared-module/_pew/PewPew.h b/shared-module/_pew/PewPew.h
new file mode 100644
index 000000000..da1cae0a2
--- /dev/null
+++ b/shared-module/_pew/PewPew.h
@@ -0,0 +1,48 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Radomir Dopieralski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_PEW_PEWPEW_H
+#define MICROPY_INCLUDED_PEW_PEWPEW_H
+
+#include <stdint.h>
+#include "shared-bindings/digitalio/DigitalInOut.h"
+
+typedef struct {
+ mp_obj_base_t base;
+ uint8_t* buffer;
+ mp_obj_t* rows;
+ mp_obj_t* cols;
+ digitalio_digitalinout_obj_t *buttons;
+ uint8_t rows_size;
+ uint8_t cols_size;
+ uint8_t pressed;
+} pew_obj_t;
+
+void pew_init(void);
+void pewpew_interrupt_handler(uint8_t index);
+void pew_reset(void);
+
+#endif // MICROPY_INCLUDED_PEW_PEWPEW_H
diff --git a/shared-module/_pew/__init__.c b/shared-module/_pew/__init__.c
new file mode 100644
index 000000000..90fba3990
--- /dev/null
+++ b/shared-module/_pew/__init__.c
@@ -0,0 +1,85 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Radomir Dopieralski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#include <stdbool.h>
+
+#include "py/mpstate.h"
+#include "__init__.h"
+#include "PewPew.h"
+
+#include "shared-bindings/digitalio/DigitalInOut.h"
+
+
+void pew_tick(void) {
+ static uint8_t col = 0;
+ static uint8_t turn = 0;
+ static uint8_t pressed = 0;
+ static uint8_t last_pressed = 0;
+ digitalio_digitalinout_obj_t *pin;
+
+ pew_obj_t* pew = MP_STATE_VM(pew_singleton);
+ if (!pew) { return; }
+
+ pin = MP_OBJ_TO_PTR(pew->cols[col]);
+ ++col;
+ if (col >= pew->cols_size) {
+ pew->pressed |= last_pressed & pressed;
+ last_pressed = pressed;
+ pressed = 0;
+ col = 0;
+ ++turn;
+ if (turn >= 8) {
+ turn = 0;
+ }
+ }
+ if (!common_hal_digitalio_digitalinout_get_value(pew->buttons)) {
+ pressed |= 1 << col;
+ }
+ common_hal_digitalio_digitalinout_set_value(pin, true);
+ for (size_t x = 0; x < pew->rows_size; ++x) {
+ pin = MP_OBJ_TO_PTR(pew->rows[x]);
+ uint8_t color = pew->buffer[col * (pew->rows_size) + x];
+ bool value = false;
+ switch (color & 0x03) {
+ case 3:
+ value = true;
+ break;
+ case 2:
+ if (turn == 2 || turn == 4 || turn == 6) {
+ value = true;
+ }
+ case 1:
+ if (turn == 0) {
+ value = true;
+ }
+ case 0:
+ break;
+ }
+ common_hal_digitalio_digitalinout_set_value(pin, value);
+ }
+ pin = MP_OBJ_TO_PTR(pew->cols[col]);
+ common_hal_digitalio_digitalinout_set_value(pin, false);
+}
diff --git a/shared-module/_pew/__init__.h b/shared-module/_pew/__init__.h
new file mode 100644
index 000000000..4f953c610
--- /dev/null
+++ b/shared-module/_pew/__init__.h
@@ -0,0 +1,32 @@
+/*
+ * This file is part of the MicroPython project, http://micropython.org/
+ *
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Radomir Dopieralski
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+#ifndef MICROPY_INCLUDED_PEW_H
+#define MICROPY_INCLUDED_PEW_H
+
+void pew_tick(void);
+
+#endif // MICROPY_INCLUDED_PEW_H
diff --git a/shared-module/displayio/OnDiskBitmap.c b/shared-module/displayio/OnDiskBitmap.c
index bc3064632..d710bdae0 100644
--- a/shared-module/displayio/OnDiskBitmap.c
+++ b/shared-module/displayio/OnDiskBitmap.c
@@ -56,42 +56,65 @@ void common_hal_displayio_ondiskbitmap_construct(displayio_ondiskbitmap_t *self,
uint16_t bits_per_pixel = bmp_header[14];
uint32_t compression = read_word(bmp_header, 15);
uint32_t number_of_colors = read_word(bmp_header, 23);
+
+ bool indexed = ((bits_per_pixel <= 8) && (number_of_colors != 0));
self->bitfield_compressed = (compression == 3);
-
- self->grayscale = ((bits_per_pixel == 8) && (number_of_colors == 256));
+ self->bits_per_pixel = bits_per_pixel;
+ self->width = read_word(bmp_header, 9);
+ self->height = read_word(bmp_header, 11);
+
if (bits_per_pixel == 16){
- if (((header_size == 124) || (header_size == 56)) && (self->bitfield_compressed)) {
+ if (((header_size >= 56)) || (self->bitfield_compressed)) {
self->r_bitmask = read_word(bmp_header, 27);
self->g_bitmask = read_word(bmp_header, 29);
self->b_bitmask = read_word(bmp_header, 31);
- if (!((self->r_bitmask == 0xf800) && (self->g_bitmask == 0x07e0) && (self->b_bitmask == 0x001f))){
- mp_raise_ValueError_varg(translate("Only 16bpp RGB 565 supported for bitfield compressed BMPs; R:%x G:%x B:%x"),
- self->r_bitmask, self->g_bitmask, self->b_bitmask);
- }
- } else if (header_size == 40){ // no bitmasks means 5:5:5
+ } else { // no compression or short header means 5:5:5
self->r_bitmask = 0x7c00;
self->g_bitmask = 0x3e0;
self->b_bitmask = 0x1f;
}
+ } else if ((indexed) && (self->bits_per_pixel != 1)) {
+ uint16_t palette_size = number_of_colors * sizeof(uint32_t);
+ uint16_t palette_offset = 0xe + header_size;
+
+ self->palette_data = m_malloc(palette_size, false);
+
+ f_rewind(&self->file->fp);
+ f_lseek(&self->file->fp, palette_offset);
+
+ UINT palette_bytes_read;
+ if (f_read(&self->file->fp, self->palette_data, palette_size, &palette_bytes_read) != FR_OK) {
+ mp_raise_OSError(MP_EIO);
+ }
+ if (palette_bytes_read != palette_size) {
+ mp_raise_ValueError(translate("Unable to read color palette data"));
+ }
+
- } else if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124) ||
- !(compression == 0)) {
- mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported %d"), header_size);
+ } else if (!(header_size == 12 || header_size == 40 || header_size == 108 || header_size == 124)) {
+ mp_raise_ValueError_varg(translate("Only Windows format, uncompressed BMP supported: given header size is %d"), header_size);
}
- if (bits_per_pixel < 16 && !(self->grayscale)) {
- mp_raise_ValueError_varg(translate("Only true color (24 bpp or higher), 16bpp 565 and 555, and 8bpp grayscale BMP supported %d"), bits_per_pixel);
+ if ((bits_per_pixel == 4 ) || (( bits_per_pixel == 8) && (number_of_colors == 0))) {
+ mp_raise_ValueError_varg(translate("Only monochrome, indexed 8bpp, and 16bpp or greater BMPs supported: %d bpp given"), bits_per_pixel);
}
- self->bytes_per_pixel = bits_per_pixel / 8;
- self->width = read_word(bmp_header, 9);
- self->height = read_word(bmp_header, 11);
- uint32_t byte_width = self->width * self->bytes_per_pixel;
- self->stride = byte_width;
- // Rows are word aligned.
- if (self->stride % 4 != 0) {
- self->stride += 4 - self->stride % 4;
+
+ if (self->bits_per_pixel >=8){
+ self->stride = (self->width * (bits_per_pixel / 8));
+ // Rows are word aligned.
+ if (self->stride % 4 != 0) {
+ self->stride += 4 - self->stride % 4;
+ }
+
+ } else {
+ uint32_t bit_stride = self->width;
+ if (bit_stride % 32 != 0) {
+ bit_stride += 32 - bit_stride % 32;
+ }
+ self->stride = (bit_stride / 8);
}
+
}
@@ -100,39 +123,54 @@ uint32_t common_hal_displayio_ondiskbitmap_get_pixel(displayio_ondiskbitmap_t *s
if (x < 0 || x >= self->width || y < 0 || y >= self->height) {
return 0;
}
- uint32_t location = self->data_offset + (self->height - y) * self->stride + x * self->bytes_per_pixel;
+ uint32_t location;
+ uint8_t bytes_per_pixel = (self->bits_per_pixel / 8) ? (self->bits_per_pixel /8) : 1;
+ if (self->bits_per_pixel >= 8){
+ location = self->data_offset + (self->height - y) * self->stride + x * bytes_per_pixel;
+ } else {
+ location = self->data_offset + (self->height - y) * self->stride + x / 8;
+ }
// We don't cache here because the underlying FS caches sectors.
f_lseek(&self->file->fp, location);
UINT bytes_read;
- uint32_t pixel = 0;
- uint32_t result = f_read(&self->file->fp, &pixel, self->bytes_per_pixel, &bytes_read);
+ uint32_t pixel_data = 0;
+ uint32_t result = f_read(&self->file->fp, &pixel_data, bytes_per_pixel, &bytes_read);
if (result == FR_OK) {
uint32_t tmp = 0;
uint8_t red;
uint8_t green;
uint8_t blue;
- if (self->grayscale){
- red = pixel;
- green = pixel;
- blue = pixel;
- tmp = (red << 16 | green << 8 | blue);
- return tmp;
- } else if (self->bytes_per_pixel == 2) {
- if (self->bitfield_compressed){
- red =((pixel & self->r_bitmask) >>11);
- green = ((pixel & self->g_bitmask) >>5);
- blue = ((pixel & self->b_bitmask) >> 0);
+ if (self->bits_per_pixel == 1){
+ uint8_t bit_offset = x%8;
+ tmp = ( pixel_data & (0x80 >> (bit_offset))) >> (7 - bit_offset);
+ if (tmp == 1) {
+ return 0x00FFFFFF;
} else {
- red =((pixel & self->r_bitmask) >>10);
- green = ((pixel & self->g_bitmask) >>4);
- blue = ((pixel & self->b_bitmask) >> 0);
+ return 0x00000000;
+ }
+ } else if (bytes_per_pixel == 1){
+ blue = ((self->palette_data[pixel_data] & 0xFF) >> 0);
+ red = ((self->palette_data[pixel_data] & 0xFF0000) >> 16);
+ green = ((self->palette_data[pixel_data] & 0xFF00) >> 8);
+ tmp = (red << 16 | green << 8 | blue );
+ return tmp;
+ } else if (bytes_per_pixel == 2) {
+ if (self->g_bitmask == 0x07e0) { // 565
+ red =((pixel_data & self->r_bitmask) >>11);
+ green = ((pixel_data & self->g_bitmask) >>5);
+ blue = ((pixel_data & self->b_bitmask) >> 0);
+ } else { // 555
+ red =((pixel_data & self->r_bitmask) >>10);
+ green = ((pixel_data & self->g_bitmask) >>4);
+ blue = ((pixel_data & self->b_bitmask) >> 0);
}
tmp = (red << 19 | green << 10 | blue << 3);
return tmp;
- }else {
- return pixel;
+ } else if ((bytes_per_pixel == 4) && (self->bitfield_compressed)) {
+ return pixel_data & 0x00FFFFFF;
+ } else {
+ return pixel_data;
}
-
}
return 0;
}
diff --git a/shared-module/displayio/OnDiskBitmap.h b/shared-module/displayio/OnDiskBitmap.h
index 2102863d6..28426f11b 100644
--- a/shared-module/displayio/OnDiskBitmap.h
+++ b/shared-module/displayio/OnDiskBitmap.h
@@ -44,9 +44,9 @@ typedef struct {
uint32_t g_bitmask;
uint32_t b_bitmask;
bool bitfield_compressed;
- bool grayscale;
pyb_file_obj_t* file;
- uint8_t bytes_per_pixel;
+ uint8_t bits_per_pixel;
+ uint32_t* palette_data;
} displayio_ondiskbitmap_t;
#endif // MICROPY_INCLUDED_SHARED_MODULE_DISPLAYIO_ONDISKBITMAP_H