Fix incorrect use of getVoltage in MSP_VOLTAGE_METERS. Rename methods
[betaflight.git] / src / main / osd / osd_element.c
blob0db405f04561d02c54696fc07266a9c836bacd8c
1 /*
2 * This file is part of Cleanflight.
4 * Cleanflight is free software: you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 3 of the License, or
7 * (at your option) any later version.
9 * Cleanflight is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License
15 * along with Cleanflight. If not, see <http://www.gnu.org/licenses/>.
18 #include <stdbool.h>
19 #include <stdlib.h>
20 #include <stdint.h>
21 #include <string.h>
23 #include <platform.h>
24 #include "build/debug.h"
26 #include "common/utils.h"
27 #include "common/filter.h" // only required for data providers
29 // only required for data providers
30 #include "config/parameter_group.h"
31 #include "config/parameter_group_ids.h"
33 #include "common/pilot.h" // only required for data providers
35 #include "drivers/video_textscreen.h"
36 #include "drivers/system.h" // only required for data providers
37 #include "drivers/adc.h" // only required for data providers
38 #include "osd/fc_state.h" // only required for data providers
39 #include "sensors/voltage.h" // only required for data providers
40 #include "sensors/battery.h" // only required for data providers
43 #include "osd/osd_element.h"
45 #include "../sensors/amperage.h" // only required for data providers
46 #include "osd/osd_element_render.h"
48 intptr_t osdElementData_onDuration(void)
50 return (intptr_t)millis();
53 intptr_t osdElementData_armedDuration(void)
55 return (intptr_t)fcStatus.armedDuration;
58 intptr_t osdElementData_mAhDrawn(void)
60 return (intptr_t)getAmperageMeter(batteryConfig()->amperageMeterSource)->mAhDrawn;
63 intptr_t osdElementData_amperage(void)
65 return (intptr_t)getAmperageMeter(batteryConfig()->amperageMeterSource)->amperage;
68 static voltageAndName_t voltageAndName;
70 intptr_t osdElementData_voltage5V(void)
73 voltageAndName = (voltageAndName_t){
74 .name = "5V",
75 .voltage = getVoltageForADCChannel(ADC_POWER_5V)
77 return (intptr_t) &voltageAndName;
80 intptr_t osdElementData_voltage12V(void)
82 voltageAndName = (voltageAndName_t){
83 .name = "12V",
84 .voltage = getVoltageForADCChannel(ADC_POWER_12V)
86 return (intptr_t) &voltageAndName;
89 intptr_t osdElementData_voltageBattery(void)
91 voltageAndName = (voltageAndName_t){
92 .name = "BAT",
93 .voltage = vbat
95 return (intptr_t) &voltageAndName;
99 intptr_t osdElementData_voltageBatteryFC(void)
101 voltageAndName = (voltageAndName_t){
102 .name = "FC",
103 .voltage = fcStatus.vbat
105 return (intptr_t) &voltageAndName;
108 intptr_t osdElementData_flightModeFC(void)
110 // translate FC state into the mode flags accepted by the renderer
111 uint8_t modes = 0;
112 if (fcStatus.fcState & (1 << FC_STATE_HORIZON)) {
113 modes |= OSD_FLIGHT_MODE_HORIZON;
115 if (fcStatus.fcState & (1 << FC_STATE_ANGLE)) {
116 modes |= OSD_FLIGHT_MODE_ANGLE;
119 if (modes == 0) {
120 modes |= OSD_FLIGHT_MODE_ACRO;
123 return (intptr_t) modes;
126 intptr_t osdElementData_indicatorBaroFC(void)
128 return (intptr_t) fcStatus.fcState & (1 << FC_STATE_BARO);
131 intptr_t osdElementData_indicatorMagFC(void)
133 return (intptr_t) fcStatus.fcState & (1 << FC_STATE_MAG);
136 intptr_t osdElementData_rssiFC(void)
138 return (intptr_t) fcStatus.rssi;
141 intptr_t osdElementData_callsign(void)
143 return (intptr_t) pilotConfig()->callsign;
147 intptr_t osdElementData_motors(void)
149 return (intptr_t) fcMotors;
152 elementHandlerConfig_t elementHandlers[] = {
153 {OSD_ELEMENT_ON_DURATION, osdElementRender_duration, osdElementData_onDuration},
154 {OSD_ELEMENT_ARMED_DURATION, osdElementRender_duration, osdElementData_armedDuration},
155 {OSD_ELEMENT_MAH_DRAWN, osdElementRender_mahDrawn, osdElementData_mAhDrawn},
156 {OSD_ELEMENT_AMPERAGE, osdElementRender_amperage, osdElementData_amperage},
157 {OSD_ELEMENT_VOLTAGE_5V, osdElementRender_voltage, osdElementData_voltage5V},
158 {OSD_ELEMENT_VOLTAGE_12V, osdElementRender_voltage, osdElementData_voltage12V},
159 {OSD_ELEMENT_VOLTAGE_BATTERY, osdElementRender_voltage, osdElementData_voltageBattery},
160 {OSD_ELEMENT_VOLTAGE_BATTERY_FC, osdElementRender_voltage, osdElementData_voltageBatteryFC},
161 {OSD_ELEMENT_FLIGHT_MODE, osdElementRender_flightMode, osdElementData_flightModeFC},
162 {OSD_ELEMENT_INDICATOR_MAG, osdElementRender_indicatorMag, osdElementData_indicatorMagFC},
163 {OSD_ELEMENT_INDICATOR_BARO, osdElementRender_indicatorBaro, osdElementData_indicatorBaroFC},
164 {OSD_ELEMENT_RSSI_FC, osdElementRender_rssi, osdElementData_rssiFC},
165 {OSD_ELEMENT_CALLSIGN, osdElementRender_callsign, osdElementData_callsign},
166 {OSD_ELEMENT_MOTORS, osdElementRender_motors, osdElementData_motors},
169 static elementHandlerConfig_t *osdFindElementHandler(uint8_t id)
171 for (unsigned int i = 0; i < ARRAYLEN(elementHandlers); i++) {
172 elementHandlerConfig_t *candidate = &elementHandlers[i];
173 if (candidate->id == id) {
174 return candidate;
177 return NULL;
180 typedef struct osdElementState_s {
181 bool flashWhenDisconnected;
182 } osdElementState_t;
184 static osdElementState_t osdElementState;
186 // set showNow parameter to true when the element should be drawn, flash frequency and state defined by caller.
187 void osdSetElementFlashOnDisconnectState(bool showNow) {
188 osdElementState.flashWhenDisconnected = showNow;
191 void osdDrawTextElement(const element_t *element)
193 if (!(element->flags & EF_ENABLED)) {
194 return;
196 if (element->flags & EF_FLASH_ON_DISCONNECT && !osdElementState.flashWhenDisconnected) {
197 return;
200 elementHandlerConfig_t *elementHandlerConfig = osdFindElementHandler(element->id);
202 if (!elementHandlerConfig) {
203 return;
206 elementHandlerConfig->renderFn(element, elementHandlerConfig->dataFn);