diff --git a/include/ledmatrixdisplay.h b/include/ledmatrixdisplay.h index 5c3dca0d..d5878f71 100644 --- a/include/ledmatrixdisplay.h +++ b/include/ledmatrixdisplay.h @@ -13,6 +13,6 @@ void refreshTheMatrixDisplay(bool nextPage = false); void DrawNumber(String strNum, uint8_t iDotPos = 0); uint8_t GetCharFromFont(char cChar); uint8_t GetCharWidth(char cChar); -void ShiftLeft(uint8_t *arr, uint32_t len); +void ScrollLeft(uint8_t *buf, uint16_t cols, uint16_t rows); #endif \ No newline at end of file diff --git a/src/hal/tinypicomatrix.h b/src/hal/tinypicomatrix.h index c24c8059..73597446 100644 --- a/src/hal/tinypicomatrix.h +++ b/src/hal/tinypicomatrix.h @@ -24,8 +24,8 @@ // LED Matrix display settings #define HAS_MATRIX_DISPLAY 1 // Uncomment to enable LED matrix display output -#define LED_MATRIX_WIDTH 64 // Width in pixels (LEDs) of your display -#define LED_MATRIX_HEIGHT 16 // Height in pixels (LEDs ) of your display +#define LED_MATRIX_WIDTH (32*2) // Width (cols) in pixels (LEDs) of your display, must be 32X +#define LED_MATRIX_HEIGHT (16*1) // Height (rows) in pixels (LEDs) of your display, must be 16X // Explanation of pin signals see https://learn.adafruit.com/32x16-32x32-rgb-led-matrix/new-wiring #define MATRIX_DISPLAY_SCAN_US 500 // Matrix display scan rate in microseconds (1ms is about 'acceptable') diff --git a/src/hal/wemos32matrix.h b/src/hal/wemos32matrix.h index 66935f00..b69ac074 100644 --- a/src/hal/wemos32matrix.h +++ b/src/hal/wemos32matrix.h @@ -11,8 +11,8 @@ // LED Matrix display settings #define HAS_MATRIX_DISPLAY 1 // Uncomment to enable LED matrix display output -#define LED_MATRIX_WIDTH 64 // Width in pixels (LEDs) of your display -#define LED_MATRIX_HEIGHT 16 // Height in pixels (LEDs ) of your display +#define LED_MATRIX_WIDTH (32*2) // Width (cols) in pixels (LEDs) of your display, must be 32X +#define LED_MATRIX_HEIGHT (16*1) // Height (rows) in pixels (LEDs) of your display, must be 16X // Pin numbers work fine for Wemos Lolin32 board (all used pins are on 1 side of the board) // Explanation of pin signals see https://learn.adafruit.com/32x16-32x32-rgb-led-matrix/new-wiring diff --git a/src/ledmatrixdisplay.cpp b/src/ledmatrixdisplay.cpp index c517fdf7..ffdad8c0 100644 --- a/src/ledmatrixdisplay.cpp +++ b/src/ledmatrixdisplay.cpp @@ -2,16 +2,14 @@ #include "globals.h" -#define NUMROWS 16 -#define NUMCOLS 64 #define MATRIX_DISPLAY_PAGES (2) // number of display pages #define LINE_DIAGRAM_DIVIDER (2) // scales pax numbers to led rows // local Tag for logging static const char TAG[] = __FILE__; -static const uint32_t DisplaySize = LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT / 8; -uint8_t MatrixDisplayIsOn = 0, displaybuf[DisplaySize] = {0}; +uint8_t MatrixDisplayIsOn = 0; +static uint8_t displaybuf[LED_MATRIX_WIDTH * LED_MATRIX_HEIGHT / 8] = {0}; static unsigned long ulLastNumMacs = 0; static time_t ulLastTime = myTZ.toLocal(now()); @@ -40,7 +38,7 @@ void init_matrix_display(bool reverse) { if (reverse) matrix.reverse(); matrix.clear(); - matrix.drawPoint(0, NUMROWS - 1, 1); + matrix.drawPoint(0, LED_MATRIX_HEIGHT - 1, 1); } // init_display void refreshTheMatrixDisplay(bool nextPage) { @@ -93,10 +91,10 @@ void refreshTheMatrixDisplay(bool nextPage) { if (macs.size() == 0) { // matrix full? then scroll left 1 dot, else increment column - if (col < NUMCOLS - 1) + if (col < (LED_MATRIX_WIDTH - 1)) col++; else - ShiftLeft(displaybuf, DisplaySize); + ScrollLeft(displaybuf, LED_MATRIX_WIDTH, LED_MATRIX_HEIGHT); } else matrix.drawPoint(col, row, 0); // clear current dot @@ -104,7 +102,9 @@ void refreshTheMatrixDisplay(bool nextPage) { // scale and set new dot ulLastNumMacs = macs.size(); level = ulLastNumMacs / LINE_DIAGRAM_DIVIDER; - row = level <= NUMROWS ? NUMROWS - 1 - level % NUMROWS : 0; + row = level <= LED_MATRIX_HEIGHT + ? LED_MATRIX_HEIGHT - 1 - level % LED_MATRIX_HEIGHT + : 0; matrix.drawPoint(col, row, 1); } } @@ -204,12 +204,17 @@ uint8_t GetCharWidth(char cChar) { return CharDescriptor.width; } -void ShiftLeft(uint8_t *arr, uint32_t len) { - uint32_t i; - for (i = 0; i < len - 1; ++i) { - arr[i] = (arr[i] << 1) | ((arr[i + 1] >> 31) & 1); +void ScrollLeft(uint8_t *buf, uint16_t cols, uint16_t rows) { + uint32_t i, k, idx; + + for (k = 0; k < rows; k++) { + // scroll a line with x bytes one dot to the left + for (i = 0; i < cols / 8 - 1; ++i) { + idx = i + k * cols / 8; + buf[idx] = (buf[idx] << 1) | ((buf[idx + 1] >> 7) & 1); + } + buf[idx + 1] <<= 1; } - arr[len - 1] = arr[len - 1] << 1; } #endif // HAS_MATRIX_DISPLAY \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp index 087bf867..eb9398aa 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -36,7 +36,6 @@ timesync_req 1 3 processes realtime time sync requests lmictask 1 2 MCCI LMiC LORAWAN stack irqhandler 1 1 display, timesync, gps, etc. triggered by timers gpsloop 1 1 reads data from GPS via serial or i2c -looptask 1 1 arduino loop (unused) IDLE 1 0 ESP32 arduino scheduler -> runs wifi channel rotator Low priority numbers denote low priority tasks. diff --git a/src/timekeeper.cpp b/src/timekeeper.cpp index 16236de0..85f62864 100644 --- a/src/timekeeper.cpp +++ b/src/timekeeper.cpp @@ -54,7 +54,7 @@ void calibrateTime(void) { } #endif -goto finish; + goto finish; finish: @@ -66,6 +66,10 @@ finish: void IRAM_ATTR setMyTime(uint32_t t_sec, uint16_t t_msec, timesource_t mytimesource) { + // called with invalid timesource? + if (mytimesource == _unsynced) + return; + // increment t_sec only if t_msec > 1000 time_t time_to_set = (time_t)(t_sec + t_msec / 1000); diff --git a/src/timesync.cpp b/src/timesync.cpp index b1814538..b44a955a 100644 --- a/src/timesync.cpp +++ b/src/timesync.cpp @@ -178,7 +178,7 @@ int recv_timesync_ans(uint8_t seq_no, uint8_t buf[], uint8_t buf_len) { // the 5th byte contains the fractional seconds in 2^-8 second steps // (= 1/250th sec), we convert this to ms uint16_t timestamp_msec = 4 * buf[4]; - // pointers to 4 bytes 4 bytes containing UTC seconds since unix epoch, msb + // pointers to 4 bytes containing UTC seconds since unix epoch, msb uint32_t timestamp_sec, *timestamp_ptr; // convert buffer to uint32_t, octet order is big endian