mirror of
https://github.com/Dejvino/lilybook.git
synced 2024-11-14 12:23:28 +00:00
690 lines
19 KiB
C
690 lines
19 KiB
C
|
/* ePaper demo
|
||
|
*
|
||
|
* Author: LoBo (loboris@gmail.com, loboris.github)
|
||
|
*/
|
||
|
|
||
|
#include <time.h>
|
||
|
#include <errno.h>
|
||
|
#include <sys/fcntl.h>
|
||
|
#include <stdio.h>
|
||
|
#include <time.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "freertos/FreeRTOS.h"
|
||
|
#include "freertos/task.h"
|
||
|
#include "esp_system.h"
|
||
|
#include "driver/gpio.h"
|
||
|
#include "esp_system.h"
|
||
|
#include "esp_heap_alloc_caps.h"
|
||
|
#include "spiffs_vfs.h"
|
||
|
#include "esp_log.h"
|
||
|
|
||
|
#ifdef CONFIG_EXAMPLE_USE_WIFI
|
||
|
|
||
|
#include "esp_wifi.h"
|
||
|
#include "esp_system.h"
|
||
|
#include "esp_event.h"
|
||
|
#include "esp_event_loop.h"
|
||
|
#include "freertos/event_groups.h"
|
||
|
#include "esp_attr.h"
|
||
|
#include <sys/time.h>
|
||
|
#include <unistd.h>
|
||
|
#include "lwip/err.h"
|
||
|
#include "apps/sntp/sntp.h"
|
||
|
#include "nvs_flash.h"
|
||
|
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#include "spi_master_lobo.h"
|
||
|
#include "img1.h"
|
||
|
#include "img2.h"
|
||
|
#include "img3.h"
|
||
|
#include "img_hacking.c"
|
||
|
#include "EPD.h"
|
||
|
//#include "EPDspi.h"
|
||
|
|
||
|
#define DELAYTIME 1500
|
||
|
|
||
|
|
||
|
|
||
|
static struct tm* tm_info;
|
||
|
static char tmp_buff[128];
|
||
|
static time_t time_now, time_last = 0;
|
||
|
static const char *file_fonts[3] = {"/spiffs/fonts/DotMatrix_M.fon", "/spiffs/fonts/Ubuntu.fon", "/spiffs/fonts/Grotesk24x48.fon"};
|
||
|
static const char tag[] = "[Eink Demo]";
|
||
|
|
||
|
//==================================================================================
|
||
|
#ifdef CONFIG_EXAMPLE_USE_WIFI
|
||
|
|
||
|
|
||
|
/* FreeRTOS event group to signal when we are connected & ready to make a request */
|
||
|
static EventGroupHandle_t wifi_event_group;
|
||
|
|
||
|
/* The event group allows multiple bits for each event,
|
||
|
but we only care about one event - are we connected
|
||
|
to the AP with an IP? */
|
||
|
const int CONNECTED_BIT = 0x00000001;
|
||
|
|
||
|
//------------------------------------------------------------
|
||
|
static esp_err_t event_handler(void *ctx, system_event_t *event)
|
||
|
{
|
||
|
switch(event->event_id) {
|
||
|
case SYSTEM_EVENT_STA_START:
|
||
|
esp_wifi_connect();
|
||
|
break;
|
||
|
case SYSTEM_EVENT_STA_GOT_IP:
|
||
|
xEventGroupSetBits(wifi_event_group, CONNECTED_BIT);
|
||
|
break;
|
||
|
case SYSTEM_EVENT_STA_DISCONNECTED:
|
||
|
/* This is a workaround as ESP32 WiFi libs don't currently
|
||
|
auto-reassociate. */
|
||
|
esp_wifi_connect();
|
||
|
xEventGroupClearBits(wifi_event_group, CONNECTED_BIT);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
return ESP_OK;
|
||
|
}
|
||
|
|
||
|
//-------------------------------
|
||
|
static void initialise_wifi(void)
|
||
|
{
|
||
|
tcpip_adapter_init();
|
||
|
wifi_event_group = xEventGroupCreate();
|
||
|
ESP_ERROR_CHECK( esp_event_loop_init(event_handler, NULL) );
|
||
|
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
|
||
|
ESP_ERROR_CHECK( esp_wifi_init(&cfg) );
|
||
|
ESP_ERROR_CHECK( esp_wifi_set_storage(WIFI_STORAGE_RAM) );
|
||
|
wifi_config_t wifi_config = {
|
||
|
.sta = {
|
||
|
.ssid = CONFIG_WIFI_SSID,
|
||
|
.password = CONFIG_WIFI_PASSWORD,
|
||
|
},
|
||
|
};
|
||
|
ESP_LOGI(tag, "Setting WiFi configuration SSID %s...", wifi_config.sta.ssid);
|
||
|
ESP_ERROR_CHECK( esp_wifi_set_mode(WIFI_MODE_STA) );
|
||
|
ESP_ERROR_CHECK( esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config) );
|
||
|
ESP_ERROR_CHECK( esp_wifi_start() );
|
||
|
}
|
||
|
|
||
|
//-------------------------------
|
||
|
static void initialize_sntp(void)
|
||
|
{
|
||
|
ESP_LOGI(tag, "Initializing SNTP");
|
||
|
sntp_setoperatingmode(SNTP_OPMODE_POLL);
|
||
|
sntp_setservername(0, "pool.ntp.org");
|
||
|
sntp_init();
|
||
|
}
|
||
|
|
||
|
//--------------------------
|
||
|
static int obtain_time(void)
|
||
|
{
|
||
|
int res = 1;
|
||
|
initialise_wifi();
|
||
|
xEventGroupWaitBits(wifi_event_group, CONNECTED_BIT, false, true, portMAX_DELAY);
|
||
|
|
||
|
initialize_sntp();
|
||
|
|
||
|
// wait for time to be set
|
||
|
int retry = 0;
|
||
|
const int retry_count = 20;
|
||
|
|
||
|
time(&time_now);
|
||
|
tm_info = localtime(&time_now);
|
||
|
|
||
|
while(tm_info->tm_year < (2016 - 1900) && ++retry < retry_count) {
|
||
|
//ESP_LOGI(tag, "Waiting for system time to be set... (%d/%d)", retry, retry_count);
|
||
|
vTaskDelay(500 / portTICK_RATE_MS);
|
||
|
time(&time_now);
|
||
|
tm_info = localtime(&time_now);
|
||
|
}
|
||
|
if (tm_info->tm_year < (2016 - 1900)) {
|
||
|
ESP_LOGI(tag, "System time NOT set.");
|
||
|
res = 0;
|
||
|
}
|
||
|
else {
|
||
|
ESP_LOGI(tag, "System time is set.");
|
||
|
}
|
||
|
|
||
|
ESP_ERROR_CHECK( esp_wifi_stop() );
|
||
|
return res;
|
||
|
}
|
||
|
|
||
|
#endif //CONFIG_EXAMPLE_USE_WIFI
|
||
|
//==================================================================================
|
||
|
|
||
|
|
||
|
//=============
|
||
|
void app_main()
|
||
|
{
|
||
|
|
||
|
// ======== PREPARE DISPLAY INITIALIZATION =========
|
||
|
|
||
|
esp_err_t ret;
|
||
|
|
||
|
disp_buffer = pvPortMallocCaps(EPD_DISPLAY_WIDTH * (EPD_DISPLAY_HEIGHT/8), MALLOC_CAP_DMA);
|
||
|
assert(disp_buffer);
|
||
|
drawBuff = disp_buffer;
|
||
|
|
||
|
gs_disp_buffer = pvPortMallocCaps(EPD_DISPLAY_WIDTH * EPD_DISPLAY_HEIGHT, MALLOC_CAP_DMA);
|
||
|
assert(gs_disp_buffer);
|
||
|
gs_drawBuff = gs_disp_buffer;
|
||
|
|
||
|
// ==== CONFIGURE SPI DEVICES(s) ====================================================================================
|
||
|
|
||
|
gpio_set_direction(DC_Pin, GPIO_MODE_OUTPUT);
|
||
|
gpio_set_level(DC_Pin, 1);
|
||
|
gpio_set_direction(RST_Pin, GPIO_MODE_OUTPUT);
|
||
|
gpio_set_level(RST_Pin, 0);
|
||
|
gpio_set_direction(BUSY_Pin, GPIO_MODE_INPUT);
|
||
|
gpio_set_pull_mode(BUSY_Pin, GPIO_PULLUP_ONLY);
|
||
|
|
||
|
#if POWER_Pin
|
||
|
gpio_set_direction(POWER_Pin, GPIO_MODE_OUTPUT);
|
||
|
gpio_set_level(POWER_Pin, 1);
|
||
|
#endif
|
||
|
|
||
|
spi_lobo_bus_config_t buscfg={
|
||
|
.miso_io_num = -1, // set SPI MISO pin
|
||
|
.mosi_io_num = MOSI_Pin, // set SPI MOSI pin
|
||
|
.sclk_io_num = SCK_Pin, // set SPI CLK pin
|
||
|
.quadwp_io_num=-1,
|
||
|
.quadhd_io_num=-1,
|
||
|
.max_transfer_sz = 5*1024, // max transfer size is 4736 bytes
|
||
|
};
|
||
|
spi_lobo_device_interface_config_t devcfg={
|
||
|
.clock_speed_hz=40000000, // SPI clock is 40 MHz
|
||
|
.mode=0, // SPI mode 0
|
||
|
.spics_io_num=-1, // we will use external CS pin
|
||
|
.spics_ext_io_num = CS_Pin, // external CS pin
|
||
|
.flags=SPI_DEVICE_HALFDUPLEX, // ALWAYS SET to HALF DUPLEX MODE for display spi !!
|
||
|
};
|
||
|
|
||
|
// ====================================================================================================================
|
||
|
|
||
|
|
||
|
vTaskDelay(500 / portTICK_RATE_MS);
|
||
|
printf("\r\n=================================\r\n");
|
||
|
printf("ePaper display DEMO, LoBo 06/2017\r\n");
|
||
|
printf("=================================\r\n\r\n");
|
||
|
|
||
|
// ==================================================================
|
||
|
// ==== Initialize the SPI bus and attach the EPD to the SPI bus ====
|
||
|
|
||
|
ret=spi_lobo_bus_add_device(SPI_BUS, &buscfg, &devcfg, &disp_spi);
|
||
|
assert(ret==ESP_OK);
|
||
|
printf("SPI: display device added to spi bus\r\n");
|
||
|
|
||
|
// ==== Test select/deselect ====
|
||
|
ret = spi_lobo_device_select(disp_spi, 1);
|
||
|
assert(ret==ESP_OK);
|
||
|
ret = spi_lobo_device_deselect(disp_spi);
|
||
|
assert(ret==ESP_OK);
|
||
|
|
||
|
printf("SPI: attached display device, speed=%u\r\n", spi_lobo_get_speed(disp_spi));
|
||
|
printf("SPI: bus uses native pins: %s\r\n", spi_lobo_uses_native_pins(disp_spi) ? "true" : "false");
|
||
|
|
||
|
printf("\r\n-------------------\r\n");
|
||
|
printf("ePaper demo started\r\n");
|
||
|
printf("-------------------\r\n");
|
||
|
|
||
|
|
||
|
EPD_DisplayClearFull();
|
||
|
|
||
|
#ifdef CONFIG_EXAMPLE_USE_WIFI
|
||
|
|
||
|
ESP_ERROR_CHECK( nvs_flash_init() );
|
||
|
|
||
|
EPD_DisplayClearPart();
|
||
|
EPD_fillScreen(_bg);
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Waiting for NTP time...");
|
||
|
EPD_print(tmp_buff, CENTER, CENTER);
|
||
|
EPD_drawRect(10,10,274,108, EPD_BLACK);
|
||
|
EPD_drawRect(12,12,270,104, EPD_BLACK);
|
||
|
EPD_UpdateScreen();
|
||
|
|
||
|
// ===== Set time zone ======
|
||
|
setenv("TZ", "CET-1CEST", 0);
|
||
|
tzset();
|
||
|
// ==========================
|
||
|
|
||
|
time(&time_now);
|
||
|
tm_info = localtime(&time_now);
|
||
|
|
||
|
// Is time set? If not, tm_year will be (1970 - 1900).
|
||
|
if (tm_info->tm_year < (2016 - 1900)) {
|
||
|
ESP_LOGI(tag, "Time is not set yet. Connecting to WiFi and getting time over NTP.");
|
||
|
if (obtain_time()) {
|
||
|
}
|
||
|
else {
|
||
|
}
|
||
|
time(&time_now);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// ==== Initialize the file system ====
|
||
|
printf("\r\n\n");
|
||
|
vfs_spiffs_register();
|
||
|
if (spiffs_is_mounted) {
|
||
|
ESP_LOGI(tag, "File system mounted.");
|
||
|
}
|
||
|
else {
|
||
|
ESP_LOGE(tag, "Error mounting file system.");
|
||
|
}
|
||
|
|
||
|
//=========
|
||
|
// Run demo
|
||
|
//=========
|
||
|
|
||
|
/*
|
||
|
EPD_DisplayClearFull();
|
||
|
EPD_DisplayClearPart();
|
||
|
EPD_fillScreen(_bg);
|
||
|
//EPD_DisplaySetPart(0x00);
|
||
|
//EPD_DisplaySetPart(0xFF);
|
||
|
|
||
|
|
||
|
uint8_t LUTTest1[31] = {0x32, 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
||
|
uint8_t LUTTest2[31] = {0x32, 0x28,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
|
||
|
_gs = 0;
|
||
|
_fg = 1;
|
||
|
_bg = 0;
|
||
|
int n = 0;
|
||
|
while (1) {
|
||
|
//EPD_DisplayClearFull();
|
||
|
EPD_fillRect(14, 14, 100, 100, ((n&1) ? 0 : 1));
|
||
|
EPD_fillRect(_width/2+14, 14, 100, 100, ((n&1) ? 1 : 0));
|
||
|
//LUT_part = LUTTest1;
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
//EPD_wait(2000);
|
||
|
//LUT_part = LUTTest2;
|
||
|
//EPD_DisplayFull(disp_buffer);
|
||
|
printf("Updated\r\n");
|
||
|
EPD_wait(4000);
|
||
|
n++;
|
||
|
|
||
|
|
||
|
n = 0;
|
||
|
printf("\r\n==== FULL UPDATE TEST ====\r\n\n");
|
||
|
EPD_DisplayClearFull();
|
||
|
while (n < 2) {
|
||
|
EPD_fillScreen(_bg);
|
||
|
printf("Black\r\n");
|
||
|
EPD_fillRect(0,0,_width/2,_height-1, EPD_BLACK);
|
||
|
|
||
|
EPD_fillRect(20,20,_width/2-40,_height-1-40, EPD_WHITE);
|
||
|
EPD_DisplayFull(disp_buffer);
|
||
|
EPD_wait(4000);
|
||
|
|
||
|
printf("White\r\n");
|
||
|
EPD_fillRect(0,0,_width/2,_height-1, EPD_WHITE);
|
||
|
EPD_DisplayFull(disp_buffer);
|
||
|
EPD_wait(2000);
|
||
|
n++;
|
||
|
}
|
||
|
|
||
|
printf("\r\n==== PARTIAL UPDATE TEST ====\r\n\n");
|
||
|
EPD_DisplayClearFull();
|
||
|
n = 0;
|
||
|
while (n < 2) {
|
||
|
EPD_fillScreen(_bg);
|
||
|
printf("Black\r\n");
|
||
|
EPD_fillRect(0,0,_width/2,_height-1, EPD_BLACK);
|
||
|
|
||
|
EPD_fillRect(20,20,_width/2-40,_height-1-40, EPD_WHITE);
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
EPD_wait(4000);
|
||
|
|
||
|
printf("White\r\n");
|
||
|
EPD_fillRect(0,0,_width/2,_height-1, EPD_WHITE);
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
EPD_wait(2000);
|
||
|
n++;
|
||
|
}
|
||
|
|
||
|
printf("\r\n==== PARTIAL UPDATE TEST - gray scale ====\r\n\n");
|
||
|
EPD_DisplayClearFull();
|
||
|
n = 0;
|
||
|
while (n < 3) {
|
||
|
EPD_fillScreen(_bg);
|
||
|
LUT_part = LUT_gs;
|
||
|
for (uint8_t sh=1; sh<16; sh++) {
|
||
|
LUT_gs[21] = sh;
|
||
|
printf("Black (%d)\r\n", LUT_gs[21]);
|
||
|
EPD_fillRect((sh-1)*19,0,19,_height, EPD_BLACK);
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
}
|
||
|
EPD_wait(4000);
|
||
|
|
||
|
//LUT_part = LUTDefault_part;
|
||
|
printf("White\r\n");
|
||
|
//EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
//EPD_DisplaySetPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, 0xFF);
|
||
|
LUT_gs[21] = 15;
|
||
|
LUT_gs[1] = 0x28;
|
||
|
EPD_fillRect(190,0,76,_height, EPD_WHITE);
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
EPD_wait(2000);
|
||
|
|
||
|
EPD_fillRect(0,0,_width,_height, EPD_WHITE);
|
||
|
EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
LUT_gs[1] = 0x18;
|
||
|
EPD_wait(2000);
|
||
|
n++;
|
||
|
}
|
||
|
LUT_part = LUTDefault_part;
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
|
||
|
printf("==== START ====\r\n\n");
|
||
|
|
||
|
_gs = 1;
|
||
|
uint32_t tstart;
|
||
|
int pass = 0, ftype = 9;
|
||
|
while (1) {
|
||
|
ftype++;
|
||
|
if (ftype > 10) {
|
||
|
ftype = 1;
|
||
|
for (int t=40; t>0; t--) {
|
||
|
printf("Wait %d seconds ... \r", t);
|
||
|
fflush(stdout);
|
||
|
EPD_wait(100);
|
||
|
}
|
||
|
printf(" \r");
|
||
|
fflush(stdout);
|
||
|
_gs ^= 1;
|
||
|
}
|
||
|
printf("\r\n-- Test %d\r\n", ftype);
|
||
|
EPD_DisplayClearPart();
|
||
|
|
||
|
//EPD_Cls(0);
|
||
|
EPD_fillScreen(_bg);
|
||
|
_fg = 15;
|
||
|
_bg = 0;
|
||
|
|
||
|
EPD_drawRect(1,1,294,126, EPD_BLACK);
|
||
|
|
||
|
int y = 4;
|
||
|
tstart = clock();
|
||
|
if (ftype == 1) {
|
||
|
for (int f=0; f<4; f++) {
|
||
|
if (f == 0) _fg = 15;
|
||
|
else if (f == 1) _fg = 9;
|
||
|
else if (f == 2) _fg = 5;
|
||
|
else if (f == 2) _fg = 3;
|
||
|
EPD_setFont(f, NULL);
|
||
|
if (f == 3) {
|
||
|
EPD_print("Welcome to ", 4, y);
|
||
|
font_rotate = 90;
|
||
|
EPD_print("ESP32", EPD_getStringWidth("Welcome to ")+EPD_getfontheight()+4, y);
|
||
|
font_rotate = 0;
|
||
|
}
|
||
|
else if (f == 1) {
|
||
|
EPD_print("HR chars: \xA6\xA8\xB4\xB5\xB0", 4, y);
|
||
|
}
|
||
|
else {
|
||
|
EPD_print("Welcome to ESP32", 4, y);
|
||
|
}
|
||
|
y += EPD_getfontheight() + 2;
|
||
|
}
|
||
|
font_rotate = 45;
|
||
|
EPD_print("ESP32", LASTX+8, LASTY);
|
||
|
font_rotate = 0;
|
||
|
_fg = 15;
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
EPD_UpdateScreen();
|
||
|
}
|
||
|
else if (ftype == 2) {
|
||
|
orientation = LANDSCAPE_180;
|
||
|
for (int f=4; f<FONT_7SEG; f++) {
|
||
|
if (f == 4) _fg = 15;
|
||
|
else if (f == 5) _fg = 9;
|
||
|
else if (f == 6) _fg = 5;
|
||
|
else if (f == 7) _fg = 3;
|
||
|
EPD_setFont(f, NULL);
|
||
|
EPD_print("Welcome to ESP32", 4, y);
|
||
|
y += EPD_getfontheight() + 1;
|
||
|
}
|
||
|
_fg = 15;
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d (rotated 180)", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
orientation = LANDSCAPE_0;
|
||
|
EPD_UpdateScreen();
|
||
|
}
|
||
|
else if (ftype == 3) {
|
||
|
for (int f=0; f<3; f++) {
|
||
|
if (f == 0) _fg = 15;
|
||
|
else if (f == 1) _fg = 9;
|
||
|
else if (f == 2) _fg = 5;
|
||
|
EPD_setFont(USER_FONT, file_fonts[f]);
|
||
|
if (f == 0) font_line_space = 4;
|
||
|
EPD_print("Welcome to ESP32", 4, y);
|
||
|
font_line_space = 0;
|
||
|
y += EPD_getfontheight() + 2;
|
||
|
}
|
||
|
_fg = 15;
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d (Fonts from file)", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
EPD_UpdateScreen();
|
||
|
}
|
||
|
else if (ftype == 4) {
|
||
|
y = 16;
|
||
|
time(&time_now);
|
||
|
tm_info = localtime(&time_now);
|
||
|
int _sec = -1, y2, _day = -1;
|
||
|
|
||
|
EPD_setFont(FONT_7SEG, NULL);
|
||
|
set_7seg_font_atrib(10, 2, 0, 15);
|
||
|
y2 = y + EPD_getfontheight() + 10;
|
||
|
|
||
|
for (int t=0; t<100; t++) {
|
||
|
time(&time_now);
|
||
|
tm_info = localtime(&time_now);
|
||
|
if (tm_info->tm_sec != _sec) {
|
||
|
_sec = tm_info->tm_sec;
|
||
|
sprintf(tmp_buff, "%02d:%02d:%02d", tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec);
|
||
|
_fg = 15; // fill = 15
|
||
|
set_7seg_font_atrib(10, 2, 0, 15); // outline = 15
|
||
|
EPD_print(tmp_buff, CENTER, y);
|
||
|
_fg = 15;
|
||
|
if (tm_info->tm_mday != _day) {
|
||
|
sprintf(tmp_buff, "%02d.%02d.%04d", tm_info->tm_mday, tm_info->tm_mon + 1, tm_info->tm_year+1900);
|
||
|
_fg = 7; // fill = 7
|
||
|
set_7seg_font_atrib(8, 2, 1, 15); // outline = 15
|
||
|
EPD_print(tmp_buff, CENTER, y2);
|
||
|
_fg = 15;
|
||
|
}
|
||
|
EPD_UpdateScreen();
|
||
|
}
|
||
|
EPD_wait(100);
|
||
|
}
|
||
|
tstart = clock();
|
||
|
_fg = 15;
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
font_rotate = 90;
|
||
|
sprintf(tmp_buff, "%02d:%02d:%02d %02d/%02d", tm_info->tm_hour, tm_info->tm_min, tm_info->tm_sec, tm_info->tm_mday, tm_info->tm_mon + 1);
|
||
|
EPD_print(tmp_buff, 20, 4);
|
||
|
font_rotate = 0;
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
EPD_UpdateScreen();
|
||
|
}
|
||
|
else if (ftype == 5) {
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 1;
|
||
|
EPD_drawRect(4,4,20,20, 15);
|
||
|
|
||
|
EPD_fillRect(27,5,18,18, 1);
|
||
|
EPD_drawRect(26,4,20,20, 15);
|
||
|
|
||
|
EPD_drawCircle(66,16,10, 15);
|
||
|
|
||
|
EPD_fillCircle(92,16,10, 2);
|
||
|
EPD_drawCircle(92,16,11, 15);
|
||
|
|
||
|
EPD_fillRect(185,4,80,80, 3);
|
||
|
EPD_drawRect(185,4,80,80, 15);
|
||
|
|
||
|
EPD_fillCircle(225,44,35, 0);
|
||
|
EPD_drawCircle(225,44,35, 15);
|
||
|
EPD_fillCircle(225,44,35, 5);
|
||
|
|
||
|
EPD_fillCircle(225,44,20, 0);
|
||
|
EPD_drawCircle(225,44,20, 15);
|
||
|
|
||
|
orientation = LANDSCAPE_180;
|
||
|
EPD_drawRect(4,4,20,20, 15);
|
||
|
|
||
|
EPD_fillRect(27,5,18,18, 1);
|
||
|
EPD_drawRect(26,4,20,20, 15);
|
||
|
|
||
|
EPD_drawCircle(66,16,10, 15);
|
||
|
|
||
|
EPD_fillCircle(92,16,10, 2);
|
||
|
EPD_drawCircle(92,16,11, 15);
|
||
|
|
||
|
EPD_fillRect(185,4,80,80, 3);
|
||
|
EPD_drawRect(185,4,80,80, 15);
|
||
|
|
||
|
EPD_fillCircle(225,44,35, 0);
|
||
|
EPD_drawCircle(225,44,35, 15);
|
||
|
EPD_fillCircle(225,44,35, 5);
|
||
|
|
||
|
EPD_fillCircle(225,44,20, 0);
|
||
|
EPD_drawCircle(225,44,20, 15);
|
||
|
orientation = LANDSCAPE_0;
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
font_rotate = 90;
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print("Gray scale demo", _width/2+EPD_getfontheight()+2, 4);
|
||
|
EPD_print(tmp_buff, _width/2, 4);
|
||
|
font_rotate = 0;
|
||
|
|
||
|
EPD_UpdateScreen();
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
else if (ftype == 6) {
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 0;
|
||
|
memcpy(disp_buffer, (unsigned char *)gImage_img1, sizeof(gImage_img1));
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
|
||
|
EPD_UpdateScreen();
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
else if (ftype == 7) {
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 0;
|
||
|
memcpy(disp_buffer, (unsigned char *)gImage_img3, sizeof(gImage_img3));
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
_fg = 0;
|
||
|
_bg = 1;
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
|
||
|
EPD_UpdateScreen();
|
||
|
_fg = 15;
|
||
|
_bg = 0;
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
else if (ftype == 8) {
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 1;
|
||
|
int i, x, y;
|
||
|
uint8_t last_lvl = 0;
|
||
|
for (i=0; i<16; i++) {
|
||
|
for (x = 0; x < EPD_DISPLAY_WIDTH; x++) {
|
||
|
for (y = 0; y < EPD_DISPLAY_HEIGHT; y++) {
|
||
|
uint8_t pix = img_hacking[(x * EPD_DISPLAY_HEIGHT) + (EPD_DISPLAY_HEIGHT-y-1)];
|
||
|
if ((pix > last_lvl) && (pix <= lvl_buf[i])) {
|
||
|
gs_disp_buffer[(y * EPD_DISPLAY_WIDTH) + x] = i;
|
||
|
gs_used_shades |= (1 << i);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
last_lvl = lvl_buf[i];
|
||
|
}
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d (Gray scale image)", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 128-EPD_getfontheight()-2);
|
||
|
|
||
|
EPD_UpdateScreen();
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
else if (ftype == 9) {
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 0;
|
||
|
memcpy(disp_buffer, gImage_img2, sizeof(gImage_img2));
|
||
|
|
||
|
EPD_setFont(DEFAULT_FONT, NULL);
|
||
|
sprintf(tmp_buff, "Pass: %d", pass+1);
|
||
|
EPD_print(tmp_buff, 4, 4);
|
||
|
|
||
|
EPD_UpdateScreen();
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
else if (ftype == 10) {
|
||
|
if (spiffs_is_mounted) {
|
||
|
// ** Show scaled (1/8, 1/4, 1/2 size) JPG images
|
||
|
uint8_t old_gs = _gs;
|
||
|
_gs = 1;
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/evolution-of-human.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/people_silhouettes.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/silhouettes-dancing.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/girl_silhouettes.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/animal-silhouettes.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
EPD_Cls();
|
||
|
EPD_jpg_image(CENTER, CENTER, 0, SPIFFS_BASE_PATH"/images/Flintstones.jpg", NULL, 0);
|
||
|
EPD_UpdateScreen();
|
||
|
EPD_wait(5000);
|
||
|
|
||
|
_gs = old_gs;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//EPD_DisplayPart(0, EPD_DISPLAY_WIDTH-1, 0, EPD_DISPLAY_HEIGHT-1, disp_buffer);
|
||
|
tstart = clock() - tstart;
|
||
|
pass++;
|
||
|
printf("-- Type: %d Pass: %d Time: %u ms\r\n", ftype, pass, tstart);
|
||
|
|
||
|
EPD_PowerOff();
|
||
|
EPD_wait(8000);
|
||
|
}
|
||
|
|
||
|
}
|