void GxGDEW042T2_FPU::drawPaged(void (*drawCallback)(const void*, const void*), const void* p1, const void* p2) { if (_current_page != -1) return; _using_partial_mode = false; _wakeUp(); IO.writeCommandTransaction(0x13); for (_current_page = 0; _current_page < GxGDEW042T2_FPU_PAGES; _current_page++) { fillScreen(GxEPD_WHITE); drawCallback(p1, p2); for (int16_t y1 = 0; y1 < GxGDEW042T2_FPU_PAGE_HEIGHT; y1++) { for (int16_t x1 = 0; x1 < GxGDEW042T2_FPU_WIDTH / 8; x1++) { uint16_t idx = y1 * (GxGDEW042T2_FPU_WIDTH / 8) + x1; uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; IO.writeDataTransaction(~data); } } } _current_page = -1; IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("drawPaged"); _sleep(); }
void RadioReceiveTask::task() { _clearSerialBuffer(); _initialiseDiscoveryState(); // Packet byte packetBuffer[RADIO_PACKET_WITH_RSSI_LENGTH]; uint8_t packetBufferLength = 0; #ifdef RADIO_DEBUG_MODE uint8_t serialRingBufferHWM = 0; #endif _wakeUp(); _currentMessageReceiver = NO_CURRENT_MESSAGE; while (true) { uint8_t availableBytes = RADIO_SERIAL.available(); if (availableBytes > 0) { pinMode(PIN_LED_RXL, OUTPUT); digitalWrite(PIN_LED_RXL, 1); #ifdef RADIO_DEBUG_MODE if (serialRingBufferHWM < availableBytes) { serialRingBufferHWM = availableBytes; debug::log("RadioReceiveTask: serialRingBufferHWM=" + String(serialRingBufferHWM)); } #endif while (availableBytes > 0) { packetBuffer[packetBufferLength] = RADIO_SERIAL.read(); packetBufferLength++; availableBytes--; // Only handle one packet at a time if (packetBufferLength == RADIO_PACKET_WITH_RSSI_LENGTH) { break; // we have enough for one packet } } #ifdef RADIO_DEBUG_MODE_EXTENDED debug::log("RadioReceiveTask: Current buffer:"); debug::logByteArray(packetBuffer, packetBufferLength); #endif packetBufferLength = _parsePacketBuffer(packetBuffer, packetBufferLength); digitalWrite(PIN_LED_RXL, 0); _lastMessageReceived = xTaskGetTickCount(); } else { vTaskDelay(RADIO_NO_DATA_SLEEP_DURATION); } _checkForStateChange(); } }
void GxGDEW042T2_FPU::eraseDisplay(bool using_partial_update) { if (_current_page != -1) return; if (using_partial_update) { _using_partial_mode = true; // remember _wakeUp(); _Init_PartialUpdate(); // set full screen IO.writeCommandTransaction(0x91); // partial in _setPartialRamArea(0, 0, GxGDEW042T2_FPU_WIDTH - 1, GxGDEW042T2_FPU_HEIGHT - 1); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { IO.writeDataTransaction(0xFF); } IO.writeCommandTransaction(0x10); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { IO.writeDataTransaction(0xFF); } IO.writeCommandTransaction(0x92); // partial out IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("eraseDisplay"); } else { _using_partial_mode = false; // remember _wakeUp(); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { IO.writeDataTransaction(0xFF); } IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("eraseDisplay"); _sleep(); } }
void GxGDEW042T2_FPU::update(void) { if (_current_page != -1) return; _using_partial_mode = false; _wakeUp(); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { uint8_t data = i < sizeof(_buffer) ? _buffer[i] : 0x00; IO.writeDataTransaction(~data); } IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("update"); _sleep(); }
inline void RadioReceiveTask::_checkForStateChange() { if (_radioState == RADIO_STATE_DISCOVERY) { if (_discoveryFinishingTime <= xTaskGetTickCount()) { if (_bestChannel == NO_CHANNEL_DISCOVERED) { debug::log("RadioReceiveTask: No channel discovered during this discovery period. Will sleep for certain time and try again"); _sleep(); vTaskDelay(RADIO_UNSUCCESSFUL_DISCOVERY_SLEEP); _wakeUp(); vTaskDelay(RADIO_WAKEUP_TIME); _initialiseDiscoveryState(); } else { _initialiseReceiveState(); } } } else if (_radioState == RADIO_STATE_RECEIVE) { if (_lastMessageReceived + RADIO_RECEIVE_TIMEOUT <= xTaskGetTickCount()) { debug::log("RadioReceiveTask: Main channel timeout - Going back to disovery"); _initialiseDiscoveryState(); } } }
void GxGDEW042T2_FPU::drawCornerTest(uint8_t em) { if (_current_page != -1) return; _using_partial_mode = false; _wakeUp(); IO.writeCommandTransaction(0x13); for (uint32_t y = 0; y < GxGDEW042T2_FPU_HEIGHT; y++) { for (uint32_t x = 0; x < GxGDEW042T2_FPU_WIDTH / 8; x++) { uint8_t data = 0xFF; if ((x < 1) && (y < 8)) data = 0x00; if ((x > GxGDEW042T2_FPU_WIDTH / 8 - 3) && (y < 16)) data = 0x00; if ((x > GxGDEW042T2_FPU_WIDTH / 8 - 4) && (y > GxGDEW042T2_FPU_HEIGHT - 25)) data = 0x00; if ((x < 4) && (y > GxGDEW042T2_FPU_HEIGHT - 33)) data = 0x00; IO.writeDataTransaction(data); } } IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("drawCornerTest"); _sleep(); }
void GxGDEW042T2_FPU::updateToWindow(uint16_t xs, uint16_t ys, uint16_t xd, uint16_t yd, uint16_t w, uint16_t h, bool using_rotation) { if (using_rotation) { switch (getRotation()) { case 1: swap(xs, ys); swap(xd, yd); swap(w, h); xs = GxGDEW042T2_FPU_WIDTH - xs - w - 1; xd = GxGDEW042T2_FPU_WIDTH - xd - w - 1; break; case 2: xs = GxGDEW042T2_FPU_WIDTH - xs - w - 1; ys = GxGDEW042T2_FPU_HEIGHT - ys - h - 1; xd = GxGDEW042T2_FPU_WIDTH - xd - w - 1; yd = GxGDEW042T2_FPU_HEIGHT - yd - h - 1; break; case 3: swap(xs, ys); swap(xd, yd); swap(w, h); ys = GxGDEW042T2_FPU_HEIGHT - ys - h - 1; yd = GxGDEW042T2_FPU_HEIGHT - yd - h - 1; break; } } _wakeUp(); _using_partial_mode = true; _Init_PartialUpdate(); _writeToWindow(xs, ys, xd, yd, w, h); IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("updateToWindow"); delay(500); // don't stress this display }
void GxGDEW042T2_FPU::updateWindow(uint16_t x, uint16_t y, uint16_t w, uint16_t h, bool using_rotation) { if (_current_page != -1) return; if (using_rotation) { switch (getRotation()) { case 1: swap(x, y); swap(w, h); x = GxGDEW042T2_FPU_WIDTH - x - w - 1; break; case 2: x = GxGDEW042T2_FPU_WIDTH - x - w - 1; y = GxGDEW042T2_FPU_HEIGHT - y - h - 1; break; case 3: swap(x, y); swap(w, h); y = GxGDEW042T2_FPU_HEIGHT - y - h - 1; break; } } //fillScreen(0x0); if (x >= GxGDEW042T2_FPU_WIDTH) return; if (y >= GxGDEW042T2_FPU_HEIGHT) return; // x &= 0xFFF8; // byte boundary, not here, use encompassing rectangle uint16_t xe = min(GxGDEW042T2_FPU_WIDTH, x + w) - 1; uint16_t ye = min(GxGDEW042T2_FPU_HEIGHT, y + h) - 1; // x &= 0xFFF8; // byte boundary, not needed here uint16_t xs_bx = x / 8; uint16_t xe_bx = (xe + 7) / 8; if (!_using_partial_mode) _wakeUp(); _using_partial_mode = true; _Init_PartialUpdate(); IO.writeCommandTransaction(0x91); // partial in _setPartialRamArea(x, y, xe, ye); IO.writeCommandTransaction(0x13); for (int16_t y1 = y; y1 <= ye; y1++) { for (int16_t x1 = xs_bx; x1 < xe_bx; x1++) { uint16_t idx = y1 * (GxGDEW042T2_FPU_WIDTH / 8) + x1; uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; IO.writeDataTransaction(~data); } } IO.writeCommandTransaction(0x92); // partial out IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("updateWindow"); IO.writeCommandTransaction(0x91); // partial in _setPartialRamArea(x, y, xe, ye); IO.writeCommandTransaction(0x13); for (int16_t y1 = y; y1 <= ye; y1++) { for (int16_t x1 = xs_bx; x1 < xe_bx; x1++) { uint16_t idx = y1 * (GxGDEW042T2_FPU_WIDTH / 8) + x1; uint8_t data = (idx < sizeof(_buffer)) ? _buffer[idx] : 0x00; IO.writeDataTransaction(~data); } } IO.writeCommandTransaction(0x92); // partial out }
void GxGDEW042T2_FPU::drawBitmap(const uint8_t *bitmap, uint32_t size, int16_t mode) { if (_current_page != -1) return; if (mode & bm_default) mode |= bm_normal; if (mode & bm_partial_update) { _using_partial_mode = true; // remember _wakeUp(); _Init_PartialUpdate(); // set full screen IO.writeCommandTransaction(0x91); // partial in _setPartialRamArea(0, 0, GxGDEW042T2_FPU_WIDTH - 1, GxGDEW042T2_FPU_HEIGHT - 1); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { uint8_t data = 0xFF; // white is 0xFF on device if (i < size) { #if defined(__AVR) || defined(ESP8266) || defined(ESP32) data = pgm_read_byte(&bitmap[i]); #else data = bitmap[i]; #endif if (mode & bm_invert) data = ~data; } IO.writeDataTransaction(data); } IO.writeCommandTransaction(0x92); // partial out IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("drawBitmap"); // update erase buffer IO.writeCommandTransaction(0x91); // partial in _setPartialRamArea(0, 0, GxGDEW042T2_FPU_WIDTH - 1, GxGDEW042T2_FPU_HEIGHT - 1); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { uint8_t data = 0xFF; // white is 0xFF on device if (i < size) { #if defined(__AVR) || defined(ESP8266) || defined(ESP32) data = pgm_read_byte(&bitmap[i]); #else data = bitmap[i]; #endif if (mode & bm_invert) data = ~data; } IO.writeDataTransaction(data); } IO.writeCommandTransaction(0x92); // partial out _waitWhileBusy("drawBitmap"); } else { _using_partial_mode = false; // remember _wakeUp(); IO.writeCommandTransaction(0x13); for (uint32_t i = 0; i < GxGDEW042T2_FPU_BUFFER_SIZE; i++) { uint8_t data = 0xFF; // white is 0xFF on device if (i < size) { #if defined(__AVR) || defined(ESP8266) || defined(ESP32) data = pgm_read_byte(&bitmap[i]); #else data = bitmap[i]; #endif if (mode & bm_invert) data = ~data; } IO.writeDataTransaction(data); } IO.writeCommandTransaction(0x12); //display refresh _waitWhileBusy("drawBitmap"); _sleep(); } }