BetaFlight模块设计之七:LEDSTRIP任务分析

BetaFlight模块设计之七:LEDSTRIP任务分析

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。

1. LEDSTRIP任务

描述:用于控制无人机上配备的LED设备显示使用。

 ├──> 初始化
 │   ├──> [v]硬件初始化ws2811LedStripHardwareInit
 │   └──> [v]业务初始化pgResetFn_ledStripConfig/ledStripInit
 ├──> 任务
 │   ├──> [x]实时任务
 │   ├──> [x]事件任务
 │   └──> [v]时间任务[TASK_LEDSTRIP] = DEFINE_TASK("LEDSTRIP", NULL, NULL, ledStripUpdate, TASK_PERIOD_HZ(100), TASK_PRIORITY_LOW),
 ├──> 驱动
 │   ├──> [v]查询ws2811LedDataTransferInProgress
 │   └──> [x]中断
 └──> 接口
     └──> TBD

2. ledStripUpdate函数分析

整体上分为两种LED控制方式:StatusProfile和SimpleProfile

ledStripUpdate
 ├──> <!isWS2811LedStripReady()>
 │   ├──> schedulerIgnoreTaskExecTime
 │   └──> return
 ├──> <ledStripEnabled && IS_RC_MODE_ACTIVE(BOXLEDLOW)>
 │   └──> ledStripDisable
 ├──> <!IS_RC_MODE_ACTIVE(BOXLEDLOW)>
 │   └──> ledStripEnable
 ├──> <ledStripEnabled>
 │   ├──> <USE_LED_STRIP_STATUS_MODE><LED_PROFILE_STATUS>
 │   │   └──> applyStatusProfile
 │   └──> <LED_PROFILE_RACE> || <LED_PROFILE_BEACON>
 │       └──> applySimpleProfile
 └──> <!ledStripEnabled>
     └──> schedulerIgnoreTaskExecTime

2.1 StatusProfile

StatusProfile是通过特定的LayerFunction来处理,比如:applyLedBatteryLayer显示的是电池相关信息图标。

applyStatusProfile
 ├──> [test all led timers, setting corresponding bits]
 ├──> <!timActive>
 │   ├──> schedulerIgnoreTaskExecTime
 │   └──> return
 ├──> applyLedFixedLayers
 ├──> [check all led layer function]
 │   ├──> uint32_t *timer = &timerVal[timId];
 │   ├──> bool updateNow = timActive & (1 << timId);
 │   └──> (*layerTable[timId])(updateNow, timer);
 └──> ws2811UpdateStrip

详细如何显示各种Layer上增加类似ICON的做法可以详细阅读layerTable里面的函数。

static applyLayerFn_timed* layerTable[] = {
    [timBlink] = &applyLedBlinkLayer,
    [timLarson] = &applyLarsonScannerLayer,
    [timBattery] = &applyLedBatteryLayer,
    [timRssi] = &applyLedRssiLayer,
#ifdef USE_GPS
    [timGps] = &applyLedGpsLayer,
#endif
    [timWarning] = &applyLedWarningLayer,
#ifdef USE_VTX_COMMON
    [timVtx] = &applyLedVtxLayer,
#endif
    [timIndicator] = &applyLedIndicatorLayer,
    [timRing] = &applyLedThrustRingLayer
};

2.2 SimpleProfile

SimpleProfile是通过灯颜色和闪烁周期来控制LED灯的状态,相比于StatusProfile单调。

applySimpleProfile
 ├──> 默认SimpleProfile{false; COLOR_BLACK; true; 0; 0}
 │   ├──> <IS_RC_MODE_ACTIVE(BOXBEEPERON) || failsafeIsActive()>
 │   │   └──> {true; ledstrip_visual_beeper_color; false; BEACON_FAILSAFE_PERIOD_US; BEACON_FAILSAFE_ON_PERCENT}
 │   ├──> <LED_PROFILE_RACE>
 │   │   └──> {false; ledstrip_race_color; true; 0; 0}
 │   ├──> <LED_PROFILE_BEACON>
 │   │   └──> {true; ledstrip_beacon_color; true; ledstrip_beacon_period_ms; ledstrip_beacon_percent}
 │   └──> <其他..>
 │       └──> {false; COLOR_BLACK; true; 0; 0}
 ├──> <blinkLed>
 │   └──> 计算闪烁配置下,当前时间使用的colorIndex
 ├──> <visualBeeperOverride>
 │   └──> 检查是否正在beep,且有LED颜色配置,覆盖当前Profile颜色
 └──> <(colorIndex != previousProfileColorIndex) || (currentTimeUs >= colorUpdateTimeUs)> //颜色调整或者时间已经超出更新时间周期
     ├──> setStripColor(&hsv[colorIndex]);
     ├──> ws2811UpdateStrip
     └──> 状态更新:previousProfileColorIndex = colorIndex;colorUpdateTimeUs = currentTimeUs + PROFILE_COLOR_UPDATE_INTERVAL_US;

Profile格式:{blinkLed; colorIndex; visualBeeperOverride; flashPeriod; onPercent}
PROFILE_COLOR_UPDATE_INTERVAL_US:默认1s必须更新

基本颜色定义表:hsv

const hsvColor_t hsv[] = {
    //                        H    S    V
    [COLOR_BLACK] =        {  0,   0,   0},
    [COLOR_WHITE] =        {  0, 255, 255},
    [COLOR_RED] =          {  0,   0, 255},
    [COLOR_ORANGE] =       { 30,   0, 255},
    [COLOR_YELLOW] =       { 60,   0, 255},
    [COLOR_LIME_GREEN] =   { 90,   0, 255},
    [COLOR_GREEN] =        {120,   0, 255},
    [COLOR_MINT_GREEN] =   {150,   0, 255},
    [COLOR_CYAN] =         {180,   0, 255},
    [COLOR_LIGHT_BLUE] =   {210,   0, 255},
    [COLOR_BLUE] =         {240,   0, 255},
    [COLOR_DARK_VIOLET] =  {270,   0, 255},
    [COLOR_MAGENTA] =      {300,   0, 255},
    [COLOR_DEEP_PINK] =    {330,   0, 255},
};
// macro to save typing on default colors
#define HSV(color) (hsv[COLOR_ ## color])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值