diff --git a/examples/color/CMakeLists.txt b/examples/color/CMakeLists.txt new file mode 100644 index 00000000..dbb589f6 --- /dev/null +++ b/examples/color/CMakeLists.txt @@ -0,0 +1,4 @@ +cmake_minimum_required(VERSION 3.16.0) +set(EXTRA_COMPONENT_DIRS "../../") +include($ENV{IDF_PATH}/tools/cmake/project.cmake) +project(color_example) diff --git a/examples/color/README.md b/examples/color/README.md new file mode 100644 index 00000000..dfd016a8 --- /dev/null +++ b/examples/color/README.md @@ -0,0 +1,7 @@ +A demo showing a Full-Screen Image +================================== + +*The image size is chosen to fit a 1200 * 825 display!* + +Image by David REVOY / CC BY (https://creativecommons.org/licenses/by/3.0) +https://commons.wikimedia.org/wiki/File:Durian_-_Sintel-wallpaper-dragon.jpg diff --git a/examples/color/main/CMakeLists.txt b/examples/color/main/CMakeLists.txt new file mode 100644 index 00000000..475be06b --- /dev/null +++ b/examples/color/main/CMakeLists.txt @@ -0,0 +1,3 @@ +set(app_sources "main.c") + +idf_component_register(SRCS ${app_sources} REQUIRES epdiy) diff --git a/examples/color/main/main.c b/examples/color/main/main.c new file mode 100644 index 00000000..fd95164f --- /dev/null +++ b/examples/color/main/main.c @@ -0,0 +1,81 @@ +/* Simple firmware for a ESP32 displaying a Color square in a DES epaper screen with CFA on top */ +#include "esp_heap_caps.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + + +#include "esp_sleep.h" +#include +#include "epd_highlevel.h" + +EpdiyHighlevelState hl; +int temperature = 25; +// Buffers +uint8_t *fb; // EPD 2bpp buffer + +int color_test() { + EpdRect epd_area = { + .x = 0, + .y = 0, + .width = epd_width()/2, + .height = epd_height() + }; + + uint8_t color_of = 0; + /** + * @brief PATTERN + * pix1 2 3 X + * B G R row:1 + * G R B row:2 + * R B G row:3 + */ + for (uint16_t y=1; y= 560 && y < 1120) { + epd_draw_cpixel(x, y, color_of, x/10, color_of, hl.front_fb); + } else { + epd_draw_cpixel(x, y, color_of, color_of, x/10, hl.front_fb); + } + } + vTaskDelay(1); + } + + enum EpdDrawError _err = epd_hl_update_screen(&hl, MODE_GC16, temperature); + epd_poweroff(); + return _err; +} + +// Deepsleep +#define DEEP_SLEEP_SECONDS 300 +uint64_t USEC = 1000000; +int getFreePsram(){ + multi_heap_info_t info; + heap_caps_get_info(&info, MALLOC_CAP_SPIRAM); + return info.total_free_bytes; +} + +#ifndef ARDUINO_ARCH_ESP32 +void app_main() { + printf("before epd_init() Free PSRAM: %d\n", getFreePsram()); + + epd_init(&epd_board_v7, &epdiy_GDEW101C01, EPD_LUT_64K); + // Set VCOM for boards that allow to set this in software (in mV). + epd_set_vcom(1560); + hl = epd_hl_init(EPD_BUILTIN_WAVEFORM); + fb = epd_hl_get_framebuffer(&hl); + printf("after epd_hl_init() Free PSRAM: %d\n", getFreePsram()); + + + epd_poweron(); + color_test(); + printf("color example\n"); + + vTaskDelay(pdMS_TO_TICKS(5000)); + esp_sleep_enable_timer_wakeup(DEEP_SLEEP_SECONDS * USEC); + esp_deep_sleep_start(); +} + +#endif diff --git a/examples/www-image/main/CMakeLists.txt b/examples/www-image/main/CMakeLists.txt index b92539e7..cea302c3 100644 --- a/examples/www-image/main/CMakeLists.txt +++ b/examples/www-image/main/CMakeLists.txt @@ -1,6 +1,7 @@ set( - app_sources "jpg-render.c" + #app_sources "jpg-render.c" #app_sources "jpgdec-render.cpp" + app_sources "jpg-render-color.c" ) idf_component_register(SRCS ${app_sources} diff --git a/examples/www-image/main/jpg-render-color.c b/examples/www-image/main/jpg-render-color.c new file mode 100644 index 00000000..2e21a17e --- /dev/null +++ b/examples/www-image/main/jpg-render-color.c @@ -0,0 +1,493 @@ +// Open settings.h to set WiFi and other configurations for both examples: +#include "settings.h" +#include "esp_heap_caps.h" +#include "esp_log.h" +#include "esp_timer.h" +#include "esp_types.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/event_groups.h" +#include "esp_sleep.h" +// WiFi related +#include "esp_wifi.h" +#include "esp_event.h" +#include "esp_log.h" +#include "nvs_flash.h" +#include "lwip/err.h" +#include "lwip/sys.h" +// HTTP Client + time +#include "esp_netif.h" +#include "esp_http_client.h" +#include "esp_sntp.h" + +// JPG decoder is on ESP32 rom for this version +#if ESP_IDF_VERSION_MAJOR >= 4 // IDF 4+ + #include "esp32/rom/tjpgd.h" +#else // ESP32 Before IDF 4.0 + #include "rom/tjpgd.h" +#endif + +#include +#include +//#include // round + pow + +#include "epdiy.h" +EpdiyHighlevelState hl; + +// Load the EMBED_TXTFILES. Then doing (char*) server_cert_pem_start you get the SSL certificate +// Reference: https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-guides/build-system.html#embedding-binary-data +extern const uint8_t server_cert_pem_start[] asm("_binary_server_cert_pem_start"); + +// JPEG decoder +JDEC jd; +JRESULT rc; + +// Buffers +uint8_t *fb; // EPD 2bpp buffer +uint8_t *source_buf = NULL; // JPG download buffer +uint8_t *decoded_image; // RAW decoded image +static uint8_t tjpgd_work[4096]; // tjpgd 3096 is the minimum size + +uint32_t buffer_pos = 0; +uint32_t time_download = 0; +uint32_t time_decomp = 0; +uint32_t time_render = 0; +static const char * jd_errors[] = { + "Succeeded", + "Interrupted by output function", + "Device error or wrong termination of input stream", + "Insufficient memory pool for the image", + "Insufficient stream input buffer", + "Parameter error", + "Data format error", + "Right format but not supported", + "Not supported JPEG standard" +}; + +//uint8_t gamme_curve[256]; + +static const char *TAG = "EPDiy"; +uint16_t countDataEventCalls = 0; +uint32_t countDataBytes = 0; +uint32_t img_buf_pos = 0; +uint32_t dataLenTotal = 0; +uint64_t startTime = 0; + +#if VALIDATE_SSL_CERTIFICATE == true + /* Time aware for ESP32: Important to check SSL certs validity */ + void time_sync_notification_cb(struct timeval *tv) + { + ESP_LOGI(TAG, "Notification of a time synchronization event"); + } + + static void initialize_sntp(void) + { + ESP_LOGI(TAG, "Initializing SNTP"); + sntp_setoperatingmode(SNTP_OPMODE_POLL); + sntp_setservername(0, "pool.ntp.org"); + sntp_set_time_sync_notification_cb(time_sync_notification_cb); + #ifdef CONFIG_SNTP_TIME_SYNC_METHOD_SMOOTH + sntp_set_sync_mode(SNTP_SYNC_MODE_SMOOTH); + #endif + sntp_init(); + } + + static void obtain_time(void) + { + initialize_sntp(); + + // wait for time to be set + time_t now = 0; + struct tm timeinfo = { 0 }; + int retry = 0; + const int retry_count = 10; + while (sntp_get_sync_status() == SNTP_SYNC_STATUS_RESET && ++retry < retry_count) { + ESP_LOGI(TAG, "Waiting for system time to be set... (%d/%d)", (int)retry, (int)retry_count); + vTaskDelay(2000 / portTICK_PERIOD_MS); + } + time(&now); + localtime_r(&now, &timeinfo); + } +#endif +//==================================================================================== +// This sketch contains support functions to render the Jpeg images +// +// Created by Bodmer 15th Jan 2017 +// Refactored by @martinberlin for EPDiy as a Jpeg download and render example +//==================================================================================== + +// Return the minimum of two values a and b +#define minimum(a,b) (((a) < (b)) ? (a) : (b)) + +uint8_t find_closest_palette_color(uint8_t oldpixel) +{ + return oldpixel & 0xF0; +} + +void deepsleep(){ + esp_deep_sleep(1000000LL * 60 * DEEPSLEEP_MINUTES_AFTER_RENDER); +} + +static uint32_t feed_buffer(JDEC *jd, + uint8_t *buff, // Pointer to the read buffer (NULL:skip) + uint32_t nd +) { + uint32_t count = 0; + + while (count < nd) { + if (buff != NULL) { + *buff++ = source_buf[buffer_pos]; + } + count ++; + buffer_pos++; + } + + return count; +} + +/* User defined call-back function to output decoded RGB bitmap in decoded_image buffer */ +static uint32_t +tjd_output(JDEC *jd, /* Decompressor object of current session */ + void *bitmap, /* Bitmap data to be output */ + JRECT *rect /* Rectangular region to output */ +) { + uint32_t w = rect->right - rect->left + 1; + uint32_t h = rect->bottom - rect->top + 1; + uint32_t image_width = jd->width; + uint8_t *bitmap_ptr = (uint8_t*)bitmap; + + for (uint32_t i = 0; i < w * h; i++) { + + uint8_t r = *(bitmap_ptr++); + uint8_t g = *(bitmap_ptr++); + uint8_t b = *(bitmap_ptr++); + + int xx = rect->left + i % w; + if (xx < 0 || xx >= image_width) { + continue; + } + int yy = rect->top + i / w; + if (yy < 0 || yy >= jd->height) { + continue; + } + + /* Optimization note: If we manage to apply here the epd_draw_pixel directly + then it will be no need to keep a huge raw buffer (But will loose dither) */ + epd_draw_cpixel(xx, yy, r, g, b, hl.front_fb); + } + + return 1; +} + +//==================================================================================== +// This function opens source_buf Jpeg image file and primes the decoder +//==================================================================================== +int drawBufJpeg(uint8_t *source_buf, int xpos, int ypos) { + rc = jd_prepare(&jd, feed_buffer, tjpgd_work, sizeof(tjpgd_work), &source_buf); + if (rc != JDR_OK) { + ESP_LOGE(TAG, "JPG jd_prepare error: %s", jd_errors[rc]); + return ESP_FAIL; + } + + uint32_t decode_start = esp_timer_get_time(); + + // Last parameter scales v 1 will reduce the image + rc = jd_decomp(&jd, tjd_output, 0); + if (rc != JDR_OK) { + ESP_LOGE(TAG, "JPG jd_decomp error: %s", jd_errors[rc]); + return ESP_FAIL; + } + + time_decomp = (esp_timer_get_time() - decode_start)/1000; + + ESP_LOGI("JPG", "width: %d height: %d\n", jd.width, jd.height); + ESP_LOGI("decode", "%d ms . image decompression", (int)time_decomp); + + return 1; +} + +// Handles Htpp events and is in charge of buffering source_buf (jpg compressed image) +esp_err_t _http_event_handler(esp_http_client_event_t *evt) +{ + switch (evt->event_id) + { + case HTTP_EVENT_ERROR: + ESP_LOGE(TAG, "HTTP_EVENT_ERROR"); + break; + case HTTP_EVENT_ON_CONNECTED: + ESP_LOGI(TAG, "HTTP_EVENT_ON_CONNECTED"); + break; + case HTTP_EVENT_HEADER_SENT: + ESP_LOGI(TAG, "HTTP_EVENT_HEADER_SENT"); + break; + case HTTP_EVENT_ON_HEADER: + // Allocate JPG buffer + if (strncmp(evt->header_key, "Content-Length", 14) == 0) { + // Should be big enough to hold the JPEG file size + size_t content_len = atol(evt->header_value); + ESP_LOGI("epdiy", "Allocating content buffer of length %X", content_len); + + source_buf = (uint8_t*)heap_caps_malloc(content_len, MALLOC_CAP_SPIRAM); + + if (source_buf == NULL) { + ESP_LOGE("main", "Initial alloc source_buf failed!"); + } + + printf("Free heap after buffers allocation: %X\n", xPortGetFreeHeapSize()); + } + break; + case HTTP_EVENT_ON_DATA: + ++countDataEventCalls; + #if DEBUG_VERBOSE + if (countDataEventCalls%10==0) { + ESP_LOGI(TAG, "%d len:%d\n", (int)countDataEventCalls, (int)evt->data_len); + } + #endif + dataLenTotal += evt->data_len; + + if (countDataEventCalls == 1) startTime = esp_timer_get_time(); + // Append received data into source_buf + memcpy(&source_buf[img_buf_pos], evt->data, evt->data_len); + img_buf_pos += evt->data_len; + + // Optional hexa dump + //ESP_LOG_BUFFER_HEX(TAG, output_buffer, evt->data_len); + break; + + case HTTP_EVENT_ON_FINISH: + // Do not draw if it's a redirect (302) + if (esp_http_client_get_status_code(evt->client) == 200) { + //printf("%lld bytes read from %s\n\n", img_buf_pos, IMG_URL); + drawBufJpeg(source_buf, 0, 0); + time_download = (esp_timer_get_time()-startTime)/1000; + ESP_LOGI("www-dw", "%ld ms - download", time_download); + // Refresh display + epd_hl_update_screen(&hl, MODE_GC16, 25); + + ESP_LOGI("total", "%ld ms - total time spent\n", time_download+time_decomp+time_render); + + #if MILLIS_DELAY_BEFORE_SLEEP>0 + vTaskDelay(MILLIS_DELAY_BEFORE_SLEEP / portTICK_PERIOD_MS); + #endif + printf("Poweroff EPD and go to sleep %d minutes\n", DEEPSLEEP_MINUTES_AFTER_RENDER); + epd_poweroff(); + vTaskDelay(5); + deepsleep(); + } + break; + + case HTTP_EVENT_DISCONNECTED: + ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED\n"); + break; + + default: + ESP_LOGI(TAG, "HTTP_EVENT_ fallback caught event %d", evt->event_id); + } + return ESP_OK; +} + +// Handles http request +static void http_post(void) +{ + /** + * NOTE: All the configuration parameters for http_client must be specified + * either in URL or as host and path parameters. + * FIX: Uncommenting cert_pem restarts even if providing the right certificate + */ + esp_http_client_config_t config = { + .url = IMG_URL, + .event_handler = _http_event_handler, + .buffer_size = HTTP_RECEIVE_BUFFER_SIZE, + .disable_auto_redirect = false, + #if VALIDATE_SSL_CERTIFICATE == true + .cert_pem = (char *)server_cert_pem_start + #endif + }; + esp_http_client_handle_t client = esp_http_client_init(&config); + + #if DEBUG_VERBOSE + printf("Free heap before HTTP download: %d\n", (int)xPortGetFreeHeapSize()); + if (esp_http_client_get_transport_type(client) == HTTP_TRANSPORT_OVER_SSL && config.cert_pem) { + printf("SSL CERT:\n%s\n\n", (char *)server_cert_pem_start); + } + #endif + + esp_err_t err = esp_http_client_perform(client); + if (err == ESP_OK) + { + // esp_http_client_get_content_length returns a uint64_t in esp-idf v5, so it needs a %lld format specifier + + printf("\nIMAGE URL: %s\n\nHTTP GET Status = %d, content_length = %lld\n", + IMG_URL, + esp_http_client_get_status_code(client), + esp_http_client_get_content_length(client)); + } + else + { + ESP_LOGE(TAG, "\nHTTP GET request failed: %s", esp_err_to_name(err)); + } + + + esp_http_client_cleanup(client); +} + +/* FreeRTOS event group to signal when we are connected*/ +static EventGroupHandle_t s_wifi_event_group; + +/* The event group allows multiple bits for each event, but we only care about two events: + * - we are connected to the AP with an IP + * - we failed to connect after the maximum amount of retries */ +#define WIFI_CONNECTED_BIT BIT0 +#define WIFI_FAIL_BIT BIT1 +static int s_retry_num = 0; + +static void event_handler(void *arg, esp_event_base_t event_base, + int32_t event_id, void *event_data) +{ + if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) + { + esp_wifi_connect(); + } + else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) + { + if (s_retry_num < 5) + { + esp_wifi_connect(); + s_retry_num++; + ESP_LOGI(TAG, "Retry to connect to the AP"); + } + else + { + xEventGroupSetBits(s_wifi_event_group, WIFI_FAIL_BIT); + ESP_LOGI(TAG, "Connect to the AP failed %d times. Going to deepsleep %d minutes", 5, DEEPSLEEP_MINUTES_AFTER_RENDER); + deepsleep(); + } + } + else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) + { + s_retry_num = 0; + xEventGroupSetBits(s_wifi_event_group, WIFI_CONNECTED_BIT); + } +} + +// Initializes WiFi the ESP-IDF way +void wifi_init_sta(void) +{ + s_wifi_event_group = xEventGroupCreate(); + + ESP_ERROR_CHECK(esp_netif_init()); + + ESP_ERROR_CHECK(esp_event_loop_create_default()); + esp_netif_create_default_wifi_sta(); + + wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT(); + ESP_ERROR_CHECK(esp_wifi_init(&cfg)); + + esp_event_handler_instance_t instance_any_id; + esp_event_handler_instance_t instance_got_ip; + ESP_ERROR_CHECK(esp_event_handler_instance_register(WIFI_EVENT, + ESP_EVENT_ANY_ID, + &event_handler, + NULL, + &instance_any_id)); + ESP_ERROR_CHECK(esp_event_handler_instance_register(IP_EVENT, + IP_EVENT_STA_GOT_IP, + &event_handler, + NULL, + &instance_got_ip)); + + wifi_config_t wifi_config = { + .sta = { + .ssid = ESP_WIFI_SSID, + .password = ESP_WIFI_PASSWORD, + /* Setting a password implies station will connect to all security modes including WEP/WPA. + * However these modes are deprecated and not advisable to be used. Incase your Access point + * doesn't support WPA2, these mode can be enabled by commenting below line */ + .threshold.authmode = WIFI_AUTH_WPA2_PSK, + .pmf_cfg = { + .capable = true, + .required = false + }, + }, + }; + + ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA)); + ESP_ERROR_CHECK(esp_wifi_set_config((wifi_interface_t)ESP_IF_WIFI_STA, &wifi_config)); + ESP_ERROR_CHECK(esp_wifi_start()); + ESP_LOGI(TAG, "wifi_init_sta finished."); + + /* Waiting until either the connection is established (WIFI_CONNECTED_BIT) or connection failed for the maximum + * number of re-tries (WIFI_FAIL_BIT). The bits are set by event_handler() (see above) */ + EventBits_t bits = xEventGroupWaitBits(s_wifi_event_group, + WIFI_CONNECTED_BIT | WIFI_FAIL_BIT, + pdFALSE, + pdFALSE, + portMAX_DELAY); + + /* xEventGroupWaitBits() returns the bits before the call returned, hence we can test which event actually happened. */ + if (bits & WIFI_CONNECTED_BIT) + { + ESP_LOGI(TAG, "Connected to ap SSID:%s", ESP_WIFI_SSID); + } + else if (bits & WIFI_FAIL_BIT) + { + ESP_LOGI(TAG, "Failed to connect to SSID:%s", ESP_WIFI_SSID); + } + else + { + ESP_LOGE(TAG, "UNEXPECTED EVENT"); + } + + /* The event will not be processed after unregister */ + ESP_ERROR_CHECK(esp_event_handler_instance_unregister(IP_EVENT, IP_EVENT_STA_GOT_IP, instance_got_ip)); + ESP_ERROR_CHECK(esp_event_handler_instance_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, instance_any_id)); + vEventGroupDelete(s_wifi_event_group); +} + +int getPsramSize(){ + multi_heap_info_t info; + heap_caps_get_info(&info, MALLOC_CAP_SPIRAM); + return info.total_free_bytes + info.total_allocated_bytes; +} +int getFreePsram(){ + multi_heap_info_t info; + heap_caps_get_info(&info, MALLOC_CAP_SPIRAM); + return info.total_free_bytes; +} + +void app_main() { + // NVS is needed for WiFi + esp_err_t ret = nvs_flash_init(); + if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) + { + ESP_ERROR_CHECK(nvs_flash_erase()); + ret = nvs_flash_init(); + } + ESP_ERROR_CHECK(ret); + + // WiFi log level set only to Error otherwise outputs too much + esp_log_level_set("wifi", ESP_LOG_ERROR); + epd_init(&epd_board_v7, &GDEW101C01, EPD_LUT_64K); + // Set VCOM for boards that allow to set this in software (in mV). + epd_set_vcom(1560); + + wifi_init_sta(); + + + printf("before epd_hl_init() PSRAM: %d\n", getFreePsram()); + hl = epd_hl_init(EPD_BUILTIN_WAVEFORM); + fb = epd_hl_get_framebuffer(&hl); + epd_set_gamma_curve(gamma_value); + epd_set_rotation(DISPLAY_ROTATION); + printf("after epd_hl_init() Free PSRAM: %d\n", getFreePsram()); + + #if VALIDATE_SSL_CERTIFICATE == true + obtain_time(); + #endif + + epd_poweron(); + epd_fullclear(&hl, 25); + + http_post(); +} diff --git a/examples/www-image/main/jpgdec-render.cpp b/examples/www-image/main/jpgdec-render.cpp index f5778e9a..8af8dc41 100644 --- a/examples/www-image/main/jpgdec-render.cpp +++ b/examples/www-image/main/jpgdec-render.cpp @@ -45,6 +45,13 @@ extern "C" { #include "epd_highlevel.h" #include "epdiy.h" } +// choose the default demo board depending on the architecture +#ifdef CONFIG_IDF_TARGET_ESP32 +#define DEMO_BOARD epd_board_v6 +#elif defined(CONFIG_IDF_TARGET_ESP32S3) +#define DEMO_BOARD epd_board_v7 +#endif + EpdiyHighlevelState hl; // JPG decoder from @bitbank2 #include "JPEGDEC.h" @@ -140,7 +147,7 @@ int JPEGDraw4Bits(JPEGDRAW* pDraw) { for (uint16_t yy = 0; yy < pDraw->iHeight; yy++) { // Copy directly horizontal MCU pixels in EPD fb memcpy( - &fb[(pDraw->y + yy) * EPD_WIDTH / 2 + pDraw->x / 2], + &fb[(pDraw->y + yy) * epd_width() / 2 + pDraw->x / 2], &pDraw->pPixels[(yy * pDraw->iWidth) >> 2], pDraw->iWidth ); } @@ -188,8 +195,8 @@ int decodeJpeg(uint8_t* source_buf, int xpos, int ypos) { if (jpeg.decodeDither(dither_space, 0)) { time_decomp = (esp_timer_get_time() - decode_start) / 1000 - time_render; ESP_LOGI( - "decode", "%d ms - %dx%d image MCUs:%d", time_decomp, jpeg.getWidth(), - jpeg.getHeight(), mcu_count + "decode", "%ld ms - %dx%d image MCUs:%d", time_decomp, (int)jpeg.getWidth(), + (int)jpeg.getHeight(), mcu_count ); } else { ESP_LOGE("jpeg.decode", "Failed with error: %d", jpeg.getLastError()); @@ -220,6 +227,18 @@ esp_err_t _http_event_handler(esp_http_client_event_t* evt) { ESP_LOGI( TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value ); + if (strncmp(evt->header_key, "Content-Length", 14) == 0) { + // Should be big enough to hold the JPEG file size + size_t content_len = atol(evt->header_value); + ESP_LOGI("epdiy", "Allocating content buffer of length %X", content_len); + + source_buf = (uint8_t*)heap_caps_malloc(content_len, MALLOC_CAP_SPIRAM); + + if (source_buf == NULL) { + ESP_LOGE("main", "Initial alloc source_buf failed!"); + } + } + #endif break; case HTTP_EVENT_ON_DATA: @@ -240,21 +259,21 @@ esp_err_t _http_event_handler(esp_http_client_event_t* evt) { case HTTP_EVENT_ON_FINISH: // Do not draw if it's a redirect (302) if (esp_http_client_get_status_code(evt->client) == 200) { - printf("%d bytes read from %s\n", img_buf_pos, IMG_URL); + printf("%d bytes read from %s\n", (int)img_buf_pos, IMG_URL); time_download = (esp_timer_get_time() - startTime) / 1000; decodeJpeg(source_buf, 0, 0); - ESP_LOGI("www-dw", "%d ms - download", time_download); + ESP_LOGI("www-dw", "%ld ms - download", time_download); ESP_LOGI( - "render", "%d ms - copying pix (JPEG_CPY_FRAMEBUFFER:%d)", time_render, + "render", "%ld ms - copying pix (JPEG_CPY_FRAMEBUFFER:%d)", time_render, JPEG_CPY_FRAMEBUFFER ); // Refresh display epd_hl_update_screen(&hl, MODE_GC16, 25); ESP_LOGI( - "total", "%d ms - total time spent\n", time_download + time_decomp + time_render + "total", "%ld ms - total time spent\n", time_download + time_decomp + time_render ); } else { printf( @@ -267,6 +286,8 @@ esp_err_t _http_event_handler(esp_http_client_event_t* evt) { case HTTP_EVENT_DISCONNECTED: ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED\n"); break; + default: + break; } return ESP_OK; } @@ -300,7 +321,7 @@ static void http_post(void) { if (err == ESP_OK) { ESP_LOGI( TAG, "\nIMAGE URL: %s\n\nHTTP GET Status = %d, content_length = %d\n", IMG_URL, - esp_http_client_get_status_code(client), esp_http_client_get_content_length(client) + esp_http_client_get_status_code(client), (int)esp_http_client_get_content_length(client) ); } else { ESP_LOGE(TAG, "\nHTTP GET request failed: %s", esp_err_to_name(err)); @@ -410,23 +431,22 @@ void wifi_init_sta(void) { } void app_main() { - epd_init(EPD_OPTIONS_DEFAULT); + enum EpdInitOptions init_options = EPD_LUT_64K; + + epd_init(&DEMO_BOARD, &ED097TC2, init_options); + // Set VCOM for boards that allow to set this in software (in mV). + // This will print an error if unsupported. In this case, + // set VCOM using the hardware potentiometer and delete this line. + epd_set_vcom(1560); hl = epd_hl_init(WAVEFORM); fb = epd_hl_get_framebuffer(&hl); printf("JPGDEC version @bitbank2\n"); - dither_space = (uint8_t*)heap_caps_malloc(EPD_WIDTH * 16, MALLOC_CAP_SPIRAM); + dither_space = (uint8_t*)heap_caps_malloc(epd_width() * 16, MALLOC_CAP_SPIRAM); if (dither_space == NULL) { ESP_LOGE("main", "Initial alloc ditherSpace failed!"); } - // Should be big enough to allocate the JPEG file size, width * height should suffice - source_buf = (uint8_t*)heap_caps_malloc(EPD_WIDTH * EPD_HEIGHT, MALLOC_CAP_SPIRAM); - if (source_buf == NULL) { - ESP_LOGE("main", "Initial alloc source_buf failed!"); - } - printf("Free heap after buffers allocation: %d\n", xPortGetFreeHeapSize()); - double gammaCorrection = 1.0 / gamma_value; for (int gray_value = 0; gray_value < 256; gray_value++) gamme_curve[gray_value] = round(255 * pow(gray_value / 255.0, gammaCorrection)); diff --git a/src/builtin_waveforms.c b/src/builtin_waveforms.c index eb94a683..811a9a6b 100644 --- a/src/builtin_waveforms.c +++ b/src/builtin_waveforms.c @@ -12,3 +12,4 @@ #include "waveforms/epdiy_ED097OC4.h" #include "waveforms/epdiy_ED097TC2.h" #include "waveforms/epdiy_ED133UT2.h" +#include "waveforms/epdiy_GDEW101C01.h" diff --git a/src/displays.c b/src/displays.c index ffc053af..fd0ef434 100644 --- a/src/displays.c +++ b/src/displays.c @@ -31,7 +31,7 @@ const EpdDisplay_t ED097TC2 = { .width = 1200, .height = 825, .bus_width = 8, - .bus_speed = 22, + .bus_speed = 18, // 22 works .default_waveform = &epdiy_ED097TC2, .display_type = DISPLAY_TYPE_ED097TC2, }; @@ -40,8 +40,8 @@ const EpdDisplay_t ED133UT2 = { .width = 1600, .height = 1200, .bus_width = 8, - .bus_speed = 20, - .default_waveform = &epdiy_ED097TC2, + .bus_speed = 16, + .default_waveform = &epdiy_ED133UT2, .display_type = DISPLAY_TYPE_ED097TC2, }; @@ -71,3 +71,12 @@ const EpdDisplay_t ED078KC1 = { .default_waveform = &epdiy_ED047TC2, .display_type = DISPLAY_TYPE_GENERIC, }; + +const EpdDisplay_t GDEW101C01 = { + .width = 2232, + .height = 1680, + .bus_width = 16, + .bus_speed = 8, + .default_waveform = &epdiy_GDEW101C01, + .display_type = DISPLAY_TYPE_GENERIC, +}; \ No newline at end of file diff --git a/src/epd_display.h b/src/epd_display.h index 58292eca..7511ba3a 100644 --- a/src/epd_display.h +++ b/src/epd_display.h @@ -40,4 +40,4 @@ extern const EpdDisplay_t ED133UT2; extern const EpdDisplay_t ED047TC1; extern const EpdDisplay_t ED047TC2; extern const EpdDisplay_t ED078KC1; - +extern const EpdDisplay_t GDEW101C01; diff --git a/src/epd_internals.h b/src/epd_internals.h index a5fdf642..39cbf0b6 100644 --- a/src/epd_internals.h +++ b/src/epd_internals.h @@ -55,6 +55,7 @@ extern const EpdWaveform epdiy_ED097TC2; extern const EpdWaveform epdiy_ED060XC3; extern const EpdWaveform epdiy_ED060SCT; extern const EpdWaveform epdiy_ED133UT2; +extern const EpdWaveform epdiy_GDEW101C01; /// Font data stored PER GLYPH diff --git a/src/epdiy.c b/src/epdiy.c index d11028b1..893b8a6f 100644 --- a/src/epdiy.c +++ b/src/epdiy.c @@ -3,10 +3,11 @@ #include "epd_display.h" #include "render.h" -#include -#include -#include -#include +#include "esp_assert.h" +#include "esp_heap_caps.h" +#include "esp_log.h" +#include "esp_types.h" +#include // round + pow // Simple x and y coordinate typedef struct { @@ -14,6 +15,7 @@ typedef struct { uint16_t y; } Coord_xy; +static uint8_t gamme_curve[256]; static const EpdDisplay_t* display = NULL; // Display rotation. Can be updated using epd_set_rotation(enum EpdRotation) @@ -95,6 +97,47 @@ void epd_draw_pixel(int x, int y, uint8_t color, uint8_t *framebuffer) { } } +// What Color is on top of the DES Color Filter +// This applies only to DES Good-Display epapers. Not tested in any other model +// Please do not forget to call epd_set_gamma_curve(double gamma_value) if you work with COLOR! +uint8_t epd_get_panel_color(int x, int y, uint8_t r, uint8_t g, uint8_t b) { + uint8_t c = (x + (epd_height() - y)) % 3; + switch (c) + { + case 0: + return gamme_curve[r]; // R + break; + case 1: + return gamme_curve[b]; // B + break; + default: + return gamme_curve[g]; + } +} + +// Pass the x, y and color. It will then let the background under color filter get the right grayscale (WHITE shows color) +void epd_draw_cpixel(int x, int y, uint8_t r, uint8_t g, uint8_t b, uint8_t *framebuffer) { + // Check rotation and move pixel around if necessary + Coord_xy coord = _rotate(x, y); + x = coord.x; + y = coord.y; + + if (x < 0 || x >= epd_width()) { + return; + } + if (y < 0 || y >= epd_height()) { + return; + } + uint8_t color = epd_get_panel_color(x, y, r, g, b); + + uint8_t *buf_ptr = &framebuffer[y * epd_width() / 2 + x / 2]; + if (x % 2) { + *buf_ptr = (*buf_ptr & 0x0F) | (color & 0xF0); + } else { + *buf_ptr = (*buf_ptr & 0xF0) | (color >> 4); + } +} + void epd_draw_circle(int x0, int y0, int r, uint8_t color, uint8_t *framebuffer) { int f = 1 - r; @@ -384,7 +427,14 @@ enum EpdDrawError epd_draw_image(EpdRect area, const uint8_t *data, const EpdWav } void epd_set_rotation(enum EpdRotation rotation) { - display_rotation = rotation; + display_rotation = rotation; +} + +void epd_set_gamma_curve(double gamma_value) { + double gammaCorrection = 1.0 / gamma_value; + for (int gray_value =0; gray_value<256;gray_value++) { + gamme_curve[gray_value]= round (255*pow(gray_value/255.0, gammaCorrection)); + } } enum EpdRotation epd_get_rotation() { diff --git a/src/epdiy.h b/src/epdiy.h index c0b0ff49..0b3383ca 100644 --- a/src/epdiy.h +++ b/src/epdiy.h @@ -110,24 +110,8 @@ enum EpdDrawMode { PREVIOUSLY_BLACK = 0x400, }; -#include "epd_board.h" -#include "epd_display.h" -#include "epd_highlevel.h" -#include "epd_board_specific.h" - -/** Display software rotation. - * Sets the rotation for the purposes of the drawing and font functions - * Use epd_set_rotation(EPD_ROT_*) to set it using one of the options below - * Use epd_get_rotation() in case you need to read this value - */ -enum EpdRotation { - EPD_ROT_LANDSCAPE = 0, - EPD_ROT_PORTRAIT = 1, - EPD_ROT_INVERTED_LANDSCAPE = 2, - EPD_ROT_INVERTED_PORTRAIT = 3, -}; - /// Possible failures when drawing. +// Note: In CPP this is giving an error since highlevel API is included before the definition enum EpdDrawError { EPD_DRAW_SUCCESS = 0x0, /// No valid framebuffer packing mode was specified. @@ -166,6 +150,23 @@ enum EpdDrawError { EPD_DRAW_EMPTY_LINE_QUEUE = 0x400, }; +#include "epd_board.h" +#include "epd_display.h" +#include "epd_highlevel.h" +#include "epd_board_specific.h" + +/** Display software rotation. + * Sets the rotation for the purposes of the drawing and font functions + * Use epd_set_rotation(EPD_ROT_*) to set it using one of the options below + * Use epd_get_rotation() in case you need to read this value + */ +enum EpdRotation { + EPD_ROT_LANDSCAPE = 0, + EPD_ROT_PORTRAIT = 1, + EPD_ROT_INVERTED_LANDSCAPE = 2, + EPD_ROT_INVERTED_PORTRAIT = 3, +}; + /// The default draw mode (non-flashy refresh, whith previously white screen). #define EPD_MODE_DEFAULT (MODE_GL16 | PREVIOUSLY_WHITE) @@ -298,6 +299,31 @@ void epd_copy_to_framebuffer(EpdRect image_area, const uint8_t *image_data, */ void epd_draw_pixel(int x, int y, uint8_t color, uint8_t *framebuffer); +/** + * @brief What color is on that x & y coordinates. Receives RGB and returns the grayscale for X:Y on that pixel + * @return uint8_t + */ +uint8_t epd_get_panel_color(int x, int y, uint8_t r, uint8_t g, uint8_t b); + +/** + * @brief This draws a pixel begin aware of what color filter is on top (RGB for DES displays) + * + * @param x + * @param y + * @param r + * @param g + * @param b + * @param framebuffer + */ +void epd_draw_cpixel(int x, int y, uint8_t r, uint8_t g, uint8_t b, uint8_t *framebuffer); + +/** + * @brief Assign gamma curve values: <1 darken 0.9 | >1 brighten 1.2 1.4 higher and is too bright + * + * @param gamma_value + */ +void epd_set_gamma_curve(double gamma_value); + /** * Draw a horizontal line to a given framebuffer. * diff --git a/src/waveforms/epdiy_GDEW101C01.h b/src/waveforms/epdiy_GDEW101C01.h new file mode 100644 index 00000000..0842a886 --- /dev/null +++ b/src/waveforms/epdiy_GDEW101C01.h @@ -0,0 +1,1922 @@ +const int epd_wp_epdiy_GDEW101C01_1_0_times[4] = {1000, 1000, 1000, 1000}; +const uint8_t epd_wp_epdiy_GDEW101C01_1_0_data[4][16][4] = { + {{0x15, 0x55, 0x55, 0x55}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x15, 0x55, 0x55, 0x55}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x15, 0x55, 0x55, 0x55}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x15, 0x55, 0x55, 0x55}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}}}; +const EpdWaveformPhases epd_wp_epdiy_GDEW101C01_1_0 = { + .phases = 4, + .phase_times = &epd_wp_epdiy_GDEW101C01_1_0_times[0], + .luts = (const uint8_t *)&epd_wp_epdiy_GDEW101C01_1_0_data[0]}; +const EpdWaveformPhases *epd_wm_epdiy_GDEW101C01_1_ranges[1] = { + &epd_wp_epdiy_GDEW101C01_1_0}; +const EpdWaveformMode epd_wm_epdiy_GDEW101C01_1 = { + .type = 1, + .temp_ranges = 1, + .range_data = &epd_wm_epdiy_GDEW101C01_1_ranges[0]}; + /** + * @brief NekoInk ones do not seem to work well here: https://github.com/zephray/NekoInk/tree/master/waveform/gdew101_gd + 0 , 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 15, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0 + */ +const int gdew_1 = 6; //60 +const int gdew_2 = 13; //30 +const int gdew_3 = 0; //20 x5 +const int gdew_4 = 0; +const int gdew_5 = 0; +const int gdew_6 = 0; +const int gdew_7 = 0; //20 +const int gdew_8 = 0; //30 x3 +const int gdew_9 = 0; +const int gdew_10 = 2; +const int gdew_11 = 1; //50 x2 +const int gdew_12 = 1; +const int gdew_13 = 1; //100 +const int gdew_14 = 2; //200 +const int gdew_15 = 2; //300 +// Commented with original 13.3" values +const int gdea_1 = 1; //20 +const int gdea_2 = 2; //15 x8 +const int gdea_3 = 1; +const int gdea_4 = 1; +const int gdea_5 = 2; +const int gdea_6 = 2; +const int gdea_7 = 1; +const int gdea_8 = 1; +const int gdea_9 = 1; +const int gdea_10 = 1; //20 +const int gdea_11 = 1; +const int gdea_12 = 1; +const int gdea_13 = 1; +const int gdea_14 = 100; +const int gdea_15 = 200; + +const int epd_wp_epdiy_GDEW101C01_2_0_times[38] = { +gdew_1,gdew_2,gdew_3,gdew_4,gdew_5,gdew_6,gdew_7,gdew_8,gdew_9,gdew_10,gdew_11,gdew_12,gdew_13,gdew_14,gdew_15, +gdea_1,gdea_2,gdea_3,gdea_4,gdea_5,gdea_6,gdea_7,gdea_8,gdea_9,gdea_10,gdea_11,gdea_12,gdea_13,gdea_14,gdea_15, +gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,0 + }; + +const uint8_t epd_wp_epdiy_GDEW101C01_2_0_data[38][16][4] = { + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}}, // 1 + + {{0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}}, + + {{0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}}, + + {{0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}}, + + {{0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}}, + + {{0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}}, + + {{0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}}, + + {{0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}}, + + {{0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}}, + + {{0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}}, // 10 + + {{0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}}, + + {{0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}}, + + {{0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}}, + + {{0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}}, + + {{0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, // 20 + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}}, // 30 + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}} + }; +const EpdWaveformPhases epd_wp_epdiy_GDEW101C01_2_0 = { + .phases = 38, + .phase_times = &epd_wp_epdiy_GDEW101C01_2_0_times[0], + .luts = (const uint8_t *)&epd_wp_epdiy_GDEW101C01_2_0_data[0]}; +const EpdWaveformPhases *epd_wm_epdiy_GDEW101C01_2_ranges[1] = { + &epd_wp_epdiy_GDEW101C01_2_0}; +const EpdWaveformMode epd_wm_epdiy_GDEW101C01_2 = { + .type = 2, + .temp_ranges = 1, + .range_data = &epd_wm_epdiy_GDEW101C01_2_ranges[0]}; +const int epd_wp_epdiy_GDEW101C01_5_0_times[38] = { + gdew_1,gdew_2,gdew_3,gdew_4,gdew_5,gdew_6,gdew_7,gdew_8,gdew_9,gdew_10,gdew_11,gdew_12,gdew_13,gdew_14,gdew_15, + gdea_1,gdea_2,gdea_3,gdea_4,gdea_5,gdea_6,gdea_7,gdea_8,gdea_9,gdea_10,gdea_11,gdea_12,gdea_13,gdea_14,gdea_15, + gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,gdea_1,0 + }; +const uint8_t epd_wp_epdiy_GDEW101C01_5_0_data[38][16][4] = { + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x05}, + {0x00, 0x00, 0x00, 0x04}}, + {{0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x15}, + {0x00, 0x00, 0x00, 0x14}}, + {{0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x55}, + {0x00, 0x00, 0x00, 0x54}}, + {{0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x55}, + {0x00, 0x00, 0x01, 0x54}}, + {{0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x55}, + {0x00, 0x00, 0x05, 0x54}}, + {{0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x55}, + {0x00, 0x00, 0x15, 0x54}}, + {{0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x55}, + {0x00, 0x00, 0x55, 0x54}}, + {{0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x55}, + {0x00, 0x01, 0x55, 0x54}}, + {{0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x55}, + {0x00, 0x05, 0x55, 0x54}}, //10 + {{0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x55}, + {0x00, 0x15, 0x55, 0x54}}, + {{0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x55}, + {0x00, 0x55, 0x55, 0x54}}, + {{0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x55}, + {0x01, 0x55, 0x55, 0x54}}, + {{0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x55}, + {0x05, 0x55, 0x55, 0x54}}, + {{0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x55}, + {0x15, 0x55, 0x55, 0x54}}, + {{0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}} , // 20 + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xaa}, + {0xaa, 0xaa, 0xaa, 0xa8}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0xaa, 0xaa, 0xaa, 0xa8}} + }; +const EpdWaveformPhases epd_wp_epdiy_GDEW101C01_5_0 = { + .phases = 38, + .phase_times = &epd_wp_epdiy_GDEW101C01_5_0_times[0], + .luts = (const uint8_t *)&epd_wp_epdiy_GDEW101C01_5_0_data[0]}; +const EpdWaveformPhases *epd_wm_epdiy_GDEW101C01_5_ranges[1] = { + &epd_wp_epdiy_GDEW101C01_5_0}; +const EpdWaveformMode epd_wm_epdiy_GDEW101C01_5 = { + .type = 5, + .temp_ranges = 1, + .range_data = &epd_wm_epdiy_GDEW101C01_5_ranges[0]}; + +const int epd_wp_epdiy_GDEW101C01_16_0_times[15] = { + gdew_1,gdew_2,gdew_3,gdew_4,gdew_5,gdew_6,gdew_7,gdew_8,gdew_9,gdew_10,gdew_11,gdew_12,gdew_13,gdew_14,gdew_15 + }; +const uint8_t epd_wp_epdiy_GDEW101C01_16_0_data[15][16][4] = { + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x01}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}}}; +const EpdWaveformPhases epd_wp_epdiy_GDEW101C01_16_0 = { + .phases = 15, + .phase_times = &epd_wp_epdiy_GDEW101C01_16_0_times[0], + .luts = (const uint8_t *)&epd_wp_epdiy_GDEW101C01_16_0_data[0]}; +const EpdWaveformPhases *epd_wm_epdiy_GDEW101C01_16_ranges[1] = { + &epd_wp_epdiy_GDEW101C01_16_0}; +const EpdWaveformMode epd_wm_epdiy_GDEW101C01_16 = { + .type = 16, + .temp_ranges = 1, + .range_data = &epd_wm_epdiy_GDEW101C01_16_ranges[0]}; +const int epd_wp_epdiy_GDEW101C01_17_0_times[15] = { + gdea_1,gdea_2,gdea_3,gdea_4,gdea_5,gdea_6,gdea_7,gdea_8,gdea_9,gdea_10,gdea_11,gdea_12,gdea_13,gdea_14,gdea_15 + }; +const uint8_t epd_wp_epdiy_GDEW101C01_17_0_data[15][16][4] = { + {{0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}, + {{0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x00, 0x00, 0x00, 0x00}, + {0x80, 0x00, 0x00, 0x00}}}; +const EpdWaveformPhases epd_wp_epdiy_GDEW101C01_17_0 = { + .phases = 15, + .phase_times = &epd_wp_epdiy_GDEW101C01_17_0_times[0], + .luts = (const uint8_t *)&epd_wp_epdiy_GDEW101C01_17_0_data[0]}; +const EpdWaveformPhases *epd_wm_epdiy_GDEW101C01_17_ranges[1] = { + &epd_wp_epdiy_GDEW101C01_17_0}; +const EpdWaveformMode epd_wm_epdiy_GDEW101C01_17 = { + .type = 17, + .temp_ranges = 1, + .range_data = &epd_wm_epdiy_GDEW101C01_17_ranges[0]}; +const EpdWaveformTempInterval epdiy_GDEW101C01_intervals[1] = { + {.min = 20, .max = 30}}; +const EpdWaveformMode *epdiy_GDEW101C01_modes[5] = { + &epd_wm_epdiy_GDEW101C01_1, &epd_wm_epdiy_GDEW101C01_2, + &epd_wm_epdiy_GDEW101C01_5, &epd_wm_epdiy_GDEW101C01_16, + &epd_wm_epdiy_GDEW101C01_17}; +const EpdWaveform epdiy_GDEW101C01 = {.num_modes = 5, + .num_temp_ranges = 1, + .mode_data = &epdiy_GDEW101C01_modes[0], + .temp_intervals = + &epdiy_GDEW101C01_intervals[0]};