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.
24 #if defined(TELEMETRY_FRSKY)
27 #elif defined(TELEMETRY_JETI)
28 // Jeti-DUPLEX Telemetry
30 #elif defined(TELEMETRY_ARDUPILOT)
31 // ArduPilot Telemetry
32 #include "ardupilot.h"
33 #elif defined(TELEMETRY_NMEA)
36 #elif defined(TELEMETRY_MAVLINK)
41 #if defined(CROSSFIRE)
42 #include "crossfire.h"
44 #if defined(MULTIMODULE)
46 #include "flysky_ibus.h"
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
;
56 extern uint8_t link_counter
;
59 enum TelemetryStates
{
64 extern uint8_t telemetryState
;
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
77 #define TELEMETRY_RX_PACKET_SIZE 19 // 9 bytes (full packet), worst case 18 bytes with byte-stuffing (+1)
80 extern uint8_t telemetryRxBuffer
[TELEMETRY_RX_PACKET_SIZE
];
81 extern uint8_t telemetryRxBufferCount
;
84 #define TELEMETRY_AVERAGE_COUNT 3
87 TELEM_CELL_INDEX_LOWEST
,
94 TELEM_CELL_INDEX_HIGHEST
,
95 TELEM_CELL_INDEX_DELTA
,
103 void set(uint16_t value
)
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
);
124 #define IS_DISTANCE_UNIT(unit) ((unit) == UNIT_METERS || (unit) == UNIT_FEET)
125 #define IS_SPEED_UNIT(unit) ((unit) >= UNIT_KTS && (unit) <= UNIT_MPH)
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()))
134 #define IS_FRSKY_SPORT_PROTOCOL() (telemetryProtocol == PROTOCOL_FRSKY_SPORT)
136 #define IS_SPEKTRUM_PROTOCOL() (telemetryProtocol == PROTOCOL_SPEKTRUM)
138 #define IS_FRSKY_D_PROTOCOL() (true)
139 #define IS_FRSKY_SPORT_PROTOCOL() (false)
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
;
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
;
162 return PROTOCOL_FRSKY_SPORT
;
167 #include "telemetry_sensors.h"
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)
176 #define LOG_TELEMETRY_WRITE_START()
177 #define LOG_TELEMETRY_WRITE_BYTE(data)
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
;
196 #define LUA_TELEMETRY_INPUT_FIFO_SIZE 256
197 extern Fifo
<uint8_t, LUA_TELEMETRY_INPUT_FIFO_SIZE
> * luaInputTelemetryFifo
;
201 #define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_XJT)
203 #define IS_TELEMETRY_INTERNAL_MODULE (false)
206 #endif // _TELEMETRY_H_