Updated Wizard for X9 radios. (#4910)
[opentx.git] / radio / src / telemetry / telemetry.h
blob730523ca6ea57de2e41f89423d313dac96727104
1 /*
2 * Copyright (C) OpenTX
4 * Based on code named
5 * th9x - http://code.google.com/p/th9x
6 * er9x - http://code.google.com/p/er9x
7 * gruvin9x - http://code.google.com/p/gruvin9x
9 * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
11 * This program is free software; you can redistribute it and/or modify
12 * it under the terms of the GNU General Public License version 2 as
13 * published by the Free Software Foundation.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
21 #ifndef _TELEMETRY_H_
22 #define _TELEMETRY_H_
24 #if defined(TELEMETRY_FRSKY)
25 // FrSky Telemetry
26 #include "frsky.h"
27 #elif defined(TELEMETRY_JETI)
28 // Jeti-DUPLEX Telemetry
29 #include "jeti.h"
30 #elif defined(TELEMETRY_ARDUPILOT)
31 // ArduPilot Telemetry
32 #include "ardupilot.h"
33 #elif defined(TELEMETRY_NMEA)
34 // NMEA Telemetry
35 #include "nmea.h"
36 #elif defined(TELEMETRY_MAVLINK)
37 // Mavlink Telemetry
38 #include "mavlink.h"
39 #endif
41 #if defined(CROSSFIRE)
42 #include "crossfire.h"
43 #endif
44 #if defined(MULTIMODULE)
45 #include "spektrum.h"
46 #include "flysky_ibus.h"
47 #include "multi.h"
48 #endif
50 extern uint8_t telemetryStreaming; // >0 (true) == data is streaming in. 0 = no data detected for some time
52 #if defined(WS_HOW_HIGH)
53 extern uint8_t wshhStreaming;
54 #endif
56 extern uint8_t link_counter;
58 #if defined(CPUARM)
59 enum TelemetryStates {
60 TELEMETRY_INIT,
61 TELEMETRY_OK,
62 TELEMETRY_KO
64 extern uint8_t telemetryState;
65 #endif
67 #define TELEMETRY_TIMEOUT10ms 100 // 1 second
69 #define TELEMETRY_SERIAL_DEFAULT 0
70 #define TELEMETRY_SERIAL_8E2 1
71 #define TELEMETRY_SERIAL_WITHOUT_DMA 2
73 #if defined(CROSSFIRE) || defined(MULTIMODULE)
74 #define TELEMETRY_RX_PACKET_SIZE 128
75 // multi module Spektrum telemetry is 18 bytes, FlySky is 37 bytes
76 #else
77 #define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
78 #endif
80 extern uint8_t telemetryRxBuffer[TELEMETRY_RX_PACKET_SIZE];
81 extern uint8_t telemetryRxBufferCount;
83 #if defined(CPUARM)
84 #define TELEMETRY_AVERAGE_COUNT 3
86 enum {
87 TELEM_CELL_INDEX_LOWEST,
88 TELEM_CELL_INDEX_1,
89 TELEM_CELL_INDEX_2,
90 TELEM_CELL_INDEX_3,
91 TELEM_CELL_INDEX_4,
92 TELEM_CELL_INDEX_5,
93 TELEM_CELL_INDEX_6,
94 TELEM_CELL_INDEX_HIGHEST,
95 TELEM_CELL_INDEX_DELTA,
98 PACK(struct CellValue
100 uint16_t value:15;
101 uint16_t state:1;
103 void set(uint16_t value)
105 if (value > 50) {
106 this->value = value;
107 this->state = 1;
112 int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, uint8_t instance, int32_t value, uint32_t unit, uint32_t prec);
113 void delTelemetryIndex(uint8_t index);
114 int availableTelemetryIndex();
115 int lastUsedTelemetryIndex();
117 int32_t getTelemetryValue(uint8_t index, uint8_t & prec);
118 int32_t convertTelemetryValue(int32_t value, uint8_t unit, uint8_t prec, uint8_t destUnit, uint8_t destPrec);
120 void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instance);
121 void frskyDSetDefault(int index, uint16_t id);
122 #endif
124 #define IS_DISTANCE_UNIT(unit) ((unit) == UNIT_METERS || (unit) == UNIT_FEET)
125 #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH)
127 #if defined(CPUARM)
128 extern uint8_t telemetryProtocol;
129 #define IS_FRSKY_D_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_D)
130 #if defined (MULTIMODULE)
131 #define IS_D16_MULTI() ((g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(false) == MM_RF_PROTO_FRSKY) && (g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16 || g_model.moduleData[EXTERNAL_MODULE].subType == MM_RF_FRSKY_SUBTYPE_D16_8CH))
132 #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT || (telemetryProtocol == PROTOCOL_MULTIMODULE && IS_D16_MULTI()))
133 #else
134 #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT)
135 #endif
136 #define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_SPEKTRUM)
137 #else
138 #define IS_FRSKY_D_PROTOCOL() (true)
139 #define IS_FRSKY_SPORT_PROTOCOL() (false)
140 #endif
142 #if defined(CPUARM)
143 inline uint8_t modelTelemetryProtocol()
145 #if defined(CROSSFIRE)
146 if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_CROSSFIRE) {
147 return PROTOCOL_PULSES_CROSSFIRE;
149 #endif
151 if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_PPM) {
152 return g_model.telemetryProtocol;
155 #if defined(MULTIMODULE)
156 if (!IS_INTERNAL_MODULE_ENABLED() && g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE) {
157 return PROTOCOL_MULTIMODULE;
159 #endif
161 // default choice
162 return PROTOCOL_FRSKY_SPORT;
164 #endif
166 #if defined(CPUARM)
167 #include "telemetry_sensors.h"
168 #endif
170 #if defined(LOG_TELEMETRY) && !defined(SIMU)
171 void logTelemetryWriteStart();
172 void logTelemetryWriteByte(uint8_t data);
173 #define LOG_TELEMETRY_WRITE_START() logTelemetryWriteStart()
174 #define LOG_TELEMETRY_WRITE_BYTE(data) logTelemetryWriteByte(data)
175 #else
176 #define LOG_TELEMETRY_WRITE_START()
177 #define LOG_TELEMETRY_WRITE_BYTE(data)
178 #endif
180 #define TELEMETRY_OUTPUT_FIFO_SIZE 16
181 extern uint8_t outputTelemetryBuffer[TELEMETRY_OUTPUT_FIFO_SIZE] __DMA;
182 extern uint8_t outputTelemetryBufferSize;
183 extern uint8_t outputTelemetryBufferTrigger;
185 inline void telemetryOutputPushByte(uint8_t byte)
187 outputTelemetryBuffer[outputTelemetryBufferSize++] = byte;
190 inline void telemetryOutputSetTrigger(uint8_t byte)
192 outputTelemetryBufferTrigger = byte;
195 #if defined(LUA)
196 #define LUA_TELEMETRY_INPUT_FIFO_SIZE 256
197 extern Fifo<uint8_t, LUA_TELEMETRY_INPUT_FIFO_SIZE> * luaInputTelemetryFifo;
198 #endif
200 #if defined(STM32)
201 #define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT)
202 #else
203 #define IS_TELEMETRY_INTERNAL_MODULE (false)
204 #endif
206 #endif // _TELEMETRY_H_