BetaFlight模块设计之三十四:OSD模块分析

2023-05-16

BetaFlight模块设计之三十四:OSD模块分析

  • 1. OSD模块
    • 1.1 osd状态机子模块
    • 1.2 osd_warnings检查子模块
    • 1.3 osd_elements子模块
  • 2. OSD设备、驱动及适配框架
    • 2.1 OSD设备
    • 2.2 芯片驱动
    • 2.3 适配层框架

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

1. OSD模块

描述:主要是将系统信息叠加到视频流上,以便更加便捷的通过眼镜了解飞控实时状态。

src/main/
 ├── /osd/
 │  ├── osd.c/h
 │  ├── osd_elements.c/h
 │  └── osd_warnings.c/h
 └── /driver/
    └── display.c/h

注:这里主要是VTX上的OSD,而OLED显示设备并非OSD叠加,而是DashBoard显示。

模块之间的依赖关系

1.1 osd状态机子模块

osd.c主要描述了状态机的整体情况,详见:BetaFlight模块设计之十六:OSD更新任务分析。

1.2 osd_warnings检查子模块

\src\main\osd\osd_warnings.h

#define OSD_WARNINGS_MAX_SIZE 12
#define OSD_FORMAT_MESSAGE_BUFFER_SIZE (OSD_WARNINGS_MAX_SIZE + 1)

void renderOsdWarning(char *warningText, bool *blinking, uint8_t *displayAttr);

注:OSD检查子模块主要是在osdUpdate中被调用,定期调度执行:
osdUpdate–>osdDrawNextActiveElement–>osdDrawSingleElement–>osdElementDrawFunction[OSD_WARNINGS]–>osdElementWarnings–>renderOsdWarning

1.3 osd_elements子模块

主要用于衔接osd状态机与OSD适配设备的作用。

\src\main\osd\osd_elements.h

//使用适配层进行OSD显示
bool osdDrawNextActiveElement(displayPort_t *osdDisplayPort, timeUs_t currentTimeUs);
void osdDrawActiveElementsBackground(displayPort_t *osdDisplayPort);

//OSD Element参数格式化和状态管理函数
int osdConvertTemperatureToSelectedUnit(int tempInDegreesCelcius);
void osdFormatDistanceString(char *result, int distance, char leadingSymbol);
bool osdFormatRtcDateTime(char *buffer);
void osdFormatTime(char * buff, osd_timer_precision_e precision, timeUs_t time);
void osdFormatTimer(char *buff, bool showSymbol, bool usePrecision, int timerIndex);
float osdGetMetersToSelectedUnit(int32_t meters);
char osdGetMetersToSelectedUnitSymbol(void);
int32_t osdGetSpeedToSelectedUnit(int32_t value);
char osdGetSpeedToSelectedUnitSymbol(void);
char osdGetTemperatureSymbolForSelectedUnit(void);
void osdAddActiveElements(void);
uint8_t osdGetActiveElement();
uint8_t osdGetActiveElementCount();
void osdElementsInit(bool backgroundLayerFlag);
void osdSyncBlink();
void osdResetAlarms(void);
void osdUpdateAlarms(void);
bool osdElementsNeedAccelerometer(void);

2. OSD设备、驱动及适配框架

注:Kakute F7 AIO的板子用的是7456芯片。

2.1 OSD设备

主要就是三种OSD设备,其中AUTO只是三种设备自动侦测。详见:void init(void)

\src\main\osd\osd.h
typedef enum {
    OSD_DISPLAYPORT_DEVICE_NONE = 0,
    OSD_DISPLAYPORT_DEVICE_AUTO,
    OSD_DISPLAYPORT_DEVICE_MAX7456,
    OSD_DISPLAYPORT_DEVICE_MSP,
    OSD_DISPLAYPORT_DEVICE_FRSKYOSD,
} osdDisplayPortDevice_e;

2.2 芯片驱动

这里以Kakute F7使用的7456芯片为例。

\src\main\io\displayport_max7456.c

static const displayPortVTable_t max7456VTable = {
    .grab = grab,
    .release = release,
    .clearScreen = clearScreen,
    .drawScreen = drawScreen,
    .screenSize = screenSize,
    .writeString = writeString,
    .writeChar = writeChar,
    .isTransferInProgress = isTransferInProgress,
    .heartbeat = heartbeat,
    .redraw = redraw,
    .isSynced = isSynced,
    .txBytesFree = txBytesFree,
    .layerSupported = layerSupported,
    .layerSelect = layerSelect,
    .layerCopy = layerCopy,
    .writeFontCharacter = writeFontCharacter,
    .checkReady = checkReady,
    .setBackgroundType = setBackgroundType,
};

bool max7456DisplayPortInit(const vcdProfile_t *vcdProfile, displayPort_t **displayPort)

2.3 适配层框架

该适配模型在max7456DisplayPortInit里面已经初始化:displayInit(&max7456DisplayPort, &max7456VTable, DISPLAYPORT_DEVICE_TYPE_MAX7456);

\src\main\drivers\display.h

typedef enum {
    DISPLAYPORT_ATTR_NONE = 0,
    DISPLAYPORT_ATTR_INFO,
    DISPLAYPORT_ATTR_WARNING,
    DISPLAYPORT_ATTR_CRITICAL,
} displayPortAttr_e;

typedef struct displayPortVTable_s {
    int (*grab)(displayPort_t *displayPort);
    int (*release)(displayPort_t *displayPort);
    int (*clearScreen)(displayPort_t *displayPort, displayClearOption_e options);
    bool (*drawScreen)(displayPort_t *displayPort);
    int (*screenSize)(const displayPort_t *displayPort);
    int (*writeString)(displayPort_t *displayPort, uint8_t x, uint8_t y, uint8_t attr, const char *text);
    int (*writeChar)(displayPort_t *displayPort, uint8_t x, uint8_t y, uint8_t attr, uint8_t c);
    bool (*isTransferInProgress)(const displayPort_t *displayPort);
    int (*heartbeat)(displayPort_t *displayPort);
    void (*redraw)(displayPort_t *displayPort);
    bool (*isSynced)(const displayPort_t *displayPort);
    uint32_t (*txBytesFree)(const displayPort_t *displayPort);
    bool (*layerSupported)(displayPort_t *displayPort, displayPortLayer_e layer);
    bool (*layerSelect)(displayPort_t *displayPort, displayPortLayer_e layer);
    bool (*layerCopy)(displayPort_t *displayPort, displayPortLayer_e destLayer, displayPortLayer_e sourceLayer);
    bool (*writeFontCharacter)(displayPort_t *instance, uint16_t addr, const struct osdCharacter_s *chr);
    bool (*checkReady)(displayPort_t *displayPort, bool rescan);
    void (*beginTransaction)(displayPort_t *displayPort, displayTransactionOption_e opts);
    void (*commitTransaction)(displayPort_t *displayPort);
    bool (*getCanvas)(struct displayCanvas_s *canvas, const displayPort_t *displayPort);
    void (*setBackgroundType)(displayPort_t *displayPort, displayPortBackground_e backgroundType);
} displayPortVTable_t;

void displayGrab(displayPort_t *instance);
void displayRelease(displayPort_t *instance);
void displayReleaseAll(displayPort_t *instance);
bool displayIsGrabbed(const displayPort_t *instance);
void displayClearScreen(displayPort_t *instance, displayClearOption_e options);
bool displayDrawScreen(displayPort_t *instance);
int displayScreenSize(const displayPort_t *instance);
void displaySetXY(displayPort_t *instance, uint8_t x, uint8_t y);
int displayWrite(displayPort_t *instance, uint8_t x, uint8_t y, uint8_t attr, const char *s);
int displayWriteChar(displayPort_t *instance, uint8_t x, uint8_t y, uint8_t attr, uint8_t c);
bool displayIsTransferInProgress(const displayPort_t *instance);
bool displayHeartbeat(displayPort_t *instance);
void displayRedraw(displayPort_t *instance);
bool displayIsSynced(const displayPort_t *instance);
uint16_t displayTxBytesFree(const displayPort_t *instance);
bool displayWriteFontCharacter(displayPort_t *instance, uint16_t addr, const struct osdCharacter_s *chr);
bool displayCheckReady(displayPort_t *instance, bool rescan);
void displayBeginTransaction(displayPort_t *instance, displayTransactionOption_e opts);
void displayCommitTransaction(displayPort_t *instance);
bool displayGetCanvas(struct displayCanvas_s *canvas, const displayPort_t *instance);
void displayInit(displayPort_t *instance, const displayPortVTable_t *vTable, displayPortDeviceType_e deviceType);
bool displayLayerSupported(displayPort_t *instance, displayPortLayer_e layer);
bool displayLayerSelect(displayPort_t *instance, displayPortLayer_e layer);
bool displayLayerCopy(displayPort_t *instance, displayPortLayer_e destLayer, displayPortLayer_e sourceLayer);
void displaySetBackgroundType(displayPort_t *instance, displayPortBackground_e backgroundType);
bool displaySupportsOsdSymbols(displayPort_t *instance);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

BetaFlight模块设计之三十四:OSD模块分析 的相关文章

随机推荐

  • 解决部分网页打不开的方法(特别是CSDN)

    近来遇到好几次CSDN网站连不上的状况 起初是在学校因为是连的校园网 xff0c 突然有一天连着校园网就打不开CSDN的相关网页了 xff0c 问了周围的同学 xff0c 问了几个她们也都打不开 xff0c 但是用流量就能打开CSDN网页
  • MTK平台Android项目开发框架搭建

    前言 xff1a 不同的项目配置存在差异 xff0c 原生的SDK无法兼容多个项目作业 xff0c 按照原生框架创建项目比较繁琐 xff0c 如果采用GIT分支形式来管理每个项目同样过于繁琐 因此一套代码多个项目框架是有必要的 1 编译脚本
  • windows平台 Anaconda及相关插件安装

    1 Anaconda官网 https www anaconda com products individual 2 Anaconda安装 3 创建python3 7虚拟环境 conda create n 名字 python 61 3 7 如
  • python paramiko 远程登陆主机并获取主机信息

    usr bin python encoding utf 8 filename host information get py author gaohaixiang writetime 20200409 import paramiko def
  • rk3568 android11 AP6275s调试

    一 AP6275S的32 768k波形要求 xff1a 1 43 25ppm xff0c 计算的范围是 xff1a 32767 1808 32768 8192Hz 2 占空比 xff1a 30 70 3 峰峰值 xff1a 1 8v 43
  • OpenCV如何获取视频当前的一帧图像

    xff08 OpenCV读取视频 OpenCV提取视频每一帧 每一帧图片合成新的AVI视频 xff09 CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture cap IplImage cvQuery
  • iptables raw表

    1 什么是raw表 xff1f 做什么用的 xff1f iptables有5个链 PREROUTING INPUT FORWARD OUTPUT POSTROUTING 4个表 filter nat mangle raw 4个表的优先级由高
  • NSMutableParagraphStyle & NSAttributedString 文本样式设置

    今天做工作时 xff0c 用到了 NSMutableParagraphStyle amp NSAttributedString xff0c 由于用C 语言 写 xff0c 一开始比较生疏 xff0c 有些语法和oc语言还是有点区别的 xff
  • 【计算机毕业设计】医院管理系统源码

    一 系统截图 xff08 需要演示视频可以私聊 xff09 一 xff0e 摘要 目前各医疗机构中 xff0c 绝大部分中小型医疗机构内部没有实现任何信息化管理 xff0c 医院临床信息 xff0c 业务流程的数据依然采取纸质记录 xff0
  • 【计算机毕业设计】88.人事工资管理系统源码

    一 系统截图 xff08 需要演示视频可以私聊 xff09 摘 要 本论文主要论述了如何使用 JAVA 语言开发一个 人事管理系统 xff0c 本系统将严格按照软件开发流程进行各个阶段的工作 xff0c 采用 B S 架构 xff0c 面向
  • 【计算机毕业设计】012基于springboot的社区团购系统设计

    一 系统截图 xff08 需要演示视频可以私聊 xff09 摘 要 本课题是根据用户的需要以及网络的优势建立的一个社区团购系统 xff0c 来满足用户 团购 的需求 本社区团购系统应用 Java 技术 xff0c MY SQL数据库存储数据
  • 四轴飞控DIY调试起飞简明步骤

    四轴飞控DIY调试起飞简明步骤 调试起飞简明步骤Step1 xff1a 飞控配置Step2 xff1a 试飞目标测试内容坐标系 Step3 xff1a 试飞方法1 升降 xff08 Throttle xff09 2 偏航 xff08 yaw
  • BetaFlight开源工程结构简明介绍

    BetaFlight开源工程结构简明介绍 Step1 获取开源代码开源代码版本克隆开源代码 Step2 了解工程情况支持模型类型 xff1a 多旋翼 amp 固定翼支持特性 amp 功能安装 amp 文档链接配置工具下载其他介绍 xff08
  • 四轴FPV无人机手动操作简明介绍

    四轴FPV无人机手动操作简明介绍 通常航拍机都是有自稳算法 43 GPS导航 43 辅助功能 避障 的支持 xff0c 从而保证飞手能够相对容易且稳定的操作模型飞机 xff0c 通常通过阅读说明书都能很快上手 xff0c 这里就不在赘述 本
  • BetaFlight开源代码框架简介

    BetaFlight开源代码框架简介 1 框架设计分析考量2 框架分析前提条件3 主程序框架4 调度框架5 模块方法6 典型任务 amp 模块6 1 典型任务6 2 典型模块6 3 传感模块 7 回顾 amp 分析8 分析模板 1 框架设计
  • 四轴飞控DIY集成FPV功能

    四轴飞控DIY集成FPV功能 1 功能需求2 概念介绍2 1 制式2 2 显示分辨率2 3 摄像头线数高于700线低于700线 3 需求分析4 组件选择5 接线组装5 1 摄像头接线5 2 图传接线 6 组装位置7 FPV功能调试7 1 摄
  • MFC拷贝文件及进度条显示

    参考 xff1a 封装CopyFileEx函数 xff0c 实现文件复制中的暂停 xff0c 控速 xff0c 获取进度 http blog csdn net career2011 article details 6844513 实例讲解C
  • BetaFlight模块设计之三十二:MSP协议模块分析

    BetaFlight模块设计之三十二 xff1a MSP协议模块分析 1 MSP协议模块1 1 MSP描述1 2 MSP版本优缺点1 3 MSP代码资源 2 MSP报文解析2 1 MSP收包状态机2 2 MSP报文格式 3 MSP报文处理3
  • BetaFlight模块设计之三十三:Pid模块分析

    BetaFlight模块设计之三十三 xff1a Pid模块分析 Pid模块1 Pid audio子模块2 Pid init子模块3 Pid算法子模块3 1 TPA模式3 2 飞行模式3 3 Launch模式3 4 AcroTrainer模
  • BetaFlight模块设计之三十四:OSD模块分析

    BetaFlight模块设计之三十四 xff1a OSD模块分析 1 OSD模块1 1 osd状态机子模块1 2 osd warnings检查子模块1 3 osd elements子模块 2 OSD设备 驱动及适配框架2 1 OSD设备2