diff --git a/.build.yml b/.build.yml index af5617d..4ccdf4a 100644 --- a/.build.yml +++ b/.build.yml @@ -23,6 +23,13 @@ steps: commands: - apt update - apt install -y make zip + - cd pcb + - kibot -d gen -c fiatlux.kiplot.yaml -s update_xml,run_drc -i + - kibot -d gen -c fiatlux.kiplot.yaml -s update_xml,run_erc -i + - kibot -d gen -c fiatlux.kiplot.yaml -s run_drc,run_erc print_sch + - kibot -d gen -c fiatlux.kiplot.yaml -s all print_front gerbers + - ls -lA + - cd - - make pcb -j$(nproc) - name: case @@ -57,8 +64,6 @@ steps: base_url: https://git.neulandlabor.de/ files: - firmware/firmware/fiatlux.bin - - firmware/otaflash.py - - pcb/pcb.zip checksum: - sha512 - md5 diff --git a/.gitmodules b/.gitmodules index 11a7502..f1998a7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,6 +4,3 @@ [submodule "modules/sdk"] path = modules/sdk url = https://github.com/pfalcon/esp-open-sdk.git -[submodule "modules/nix"] - path = modules/nix - url = https://github.com/busti/nixpkgs-esp-dev diff --git a/Makefile b/Makefile index 8fafbe1..210ca98 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,17 @@ all: firmware case pcb firmware: +@make -C firmware html all +clean: + +@make -C firmware clean + +firmware_docker: + sh -c "docker build -t fiatlux_env docker" + sh -c "docker run --volume "$$(pwd)"/firmware:/app/firmware fiatlux_env make -C firmware html all" + +clean_docker: + sh -c "docker build -t fiatlux_env docker" + sh -c "docker run --volume "$$(pwd)"/firmware:/app/firmware fiatlux_env make -C firmware clean" + flash: +@make -C firmware flash @@ -14,22 +25,3 @@ case: pcb: +@make -C pcb all - -clean: - +@make -C firmware clean - +@make -C pcb clean - -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" - -pcb_docker: - sh -c "docker build -t fiatlux_pcb_env docker/pcb" - sh -c "docker run --volume "$$(pwd)"/pcb:/app/pcb fiatlux_pcb_env make -C pcb all" - -clean_docker: - sh -c "docker build -t fiatlux_firmware_env docker/firmware" - sh -c "docker build -t fiatlux_pcb_env docker/pcb" - sh -c "docker run --volume "$$(pwd)"/firmware:/app/firmware fiatlux_firmware_env make -C firmware clean" - sh -c "docker run --volume "$$(pwd)"/pcb:/app/pcb fiatlux_pcb_env make -C pcb clean" - diff --git a/README.md b/README.md index 6ff897e..def2d29 100644 --- a/README.md +++ b/README.md @@ -27,7 +27,6 @@ git submodule update --init --recursive - ncurses-dev libexpat-dev - python3 python3-serial python-dev - - pip install websocket-client (for otaflash.py, optional) ### Build Steps @@ -60,12 +59,3 @@ install `docker` on your platform and buil with ```bash make firmware_docker -j$(nproc) -``` - -### Build Steps (using nixos) - -In the project root run: -``` -nix-shell --option sandbox false -make firmware -j$(nproc) -``` diff --git a/docker/firmware/Dockerfile b/docker/Dockerfile similarity index 100% rename from docker/firmware/Dockerfile rename to docker/Dockerfile diff --git a/docker/pcb/Dockerfile b/docker/pcb/Dockerfile deleted file mode 100644 index 24535d5..0000000 --- a/docker/pcb/Dockerfile +++ /dev/null @@ -1,7 +0,0 @@ -# syntax=docker/dockerfile:1 -FROM setsoft/kicad_auto -RUN apt update && apt install -y make zip; mkdir /app; chown 1000:1000 /app; cd /app; useradd user -RUN mkdir -p /home/user; cp -r /root/.config /home/user/.config; chown 1000:1000 -R /home/user -RUN ls -la /home/user/.config -USER 1000 -WORKDIR /app \ No newline at end of file diff --git a/firmware/.gitignore b/firmware/.gitignore index c67e8c9..a9bcf3d 100644 --- a/firmware/.gitignore +++ b/firmware/.gitignore @@ -142,5 +142,5 @@ dkms.conf *.remove firmware/ +compile_commands.json fsdata/fsdata.c -compile_commands.json \ No newline at end of file diff --git a/firmware/.idea/.gitignore b/firmware/.idea/.gitignore deleted file mode 100644 index 8bf4d45..0000000 --- a/firmware/.idea/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml diff --git a/firmware/.idea/firmware.iml b/firmware/.idea/firmware.iml deleted file mode 100644 index 91a038c..0000000 --- a/firmware/.idea/firmware.iml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/firmware/.idea/misc.xml b/firmware/.idea/misc.xml deleted file mode 100644 index 8067168..0000000 --- a/firmware/.idea/misc.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/firmware/.idea/vcs.xml b/firmware/.idea/vcs.xml deleted file mode 100644 index 6c0b863..0000000 --- a/firmware/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/firmware/.idea/watcherTasks.xml b/firmware/.idea/watcherTasks.xml deleted file mode 100644 index 10c4c1c..0000000 --- a/firmware/.idea/watcherTasks.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/firmware/Makefile b/firmware/Makefile index bc8dc8b..1ab52ac 100644 --- a/firmware/Makefile +++ b/firmware/Makefile @@ -1,8 +1,11 @@ PROGRAM=fiatlux -EXTRA_CFLAGS=-O3 -Ifsdata +EXTRA_CFLAGS=-O3 -EXTRA_COMPONENTS=extras/i2s_dma extras/ws2812_i2s extras/dhcpserver extras/rboot-ota extras/mbedtls extras/httpd extras/sntp extras/cpp_support +#Enable debugging +#EXTRA_CFLAGS+=-DLWIP_DEBUG=1 -DHTTPD_DEBUG=LWIP_DBG_ON + +EXTRA_COMPONENTS=extras/paho_mqtt_c extras/i2s_dma extras/ws2812_i2s extras/dhcpserver extras/mbedtls extras/httpd extras/sntp extras/cpp_support LIBS = hal m @@ -10,9 +13,7 @@ FLASH_MODE = dio include ../modules/rtos/common.mk -html: fsdata/fsdata.c - -fsdata/fsdata.c: fsdata/fs/index.html fsdata/fs/404.html fsdata/fs/css/picnic.min.css fsdata/fs/css/style.css fsdata/fs/js/smoothie_min.js +html: @echo "Generating fsdata.." cd fsdata && ./makefsdata @@ -24,4 +25,4 @@ unittest: systest: true -.NOTPARALLEL: html all \ No newline at end of file +.NOTPARALLEL: html all diff --git a/firmware/crc32.c b/firmware/crc32.c deleted file mode 100644 index 8107dfa..0000000 --- a/firmware/crc32.c +++ /dev/null @@ -1,71 +0,0 @@ -// -// Created by jedi on 02.08.21. -// - -#include "crc32.h" - -#define UPDC32(octet, crc) (crc_32_tab[((crc)\ -^ ((uint8_t)octet)) & 0xff] ^ ((crc) >> 8)) - -static uint32_t crc_32_tab[] = { /* CRC polynomial 0xedb88320 */ - 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f, - 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988, - 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2, - 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, - 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9, - 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172, - 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c, - 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59, - 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, - 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924, - 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106, - 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433, - 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, - 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, - 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950, - 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65, - 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7, - 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0, - 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, - 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f, - 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81, - 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a, - 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84, - 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, - 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb, - 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc, - 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e, - 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b, - 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, - 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236, - 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28, - 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d, - 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f, - 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, - 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242, - 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777, - 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69, - 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2, - 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, - 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9, - 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693, - 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94, - 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d -}; - -uint32_t updateCRC32(uint8_t ch, uint32_t crc) { - return UPDC32(ch, crc); -} - -uint32_t crc32_partial(uint32_t init, uint8_t *buf, uint32_t len) { - register uint32_t oldcrc32; - oldcrc32 = ~init; - for (; len; --len, ++buf) { - oldcrc32 = UPDC32(*buf, oldcrc32); - } - return ~oldcrc32; -} - -uint32_t crc32(uint8_t *data, uint32_t len) { - return crc32_partial(0, data, len); -} \ No newline at end of file diff --git a/firmware/crc32.h b/firmware/crc32.h deleted file mode 100644 index 16d4ca2..0000000 --- a/firmware/crc32.h +++ /dev/null @@ -1,14 +0,0 @@ -// -// Created by jedi on 02.08.21. -// - -#ifndef FIRMWARE_CRC32_H -#define FIRMWARE_CRC32_H - -#include - -uint32_t crc32_partial(uint32_t init, uint8_t *data, uint32_t len); - -uint32_t crc32(uint8_t *data, uint32_t len); - -#endif //FIRMWARE_CRC32_H diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c index 9e3efeb..cb01a51 100644 --- a/firmware/fiatlux.c +++ b/firmware/fiatlux.c @@ -1,30 +1,416 @@ +#include +#include +#include + #include "system.h" #include "wifi.h" #include "web.h" #include "mqtt.h" #include "lux.h" -#include -#include -#include +#define LED_PIN 2 +#define SWITCH_PIN 2 -#include -#include +/* Add extras/sntp component to makefile for this include to work */ +#include +#include -void user_init(void) -{ +#include "wifi.h" +#include "web.h" +#include "mqtt.h" +#include "lux.h" + + + +#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_task(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)); + } +} + +static void dns_task(void *pvParameters) { + char *wifi_ap_ip_addr = NULL; + sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); + if(!wifi_ap_ip_addr) { + printf("dns: no ip address\n"); + vTaskDelete(NULL); + } + ip4_addr_t server_addr; + server_addr.addr = ipaddr_addr(wifi_ap_ip_addr); + +#if LWIP_IPV6 + int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); + struct sockaddr_in6 serv_addr; + memset(&serv_addr, '0', sizeof(serv_addr)); + serv_addr.sin6_family = AF_INET6; + serv_addr.sin6_port = htons(53); + serv_addr.sin6_flowinfo = 0; + serv_addr.sin6_addr = in6addr_any; + serv_addr.sin6_scope_id = IP6_NO_ZONE; +#else + int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); + struct sockaddr_in serv_addr; + memset(&serv_addr, '0', sizeof(serv_addr)); + serv_addr.sin_family = AF_INET; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(53); +#endif + bind(fd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)); + + const struct ifreq ifreq0 = {"en0"}; + const struct ifreq ifreq1 = {"en1"}; + setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, + sdk_wifi_get_opmode() == STATIONAP_MODE ? &ifreq1 : &ifreq0, + sizeof(ifreq0)); + + for (;;) { + char buffer[96]; + struct sockaddr_storage src_addr; + socklen_t src_addr_len = sizeof(src_addr); + ssize_t count = recvfrom(fd, buffer, sizeof(buffer), 0, (struct sockaddr *) &src_addr, &src_addr_len); + + /* Drop messages that are too large to send a response in the buffer */ + if(count > 0 && count <= sizeof(buffer) - 16) { + size_t qname_len = strlen(buffer + 12) + 1; + uint32_t reply_len = 2 + 10 + qname_len + 16 + 4; + + char *head = buffer + 2; + *head++ = 0x80; // Flags + *head++ = 0x00; + *head++ = 0x00; // Q count + *head++ = 0x01; + *head++ = 0x00; // A count + *head++ = 0x01; + *head++ = 0x00; // Auth count + *head++ = 0x00; + *head++ = 0x00; // Add count + *head++ = 0x00; + head += qname_len; + *head++ = 0x00; // Q type + *head++ = 0x01; + *head++ = 0x00; // Q class + *head++ = 0x01; + *head++ = 0xC0; // LBL offs + *head++ = 0x0C; + *head++ = 0x00; // Type + *head++ = 0x01; + *head++ = 0x00; // Class + *head++ = 0x01; + *head++ = 0x00; // TTL + *head++ = 0x00; + *head++ = 0x00; + *head++ = 0x78; + *head++ = 0x00; // RD len + *head++ = 0x04; + *head++ = ip4_addr1(&server_addr); + *head++ = ip4_addr2(&server_addr); + *head++ = ip4_addr3(&server_addr); + *head++ = ip4_addr4(&server_addr); + + sendto(fd, buffer, reply_len, 0, (struct sockaddr *) &src_addr, src_addr_len); + } + } +} + + +const char *wificfg_default_ssid = "fiatlux_%02X%02X%02X"; +const char *wificfg_default_password = "fiatlux02"; +const char *wificfg_default_hostname = "fiatlux-%02x%02x%02x"; + +void user_init(void) { uart_set_baud(0, 115200); printf("SDK version: %s\n", sdk_system_get_sdk_version()); sdk_wifi_set_sleep_type(WIFI_SLEEP_MODEM); system_init_config(); + char *wifi_sta_ssid = NULL; + char *wifi_sta_password = NULL; + char *wifi_ap_ssid = NULL; + char *wifi_ap_password = NULL; - wifi_available_semaphore = xSemaphoreCreateBinary(); + /* Default a hostname. */ + char *hostname = NULL; + sysparam_get_string("hostname", &hostname); + if(!hostname && wificfg_default_hostname) { + uint8_t macaddr[6]; + char name[32]; + sdk_wifi_get_macaddr(1, macaddr); + snprintf(name, sizeof(name), wificfg_default_hostname, macaddr[3], + macaddr[4], macaddr[5]); + sysparam_set_string("hostname", name); + } + if(hostname) { + free(hostname); + } - xTaskCreate(wifi_task, "wifi_task", 1024, NULL, 1, NULL); + sysparam_get_string("wifi_ap_ssid", &wifi_ap_ssid); + sysparam_get_string("wifi_ap_password", &wifi_ap_password); + sysparam_get_string("wifi_sta_ssid", &wifi_sta_ssid); + sysparam_get_string("wifi_sta_password", &wifi_sta_password); - xTaskCreate(&httpd_task, "httpd_task", 1024, NULL, 2, NULL); + int8_t wifi_sta_enable = 1; + int8_t wifi_ap_enable = 1; + sysparam_get_int8("wifi_sta_enable", &wifi_sta_enable); + sysparam_get_int8("wifi_ap_enable", &wifi_ap_enable); - xTaskCreate(&lux_task, "lux_task", 512, NULL, 1, NULL); + if(!wifi_sta_enable) + wifi_ap_enable = 1; + + int8_t wifi_sta_disabled_restarts = 0; + sysparam_get_int8("wifi_sta_disabled_restarts", &wifi_sta_disabled_restarts); + if(wifi_sta_disabled_restarts > 0) { + wifi_sta_enable = 0; + wifi_sta_disabled_restarts--; + sysparam_set_int8("wifi_sta_disabled_restarts", wifi_sta_disabled_restarts); + } + + int8_t wifi_ap_disabled_restarts = 0; + sysparam_get_int8("wifi_ap_disabled_restarts", &wifi_ap_disabled_restarts); + if(wifi_ap_disabled_restarts > 0) { + wifi_ap_enable = 0; + wifi_ap_disabled_restarts--; + sysparam_set_int8("wifi_ap_disabled_restarts", wifi_ap_disabled_restarts); + } + + /* Validate the configuration. */ + + if(wifi_sta_enable && (!wifi_sta_ssid || !wifi_sta_password || + strlen(wifi_sta_ssid) < 1 || + strlen(wifi_sta_ssid) > 32 || + !wifi_sta_password || + strlen(wifi_sta_password) < 8 || + strlen(wifi_sta_password) >= 64)) { + wifi_sta_enable = 0; + } + + if(wifi_ap_enable) { + /* Default AP ssid and password. */ + if(!wifi_ap_ssid && wificfg_default_ssid) { + uint8_t macaddr[6]; + char ssid[32]; + sdk_wifi_get_macaddr(1, macaddr); + snprintf(ssid, sizeof(ssid), wificfg_default_ssid, macaddr[3], + macaddr[4], macaddr[5]); + sysparam_set_string("wifi_ap_ssid", ssid); + sysparam_get_string("wifi_ap_ssid", &wifi_ap_ssid); + + if(!wifi_ap_password && wificfg_default_password) { + sysparam_set_string("wifi_ap_password", wificfg_default_password); + sysparam_get_string("wifi_ap_password", &wifi_ap_password); + } + } + printf("ssid: %s\n", wifi_ap_ssid); + + /* If the ssid and password are not valid then disable the AP interface. */ + if(!wifi_ap_ssid || strlen(wifi_ap_ssid) < 1 || strlen(wifi_ap_ssid) >= 32 || + !wifi_ap_password || strlen(wifi_ap_password) < 8 || strlen(wifi_ap_password) >= 64) { + printf("len err\n"); + wifi_ap_enable = 0; + } + } + + int8_t wifi_mode = NULL_MODE; + if(wifi_sta_enable && wifi_ap_enable) + wifi_mode = STATIONAP_MODE; + else if(wifi_sta_enable) + wifi_mode = STATION_MODE; + else if(wifi_ap_enable) + wifi_mode = SOFTAP_MODE; + sdk_wifi_set_opmode(wifi_mode); + + if(wifi_sta_enable) { + printf("try STA Mode: %s %s\n", wifi_sta_ssid, wifi_sta_password); + struct sdk_station_config config; + strcpy((char *) config.ssid, wifi_sta_ssid); + strcpy((char *) config.password, wifi_sta_password); + config.bssid_set = 0; + + int8_t wifi_sta_dhcp = 1; + sysparam_get_int8("wifi_sta_dhcp", &wifi_sta_dhcp); + + if(!wifi_sta_dhcp) { + char *wifi_sta_ip_addr = NULL; + char *wifi_sta_netmask = NULL; + char *wifi_sta_gateway = NULL; + sysparam_get_string("wifi_sta_ip_addr", &wifi_sta_ip_addr); + sysparam_get_string("wifi_sta_netmask", &wifi_sta_netmask); + sysparam_get_string("wifi_sta_gateway", &wifi_sta_gateway); + + if(wifi_sta_ip_addr && strlen(wifi_sta_ip_addr) > 4 && + wifi_sta_netmask && strlen(wifi_sta_netmask) > 4 && + wifi_sta_gateway && strlen(wifi_sta_gateway) > 4) { + sdk_wifi_station_dhcpc_stop(); + struct 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); + info.gw.addr = ipaddr_addr(wifi_sta_gateway); + sdk_wifi_set_ip_info(STATION_IF, &info); + } + if(wifi_sta_ip_addr) free(wifi_sta_ip_addr); + if(wifi_sta_netmask) free(wifi_sta_netmask); + if(wifi_sta_gateway) free(wifi_sta_gateway); + } + + sdk_wifi_station_set_config(&config); + } + + if(wifi_ap_enable) { + printf("try AP Mode: %s %s\n", wifi_ap_ssid, wifi_ap_password); + /* Read and validate paramenters. */ + int8_t wifi_ap_ssid_hidden = 0; + sysparam_get_int8("wifi_ap_ssid_hidden", &wifi_ap_ssid_hidden); + if(wifi_ap_ssid_hidden < 0 || wifi_ap_ssid_hidden > 1) { + wifi_ap_ssid_hidden = 1; + } + + int8_t wifi_ap_channel = 6; + sysparam_get_int8("wifi_ap_channel", &wifi_ap_channel); + +#if 0 + /* AU does not allow channels above 13, although 14 works. */ + if(wifi_ap_channel > 13) { + wifi_ap_channel = 13; + } + /* US does not allow channels above 11, although they work. */ + if (wifi_ap_channel > 11) { + wifi_ap_channel = 11; + } +#endif + if(wifi_ap_channel < 1 || wifi_ap_channel > 14) { + wifi_ap_channel = 6; + } + + int8_t wifi_ap_authmode = AUTH_WPA_WPA2_PSK; + sysparam_get_int8("wifi_ap_authmode", &wifi_ap_authmode); + if(wifi_ap_authmode != AUTH_OPEN && wifi_ap_authmode != AUTH_WPA_PSK && + wifi_ap_authmode != AUTH_WPA2_PSK && wifi_ap_authmode != AUTH_WPA_WPA2_PSK) { + wifi_ap_authmode = AUTH_WPA_WPA2_PSK; + } + + int8_t wifi_ap_max_conn = 3; + sysparam_get_int8("wifi_ap_max_conn", &wifi_ap_max_conn); + if(wifi_ap_max_conn < 1 || wifi_ap_max_conn > 8) { + wifi_ap_max_conn = 3; + } + + int32_t wifi_ap_beacon_interval = 100; + sysparam_get_int32("wifi_ap_beacon_interval", &wifi_ap_beacon_interval); + if(wifi_ap_beacon_interval < 0 || wifi_ap_beacon_interval > 1000) { + wifi_ap_beacon_interval = 100; + } + + /* Default AP IP address and netmask. */ + char *wifi_ap_ip_addr = NULL; + sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); + if(!wifi_ap_ip_addr) { + sysparam_set_string("wifi_ap_ip_addr", "172.16.0.1"); + sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); + } + char *wifi_ap_netmask = NULL; + sysparam_get_string("wifi_ap_netmask", &wifi_ap_netmask); + if(!wifi_ap_netmask) { + sysparam_set_string("wifi_ap_netmask", "255.255.0.0"); + sysparam_get_string("wifi_ap_netmask", &wifi_ap_netmask); + } + + if(strlen(wifi_ap_ip_addr) >= 7 && strlen(wifi_ap_netmask) >= 7) { + struct 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); + + struct sdk_softap_config ap_config = { + .ssid_hidden = wifi_ap_ssid_hidden, + .channel = wifi_ap_channel, + .authmode = wifi_ap_authmode, + .max_connection = wifi_ap_max_conn, + .beacon_interval = wifi_ap_beacon_interval, + }; + strcpy((char *) ap_config.ssid, wifi_ap_ssid); + ap_config.ssid_len = strlen(wifi_ap_ssid); + strcpy((char *) ap_config.password, wifi_ap_password); + sdk_wifi_softap_set_config(&ap_config); + + int8_t wifi_ap_dhcp_leases = 4; + sysparam_get_int8("wifi_ap_dhcp_leases", &wifi_ap_dhcp_leases); + + if(wifi_ap_dhcp_leases) { + ip4_addr_t first_client_ip; + first_client_ip.addr = ap_ip.ip.addr + htonl(1); + + int8_t wifi_ap_dns = 1; + sysparam_get_int8("wifi_ap_dns", &wifi_ap_dns); + if(wifi_ap_dns < 0 || wifi_ap_dns > 1) + wifi_ap_dns = 1; + + dhcpserver_start(&first_client_ip, wifi_ap_dhcp_leases); + dhcpserver_set_router(&ap_ip.ip); + if(wifi_ap_dns) { + dhcpserver_set_dns(&ap_ip.ip); + xTaskCreate(dns_task, "WiFi Cfg DNS", 384, NULL, 2, NULL); + } + } + } + + free(wifi_ap_ip_addr); + free(wifi_ap_netmask); + } + + if(wifi_sta_ssid) free(wifi_sta_ssid); + if(wifi_sta_password) free(wifi_sta_password); + if(wifi_ap_ssid) free(wifi_ap_ssid); + if(wifi_ap_password) free(wifi_ap_password); + + if(wifi_mode != NULL_MODE) { + + /* turn off LED */ + //gpio_enable(LED_PIN, GPIO_OUTPUT); + //gpio_write(LED_PIN, true); + xTaskCreate(&lux_task, "lux_task", 256, NULL, 1, NULL); + + /* initialize tasks */ + xTaskCreate(&httpd_task, "httpd_task", 2048, NULL, 3, NULL); + + xTaskCreate(&sntp_task, "SNTP", 512, NULL, 1, NULL); + + // xTaskCreate(&beat_task, "beat_task", 256, NULL, 3, NULL); + xTaskCreate(&mqtt_task, "mqtt_task", 512, NULL, 4, NULL); + } +>>>>>>> 4b8d354 (basic webconf) } diff --git a/firmware/fsdata/fs/css/style.css b/firmware/fsdata/fs/css/style.css index 0e0e33a..a26dda5 100644 --- a/firmware/fsdata/fs/css/style.css +++ b/firmware/fsdata/fs/css/style.css @@ -5,17 +5,28 @@ main { margin-left: auto; margin-right: auto; } +section { + display: none; +} canvas{ width: 100%; } -main section:target ~ section, main section#io, main section#wifi, main section#ota { - display: none; +main[data-page="dashboard"] section[id="dashboard"] { + display: block; } -main section:target{ - display: block !important; +main[data-page="ota"] section[id="ota"] { + display: block; +} + +main[data-page="wifi"] section[id="wifi"] { + display: block; +} + +main[data-page="io"] section[id="io"] { + display: block; } .table { diff --git a/firmware/fsdata/fs/index.html b/firmware/fsdata/fs/index.html index 8ceefa7..5e435f7 100644 --- a/firmware/fsdata/fs/index.html +++ b/firmware/fsdata/fs/index.html @@ -9,55 +9,23 @@ -
-
-

System

-
-
-

Firmware Update

-
-
-
- -
-
- -
-
-
-
-
-

Restart

-
-
-
- -
-
-
-
-
-

Reset Config

-
-
-
- -
-
-
- -
+

Status

@@ -158,38 +126,210 @@

I/O

+
+
+ Channel 1-6 + SPI Dimmer +
+
+ Channel 7-127 + WS2812 via I2S +
+
+
+

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 +
+
+ + +
+
+
+
diff --git a/firmware/lux.cpp b/firmware/lux.cpp index 8b775c4..3a769cd 100644 --- a/firmware/lux.cpp +++ b/firmware/lux.cpp @@ -1,6 +1,8 @@ // // Created by jedi on 25.06.21. // +<<<<<<< HEAD +======= #include "lux.h" @@ -9,24 +11,93 @@ #include #include +#include -const int signal_led_pin = 2; + +const int LED_PIN = 2; +const int SWITCH_PIN = 2; const int cs0 = 15; const int gpio4 = 4; const int gpio5 = 5; -extern "C" void signal_led(bool state) { - gpio_write(signal_led_pin, !state); +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); +} + + + +/* This task uses the high level GPIO API (esp_gpio.h) to blink an LED. + * + */ extern "C" void lux_task(void *pvParameters) { - gpio_enable(signal_led_pin, GPIO_OUTPUT); + 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(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(1000 / portTICK_PERIOD_MS); + } + for (int i = 0; i < 8; i++) + spi_dac(i, 0); - vTaskDelete(nullptr); -} \ No newline at end of file + 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); + } + + } +} +>>>>>>> 8d3006e (keep refactoring) diff --git a/firmware/lux.h b/firmware/lux.h index caf4a88..ff4d45d 100644 --- a/firmware/lux.h +++ b/firmware/lux.h @@ -5,14 +5,22 @@ #ifndef FIRMWARE_LUX_H #define FIRMWARE_LUX_H +#ifdef __cplusplus +<<<<<<< HEAD +extern "C" { +#endif + +======= +constexpr int led_number = 8; +#endif + #ifdef __cplusplus extern "C" { #endif void lux_task(void *pvParameters); -void signal_led(bool state); - +>>>>>>> 8d3006e (keep refactoring) #ifdef __cplusplus } #endif 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 diff --git a/firmware/otaflash.py b/firmware/otaflash.py deleted file mode 100755 index aeefe3f..0000000 --- a/firmware/otaflash.py +++ /dev/null @@ -1,44 +0,0 @@ -#!/usr/bin/env python3 - -import time -import websocket -import argparse -import zlib - -parser = argparse.ArgumentParser(description='Update fiatlux firmware via websocket.') -parser.add_argument("binfile") - -args = parser.parse_args() - -with open(args.binfile, "rb") as f: - try: - ws = websocket.WebSocket() - ws.connect("ws://172.16.0.1") - i = 0 - rolling = 0 - total = 0 - while True: - bytes = f.read(512) - rolling = zlib.crc32(bytes, rolling) - total += len(bytes) - msg = b'F\x00\x00\x00' - msg += i.to_bytes(2, 'big') - msg += len(bytes).to_bytes(2, 'big') - msg += (zlib.crc32(bytes) & 0xffffffff).to_bytes(4, 'big') - msg += bytes - ws.send(msg) - reply = ws.recv() - time.sleep(0.05) - i += 1 - if len(bytes) != 512: - break - msg = b'C\x00\x00\x00' - msg += total.to_bytes(4, 'big') - msg += rolling.to_bytes(4, 'big') - ws.send(msg) - print(ws.recv()) - ws.close() - except ConnectionResetError: - pass - except KeyboardInterrupt: - pass diff --git a/firmware/system.c b/firmware/system.c index f9dcadd..1d26849 100644 --- a/firmware/system.c +++ b/firmware/system.c @@ -3,114 +3,38 @@ // #include "system.h" -#include "crc32.h" #include +#include #include #include +#include #include -#include -#include -#include -#include -#define min(a, b) \ - ({ __typeof__ (a) _a = (a); \ - __typeof__ (b) _b = (b); \ - _a < _b ? _a : _b; }) - -void system_clear_config() { +void system_clear_config(){ vPortEnterCritical(); - uint32_t num_sectors = 0x2000 / sdk_flashchip.sector_size; - uint32_t start = 0x00100000; + uint32_t num_sectors = 5 + DEFAULT_SYSPARAM_SECTORS; + uint32_t start = sdk_flashchip.chip_size - num_sectors * sdk_flashchip.sector_size; for (uint32_t i = 0; i < num_sectors; i++) { 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); sdk_system_restart(); +<<<<<<< HEAD } -void system_init_config() { - uint32_t base_addr = 0x00100000; +void system_init_config(){ + uint32_t base_addr; uint32_t num_sectors; - sysparam_init(base_addr, 0); if(sysparam_get_info(&base_addr, &num_sectors) != SYSPARAM_OK) { printf("Warning: WiFi config, sysparam not initialized\n"); - num_sectors = 0x2000 / sdk_flashchip.sector_size; + num_sectors = DEFAULT_SYSPARAM_SECTORS; + 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); } sdk_system_restart(); } -} - -#define MAX_IMAGE_SIZE 0x100000 - -struct { - rboot_write_status status; - uint32_t head; - uint32_t base; - uint16_t seq; - uint8_t slot; -} otaflash_context; - -void system_otaflash_init() { - rboot_config conf; - conf = rboot_get_config(); - otaflash_context.slot = (conf.current_rom + 1) % conf.count; - otaflash_context.base = rboot_get_slot_offset(otaflash_context.slot); - otaflash_context.status = rboot_write_init(otaflash_context.base); - otaflash_context.head = otaflash_context.base; - otaflash_context.seq = 0; -} - -int system_otaflash_chunk(uint8_t *data, uint16_t len, uint16_t seq, uint32_t hash) { - uint32_t local_hash = crc32(data, len); - if(hash == local_hash && otaflash_context.seq == seq) { - if(otaflash_context.head % SECTOR_SIZE == 0) { - sdk_spi_flash_erase_sector(otaflash_context.head / SECTOR_SIZE); - } - if(((uint32_t) data) % 4) { - uint32 buf[len / 4]; - memcpy(buf, data, len); - sdk_spi_flash_write(otaflash_context.head, buf, len); - } else { - sdk_spi_flash_write(otaflash_context.head, (uint32_t *) data, len); - } - otaflash_context.head += len; - otaflash_context.seq++; - return 0x88; - } else { - return 0xff; - } - -} - -void system_otaflash_verify_chunk(void *ctx, void *data, size_t len) { - uint32_t digest = *(uint32_t *) ctx; - digest = crc32_partial(digest, data, len); - *(uint32_t *) ctx = digest; -} - -int system_otaflash_verify_and_switch(uint32_t len, uint32_t hash) { - - uint32_t digest = 0; - rboot_digest_image(otaflash_context.base, min(len, MAX_IMAGE_SIZE), system_otaflash_verify_chunk, &digest); - - if(hash != digest) { - printf("OTA failed to verify firmware\r\n"); - return 0x99; - } - - vPortEnterCritical(); - if(!rboot_set_current_rom(otaflash_context.slot)) { - printf("OTA failed to set new rboot slot\r\n"); - } - sdk_system_restart(); - vPortExitCritical(); // | should not be reached - return 0x77; // | +======= +>>>>>>> 7d1fb53 (refactoring code) } \ No newline at end of file diff --git a/firmware/system.h b/firmware/system.h index ac97a9b..9278497 100644 --- a/firmware/system.h +++ b/firmware/system.h @@ -5,24 +5,23 @@ #ifndef FIRMWARE_SYSTEM_H #define FIRMWARE_SYSTEM_H -#include - #ifdef __cplusplus extern "C" { #endif void system_clear_config(); - +<<<<<<< HEAD void system_init_config(); - -void system_otaflash_init(); - -int system_otaflash_chunk(uint8_t *data, uint16_t len, uint16_t seq, uint32_t hash); - -int system_otaflash_verify_and_switch(uint32_t len, uint32_t hash); +======= +>>>>>>> 7d1fb53 (refactoring code) #ifdef __cplusplus } #endif +<<<<<<< HEAD +======= + + +>>>>>>> 7d1fb53 (refactoring code) #endif //FIRMWARE_SYSTEM_H diff --git a/firmware/web.cpp b/firmware/web.cpp index 6176a43..2f1f78a 100644 --- a/firmware/web.cpp +++ b/firmware/web.cpp @@ -1,13 +1,14 @@ // // Created by jedi on 25.06.21. +<<<<<<< HEAD +// +======= // #include "web.h" #include "system.h" -#include "lux.h" -#include "wifi.h" -#include +#include #include #include @@ -17,6 +18,7 @@ extern "C" { } #include + #include extern "C" { @@ -38,22 +40,22 @@ void websocket_task(void *pvParameter) { has_changed = {true, true, true}; for (;;) { - if(pcb == nullptr || pcb->state != ESTABLISHED) { + if(pcb == NULL || pcb->state != ESTABLISHED) { printf("Connection closed, deleting task\n"); break; } + //Global Info if(has_changed.global) { - has_changed.global = false; - timeval tv{}; - gettimeofday(&tv, nullptr); - size_t uptime = xTaskGetTickCount() * portTICK_PERIOD_MS / 1000; + timeval tv; + gettimeofday(&tv, NULL); + int uptime = xTaskGetTickCount() * portTICK_PERIOD_MS / 1000; int heap = (int) xPortGetFreeHeapSize(); uint32_t chip_id = sdk_system_get_chip_id(); uint32_t flash_id = sdk_spi_flash_get_id(); uint32_t flash_size = sdk_flashchip.chip_size >> 10; - char *hostname = nullptr; + char *hostname = NULL; sysparam_get_string("hostname", &hostname); /* Generate response in JSON format */ @@ -77,19 +79,25 @@ void websocket_task(void *pvParameter) { vTaskDelayMs(2000); } + + //Connection Info if(has_changed.connection) { - has_changed.connection = false; - timeval tv{}; - gettimeofday(&tv, nullptr); - size_t connuptime = (xTaskGetTickCount() - connstarttime) * portTICK_PERIOD_MS / 1000; + timeval tv; + gettimeofday(&tv, NULL); + int connuptime = (xTaskGetTickCount() - connstarttime) * portTICK_PERIOD_MS / 1000; - printf("conn %d: " IPSTR " <-> " IPSTR " \n", pcb->netif_idx, IP2STR(&pcb->local_ip), - IP2STR(&pcb->remote_ip)); + printf("conn %d: " + IPSTR + " <-> " + IPSTR + " \n", pcb->netif_idx, IP2STR(&pcb->local_ip), IP2STR(&pcb->remote_ip)); char response[160]; size_t len = snprintf(response, sizeof(response), "{\"connage\" : \"%d\"," - "\"clientip\" : \"" IPSTR "\"" + "\"clientip\" : \"" + IPSTR + "\"" "}", connuptime, IP2STR(&pcb->remote_ip)); if(len < sizeof(response)) { LOCK_TCPIP_CORE(); @@ -101,7 +109,6 @@ void websocket_task(void *pvParameter) { } if(has_changed.wifi) { - has_changed.wifi = false; uint8_t opmode = sdk_wifi_get_opmode(); const char *opmode_str = "??"; switch (opmode) { @@ -132,10 +139,10 @@ void websocket_task(void *pvParameter) { if(opmode == SOFTAP_MODE || opmode == STATIONAP_MODE) { uint8_t hwaddr[6]; sdk_wifi_get_macaddr(SOFTAP_IF, hwaddr); - ip_info info{}; + ip_info info; sdk_wifi_get_ip_info(SOFTAP_IF, &info); - char *apssid = nullptr; + char *apssid = NULL; sysparam_get_string("wifi_ap_ssid", &apssid); /* Generate response in JSON format */ @@ -143,8 +150,12 @@ void websocket_task(void *pvParameter) { size_t len = snprintf(response, sizeof(response), "{\"opmode\" : \"%s\"," " \"apssid\" : \"%s\"," - " \"apip\" : \"" IPSTR "\"," - " \"apmac\" : \"" MACSTR "\"" + " \"apip\" : \"" + IPSTR + "\"," + " \"apmac\" : \"" + MACSTR + "\"" "}", opmode_str, apssid, IP2STR(&info.ip), MAC2STR(hwaddr)); free(apssid); if(len < sizeof(response)) { @@ -160,9 +171,9 @@ void websocket_task(void *pvParameter) { if(opmode == STATION_MODE || opmode == STATIONAP_MODE) { uint8_t hwaddr[6]; sdk_wifi_get_macaddr(STATION_IF, hwaddr); - ip_info info{}; + ip_info info; sdk_wifi_get_ip_info(STATION_IF, &info); - char *stassid = nullptr; + char *stassid = NULL; sysparam_get_string("wifi_sta_ssid", &stassid); /* Generate response in JSON format */ @@ -170,8 +181,12 @@ void websocket_task(void *pvParameter) { size_t len = snprintf(response, sizeof(response), "{\"opmode\" : \"%s\"," " \"stassid\" : \"%s\"," - " \"staip\" : \"" IPSTR "\"," - " \"stamac\" : \"" MACSTR "\"" + " \"staip\" : \"" + IPSTR + "\"," + " \"stamac\" : \"" + MACSTR + "\"" "}", opmode_str, stassid, IP2STR(&info.ip), MAC2STR(hwaddr)); free(stassid); if(len < sizeof(response)) { @@ -184,44 +199,38 @@ void websocket_task(void *pvParameter) { } - vTaskDelayMs(500); + vTaskDelayMs(2000); + //printf("9: %d\n",gpio_read(9)); + //printf("10: %d\n",gpio_read(10)); } - vTaskDelete(nullptr); + vTaskDelete(NULL); } -struct fw_frame { - char t; - uint8_t reserved[3]; - uint16_t seq; - uint16_t len; - uint32_t hash; - uint8_t data[]; -} __attribute__((packed)); - -struct fw_check { - char t; - uint8_t reserved[3]; - uint32_t len; - uint32_t hash; -} __attribute__((packed)); - /** * This function is called when websocket frame is received. * * Note: this function is executed on TCP thread and should return as soon * as possible. */ -void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, - uint8_t /*mode*/) { //mode should be WS_BIN_MODE or WS_TEXT_MODE +void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, uint8_t mode) { uint8_t response[3]; uint16_t val = 0; char cmd = '0'; - bool togl = 0; + uint8_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; @@ -229,38 +238,53 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, cmd = 'X'; break; case 'D': // Disable LED - signal_led(false); - val = 1; + //gpio_write(LED_PIN, true); + val = 0xDEAD; cmd = 'G'; break; case 'E': // Enable LED - signal_led(true); - val = 0; + //gpio_write(LED_PIN, false); + val = 0xBEEF; cmd = 'G'; break; - case 'F': - togl = ~togl; - signal_led(togl); - { - auto *f = (fw_frame *) data; - if(f->seq == 0) { - system_otaflash_init(); - } - val = system_otaflash_chunk(f->data, ntohs(f->len), ntohs(f->seq), ntohl(f->hash)); - } - cmd = 'F'; + 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 'C': - signal_led(false); - { - auto *f = (fw_check *) data; - val = system_otaflash_verify_and_switch(ntohl(f->len), ntohl(f->hash)); - } - cmd = 'C'; + 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_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]); + printf("Unknown command\n"); val = 0; break; } @@ -269,9 +293,7 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, response[1] = val >> 8; response[0] = cmd; - LOCK_TCPIP_CORE(); websocket_write(pcb, response, 3, WS_BIN_MODE); - UNLOCK_TCPIP_CORE(); if(data[0] == 'R') { // Restart vTaskDelay(500 / portTICK_PERIOD_MS); @@ -290,17 +312,39 @@ void websocket_cb(struct tcp_pcb *pcb, char *data, u16_t data_len, void websocket_open_cb(struct tcp_pcb *pcb, const char *uri) { printf("WS URI: %s\n", uri); if(!strcmp(uri, "/stream")) { - xTaskCreate(&websocket_task, "websocket_task", 512, (void *) pcb, 3, nullptr); + xTaskCreate(&websocket_task, "websocket_task", 512, (void *) pcb, 2, NULL); } } -extern "C" void httpd_task(void *pvParameters) { - (void) pvParameters; +/*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"; +}*/ - while (!uxSemaphoreGetCount(wifi_available_semaphore)) - vTaskDelay(500 / portTICK_PERIOD_MS); +extern "C" void httpd_task(void *pvParameters) { + /*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(); - vTaskDelete(nullptr); -} \ No newline at end of file + for (;;); +} +>>>>>>> 7d1fb53 (refactoring code) diff --git a/firmware/web.h b/firmware/web.h index 831d2f8..1867091 100644 --- a/firmware/web.h +++ b/firmware/web.h @@ -9,8 +9,11 @@ extern "C" { #endif +<<<<<<< HEAD +======= void httpd_task(void *pvParameters); +>>>>>>> 7d1fb53 (refactoring code) #ifdef __cplusplus } #endif diff --git a/firmware/wifi.cpp b/firmware/wifi.cpp index 65b114b..da4c496 100644 --- a/firmware/wifi.cpp +++ b/firmware/wifi.cpp @@ -3,358 +3,3 @@ // #include "wifi.h" - -#include -#include -#include -#include -#include - -extern "C" { -#include -#include -#include -} - -#include -#include -#include -#include - -const char *wificfg_default_ssid = "fiatlux_%02X%02X%02X"; -const char *wificfg_default_password = "fiatlux02"; -const char *wificfg_default_hostname = "fiatlux-%02x%02x%02x"; - -char *wifi_sta_ssid = nullptr; -char *wifi_sta_password = nullptr; -char *wifi_ap_ssid = nullptr; -char *wifi_ap_password = nullptr; - -SemaphoreHandle_t wifi_available_semaphore = nullptr; - -[[noreturn]] static void dns_task(void *pvParameters) { - char *wifi_ap_ip_addr = nullptr; - sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); - if(!wifi_ap_ip_addr) { - printf("dns: no ip address\n"); - vTaskDelete(nullptr); - } - ip4_addr_t server_addr; - server_addr.addr = ipaddr_addr(wifi_ap_ip_addr); - -#if LWIP_IPV6 - int fd = socket(AF_INET6, SOCK_DGRAM, IPPROTO_UDP); - sockaddr_in6 serv_addr; - memset(&serv_addr, '0', sizeof(serv_addr)); - serv_addr.sin6_family = AF_INET6; - serv_addr.sin6_port = htons(53); - serv_addr.sin6_flowinfo = 0; - serv_addr.sin6_addr = in6addr_any; - serv_addr.sin6_scope_id = IP6_NO_ZONE; -#else - int fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); - sockaddr_in serv_addr; - memset(&serv_addr, '0', sizeof(serv_addr)); - serv_addr.sin_family = AF_INET; - serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); - serv_addr.sin_port = htons(53); -#endif - bind(fd, (sockaddr *) &serv_addr, sizeof(serv_addr)); - - const ifreq ifreq0 = {"en0"}; - const ifreq ifreq1 = {"en1"}; - setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE, - sdk_wifi_get_opmode() == STATIONAP_MODE ? &ifreq1 : &ifreq0, - sizeof(ifreq0)); - - for (;;) { - uint8_t buffer[96]; - sockaddr_storage src_addr; - socklen_t src_addr_len = sizeof(src_addr); - ssize_t count = recvfrom(fd, buffer, sizeof(buffer), 0, (sockaddr *) &src_addr, &src_addr_len); - - /* Drop messages that are too large to send a response in the buffer */ - if(count > 0 && count + 16 <= (ssize_t) sizeof(buffer)) { - size_t qname_len = strlen((const char *) (buffer + 12)) + 1; - uint32_t reply_len = 2 + 10 + qname_len + 16 + 4; - - uint8_t *head = buffer + 2; - *head++ = 0x80; // Flags - *head++ = 0x00; - *head++ = 0x00; // Q count - *head++ = 0x01; - *head++ = 0x00; // A count - *head++ = 0x01; - *head++ = 0x00; // Auth count - *head++ = 0x00; - *head++ = 0x00; // Add count - *head++ = 0x00; - head += qname_len; - *head++ = 0x00; // Q type - *head++ = 0x01; - *head++ = 0x00; // Q class - *head++ = 0x01; - *head++ = 0xC0; // LBL offs - *head++ = 0x0C; - *head++ = 0x00; // Type - *head++ = 0x01; - *head++ = 0x00; // Class - *head++ = 0x01; - *head++ = 0x00; // TTL - *head++ = 0x00; - *head++ = 0x00; - *head++ = 0x78; - *head++ = 0x00; // RD len - *head++ = 0x04; - *head++ = ip4_addr1(&server_addr); - *head++ = ip4_addr2(&server_addr); - *head++ = ip4_addr3(&server_addr); - *head++ = ip4_addr4(&server_addr); - - sendto(fd, buffer, reply_len, 0, (sockaddr *) &src_addr, src_addr_len); - } - } -} - -extern "C" void wifi_task(void *pvParameters) { - (void) pvParameters; - /* Default a hostname. */ - char *hostname = nullptr; - sysparam_get_string("hostname", &hostname); - if(!hostname && wificfg_default_hostname) { - uint8_t macaddr[6]; - char name[32]; - sdk_wifi_get_macaddr(1, macaddr); - snprintf(name, sizeof(name), wificfg_default_hostname, macaddr[3], - macaddr[4], macaddr[5]); - sysparam_set_string("hostname", name); - } - if(hostname) { - free(hostname); - } - - sysparam_get_string("wifi_ap_ssid", &wifi_ap_ssid); - sysparam_get_string("wifi_ap_password", &wifi_ap_password); - sysparam_get_string("wifi_sta_ssid", &wifi_sta_ssid); - sysparam_get_string("wifi_sta_password", &wifi_sta_password); - - int8_t wifi_sta_enable = 1; - int8_t wifi_ap_enable = 1; - sysparam_get_int8("wifi_sta_enable", &wifi_sta_enable); - sysparam_get_int8("wifi_ap_enable", &wifi_ap_enable); - - if(!wifi_sta_enable) - wifi_ap_enable = 1; - - int8_t wifi_sta_disabled_restarts = 0; - sysparam_get_int8("wifi_sta_disabled_restarts", &wifi_sta_disabled_restarts); - if(wifi_sta_disabled_restarts > 0) { - wifi_sta_enable = 0; - wifi_sta_disabled_restarts--; - sysparam_set_int8("wifi_sta_disabled_restarts", wifi_sta_disabled_restarts); - } - - int8_t wifi_ap_disabled_restarts = 0; - sysparam_get_int8("wifi_ap_disabled_restarts", &wifi_ap_disabled_restarts); - if(wifi_ap_disabled_restarts > 0) { - wifi_ap_enable = 0; - wifi_ap_disabled_restarts--; - sysparam_set_int8("wifi_ap_disabled_restarts", wifi_ap_disabled_restarts); - } - - /* Validate the configuration. */ - - if(wifi_sta_enable && (!wifi_sta_ssid || !wifi_sta_password || - strlen(wifi_sta_ssid) < 1 || - strlen(wifi_sta_ssid) > 32 || - !wifi_sta_password || - strlen(wifi_sta_password) < 8 || - strlen(wifi_sta_password) >= 64)) { - wifi_sta_enable = 0; - } - - if(wifi_ap_enable) { - /* Default AP ssid and password. */ - if(!wifi_ap_ssid && wificfg_default_ssid) { - uint8_t macaddr[6]; - char ssid[32]; - sdk_wifi_get_macaddr(1, macaddr); - snprintf(ssid, sizeof(ssid), wificfg_default_ssid, macaddr[3], - macaddr[4], macaddr[5]); - sysparam_set_string("wifi_ap_ssid", ssid); - sysparam_get_string("wifi_ap_ssid", &wifi_ap_ssid); - - if(!wifi_ap_password && wificfg_default_password) { - sysparam_set_string("wifi_ap_password", wificfg_default_password); - sysparam_get_string("wifi_ap_password", &wifi_ap_password); - } - } - printf("ssid: %s\n", wifi_ap_ssid); - - /* If the ssid and password are not valid then disable the AP interface. */ - if(!wifi_ap_ssid || strlen(wifi_ap_ssid) < 1 || strlen(wifi_ap_ssid) >= 32 || - !wifi_ap_password || strlen(wifi_ap_password) < 8 || strlen(wifi_ap_password) >= 64) { - printf("len err\n"); - wifi_ap_enable = 0; - } - } - - int8_t wifi_mode = NULL_MODE; - if(wifi_sta_enable && wifi_ap_enable) - wifi_mode = STATIONAP_MODE; - else if(wifi_sta_enable) - wifi_mode = STATION_MODE; - else if(wifi_ap_enable) - wifi_mode = SOFTAP_MODE; - sdk_wifi_set_opmode(wifi_mode); - - if(wifi_sta_enable) { - printf("try STA Mode: %s %s\n", wifi_sta_ssid, wifi_sta_password); - sdk_station_config config; - strcpy((char *) config.ssid, wifi_sta_ssid); - strcpy((char *) config.password, wifi_sta_password); - config.bssid_set = 0; - - int8_t wifi_sta_dhcp = 1; - sysparam_get_int8("wifi_sta_dhcp", &wifi_sta_dhcp); - - if(!wifi_sta_dhcp) { - char *wifi_sta_ip_addr = nullptr; - char *wifi_sta_netmask = nullptr; - char *wifi_sta_gateway = nullptr; - sysparam_get_string("wifi_sta_ip_addr", &wifi_sta_ip_addr); - sysparam_get_string("wifi_sta_netmask", &wifi_sta_netmask); - sysparam_get_string("wifi_sta_gateway", &wifi_sta_gateway); - - if(wifi_sta_ip_addr && strlen(wifi_sta_ip_addr) > 4 && - wifi_sta_netmask && strlen(wifi_sta_netmask) > 4 && - wifi_sta_gateway && strlen(wifi_sta_gateway) > 4) { - sdk_wifi_station_dhcpc_stop(); - 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); - info.gw.addr = ipaddr_addr(wifi_sta_gateway); - sdk_wifi_set_ip_info(STATION_IF, &info); - } - if(wifi_sta_ip_addr) free(wifi_sta_ip_addr); - if(wifi_sta_netmask) free(wifi_sta_netmask); - if(wifi_sta_gateway) free(wifi_sta_gateway); - } - - sdk_wifi_station_set_config(&config); - } - - if(wifi_ap_enable) { - printf("try AP Mode: %s %s\n", wifi_ap_ssid, wifi_ap_password); -/* Read and validate paramenters. */ - int8_t wifi_ap_ssid_hidden = 0; - sysparam_get_int8("wifi_ap_ssid_hidden", &wifi_ap_ssid_hidden); - if(wifi_ap_ssid_hidden < 0 || wifi_ap_ssid_hidden > 1) { - wifi_ap_ssid_hidden = 1; - } - - int8_t wifi_ap_channel = 6; - sysparam_get_int8("wifi_ap_channel", &wifi_ap_channel); - -#if 0 - /* AU does not allow channels above 13, although 14 works. */ - if(wifi_ap_channel > 13) { - wifi_ap_channel = 13; - } - /* US does not allow channels above 11, although they work. */ - if (wifi_ap_channel > 11) { - wifi_ap_channel = 11; - } -#endif - if(wifi_ap_channel < 1 || wifi_ap_channel > 14) { - wifi_ap_channel = 6; - } - - int8_t wifi_ap_authmode = AUTH_WPA_WPA2_PSK; - sysparam_get_int8("wifi_ap_authmode", &wifi_ap_authmode); - if(wifi_ap_authmode != AUTH_OPEN && wifi_ap_authmode != AUTH_WPA_PSK && - wifi_ap_authmode != AUTH_WPA2_PSK && wifi_ap_authmode != AUTH_WPA_WPA2_PSK) { - wifi_ap_authmode = AUTH_WPA_WPA2_PSK; - } - - int8_t wifi_ap_max_conn = 3; - sysparam_get_int8("wifi_ap_max_conn", &wifi_ap_max_conn); - if(wifi_ap_max_conn < 1 || wifi_ap_max_conn > 8) { - wifi_ap_max_conn = 3; - } - - int32_t wifi_ap_beacon_interval = 100; - sysparam_get_int32("wifi_ap_beacon_interval", &wifi_ap_beacon_interval); - if(wifi_ap_beacon_interval < 0 || wifi_ap_beacon_interval > 1000) { - wifi_ap_beacon_interval = 100; - } - - /* Default AP IP address and netmask. */ - char *wifi_ap_ip_addr = nullptr; - sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); - if(!wifi_ap_ip_addr) { - sysparam_set_string("wifi_ap_ip_addr", "172.16.0.1"); - sysparam_get_string("wifi_ap_ip_addr", &wifi_ap_ip_addr); - } - char *wifi_ap_netmask = nullptr; - sysparam_get_string("wifi_ap_netmask", &wifi_ap_netmask); - if(!wifi_ap_netmask) { - sysparam_set_string("wifi_ap_netmask", "255.255.0.0"); - sysparam_get_string("wifi_ap_netmask", &wifi_ap_netmask); - } - - if(strlen(wifi_ap_ip_addr) >= 7 && strlen(wifi_ap_netmask) >= 7) { - 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; - strcpy((char *) ap_config.ssid, wifi_ap_ssid); - ap_config.ssid_len = strlen(wifi_ap_ssid); - strcpy((char *) ap_config.password, wifi_ap_password); - ap_config.channel = static_cast(wifi_ap_channel); - ap_config.authmode = static_cast(wifi_ap_authmode); - ap_config.ssid_hidden = static_cast(wifi_ap_ssid_hidden); - ap_config.max_connection = static_cast(wifi_ap_max_conn); - ap_config.beacon_interval = static_cast(wifi_ap_beacon_interval); - - sdk_wifi_softap_set_config(&ap_config); - - int8_t wifi_ap_dhcp_leases = 4; - sysparam_get_int8("wifi_ap_dhcp_leases", &wifi_ap_dhcp_leases); - - if(wifi_ap_dhcp_leases) { - ip4_addr_t first_client_ip; - first_client_ip.addr = ap_ip.ip.addr + htonl(1); - - int8_t wifi_ap_dns = 1; - sysparam_get_int8("wifi_ap_dns", &wifi_ap_dns); - if(wifi_ap_dns < 0 || wifi_ap_dns > 1) - wifi_ap_dns = 1; - - dhcpserver_start(&first_client_ip, wifi_ap_dhcp_leases); - dhcpserver_set_router(&ap_ip.ip); - if(wifi_ap_dns) { - dhcpserver_set_dns(&ap_ip.ip); - xTaskCreate(dns_task, "dns_task", 384, nullptr, 2, nullptr); - } - } - } - - free(wifi_ap_ip_addr); - free(wifi_ap_netmask); - } - - if(wifi_sta_ssid) free(wifi_sta_ssid); - if(wifi_sta_password) free(wifi_sta_password); - if(wifi_ap_ssid) free(wifi_ap_ssid); - if(wifi_ap_password) free(wifi_ap_password); - - xSemaphoreGive(wifi_available_semaphore); - - //monitor loop connection here - vTaskDelete(nullptr); -} \ No newline at end of file diff --git a/firmware/wifi.h b/firmware/wifi.h index 9fec7da..9e08c17 100644 --- a/firmware/wifi.h +++ b/firmware/wifi.h @@ -5,19 +5,15 @@ #ifndef FIRMWARE_WIFI_H #define FIRMWARE_WIFI_H -#include -#include - +<<<<<<< HEAD #ifdef __cplusplus extern "C" { #endif -extern SemaphoreHandle_t wifi_available_semaphore; - -void wifi_task(void *pvParameters); - #ifdef __cplusplus } #endif +======= +>>>>>>> 7d1fb53 (refactoring code) #endif //FIRMWARE_WIFI_H diff --git a/modules/nix b/modules/nix deleted file mode 160000 index 403461c..0000000 --- a/modules/nix +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 403461c810ddab0cf498b24df5b5ff92606e4154 diff --git a/pcb/.gitignore b/pcb/.gitignore index 5d83bb6..2043655 100644 --- a/pcb/.gitignore +++ b/pcb/.gitignore @@ -31,6 +31,5 @@ fp-info-cache *.wrl *.step -*-bak gen/ -pcb.zip +gen.zip diff --git a/pcb/Makefile b/pcb/Makefile index 610317c..181d4fb 100644 --- a/pcb/Makefile +++ b/pcb/Makefile @@ -1,54 +1,4 @@ -.NOTPARALLEL: gen/fab/fiatlux-F_Cu.gbr gen/fab/fiatlux-B_Cu.gbr gen/fab/fiatlux-F_Mask.gbr gen/fab/fiatlux-B_Mask.gbr gen/fab/fiatlux-F_Paste.gbr gen/fab/fiatlux-B_Paste.gbr gen/fab/fiatlux-F_SilkS.gbr gen/fab/fiatlux-B_SilkS.gbr - -all: test fab doc pcb.zip - -pcb.zip: fab doc +all: @mkdir -p gen - @cd gen; zip -r ../pcb.zip fab.zip fiatlux.csv fiatlux-top-pos.csv fiatlux-front.svg fiatlux-back.svg fiatlux.pdf - @cd gen; zip -r ../debug.zip . - -test: gen/fiatlux-drc.txt gen/fiatlux-erc.txt - -doc: gen/fiatlux.pdf gen/fiatlux-front.svg gen/fiatlux-back.svg - -fab: test gen/fab.zip gen/fiatlux.csv gen/fiatlux-top-pos.csv - -gen/fab.zip: gen/fab/fiatlux-F_Cu.gbr gen/fab/fiatlux-B_Cu.gbr gen/fab/fiatlux-F_Mask.gbr gen/fab/fiatlux-B_Mask.gbr -gen/fab.zip: gen/fab/fiatlux-F_Paste.gbr gen/fab/fiatlux-B_Paste.gbr gen/fab/fiatlux-F_SilkS.gbr gen/fab/fiatlux-B_SilkS.gbr - @mkdir -p gen/fab - @cd gen/fab; zip -r ../fab.zip *.gbr - -gen/fiatlux-erc.txt: fiatlux.kiplot.yaml fiatlux.pro fiatlux.kicad_pcb - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s update_xml,run_drc -i - -gen/fiatlux-drc.txt: fiatlux.kiplot.yaml fiatlux.pro fiatlux.sch - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s update_xml,run_erc -i - -gen/fab/%.gbr: fiatlux.kiplot.yaml fiatlux.pro fiatlux.kicad_pcb - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s all print_front gerbers - -gen/fiatlux-top-pos.csv: fiatlux.kiplot.yaml fiatlux.pro fiatlux.kicad_pcb - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s all print_front position - -gen/fiatlux.csv: fiatlux.kiplot.yaml fiatlux.pro fiatlux.kicad_pcb - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s all print_front bom - -gen/fiatlux.pdf: fiatlux.kiplot.yaml fiatlux.pro fiatlux.sch - @mkdir -p gen - kibot -d gen -c fiatlux.kiplot.yaml -s run_drc,run_erc print_sch - -gen/fiatlux-front.svg: fiatlux.kicad_pcb - @mkdir -p gen - pcbdraw --libs default $< $@ - -gen/fiatlux-back.svg: fiatlux.kicad_pcb - @mkdir -p gen - pcbdraw --libs default --back $< $@ - -clean: - @rm -rf gen \ No newline at end of file + @touch gen/foo + @cd gen; zip ../gen.zip * diff --git a/pcb/fiatlux.kiplot.yaml b/pcb/fiatlux.kiplot.yaml index a035fc6..2921d61 100644 --- a/pcb/fiatlux.kiplot.yaml +++ b/pcb/fiatlux.kiplot.yaml @@ -13,39 +13,20 @@ preflight: # kiauto_wait_start: 60 # kiauto_time_out_scale: 2 -filters: - - name: fix_rotation - comment: 'Adjust rotation for JLC' - type: rot_footprint - - - name: only_jlc_parts - comment: 'Only parts with JLC code' - type: generic - include_only: - - column: 'LCSC#' - regex: '^C\d+' - -variants: - - name: rotated - comment: 'Just a place holder for the rotation filter' - type: kibom - variant: rotated - pre_transform: fix_rotation - outputs: - name: 'print_sch' comment: "Print schematic (PDF)" type: pdf_sch_print dir: . options: - output: fiatlux.pdf + output: Schematic.pdf - name: 'print_front' comment: "Print F.Cu+Dwgs.User" type: pdf_pcb_print dir: . options: - output_name: fiatlux-top.pdf + output_name: PCB_Top.pdf layers: - layer: B.Cu - layer: F.SilkS @@ -53,7 +34,7 @@ outputs: - name: 'gerbers' comment: "Gerbers for the board house" type: gerber - dir: fab + dir: Gerbers options: # generic layer options exclude_edge_layer: true @@ -75,65 +56,11 @@ outputs: use_gerber_net_attributes: true layers: - - layer: F.Cu - suffix: F_Cu - layer: B.Cu suffix: B_Cu - layer: F.SilkS suffix: F_SilkS - - layer: B.SilkS - suffix: B_SilkS - - layer: F.Paste - suffix: F_Paste - - layer: B.Paste - suffix: B_Paste - - layer: F.Mask - suffix: F_Mask - - layer: B.Mask - suffix: B_Mask - layer: Edge.Cuts suffix: Edge_Cuts - - name: 'position' - comment: "Pick and place file, JLC style" - type: position - options: - variant: rotated - output: '%f-top-pos.%x' - format: CSV - units: millimeters - separate_files_for_front_and_back: false - only_smd: true - columns: - - id: Ref - name: Designator - - Val - - Package - - id: PosX - name: "Mid X" - - id: PosY - name: "Mid Y" - - id: Rot - name: Rotation - - id: Side - name: Layer - - name: 'bom' - comment: "BoM for JLC" - type: bom - options: - output: '%f.%x' - exclude_filter: 'only_jlc_parts' - ref_separator: ',' - columns: - - field: Value - name: Comment - - field: References - name: Designator - - Footprint - - field: 'LCSC#' - name: 'LCSC Part #' - csv: - hide_pcb_info: true - hide_stats_info: true - quote_all: true \ No newline at end of file diff --git a/shell.nix b/shell.nix deleted file mode 100644 index 416ba65..0000000 --- a/shell.nix +++ /dev/null @@ -1 +0,0 @@ -import ./modules/nix/shell-esp-open-rtos.nix {}