From 946d3c1451ca4d605c827075c1225b219cbb11c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Sat, 19 Aug 2017 17:47:56 +0200 Subject: [PATCH] Add kStatus_Uhk_IdleSlave and ditch the global IsI2cTransferScheduled. Make slave drivers return status_t and utilize that value instead. --- right/src/i2c.c | 3 --- right/src/i2c.h | 1 - right/src/slave_drivers/is31fl3731_driver.c | 19 +++++++++++-------- right/src/slave_drivers/is31fl3731_driver.h | 2 +- right/src/slave_drivers/uhk_module_driver.c | 14 +++++++++----- right/src/slave_drivers/uhk_module_driver.h | 2 +- right/src/slave_scheduler.c | 13 +++++++------ right/src/slave_scheduler.h | 10 +++++++++- 8 files changed, 38 insertions(+), 26 deletions(-) diff --git a/right/src/i2c.c b/right/src/i2c.c index 0327986..5e7067b 100644 --- a/right/src/i2c.c +++ b/right/src/i2c.c @@ -1,7 +1,6 @@ #include "i2c.h" i2c_master_handle_t I2cMasterHandle; -bool IsI2cTransferScheduled; i2c_master_transfer_t masterTransfer; status_t I2cAsyncWrite(uint8_t i2cAddress, uint8_t *data, size_t dataSize) @@ -11,7 +10,6 @@ status_t I2cAsyncWrite(uint8_t i2cAddress, uint8_t *data, size_t dataSize) masterTransfer.data = data; masterTransfer.dataSize = dataSize; status_t status = I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer); - IsI2cTransferScheduled = status == kStatus_Success; return status; } @@ -22,6 +20,5 @@ status_t I2cAsyncRead(uint8_t i2cAddress, uint8_t *data, size_t dataSize) masterTransfer.data = data; masterTransfer.dataSize = dataSize; status_t status = I2C_MasterTransferNonBlocking(I2C_MAIN_BUS_BASEADDR, &I2cMasterHandle, &masterTransfer); - IsI2cTransferScheduled = status == kStatus_Success; return status; } diff --git a/right/src/i2c.h b/right/src/i2c.h index c2a0583..752e40e 100644 --- a/right/src/i2c.h +++ b/right/src/i2c.h @@ -40,7 +40,6 @@ // Variables: extern i2c_master_handle_t I2cMasterHandle; - extern bool IsI2cTransferScheduled; // Functions: diff --git a/right/src/slave_drivers/is31fl3731_driver.c b/right/src/slave_drivers/is31fl3731_driver.c index 8fe953d..87a433c 100644 --- a/right/src/slave_drivers/is31fl3731_driver.c +++ b/right/src/slave_drivers/is31fl3731_driver.c @@ -68,7 +68,8 @@ void LedSlaveDriver_Init(uint8_t ledDriverId) { LedDisplay_SetText(3, "ABC"); } -void LedSlaveDriver_Update(uint8_t ledDriverId) { +status_t LedSlaveDriver_Update(uint8_t ledDriverId) { + status_t status = kStatus_Uhk_IdleSlave; led_driver_state_t *currentLedDriverState = LedDriverStates + ledDriverId; uint8_t *ledDriverPhase = ¤tLedDriverState->phase; uint8_t ledDriverAddress = currentLedDriverState->i2cAddress; @@ -79,26 +80,26 @@ void LedSlaveDriver_Update(uint8_t ledDriverId) { if (ledDriverId == LedDriverId_Left && !Slaves[SlaveId_LeftKeyboardHalf].isConnected) { break; } - I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer)); + status = I2cAsyncWrite(ledDriverAddress, setFunctionFrameBuffer, sizeof(setFunctionFrameBuffer)); *ledDriverPhase = LedDriverPhase_SetShutdownModeNormal; break; case LedDriverPhase_SetShutdownModeNormal: - I2cAsyncWrite(ledDriverAddress, setShutdownModeNormalBuffer, sizeof(setShutdownModeNormalBuffer)); + status = I2cAsyncWrite(ledDriverAddress, setShutdownModeNormalBuffer, sizeof(setShutdownModeNormalBuffer)); *ledDriverPhase = LedDriverPhase_SetFrame1; break; case LedDriverPhase_SetFrame1: - I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer)); + status = I2cAsyncWrite(ledDriverAddress, setFrame1Buffer, sizeof(setFrame1Buffer)); *ledDriverPhase = LedDriverPhase_InitLedControlRegisters; break; case LedDriverPhase_InitLedControlRegisters: - I2cAsyncWrite(ledDriverAddress, currentLedDriverState->setupLedControlRegistersCommand, LED_CONTROL_REGISTERS_COMMAND_LENGTH); + status = I2cAsyncWrite(ledDriverAddress, currentLedDriverState->setupLedControlRegistersCommand, LED_CONTROL_REGISTERS_COMMAND_LENGTH); *ledDriverPhase = LedDriverPhase_InitLedValues; break; case LedDriverPhase_InitLedValues: updatePwmRegistersBuffer[0] = FRAME_REGISTER_PWM_FIRST + *ledIndex; uint8_t chunkSize = MIN(LED_DRIVER_LED_COUNT - *ledIndex, PMW_REGISTER_UPDATE_CHUNK_SIZE); memcpy(updatePwmRegistersBuffer+1, currentLedDriverState->sourceLedValues + *ledIndex, chunkSize); - I2cAsyncWrite(ledDriverAddress, updatePwmRegistersBuffer, chunkSize + 1); + status = I2cAsyncWrite(ledDriverAddress, updatePwmRegistersBuffer, chunkSize + 1); *ledIndex += chunkSize; if (*ledIndex >= LED_DRIVER_LED_COUNT) { *ledIndex = 0; @@ -129,7 +130,7 @@ void LedSlaveDriver_Update(uint8_t ledDriverId) { bool foundStartIndex = count < LED_DRIVER_LED_COUNT; if (!foundStartIndex) { *ledIndex = 0; - return; + break; } uint8_t maxChunkSize = MIN(LED_DRIVER_LED_COUNT - startLedIndex, PMW_REGISTER_UPDATE_CHUNK_SIZE); @@ -145,7 +146,7 @@ void LedSlaveDriver_Update(uint8_t ledDriverId) { uint8_t length = endLedIndex - startLedIndex + 1; memcpy(updatePwmRegistersBuffer+1, currentLedDriverState->sourceLedValues + startLedIndex, length); memcpy(currentLedDriverState->targetLedValues + startLedIndex, currentLedDriverState->sourceLedValues + startLedIndex, length); - I2cAsyncWrite(ledDriverAddress, updatePwmRegistersBuffer, length+1); + status = I2cAsyncWrite(ledDriverAddress, updatePwmRegistersBuffer, length+1); *ledIndex += length; if (*ledIndex >= LED_DRIVER_LED_COUNT) { *ledIndex = 0; @@ -153,6 +154,8 @@ void LedSlaveDriver_Update(uint8_t ledDriverId) { break; } } + + return status; } void SetLeds(uint8_t ledBrightness) diff --git a/right/src/slave_drivers/is31fl3731_driver.h b/right/src/slave_drivers/is31fl3731_driver.h index f6a9d60..804ad83 100644 --- a/right/src/slave_drivers/is31fl3731_driver.h +++ b/right/src/slave_drivers/is31fl3731_driver.h @@ -46,7 +46,7 @@ // Functions: extern void LedSlaveDriver_Init(uint8_t ledDriverId); - extern void LedSlaveDriver_Update(uint8_t ledDriverId); + extern status_t LedSlaveDriver_Update(uint8_t ledDriverId); extern void SetLeds(uint8_t ledBrightness); #endif diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index 9eed867..ca309e8 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -1,5 +1,6 @@ #include "i2c_addresses.h" #include "i2c.h" +#include "slave_scheduler.h" #include "slave_drivers/uhk_module_driver.h" #include "slave_protocol.h" #include "main.h" @@ -19,18 +20,19 @@ void UhkModuleSlaveDriver_Init(uint8_t uhkModuleId) uhkModuleState->ledPwmBrightness = 0x64; } -void UhkModuleSlaveDriver_Update(uint8_t uhkModuleId) +status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId) { + status_t status = kStatus_Uhk_IdleSlave; uhk_module_state_t *uhkModuleInternalState = UhkModuleStates + uhkModuleId; switch (uhkModulePhase) { case UhkModulePhase_SendKeystatesRequestCommand: txBuffer[0] = SlaveCommand_GetKeyStates; - I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 1); + status = I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 1); uhkModulePhase = UhkModulePhase_ReceiveKeystates; break; case UhkModulePhase_ReceiveKeystates: - I2cAsyncRead(I2C_ADDRESS_LEFT_KEYBOARD_HALF, rxBuffer, KEY_STATE_BUFFER_SIZE); + status = I2cAsyncRead(I2C_ADDRESS_LEFT_KEYBOARD_HALF, rxBuffer, KEY_STATE_BUFFER_SIZE); uhkModulePhase = UhkModulePhase_SendPwmBrightnessCommand; break; case UhkModulePhase_SendPwmBrightnessCommand: @@ -39,14 +41,16 @@ void UhkModuleSlaveDriver_Update(uint8_t uhkModuleId) } txBuffer[0] = SlaveCommand_SetLedPwmBrightness; txBuffer[1] = uhkModuleInternalState->ledPwmBrightness; - I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 2); + status = I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 2); uhkModulePhase = UhkModulePhase_SendTestLedCommand; break; case UhkModulePhase_SendTestLedCommand: txBuffer[0] = SlaveCommand_SetTestLed; txBuffer[1] = uhkModuleInternalState->isTestLedOn; - I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 2); + status = I2cAsyncWrite(I2C_ADDRESS_LEFT_KEYBOARD_HALF, txBuffer, 2); uhkModulePhase = UhkModulePhase_SendKeystatesRequestCommand; break; } + + return status; } diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index d67f27b..03d93ea 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -39,6 +39,6 @@ // Functions: extern void UhkModuleSlaveDriver_Init(uint8_t uhkModuleId); - extern void UhkModuleSlaveDriver_Update(uint8_t uhkModuleId); + extern status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleId); #endif diff --git a/right/src/slave_scheduler.c b/right/src/slave_scheduler.c index 4a38e3f..0083037 100644 --- a/right/src/slave_scheduler.c +++ b/right/src/slave_scheduler.c @@ -17,9 +17,9 @@ uhk_slave_t Slaves[] = { { .init = LedSlaveDriver_Init, .update = LedSlaveDriver_Update, .perDriverId = LedDriverId_Left }, }; -static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t status, void *userData) +static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t previousStatus, void *userData) { - IsI2cTransferScheduled = false; + bool isTransferScheduled = false; do { BridgeCounter++; @@ -27,14 +27,15 @@ static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, uhk_slave_t *previousSlave = Slaves + previousSlaveId; uhk_slave_t *currentSlave = Slaves + currentSlaveId; - previousSlave->isConnected = status == kStatus_Success; + previousSlave->isConnected = previousStatus == kStatus_Success; if (!currentSlave->isConnected) { currentSlave->init(currentSlave->perDriverId); } - currentSlave->update(currentSlave->perDriverId); - if (IsI2cTransferScheduled) { + status_t currentStatus = currentSlave->update(currentSlave->perDriverId); + isTransferScheduled = currentStatus == kStatus_Success; + if (isTransferScheduled) { currentSlave->isConnected = true; } @@ -44,7 +45,7 @@ static void bridgeProtocolCallback(I2C_Type *base, i2c_master_handle_t *handle, if (currentSlaveId >= (sizeof(Slaves) / sizeof(uhk_slave_t))) { currentSlaveId = 0; } - } while (!IsI2cTransferScheduled); + } while (!isTransferScheduled); } static void initSlaveDrivers() diff --git a/right/src/slave_scheduler.h b/right/src/slave_scheduler.h index baa5da3..ddaa018 100644 --- a/right/src/slave_scheduler.h +++ b/right/src/slave_scheduler.h @@ -14,7 +14,7 @@ } slave_id_t; typedef void (slave_init_t)(uint8_t); - typedef void (slave_update_t)(uint8_t); + typedef status_t (slave_update_t)(uint8_t); typedef struct { uint8_t perDriverId; // Identifies the slave instance on a per-driver basis @@ -23,6 +23,14 @@ bool isConnected; } uhk_slave_t; + typedef enum { + kStatusGroup_Uhk = -1, + } uhk_status_group_t; + + typedef enum { + kStatus_Uhk_IdleSlave = MAKE_STATUS(kStatusGroup_Uhk, 0), + } uhk_status_t; + // Variables: extern uhk_slave_t Slaves[];