forked from j3d1/fiatlux
a liitle more stable
This commit is contained in:
parent
baf6f8bb45
commit
aa32239740
11 changed files with 221 additions and 136 deletions
111
firmware/lux.cpp
111
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 <string.h>
|
||||
#include <FreeRTOS.h>
|
||||
#include <task.h>
|
||||
|
||||
#include <esp/spi.h>
|
||||
#include <ws2812_i2s/ws2812_i2s.h>
|
||||
#include <cstdio>
|
||||
|
||||
extern "C" {
|
||||
#include <sysparam.h>
|
||||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue