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 190a5aa..0000000
--- a/firmware/.idea/firmware.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/firmware/bus.cpp b/firmware/bus.cpp
new file mode 100644
index 0000000..1b7866f
--- /dev/null
+++ b/firmware/bus.cpp
@@ -0,0 +1,117 @@
+#include "bus.h"
+#include "esp/gpio.h"
+
+#include
+#include "log.h"
+
+uint32_t spi_transfer_32_duplex(uint8_t bus, uint32_t val) {
+ uint32_t out = val;
+ uint32_t in;
+ spi_transfer(bus, &out, &in, 1, SPI_32BIT);
+ return in;
+}
+
+uint16_t spi_transfer_16_duplex(uint8_t bus, uint32_t val) {
+ uint16_t out = val;
+ uint16_t in;
+ spi_transfer(bus, &out, &in, 1, SPI_16BIT);
+ return in;
+}
+
+void reset_bus() {
+ gpio_write(4, false);
+ for (volatile int k = 0; k < 128; ++k);
+ gpio_write(4, true);
+}
+
+void bus_init() {
+ gpio_write(4, false);
+ for (volatile int k = 0; k < 512 * 2; ++k);
+ gpio_write(4, true);
+ gpio_enable(4, GPIO_OUT_OPEN_DRAIN);
+ gpio_write(4, true);
+ for (volatile int k = 0; k < 512 * 4; ++k);
+
+ spi_init(1, SPI_MODE0, SPI_FREQ_DIV_2M, true, SPI_BIG_ENDIAN, false);
+}
+
+uint16_t bus_transfer_msg(uint8_t addr, uint16_t dat) {
+ union {
+ struct {
+ unsigned dat: 12;
+ unsigned addr: 4;
+ } __attribute__((packed));
+ uint16_t _;
+ } frame = {._=0};
+
+ frame.addr = addr;
+ frame.dat = dat;
+ spi_transfer_16_duplex(1, frame._);
+ for (volatile int k = 0; k < 512 * 2; ++k);
+ uint16_t reply = spi_transfer_16_duplex(1, 0x0000);
+ for (volatile int k = 0; k < 512 * 2; ++k);
+ return reply;
+}
+
+bool bus_transfer_msg_arr(uint8_t addr, uint16_t* dat, uint8_t len) {
+ union {
+ struct {
+ unsigned dat: 12;
+ unsigned addr: 4;
+ } __attribute__((packed));
+ uint16_t _;
+ } frame = {._=0};
+
+ uint16_t last_frame = 0x0000;
+ uint16_t reply = 0x0000;
+ uint8_t error_count = 0;
+
+ for (int i = 0; i < len; ++i) {
+
+ frame.addr = addr + i;
+ frame.dat = dat[i];
+
+ reply = spi_transfer_16_duplex(1, frame._);
+
+ if(reply != last_frame && i != 0)
+ error_count++;
+
+ if(0){
+ syslog(" > ");
+ syslog_i32(frame._);
+ syslog(" < ");
+ syslog_i32(reply);
+ syslog(" =? ");
+ syslog_i32(last_frame);
+ syslog("\n");
+ }
+
+ last_frame = frame._;
+
+ for (volatile int k = 0; k < 512 * 2; ++k);
+ }
+
+ reply = spi_transfer_16_duplex(1, 0x0000);
+ if(reply != last_frame)
+ error_count++;
+
+ if(0){
+ syslog(" > ");
+ syslog_i32(frame._);
+ syslog(" < ");
+ syslog_i32(reply);
+ syslog(" =? ");
+ syslog_i32(last_frame);
+ syslog("\n");
+ }
+
+ return error_count == 0;
+}
+
+uint16_t bus_get_version() {
+ return bus_transfer_msg(15, 0);
+}
+
+bool bus_ping() {
+ return bus_get_version() == 0x002a;
+}
\ No newline at end of file
diff --git a/firmware/bus.h b/firmware/bus.h
new file mode 100644
index 0000000..c2ea53d
--- /dev/null
+++ b/firmware/bus.h
@@ -0,0 +1,30 @@
+#ifndef FIATLUX_BUS_H
+#define FIATLUX_BUS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include
+
+uint32_t spi_transfer_32_duplex(uint8_t bus, uint32_t val);
+
+uint16_t spi_transfer_16_duplex(uint8_t bus, uint32_t val);
+
+void reset_bus();
+
+void bus_init();
+
+uint16_t bus_transfer_msg(uint8_t addr, uint16_t dat);
+
+bool bus_transfer_msg_arr(uint8_t addr, uint16_t dat[], uint8_t len);
+
+uint16_t bus_get_version();
+
+bool bus_ping();
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif //FIATLUX_BUS_H
diff --git a/firmware/fiatlux.c b/firmware/fiatlux.c
index 93433d9..dc7e9f1 100644
--- a/firmware/fiatlux.c
+++ b/firmware/fiatlux.c
@@ -3,6 +3,7 @@
#include "web.h"
#include "mqtt.h"
#include "lux.h"
+#include "esplibs/libmain.h"
#include
#include
@@ -21,6 +22,10 @@ void user_init(void) {
system_init_config();
+ sdk_system_overclock();
+
+ printf("CPU freq: %d\n", sdk_system_get_cpu_freq());
+
wifi_available_semaphore = xSemaphoreCreateBinary();
//xTaskCreate(mqtt_task, "mqtt_task", 1024, NULL, 1, NULL);
diff --git a/firmware/log.cpp b/firmware/log.cpp
index e3b9a00..f3adb4e 100644
--- a/firmware/log.cpp
+++ b/firmware/log.cpp
@@ -30,7 +30,7 @@ extern "C" void syslog_i32(const uint32_t val) {
}
extern "C" void syslog(const char *msg) {
- //printf("syslog> %s", msg);
+ printf("%s", msg);
while (char c = *msg++) {
syslog_buf[head++ % syslog_buffer_size] = c;
}
diff --git a/firmware/lux.cpp b/firmware/lux.cpp
index db17968..45bfc24 100644
--- a/firmware/lux.cpp
+++ b/firmware/lux.cpp
@@ -4,13 +4,16 @@
#include "lux.h"
#include "log.h"
+#include "bus.h"
+#include "esp/spi.h"
+#include "espressif/esp_system.h"
#include
#include
#include
-#include
#include
+#include
extern "C" {
#include
@@ -42,6 +45,7 @@ volatile uint16_t light_value;
volatile uint16_t peripheral_version;
+
namespace fiatlux {
struct hal_error_t {
@@ -225,24 +229,14 @@ extern "C" void signal_led(bool state) {
fiatlux::signal::write_data(state);
}
-uint32_t spi_transfer_32_duplex(uint8_t bus, uint32_t val) {
- uint32_t out = val;
- uint32_t in;
- spi_transfer(bus, &out, &in, 1, SPI_32BIT);
- return in;
-};
-uint16_t spi_transfer_16_duplex(uint8_t bus, uint32_t val) {
- uint16_t out = val;
- uint16_t in;
- spi_transfer(bus, &out, &in, 1, SPI_16BIT);
- return in;
-};
+extern "C" bool set_cc48x6(uint16_t a[6]) {
+ return bus_transfer_msg_arr(1, a, 6);
+}
-void reset_bus() {
- gpio_write(4, false);
- for (volatile int k = 0; k < 128; ++k);
- gpio_write(4, true);
+extern "C" bool set_cc48(uint16_t a) {
+ uint16_t d[6] = {a, a, a, a, a, a};
+ return set_cc48x6(d);
}
@@ -254,12 +248,7 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
fiatlux::signal::setup();
fiatlux::relais::setup();
- gpio_write(4, false);
- for (volatile int k = 0; k < 512 * 2; ++k);
- gpio_write(4, true);
- gpio_enable(4, GPIO_OUT_OPEN_DRAIN);
- gpio_write(4, true);
- for (volatile int k = 0; k < 512 * 4; ++k);
+ bus_init();
int32_t lux_ws2812_number = 240;
auto ret = sysparam_get_int32("lux_ws2812_number", &lux_ws2812_number);
@@ -285,7 +274,7 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
//fiatlux::spi_dimmer::setup();
//fiatlux::apa10x::setup();
- spi_init(1, SPI_MODE0, SPI_FREQ_DIV_2M, true, SPI_BIG_ENDIAN, false);
+
/*
CC48 API:
@@ -294,22 +283,8 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
- [2*n+1] = 8bit PWM value
*/
- union {
- struct {
- unsigned dat: 12;
- unsigned addr: 4;
- } __attribute__((packed));
- uint16_t _;
- } frame = {._=0};
-
{
- frame.addr = 15;
- frame.dat = 0;
- spi_transfer_16_duplex(1, frame._);
- for (volatile int k = 0; k < 512 * 2; ++k);
- uint16_t reply = spi_transfer_16_duplex(1, 0x0000);
- peripheral_version = reply;
- for (volatile int k = 0; k < 512 * 2; ++k);
+ peripheral_version = bus_get_version();
syslog("peripheral_version: ");
syslog_i32(peripheral_version);
syslog("\n");
@@ -318,6 +293,7 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
light_value = 0xFFF;
uint16_t last_light_value = 0xFFFF;
+
while (true) {
fiatlux::signal::write_data(false);
@@ -328,56 +304,24 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
syslog_i32(light_value);
syslog("\n");
- uint16_t last_frame = 0x0000;
- uint16_t reply = 0x0000;
- uint8_t error_count = 0;
+ bool ok = set_cc48(light_value);
- for (int i = 0; i < 6; ++i) {
-
- frame.addr = i + 1;
- frame.dat = light_value;
- reply = spi_transfer_16_duplex(1, frame._);
-
- if(reply != last_frame)
- error_count++;
-
- {
- syslog(" > ");
- syslog_i32(frame._);
- syslog(" < ");
- syslog_i32(reply);
- syslog(" -- ");
- syslog_i32(last_frame);
- syslog("\n");
- }
-
- last_frame = frame._;
-
- for (volatile int k = 0; k < 512 * 2; ++k);
- }
-
- reply = spi_transfer_16_duplex(1, 0x0000);
- if(reply != last_frame)
- error_count++;
-
- {
- syslog(" > ");
- syslog_i32(frame._);
- syslog(" < ");
- syslog_i32(reply);
- syslog(" -- ");
- syslog_i32(last_frame);
- syslog("\n");
- }
-
- if(!error_count) {
+ if(ok) {
last_light_value = light_value;
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
} else {
syslog("reset_bus\n");
reset_bus();
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
}
- vTaskDelay(5000 / portTICK_PERIOD_MS);
+ } else {
+ bool ping = bus_ping();
+ if(!ping) {
+ syslog("ping: reset_bus\n");
+ reset_bus();
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
+ }
}
for (int i = 0; i < 120; i++)
@@ -388,7 +332,10 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
ws2812_i2s_update(pixels, PIXEL_RGBW);
+ //uint32_t lt = sdk_system_get_time();
vTaskDelay(200 / portTICK_PERIOD_MS);
+ //uint32_t dt = sdk_system_get_time() - lt;
+ //printf("delay: %d, expect: %d\n", dt, configTICK_RATE_HZ * 200);
/*//fiatlux::write_channel((uint8_t *) &leds[0], lux_apa10xx_number, 4, fiatlux::hal_module_t::APA10X);
vTaskDelay(200 / portTICK_PERIOD_MS);
diff --git a/firmware/lux.h b/firmware/lux.h
index bd0d535..bdafb40 100644
--- a/firmware/lux.h
+++ b/firmware/lux.h
@@ -1,7 +1,3 @@
-//
-// Created by jedi on 25.06.21.
-//
-
#ifndef FIRMWARE_LUX_H
#define FIRMWARE_LUX_H
diff --git a/firmware/wifi.cpp b/firmware/wifi.cpp
index b2d9d79..9039c17 100644
--- a/firmware/wifi.cpp
+++ b/firmware/wifi.cpp
@@ -146,9 +146,6 @@ extern "C" void wifi_task(void *pvParameters) {
sysparam_get_int8("wifi_ap_enable", &wifi_ap_enable);
wifi_ap_enable = 0;
- 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) {
@@ -176,6 +173,9 @@ extern "C" void wifi_task(void *pvParameters) {
wifi_sta_enable = 0;
}
+ if(!wifi_sta_enable)
+ wifi_ap_enable = 1;
+
if(wifi_ap_enable) {
/* Default AP ssid and password. */
if(!wifi_ap_ssid && wificfg_default_ssid) {
@@ -352,37 +352,43 @@ extern "C" void wifi_task(void *pvParameters) {
uint8_t status = 0;
uint8_t retries = 30;
- while (1) {
+ if(wifi_sta_enable) {
+ while (1) {
- retries = 30;
- while ((status != STATION_GOT_IP) && (retries)) {
- status = sdk_wifi_station_get_connect_status();
- printf("%s: status = %d [%d retries left]\n\r", __func__, status, retries);
- if(status == STATION_WRONG_PASSWORD) {
- printf("WiFi: wrong password\n\r");
- break;
- } else if(status == STATION_NO_AP_FOUND) {
- printf("WiFi: AP not found\n\r");
- break;
- } else if(status == STATION_CONNECT_FAIL) {
- printf("WiFi: connection failed\r\n");
- break;
+ retries = 30;
+ while ((status != STATION_GOT_IP) && (retries)) {
+ status = sdk_wifi_station_get_connect_status();
+ printf("%s: status = %d [%d retries left]\n\r", __func__, status, retries);
+ if(status == STATION_WRONG_PASSWORD) {
+ printf("WiFi: wrong password\n\r");
+ break;
+ } else if(status == STATION_NO_AP_FOUND) {
+ printf("WiFi: AP not found\n\r");
+ break;
+ } else if(status == STATION_CONNECT_FAIL) {
+ printf("WiFi: connection failed\r\n");
+ break;
+ }
+ vTaskDelay(1000 / portTICK_PERIOD_MS);
+ --retries;
+ }
+ if(status == STATION_GOT_IP) {
+ printf("WiFi: Connected\n\r");
+ xSemaphoreGive(wifi_alive);
+ taskYIELD();
}
- vTaskDelay(1000 / portTICK_PERIOD_MS);
- --retries;
- }
- if(status == STATION_GOT_IP) {
- printf("WiFi: Connected\n\r");
- xSemaphoreGive(wifi_alive);
- taskYIELD();
- }
- while ((status = sdk_wifi_station_get_connect_status()) == STATION_GOT_IP) {
- xSemaphoreGive(wifi_alive);
- taskYIELD();
+ while ((status = sdk_wifi_station_get_connect_status()) == STATION_GOT_IP) {
+ xSemaphoreGive(wifi_alive);
+ taskYIELD();
+ }
+ printf("WiFi: disconnected\n\r");
+ sdk_wifi_station_disconnect();
+ vTaskDelay(10000 / portTICK_PERIOD_MS);
+ }
+ } else {
+ while(1) {
+ vTaskDelay(10000 / portTICK_PERIOD_MS);
}
- printf("WiFi: disconnected\n\r");
- sdk_wifi_station_disconnect();
- vTaskDelay(10000 / portTICK_PERIOD_MS);
}
}
\ No newline at end of file
diff --git a/peripherals/cc48x6/firmware/Makefile b/peripherals/cc48x6/firmware/Makefile
index 216f2fa..d73a2aa 100644
--- a/peripherals/cc48x6/firmware/Makefile
+++ b/peripherals/cc48x6/firmware/Makefile
@@ -20,9 +20,9 @@ TARGET = stm32f030c8t_test
# building variables
######################################
# debug build?
-DEBUG = 1
+DEBUG = 0
# optimization
-OPT = -O3
+OPT = -O3 -flto
#######################################
diff --git a/peripherals/cc48x6/firmware/Src/main.c b/peripherals/cc48x6/firmware/Src/main.c
index 1fdef79..798b93f 100644
--- a/peripherals/cc48x6/firmware/Src/main.c
+++ b/peripherals/cc48x6/firmware/Src/main.c
@@ -161,7 +161,6 @@ void setDAC(uint8_t channel, uint16_t val) {
*/
int main(void) {
/* USER CODE BEGIN 1 */
-
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/