Skip to content
Snippets Groups Projects
Commit ea27a035 authored by Beat Küng's avatar Beat Küng Committed by Daniele Pettenuzzo
Browse files

atxxxx: various fixes & cleanup

parent 7312059c
No related branches found
No related tags found
No related merge requests found
...@@ -36,10 +36,15 @@ ...@@ -36,10 +36,15 @@
* @author Daniele Pettenuzzo * @author Daniele Pettenuzzo
* @author Beat Küng <beat-kueng@gmx.net> * @author Beat Küng <beat-kueng@gmx.net>
* *
* Driver for the ATXXXX chip on the omnibus fcu connected via SPI. * Driver for the ATXXXX chip (e.g. MAX7456) on the omnibus f4 fcu connected via SPI.
*/ */
#include "atxxxx.h" #include "atxxxx.h"
#include "symbols.h"
#include <uORB/topics/battery_status.h>
#include <uORB/topics/vehicle_local_position.h>
#include <uORB/topics/vehicle_status.h>
struct work_s OSDatxxxx::_work = {}; struct work_s OSDatxxxx::_work = {};
...@@ -111,8 +116,11 @@ OSDatxxxx::init() ...@@ -111,8 +116,11 @@ OSDatxxxx::init()
return ret; return ret;
} }
// clear the screen
int num_rows = _param_atxxxx_cfg.get() == 1 ? OSD_NUM_ROWS_NTSC : OSD_NUM_ROWS_PAL;
for (int i = 0; i < OSD_CHARS_PER_ROW; i++) { for (int i = 0; i < OSD_CHARS_PER_ROW; i++) {
for (int j = 0; j < 17; j++) { for (int j = 0; j < num_rows; j++) {
add_character_to_screen(' ', i, j); add_character_to_screen(' ', i, j);
} }
} }
...@@ -165,7 +173,7 @@ OSDatxxxx::probe() ...@@ -165,7 +173,7 @@ OSDatxxxx::probe()
ret |= readRegister(0x00, &data, 1); ret |= readRegister(0x00, &data, 1);
if (data != 1 || ret != PX4_OK) { if (data != 1 || ret != PX4_OK) {
printf("probe error\n"); PX4_ERR("probe failed (%i %i)", ret, data);
} }
return ret; return ret;
...@@ -186,18 +194,13 @@ OSDatxxxx::init_osd() ...@@ -186,18 +194,13 @@ OSDatxxxx::init_osd()
enable_screen(); enable_screen();
// writeRegister(0x00, 0x48) != PX4_OK) { //DMM set to 0
// goto fail;
// }
return ret; return ret;
} }
int int
OSDatxxxx::readRegister(unsigned reg, uint8_t *data, unsigned count) OSDatxxxx::readRegister(unsigned reg, uint8_t *data, unsigned count)
{ {
uint8_t cmd[5]; // read up to 4 bytes uint8_t cmd[5]; // read up to 4 bytes
int ret; int ret;
cmd[0] = DIR_READ(reg); cmd[0] = DIR_READ(reg);
...@@ -219,7 +222,7 @@ OSDatxxxx::readRegister(unsigned reg, uint8_t *data, unsigned count) ...@@ -219,7 +222,7 @@ OSDatxxxx::readRegister(unsigned reg, uint8_t *data, unsigned count)
int int
OSDatxxxx::writeRegister(unsigned reg, uint8_t data) OSDatxxxx::writeRegister(unsigned reg, uint8_t data)
{ {
uint8_t cmd[2]; // write 1 byte uint8_t cmd[2]; // write 1 byte
int ret; int ret;
cmd[0] = DIR_WRITE(reg); cmd[0] = DIR_WRITE(reg);
...@@ -242,94 +245,115 @@ OSDatxxxx::add_character_to_screen(char c, uint8_t pos_x, uint8_t pos_y) ...@@ -242,94 +245,115 @@ OSDatxxxx::add_character_to_screen(char c, uint8_t pos_x, uint8_t pos_y)
uint16_t position = (OSD_CHARS_PER_ROW * pos_y) + pos_x; uint16_t position = (OSD_CHARS_PER_ROW * pos_y) + pos_x;
uint8_t position_lsb; uint8_t position_lsb;
int ret = PX4_OK; int ret;
if (position > 0xFF) { if (position > 0xFF) {
position_lsb = static_cast<uint8_t>(position) - 0xFF; position_lsb = static_cast<uint8_t>(position) - 0xFF;
ret |= writeRegister(0x05, 0x01); //DMAH ret = writeRegister(0x05, 0x01); //DMAH
} else { } else {
position_lsb = static_cast<uint8_t>(position); position_lsb = static_cast<uint8_t>(position);
ret |= writeRegister(0x05, 0x00); //DMAH ret = writeRegister(0x05, 0x00); //DMAH
} }
ret |= writeRegister(0x06, position_lsb); //DMAL if (ret != 0) { return ret; }
ret |= writeRegister(0x07, c);
ret = writeRegister(0x06, position_lsb); //DMAL
if (ret != 0) { return ret; }
ret = writeRegister(0x07, c);
return ret; return ret;
} }
int void OSDatxxxx::add_string_to_screen_centered(const char *str, uint8_t pos_y, int max_length)
OSDatxxxx::add_battery_symbol(uint8_t pos_x, uint8_t pos_y)
{ {
return add_character_to_screen(146, pos_x, pos_y); int len = strlen(str);
if (len > max_length) {
len = max_length;
}
int pos = (OSD_CHARS_PER_ROW - max_length) / 2;
int before = (max_length - len) / 2;
for (int i = 0; i < before; ++i) {
add_character_to_screen(' ', pos++, pos_y);
}
for (int i = 0; i < len; ++i) {
add_character_to_screen(str[i], pos++, pos_y);
}
while (pos < (OSD_CHARS_PER_ROW + max_length) / 2) {
add_character_to_screen(' ', pos++, pos_y);
}
}
void OSDatxxxx::clear_line(uint8_t pos_x, uint8_t pos_y, int length)
{
for (int i = 0; i < length; ++i) {
add_character_to_screen(' ', pos_x + i, pos_y);
}
} }
int int
OSDatxxxx::add_battery_info(uint8_t pos_x, uint8_t pos_y) OSDatxxxx::add_battery_info(uint8_t pos_x, uint8_t pos_y)
{ {
char buf[5]; char buf[10];
int ret = PX4_OK; int ret = PX4_OK;
sprintf(buf, "%4.2f", (double)_battery_voltage_filtered_v); // TODO: show battery symbol based on battery fill level
snprintf(buf, sizeof(buf), "%c%5.2f", OSD_SYMBOL_BATT_3, (double)_battery_voltage_filtered_v);
buf[sizeof(buf) - 1] = '\0';
for (int i = 0; i < 5; i++) { for (int i = 0; buf[i] != '\0'; i++) {
ret |= add_character_to_screen(buf[i], pos_x + i, pos_y); ret |= add_character_to_screen(buf[i], pos_x + i, pos_y);
} }
ret |= add_character_to_screen('V', pos_x + 5, pos_y); ret |= add_character_to_screen('V', pos_x + 5, pos_y);
pos_y++; pos_y++;
pos_x++;
sprintf(buf, "%4d", (int)_battery_discharge_mah); snprintf(buf, sizeof(buf), "%5d", (int)_battery_discharge_mah);
buf[sizeof(buf) - 1] = '\0';
for (int i = 0; i < 5; i++) { for (int i = 0; buf[i] != '\0'; i++) {
ret |= add_character_to_screen(buf[i], pos_x + i, pos_y); ret |= add_character_to_screen(buf[i], pos_x + i, pos_y);
} }
ret |= add_character_to_screen(7, pos_x + 5, pos_y); // mAh symbol ret |= add_character_to_screen(OSD_SYMBOL_MAH, pos_x + 5, pos_y);
return ret; return ret;
} }
int
OSDatxxxx::add_altitude_symbol(uint8_t pos_x, uint8_t pos_y)
{
return add_character_to_screen(154, pos_x, pos_y);
}
int int
OSDatxxxx::add_altitude(uint8_t pos_x, uint8_t pos_y) OSDatxxxx::add_altitude(uint8_t pos_x, uint8_t pos_y)
{ {
char buf[5]; char buf[16];
int ret = PX4_OK; int ret = PX4_OK;
sprintf(buf, "%4.2f", (double)_local_position_z); snprintf(buf, sizeof(buf), "%c%5.2f%c", OSD_SYMBOL_ARROW_NORTH, (double)_local_position_z, OSD_SYMBOL_M);
buf[sizeof(buf) - 1] = '\0';
for (int i = 0; i < 5; i++) { for (int i = 0; buf[i] != '\0'; i++) {
ret |= add_character_to_screen(buf[i], pos_x + i, pos_y); ret |= add_character_to_screen(buf[i], pos_x + i, pos_y);
} }
ret |= add_character_to_screen('m', pos_x + 5, pos_y);
return ret; return ret;
} }
int
OSDatxxxx::add_flighttime_symbol(uint8_t pos_x, uint8_t pos_y)
{
return add_character_to_screen(112, pos_x, pos_y);
}
int int
OSDatxxxx::add_flighttime(float flight_time, uint8_t pos_x, uint8_t pos_y) OSDatxxxx::add_flighttime(float flight_time, uint8_t pos_x, uint8_t pos_y)
{ {
char buf[6]; char buf[10];
int ret = PX4_OK; int ret = PX4_OK;
sprintf(buf, "%5.1f", (double)flight_time); snprintf(buf, sizeof(buf), "%c%5.1f", OSD_SYMBOL_FLIGHT_TIME, (double)flight_time);
buf[sizeof(buf) - 1] = '\0';
for (int i = 0; i < 6; i++) { for (int i = 0; buf[i] != '\0'; i++) {
ret |= add_character_to_screen(buf[i], pos_x + i, pos_y); ret |= add_character_to_screen(buf[i], pos_x + i, pos_y);
} }
...@@ -362,18 +386,15 @@ OSDatxxxx::disable_screen() ...@@ -362,18 +386,15 @@ OSDatxxxx::disable_screen()
int int
OSDatxxxx::update_topics()//TODO have an argument to choose what to update and return validity OSDatxxxx::update_topics()
{ {
struct battery_status_s battery = {};
// struct vehicle_local_position_s local_position = {};
struct vehicle_status_s vehicle_status = {};
bool updated = false; bool updated = false;
/* update battery subscription */ /* update battery subscription */
orb_check(_battery_sub, &updated); orb_check(_battery_sub, &updated);
if (updated) { if (updated) {
battery_status_s battery;
orb_copy(ORB_ID(battery_status), _battery_sub, &battery); orb_copy(ORB_ID(battery_status), _battery_sub, &battery);
if (battery.connected) { if (battery.connected) {
...@@ -387,61 +408,107 @@ OSDatxxxx::update_topics()//TODO have an argument to choose what to update and r ...@@ -387,61 +408,107 @@ OSDatxxxx::update_topics()//TODO have an argument to choose what to update and r
} }
/* update vehicle local position subscription */ /* update vehicle local position subscription */
// orb_check(_local_position_sub, &updated); orb_check(_local_position_sub, &updated);
// if (updated) { if (updated) {
// if (local_position.z_valid) { vehicle_local_position_s local_position;
// _local_position_z = -local_position.z; orb_copy(ORB_ID(vehicle_local_position), _local_position_sub, &local_position);
// _local_position_valid = true;
// } else { if ((_local_position_valid = local_position.z_valid)) {
// _local_position_valid = false; _local_position_z = -local_position.z;
// } }
// } }
/* update vehicle status subscription */ /* update vehicle status subscription */
orb_check(_vehicle_status_sub, &updated); orb_check(_vehicle_status_sub, &updated);
if (updated) { if (updated) {
if (vehicle_status.arming_state == 2 && _arming_state == 1) { vehicle_status_s vehicle_status;
orb_copy(ORB_ID(vehicle_status), _vehicle_status_sub, &vehicle_status);
if (vehicle_status.arming_state == vehicle_status_s::ARMING_STATE_ARMED &&
_arming_state != vehicle_status_s::ARMING_STATE_ARMED) {
// arming
_arming_timestamp = hrt_absolute_time(); _arming_timestamp = hrt_absolute_time();
_arming_state = 2;
} else if (vehicle_status.arming_state == 1 && _arming_state == 2) { } else if (vehicle_status.arming_state != vehicle_status_s::ARMING_STATE_ARMED &&
_arming_state = 1; _arming_state == vehicle_status_s::ARMING_STATE_ARMED) {
// disarming
} }
_arming_state = vehicle_status.arming_state;
if (vehicle_status.nav_state == vehicle_status.NAVIGATION_STATE_ACRO) { _nav_state = vehicle_status.nav_state;
add_character_to_screen('A', 1, 7);
add_character_to_screen('C', 2, 7);
add_character_to_screen('R', 3, 7);
add_character_to_screen('O', 4, 7);
} else if (vehicle_status.nav_state == vehicle_status.NAVIGATION_STATE_STAB) {
add_character_to_screen('S', 1, 8);
add_character_to_screen('T', 2, 8);
add_character_to_screen('A', 3, 8);
add_character_to_screen('B', 4, 8);
add_character_to_screen('I', 5, 8);
add_character_to_screen('L', 6, 8);
add_character_to_screen('I', 7, 8);
add_character_to_screen('Z', 8, 8);
add_character_to_screen('E', 9, 8);
} else if (vehicle_status.nav_state == vehicle_status.NAVIGATION_STATE_MANUAL) {
// add_character_to_screen('A', uint8_t pos_x, uint8_t pos_y)
// add_character_to_screen('C', uint8_t pos_x, uint8_t pos_y)
// add_character_to_screen('R', uint8_t pos_x, uint8_t pos_y)
// add_character_to_screen('O', uint8_t pos_x, uint8_t pos_y)
}
// _arming_state = vehicle_status.arming_state;
} }
return PX4_OK; return PX4_OK;
} }
const char *OSDatxxxx::get_flight_mode(uint8_t nav_state)
{
const char *flight_mode = "UNKNOWN";
switch (nav_state) {
case vehicle_status_s::NAVIGATION_STATE_MANUAL:
flight_mode = "MANUAL";
break;
case vehicle_status_s::NAVIGATION_STATE_ALTCTL:
flight_mode = "ALTITUDE";
break;
case vehicle_status_s::NAVIGATION_STATE_POSCTL:
flight_mode = "POSITION";
break;
case vehicle_status_s::NAVIGATION_STATE_AUTO_RTL:
flight_mode = "RETURN";
break;
case vehicle_status_s::NAVIGATION_STATE_AUTO_MISSION:
flight_mode = "MISSION";
break;
case vehicle_status_s::NAVIGATION_STATE_AUTO_LOITER:
case vehicle_status_s::NAVIGATION_STATE_AUTO_RCRECOVER:
case vehicle_status_s::NAVIGATION_STATE_AUTO_RTGS:
case vehicle_status_s::NAVIGATION_STATE_DESCEND:
case vehicle_status_s::NAVIGATION_STATE_AUTO_TAKEOFF:
case vehicle_status_s::NAVIGATION_STATE_AUTO_LAND:
case vehicle_status_s::NAVIGATION_STATE_AUTO_FOLLOW_TARGET:
case vehicle_status_s::NAVIGATION_STATE_AUTO_PRECLAND:
flight_mode = "AUTO";
break;
case vehicle_status_s::NAVIGATION_STATE_AUTO_LANDENGFAIL:
case vehicle_status_s::NAVIGATION_STATE_AUTO_LANDGPSFAIL:
flight_mode = "FAILURE";
break;
case vehicle_status_s::NAVIGATION_STATE_ACRO:
flight_mode = "ACRO";
break;
case vehicle_status_s::NAVIGATION_STATE_TERMINATION:
flight_mode = "TERMINATE";
break;
case vehicle_status_s::NAVIGATION_STATE_OFFBOARD:
flight_mode = "OFFBOARD";
break;
case vehicle_status_s::NAVIGATION_STATE_STAB:
flight_mode = "STABILIZED";
break;
case vehicle_status_s::NAVIGATION_STATE_RATTITUDE:
flight_mode = "RATTITUDE";
break;
}
return flight_mode;
}
int int
OSDatxxxx::update_screen() OSDatxxxx::update_screen()
...@@ -449,22 +516,31 @@ OSDatxxxx::update_screen() ...@@ -449,22 +516,31 @@ OSDatxxxx::update_screen()
int ret = PX4_OK; int ret = PX4_OK;
if (_battery_valid) { if (_battery_valid) {
ret |= add_battery_symbol(1, 1); ret |= add_battery_info(1, 1);
ret |= add_battery_info(2, 1);
} else {
clear_line(1, 1, 10);
clear_line(1, 2, 10);
} }
if (_local_position_valid) { if (_local_position_valid) {
ret |= add_altitude_symbol(1, 3); ret |= add_altitude(1, 3);
ret |= add_altitude(2, 3);
} else {
clear_line(1, 3, 10);
} }
// if (_arming_state == 2) { const char *flight_mode = "";
float flight_time_sec = static_cast<float>((hrt_absolute_time() - _arming_timestamp) / (1.0e6));
ret |= add_flighttime_symbol(1, 5);
ret |= add_flighttime(flight_time_sec, 2, 5);
// }
// enable_screen(); if (_arming_state == vehicle_status_s::ARMING_STATE_ARMED) {
float flight_time_sec = static_cast<float>((hrt_absolute_time() - _arming_timestamp) / (1e6f));
ret |= add_flighttime(flight_time_sec, 1, 14);
} else {
flight_mode = get_flight_mode(_nav_state);
}
add_string_to_screen_centered(flight_mode, 12, 10);
return ret; return ret;
...@@ -489,9 +565,7 @@ OSDatxxxx::cycle() ...@@ -489,9 +565,7 @@ OSDatxxxx::cycle()
update_topics(); update_topics();
if (_battery_valid || _local_position_valid || _arming_state > 1) { update_screen();
update_screen();
}
/* schedule a fresh cycle call when the measurement is done */ /* schedule a fresh cycle call when the measurement is done */
work_queue(LPWORK, work_queue(LPWORK,
...@@ -512,6 +586,8 @@ int OSDatxxxx::print_usage(const char *reason) ...@@ -512,6 +586,8 @@ int OSDatxxxx::print_usage(const char *reason)
R"DESCR_STR( R"DESCR_STR(
### Description ### Description
OSD driver for the ATXXXX chip that is mounted on the OmnibusF4SD board for example. OSD driver for the ATXXXX chip that is mounted on the OmnibusF4SD board for example.
It can be enabled with the OSD_ATXXXX_CFG parameter.
)DESCR_STR"); )DESCR_STR");
PRINT_MODULE_USAGE_NAME("atxxxx", "driver"); PRINT_MODULE_USAGE_NAME("atxxxx", "driver");
......
...@@ -55,11 +55,6 @@ ...@@ -55,11 +55,6 @@
#include <drivers/drv_hrt.h> #include <drivers/drv_hrt.h>
#include <drivers/device/spi.h> #include <drivers/device/spi.h>
#include <uORB/uORB.h>
#include <uORB/topics/battery_status.h>
#include <uORB/topics/vehicle_local_position.h>
#include <uORB/topics/vehicle_status.h>
/* Configuration Constants */ /* Configuration Constants */
#ifdef PX4_SPI_BUS_OSD #ifdef PX4_SPI_BUS_OSD
#define OSD_BUS PX4_SPI_BUS_OSD #define OSD_BUS PX4_SPI_BUS_OSD
...@@ -80,13 +75,15 @@ ...@@ -80,13 +75,15 @@
#define OSD_DEVICE_PATH "/dev/osd" #define OSD_DEVICE_PATH "/dev/osd"
#define OSD_US 1000 /* 1 ms */
#define OSD_UPDATE_RATE 500000 /* 2 Hz */ #define OSD_UPDATE_RATE 500000 /* 2 Hz */
#define OSD_CHARS_PER_ROW 30 #define OSD_CHARS_PER_ROW 30
#define OSD_NUM_ROWS_PAL 16
#define OSD_NUM_ROWS_NTSC 13
#define OSD_ZERO_BYTE 0x00 #define OSD_ZERO_BYTE 0x00
#define OSD_PAL_TX_MODE 0x40 #define OSD_PAL_TX_MODE 0x40
/* OSD Registers addresses */ /* OSD Registers addresses */
// TODO
#ifndef CONFIG_SCHED_WORKQUEUE #ifndef CONFIG_SCHED_WORKQUEUE
...@@ -141,18 +138,20 @@ private: ...@@ -141,18 +138,20 @@ private:
int writeRegister(unsigned reg, uint8_t data); int writeRegister(unsigned reg, uint8_t data);
int add_character_to_screen(char c, uint8_t pos_x, uint8_t pos_y); int add_character_to_screen(char c, uint8_t pos_x, uint8_t pos_y);
int add_battery_symbol(uint8_t pos_x, uint8_t pos_y); void add_string_to_screen_centered(const char *str, uint8_t pos_y, int max_length);
void clear_line(uint8_t pos_x, uint8_t pos_y, int length);
int add_battery_info(uint8_t pos_x, uint8_t pos_y); int add_battery_info(uint8_t pos_x, uint8_t pos_y);
int add_altitude_symbol(uint8_t pos_x, uint8_t pos_y);
int add_altitude(uint8_t pos_x, uint8_t pos_y); int add_altitude(uint8_t pos_x, uint8_t pos_y);
int add_flighttime_symbol(uint8_t pos_x, uint8_t pos_y);
int add_flighttime(float flight_time, uint8_t pos_x, uint8_t pos_y); int add_flighttime(float flight_time, uint8_t pos_x, uint8_t pos_y);
static const char *get_flight_mode(uint8_t nav_state);
int enable_screen(); int enable_screen();
int disable_screen(); int disable_screen();
int update_topics(); int update_topics();
int update_screen(); int update_screen();
static work_s _work; static work_s _work;
...@@ -173,6 +172,9 @@ private: ...@@ -173,6 +172,9 @@ private:
uint8_t _arming_state{0}; uint8_t _arming_state{0};
uint64_t _arming_timestamp{0}; uint64_t _arming_timestamp{0};
// flight mode
uint8_t _nav_state{0};
DEFINE_PARAMETERS( DEFINE_PARAMETERS(
(ParamInt<px4::params::OSD_ATXXXX_CFG>) _param_atxxxx_cfg (ParamInt<px4::params::OSD_ATXXXX_CFG>) _param_atxxxx_cfg
) )
......
...@@ -42,6 +42,7 @@ ...@@ -42,6 +42,7 @@
* @value 2 PAL * @value 2 PAL
* *
* @reboot_required true * @reboot_required true
* @group OSD
* *
*/ */
PARAM_DEFINE_INT32(OSD_ATXXXX_CFG, 0); PARAM_DEFINE_INT32(OSD_ATXXXX_CFG, 0);
/****************************************************************************
*
* Copyright (c) 2019 PX4 Development Team. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name PX4 nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
#pragma once
/* special symbols (the chip comes preflashed with these) */
#define OSD_SYMBOL_RSSI 0x01
// Throttle Position (%)
#define OSD_SYMBOL_THR 0x04
#define OSD_SYMBOL_THR1 0x05
// Map mode
#define OSD_SYMBOL_HOME 0x04
#define OSD_SYMBOL_AIRCRAFT 0x05
// Unit Icon (Metric)
#define OSD_SYMBOL_M 0x0C
// Unit Icon (Imperial)
#define OSD_SYMBOL_FT 0x0F
// Heading Graphics
#define OSD_SYMBOL_HEADING_N 0x18
#define OSD_SYMBOL_HEADING_S 0x19
#define OSD_SYMBOL_HEADING_E 0x1A
#define OSD_SYMBOL_HEADING_W 0x1B
#define OSD_SYMBOL_HEADING_DIVIDED_LINE 0x1C
#define OSD_SYMBOL_HEADING_LINE 0x1D
// Artificial Horizon Center screen Graphics
#define OSD_SYMBOL_AH_CENTER_LINE 0x26
#define OSD_SYMBOL_AH_CENTER_LINE_RIGHT 0x27
#define OSD_SYMBOL_AH_CENTER 0x7E
#define OSD_SYMBOL_AH_RIGHT 0x02
#define OSD_SYMBOL_AH_LEFT 0x03
#define OSD_SYMBOL_AH_DECORATION 0x13
// Satellite Graphics
#define OSD_SYMBOL_SAT_L 0x1E
#define OSD_SYMBOL_SAT_R 0x1F
// Direction arrows
#define OSD_SYMBOL_ARROW_SOUTH 0x60
#define OSD_SYMBOL_ARROW_2 0x61
#define OSD_SYMBOL_ARROW_3 0x62
#define OSD_SYMBOL_ARROW_4 0x63
#define OSD_SYMBOL_ARROW_EAST 0x64
#define OSD_SYMBOL_ARROW_6 0x65
#define OSD_SYMBOL_ARROW_7 0x66
#define OSD_SYMBOL_ARROW_8 0x67
#define OSD_SYMBOL_ARROW_NORTH 0x68
#define OSD_SYMBOL_ARROW_10 0x69
#define OSD_SYMBOL_ARROW_11 0x6A
#define OSD_SYMBOL_ARROW_12 0x6B
#define OSD_SYMBOL_ARROW_WEST 0x6C
#define OSD_SYMBOL_ARROW_14 0x6D
#define OSD_SYMBOL_ARROW_15 0x6E
#define OSD_SYMBOL_ARROW_16 0x6F
// Artifical Horizon Bars
#define OSD_SYMBOL_AH_BAR9_0 0x80
#define OSD_SYMBOL_AH_BAR9_1 0x81
#define OSD_SYMBOL_AH_BAR9_2 0x82
#define OSD_SYMBOL_AH_BAR9_3 0x83
#define OSD_SYMBOL_AH_BAR9_4 0x84
#define OSD_SYMBOL_AH_BAR9_5 0x85
#define OSD_SYMBOL_AH_BAR9_6 0x86
#define OSD_SYMBOL_AH_BAR9_7 0x87
#define OSD_SYMBOL_AH_BAR9_8 0x88
// Progress bar
#define OSD_SYMBOL_PB_START 0x8A
#define OSD_SYMBOL_PB_FULL 0x8B
#define OSD_SYMBOL_PB_HALF 0x8C
#define OSD_SYMBOL_PB_EMPTY 0x8D
#define OSD_SYMBOL_PB_END 0x8E
#define OSD_SYMBOL_PB_CLOSE 0x8F
// Batt evolution
#define OSD_SYMBOL_BATT_FULL 0x90
#define OSD_SYMBOL_BATT_5 0x91
#define OSD_SYMBOL_BATT_4 0x92
#define OSD_SYMBOL_BATT_3 0x93
#define OSD_SYMBOL_BATT_2 0x94
#define OSD_SYMBOL_BATT_1 0x95
#define OSD_SYMBOL_BATT_EMPTY 0x96
// Batt Icon
#define OSD_SYMBOL_MAIN_BATT 0x97
// Voltage and amperage
#define OSD_SYMBOL_VOLT 0x06
#define OSD_SYMBOL_AMP 0x9A
#define OSD_SYMBOL_MAH 0x07
#define OSD_SYMBOL_WATT 0x57
// Time
#define OSD_SYMBOL_ON_M 0x9B
#define OSD_SYMBOL_FLY_M 0x9C
#define OSD_SYMBOL_FLIGHT_TIME 0x70
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment