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; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -25,24 +25,24 @@ | |||||||
| #define FL3729_REG_OUTPUT       0x01 | #define FL3729_REG_OUTPUT       0x01 | ||||||
| #define FL3729_REG_SCALING      0x90 | #define FL3729_REG_SCALING      0x90 | ||||||
| #define FL3729_REG_CONFIG       0xA0 | #define FL3729_REG_CONFIG       0xA0 | ||||||
| #define FL3729_REG_G_CURRENT    0xA1    // global current
 | #define FL3729_REG_G_CURRENT    0xA1        // global current
 | ||||||
| #define FL3729_REG_PUPD         0xB0    // pull up / pull down
 | #define FL3729_REG_PUPD         0xB0        // pull up / pull down
 | ||||||
| #define FL3729_REG_SS           0xB1    // spread spectrum
 | #define FL3729_REG_SS           0xB1        // spread spectrum
 | ||||||
| #define FL3729_REG_PWM          0xB2 | #define FL3729_REG_PWM          0xB2 | ||||||
| #define FL3729_REG_RESET        0xCF | #define FL3729_REG_RESET        0xCF | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| #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 pep[LED_PEP_COUNT]; |         uint8_t all[LED_ALL_COUNT]; | ||||||
|         uint8_t hat[LED_HAT_COUNT]; |         struct section { | ||||||
|  |             uint8_t pep[LED_PEP_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
	
	Block a user