From e6d67579823f76322cce51fb3a4991fc7523269e Mon Sep 17 00:00:00 2001 From: jedi Date: Mon, 19 Jul 2021 22:56:57 +0200 Subject: [PATCH 01/18] stash --- firmware/lux.cpp | 75 +++++++++++++++++++++++++++++++++++++++++++++++- firmware/lux.h | 4 +++ 2 files changed, 78 insertions(+), 1 deletion(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index 8b775c4..eb7b9ad 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -9,6 +9,7 @@ #include #include +#include const int signal_led_pin = 2; @@ -16,17 +17,89 @@ const int cs0 = 15; const int gpio4 = 4; const int gpio5 = 5; + +ws2812_pixel_t **pixels_ptr; + +static ws2812_pixel_t next_colour(int i) { + ws2812_pixel_t colour = {{0, 0, 0, 0}}; + if(i == 8) { + colour.white = 32; + } else { + colour.red = i & 1 ? 32 : 0; + colour.green = i & 2 ? 32 : 0; + colour.blue = i & 4 ? 32 : 0; + } + + return colour; +} + +void spi_dac(int id, int val) { + int dac_val = (val << 2) & 0x3FFC; + + spi_transfer_8(1, ~(0x00)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + spi_transfer_8(1, ~(0x01 << id)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + + spi_transfer_16(1, dac_val); + + spi_transfer_8(1, ~(0x00)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + spi_transfer_8(1, ~(0x01 << id)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); +} + extern "C" void signal_led(bool state) { gpio_write(signal_led_pin, !state); } + +/* This task uses the high level GPIO API (esp_gpio.h) to blink an LED. + * + */ extern "C" void lux_task(void *pvParameters) { + gpio_enable(9, GPIO_INPUT); + gpio_enable(10, GPIO_INPUT); + + ws2812_pixel_t pixels[led_number]; + ws2812_i2s_init(led_number, PIXEL_RGBW); + memset(pixels, 0, sizeof(ws2812_pixel_t) * led_number); + gpio_enable(signal_led_pin, GPIO_OUTPUT); gpio_enable(cs0, GPIO_OUTPUT); gpio_enable(gpio4, GPIO_OUTPUT); gpio_enable(gpio5, GPIO_OUTPUT); spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); + while (1) { + gpio_write(gpio4, 1); + vTaskDelay(200 / portTICK_PERIOD_MS); + gpio_write(gpio4, 0); + /*for (int j = 0; j < 64; j++) { + for (int i = 0; i < 8; i++) + spi_dac(i, 64 * j); + //printf("> %d\n", 64*j); + vTaskDelay(100 / portTICK_PERIOD_MS); + }*/ + for (int i = 0; i < 8; i++) + spi_dac(i, 0); - vTaskDelete(nullptr); + gpio_write(gpio5, 1); + vTaskDelay(200 / portTICK_PERIOD_MS); + gpio_write(gpio5, 0); + + for (int c = 8; c >= 0; c--) { + + for (int i = 0; i < led_number; i++) { + pixels[i] = next_colour(c); + } + ws2812_i2s_update(pixels, PIXEL_RGBW); + vTaskDelay(200 / portTICK_PERIOD_MS); + } + + } } \ No newline at end of file diff --git a/firmware/lux.h b/firmware/lux.h index caf4a88..d29f45e 100644 --- a/firmware/lux.h +++ b/firmware/lux.h @@ -5,6 +5,10 @@ #ifndef FIRMWARE_LUX_H #define FIRMWARE_LUX_H +#ifdef __cplusplus +constexpr int led_number = 8; +#endif + #ifdef __cplusplus extern "C" { #endif From 78934b85c2adc54543fd9881319db04643e7ca40 Mon Sep 17 00:00:00 2001 From: jedi Date: Fri, 10 Sep 2021 00:09:03 +0200 Subject: [PATCH 02/18] stash --- firmware/lux.cpp | 71 ++++++++++++++++++++++++++++++++++++++++++------ firmware/lux.h | 4 --- 2 files changed, 62 insertions(+), 13 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index eb7b9ad..4d585ab 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -11,6 +11,10 @@ #include #include +extern "C" { +#include +} + const int signal_led_pin = 2; const int cs0 = 15; @@ -18,7 +22,14 @@ const int gpio4 = 4; const int gpio5 = 5; -ws2812_pixel_t **pixels_ptr; +struct apa10xx_pixel_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; +}; static ws2812_pixel_t next_colour(int i) { ws2812_pixel_t colour = {{0, 0, 0, 0}}; @@ -33,6 +44,16 @@ static ws2812_pixel_t next_colour(int i) { return colour; } +static apa10xx_pixel_t next_color(int i) { + apa10xx_pixel_t colour; + colour.global.mod = 8; + colour.r = i & 1 ? 32 : 0; + colour.g = i & 2 ? 32 : 0; + colour.b = i & 4 ? 32 : 0; + + return colour; +} + void spi_dac(int id, int val) { int dac_val = (val << 2) & 0x3FFC; @@ -53,6 +74,18 @@ void spi_dac(int id, int val) { gpio_write(cs0, 0); } + +void write_leds(apa10xx_pixel_t *arr, size_t len) { + spi_transfer_32(1, 0x00000000); + for (size_t i = 0; i < len; i++) + spi_transfer_32(1, *(uint32_t *) &arr[i]); + spi_transfer_32(1, 0xFFFFFFFF); + spi_transfer_32(1, 0xFFFFFFFF); +} + + +ws2812_pixel_t **pixels_ptr; + extern "C" void signal_led(bool state) { gpio_write(signal_led_pin, !state); } @@ -63,18 +96,34 @@ extern "C" void signal_led(bool state) { */ extern "C" void lux_task(void *pvParameters) { - gpio_enable(9, GPIO_INPUT); - gpio_enable(10, GPIO_INPUT); + //gpio_enable(9, GPIO_INPUT); + //gpio_enable(10, GPIO_INPUT); - ws2812_pixel_t pixels[led_number]; - ws2812_i2s_init(led_number, PIXEL_RGBW); - memset(pixels, 0, sizeof(ws2812_pixel_t) * led_number); + int32_t lux_ws2812_number = 8; + auto ret = sysparam_get_int32("lux_ws2812_number", &lux_ws2812_number); + if(ret != SYSPARAM_OK) + lux_ws2812_number = 8; + + int32_t lux_apa10xx_number = 8; + ret = sysparam_get_int32("lux_apa10xx_number", &lux_apa10xx_number); + if(ret != SYSPARAM_OK) + lux_apa10xx_number = 8; + + ws2812_pixel_t pixels[lux_ws2812_number]; + ws2812_i2s_init(lux_ws2812_number, PIXEL_RGBW); + memset(pixels, 0, sizeof(ws2812_pixel_t) * lux_ws2812_number); + + apa10xx_pixel_t leds[lux_apa10xx_number]; + + //lux_apa102c_number gpio_enable(signal_led_pin, GPIO_OUTPUT); gpio_enable(cs0, GPIO_OUTPUT); gpio_enable(gpio4, GPIO_OUTPUT); gpio_enable(gpio5, GPIO_OUTPUT); - spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); + //spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); //for spi dimmer + + spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); //for apa10xx while (1) { gpio_write(gpio4, 1); vTaskDelay(200 / portTICK_PERIOD_MS); @@ -94,10 +143,14 @@ extern "C" void lux_task(void *pvParameters) { for (int c = 8; c >= 0; c--) { - for (int i = 0; i < led_number; i++) { - pixels[i] = next_colour(c); + for (auto &pixel: pixels) { + pixel = next_colour(c); + } + for (auto &led: leds) { + led = next_color(c); } ws2812_i2s_update(pixels, PIXEL_RGBW); + write_leds(leds, lux_apa10xx_number); vTaskDelay(200 / portTICK_PERIOD_MS); } diff --git a/firmware/lux.h b/firmware/lux.h index d29f45e..caf4a88 100644 --- a/firmware/lux.h +++ b/firmware/lux.h @@ -5,10 +5,6 @@ #ifndef FIRMWARE_LUX_H #define FIRMWARE_LUX_H -#ifdef __cplusplus -constexpr int led_number = 8; -#endif - #ifdef __cplusplus extern "C" { #endif From 769351684b7a953b43a87b28c6bac5669efbc114 Mon Sep 17 00:00:00 2001 From: jedi Date: Sat, 11 Sep 2021 21:49:53 +0200 Subject: [PATCH 03/18] stash --- firmware/lux.cpp | 26 ++++++++++++++++++-------- firmware/webdir/index.htmll | 1 + 2 files changed, 19 insertions(+), 8 deletions(-) create mode 100644 firmware/webdir/index.htmll diff --git a/firmware/lux.cpp b/firmware/lux.cpp index 4d585ab..d6a1397 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -17,7 +17,8 @@ extern "C" { const int signal_led_pin = 2; -const int cs0 = 15; +//const int cs0 = 15; + const int gpio4 = 4; const int gpio5 = 5; @@ -54,6 +55,7 @@ static apa10xx_pixel_t next_color(int i) { return colour; } +/* void spi_dac(int id, int val) { int dac_val = (val << 2) & 0x3FFC; @@ -73,7 +75,7 @@ void spi_dac(int id, int val) { gpio_write(cs0, 1); gpio_write(cs0, 0); } - +*/ void write_leds(apa10xx_pixel_t *arr, size_t len) { spi_transfer_32(1, 0x00000000); @@ -118,29 +120,29 @@ extern "C" void lux_task(void *pvParameters) { //lux_apa102c_number gpio_enable(signal_led_pin, GPIO_OUTPUT); - gpio_enable(cs0, GPIO_OUTPUT); + //gpio_enable(cs0, GPIO_OUTPUT); gpio_enable(gpio4, GPIO_OUTPUT); gpio_enable(gpio5, GPIO_OUTPUT); //spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); //for spi dimmer spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); //for apa10xx while (1) { - gpio_write(gpio4, 1); - vTaskDelay(200 / portTICK_PERIOD_MS); - gpio_write(gpio4, 0); /*for (int j = 0; j < 64; j++) { for (int i = 0; i < 8; i++) spi_dac(i, 64 * j); //printf("> %d\n", 64*j); vTaskDelay(100 / portTICK_PERIOD_MS); }*/ + /*gpio_write(gpio4, 1); + vTaskDelay(200 / portTICK_PERIOD_MS); + gpio_write(gpio4, 0); for (int i = 0; i < 8; i++) spi_dac(i, 0); gpio_write(gpio5, 1); vTaskDelay(200 / portTICK_PERIOD_MS); - gpio_write(gpio5, 0); - + gpio_write(gpio5, 0);*/ + signal_led(0); for (int c = 8; c >= 0; c--) { for (auto &pixel: pixels) { @@ -153,6 +155,14 @@ extern "C" void lux_task(void *pvParameters) { write_leds(leds, lux_apa10xx_number); vTaskDelay(200 / portTICK_PERIOD_MS); } + gpio_write(gpio4, 1); + vTaskDelay(200 / portTICK_PERIOD_MS); + gpio_write(gpio4, 0); + gpio_write(gpio5, 1); + vTaskDelay(200 / portTICK_PERIOD_MS); + gpio_write(gpio5, 0); + signal_led(1); + vTaskDelay(200 / portTICK_PERIOD_MS); } } \ No newline at end of file diff --git a/firmware/webdir/index.htmll b/firmware/webdir/index.htmll new file mode 100644 index 0000000..6599b06 --- /dev/null +++ b/firmware/webdir/index.htmll @@ -0,0 +1 @@ + fiatlux v0.2

System

Firmware Update

Restart

Reset Config

I/O

Protocols

Station Mode current connection

Wifi Settings

AP Mode

AP IP N/A
AP MAC N/A

Station Mode current connection

Sation IP N/A
Station MAC N/A

Status

System

Chip ID N/A
Hostname N/A
Firmware Version N/A
Flash ID N/A
Flash size N/A KiB
Free heap N/A bytes
Uptime N/A s

Network current connection

Mode N/A
Station SSID N/A
Station IP N/A
Station MAC N/A
AP SSID N/A
AP IP N/A
AP MAC N/A

Power

Input 5V12V
Output 11.2V

I/O

\ No newline at end of file From 7f422a2ddd850e2c22db498b224d7224245bb56f Mon Sep 17 00:00:00 2001 From: jedi Date: Wed, 3 Nov 2021 01:49:07 +0100 Subject: [PATCH 04/18] generic output channel --- firmware/lux.cpp | 110 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 105 insertions(+), 5 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index d6a1397..874f151 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -17,12 +17,11 @@ extern "C" { const int signal_led_pin = 2; -//const int cs0 = 15; +const int cs0 = 15; const int gpio4 = 4; const int gpio5 = 5; - struct apa10xx_pixel_t { struct { unsigned int mod: 5, marker: 3; @@ -55,7 +54,6 @@ static apa10xx_pixel_t next_color(int i) { return colour; } -/* void spi_dac(int id, int val) { int dac_val = (val << 2) & 0x3FFC; @@ -75,7 +73,6 @@ void spi_dac(int id, int val) { gpio_write(cs0, 1); gpio_write(cs0, 0); } -*/ void write_leds(apa10xx_pixel_t *arr, size_t len) { spi_transfer_32(1, 0x00000000); @@ -85,11 +82,114 @@ void write_leds(apa10xx_pixel_t *arr, size_t len) { spi_transfer_32(1, 0xFFFFFFFF); } +namespace fiatlux { + + namespace signal { + void write_data(bool data) { + gpio_write(signal_led_pin, !data); + } + } + + namespace relais { + void write_data(uint8_t data[2]) { + gpio_write(gpio4, (bool) data[0]); + gpio_write(gpio5, (bool) data[1]); + } + } + + namespace spi_dimmer { + void write_data(uint16_t data[6]) { + for (int i = 0; i < 6; ++i) { + int dac_val = (data[i] << 2) & 0x3FFC; + + spi_transfer_8(1, ~(0x00)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + spi_transfer_8(1, ~(0x01 << i)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + + spi_transfer_16(1, dac_val); + + spi_transfer_8(1, ~(0x00)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + spi_transfer_8(1, ~(0x01 << i)); + gpio_write(cs0, 1); + gpio_write(cs0, 0); + } + } + } + + namespace ws28x { + void write_data(ws2812_pixel_t *data, size_t len) { + ws2812_i2s_init(len, PIXEL_RGBW); + ws2812_i2s_update(data, PIXEL_RGBW); + } + } + + namespace apa10x { + void write_data(apa10xx_pixel_t *data, size_t len) { + spi_transfer_32(1, 0x00000000); + for (size_t i = 0; i < len; i++) + spi_transfer_32(1, *(uint32_t *) &data[i]); + spi_transfer_32(1, 0xFFFFFFFF); + spi_transfer_32(1, 0xFFFFFFFF); + } + } + + struct hal_error_t { + constexpr hal_error_t() = default; + + hal_error_t(const char *) {} + + hal_error_t(const char *, hal_error_t *cause) {} + }; + + constexpr hal_error_t empty_error; + + enum class hal_module_t { + SIGNAL, RELAIS, SPI_DIMMER, WS28X, APA10X + }; + + hal_error_t write_channel(uint8_t *data, size_t count, size_t stride, hal_module_t mod) { + if(mod == hal_module_t::SIGNAL) { + if(count != 1) + return "unsupported value for count"; + if(stride != 1) + return "unsupported value for stride"; + signal::write_data(data[0]); + } else if(mod == hal_module_t::RELAIS) { + if(count != 2) + return "unsupported value for count"; + if(stride != 1) + return "unsupported value for stride"; + relais::write_data(data); + } else if(mod == hal_module_t::SPI_DIMMER) { + if(count != 6) + return "unsupported value for count"; + if(stride != 2) + return "unsupported value for stride"; + spi_dimmer::write_data((uint16_t *) data); + } else if(mod == hal_module_t::WS28X) { + if(stride != 4) + return "unsupported value for stride"; + ws28x::write_data((ws2812_pixel_t *) data, count); + } else if(mod == hal_module_t::APA10X) { + if(stride != 4) + return "unsupported value for stride"; + apa10x::write_data((apa10xx_pixel_t *) data, count); + } else { + return "unsupported module"; + } + } + +} ws2812_pixel_t **pixels_ptr; extern "C" void signal_led(bool state) { - gpio_write(signal_led_pin, !state); + fiatlux::signal::write_data(state); } From b72426b9c78c3615b3c2d024a9d30bb75916abed Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 4 Nov 2021 01:23:01 +0100 Subject: [PATCH 05/18] stash --- firmware/lux.cpp | 61 ++++++++++++++++++++++++++---------------------- 1 file changed, 33 insertions(+), 28 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index 874f151..8a8f2b8 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -54,34 +54,6 @@ static apa10xx_pixel_t next_color(int i) { return colour; } -void spi_dac(int id, int val) { - int dac_val = (val << 2) & 0x3FFC; - - spi_transfer_8(1, ~(0x00)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); - spi_transfer_8(1, ~(0x01 << id)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); - - spi_transfer_16(1, dac_val); - - spi_transfer_8(1, ~(0x00)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); - spi_transfer_8(1, ~(0x01 << id)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); -} - -void write_leds(apa10xx_pixel_t *arr, size_t len) { - spi_transfer_32(1, 0x00000000); - for (size_t i = 0; i < len; i++) - spi_transfer_32(1, *(uint32_t *) &arr[i]); - spi_transfer_32(1, 0xFFFFFFFF); - spi_transfer_32(1, 0xFFFFFFFF); -} - namespace fiatlux { namespace signal { @@ -184,6 +156,39 @@ namespace fiatlux { } } + hal_error_t setup_channel(size_t count, size_t stride, hal_module_t mod) { + /*if(mod == hal_module_t::SIGNAL) { + if(count != 1) + return "unsupported value for count"; + if(stride != 1) + return "unsupported value for stride"; + signal::write_data(data[0]); + } else if(mod == hal_module_t::RELAIS) { + if(count != 2) + return "unsupported value for count"; + if(stride != 1) + return "unsupported value for stride"; + relais::write_data(data); + } else if(mod == hal_module_t::SPI_DIMMER) { + if(count != 6) + return "unsupported value for count"; + if(stride != 2) + return "unsupported value for stride"; + spi_dimmer::write_data((uint16_t *) data); + } else if(mod == hal_module_t::WS28X) { + if(stride != 4) + return "unsupported value for stride"; + ws28x::write_data((ws2812_pixel_t *) data, count); + } else if(mod == hal_module_t::APA10X) { + if(stride != 4) + return "unsupported value for stride"; + apa10x::write_data((apa10xx_pixel_t *) data, count); + } else { + return "unsupported module"; + } + return empty_error;*/ + } + } ws2812_pixel_t **pixels_ptr; From 4b23e5bc096277372ed15d8b12600592b8d0f53c Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 18 Nov 2021 01:45:35 +0100 Subject: [PATCH 06/18] stash --- firmware/lux.cpp | 116 +++++++++++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 44 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index 8a8f2b8..dfa771f 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -14,14 +14,8 @@ extern "C" { #include } - -const int signal_led_pin = 2; - const int cs0 = 15; -const int gpio4 = 4; -const int gpio5 = 5; - struct apa10xx_pixel_t { struct { unsigned int mod: 5, marker: 3; @@ -56,16 +50,51 @@ static apa10xx_pixel_t next_color(int i) { namespace fiatlux { + struct hal_error_t { + constexpr hal_error_t() = default; + + hal_error_t(const char *) {} + + hal_error_t(const char *, hal_error_t *cause) {} + }; + + constexpr hal_error_t empty_error; + + enum class hal_module_t { + NONE, SIGNAL, RELAIS, SPI_DIMMER, WS28X, APA10X + }; + + namespace ports { + hal_module_t spi = hal_module_t::NONE; + hal_module_t uart = hal_module_t::NONE; + hal_module_t gpio2 = hal_module_t::NONE; + hal_module_t gpio4 = hal_module_t::NONE; + hal_module_t gpio5 = hal_module_t::NONE; + } + namespace signal { void write_data(bool data) { - gpio_write(signal_led_pin, !data); + gpio_write(2, !data); + } + + void setup() { + gpio_enable(2, GPIO_OUTPUT); } } namespace relais { + void write_data(bool a, bool b) { + gpio_write(4, a); + gpio_write(5, b); + } + void write_data(uint8_t data[2]) { - gpio_write(gpio4, (bool) data[0]); - gpio_write(gpio5, (bool) data[1]); + write_data((bool) data[0], (bool) data[1]); + } + + void setup() { + gpio_enable(4, GPIO_OUTPUT); + gpio_enable(5, GPIO_OUTPUT); } } @@ -91,6 +120,10 @@ namespace fiatlux { gpio_write(cs0, 0); } } + + void setup() { + spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); + } } namespace ws28x { @@ -98,6 +131,10 @@ namespace fiatlux { ws2812_i2s_init(len, PIXEL_RGBW); ws2812_i2s_update(data, PIXEL_RGBW); } + + void setup() { + + } } namespace apa10x { @@ -108,22 +145,12 @@ namespace fiatlux { spi_transfer_32(1, 0xFFFFFFFF); spi_transfer_32(1, 0xFFFFFFFF); } + + void setup() { + spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); + } } - struct hal_error_t { - constexpr hal_error_t() = default; - - hal_error_t(const char *) {} - - hal_error_t(const char *, hal_error_t *cause) {} - }; - - constexpr hal_error_t empty_error; - - enum class hal_module_t { - SIGNAL, RELAIS, SPI_DIMMER, WS28X, APA10X - }; - hal_error_t write_channel(uint8_t *data, size_t count, size_t stride, hal_module_t mod) { if(mod == hal_module_t::SIGNAL) { if(count != 1) @@ -154,6 +181,7 @@ namespace fiatlux { } else { return "unsupported module"; } + return empty_error; } hal_error_t setup_channel(size_t count, size_t stride, hal_module_t mod) { @@ -185,13 +213,13 @@ namespace fiatlux { apa10x::write_data((apa10xx_pixel_t *) data, count); } else { return "unsupported module"; - } - return empty_error;*/ + }*/ + return empty_error; } } -ws2812_pixel_t **pixels_ptr; +//ws2812_pixel_t **pixels_ptr; extern "C" void signal_led(bool state) { fiatlux::signal::write_data(state); @@ -201,10 +229,7 @@ extern "C" void signal_led(bool state) { /* This task uses the high level GPIO API (esp_gpio.h) to blink an LED. * */ -extern "C" void lux_task(void *pvParameters) { - - //gpio_enable(9, GPIO_INPUT); - //gpio_enable(10, GPIO_INPUT); +extern "C" [[noreturn]] void lux_task(void *pvParameters) { int32_t lux_ws2812_number = 8; auto ret = sysparam_get_int32("lux_ws2812_number", &lux_ws2812_number); @@ -224,14 +249,18 @@ extern "C" void lux_task(void *pvParameters) { //lux_apa102c_number - gpio_enable(signal_led_pin, GPIO_OUTPUT); - //gpio_enable(cs0, GPIO_OUTPUT); - gpio_enable(gpio4, GPIO_OUTPUT); - gpio_enable(gpio5, GPIO_OUTPUT); - //spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); //for spi dimmer + //gpio_enable(9, GPIO_INPUT); + //gpio_enable(10, GPIO_INPUT); - spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_LITTLE_ENDIAN, false); //for apa10xx - while (1) { + //gpio_enable(cs0, GPIO_OUTPUT); + //fiatlux::spi_dimmer::setup(); + + fiatlux::signal::setup(); + fiatlux::relais::setup(); + + fiatlux::apa10x::setup(); + + while (true) { /*for (int j = 0; j < 64; j++) { for (int i = 0; i < 8; i++) spi_dac(i, 64 * j); @@ -247,7 +276,7 @@ extern "C" void lux_task(void *pvParameters) { gpio_write(gpio5, 1); vTaskDelay(200 / portTICK_PERIOD_MS); gpio_write(gpio5, 0);*/ - signal_led(0); + fiatlux::signal::write_data(false); for (int c = 8; c >= 0; c--) { for (auto &pixel: pixels) { @@ -257,16 +286,15 @@ extern "C" void lux_task(void *pvParameters) { led = next_color(c); } ws2812_i2s_update(pixels, PIXEL_RGBW); - write_leds(leds, lux_apa10xx_number); + fiatlux::write_channel((uint8_t *) &leds[0], lux_apa10xx_number, 4, fiatlux::hal_module_t::APA10X); vTaskDelay(200 / portTICK_PERIOD_MS); } - gpio_write(gpio4, 1); + fiatlux::relais::write_data(true, false); vTaskDelay(200 / portTICK_PERIOD_MS); - gpio_write(gpio4, 0); - gpio_write(gpio5, 1); + fiatlux::relais::write_data(false, true); vTaskDelay(200 / portTICK_PERIOD_MS); - gpio_write(gpio5, 0); - signal_led(1); + fiatlux::relais::write_data(false, false); + fiatlux::signal::write_data(true); vTaskDelay(200 / portTICK_PERIOD_MS); } From 22b240a4727b491980ab8b95c756e78544ece539 Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 18 Nov 2021 03:31:26 +0100 Subject: [PATCH 07/18] stash --- firmware/lux.cpp | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index dfa771f..d5d8e3c 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -14,7 +14,6 @@ extern "C" { #include } -const int cs0 = 15; struct apa10xx_pixel_t { struct { @@ -70,6 +69,7 @@ namespace fiatlux { hal_module_t gpio2 = hal_module_t::NONE; hal_module_t gpio4 = hal_module_t::NONE; hal_module_t gpio5 = hal_module_t::NONE; + hal_module_t gpio15 = hal_module_t::NONE; } namespace signal { @@ -99,41 +99,43 @@ namespace fiatlux { } namespace spi_dimmer { + constexpr int cs0 = 15; + void write_data(uint16_t data[6]) { for (int i = 0; i < 6; ++i) { int dac_val = (data[i] << 2) & 0x3FFC; spi_transfer_8(1, ~(0x00)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); + gpio_write(cs0, true); + gpio_write(cs0, false); spi_transfer_8(1, ~(0x01 << i)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); + gpio_write(cs0, true); + gpio_write(cs0, false); spi_transfer_16(1, dac_val); spi_transfer_8(1, ~(0x00)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); + gpio_write(cs0, true); + gpio_write(cs0, false); spi_transfer_8(1, ~(0x01 << i)); - gpio_write(cs0, 1); - gpio_write(cs0, 0); + gpio_write(cs0, true); + gpio_write(cs0, false); } } void setup() { + gpio_enable(cs0, GPIO_OUTPUT); spi_init(1, SPI_MODE0, SPI_FREQ_DIV_1M, 1, SPI_BIG_ENDIAN, 1); } } namespace ws28x { - void write_data(ws2812_pixel_t *data, size_t len) { - ws2812_i2s_init(len, PIXEL_RGBW); + void write_data(ws2812_pixel_t *data) { ws2812_i2s_update(data, PIXEL_RGBW); } - void setup() { - + void setup(size_t len) { + ws2812_i2s_init(len, PIXEL_RGBW); } } @@ -142,6 +144,8 @@ namespace fiatlux { spi_transfer_32(1, 0x00000000); for (size_t i = 0; i < len; i++) spi_transfer_32(1, *(uint32_t *) &data[i]); + //spi_transfer_32(1, *(uint32_t *) &data[len - 1]); // dunno maybe this helps + //spi_transfer_32(1, *(uint32_t *) &data[len - 1]); // dunno maybe this helps spi_transfer_32(1, 0xFFFFFFFF); spi_transfer_32(1, 0xFFFFFFFF); } @@ -173,7 +177,7 @@ namespace fiatlux { } else if(mod == hal_module_t::WS28X) { if(stride != 4) return "unsupported value for stride"; - ws28x::write_data((ws2812_pixel_t *) data, count); + ws28x::write_data((ws2812_pixel_t *) data); } else if(mod == hal_module_t::APA10X) { if(stride != 4) return "unsupported value for stride"; @@ -236,10 +240,10 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) { if(ret != SYSPARAM_OK) lux_ws2812_number = 8; - int32_t lux_apa10xx_number = 8; + int32_t lux_apa10xx_number = 40; ret = sysparam_get_int32("lux_apa10xx_number", &lux_apa10xx_number); if(ret != SYSPARAM_OK) - lux_apa10xx_number = 8; + lux_apa10xx_number = 40; ws2812_pixel_t pixels[lux_ws2812_number]; ws2812_i2s_init(lux_ws2812_number, PIXEL_RGBW); @@ -252,7 +256,6 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) { //gpio_enable(9, GPIO_INPUT); //gpio_enable(10, GPIO_INPUT); - //gpio_enable(cs0, GPIO_OUTPUT); //fiatlux::spi_dimmer::setup(); fiatlux::signal::setup(); From 874ca62eeeb5de94daf3907346d51f3ece83fe0b Mon Sep 17 00:00:00 2001 From: jedi Date: Sat, 24 Jul 2021 00:40:45 +0200 Subject: [PATCH 08/18] websocket goes brrrrrrrrrrrrrrr --- firmware/fiatlux.c | 13 +++ firmware/system.c | 8 +- firmware/web.cpp | 86 +++++++++++++++++++ firmware/webdir/index.html | 171 ++++++++++++++++++++++++++++++++++++- firmware/wifi.cpp | 5 ++ 5 files changed, 281 insertions(+), 2 deletions(-) diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 9e3efeb..7e89970 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -11,6 +11,8 @@ #include #include +#include "rboot-api.h" + void user_init(void) { uart_set_baud(0, 115200); @@ -27,4 +29,15 @@ void user_init(void) xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL); xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); + + 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 > 8; + response[0] = 'V'; + LOCK_TCPIP_CORE(); + websocket_write(pcb, response, 3, WS_BIN_MODE); + UNLOCK_TCPIP_CORE(); + }*/ vTaskDelayMs(500); + //printf("9: %d\n",gpio_read(9)); + //printf("10: %d\n",gpio_read(10)); } syslog_detach(); @@ -245,9 +259,16 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, ret = ERROR; val = 0; + int8_t en = 0; bool togl = false; switch (data[0]) { + case 'V': // ADC + /* This should be done on a separate thread in 'real' applications */ + cmd = 'V'; + ret = OK; + val = sdk_system_adc_read(); + break; case 'R': // Restart cmd = 'R'; ret = OK; @@ -292,6 +313,46 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, } cmd = 'C'; break; + case 'S': { + if(data[1] == 'E') + en = 1; + char *ssid = &data[2]; + size_t ssid_len = strlen(ssid); + char *password = &data[3 + ssid_len]; + size_t password_len = strlen(password); + (void) password_len; + + sysparam_set_int8("wifi_sta_enable", en); + sysparam_set_string("wifi_sta_ssid", ssid); + sysparam_set_string("wifi_sta_password", password); + } + cmd = 'S'; + break; + case 'A': { + if(data[1] == 'E') + en = 1; + char *ssid = &data[2]; + size_t ssid_len = strlen(ssid); + char *password = &data[3 + ssid_len]; + size_t password_len = strlen(password); + (void) password_len; + + sysparam_set_int8("wifi_ap_enable", en); + sysparam_set_string("wifi_ap_ssid", ssid); + sysparam_set_string("wifi_ap_password", password); + + /*uint8_t ap_disable_if_sta = 0; + uint8_t ssid_hidden = 0; + uint8_t dns_enable = 0; + uint8_t mdns_enable = 0;*/ + + //sysparam_set_int8("wifi_ap_disable_if_sta", ap_disable_if_sta); + //sysparam_set_int8("wifi_ap_ssid_hidden", ssid_hidden); + //sysparam_set_int8("wifi_ap_dns", dns_enable); + //sysparam_set_int8("wifi_ap_mdns", mdns_enable); + } + cmd = 'A'; + break; default: printf("[websocket_callback]:\n%.*s\n", (int) data_len, (char *) data); printf("Unknown command %c\n", data[0]); @@ -327,11 +388,36 @@ void websocket_open_cb(struct tcp_pcb *pcb, const char *uri) { } } +/*const char *gpio_cgi_handler(int iIndex, int iNumParams, char *pcParam[], char *pcValue[]) { + for (int i = 0; i < iNumParams; i++) { + if(strcmp(pcParam[i], "on") == 0) { + uint8_t gpio_num = atoi(pcValue[i]); + gpio_enable(gpio_num, GPIO_OUTPUT); + gpio_write(gpio_num, true); + } else if(strcmp(pcParam[i], "off") == 0) { + uint8_t gpio_num = atoi(pcValue[i]); + gpio_enable(gpio_num, GPIO_OUTPUT); + gpio_write(gpio_num, false); + } else if(strcmp(pcParam[i], "toggle") == 0) { + uint8_t gpio_num = atoi(pcValue[i]); + gpio_enable(gpio_num, GPIO_OUTPUT); + gpio_toggle(gpio_num); + } + } + return "/index.html"; +}*/ + extern "C" void httpd_task(void *pvParameters) { (void) pvParameters; while (!uxSemaphoreGetCount(wifi_available_semaphore)) vTaskDelay(500 / portTICK_PERIOD_MS); + /*tCGI pCGIs[] = { + {"/gpio", (tCGIHandler) gpio_cgi_handler}, + }; + + // register handlers and start the server + http_set_cgi_handlers(pCGIs, sizeof(pCGIs) / sizeof(pCGIs[0]));*/ websocket_register_callbacks((tWsOpenHandler) websocket_open_cb, (tWsHandler) websocket_cb); httpd_init(); diff --git a/firmware/webdir/index.html b/firmware/webdir/index.html index 317dc10..370c661 100644 --- a/firmware/webdir/index.html +++ b/firmware/webdir/index.html @@ -17,6 +17,8 @@ @@ -75,6 +77,125 @@ +
+

I/O

+
+
+

Protocols

+
+
+
+ + +
+
+ + +
+
+
+
+
+

Station Mode current connection

+
+
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + + +
+
+ + +
+
+
+
+
+

Wifi Settings

+
+
+

AP Mode

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ AP IP + N/A +
+
+ AP MAC + N/A +
+
+ + +
+
+
+
+
+

Station Mode current connection

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ Sation IP + N/A +
+
+ Station MAC + N/A +
+
+ + +
+
+
+

Status

@@ -330,6 +451,46 @@ startPolling(); } + var sta_toggle = document.getElementById("sta_toggle"); + var sta_ssid = document.getElementById("sta_ssid"); + var sta_pw = document.getElementById("sta_pw"); + + function sta_update() { + var en = sta_toggle.checked; + + const ssid = sta_ssid.value; + const password = sta_pw.value; + + const buffer = new ArrayBuffer(ssid.length + password.length + 4); + const view1 = new DataView(buffer); + var tx_len = 0; + view1.setChar(tx_len++, 'S'); + view1.setChar(tx_len++, (en ? "E" : "D")); + tx_len = view1.setString(tx_len, ssid); + tx_len = view1.setString(tx_len, password); + wsWrite(buffer); + } + + var ap_toggle = document.getElementById("ap_toggle"); + var ap_ssid = document.getElementById("ap_ssid"); + var ap_pw = document.getElementById("ap_pw"); + + function ap_update() { + var en = ap_toggle.checked; + + const ssid = ap_ssid.value; + const password = ap_pw.value; + + const buffer = new ArrayBuffer(ssid.length + password.length + 4); + const view1 = new DataView(buffer); + var tx_len = 0; + view1.setChar(tx_len++, 'A'); + view1.setChar(tx_len++, (en ? "E" : "D")); + tx_len = view1.setString(tx_len, ssid); + tx_len = view1.setString(tx_len, password); + wsWrite(buffer); + } + var makeCRCTable = function () { var c; var crcTable = []; @@ -358,6 +519,8 @@ var firmware_file; function load_firmware(evt) { + console.log("load_firmware", evt); + var file = evt.target.files[0]; if (!file) { return; @@ -395,11 +558,14 @@ reject({frame_error: i}); }, 2000); wsWrite(frame.buffer); + //build packet: type, seq, len, hash, data + console.log(i, (end - begin), crc32(slice), (100*end/buf.byteLength)+"%"); }); } function transmit_firmware_final(buf, hash) { return new Promise((resolve, reject) => { + console.log("final: ", buf.byteLength, hash.toString(16)); var frame = new ArrayBuffer(12); var headerview = new DataView(frame); headerview.setChar(0, 'C'); @@ -416,8 +582,11 @@ } function transmit_firmware(evt) { - console.log("transmit_firmware begin"); + console.log("transmit_firmware", evt); if (firmware_file) { + console.log("len", firmware_file.byteLength); + //console.log(crc32(firmware_file)); + (async () => { const ash = crc32(firmware_file); for (var i = 0; i * chunk_size < firmware_file.byteLength; i++) { diff --git a/firmware/wifi.cpp b/firmware/wifi.cpp index 729e71a..4501813 100644 --- a/firmware/wifi.cpp +++ b/firmware/wifi.cpp @@ -34,6 +34,8 @@ char *wifi_ap_password = nullptr; SemaphoreHandle_t wifi_available_semaphore = nullptr; [[noreturn]] static void dns_task(void *pvParameters) { + printf("run dns task\n"); + char *wifi_ap_ip_addr = nullptr; sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); if(!wifi_ap_ip_addr) { @@ -271,6 +273,7 @@ extern "C" void wifi_task(void *pvParameters) { if(wifi_ap_channel < 1 || wifi_ap_channel > 14) { wifi_ap_channel = 6; } + wifi_ap_channel = 3; int8_t wifi_ap_authmode = AUTH_WPA_WPA2_PSK; sysparam_get_int8("wifi_ap_authmode", &wifi_ap_authmode); @@ -284,6 +287,7 @@ extern "C" void wifi_task(void *pvParameters) { if(wifi_ap_max_conn < 1 || wifi_ap_max_conn > 8) { wifi_ap_max_conn = 3; } + wifi_ap_max_conn = 8; int32_t wifi_ap_beacon_interval = 100; sysparam_get_int32("wifi_ap_beacon_interval", &wifi_ap_beacon_interval); @@ -357,5 +361,6 @@ extern "C" void wifi_task(void *pvParameters) { xSemaphoreGive(wifi_available_semaphore); //monitor loop connection here + printf("wifi task done\n"); vTaskDelete(nullptr); } \ No newline at end of file From e2e3b249bfffb7c16f5cd5302a83135e6a969b26 Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 9 Sep 2021 17:15:06 +0200 Subject: [PATCH 09/18] stash --- firmware/webdir/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware/webdir/index.html b/firmware/webdir/index.html index 370c661..389f51c 100644 --- a/firmware/webdir/index.html +++ b/firmware/webdir/index.html @@ -533,7 +533,7 @@ reader.readAsArrayBuffer(file) } - const chunk_size = 512; + const chunk_size = 1024; function transmit_firmware_chunk(buf, i) { return new Promise((resolve, reject) => { From d96504d3eb903738676a4d6d75c609b1b539421b Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 9 Sep 2021 22:54:51 +0200 Subject: [PATCH 10/18] stash --- firmware/webdir/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware/webdir/index.html b/firmware/webdir/index.html index 389f51c..0b4bac1 100644 --- a/firmware/webdir/index.html +++ b/firmware/webdir/index.html @@ -341,7 +341,7 @@ sbox = document.getElementById('status_box'); sbox.className = "label " + cls; sbox.innerHTML = text; - console.info(text); + //console.info(text); } function startPolling() { @@ -519,7 +519,7 @@ var firmware_file; function load_firmware(evt) { - console.log("load_firmware", evt); + //console.log("load_firmware", evt); var file = evt.target.files[0]; if (!file) { @@ -533,7 +533,7 @@ reader.readAsArrayBuffer(file) } - const chunk_size = 1024; + const chunk_size = 512; function transmit_firmware_chunk(buf, i) { return new Promise((resolve, reject) => { @@ -559,7 +559,7 @@ }, 2000); wsWrite(frame.buffer); //build packet: type, seq, len, hash, data - console.log(i, (end - begin), crc32(slice), (100*end/buf.byteLength)+"%"); + console.log(i, (end - begin), crc32(slice), (100 * end / buf.byteLength) + "%"); }); } From f6681d54de5f0b9c67bf10da4df2aed533344607 Mon Sep 17 00:00:00 2001 From: jedi Date: Sun, 12 Sep 2021 04:32:05 +0200 Subject: [PATCH 11/18] stash --- firmware/lux.cpp | 25 +++++++++++++------------ firmware/web.cpp | 12 ++++++++++++ firmware/webdir/index.html | 11 +++++++++++ 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/firmware/lux.cpp b/firmware/lux.cpp index d5d8e3c..e5dadc6 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -26,13 +26,10 @@ struct apa10xx_pixel_t { static ws2812_pixel_t next_colour(int i) { ws2812_pixel_t colour = {{0, 0, 0, 0}}; - if(i == 8) { - colour.white = 32; - } else { - colour.red = i & 1 ? 32 : 0; - colour.green = i & 2 ? 32 : 0; - colour.blue = i & 4 ? 32 : 0; - } + colour.red = 0; + colour.green = 0; + colour.blue = 0; + colour.white = 8; return colour; } @@ -40,9 +37,9 @@ static ws2812_pixel_t next_colour(int i) { static apa10xx_pixel_t next_color(int i) { apa10xx_pixel_t colour; colour.global.mod = 8; - colour.r = i & 1 ? 32 : 0; - colour.g = i & 2 ? 32 : 0; - colour.b = i & 4 ? 32 : 0; + colour.r = 16; + colour.g = 16; + colour.b = 16; return colour; } @@ -229,16 +226,20 @@ extern "C" void signal_led(bool state) { fiatlux::signal::write_data(state); } +extern "C" void white_led(bool state) { + gpio_write(signal_led_pin, !state); +} + /* This task uses the high level GPIO API (esp_gpio.h) to blink an LED. * */ extern "C" [[noreturn]] void lux_task(void *pvParameters) { - int32_t lux_ws2812_number = 8; + int32_t lux_ws2812_number = 40; auto ret = sysparam_get_int32("lux_ws2812_number", &lux_ws2812_number); if(ret != SYSPARAM_OK) - lux_ws2812_number = 8; + lux_ws2812_number = 40; int32_t lux_apa10xx_number = 40; ret = sysparam_get_int32("lux_apa10xx_number", &lux_apa10xx_number); diff --git a/firmware/web.cpp b/firmware/web.cpp index 1e182d0..0e3c7fd 100644 --- a/firmware/web.cpp +++ b/firmware/web.cpp @@ -291,6 +291,18 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, ret = OK; val = 0; break; + case 'd': // Disable LED + signal_led(false); + cmd = 'G'; + ret = OK; + val = 1; + break; + case 'e': // Enable LED + signal_led(true); + cmd = 'G'; + ret = OK; + val = 0; + break; case 'F': togl = !togl; signal_led(togl); diff --git a/firmware/webdir/index.html b/firmware/webdir/index.html index 0b4bac1..41d3897 100644 --- a/firmware/webdir/index.html +++ b/firmware/webdir/index.html @@ -301,6 +301,10 @@ toggle signal led +
@@ -446,6 +450,13 @@ wsWrite('D'); } + function leds() { + if (document.getElementById('white-switch').checked) + wsWrite('e'); + else + wsWrite('d'); + } + window.onload = function () { wsOpen(); startPolling(); From 1d4613e0d44c18a5b510f59bb7aca2f6508098a9 Mon Sep 17 00:00:00 2001 From: jedi Date: Sun, 8 Aug 2021 22:59:15 +0200 Subject: [PATCH 12/18] stash --- firmware/app.cpp | 261 +++++++++++++++++++++++++++++++++++++++++ firmware/config.sample | 7 ++ firmware/fiatlux.c | 139 +++++++++++++++++++++- 3 files changed, 403 insertions(+), 4 deletions(-) create mode 100644 firmware/app.cpp create mode 100644 firmware/config.sample diff --git a/firmware/app.cpp b/firmware/app.cpp new file mode 100644 index 0000000..f7b2414 --- /dev/null +++ b/firmware/app.cpp @@ -0,0 +1,261 @@ +/* Example SPI transfert + * + * This sample code is in the public domain. + */ +#include "espressif/esp_common.h" +#include "esp/uart.h" +#include "FreeRTOS.h" +#include "task.h" +#include "esp8266.h" +#include +#include "esp/spi.h" +#include "math.h" +#include + +#define DAYTIME(h,m,s) (h*3600+m*60+s) + +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); +} settings; + + + +struct { + uint8_t r = 255; + uint8_t g = 160; + uint8_t b = 80; +} white; + +time_t day_seconds() { + time_t t1, t2; + struct tm tms; + time(&t1); + localtime_r(&t1, &tms); + tms.tm_hour = 0; + tms.tm_min = 0; + tms.tm_sec = 0; + 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; +}; + +led_t leds[4][10]; + +float square(float x){ + return x*x; +} + +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 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); +} + +enum state_t{ BOOT_S, SUNRISE_S, MORNING_S, DAY_S, NIGHT_S }; + +state_t s = BOOT_S; + +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(); + } +} + +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); + + } +} + + +extern "C" void register_app(void) +{ + xTaskCreate(loop, "loop", 1024, NULL, 2, NULL); +} diff --git a/firmware/config.sample b/firmware/config.sample new file mode 100644 index 0000000..2673cac --- /dev/null +++ b/firmware/config.sample @@ -0,0 +1,7 @@ +sunrise_start: time +sunrise_end: time +sunrise_shutdown: time +sunrise_color: color +sunrise_fade: linear, ease, ease_in, ease_out +sunset_time: time +night_color: color diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 7e89970..78dcb79 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -1,18 +1,149 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + #include "system.h" #include "wifi.h" #include "web.h" #include "mqtt.h" #include "lux.h" -#include -#include -#include - #include #include #include "rboot-api.h" +#define LED_PIN 2 +#define SWITCH_PIN 2 + +/* Add extras/sntp component to makefile for this include to work */ +#include +#include + +#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 + + +const gpio_inttype_t int_type = GPIO_INTTYPE_EDGE_NEG; + + + + + +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); + } + + /* 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"); + + /* 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)); + } +} + + +void gpio_intr_handler(uint8_t gpio_num); + +void manual_switch(void); + +void buttonIntTask(void *pvParameters) +{ + printf("Waiting for button press interrupt on gpio %d...\r\n", SWITCH_PIN); + QueueHandle_t *tsqueue = (QueueHandle_t *)pvParameters; + gpio_set_interrupt(SWITCH_PIN, int_type, gpio_intr_handler); + + uint32_t last = 0; + while(1) { + uint32_t button_ts; + xQueueReceive(*tsqueue, &button_ts, portMAX_DELAY); + button_ts *= portTICK_PERIOD_MS; + if(last < button_ts-200) { + manual_switch(); + //printf("Button interrupt fired at %dms\r\n", button_ts); + last = button_ts; + } + } +} + +static QueueHandle_t tsqueue; + +void gpio_intr_handler(uint8_t gpio_num) +{ + uint32_t now = xTaskGetTickCountFromISR(); + xQueueSendToBackFromISR(tsqueue, &now, NULL); +} + +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) { uart_set_baud(0, 115200); From bce33fa836f212c44d203c070c6b548133b2660e Mon Sep 17 00:00:00 2001 From: jedi Date: Wed, 3 Nov 2021 19:14:18 +0100 Subject: [PATCH 13/18] 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 Date: Tue, 16 Nov 2021 20:19:02 +0100 Subject: [PATCH 14/18] stash --- firmware/fiatlux.c | 75 ++++---------------------------- firmware/{app.cpp => noctis.cpp} | 11 +++-- firmware/ntp.cpp | 53 ++++++++++++++++++++++ firmware/ntp.h | 23 ++++++++++ firmware/web.cpp | 8 +--- firmware/wifi.cpp | 14 +++++- firmware/wifi.h | 1 + 7 files changed, 108 insertions(+), 77 deletions(-) rename firmware/{app.cpp => noctis.cpp} (97%) create mode 100644 firmware/ntp.cpp create mode 100644 firmware/ntp.h diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 94d8de5..fe19578 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -1,91 +1,30 @@ -#include #include #include -#include #include #include #include -#include -#include -#include - -#include -#include -#include -#include -#include #include "system.h" #include "wifi.h" #include "web.h" #include "mqtt.h" +#include "ntp.h" #include "lux.h" #include -#include #include "rboot-api.h" #define LED_PIN 2 #define SWITCH_PIN 2 -/* Add extras/sntp component to makefile for this include to work */ -#include -#include - -#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 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); - - while (!uxSemaphoreGetCount(wifi_available_semaphore)) { - vTaskDelay(2000 / portTICK_PERIOD_MS); - printf("waitfi\n"); - } - - /* 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)); - } -} - - void gpio_intr_handler(uint8_t gpio_num); void manual_switch(void); @@ -128,19 +67,20 @@ void user_init(void) { system_init_config(); wifi_available_semaphore = xSemaphoreCreateBinary(); + wan_available_semaphore = xSemaphoreCreateBinary(); time_available_semaphore = xSemaphoreCreateBinary(); - gpio_enable(SWITCH_PIN, GPIO_INPUT); + //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", 2048, 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(&sntp_task, "sntp_task", 512, NULL, 1, NULL); //xTaskCreate(buttonIntTask, "buttonIntTask", 256, &tsqueue, 2, NULL); @@ -148,6 +88,8 @@ void user_init(void) { 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); @@ -158,4 +100,5 @@ void user_init(void) { } printf("profit!\n"); + */ } diff --git a/firmware/app.cpp b/firmware/noctis.cpp similarity index 97% rename from firmware/app.cpp rename to firmware/noctis.cpp index a9107d9..0c1d839 100644 --- a/firmware/app.cpp +++ b/firmware/noctis.cpp @@ -13,9 +13,9 @@ #include #include -#define DAYTIME(h, m, s) (h*3600+m*60+s) +#include "ntp.h" -extern SemaphoreHandle_t time_available_semaphore; +#define DAYTIME(h, m, s) (h*3600+m*60+s) struct { time_t sunrise_start = DAYTIME(8, 30, 0); @@ -204,7 +204,7 @@ extern "C" void manual_switch() { printf("NIGHT_S\n"); } - printf("%lld | %lld %lld %lld %lld\n", rt, + printf("%ld | %ld %ld %ld %ld\n", rt, settings.sunrise_start, settings.sunrise_end, settings.sunset_time, @@ -282,6 +282,11 @@ extern "C" void manual_switch() { vTaskDelay(1000 / portTICK_PERIOD_MS); + /*time_t ts = time(nullptr); + int t = ts; + printf("TIME: %d %d %s", t, (int) day_seconds(), ctime(&ts));*/ + + } } diff --git a/firmware/ntp.cpp b/firmware/ntp.cpp new file mode 100644 index 0000000..b074eaa --- /dev/null +++ b/firmware/ntp.cpp @@ -0,0 +1,53 @@ +// +// Created by jedi on 04.11.21. +// + +#include "ntp.h" +#include "wifi.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Add extras/sntp component to makefile for this include to work */ +#include +#include + +#ifdef __cplusplus +} +#endif + +#include + +#define SNTP_SERVERS "0.pool.ntp.org", "1.pool.ntp.org", \ + "2.pool.ntp.org", "3.pool.ntp.org" + +SemaphoreHandle_t time_available_semaphore = nullptr; + +void sntp_task(void *pvParameters) { + const char *servers[] = {SNTP_SERVERS}; + (void) pvParameters; + + while (!uxSemaphoreGetCount(wan_available_semaphore)) { + vTaskDelay(2000 / portTICK_PERIOD_MS); + } + + + + /* 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 */ + vTaskDelete(nullptr); +} \ No newline at end of file diff --git a/firmware/ntp.h b/firmware/ntp.h new file mode 100644 index 0000000..f986ac5 --- /dev/null +++ b/firmware/ntp.h @@ -0,0 +1,23 @@ +// +// Created by jedi on 04.11.21. +// + +#ifndef FIRMWARE_NTP_H +#define FIRMWARE_NTP_H + +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +extern SemaphoreHandle_t time_available_semaphore; + +void sntp_task(void *pvParameters); + +#ifdef __cplusplus +} +#endif + +#endif //FIRMWARE_NTP_H diff --git a/firmware/web.cpp b/firmware/web.cpp index 0e3c7fd..82e7789 100644 --- a/firmware/web.cpp +++ b/firmware/web.cpp @@ -422,14 +422,10 @@ void websocket_open_cb(struct tcp_pcb *pcb, const char *uri) { extern "C" void httpd_task(void *pvParameters) { (void) pvParameters; - while (!uxSemaphoreGetCount(wifi_available_semaphore)) + while (!uxSemaphoreGetCount(wifi_available_semaphore)) { vTaskDelay(500 / portTICK_PERIOD_MS); - /*tCGI pCGIs[] = { - {"/gpio", (tCGIHandler) gpio_cgi_handler}, - }; + } - // register handlers and start the server - http_set_cgi_handlers(pCGIs, sizeof(pCGIs) / sizeof(pCGIs[0]));*/ websocket_register_callbacks((tWsOpenHandler) websocket_open_cb, (tWsHandler) websocket_cb); httpd_init(); diff --git a/firmware/wifi.cpp b/firmware/wifi.cpp index 251c0e4..79ae8a9 100644 --- a/firmware/wifi.cpp +++ b/firmware/wifi.cpp @@ -22,9 +22,9 @@ extern "C" { #include #include -const char *wificfg_default_ssid = "fiatlux_%02X%02X%02X"; +const char *wificfg_default_ssid = "fiatlux-noctis_%02X%02X%02X"; const char *wificfg_default_password = "fiatlux02"; -const char *wificfg_default_hostname = "fiatlux-%02x%02x%02x"; +const char *wificfg_default_hostname = "fiatlux-noctis-%02x%02x%02x"; char *wifi_sta_ssid = nullptr; char *wifi_sta_password = nullptr; @@ -32,6 +32,7 @@ char *wifi_ap_ssid = nullptr; char *wifi_ap_password = nullptr; SemaphoreHandle_t wifi_available_semaphore = nullptr; +SemaphoreHandle_t wan_available_semaphore = nullptr; [[noreturn]] static void dns_task(void *pvParameters) { printf("run dns task\n"); @@ -361,9 +362,18 @@ extern "C" void wifi_task(void *pvParameters) { //gpio_enable(LED_PIN, GPIO_OUTPUT); //gpio_write(LED_PIN, true); + printf("wifi wait for ip\n"); xSemaphoreGive(wifi_available_semaphore); + + /* Wait until we have joined AP and are assigned an IP */ + while (sdk_wifi_station_get_connect_status() != STATION_GOT_IP) { + vTaskDelay(250 / portTICK_PERIOD_MS); + } + + xSemaphoreGive(wan_available_semaphore); + //monitor loop connection here printf("wifi task done\n"); vTaskDelete(nullptr); diff --git a/firmware/wifi.h b/firmware/wifi.h index 9fec7da..8723dcf 100644 --- a/firmware/wifi.h +++ b/firmware/wifi.h @@ -13,6 +13,7 @@ extern "C" { #endif extern SemaphoreHandle_t wifi_available_semaphore; +extern SemaphoreHandle_t wan_available_semaphore; void wifi_task(void *pvParameters); From 875b3a8999268a93bf086711b519d1714649da20 Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 18 Nov 2021 00:09:40 +0100 Subject: [PATCH 15/18] stash --- firmware/fiatlux.c | 7 ++- firmware/system.c | 6 +-- firmware/web.cpp | 24 +++++++++ firmware/webdir/css/style.css | 2 +- firmware/webdir/index.html | 92 +++++++++++++++++++++++++++++++++++ firmware/webdir/index.htmll | 1 - 6 files changed, 123 insertions(+), 9 deletions(-) delete mode 100644 firmware/webdir/index.htmll diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index fe19578..5533fe0 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -29,14 +29,13 @@ void gpio_intr_handler(uint8_t gpio_num); void manual_switch(void); -void buttonIntTask(void *pvParameters) -{ +_Noreturn void buttonIntTask(void *pvParameters) { printf("Waiting for button press interrupt on gpio %d...\r\n", SWITCH_PIN); - QueueHandle_t *tsqueue = (QueueHandle_t *)pvParameters; + QueueHandle_t *tsqueue = (QueueHandle_t *) pvParameters; gpio_set_interrupt(SWITCH_PIN, int_type, gpio_intr_handler); uint32_t last = 0; - while(1) { + while (1) { uint32_t button_ts; xQueueReceive(*tsqueue, &button_ts, portMAX_DELAY); button_ts *= portTICK_PERIOD_MS; diff --git a/firmware/system.c b/firmware/system.c index f12b19b..d8e1fcc 100644 --- a/firmware/system.c +++ b/firmware/system.c @@ -30,7 +30,7 @@ void system_clear_config() { spiflash_erase_sector(start + i * sdk_flashchip.sector_size); } if(sysparam_create_area(start, num_sectors, true) == SYSPARAM_OK) { - sysparam_init(start, 0); + sysparam_init(start, start + 0x2000); } sysparam_init(start, start + 0x2000); sdk_system_restart(); @@ -39,13 +39,13 @@ void system_clear_config() { void system_init_config() { uint32_t base_addr = 0x00100000; uint32_t num_sectors; - sysparam_init(base_addr, 0); + sysparam_init(base_addr, base_addr + 0x2000); if(sysparam_get_info(&base_addr, &num_sectors) != SYSPARAM_OK) { syslog("Warning: WiFi config, sysparam not initialized\n"); num_sectors = 0x2000 / sdk_flashchip.sector_size; //base_addr = sdk_flashchip.chip_size - (5 + num_sectors) * sdk_flashchip.sector_size; if(sysparam_create_area(base_addr, num_sectors, true) == SYSPARAM_OK) { - sysparam_init(base_addr, 0); + sysparam_init(base_addr, base_addr + 0x2000); } sdk_system_restart(); } diff --git a/firmware/web.cpp b/firmware/web.cpp index 82e7789..24149cf 100644 --- a/firmware/web.cpp +++ b/firmware/web.cpp @@ -325,6 +325,30 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, } cmd = 'C'; break; + case 'T': { + auto A = *(int32_t *) &data[4]; + auto B = *(int32_t *) &data[8]; + auto C = *(int32_t *) &data[12]; + auto D = *(int32_t *) &data[16]; + /*sysparam_set_int32("noctis_A", A); + sysparam_set_int32("noctis_B", B); + sysparam_set_int32("noctis_C", C); + sysparam_set_int32("noctis_D", D);*/ + } + cmd = 'T'; + break; + case 'N': { + if(data[1] == 'W') + printf("WS2812\n"); + else if(data[1] == 'A') + printf("APA103C\n"); + else if(data[1] == 'Z') + printf("APA103C-Z\n"); + auto num_leds = *(uint16_t *) &data[2]; + /*sysparam_set_int32("noctis_leds", num_leds);*/ + } + cmd = 'N'; + break; case 'S': { if(data[1] == 'E') en = 1; diff --git a/firmware/webdir/css/style.css b/firmware/webdir/css/style.css index c84c3d9..3a452de 100644 --- a/firmware/webdir/css/style.css +++ b/firmware/webdir/css/style.css @@ -10,7 +10,7 @@ canvas { width: 100%; } -main section:target ~ section, main section#io, main section#wifi, main section#ota { +main section:target ~ section, main section#io, main section#wifi, main section#noctis, main section#ota { display: none; } diff --git a/firmware/webdir/index.html b/firmware/webdir/index.html index 41d3897..5528358 100644 --- a/firmware/webdir/index.html +++ b/firmware/webdir/index.html @@ -18,6 +18,7 @@ @@ -131,6 +132,61 @@
+
+

Time

+
+
+

Times

+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+

Output

+
+
+
+ + +
+
+ + + + +
+
+ + +
+
+
+

Wifi Settings

@@ -502,6 +558,42 @@ wsWrite(buffer); } + var sunrise_start = document.getElementById("sunrise_start"); + var sunrise_end = document.getElementById("sunrise_end"); + var sunrise_shutdown = document.getElementById("sunrise_shutdown"); + var sunset_time = document.getElementById("sunset_time"); + + var noctisnumber = document.getElementById("noctisnumber"); + var noctismode = document.getElementById("noctismode"); + + function noctis_times() { + const buffer = new ArrayBuffer(20); + const view1 = new DataView(buffer); + var tx_len = 0; + view1.setChar(tx_len, 'T'); + tx_len += 4; + view1.setUint32(tx_len, sunrise_start.valueAsNumber); + tx_len += 4; + view1.setUint32(tx_len, sunrise_end.valueAsNumber); + tx_len += 4; + view1.setUint32(tx_len, sunrise_shutdown.valueAsNumber); + tx_len += 4; + view1.setUint32(tx_len, sunset_time.valueAsNumber); + tx_len += 4; + wsWrite(buffer); + } + + function noctis_output() { + const buffer = new ArrayBuffer(4); + const view1 = new DataView(buffer); + var tx_len = 0; + view1.setChar(tx_len++, 'N'); + view1.setChar(tx_len++, noctismode.value); + view1.setUint16(tx_len, noctisnumber.valueAsNumber); + tx_len += 2; + wsWrite(buffer); + } + var makeCRCTable = function () { var c; var crcTable = []; diff --git a/firmware/webdir/index.htmll b/firmware/webdir/index.htmll deleted file mode 100644 index 6599b06..0000000 --- a/firmware/webdir/index.htmll +++ /dev/null @@ -1 +0,0 @@ - fiatlux v0.2

System

Firmware Update

Restart

Reset Config

I/O

Protocols

Station Mode current connection

Wifi Settings

AP Mode

AP IP N/A
AP MAC N/A

Station Mode current connection

Sation IP N/A
Station MAC N/A

Status

System

Chip ID N/A
Hostname N/A
Firmware Version N/A
Flash ID N/A
Flash size N/A KiB
Free heap N/A bytes
Uptime N/A s

Network current connection

Mode N/A
Station SSID N/A
Station IP N/A
Station MAC N/A
AP SSID N/A
AP IP N/A
AP MAC N/A

Power

Input 5V12V
Output 11.2V

I/O

\ No newline at end of file From f9b13d4c0628160c849b9240316478423cecc5b8 Mon Sep 17 00:00:00 2001 From: jedi Date: Thu, 18 Nov 2021 08:03:39 +0100 Subject: [PATCH 16/18] stash --- firmware/fiatlux.c | 2 +- firmware/noctis.cpp | 17 +++++++++-------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 5533fe0..75f04c8 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -77,7 +77,7 @@ void user_init(void) { xTaskCreate(&httpd_task, "httpd_task", 2048, NULL, 2, NULL); - xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); + //xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); xTaskCreate(&sntp_task, "sntp_task", 512, NULL, 1, NULL); diff --git a/firmware/noctis.cpp b/firmware/noctis.cpp index 0c1d839..bb745fe 100644 --- a/firmware/noctis.cpp +++ b/firmware/noctis.cpp @@ -14,6 +14,7 @@ #include #include "ntp.h" +#include "log.h" #define DAYTIME(h, m, s) (h*3600+m*60+s) @@ -158,7 +159,7 @@ extern "C" void manual_switch() { vTaskDelay(1000 / portTICK_PERIOD_MS); - printf("START>\n"); + syslog("START>\n"); while (true) { @@ -193,15 +194,15 @@ extern "C" void manual_switch() { if(s == BOOT_S) { if(rt >= settings.sunrise_start) { s = SUNRISE_S; - printf("SUNRISE_S\n"); + syslog("SUNRISE_S\n"); } if(rt >= settings.sunrise_end) { s = MORNING_S; - printf("MORNING_S\n"); + syslog("MORNING_S\n"); } if(rt >= settings.sunset_time || rt < settings.sunrise_start) { s = NIGHT_S; - printf("NIGHT_S\n"); + syslog("NIGHT_S\n"); } printf("%ld | %ld %ld %ld %ld\n", rt, @@ -212,7 +213,7 @@ extern "C" void manual_switch() { } else if(s == SUNRISE_S) { if(rt >= settings.sunrise_end) { s = MORNING_S; - printf("MORNING_S\n"); + syslog("MORNING_S\n"); } else { int steps = (settings.sunrise_end - settings.sunrise_start) * (1000 / 50); int t = (rt - settings.sunrise_start) * (1000 / 50); @@ -245,7 +246,7 @@ extern "C" void manual_switch() { } else if(s == MORNING_S) { if(rt >= settings.sunrise_shutdown) { s = DAY_S; - printf("DAY_S\n"); + syslog("DAY_S\n"); } else { for (int j = 0; j < 4; j++) for (int i = 0; i < 10; i++) { @@ -259,7 +260,7 @@ extern "C" void manual_switch() { } else if(s == DAY_S) { if(rt >= settings.sunset_time) { s = NIGHT_S; - printf("NIGHT_S\n"); + syslog("NIGHT_S\n"); } else { for (int j = 0; j < 4; j++) for (int i = 0; i < 10; i++) { @@ -274,7 +275,7 @@ extern "C" void manual_switch() { } else if(s == NIGHT_S) { if(rt >= settings.sunrise_start && rt < settings.sunset_time) { s = SUNRISE_S; - printf("SUNRISE_S\n"); + syslog("SUNRISE_S\n"); } } From b10103377d1d1c11accc9e1fefe590810143252e Mon Sep 17 00:00:00 2001 From: jedi Date: Mon, 4 Jul 2022 21:05:22 +0200 Subject: [PATCH 17/18] update ignore files --- modules/rtos | 2 +- pcb/.gitignore | 4 +++- webapp/.gitignore | 3 +++ 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 webapp/.gitignore diff --git a/modules/rtos b/modules/rtos index a821731..b56c7c8 160000 --- a/modules/rtos +++ b/modules/rtos @@ -1 +1 @@ -Subproject commit a8217311e0d8547127b69b7c4ead62ed3aa87b79 +Subproject commit b56c7c8f8f1eb7e233af11357b1cf5d7bc873f2e diff --git a/pcb/.gitignore b/pcb/.gitignore index 5d83bb6..5efb808 100644 --- a/pcb/.gitignore +++ b/pcb/.gitignore @@ -31,6 +31,8 @@ fp-info-cache *.wrl *.step -*-bak +*-backups/ gen/ pcb.zip + +report.txt \ No newline at end of file diff --git a/webapp/.gitignore b/webapp/.gitignore new file mode 100644 index 0000000..dd60b59 --- /dev/null +++ b/webapp/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +src/gen/ +package-lock.json \ No newline at end of file From 8209a9a936a9cf655dbd9f99106cacfc6a2773e0 Mon Sep 17 00:00:00 2001 From: jedi Date: Sun, 12 Feb 2023 08:54:29 +0100 Subject: [PATCH 18/18] minify web content --- .build.yml | 8 ++++-- Makefile | 6 +++- firmware/Makefile | 6 ++-- firmware/mkwebfs.py | 68 ++++++++++++++++++++++++++++----------------- modules/rtos | 2 +- 5 files changed, 57 insertions(+), 33 deletions(-) diff --git a/.build.yml b/.build.yml index af5617d..7ece57b 100644 --- a/.build.yml +++ b/.build.yml @@ -9,17 +9,19 @@ steps: - name: submodules image: alpine/git commands: - - git submodule update --init --recursive + - git submodule update --init --recursive --depth 1 - name: firmware image: docker-repo.service.intern.lab.or.it:5000/fiatlux-build-env depends_on: [ submodules ] commands: - export PATH=$(pwd)/modules/sdk/xtensa-lx106-elf/bin:$PATH + - apt update + - apt install -y minify - make firmware -j$(nproc) - name: pcb - image: setsoft/kicad_auto + image: setsoft/kicad_auto:ki6 commands: - apt update - apt install -y make zip @@ -62,6 +64,6 @@ steps: checksum: - sha512 - md5 - title: buildtest + title: fiatlux when: event: tag diff --git a/Makefile b/Makefile index 0518768..c8f31c2 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,3 @@ - .PHONY: firmware flash firmware_docker case pcb all: firmware case pcb @@ -19,6 +18,11 @@ clean: +@make -C firmware clean +@make -C pcb clean +flash_docker: + sh -c "docker build -t fiatlux_firmware_env docker/firmware" + sh -c "docker run --volume "$$(pwd)"/firmware:/app/firmware --device=/dev/ttyUSB0 fiatlux_firmware_env make -C firmware flash" + + firmware_docker: sh -c "docker build -t fiatlux_firmware_env docker/firmware" sh -c "docker run --volume "$$(pwd)"/firmware:/app/firmware fiatlux_firmware_env make -C firmware html all" diff --git a/firmware/Makefile b/firmware/Makefile index 0842356..976b533 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -2,11 +2,11 @@ PROGRAM=fiatlux EXTRA_CFLAGS=-O3 -Ibuild/gen -DLWIP_NETIF_HOSTNAME=1 -EXTRA_COMPONENTS=extras/i2s_dma extras/ws2812_i2s extras/dhcpserver extras/rboot-ota extras/mbedtls extras/httpd extras/sntp extras/cpp_support +EXTRA_COMPONENTS=extras/i2s_dma extras/ws2812_i2s extras/dhcpserver extras/rboot-ota extras/mbedtls extras/httpd extras/sntp extras/cpp_support extras/paho_mqtt_c LIBS = hal m -FLASH_MODE = dio +FLASH_MODE = qio include ../modules/rtos/common.mk @@ -15,7 +15,7 @@ html: build/gen/fsdata.c build/gen/fsdata.c: webdir/index.html webdir/404.html webdir/css/picnic.min.css webdir/css/style.css webdir/js/smoothie_min.js @echo "Generating fsdata.." @mkdir -p $(dir $@) - @./mkwebfs.py --gzip -o $@ $^ + @./mkwebfs.py --gzip --minify -o $@ $^ test: unittest systest diff --git a/firmware/mkwebfs.py b/firmware/mkwebfs.py index 667af23..e48548c 100755 --- a/firmware/mkwebfs.py +++ b/firmware/mkwebfs.py @@ -2,6 +2,7 @@ import os import gzip import argparse +import subprocess parser = argparse.ArgumentParser() parser.add_argument('-o', '--output', help='Output file name', default='stdout') @@ -9,6 +10,9 @@ parser.add_argument('-W', '--webroot', help='Output file name', default='webdir/ parser.add_argument('--gzip', dest='gzip', action='store_true') parser.add_argument('--no-gzip', dest='gzip', action='store_false') parser.set_defaults(gzip=False) +parser.add_argument('--minify', dest='minify', action='store_true') +parser.add_argument('--no-minify', dest='minify', action='store_false') +parser.set_defaults(minify=False) parser.add_argument('--header', dest='header', action='store_true') parser.add_argument('--no-header', dest='header', action='store_false') parser.set_defaults(header=True) @@ -16,6 +20,31 @@ parser.add_argument('input', nargs='+', default=os.getcwd()) args = parser.parse_args() +def mimeFromName(name): + if name.endswith(".html") or name.endswith(".htm") or name.endswith(".shtml") or name.endswith( + ".shtm") or name.endswith(".ssi"): + return "text/html" + if name.endswith(".js"): + return "application/x-javascript" + if name.endswith(".css"): + return "text/css" + if name.endswith(".ico"): + return "image/x-icon" + if name.endswith(".gif"): + return "image/gif" + if name.endswith(".png"): + return "image/png" + if name.endswith(".jpg"): + return "image/jpeg" + if name.endswith(".bmp"): + return "image/bmp" + if name.endswith(".class"): + return "application/octet-stream" + if name.endswith(".ram"): + return "audio/x-pn-realaudio" + return "text/plain" + + def dumpBin2CHex(f, b): oStr = "\t" n = 0 @@ -41,40 +70,28 @@ for file in httpFiles: webPath = ("/" + file.removeprefix(args.webroot)).replace("//", "/") print("{} > {}".format(file, webPath)) + mimeType = mimeFromName(file) + if args.header: if ("404" in file): response = b'HTTP/1.0 404 File not found\r\n' else: response = b'HTTP/1.0 200 OK\r\n' response += b"lwIP/1.4.1 (http://savannah.nongnu.org/projects/lwip)\r\n" - fext = file.split('.')[-1] - ctype = b'Content-type: text/plain\r\n' - if (fext.endswith("html") or fext.endswith("htm") or fext.endswith("shtml") or fext.endswith( - "shtm") or fext.endswith("ssi")): - ctype = b'Content-type: text/html\r\n' - if (fext.endswith("js")): - ctype = b'Content-type: application/x-javascript\r\n' - if (fext.endswith("css")): - ctype = b'Content-type: text/css\r\n' - if (fext.endswith("ico")): - ctype = b'Content-type: image/x-icon\r\n' - if (fext.endswith("gif")): - ctype = b'Content-type: image/gif\r\n' - if (fext.endswith("png")): - ctype = b'Content-type: image/png\r\n' - if(fext.endswith("jpg")): - ctype = b'Content-type: image/jpeg\r\n' - if(fext.endswith("bmp")): - ctype = b'Content-type: image/bmp\r\n' - if(fext.endswith("class")): - ctype = b'Content-type: application/octet-stream\r\n' - if(fext.endswith("ram")): - ctype = b'Content-type: audio/x-pn-realaudio\r\n' - response += ctype + response += b'Content-type: ' + mimeType.encode() + b'\r\n' binFile = open(file, 'rb') binData = binFile.read() compEff = False + if args.minify: + p = subprocess.Popen(["minify", "--html-keep-document-tags", "--mime", mimeType], stdin=subprocess.PIPE, + stdout=subprocess.PIPE) + minData = p.communicate(binData)[0] + if len(minData) < len(binData): + print("- Minify: {} -> {}".format(len(binData), len(minData))) + compEff = True + binData = minData + if args.gzip: compData = gzip.compress(binData, 9) if len(compData) < len(binData): @@ -103,7 +120,8 @@ for file in httpFiles: f_fsdata_c.write("};\n\n") f_fsdata_c.write("const struct fsdata_file {}[] = {{{{\n {},\n {}, {} + {}, sizeof({}) - {}, 1 }}}};\n\n" - .format(escFileFile, lastFileStruct, escFileData, escFileData, len(fnameBin), escFileData, len(fnameBin))) + .format(escFileFile, lastFileStruct, escFileData, escFileData, len(fnameBin), escFileData, + len(fnameBin))) # TODO: The last value is 1 if args.header == True lastFileStruct = escFileFile diff --git a/modules/rtos b/modules/rtos index b56c7c8..7faa16b 160000 --- a/modules/rtos +++ b/modules/rtos @@ -1 +1 @@ -Subproject commit b56c7c8f8f1eb7e233af11357b1cf5d7bc873f2e +Subproject commit 7faa16b07ce0d606f9525a316990da5b58e61314