From 31b01864eb1ad7c7454beb1108f5e283dd0ab470 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A1szl=C3=B3=20Monda?= Date: Thu, 10 Aug 2017 15:07:03 +0200 Subject: [PATCH] Make sure to send no more than LED_DRIVER_LED_COUNT LED values to the LED driver IC even if LED_DRIVER_LED_COUNT is not an exact multiple of PMW_REGISTER_UPDATE_CHUNK_SIZE. --- right/src/slave_drivers/is31fl3731_driver.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/right/src/slave_drivers/is31fl3731_driver.c b/right/src/slave_drivers/is31fl3731_driver.c index b597ab7..7b8565b 100644 --- a/right/src/slave_drivers/is31fl3731_driver.c +++ b/right/src/slave_drivers/is31fl3731_driver.c @@ -96,9 +96,10 @@ void LedSlaveDriver_Update(uint8_t ledDriverId) { break; case LedDriverPhase_InitLedValues: updatePwmRegistersBuffer[0] = FRAME_REGISTER_PWM_FIRST + *ledIndex; - memcpy(updatePwmRegistersBuffer+1, currentLedDriverState->sourceLedValues + *ledIndex, PMW_REGISTER_UPDATE_CHUNK_SIZE); - I2cAsyncWrite(ledDriverAddress, updatePwmRegistersBuffer, PWM_REGISTER_BUFFER_LENGTH); - *ledIndex += PMW_REGISTER_UPDATE_CHUNK_SIZE; + 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); + *ledIndex += chunkSize; if (*ledIndex >= LED_DRIVER_LED_COUNT) { *ledIndex = 0; memcpy(currentLedDriverState->targetLedValues, currentLedDriverState->sourceLedValues, LED_DRIVER_LED_COUNT);