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

Posted lida2003

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
 ├──> 默认SimpleProfilefalse; 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])

以上是关于BetaFlight模块设计之七:LEDSTRIP任务分析的主要内容,如果未能解决你的问题,请参考以下文章

BetaFlight深入传感设计:传感模块设计框架

BetaFlight深入传感设计:传感模块设计框架

BetaFlight模块设计之一:系统任务模块分析

BetaFlight模块设计之三十:Cli模块分析

BetaFlight模块设计之二:SERIAL任务分析

BetaFlight模块设计之二十七:姿态更新任务分析