From bce33fa836f212c44d203c070c6b548133b2660e Mon Sep 17 00:00:00 2001 From: jedi Date: Wed, 3 Nov 2021 19:14:18 +0100 Subject: [PATCH] stash --- firmware/app.cpp | 443 ++++++++++++++++++++++++--------------------- firmware/fiatlux.c | 123 ++++++------- firmware/wifi.cpp | 4 + 3 files changed, 295 insertions(+), 275 deletions(-) diff --git a/firmware/app.cpp b/firmware/app.cpp index f7b2414..a9107d9 100644 --- a/firmware/app.cpp +++ b/firmware/app.cpp @@ -11,25 +11,27 @@ #include "esp/spi.h" #include "math.h" #include +#include -#define DAYTIME(h,m,s) (h*3600+m*60+s) +#define DAYTIME(h, m, s) (h*3600+m*60+s) + +extern SemaphoreHandle_t time_available_semaphore; struct { - time_t sunrise_start = DAYTIME(5,30,0); - time_t sunrise_end = DAYTIME(6,0,0); - time_t sunrise_shutdown = DAYTIME(7,0,0); - time_t sunset_time = DAYTIME(22,0,0); + time_t sunrise_start = DAYTIME(8, 30, 0); + time_t sunrise_end = DAYTIME(9, 0, 0); + time_t sunrise_shutdown = DAYTIME(7, 0, 0); + time_t sunset_time = DAYTIME(22, 0, 0); } settings; - struct { - uint8_t r = 255; - uint8_t g = 160; - uint8_t b = 80; + uint8_t r = 255; + uint8_t g = 160; + uint8_t b = 80; } white; -time_t day_seconds() { +extern "C" time_t day_seconds() { time_t t1, t2; struct tm tms; time(&t1); @@ -40,222 +42,249 @@ time_t day_seconds() { t2 = mktime(&tms); return t1 - t2; } - -struct led_t{ - struct { - unsigned int mod : 5, marker : 3; - } __attribute__((packed)) global = {0x1F, 0x7}; - uint8_t b = 0; - uint8_t g = 0; - uint8_t r = 0; + +struct led_t { + struct { + unsigned int mod: 5, marker: 3; + } __attribute__((packed)) global = {0x1F, 0x7}; + uint8_t b = 0; + uint8_t g = 0; + uint8_t r = 0; }; led_t leds[4][10]; -float square(float x){ - return x*x; +float square(float x) { + return x * x; } -float lerp(float a, float b, float x){ - return (1.-x)*a + x *b; +float lerp(float a, float b, float x) { + return (1. - x) * a + x * b; } -float clamp(float x, float a, float b){ - if(xb) - return b; - return x; +float clamp(float x, float a, float b) { + if(x < a) + return a; + if(x > b) + return b; + return x; } -float fade(float x, float offset, float factor){ - float val = (x*factor-offset); - return lerp(square(clamp(val,0,1)),square(1-clamp(1-val,0,1)),val); +float fade(float x, float offset, float factor) { + float val = (x * factor - offset); + return lerp(square(clamp(val, 0, 1)), square(1 - clamp(1 - val, 0, 1)), val); } -void write_leds(){ - spi_transfer_32(1, 0x00000000); - for(int i = 0; i < 10; i++) - spi_transfer_32(1, *(uint32_t*)&leds[0][i]); - for(int i = 0; i < 10; i++) - spi_transfer_32(1, *(uint32_t*)&leds[1][9-i]); - for(int i = 0; i < 10; i++) - spi_transfer_32(1, *(uint32_t*)&leds[2][i]); - for(int i = 0; i < 10; i++) - spi_transfer_32(1, *(uint32_t*)&leds[3][9-i]); - spi_transfer_32(1, 0xFFFFFFFF); - spi_transfer_32(1, 0xFFFFFFFF); +void write_leds() { + spi_transfer_32(1, 0x00000000); + for (int i = 0; i < 10; i++) + spi_transfer_32(1, *(uint32_t *) &leds[0][i]); + for (int i = 0; i < 10; i++) + spi_transfer_32(1, *(uint32_t *) &leds[1][9 - i]); + for (int i = 0; i < 10; i++) + spi_transfer_32(1, *(uint32_t *) &leds[2][i]); + for (int i = 0; i < 10; i++) + spi_transfer_32(1, *(uint32_t *) &leds[3][9 - i]); + spi_transfer_32(1, 0xFFFFFFFF); + spi_transfer_32(1, 0xFFFFFFFF); } -enum state_t{ BOOT_S, SUNRISE_S, MORNING_S, DAY_S, NIGHT_S }; +enum state_t { + BOOT_S, SUNRISE_S, MORNING_S, DAY_S, NIGHT_S +}; -state_t s = BOOT_S; +volatile state_t s = BOOT_S; -bool maual_mode = false; +volatile bool maual_mode = false; -extern "C" void manual_switch(){ - - maual_mode = !maual_mode; - - printf("%d\n", (int)maual_mode); - - if(maual_mode){ - - if(s == NIGHT_S){ - - for(int j = 0; j < 4; j++) - for(int i = 0; i < 8; i+=2){ - leds[j][i].global.mod = 2; - leds[j][i].r = 128; - leds[j][i].g = 30; - leds[j][i].b = 15; - } - }else{ - - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - leds[j][i].global.mod = 31; - leds[j][i].r = white.r; - leds[j][i].g = white.g; - leds[j][i].b = white.b; - } - } - - write_leds(); - - }else{ - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - leds[j][i].global.mod = 0; - leds[j][i].r = 0; - leds[j][i].g = 0; - leds[j][i].b = 0; - } - write_leds(); - } +extern "C" void manual_switch() { + + maual_mode = !maual_mode; + + printf("int %d\n", (int) maual_mode); + + if(maual_mode) { + + if(s == NIGHT_S) { + + for (int j = 0; j < 4; j++) + for (int i = 0; i < 8; i += 2) { + leds[j][i].global.mod = 2; + leds[j][i].r = 128; + leds[j][i].g = 30; + leds[j][i].b = 15; + } + } else { + + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 31; + leds[j][i].r = white.r; + leds[j][i].g = white.g; + leds[j][i].b = white.b; + } + } + + write_leds(); + + } else { + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 0; + leds[j][i].r = 0; + leds[j][i].g = 0; + leds[j][i].b = 0; + } + write_leds(); + } } -void loop(void *pvParameters) -{ - spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); - - while(1){ - - time_t rt = day_seconds(); - - if(maual_mode){ - - if(s == NIGHT_S){ - - for(int j = 0; j < 4; j++) - for(int i = 0; i < 8; i+=2){ - leds[j][i].global.mod = 2; - leds[j][i].r = 128; - leds[j][i].g = 30; - leds[j][i].b = 15; - } - }else{ - - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - leds[j][i].global.mod = 31; - leds[j][i].r = white.r; - leds[j][i].g = white.g; - leds[j][i].b = white.b; - } - } - - write_leds(); - - }else{ - - if( s == BOOT_S ) { - if( rt >= settings.sunrise_start ) { - s = SUNRISE_S; - printf("SUNRISE_S\n"); - } - if( rt >= settings.sunrise_end ) { - s = MORNING_S; - printf("MORNING_S\n"); - } - } else if( s == SUNRISE_S ){ - if( rt >= settings.sunrise_end ) { - s = MORNING_S; - printf("MORNING_S\n"); - }else{ - int steps = (settings.sunrise_end - settings.sunrise_start)*(1000/50); - int t = (rt - settings.sunrise_start)*(1000/50); - for(; t < steps && !maual_mode; t++) { - - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - float val = (-i*30.+t*3.*(4./5.))/(float)steps; - leds[j][i].global.mod = 8 + fade(val,0.,0.5)*23; - leds[j][i].r = fade(val,0.01,1.) * white.r; - leds[j][i].g = fade(val,0.1,0.5) * white.g; - leds[j][i].b = fade(val,0.6,0.7) * white.b; - } - - write_leds(); - - if ((t%25)==0) { - - printf("Time: %d%% %d %d/%d\n", (t*100)/steps, (int)day_seconds(), t, steps); - printf("%d %d %d %d\n", - leds[0][0].global.mod, - leds[0][0].r, - leds[0][0].g, - leds[0][0].b); - } - - vTaskDelay(50/portTICK_PERIOD_MS); - } - } - } else if( s == MORNING_S ) { - if( rt >= settings.sunrise_shutdown ) { - s = DAY_S; - printf("DAY_S\n"); - }else{ - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - leds[j][i].global.mod = 31; - leds[j][i].r = white.r; - leds[j][i].g = white.g; - leds[j][i].b = white.b; - } - write_leds(); - } - } else if( s == DAY_S ) { - if( rt >= settings.sunset_time ) { - s = NIGHT_S; - printf("NIGHT_S\n"); - }else{ - for(int j = 0; j < 4; j++) - for(int i = 0; i < 10; i++){ - leds[j][i].global.mod = 0; - leds[j][i].r = 0; - leds[j][i].g = 0; - leds[j][i].b = 0; - } - - write_leds(); - } - } else if( s == NIGHT_S ) { - if( rt >= settings.sunrise_start && rt < settings.sunset_time) { - s = SUNRISE_S; - printf("SUNRISE_S\n"); - } - } - - } - - vTaskDelay(1000/portTICK_PERIOD_MS); - - } +[[noreturn]] void loop(void *pvParameters) { + spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); + + while (!uxSemaphoreGetCount(time_available_semaphore)) + vTaskDelay(500 / portTICK_PERIOD_MS); + + maual_mode = false; + + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 0; + leds[j][i].r = 0; + leds[j][i].g = 0; + leds[j][i].b = 0; + } + write_leds(); + + vTaskDelay(1000 / portTICK_PERIOD_MS); + + printf("START>\n"); + + while (true) { + + time_t rt = day_seconds(); + + if(maual_mode) { + + if(s == NIGHT_S) { + + for (int j = 0; j < 4; j++) + for (int i = 0; i < 8; i += 2) { + leds[j][i].global.mod = 2; + leds[j][i].r = 128; + leds[j][i].g = 30; + leds[j][i].b = 15; + } + } else { + + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 31; + leds[j][i].r = white.r; + leds[j][i].g = white.g; + leds[j][i].b = white.b; + } + } + + write_leds(); + + } else { + + if(s == BOOT_S) { + if(rt >= settings.sunrise_start) { + s = SUNRISE_S; + printf("SUNRISE_S\n"); + } + if(rt >= settings.sunrise_end) { + s = MORNING_S; + printf("MORNING_S\n"); + } + if(rt >= settings.sunset_time || rt < settings.sunrise_start) { + s = NIGHT_S; + printf("NIGHT_S\n"); + } + + printf("%lld | %lld %lld %lld %lld\n", rt, + settings.sunrise_start, + settings.sunrise_end, + settings.sunset_time, + settings.sunrise_shutdown); + } else if(s == SUNRISE_S) { + if(rt >= settings.sunrise_end) { + s = MORNING_S; + printf("MORNING_S\n"); + } else { + int steps = (settings.sunrise_end - settings.sunrise_start) * (1000 / 50); + int t = (rt - settings.sunrise_start) * (1000 / 50); + for (; t < steps && !maual_mode; t++) { + + for (auto &led: leds) + for (int i = 0; i < 10; i++) { + float val = (-i * 30. + t * 3. * (4. / 5.)) / (float) steps; + led[i].global.mod = 8 + fade(val, 0., 0.5) * 23; + led[i].r = fade(val, 0.01, 1.) * white.r; + led[i].g = fade(val, 0.1, 0.5) * white.g; + led[i].b = fade(val, 0.6, 0.7) * white.b; + } + + write_leds(); + + if((t % 25) == 0) { + + printf("Time: %d%% %d %d/%d\n", (t * 100) / steps, (int) day_seconds(), t, steps); + printf("%d %d %d %d\n", + leds[0][0].global.mod, + leds[0][0].r, + leds[0][0].g, + leds[0][0].b); + } + + vTaskDelay(50 / portTICK_PERIOD_MS); + } + } + } else if(s == MORNING_S) { + if(rt >= settings.sunrise_shutdown) { + s = DAY_S; + printf("DAY_S\n"); + } else { + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 31; + leds[j][i].r = white.r; + leds[j][i].g = white.g; + leds[j][i].b = white.b; + } + write_leds(); + } + } else if(s == DAY_S) { + if(rt >= settings.sunset_time) { + s = NIGHT_S; + printf("NIGHT_S\n"); + } else { + for (int j = 0; j < 4; j++) + for (int i = 0; i < 10; i++) { + leds[j][i].global.mod = 0; + leds[j][i].r = 0; + leds[j][i].g = 0; + leds[j][i].b = 0; + } + + write_leds(); + } + } else if(s == NIGHT_S) { + if(rt >= settings.sunrise_start && rt < settings.sunset_time) { + s = SUNRISE_S; + printf("SUNRISE_S\n"); + } + } + + } + + vTaskDelay(1000 / portTICK_PERIOD_MS); + + } } - -extern "C" void register_app(void) -{ - xTaskCreate(loop, "loop", 1024, NULL, 2, NULL); +extern "C" void register_app(void) { + xTaskCreate(loop, "loop", 512, nullptr, 2, NULL); } diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 78dcb79..94d8de5 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -36,45 +36,53 @@ #define SNTP_SERVERS "0.pool.ntp.org", "1.pool.ntp.org", \ "2.pool.ntp.org", "3.pool.ntp.org" -#define vTaskDelayMs(ms) vTaskDelay((ms)/portTICK_PERIOD_MS) -#define UNUSED_ARG(x) (void)x - +#define vTaskDelayMs(ms) vTaskDelay((ms)/portTICK_PERIOD_MS) +#define UNUSED_ARG(x) (void)x const gpio_inttype_t int_type = GPIO_INTTYPE_EDGE_NEG; +SemaphoreHandle_t time_available_semaphore; +time_t day_seconds(); -void sntp_tsk(void *pvParameters) -{ - const char *servers[] = {SNTP_SERVERS}; - UNUSED_ARG(pvParameters); - /* Wait until we have joined AP and are assigned an IP */ - while (sdk_wifi_station_get_connect_status() != STATION_GOT_IP) { - vTaskDelayMs(100); - } +void sntp_tsk(void *pvParameters) { + const char *servers[] = {SNTP_SERVERS}; + UNUSED_ARG(pvParameters); - /* Start SNTP */ - printf("Starting SNTP... "); - /* SNTP will request an update each 5 minutes */ - sntp_set_update_delay(5*60000); - /* Set GMT+1 zone, daylight savings off */ - const struct timezone tz = {1*60, 1}; - /* SNTP initialization */ - sntp_initialize(&tz); - /* Servers must be configured right after initialization */ - sntp_set_servers(servers, sizeof(servers) / sizeof(char*)); - printf("DONE!\n"); + while (!uxSemaphoreGetCount(wifi_available_semaphore)) { + vTaskDelay(2000 / portTICK_PERIOD_MS); + printf("waitfi\n"); + } - /* Print date and time each 5 seconds */ - while(1) { - vTaskDelayMs(5000); - //time_t ts = time(NULL); - //int t = ts; - //printf("TIME: %d %d %s", t,(int) day_seconds(), ctime(&ts)); - } + /* Wait until we have joined AP and are assigned an IP */ + while (sdk_wifi_station_get_connect_status() != STATION_GOT_IP) { + vTaskDelayMs(100); + } + + /* Start SNTP */ + printf("Starting SNTP... "); + /* SNTP will request an update each 5 minutes */ + sntp_set_update_delay(5 * 60000); + /* Set GMT+1 zone, daylight savings off */ + const struct timezone tz = {1 * 60, 1}; + /* SNTP initialization */ + sntp_initialize(&tz); + /* Servers must be configured right after initialization */ + sntp_set_servers(servers, sizeof(servers) / sizeof(char *)); + printf("SNTP DONE!\n"); + + xSemaphoreGive(time_available_semaphore); + + /* Print date and time each 5 seconds */ + while (1) { + vTaskDelayMs(5000); + time_t ts = time(NULL); + int t = ts; + printf("TIME: %d %d %s", t, (int) day_seconds(), ctime(&ts)); + } } @@ -111,41 +119,7 @@ void gpio_intr_handler(uint8_t gpio_num) void register_app(void); -void user_init(void) -{ - uart_set_baud(0, 115200); - printf("SDK version:%s\n", sdk_system_get_sdk_version()); - - struct sdk_station_config config = { - .ssid = WIFI_SSID, - .password = WIFI_PASS, - }; - - /* required to call wifi_set_opmode before station_set_config */ - sdk_wifi_set_opmode(STATION_MODE); - sdk_wifi_station_set_config(&config); - //netif_set_hostname(netif_default, "nachtlicht"); - sdk_wifi_station_connect(); - - /* turn off LED */ - gpio_enable(LED_PIN, GPIO_OUTPUT); - gpio_write(LED_PIN, true); - - - gpio_enable(SWITCH_PIN, GPIO_INPUT); - - tsqueue = xQueueCreate(2, sizeof(uint32_t)); - //xTaskCreate(buttonIntTask, "buttonIntTask", 256, &tsqueue, 2, NULL); - - /* initialize tasks */ - xTaskCreate(&httpd_task, "HTTP Daemon", 2048, NULL, 2, NULL); - - xTaskCreate(&sntp_tsk, "SNTP", 512, NULL, 1, NULL); - register_app(); -} - -void user_init(void) -{ +void user_init(void) { uart_set_baud(0, 115200); printf("SDK version: %s\n", sdk_system_get_sdk_version()); @@ -154,20 +128,33 @@ void user_init(void) system_init_config(); wifi_available_semaphore = xSemaphoreCreateBinary(); + time_available_semaphore = xSemaphoreCreateBinary(); + + gpio_enable(SWITCH_PIN, GPIO_INPUT); + + tsqueue = xQueueCreate(2, sizeof(uint32_t)); xTaskCreate(wifi_task, "wifi_task", 1024, NULL, 1, NULL); - xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL); + //xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL); - xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); + //xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); + xTaskCreate(&sntp_tsk, "SNTP", 512, NULL, 1, NULL); + + //xTaskCreate(buttonIntTask, "buttonIntTask", 256, &tsqueue, 2, NULL); + + register_app(); + + gpio_enable(LED_PIN, GPIO_OUTPUT); + gpio_write(LED_PIN, true); rboot_config conf = rboot_get_config(); printf("\r\n\r\nOTA Basic demo.\r\nCurrently running on flash slot %d / %d.\r\n\r\n", conf.current_rom, conf.count); printf("Image addresses in flash:\r\n"); - for(int i = 0; i