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/>.
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
){
75 .voltage
= getVoltageForADCChannel(ADC_POWER_5V
)
77 return (intptr_t) &voltageAndName
;
80 intptr_t osdElementData_voltage12V(void)
82 voltageAndName
= (voltageAndName_t
){
84 .voltage
= getVoltageForADCChannel(ADC_POWER_12V
)
86 return (intptr_t) &voltageAndName
;
89 intptr_t osdElementData_voltageBattery(void)
91 voltageAndName
= (voltageAndName_t
){
95 return (intptr_t) &voltageAndName
;
99 intptr_t osdElementData_voltageBatteryFC(void)
101 voltageAndName
= (voltageAndName_t
){
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
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
;
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
) {
180 typedef struct osdElementState_s
{
181 bool flashWhenDisconnected
;
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
)) {
196 if (element
->flags
& EF_FLASH_ON_DISCONNECT
&& !osdElementState
.flashWhenDisconnected
) {
200 elementHandlerConfig_t
*elementHandlerConfig
= osdFindElementHandler(element
->id
);
202 if (!elementHandlerConfig
) {
206 elementHandlerConfig
->renderFn(element
, elementHandlerConfig
->dataFn
);