|
|
|
@ -41,8 +41,8 @@ bool ToshibaLED_PX4::hw_init()
@@ -41,8 +41,8 @@ bool ToshibaLED_PX4::hw_init()
|
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
ioctl(_rgbled_fd, RGBLED_SET_MODE, (unsigned long)RGBLED_MODE_ON); |
|
|
|
|
last.zero(); |
|
|
|
|
next.zero(); |
|
|
|
|
last.v = 0; |
|
|
|
|
next.v = 0; |
|
|
|
|
hal.scheduler->register_io_process(AP_HAL_MEMBERPROC(&ToshibaLED_PX4::update_timer)); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
@ -50,28 +50,30 @@ bool ToshibaLED_PX4::hw_init()
@@ -50,28 +50,30 @@ bool ToshibaLED_PX4::hw_init()
|
|
|
|
|
// set_rgb - set color as a combination of red, green and blue values
|
|
|
|
|
bool ToshibaLED_PX4::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue) |
|
|
|
|
{ |
|
|
|
|
hal.scheduler->suspend_timer_procs(); |
|
|
|
|
next[0] = red; |
|
|
|
|
next[1] = green; |
|
|
|
|
next[2] = blue; |
|
|
|
|
hal.scheduler->resume_timer_procs(); |
|
|
|
|
union rgb_value v; |
|
|
|
|
v.r = red; |
|
|
|
|
v.g = green; |
|
|
|
|
v.b = blue; |
|
|
|
|
// this does an atomic 32 bit update
|
|
|
|
|
next.v = v.v; |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ToshibaLED_PX4::update_timer(void) |
|
|
|
|
{ |
|
|
|
|
if (last == next) { |
|
|
|
|
if (last.v == next.v) { |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
rgbled_rgbset_t v; |
|
|
|
|
|
|
|
|
|
v.red = next[0]; |
|
|
|
|
v.green = next[1]; |
|
|
|
|
v.blue = next[2]; |
|
|
|
|
union rgb_value newv; |
|
|
|
|
newv.v = next.v; |
|
|
|
|
v.red = newv.r; |
|
|
|
|
v.green = newv.g; |
|
|
|
|
v.blue = newv.b; |
|
|
|
|
|
|
|
|
|
ioctl(_rgbled_fd, RGBLED_SET_RGB, (unsigned long)&v); |
|
|
|
|
|
|
|
|
|
last = next; |
|
|
|
|
last.v = next.v; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
#endif // CONFIG_HAL_BOARD == HAL_BOARD_PX4
|
|
|
|
|