don't block on led transmission

This commit is contained in:
King Kévin 2016-04-16 12:12:47 +02:00
parent 63c17af691
commit 72b3d5188b
2 changed files with 8 additions and 5 deletions

View File

@ -104,10 +104,10 @@ void ws2812b_set_rgb(uint16_t led, uint8_t red, uint8_t green, uint8_t blue)
} }
} }
void ws2812b_transmit(void) bool ws2812b_transmit(void)
{ {
while (transmit_flag) { // wait for previous transmission to complete if (transmit_flag) { // a transmission is already ongoing
__WFI(); return false;
} }
transmit_flag = true; // remember transmission started transmit_flag = true; // remember transmission started
dma_set_memory_address(WS2812B_DMA, WS2812B_DMA_CH, (uint32_t)ws2812b_data); dma_set_memory_address(WS2812B_DMA, WS2812B_DMA_CH, (uint32_t)ws2812b_data);
@ -119,6 +119,7 @@ void ws2812b_transmit(void)
timer_set_counter(WS2812B_TIMER, 0); // reset timer counter fro clean clock timer_set_counter(WS2812B_TIMER, 0); // reset timer counter fro clean clock
timer_enable_counter(WS2812B_TIMER); // start timer to generate clock timer_enable_counter(WS2812B_TIMER); // start timer to generate clock
return true;
} }
void ws2812b_setup(void) void ws2812b_setup(void)

View File

@ -33,5 +33,7 @@ void ws2812b_setup(void);
* @note transmission needs to be done separately * @note transmission needs to be done separately
*/ */
void ws2812b_set_rgb(uint16_t led, uint8_t red, uint8_t green, uint8_t blue); void ws2812b_set_rgb(uint16_t led, uint8_t red, uint8_t green, uint8_t blue);
/** @brief transmit color values to WS2812b LEDs */ /** @brief transmit color values to WS2812b LEDs
void ws2812b_transmit(void); * @return true if transmission started, false if another transmission is already ongoing
*/
bool ws2812b_transmit(void);