
DEFINE_COLOUR_SEQUENCE 是一个宏,用于生成一个32位整数。这个整数被划分成10个“帧”,每一帧占用3个位(bit),用来编码一个颜色值。
YELLOW 就是一个预定义的颜色常量,它被定义为 GREEN | RED 的组合(因为黄色就是由红和绿混合而成的)。
把这行代码展开来看,它的含义是:
| 时间片 (Step) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
|---|---|---|---|---|---|---|---|---|---|---|
| 颜色值 | YELLOW | YELLOW | BLACK | BLACK | YELLOW | YELLOW | BLACK | BLACK | BLACK | BLACK |
| LED状态 | 亮 (黄) | 亮 (黄) | 灭 | 灭 | 亮 (黄) | 亮 (黄) | 灭 | 灭 | 灭 | 灭 |
💡 实际视觉效果
在 update() 函数中,系统每隔100毫秒(AP_HAL::millis()/100)前进一个时间片。因此,上面的定义会产生如下视觉效果:
-
第0-200ms:黄色,亮起 (YELLOW, YELLOW)
-
第200-400ms:熄灭 (BLACK, BLACK)
-
第400-600ms:黄色,再次亮起 (YELLOW, YELLOW)
-
第600-1000ms:长时间熄灭 (BLACK, BLACK, BLACK, BLACK)
这样,人眼看到的模式就是 “闪、灭、闪、长灭”,也就是我们所说的 “双闪黄灯”,用来明确提示飞手“预检失败,请检查地面站”。
所以,这行代码就是闪黄灯模式的“乐谱”,而 update() 函数就是那个“演奏家”,按照这个乐谱指挥LED灯亮灭。如果你把其中的 YELLOW 改成 RED,它就会变成双闪红灯。这种代码设计让你可以通过修改这个序列,轻松定制任何想要的闪烁模式。
////
驱动用的i2c 的toshiba 炫彩灯
libraries/AP_Notify/ToshibaLED_I2C.cpp
#include <GCS_MAVLink/GCS.h>
// set_rgb - set color as a combination of red, green and blue values
bool ToshibaLED_I2C::hw_set_rgb(uint8_t red, uint8_t green, uint8_t blue)
{
gcs().send_text(MAV_SEVERITY_INFO, "ToshibaLED_I2C::hw_set_rgb: %d %d %d", red, green, blue);
rgb = {red, green, blue};
_need_update = true;
return true;
}
void ToshibaLED_I2C::_timer(void)
{
if (!_need_update) {
return;
}
_need_update = false;
/* 4-bit for each color */
uint8_t val[4] = { TOSHIBA_LED_PWM0, (uint8_t)(rgb.b >> 4),
(uint8_t)(rgb.g / 16), (uint8_t)(rgb.r / 16) };
_dev->transfer(val, sizeof(val), nullptr, 0);
}
380

被折叠的 条评论
为什么被折叠?



