added support for min/max contrast to eeprom interface and use it (#5473)
[opentx.git] / companion / src / eeprominterface.h
blob31f897d50d0687729ca4dfd761ede815db1ca015
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 _EEPROMINTERFACE_H_
22 #define _EEPROMINTERFACE_H_
24 #include "macros.h"
25 #include "radiodata.h"
26 #include "../../radio/src/definitions.h"
27 #include "simulatorinterface.h"
28 #include <QStringList>
29 #include <QList>
30 #include <iostream>
31 #include <QDebug>
33 const uint8_t modn12x3[4][4]= {
34 {1, 2, 3, 4},
35 {1, 3, 2, 4},
36 {4, 2, 3, 1},
37 {4, 3, 2, 1} };
39 enum Capability {
40 Models,
41 ModelName,
42 FlightModes,
43 FlightModesName,
44 FlightModesHaveFades,
45 Imperial,
46 Mixes,
47 Timers,
48 TimersName,
49 VoicesAsNumbers,
50 VoicesMaxLength,
51 MultiLangVoice,
52 ModelImage,
53 CustomFunctions,
54 SafetyChannelCustomFunction,
55 LogicalSwitches,
56 CustomAndSwitches,
57 HasNegAndSwitches,
58 LogicalSwitchesExt,
59 RotaryEncoders,
60 Outputs,
61 ChannelsName,
62 ExtraInputs,
63 TrimsRange,
64 ExtendedTrimsRange,
65 NumCurves,
66 NumCurvePoints,
67 OffsetWeight,
68 Simulation,
69 SoundMod,
70 SoundPitch,
71 MaxVolume,
72 MaxContrast,
73 MinContrast,
74 Haptic,
75 HasBeeper,
76 ModelTrainerEnable,
77 HasExpoNames,
78 HasNoExpo,
79 HasMixerNames,
80 HasCvNames,
81 HasPxxCountry,
82 HasPPMStart,
83 HasGeneralUnits,
84 HasFAIMode,
85 OptrexDisplay,
86 PPMExtCtrl,
87 PPMFrameLength,
88 Telemetry,
89 TelemetryUnits,
90 TelemetryBars,
91 Heli,
92 Gvars,
93 GvarsInCS,
94 GvarsAreNamed,
95 GvarsFlightModes,
96 GvarsName,
97 NoTelemetryProtocol,
98 TelemetryCustomScreens,
99 TelemetryCustomScreensFieldsPerLine,
100 TelemetryMaxMultiplier,
101 HasVario,
102 HasVarioSink,
103 HasFailsafe,
104 HasSoundMixer,
105 NumModules,
106 PPMCenter,
107 PPMUnitMicroseconds,
108 SYMLimits,
109 HastxCurrentCalibration,
110 HasVolume,
111 HasBrightness,
112 PerModelTimers,
113 SlowScale,
114 SlowRange,
115 PermTimers,
116 HasSDLogs,
117 CSFunc,
118 LcdWidth,
119 LcdHeight,
120 LcdDepth,
121 GetThrSwitch,
122 HasDisplayText,
123 HasTopLcd,
124 GlobalFunctions,
125 VirtualInputs,
126 InputsLength,
127 TrainerInputs,
128 RtcTime,
129 SportTelemetry,
130 LuaScripts,
131 LuaInputsPerScript,
132 LuaOutputsPerScript,
133 LimitsPer1000,
134 EnhancedCurves,
135 HasFasOffset,
136 HasMahPersistent,
137 MultiposPots,
138 MultiposPotsPositions,
139 SimulatorVariant,
140 MavlinkTelemetry,
141 HasInputDiff,
142 HasMixerExpo,
143 HasBatMeterRange,
144 DangerousFunctions,
145 HasModelCategories
148 class SimulatorInterface;
149 class EEPROMInterface
151 public:
153 EEPROMInterface(Board::Type board):
154 board(board)
158 virtual ~EEPROMInterface() {}
160 inline Board::Type getBoard() { return board; }
162 virtual unsigned long load(RadioData &radioData, const uint8_t * eeprom, int size) = 0;
164 virtual unsigned long loadBackup(RadioData & radioData, const uint8_t * eeprom, int esize, int index) = 0;
166 virtual int save(uint8_t * eeprom, const RadioData & radioData, uint8_t version=0, uint32_t variant=0) = 0;
168 virtual int getSize(const ModelData &) = 0;
170 virtual int getSize(const GeneralSettings &) = 0;
172 protected:
174 Board::Type board;
176 private:
178 EEPROMInterface();
182 /* EEPROM string conversion functions */
183 void setEEPROMString(char *dst, const char *src, int size);
184 void getEEPROMString(char *dst, const char *src, int size);
186 float ValToTim(int value);
187 int TimToVal(float value);
189 inline int applyStickMode(int stick, unsigned int mode)
191 if (mode == 0 || mode > 4) {
192 std::cerr << "Incorrect stick mode" << mode;
193 return stick;
196 if (stick >= 1 && stick <= 4)
197 return modn12x3[mode-1][stick-1];
198 else
199 return stick;
202 void registerEEpromInterfaces();
203 void unregisterEEpromInterfaces();
204 void registerOpenTxFirmwares();
205 void unregisterOpenTxFirmwares();
207 enum EepromLoadErrors {
208 ALL_OK,
209 UNKNOWN_ERROR,
210 UNSUPPORTED_NEWER_VERSION,
211 WRONG_SIZE,
212 WRONG_FILE_SYSTEM,
213 NOT_OPENTX,
214 NOT_TH9X,
215 NOT_GRUVIN9X,
216 NOT_ERSKY9X,
217 NOT_ER9X,
218 UNKNOWN_BOARD,
219 WRONG_BOARD,
220 BACKUP_NOT_SUPPORTED,
222 HAS_WARNINGS,
223 OLD_VERSION,
224 WARNING_WRONG_FIRMWARE,
226 NUM_ERRORS
229 void ShowEepromErrors(QWidget *parent, const QString &title, const QString &mainMessage, unsigned long errorsFound);
230 void ShowEepromWarnings(QWidget *parent, const QString &title, unsigned long errorsFound);
233 struct Option {
234 const char * name;
235 QString tooltip;
236 uint32_t variant;
239 class Firmware {
241 public:
242 Firmware(const QString & id, const QString & name, Board::Type board):
243 id(id),
244 name(name),
245 board(board),
246 variantBase(0),
247 base(NULL),
248 eepromInterface(NULL)
252 Firmware(Firmware * base, const QString & id, const QString & name, Board::Type board):
253 id(id),
254 name(name),
255 board(board),
256 variantBase(0),
257 base(base),
258 eepromInterface(NULL)
262 virtual ~Firmware()
266 inline const Firmware * getFirmwareBase() const
268 return base ? base : this;
271 virtual Firmware * getFirmwareVariant(const QString & id) { return NULL; }
273 unsigned int getVariantNumber();
275 virtual void addLanguage(const char *lang);
277 virtual void addTTSLanguage(const char *lang);
279 virtual void addOption(const char *option, QString tooltip="", uint32_t variant=0);
281 virtual void addOptions(Option options[]);
283 virtual QString getStampUrl() = 0;
285 virtual QString getReleaseNotesUrl() = 0;
287 virtual QString getFirmwareUrl() = 0;
289 Board::Type getBoard() const
291 return board;
294 void setEEpromInterface(EEPROMInterface * eeprom)
296 eepromInterface = eeprom;
299 EEPROMInterface * getEEpromInterface()
301 return eepromInterface;
304 QString getName() const
306 return name;
309 QString getId() const
311 return id;
314 virtual int getCapability(Capability) = 0;
316 virtual QString getAnalogInputName(unsigned int index) = 0;
318 virtual QTime getMaxTimerStart() = 0;
320 virtual int isAvailable(PulsesProtocol proto, int port=0) = 0;
322 const int getFlashSize();
324 static Firmware * getFirmwareForId(const QString & id);
326 static QVector<Firmware *> getRegisteredFirmwares()
328 return registeredFirmwares;
330 static void addRegisteredFirmware(Firmware * fw)
332 registeredFirmwares.append(fw);
335 static Firmware * getDefaultVariant()
337 return defaultVariant;
339 static void setDefaultVariant(Firmware * value)
341 defaultVariant = value;
344 static Firmware * getCurrentVariant()
346 return currentVariant;
348 static void setCurrentVariant(Firmware * value)
350 currentVariant = value;
353 public:
354 QList<const char *> languages;
355 QList<const char *> ttslanguages;
356 QList< QList<Option> > opts;
359 protected:
360 QString id;
361 QString name;
362 Board::Type board;
363 unsigned int variantBase;
364 Firmware * base;
365 EEPROMInterface * eepromInterface;
367 static QVector<Firmware *> registeredFirmwares;
368 static Firmware * defaultVariant;
369 static Firmware * currentVariant;
371 private:
372 Firmware();
376 inline Firmware * getCurrentFirmware()
378 return Firmware::getCurrentVariant();
381 inline EEPROMInterface * getCurrentEEpromInterface()
383 return Firmware::getCurrentVariant()->getEEpromInterface();
386 inline Board::Type getCurrentBoard()
388 return Firmware::getCurrentVariant()->getBoard();
391 inline int divRoundClosest(const int n, const int d)
393 return ((n < 0) ^ (d < 0)) ? ((n - d/2)/d) : ((n + d/2)/d);
396 inline int calcRESXto100(int x)
398 return divRoundClosest(x*100, 1024);
401 #define CHECK_IN_ARRAY(T, index) ((unsigned int)index < DIM(T) ? T[(unsigned int)index] : "???")
403 extern QList<EEPROMInterface *> eepromInterfaces;
405 bool loadFile(RadioData & radioData, const QString & filename);
408 #endif // _EEPROMINTERFACE_H_