From a89f0b675f2ca8b1d804faae533add8b8e29a40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 18 Mar 2017 01:12:44 +0100 Subject: [PATCH] Refactor sync LED driver control register initialization to async. --- right/src/bridge_protocol_scheduler.c | 1 + right/src/bridge_slave_led_driver_handler.c | 62 ++++++++++++++++++++- right/src/bridge_slave_led_driver_handler.h | 7 +++ right/src/led_driver.c | 48 ---------------- right/src/led_driver.h | 1 + 5 files changed, 70 insertions(+), 49 deletions(-) diff --git a/right/src/bridge_protocol_scheduler.c b/right/src/bridge_protocol_scheduler.c index 1249223..d524fa3 100644 --- a/right/src/bridge_protocol_scheduler.c +++ b/right/src/bridge_protocol_scheduler.c @@ -16,6 +16,7 @@ bool BridgeSlaveUhkModuleHandler(uint8_t uhkModuleId) { bridge_slave_t bridgeSlaves[] = { { .slaveHandler = BridgeSlaveUhkModuleHandler, .moduleId = 0 }, { .slaveHandler = BridgeSlaveLedDriverHandler, .moduleId = 0 }, + { .slaveHandler = BridgeSlaveLedDriverHandler, .moduleId = 1 }, }; static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData) diff --git a/right/src/bridge_slave_led_driver_handler.c b/right/src/bridge_slave_led_driver_handler.c index e9bb53a..a0e87f9 100644 --- a/right/src/bridge_slave_led_driver_handler.c +++ b/right/src/bridge_slave_led_driver_handler.c @@ -4,9 +4,69 @@ #define BUFFER_SIZE (LED_DRIVER_LED_COUNT + 1) uint8_t ledsBuffer[BUFFER_SIZE] = {FRAME_REGISTER_PWM_FIRST}; +uint8_t ledDriverStates[2] = {0}; +uint8_t buffer[LED_DRIVER_BUFFER_LENGTH]; + +uint8_t initLedControlRegistersMessage = {FRAME_REGISTER_LED_CONTROL_FIRST, }; + +uint8_t ledControlBufferLeft[] = { + FRAME_REGISTER_LED_CONTROL_FIRST, + 0b01111111, // key row 1 + 0b00111111, // display row 1 + 0b01011111, // keys row 2 + 0b00111111, // display row 2 + 0b01011111, // keys row 3 + 0b00111111, // display row 3 + 0b01111101, // keys row 4 + 0b00011111, // display row 4 + 0b00101111, // keys row 5 + 0b00011111, // display row 5 + 0b00000000, // keys row 6 + 0b00011111, // display row 6 + 0b00000000, // keys row 7 + 0b00011111, // display row 7 + 0b00000000, // keys row 8 + 0b00011111, // display row 8 + 0b00000000, // keys row 9 + 0b00011111, // display row 9 +}; + +uint8_t ledControlBufferRight[] = { + FRAME_REGISTER_LED_CONTROL_FIRST, + 0b01111111, // key row 1 + 0b00000000, // no display + 0b01111111, // keys row 2 + 0b00000000, // no display + 0b01111111, // keys row 3 + 0b00000000, // no display + 0b01111111, // keys row 4 + 0b00000000, // no display + 0b01111010, // keys row 5 + 0b00000000, // no display + 0b00000000, // keys row 6 + 0b00000000, // no display + 0b00000000, // keys row 7 + 0b00000000, // no display + 0b00000000, // keys row 8 + 0b00000000, // no display + 0b00000000, // keys row 9 + 0b00000000, // no display +}; bool BridgeSlaveLedDriverHandler(uint8_t ledDriverId) { - I2cAsyncWrite(I2C_ADDRESS_LED_DRIVER_LEFT, ledsBuffer, BUFFER_SIZE); + uint8_t *ledDriverState = ledDriverStates + ledDriverId; + uint8_t ledDriverAddress = ledDriverId ? I2C_ADDRESS_LED_DRIVER_LEFT : I2C_ADDRESS_LED_DRIVER_RIGHT; + uint8_t *ledControlBuffer = ledDriverId ? ledControlBufferLeft : ledControlBufferRight; + + switch (*ledDriverState) { + case LedDriverState_InitLedControlRegisters: + I2cAsyncWrite(ledDriverAddress, ledControlBuffer, sizeof(ledControlBufferLeft)); + *ledDriverState = LedDriverState_Initialized; + break; + case LedDriverState_Initialized: + I2cAsyncWrite(I2C_ADDRESS_LED_DRIVER_LEFT, ledsBuffer, BUFFER_SIZE); + break; + } return true; } diff --git a/right/src/bridge_slave_led_driver_handler.h b/right/src/bridge_slave_led_driver_handler.h index 1473548..9ecc3ab 100644 --- a/right/src/bridge_slave_led_driver_handler.h +++ b/right/src/bridge_slave_led_driver_handler.h @@ -5,6 +5,13 @@ #include "fsl_common.h" +// Typedefs: + +typedef enum { + LedDriverState_InitLedControlRegisters, + LedDriverState_Initialized, +} LedDriverState; + // Functions: extern bool BridgeSlaveLedDriverHandler(uint8_t ledDriverId); diff --git a/right/src/led_driver.c b/right/src/led_driver.c index a67c9fc..c6c46a4 100644 --- a/right/src/led_driver.c +++ b/right/src/led_driver.c @@ -31,53 +31,5 @@ void LedDriver_SetAllLedsTo(uint8_t val) for (i=FRAME_REGISTER_PWM_FIRST; i<=FRAME_REGISTER_PWM_LAST; i++) { LedDriver_WriteRegister(address, i, val); } - - uint8_t ledControlBufferRight[] = { - FRAME_REGISTER_LED_CONTROL_FIRST, - 0b01111111, // key row 1 - 0b00000000, // no display - 0b01111111, // keys row 2 - 0b00000000, // no display - 0b01111111, // keys row 3 - 0b00000000, // no display - 0b01111111, // keys row 4 - 0b00000000, // no display - 0b01111010, // keys row 5 - 0b00000000, // no display - 0b00000000, // keys row 6 - 0b00000000, // no display - 0b00000000, // keys row 7 - 0b00000000, // no display - 0b00000000, // keys row 8 - 0b00000000, // no display - 0b00000000, // keys row 9 - 0b00000000, // no display - }; - I2cWrite(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LED_DRIVER_RIGHT, - ledControlBufferRight, sizeof(ledControlBufferRight)); - - uint8_t ledControlBufferLeft[] = { - FRAME_REGISTER_LED_CONTROL_FIRST, - 0b01111111, // key row 1 - 0b00111111, // display row 1 - 0b01011111, // keys row 2 - 0b00111111, // display row 2 - 0b01011111, // keys row 3 - 0b00111111, // display row 3 - 0b01111101, // keys row 4 - 0b00011111, // display row 4 - 0b00101111, // keys row 5 - 0b00011111, // display row 5 - 0b00000000, // keys row 6 - 0b00011111, // display row 6 - 0b00000000, // keys row 7 - 0b00011111, // display row 7 - 0b00000000, // keys row 8 - 0b00011111, // display row 8 - 0b00000000, // keys row 9 - 0b00011111, // display row 9 - }; - I2cWrite(I2C_MAIN_BUS_BASEADDR, I2C_ADDRESS_LED_DRIVER_LEFT, - ledControlBufferLeft, sizeof(ledControlBufferLeft)); } } diff --git a/right/src/led_driver.h b/right/src/led_driver.h index 36c15a5..6adac76 100644 --- a/right/src/led_driver.h +++ b/right/src/led_driver.h @@ -30,6 +30,7 @@ #define LED_DRIVER_FRAME_FUNCTION 0x0B #define LED_DRIVER_LED_COUNT (2*8*9) + #define LED_DRIVER_BUFFER_LENGTH (LED_DRIVER_LED_COUNT + 1) #define FRAME_REGISTER_LED_CONTROL_FIRST 0x00 #define FRAME_REGISTER_LED_CONTROL_LAST 0x11