get LED matrix, RGBLED working; get sizzle program (matrix program 1) working
This commit is contained in:
parent
27cbc558ce
commit
bc7a378dcd
|
@ -14,7 +14,7 @@
|
||||||
|
|
||||||
#include "ch32v20x_adc.h"
|
#include "ch32v20x_adc.h"
|
||||||
#include "ch32v20x_bkp.h"
|
#include "ch32v20x_bkp.h"
|
||||||
#include "ch32v20x_can.h"
|
//#include "ch32v20x_can.h"
|
||||||
#include "ch32v20x_crc.h"
|
#include "ch32v20x_crc.h"
|
||||||
#include "ch32v20x_dbgmcu.h"
|
#include "ch32v20x_dbgmcu.h"
|
||||||
#include "ch32v20x_dma.h"
|
#include "ch32v20x_dma.h"
|
||||||
|
@ -26,7 +26,7 @@
|
||||||
#include "ch32v20x_pwr.h"
|
#include "ch32v20x_pwr.h"
|
||||||
#include "ch32v20x_rcc.h"
|
#include "ch32v20x_rcc.h"
|
||||||
#include "ch32v20x_rtc.h"
|
#include "ch32v20x_rtc.h"
|
||||||
#include "ch32v20x_spi.h"
|
//#include "ch32v20x_spi.h"
|
||||||
#include "ch32v20x_tim.h"
|
#include "ch32v20x_tim.h"
|
||||||
#include "ch32v20x_usart.h"
|
#include "ch32v20x_usart.h"
|
||||||
#include "ch32v20x_wwdg.h"
|
#include "ch32v20x_wwdg.h"
|
||||||
|
|
|
@ -50,13 +50,6 @@ void gpio_init()
|
||||||
|
|
||||||
gpio.GPIO_Speed = GPIO_Speed_2MHz;
|
gpio.GPIO_Speed = GPIO_Speed_2MHz;
|
||||||
|
|
||||||
// per the datasheet, PB8 is an output-only pin on this specific submodel.
|
|
||||||
// however, the datasheet later conflicts and says this is A/I/O pin.
|
|
||||||
// so we'll try to use it as an input anyway.
|
|
||||||
gpio.GPIO_Mode = GPIO_Mode_IN_FLOATING;
|
|
||||||
gpio.GPIO_Pin = GPIO_Pin_8;
|
|
||||||
GPIO_Init(GPIOB, &gpio);
|
|
||||||
|
|
||||||
// unused osc pins
|
// unused osc pins
|
||||||
gpio.GPIO_Mode = GPIO_Mode_IPD;
|
gpio.GPIO_Mode = GPIO_Mode_IPD;
|
||||||
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_7;
|
gpio.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_7;
|
||||||
|
@ -98,7 +91,7 @@ void gpio_init()
|
||||||
gpio.GPIO_Pin = GPIO_Pin_15;
|
gpio.GPIO_Pin = GPIO_Pin_15;
|
||||||
GPIO_Init(GPIOA, &gpio);
|
GPIO_Init(GPIOA, &gpio);
|
||||||
|
|
||||||
// I2C on-board comms
|
// I2C SCL, SCA for on-board devices
|
||||||
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
|
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
|
||||||
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
gpio.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
|
||||||
GPIO_Init(GPIOB, &gpio);
|
GPIO_Init(GPIOB, &gpio);
|
||||||
|
@ -139,6 +132,10 @@ int main(void)
|
||||||
// configure systick interrupt
|
// configure systick interrupt
|
||||||
systick_init();
|
systick_init();
|
||||||
|
|
||||||
|
rgb[0] = 10;
|
||||||
|
rgb[1] = 10;
|
||||||
|
rgb[2] = 10;
|
||||||
|
|
||||||
// do system shit
|
// do system shit
|
||||||
while(1) {
|
while(1) {
|
||||||
__WFI();
|
__WFI();
|
||||||
|
|
|
@ -9,27 +9,36 @@
|
||||||
#include "i2c.h"
|
#include "i2c.h"
|
||||||
|
|
||||||
|
|
||||||
/* sends the IS31FL3729 general config.
|
|
||||||
|
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t global_current)
|
||||||
|
{
|
||||||
|
i2c_write_reg_8b(i2c_addr, FL3729_REG_G_CURRENT, global_current);
|
||||||
|
}
|
||||||
|
|
||||||
|
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current)
|
||||||
|
{
|
||||||
|
if (cs > 0xf) return;
|
||||||
|
|
||||||
|
i2c_write_reg_8b(i2c_addr, FL3729_REG_SCALING + cs, current);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sends the IS31FL3729 initial config.
|
||||||
* does not configure per-channel current sink limits; do that separately.
|
* does not configure per-channel current sink limits; do that separately.
|
||||||
* does not configure other sane defaults; do that separately.
|
* does not configure other sane defaults; do that separately.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current)
|
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current)
|
||||||
{
|
{
|
||||||
uint8_t buf;
|
|
||||||
|
|
||||||
// enable device
|
// enable device
|
||||||
#ifdef FL3729_SDB_PORT
|
#ifdef FL3729_SDB_PORT
|
||||||
FL3729_SDB_PORT->BSHR = FL3729_SDB_PIN;
|
FL3729_SDB_PORT->BSHR = FL3729_SDB_PIN;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// reset config registers
|
// reset config registers
|
||||||
buf = FL3729_RESET_VALUE;
|
i2c_write_reg_8b(i2c_addr, FL3729_REG_CONFIG, FL3729_RESET_VALUE);
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_RESET, &buf, 1);
|
|
||||||
|
|
||||||
// write initial config
|
// write initial config
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_CONFIG, &config, 1);
|
i2c_write_reg_8b(i2c_addr, FL3729_REG_CONFIG, config);
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_G_CURRENT, &global_current, 1);
|
is31fl3729_set_global_current(i2c_addr, global_current);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t is31fl3729_get_addr(uint8_t adpin)
|
uint8_t is31fl3729_get_addr(uint8_t adpin)
|
||||||
|
@ -38,26 +47,14 @@ uint8_t is31fl3729_get_addr(uint8_t adpin)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current)
|
|
||||||
{
|
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_G_CURRENT, ¤t, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current)
|
|
||||||
{
|
|
||||||
if (cs > 0xf) return;
|
|
||||||
|
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_SCALING + cs, ¤t, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* sets current limit of multiple outputs simultaneously, starting from CS1.
|
* sets current limit of multiple outputs simultaneously, starting from CS1.
|
||||||
* useful for initial register configuration.
|
* useful for initial register configuration.
|
||||||
*/
|
*/
|
||||||
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, uint8_t count)
|
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, const uint8_t *current, uint8_t count)
|
||||||
{
|
{
|
||||||
if (!count) return;
|
if (!count) return;
|
||||||
count &= 0xf;
|
if (count > 16) count = 16;
|
||||||
|
|
||||||
i2c_write_addr1b(i2c_addr, FL3729_REG_SCALING, current, count);
|
i2c_write_addr1b(i2c_addr, FL3729_REG_SCALING, current, count);
|
||||||
}
|
}
|
||||||
|
@ -67,9 +64,9 @@ void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, ui
|
||||||
* sw: first switch segment to update. usually set this to 1 for the first switch.
|
* sw: first switch segment to update. usually set this to 1 for the first switch.
|
||||||
* if set to 0, will default to 1.
|
* if set to 0, will default to 1.
|
||||||
* *out: output data buffer
|
* *out: output data buffer
|
||||||
* len: length of buffer
|
* len: length of buffer. up to end user to not exceed writing beyond register 0x90.
|
||||||
*/
|
*/
|
||||||
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, uint8_t *out, uint8_t len)
|
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, const uint8_t *out, uint8_t len)
|
||||||
{
|
{
|
||||||
if (!sw) sw = 1;
|
if (!sw) sw = 1;
|
||||||
|
|
||||||
|
|
|
@ -34,15 +34,15 @@
|
||||||
|
|
||||||
#define FL3729_GCC_MAX 64 // maximum global current level
|
#define FL3729_GCC_MAX 64 // maximum global current level
|
||||||
|
|
||||||
#define FL3729_CONF_SHDN_ENA 0
|
#define FL3729_CONF_SSD_SHDN (0 << 0) // software shutdown
|
||||||
#define FL3729_CONF_SHDN_DIS ((1 << 0) << 0)
|
#define FL3729_CONF_SSD_NRML (1 << 0) // normal operation
|
||||||
|
|
||||||
#define FL3729_CONF_OSDE_OFF 0
|
#define FL3729_CONF_OSDE_OFF (0 << 1)
|
||||||
#define FL3729_CONF_OSDE_OPEN ((1 << 0) << 1)
|
#define FL3729_CONF_OSDE_OPEN (1 << 1)
|
||||||
#define FL3729_CONF_OSDE_SHORT ((1 << 1) << 1)
|
#define FL3729_CONF_OSDE_SHORT (2 << 1)
|
||||||
|
|
||||||
#define FL3729_CONF_LOGIC_LOLEV 0
|
#define FL3729_CONF_LOGIC_LOLEV (0 << 3)
|
||||||
#define FL3729_CONF_LOGIC_HILEV ((1 << 0) << 3)
|
#define FL3729_CONF_LOGIC_HILEV (1 << 3)
|
||||||
|
|
||||||
#define FL3729_CONF_MATRIX_9x15 0x00
|
#define FL3729_CONF_MATRIX_9x15 0x00
|
||||||
#define FL3729_CONF_MATRIX_8x16 0x10
|
#define FL3729_CONF_MATRIX_8x16 0x10
|
||||||
|
@ -68,25 +68,15 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
typedef struct IS31FL3729_Conf {
|
|
||||||
uint8_t ad_pin;
|
|
||||||
uint8_t config;
|
|
||||||
uint8_t global_brightness;
|
|
||||||
} IS31FL3729_Conf;
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current);
|
void is31fl3729_init(uint8_t i2c_addr, uint8_t config, uint8_t global_current);
|
||||||
|
|
||||||
uint8_t is31fl3729_get_addr(uint8_t adpin);
|
uint8_t is31fl3729_get_addr(uint8_t adpin);
|
||||||
|
|
||||||
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t current);
|
void is31fl3729_set_global_current(uint8_t i2c_addr, uint8_t global_current);
|
||||||
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current);
|
void is31fl3729_set_scaling_current(uint8_t i2c_addr, uint8_t cs, uint8_t current);
|
||||||
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, uint8_t *current, uint8_t count);
|
void is31fl3729_set_scaling_current_multi(uint8_t i2c_addr, const uint8_t *current, uint8_t count);
|
||||||
|
|
||||||
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, uint8_t *out, uint8_t len);
|
void is31fl3729_set_outputs(uint8_t i2c_addr, uint8_t sw, const uint8_t *out, uint8_t len);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -90,7 +90,7 @@ static uint16_t checksum()
|
||||||
|
|
||||||
void userconf_load()
|
void userconf_load()
|
||||||
{
|
{
|
||||||
uint8_t valid;
|
uint8_t valid = 0;
|
||||||
|
|
||||||
uint8_t page = CONF_FLASH_PAGES;
|
uint8_t page = CONF_FLASH_PAGES;
|
||||||
|
|
||||||
|
|
|
@ -15,21 +15,17 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define I2C_TIMEOUT 0xffff
|
#define I2C_TIMEOUT 0xefff
|
||||||
#define I2C_TIMEOUT_ACK_POLL 0x180
|
#define I2C_TIMEOUT_ACK_POLL 0x180
|
||||||
|
|
||||||
static uint32_t timeout;
|
static uint16_t timeout;
|
||||||
|
|
||||||
|
|
||||||
void i2c_init()
|
void i2c_init()
|
||||||
{
|
{
|
||||||
GPIO_InitTypeDef gpio = {0};
|
|
||||||
I2C_InitTypeDef i2c = {0};
|
I2C_InitTypeDef i2c = {0};
|
||||||
|
|
||||||
gpio.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2;
|
// ensure GPIO pins are configured before initializing
|
||||||
gpio.GPIO_Mode = GPIO_Mode_AF_OD;
|
|
||||||
gpio.GPIO_Speed = GPIO_Speed_2MHz;
|
|
||||||
GPIO_Init(GPIOC, &gpio);
|
|
||||||
|
|
||||||
i2c.I2C_ClockSpeed = 666666;
|
i2c.I2C_ClockSpeed = 666666;
|
||||||
i2c.I2C_Mode = I2C_Mode_I2C;
|
i2c.I2C_Mode = I2C_Mode_I2C;
|
||||||
|
@ -100,7 +96,7 @@ uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg)
|
||||||
return dat;
|
return dat;
|
||||||
}
|
}
|
||||||
|
|
||||||
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len)
|
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, const uint8_t *data, uint8_t len)
|
||||||
{
|
{
|
||||||
timeout = I2C_TIMEOUT;
|
timeout = I2C_TIMEOUT;
|
||||||
while((I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET) && timeout--);
|
while((I2C_GetFlagStatus(I2C1, I2C_FLAG_BUSY) != RESET) && timeout--);
|
||||||
|
@ -122,7 +118,9 @@ int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len)
|
||||||
if (!timeout) return -4;
|
if (!timeout) return -4;
|
||||||
|
|
||||||
while (len) {
|
while (len) {
|
||||||
while(I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) != RESET) {
|
// fixme: can get stuck here if address isn't found.
|
||||||
|
// somehow all the above passes but this will fail
|
||||||
|
if (I2C_GetFlagStatus(I2C1, I2C_FLAG_TXE) != RESET) {
|
||||||
I2C_SendData(I2C1, *data++);
|
I2C_SendData(I2C1, *data++);
|
||||||
len--;
|
len--;
|
||||||
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
|
while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED));
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
void i2c_init();
|
void i2c_init();
|
||||||
|
|
||||||
int8_t i2c_read_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len);
|
int8_t i2c_read_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len);
|
||||||
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, uint8_t *data, uint8_t len);
|
int8_t i2c_write_addr1b(uint8_t addr, uint8_t reg, const uint8_t *data, uint8_t len);
|
||||||
|
|
||||||
uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg);
|
uint8_t i2c_read_reg_8b(uint8_t addr, uint8_t reg);
|
||||||
void i2c_write_reg_8b(uint8_t addr, uint8_t reg, uint8_t dat);
|
void i2c_write_reg_8b(uint8_t addr, uint8_t reg, uint8_t dat);
|
||||||
|
|
|
@ -10,16 +10,16 @@
|
||||||
|
|
||||||
#define FL3729_SW_COUNT 4 // switches utilized
|
#define FL3729_SW_COUNT 4 // switches utilized
|
||||||
#define FL3729_CS_COUNT 16 // current sink outputs used by chip
|
#define FL3729_CS_COUNT 16 // current sink outputs used by chip
|
||||||
#define FL3729_G_CURRENT 16 // initial global current setting
|
#define FL3729_G_CURRENT 15 // initial global current setting
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const uint8_t cs_currents[FL3729_CS_COUNT] = {
|
static const uint8_t cs_currents[FL3729_CS_COUNT] = {
|
||||||
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
|
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
|
||||||
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
|
0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f, 0x1f
|
||||||
};
|
};
|
||||||
|
|
||||||
const uint16_t pwm_cie_256in_1024out[] = {
|
static const uint16_t pwm_cie_256in_1024out[] = {
|
||||||
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
|
0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 4, 5, 5, 6, 6, 7,
|
||||||
7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15,
|
7, 8, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13, 14, 15,
|
||||||
15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27,
|
15, 16, 17, 17, 18, 19, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27,
|
||||||
|
@ -70,10 +70,10 @@ void led_init()
|
||||||
|
|
||||||
// configure matrix
|
// configure matrix
|
||||||
is31fl3729_init(FL3729_ADDR,
|
is31fl3729_init(FL3729_ADDR,
|
||||||
FL3729_CONF_SHDN_DIS | FL3729_CONF_OSDE_OFF | FL3729_CONF_MATRIX_4x16,
|
FL3729_CONF_SSD_NRML | FL3729_CONF_OSDE_OFF | FL3729_CONF_MATRIX_4x16,
|
||||||
FL3729_G_CURRENT);
|
FL3729_G_CURRENT);
|
||||||
|
|
||||||
is31fl3729_set_scaling_current_multi(FL3729_ADDR, (uint8_t *)cs_currents, sizeof(cs_currents));
|
is31fl3729_set_scaling_current_multi(FL3729_ADDR, cs_currents, FL3729_CS_COUNT);
|
||||||
|
|
||||||
|
|
||||||
// configure rear RGBLED
|
// configure rear RGBLED
|
||||||
|
@ -94,7 +94,7 @@ void led_init()
|
||||||
TIM_CtrlPWMOutputs(RGB_TIM, ENABLE);
|
TIM_CtrlPWMOutputs(RGB_TIM, ENABLE);
|
||||||
TIM_OC1PreloadConfig(RGB_TIM, TIM_OCPreload_Disable);
|
TIM_OC1PreloadConfig(RGB_TIM, TIM_OCPreload_Disable);
|
||||||
TIM_ARRPreloadConfig(RGB_TIM, ENABLE);
|
TIM_ARRPreloadConfig(RGB_TIM, ENABLE);
|
||||||
TIM_Cmd(TIM1, ENABLE);
|
TIM_Cmd(RGB_TIM, ENABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void led_matrix_is_updated()
|
void led_matrix_is_updated()
|
||||||
|
@ -104,9 +104,41 @@ void led_matrix_is_updated()
|
||||||
|
|
||||||
void led_matrix_send()
|
void led_matrix_send()
|
||||||
{
|
{
|
||||||
|
int8_t i, j;
|
||||||
|
uint8_t out[64];
|
||||||
|
|
||||||
// only render when there's something to render
|
// only render when there's something to render
|
||||||
if (led_matrix_updated) {
|
if (led_matrix_updated) {
|
||||||
is31fl3729_set_outputs(FL3729_ADDR, 1, (uint8_t *)&led, FL3729_SW_COUNT * FL3729_CS_COUNT);
|
// convert led matrix
|
||||||
|
j = 0;
|
||||||
|
|
||||||
|
// the pepper body is linear; starts from top left,
|
||||||
|
// goes counter-clockwise, and ends at the top part
|
||||||
|
for (i = 0; i < LED_PEP_COUNT; i += 4) {
|
||||||
|
out[j + (16*0)] = led.section.pep[i + 0];
|
||||||
|
out[j + (16*1)] = led.section.pep[i + 1];
|
||||||
|
out[j + (16*2)] = led.section.pep[i + 2];
|
||||||
|
out[j + (16*3)] = led.section.pep[i + 3];
|
||||||
|
j++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// pepper hat is a bit more fucked up. I laid this out
|
||||||
|
// with the elements backwards. rushjob fuckup. oops.
|
||||||
|
// I would like to start from the bottom right, counter clockwise,
|
||||||
|
// ending up at pepper's top right.
|
||||||
|
// for (i = 0; i < LED_HAT_COUNT; i += 4) { // clockwise starting from bottom right
|
||||||
|
j = 15;
|
||||||
|
for (i = 0; i < LED_HAT_COUNT; i += 4) {
|
||||||
|
out[j + (16*0)] = led.section.hat[i + 0];
|
||||||
|
out[j + (16*1)] = led.section.hat[i + 1];
|
||||||
|
out[j + (16*2)] = led.section.hat[i + 2];
|
||||||
|
out[j + (16*3)] = led.section.hat[i + 3];
|
||||||
|
j--;
|
||||||
|
}
|
||||||
|
|
||||||
|
// and send
|
||||||
|
is31fl3729_set_outputs(FL3729_ADDR, 1, out, FL3729_SW_COUNT * FL3729_CS_COUNT);
|
||||||
|
led_matrix_updated = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define FL3729_ADDR (FL3729_BASE_ADDR | FL3729_ADPIN_GND)
|
#define FL3729_ADDR (FL3729_BASE_ADDR | FL3729_ADPIN_GND)
|
||||||
|
|
||||||
#define LED_PEP_COUNT 36 // all pepper body LEDs
|
#define LED_PEP_COUNT 36 // all pepper body LEDs
|
||||||
#define LED_PEP_NOTOP 31 // pepper body LEDs not including the part under the hat
|
#define LED_PEP_NOTOP 30 // pepper body LEDs not including the part under the hat
|
||||||
#define LED_HAT_COUNT 28 // all pepper hat LEDs
|
#define LED_HAT_COUNT 28 // all pepper hat LEDs
|
||||||
#define LED_ALL_COUNT (LED_PEP_COUNT + LED_HAT_COUNT)
|
#define LED_ALL_COUNT (LED_PEP_COUNT + LED_HAT_COUNT)
|
||||||
|
|
||||||
|
@ -24,10 +24,13 @@
|
||||||
|
|
||||||
typedef struct LedMatrix {
|
typedef struct LedMatrix {
|
||||||
union {
|
union {
|
||||||
|
uint8_t all[LED_ALL_COUNT];
|
||||||
|
struct section {
|
||||||
uint8_t pep[LED_PEP_COUNT];
|
uint8_t pep[LED_PEP_COUNT];
|
||||||
uint8_t hat[LED_HAT_COUNT];
|
uint8_t hat[LED_HAT_COUNT];
|
||||||
|
} section;
|
||||||
};
|
};
|
||||||
uint8_t all[LED_ALL_COUNT];
|
|
||||||
} LedMatrix;
|
} LedMatrix;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -57,17 +57,17 @@ static void pep_0_flash(uint8_t tick)
|
||||||
pep_work[1] ^= 0x1;
|
pep_work[1] ^= 0x1;
|
||||||
if (pep_work[1] & 1) {
|
if (pep_work[1] & 1) {
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = out;
|
led.section.pep[i] = out;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = out;
|
led.section.hat[i] = out;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = 0;
|
led.section.pep[i] = 0;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = 0;
|
led.section.hat[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ static void pep_1_sizzle(uint8_t tick)
|
||||||
rnd2 = prng_get32();
|
rnd2 = prng_get32();
|
||||||
|
|
||||||
// are we going to spike an LED?
|
// are we going to spike an LED?
|
||||||
trig = (trig > 0xf2) ? 1 : 0;
|
trig = (trig > 0xfa) ? 1 : 0;
|
||||||
|
|
||||||
if (trig) {
|
if (trig) {
|
||||||
// which LED?
|
// which LED?
|
||||||
|
@ -106,13 +106,18 @@ static void pep_1_sizzle(uint8_t tick)
|
||||||
for (i = 0; i < LED_PEP_NOTOP; i++) {
|
for (i = 0; i < LED_PEP_NOTOP; i++) {
|
||||||
if (trig && (rnd == i)) {
|
if (trig && (rnd == i)) {
|
||||||
// go bright on this LED
|
// go bright on this LED
|
||||||
led.pep[i] = 200;
|
led.section.pep[i] = 0xcf;
|
||||||
|
// also on the prior LED
|
||||||
|
if (i)
|
||||||
|
led.section.pep[i - 1] = 0x80;
|
||||||
|
else if (i < LED_PEP_NOTOP - 1)
|
||||||
|
led.section.pep[i + 1] = 0x80;
|
||||||
} else {
|
} else {
|
||||||
if (led.pep[i] < 48) led.pep[i]++;
|
if (led.section.pep[i] < 4) led.section.pep[i]++;
|
||||||
else if (led.pep[i] > 64) led.pep[i]--;
|
else if (led.section.pep[i] > 36) led.section.pep[i]--;
|
||||||
else {
|
else {
|
||||||
if (rnd2 & 1) led.pep[i]++;
|
if (rnd2 & 1) led.section.pep[i]++;
|
||||||
else led.pep[i]--;
|
else led.section.pep[i]--;
|
||||||
}
|
}
|
||||||
|
|
||||||
rnd2 >>= 1;
|
rnd2 >>= 1;
|
||||||
|
@ -121,8 +126,10 @@ static void pep_1_sizzle(uint8_t tick)
|
||||||
|
|
||||||
// the hat just gets lit normally
|
// the hat just gets lit normally
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = 200;
|
led.section.hat[i] = 0x3f;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
led_matrix_is_updated();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -148,12 +155,12 @@ static void pep_2_loops(uint8_t tick)
|
||||||
bot >>= 8;
|
bot >>= 8;
|
||||||
|
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
if (i == bot) led.pep[i] = 255;
|
if (i == bot) led.section.pep[i] = 255;
|
||||||
else if (led.pep[i]) led.pep[i]--;
|
else if (led.section.pep[i]) led.section.pep[i]--;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
if (i == top) led.hat[i] = 255;
|
if (i == top) led.section.hat[i] = 255;
|
||||||
else if (led.hat[i]) led.hat[i]--;
|
else if (led.section.hat[i]) led.section.hat[i]--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,10 +176,10 @@ static void pep_3_neon_sign(uint8_t tick)
|
||||||
|
|
||||||
// todo: implement flickering on/off
|
// todo: implement flickering on/off
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = (tick & 1) ? 255 : 200;
|
led.section.pep[i] = (tick & 1) ? 255 : 200;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = (tick & 1) ? 255 : 200;
|
led.section.hat[i] = (tick & 1) ? 255 : 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
led_matrix_is_updated();
|
led_matrix_is_updated();
|
||||||
|
@ -195,10 +202,10 @@ static void pep_4_alternate(uint8_t tick)
|
||||||
|
|
||||||
if (!pep_work[0]) {
|
if (!pep_work[0]) {
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = (pep_work[1] & 1) ? hi : lo;
|
led.section.pep[i] = (pep_work[1] & 1) ? hi : lo;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = (pep_work[1] & 1) ? lo : hi;
|
led.section.hat[i] = (pep_work[1] & 1) ? lo : hi;
|
||||||
}
|
}
|
||||||
|
|
||||||
pep_work[0] = userconf.pep_conf[PEP_4][PEP_4_CONF_FLASH_RATE];
|
pep_work[0] = userconf.pep_conf[PEP_4][PEP_4_CONF_FLASH_RATE];
|
||||||
|
@ -270,17 +277,17 @@ static void pep_5_nom(uint8_t tick)
|
||||||
|
|
||||||
// set pepper body LEDs to initial on state (or off if pepper is fully eated)
|
// set pepper body LEDs to initial on state (or off if pepper is fully eated)
|
||||||
for (i = 0; i < LED_PEP_NOTOP; i++) {
|
for (i = 0; i < LED_PEP_NOTOP; i++) {
|
||||||
led.pep[i] = end ? 255 : 0;
|
led.section.pep[i] = end ? 255 : 0;
|
||||||
}
|
}
|
||||||
// in this mode we need to light up the top pepper line
|
// in this mode we need to light up the top pepper line
|
||||||
for (i = LED_PEP_NOTOP; i < LED_PEP_COUNT; i++) {
|
for (i = LED_PEP_NOTOP; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = 200;
|
led.section.pep[i] = 200;
|
||||||
}
|
}
|
||||||
|
|
||||||
// clear eated pepper portions, gonna cry
|
// clear eated pepper portions, gonna cry
|
||||||
if (end) {
|
if (end) {
|
||||||
for (i = start; i < end; i++) {
|
for (i = start; i < end; i++) {
|
||||||
led.pep[i] = 0;
|
led.section.pep[i] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -294,7 +301,7 @@ static void pep_5_nom(uint8_t tick)
|
||||||
}
|
}
|
||||||
|
|
||||||
case 3: { // regen the pepper
|
case 3: { // regen the pepper
|
||||||
if (led.pep[pep_work[1]] >= 0xfe) {
|
if (led.section.pep[pep_work[1]] >= 0xfe) {
|
||||||
// next segment
|
// next segment
|
||||||
pep_work[1]++;
|
pep_work[1]++;
|
||||||
if (pep_work[i] >= (LED_PEP_NOTOP - pep_work[i])) {
|
if (pep_work[i] >= (LED_PEP_NOTOP - pep_work[i])) {
|
||||||
|
@ -302,9 +309,9 @@ static void pep_5_nom(uint8_t tick)
|
||||||
pep_work[0] = 0;
|
pep_work[0] = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
led.pep[pep_work[1]] += 2;
|
led.section.pep[pep_work[1]] += 2;
|
||||||
if (pep_work[1]) {
|
if (pep_work[1]) {
|
||||||
led.pep[LED_PEP_NOTOP - pep_work[1]] = led.pep[pep_work[1]];
|
led.section.pep[LED_PEP_NOTOP - pep_work[1]] = led.section.pep[pep_work[1]];
|
||||||
}
|
}
|
||||||
led_matrix_is_updated();
|
led_matrix_is_updated();
|
||||||
}
|
}
|
||||||
|
@ -368,10 +375,10 @@ void ledprog_pep_init()
|
||||||
|
|
||||||
// reset LEDs
|
// reset LEDs
|
||||||
for (i = 0; i < LED_PEP_COUNT; i++) {
|
for (i = 0; i < LED_PEP_COUNT; i++) {
|
||||||
led.pep[i] = 0;
|
led.section.pep[i] = 0;
|
||||||
}
|
}
|
||||||
for (i = 0; i < LED_HAT_COUNT; i++) {
|
for (i = 0; i < LED_HAT_COUNT; i++) {
|
||||||
led.hat[i] = 0;
|
led.section.hat[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// global program initialization
|
// global program initialization
|
||||||
|
|
|
@ -59,9 +59,40 @@ void ui_init()
|
||||||
btn[1].cb_release = ui_btn_release_cb;
|
btn[1].cb_release = ui_btn_release_cb;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint8_t tmp;
|
||||||
|
|
||||||
void ui_render()
|
void ui_render()
|
||||||
{
|
{
|
||||||
tick++;
|
tick++;
|
||||||
|
|
||||||
ledprog_pep[0](tick);
|
switch (mode) {
|
||||||
|
case MODE_RUN: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MODE_PROGRAM: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
case MODE_PARAMETER: {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// temporary: testing
|
||||||
|
ledprog_pep[1](tick);
|
||||||
|
/*
|
||||||
|
if ((tick & 3) == 3) {
|
||||||
|
|
||||||
|
tmp++;
|
||||||
|
tmp &= 0x3f;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 64; i++) {
|
||||||
|
if (i == tmp) led.all[i] = 255;
|
||||||
|
else led.all[i] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
led_matrix_is_updated();
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue