This commit is contained in:
j3d1 2022-09-24 07:48:47 +02:00
parent 9c5fb65a90
commit 1263d7836f
6 changed files with 105 additions and 35 deletions

View file

@ -3,6 +3,7 @@
//
#include "lux.h"
#include "log.h"
#include <string.h>
#include <FreeRTOS.h>
@ -15,6 +16,17 @@ extern "C" {
#include <sysparam.h>
}
const auto htons = [](uint16_t x) -> uint16_t {
return ((x) << 8 & 0xFF00) | ((x) >> 8 & 0x00FF);
};
const auto &ntohs = htons;
const auto htonl = [](uint32_t x) -> uint32_t {
return ((x) << 24 & 0xFF000000UL) | ((x) << 8 & 0x00FF0000UL) | ((x) >> 8 & 0x0000FF00UL) |
((x) >> 24 & 0x000000FFUL);
};
const auto &ntohl = htonl;
struct apa10xx_pixel_t {
struct {
unsigned int mod: 5, marker: 3;
@ -60,7 +72,8 @@ namespace fiatlux {
hal_error_t(const char *, hal_error_t *cause) {}
};
constexpr hal_error_t empty_error;
constexpr hal_error_t
empty_error;
enum class hal_module_t {
NONE, SIGNAL, RELAIS, SPI_DIMMER, WS28X, APA10X
@ -264,7 +277,55 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
fiatlux::signal::setup();
fiatlux::relais::setup();
fiatlux::apa10x::setup();
//fiatlux::apa10x::setup();
spi_init(1, SPI_MODE0, SPI_FREQ_DIV_500K, true, SPI_BIG_ENDIAN, false);
/*
CC48 API:
- 12 x 16bit registers
- [2*n] = 12bit constant current value
- [2*n+1] = 8bit PWM value
*/
uint32_t dummy = 0;
union {
struct {
unsigned dat: 16;
unsigned addr: 12;
unsigned op: 4;
} __attribute__((packed));
uint32_t _;
} frame = {._=0};
frame.addr = 0x123;
frame.dat = 0xAA55;
frame.op = 0x7;
auto transfer = [](uint32_t val) -> uint32_t {
uint32_t out = val;
uint32_t in;
spi_transfer(1, &out, &in, 1, SPI_32BIT);
return in;
};
dummy = transfer(frame._);
if(dummy) {
syslog("> ");
syslog_i32(dummy);
syslog("\n");
}
syslog("< ");
syslog_i32(frame._);
syslog("\n");
dummy = 0;
for (volatile int i = 0; i < 512 * 16; ++i);
frame._ = transfer(dummy);
if(frame._) {
syslog("> ");
syslog_i32(frame._);
syslog("\n");
}
while (true) {
/*for (int j = 0; j < 64; j++) {
@ -289,9 +350,9 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
pixel = next_colour(c);
}*/
for (auto &led: leds) {
led = next_color(c);
}
//for (auto &led: leds) {
// led = next_color(c);
//}
for (int i = 0; i < 120; i++)
pixels[i] = {{top_color.r, top_color.g, top_color.b, top_color.a}};
@ -299,9 +360,8 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
for (int i = 120; i < 240; i++)
pixels[i] = {{bottom_color.r, bottom_color.g, bottom_color.b, bottom_color.a}};
ws2812_i2s_update(pixels, PIXEL_RGBW);
fiatlux::write_channel((uint8_t *) &leds[0], lux_apa10xx_number, 4, fiatlux::hal_module_t::APA10X);
//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);
@ -312,5 +372,7 @@ extern "C" [[noreturn]] void lux_task(void *pvParameters) {
fiatlux::signal::write_data(true);
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}