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任务分析的主要内容,如果未能解决你的问题,请参考以下文章