diff --git a/right/src/slave_drivers/uhk_module_driver.c b/right/src/slave_drivers/uhk_module_driver.c index c5b20c0..9de83cb 100644 --- a/right/src/slave_drivers/uhk_module_driver.c +++ b/right/src/slave_drivers/uhk_module_driver.c @@ -141,3 +141,10 @@ status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId) return status; } + +void UhkModuleSlaveDriver_Disconnect(uint8_t uhkModuleDriverId) +{ + if (uhkModuleDriverId == SlaveId_LeftKeyboardHalf) { + Slaves[SlaveId_LeftLedDriver].isConnected = false; + } +} diff --git a/right/src/slave_drivers/uhk_module_driver.h b/right/src/slave_drivers/uhk_module_driver.h index 5156801..fc995f9 100644 --- a/right/src/slave_drivers/uhk_module_driver.h +++ b/right/src/slave_drivers/uhk_module_driver.h @@ -57,5 +57,6 @@ void UhkModuleSlaveDriver_Init(uint8_t uhkModuleDriverId); status_t UhkModuleSlaveDriver_Update(uint8_t uhkModuleDriverId); + void UhkModuleSlaveDriver_Disconnect(uint8_t uhkModuleDriverId); #endif diff --git a/right/src/slave_scheduler.c b/right/src/slave_scheduler.c index 3458258..73f0fc1 100644 --- a/right/src/slave_scheduler.c +++ b/right/src/slave_scheduler.c @@ -13,7 +13,7 @@ static uint8_t previousSlaveId; static uint8_t currentSlaveId; uhk_slave_t Slaves[] = { - { .init = UhkModuleSlaveDriver_Init, .update = UhkModuleSlaveDriver_Update, .perDriverId = UhkModuleDriverId_LeftKeyboardHalf }, + { .init = UhkModuleSlaveDriver_Init, .update = UhkModuleSlaveDriver_Update, .perDriverId = UhkModuleDriverId_LeftKeyboardHalf, .disconnect = UhkModuleSlaveDriver_Disconnect }, { .init = UhkModuleSlaveDriver_Init, .update = UhkModuleSlaveDriver_Update, .perDriverId = UhkModuleDriverId_LeftAddon }, { .init = UhkModuleSlaveDriver_Init, .update = UhkModuleSlaveDriver_Update, .perDriverId = UhkModuleDriverId_RightAddon }, { .init = LedSlaveDriver_Init, .update = LedSlaveDriver_Update, .perDriverId = LedDriverId_Right }, @@ -31,7 +31,11 @@ static void masterCallback(I2C_Type *base, i2c_master_handle_t *handle, status_t uhk_slave_t *currentSlave = Slaves + currentSlaveId; if (isFirstIteration) { + bool wasPreviousSlaveConnected = previousSlave->isConnected; previousSlave->isConnected = previousStatus == kStatus_Success; + if (wasPreviousSlaveConnected && !previousSlave->isConnected && previousSlave->disconnect) { + previousSlave->disconnect(previousSlaveId); + } isFirstIteration = false; } diff --git a/right/src/slave_scheduler.h b/right/src/slave_scheduler.h index dfccd1d..80b8095 100644 --- a/right/src/slave_scheduler.h +++ b/right/src/slave_scheduler.h @@ -17,11 +17,13 @@ typedef void (slave_init_t)(uint8_t); typedef status_t (slave_update_t)(uint8_t); + typedef void (slave_disconnect_t)(uint8_t); typedef struct { uint8_t perDriverId; // Identifies the slave instance on a per-driver basis slave_init_t *init; slave_update_t *update; + slave_disconnect_t *disconnect; bool isConnected; } uhk_slave_t;