This commit is contained in:
j3d1 2023-01-19 18:11:13 +01:00
parent 9de089083c
commit 1acaf657f0
6 changed files with 160 additions and 50 deletions

View file

@ -36,10 +36,12 @@ struct apa10xx_pixel_t {
uint8_t r = 0;
};
rgba_t top_color;
rgba_t bottom_color;
volatile rgba_t top_color;
volatile rgba_t bottom_color;
volatile uint16_t light_value;
volatile uint16_t peripheral_version;
namespace fiatlux {
struct hal_error_t {
@ -237,12 +239,28 @@ uint16_t spi_transfer_16_duplex(uint8_t bus, uint32_t val) {
return in;
};
void reset_bus() {
gpio_write(4, false);
for (volatile int k = 0; k < 128; ++k);
gpio_write(4, true);
}
/* This task uses the high level GPIO API (esp_gpio.h) to blink an LED.
*
*/
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);
int32_t lux_ws2812_number = 240;
auto ret = sysparam_get_int32("lux_ws2812_number", &lux_ws2812_number);
if(ret != SYSPARAM_OK)
@ -266,9 +284,6 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
//fiatlux::spi_dimmer::setup();
fiatlux::signal::setup();
fiatlux::relais::setup();
//fiatlux::apa10x::setup();
spi_init(1, SPI_MODE0, SPI_FREQ_DIV_2M, true, SPI_BIG_ENDIAN, false);
@ -287,8 +302,20 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
uint16_t _;
} frame = {._=0};
light_value = 0xFFF;
{
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);
syslog("peripheral_version: ");
syslog_i32(peripheral_version);
syslog("\n");
}
light_value = 0xFFF;
uint16_t last_light_value = 0xFFFF;
while (true) {
@ -301,30 +328,57 @@ 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;
for (int i = 0; i < 6; ++i) {
frame.addr = i;
frame.addr = i + 1;
frame.dat = light_value;
uint16_t reply = spi_transfer_16_duplex(1, frame._);
reply = spi_transfer_16_duplex(1, frame._);
/*if(!i) {
if(reply != last_frame)
error_count++;
{
syslog(" > ");
syslog_i32(frame._);
if(reply) {
syslog(" < ");
syslog_i32(reply);
}
syslog(" < ");
syslog_i32(reply);
syslog(" -- ");
syslog_i32(last_frame);
syslog("\n");
}*/
}
for (volatile int k = 0; k < 512; ++k);
last_frame = frame._;
for (volatile int k = 0; k < 512 * 2; ++k);
}
last_light_value = light_value;
}
reply = spi_transfer_16_duplex(1, 0x0000);
if(reply != last_frame)
error_count++;
vTaskDelay(200 / portTICK_PERIOD_MS);
{
syslog(" > ");
syslog_i32(frame._);
syslog(" < ");
syslog_i32(reply);
syslog(" -- ");
syslog_i32(last_frame);
syslog("\n");
}
if(!error_count) {
last_light_value = light_value;
} else {
syslog("reset_bus\n");
reset_bus();
}
vTaskDelay(5000 / portTICK_PERIOD_MS);
}
for (int i = 0; i < 120; i++)
pixels[i] = {{top_color.r, top_color.g, top_color.b, top_color.a}};
@ -334,6 +388,8 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
ws2812_i2s_update(pixels, PIXEL_RGBW);
vTaskDelay(200 / portTICK_PERIOD_MS);
/*//fiatlux::write_channel((uint8_t *) &leds[0], lux_apa10xx_number, 4, fiatlux::hal_module_t::APA10X);
vTaskDelay(200 / portTICK_PERIOD_MS);
fiatlux::relais::write_data(true, false);