From e6afaf6451a02c96850649bc179983b9193b08ac Mon Sep 17 00:00:00 2001 From: jedi Date: Tue, 6 Jul 2021 22:49:45 +0200 Subject: [PATCH 1/4] stash --- firmware/mqtt.cpp | 155 ++++++++++++++++++++++++++++++++++++++++++++++ firmware/mqtt.h | 3 + 2 files changed, 158 insertions(+) diff --git a/firmware/mqtt.cpp b/firmware/mqtt.cpp index 9622645..5cbeaac 100644 --- a/firmware/mqtt.cpp +++ b/firmware/mqtt.cpp @@ -3,3 +3,158 @@ // #include "mqtt.h" + +#include +#include + +#include +#include + +extern "C" { + +#include +#include + +} + +#include + + +/* You can use http://test.mosquitto.org/ to test mqtt_client instead + * of setting up your own MQTT server */ +#define MQTT_HOST ("172.16.1.53") +#define MQTT_PORT 1883 + +#define MQTT_USER NULL +#define MQTT_PASS NULL + +QueueHandle_t publish_queue; +#define PUB_MSG_LEN 16 + +extern "C" void beat_task(void *pvParameters) { + TickType_t xLastWakeTime = xTaskGetTickCount(); + char msg[PUB_MSG_LEN]; + int count = 0; + + while (1) { + vTaskDelayUntil(&xLastWakeTime, 10000 / portTICK_PERIOD_MS); + printf("beat\r\n"); + snprintf(msg, PUB_MSG_LEN, "Beat %d\r\n", count++); + if(xQueueSend(publish_queue, (void *) msg, 0) == pdFALSE) { + printf("Publish queue overflow.\r\n"); + } + } +} + +static void topic_received(mqtt_message_data_t *md) { + int i; + mqtt_message_t *message = md->message; + printf("Received: "); + for (i = 0; i < md->topic->lenstring.len; ++i) + printf("%c", md->topic->lenstring.data[i]); + + printf(" = "); + for (i = 0; i < (int) message->payloadlen; ++i) + printf("%c", ((char *) (message->payload))[i]); + + printf("\r\n"); +} + +static const char *get_my_id(void) { + // Use MAC address for Station as unique ID + static char my_id[13]; + static bool my_id_done = false; + int8_t i; + uint8_t x; + if(my_id_done) + return my_id; + if(!sdk_wifi_get_macaddr(STATION_IF, (uint8_t *) my_id)) + return NULL; + for (i = 5; i >= 0; --i) { + x = my_id[i] & 0x0F; + if(x > 9) x += 7; + my_id[i * 2 + 1] = x + '0'; + x = my_id[i] >> 4; + if(x > 9) x += 7; + my_id[i * 2] = x + '0'; + } + my_id[12] = '\0'; + my_id_done = true; + return my_id; +} + +extern "C" void mqtt_task(void *pvParameters) { + int ret = 0; + struct mqtt_network network; + mqtt_client_t client = mqtt_client_default; + char mqtt_client_id[20]; + uint8_t mqtt_buf[100]; + uint8_t mqtt_readbuf[100]; + mqtt_packet_connect_data_t data = mqtt_packet_connect_data_initializer; + + mqtt_network_new(&network); + memset(mqtt_client_id, 0, sizeof(mqtt_client_id)); + strcpy(mqtt_client_id, "ESP-"); + strcat(mqtt_client_id, get_my_id()); + + while (1) { + printf("%s: started\n\r", __func__); + printf("%s: (Re)connecting to MQTT server %s ... ", __func__, + MQTT_HOST); + ret = mqtt_network_connect(&network, MQTT_HOST, MQTT_PORT); + if(ret) { + printf("error: %d\n\r", ret); + taskYIELD(); + continue; + } + printf("done\n\r"); + mqtt_client_new(&client, &network, 5000, mqtt_buf, 100, + mqtt_readbuf, 100); + + data.willFlag = 0; + data.MQTTVersion = 3; + data.clientID.cstring = mqtt_client_id; + data.username.cstring = MQTT_USER; + data.password.cstring = MQTT_PASS; + data.keepAliveInterval = 10; + data.cleansession = 0; + printf("Send MQTT connect ... "); + ret = mqtt_connect(&client, &data); + if(ret) { + printf("error: %d\n\r", ret); + mqtt_network_disconnect(&network); + taskYIELD(); + continue; + } + printf("done\r\n"); + mqtt_subscribe(&client, "/esptopic", MQTT_QOS1, topic_received); + xQueueReset(publish_queue); + + while (1) { + + char msg[PUB_MSG_LEN - 1] = "\0"; + while (xQueueReceive(publish_queue, (void *) msg, 0) == + pdTRUE) { + printf("got message to publish\r\n"); + mqtt_message_t message; + message.payload = msg; + message.payloadlen = PUB_MSG_LEN; + message.dup = 0; + message.qos = MQTT_QOS1; + message.retained = 0; + ret = mqtt_publish(&client, "/beat", &message); + if(ret != MQTT_SUCCESS) { + printf("error while publishing message: %d\n", ret); + break; + } + } + + ret = mqtt_yield(&client, 1000); + if(ret == MQTT_DISCONNECTED) + break; + } + printf("Connection dropped, request restart\n\r"); + mqtt_network_disconnect(&network); + taskYIELD(); + } +} \ No newline at end of file diff --git a/firmware/mqtt.h b/firmware/mqtt.h index a5e03b6..b8d8a8e 100644 --- a/firmware/mqtt.h +++ b/firmware/mqtt.h @@ -9,6 +9,9 @@ extern "C" { #endif +void mqtt_task(void *pvParameters); +void beat_task(void *pvParameters); + #ifdef __cplusplus } #endif From 46214c86ffc8674f42fab7c986a937146988b232 Mon Sep 17 00:00:00 2001 From: Eleon Date: Sun, 12 Sep 2021 21:42:55 +0200 Subject: [PATCH 2/4] mqtt verbindet --- firmware/Makefile | 5 +++-- firmware/fiatlux.c | 3 +++ firmware/mqtt.cpp | 4 ++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/firmware/Makefile b/firmware/Makefile index bc8dc8b..baf16b5 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -2,7 +2,8 @@ PROGRAM=fiatlux EXTRA_CFLAGS=-O3 -Ifsdata -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 @@ -24,4 +25,4 @@ unittest: systest: true -.NOTPARALLEL: html all \ No newline at end of file +.NOTPARALLEL: html all diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 9e3efeb..04e0ab1 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -13,6 +13,7 @@ void user_init(void) { + uart_set_baud(0, 115200); printf("SDK version: %s\n", sdk_system_get_sdk_version()); @@ -22,6 +23,8 @@ void user_init(void) wifi_available_semaphore = xSemaphoreCreateBinary(); + xTaskCreate(mqtt_task, "mqtt_task", 1024, NULL, 1, NULL); + xTaskCreate(wifi_task, "wifi_task", 1024, NULL, 1, NULL); xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL); diff --git a/firmware/mqtt.cpp b/firmware/mqtt.cpp index 5cbeaac..3dedc99 100644 --- a/firmware/mqtt.cpp +++ b/firmware/mqtt.cpp @@ -22,7 +22,7 @@ extern "C" { /* You can use http://test.mosquitto.org/ to test mqtt_client instead * of setting up your own MQTT server */ -#define MQTT_HOST ("172.16.1.53") +#define MQTT_HOST ("172.16.0.42") #define MQTT_PORT 1883 #define MQTT_USER NULL @@ -157,4 +157,4 @@ extern "C" void mqtt_task(void *pvParameters) { mqtt_network_disconnect(&network); taskYIELD(); } -} \ No newline at end of file +} From 010279c1919c0f64c3dc0278ece1be3ca5b8322f Mon Sep 17 00:00:00 2001 From: jedi Date: Sun, 12 Sep 2021 23:01:00 +0200 Subject: [PATCH 3/4] Added wifi settings --- firmware/fsdata/fs/index.html | 143 ++++++++++++++++++++++++++++++++++ firmware/web.cpp | 56 +++++++++++++ firmware/wifi.cpp | 8 +- 3 files changed, 203 insertions(+), 4 deletions(-) diff --git a/firmware/fsdata/fs/index.html b/firmware/fsdata/fs/index.html index 8ceefa7..8735ade 100644 --- a/firmware/fsdata/fs/index.html +++ b/firmware/fsdata/fs/index.html @@ -16,6 +16,7 @@ @@ -58,6 +59,87 @@ +
+

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

@@ -190,6 +272,18 @@ return pos; }; + DataView.prototype.setInt8Vec = function (pos, vec) { + for (var i = 0; i < vec.length; i++) { + this.setInt8(pos++, vec[i]); + } + return pos; + }; + + function colorStringToVec(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? [parseInt(result[1], 16), parseInt(result[2], 16), parseInt(result[3], 16)] : null; + } + var ws; var retries; var series = new TimeSeries(); @@ -394,6 +488,55 @@ }) } } + + 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 + 8); + 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); + tx_len = view1.setInt8Vec(tx_len, [192, 168, 111, 1]); + tx_len = view1.setInt8Vec(tx_len, [255, 255, 255, 0]); + wsWrite(buffer); + } + + function update_progress(progressBar, progress) { + var iP = Math.floor(progress); + var dBar = document.getElementById("progress_bar_" + progressBar); + dBar.innerText = iP + "%"; + dBar.style.width = progress + "%"; + } diff --git a/firmware/web.cpp b/firmware/web.cpp index 6176a43..dc43e08 100644 --- a/firmware/web.cpp +++ b/firmware/web.cpp @@ -184,6 +184,18 @@ void websocket_task(void *pvParameter) { } + vTaskDelayMs(250); + { + uint8_t response[3]; + uint16_t val; + val = sdk_system_adc_read(); + response[2] = (uint8_t) val; + response[1] = val >> 8; + response[0] = 'V'; + LOCK_TCPIP_CORE(); + websocket_write(pcb, response, 3, WS_BIN_MODE); + UNLOCK_TCPIP_CORE(); + } vTaskDelayMs(500); } @@ -221,7 +233,18 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, bool togl = 0; + int8_t en = 0; + /*uint8_t ap_disable_if_sta = 0; + uint8_t ssid_hidden = 0; + uint8_t dns_enable = 0; + uint8_t mdns_enable = 0;*/ + switch (data[0]) { + case 'V': // ADC + /* This should be done on a separate thread in 'real' applications */ + val = sdk_system_adc_read(); + cmd = 'V'; + break; case 'R': // Restart cmd = 'R'; break; @@ -258,6 +281,39 @@ 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); + + //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]); diff --git a/firmware/wifi.cpp b/firmware/wifi.cpp index 65b114b..a958a95 100644 --- a/firmware/wifi.cpp +++ b/firmware/wifi.cpp @@ -210,7 +210,7 @@ extern "C" void wifi_task(void *pvParameters) { if(wifi_sta_enable) { printf("try STA Mode: %s %s\n", wifi_sta_ssid, wifi_sta_password); - sdk_station_config config; + sdk_station_config config{}; strcpy((char *) config.ssid, wifi_sta_ssid); strcpy((char *) config.password, wifi_sta_password); config.bssid_set = 0; @@ -230,7 +230,7 @@ extern "C" void wifi_task(void *pvParameters) { wifi_sta_netmask && strlen(wifi_sta_netmask) > 4 && wifi_sta_gateway && strlen(wifi_sta_gateway) > 4) { sdk_wifi_station_dhcpc_stop(); - ip_info info; + ip_info info{}; memset(&info, 0x0, sizeof(info)); info.ip.addr = ipaddr_addr(wifi_sta_ip_addr); info.netmask.addr = ipaddr_addr(wifi_sta_netmask); @@ -305,13 +305,13 @@ extern "C" void wifi_task(void *pvParameters) { } if(strlen(wifi_ap_ip_addr) >= 7 && strlen(wifi_ap_netmask) >= 7) { - ip_info ap_ip; + ip_info ap_ip{}; ap_ip.ip.addr = ipaddr_addr(wifi_ap_ip_addr); ap_ip.netmask.addr = ipaddr_addr(wifi_ap_netmask); IP4_ADDR(&ap_ip.gw, 0, 0, 0, 0); sdk_wifi_set_ip_info(1, &ap_ip); - sdk_softap_config ap_config; + sdk_softap_config ap_config{}; strcpy((char *) ap_config.ssid, wifi_ap_ssid); ap_config.ssid_len = strlen(wifi_ap_ssid); strcpy((char *) ap_config.password, wifi_ap_password); From 224fc57582268e91b488ec69ebd5219af648421e Mon Sep 17 00:00:00 2001 From: Eleon Date: Sun, 3 Oct 2021 02:02:26 +0200 Subject: [PATCH 4/4] Adding flash_docker function --- Makefile | 5 +++++ docker/firmware/Dockerfile | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index 8fafbe1..e298e7a 100644 --- a/Makefile +++ b/Makefile @@ -19,6 +19,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 all" diff --git a/docker/firmware/Dockerfile b/docker/firmware/Dockerfile index 582fe2f..825fa4f 100644 --- a/docker/firmware/Dockerfile +++ b/docker/firmware/Dockerfile @@ -8,6 +8,6 @@ RUN cd app/modules/sdk; export CT_EXPERIMENTAL=y; export CT_ALLOW_BUILD_AS_ROOT= USER 0 RUN apt remove --purge -y python2 && apt autoremove --purge -y && apt install -y python3 python3-serial perl RUN apt install -y --reinstall python-is-python3 -USER 1000 +USER 0 WORKDIR /app -ENV PATH=/app/modules/sdk/xtensa-lx106-elf/bin:$PATH \ No newline at end of file +ENV PATH=/app/modules/sdk/xtensa-lx106-elf/bin:$PATH