Use `-DSPACEMOUSE=YES` CMake option to activate on Horus color targets. Co-authored-by: Niel Horne (elecpower), Raphael Coeffic (raphaelcoeffic) and Peter Feerick (pfeerick).
296 lines
7.4 KiB
C++
296 lines
7.4 KiB
C++
/*
|
|
* Copyright (C) OpenTX
|
|
*
|
|
* Based on code named
|
|
* th9x - http://code.google.com/p/th9x
|
|
* er9x - http://code.google.com/p/er9x
|
|
* gruvin9x - http://code.google.com/p/gruvin9x
|
|
*
|
|
* License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef RAWSOURCE_H
|
|
#define RAWSOURCE_H
|
|
|
|
#include "boards.h"
|
|
#include "constants.h"
|
|
#include "datahelpers.h"
|
|
|
|
#include <QtCore>
|
|
|
|
class Firmware;
|
|
class ModelData;
|
|
class GeneralSettings;
|
|
class RadioDataConversionState;
|
|
|
|
enum Switches {
|
|
SWITCH_NONE,
|
|
|
|
SWITCH_THR = SWITCH_NONE+1,
|
|
SWITCH_RUD,
|
|
SWITCH_ELE,
|
|
SWITCH_ID0,
|
|
SWITCH_ID1,
|
|
SWITCH_ID2,
|
|
SWITCH_AIL,
|
|
SWITCH_GEA,
|
|
SWITCH_TRN,
|
|
|
|
SWITCH_SA0 = SWITCH_NONE+1,
|
|
SWITCH_SA1,
|
|
SWITCH_SA2,
|
|
SWITCH_SB0,
|
|
SWITCH_SB1,
|
|
SWITCH_SB2,
|
|
SWITCH_SC0,
|
|
SWITCH_SC1,
|
|
SWITCH_SC2,
|
|
SWITCH_SD0,
|
|
SWITCH_SD1,
|
|
SWITCH_SD2,
|
|
SWITCH_SE0,
|
|
SWITCH_SE1,
|
|
SWITCH_SE2,
|
|
SWITCH_SF0,
|
|
SWITCH_SF1,
|
|
SWITCH_SG0,
|
|
SWITCH_SG1,
|
|
SWITCH_SG2,
|
|
SWITCH_SH0,
|
|
SWITCH_SH2,
|
|
SWITCH_SI0,
|
|
SWITCH_SI2,
|
|
SWITCH_SJ0,
|
|
SWITCH_SJ2,
|
|
SWITCH_SK0,
|
|
SWITCH_SK2,
|
|
};
|
|
|
|
enum TimerModes {
|
|
TMRMODE_NONE,
|
|
TMRMODE_ABS,
|
|
TMRMODE_THR,
|
|
TMRMODE_THR_REL,
|
|
TMRMODE_THR_TRG,
|
|
TMRMODE_FIRST_SWITCH
|
|
};
|
|
|
|
enum FailsafeModes {
|
|
FAILSAFE_NOT_SET,
|
|
FAILSAFE_HOLD,
|
|
FAILSAFE_CUSTOM,
|
|
FAILSAFE_NOPULSES,
|
|
FAILSAFE_RECEIVER,
|
|
FAILSAFE_LAST = FAILSAFE_RECEIVER
|
|
};
|
|
|
|
enum HeliSwashTypes {
|
|
HELI_SWASH_TYPE_NONE=0,
|
|
HELI_SWASH_TYPE_120,
|
|
HELI_SWASH_TYPE_120X,
|
|
HELI_SWASH_TYPE_140,
|
|
HELI_SWASH_TYPE_90
|
|
};
|
|
|
|
enum TelemetrySource {
|
|
TELEMETRY_SOURCE_TX_BATT,
|
|
TELEMETRY_SOURCE_TX_TIME,
|
|
TELEMETRY_SOURCE_TIMER1,
|
|
TELEMETRY_SOURCE_TIMER2,
|
|
TELEMETRY_SOURCE_TIMER3,
|
|
TELEMETRY_SOURCE_RAS,
|
|
TELEMETRY_SOURCE_RSSI_TX,
|
|
TELEMETRY_SOURCE_RSSI_RX,
|
|
TELEMETRY_SOURCE_A1,
|
|
TELEMETRY_SOURCE_A2,
|
|
TELEMETRY_SOURCE_A3,
|
|
TELEMETRY_SOURCE_A4,
|
|
TELEMETRY_SOURCE_ALT,
|
|
TELEMETRY_SOURCE_RPM,
|
|
TELEMETRY_SOURCE_FUEL,
|
|
TELEMETRY_SOURCE_T1,
|
|
TELEMETRY_SOURCE_T2,
|
|
TELEMETRY_SOURCE_SPEED,
|
|
TELEMETRY_SOURCE_DIST,
|
|
TELEMETRY_SOURCE_GPS_ALT,
|
|
TELEMETRY_SOURCE_CELL,
|
|
TELEMETRY_SOURCE_CELLS_SUM,
|
|
TELEMETRY_SOURCE_VFAS,
|
|
TELEMETRY_SOURCE_CURRENT,
|
|
TELEMETRY_SOURCE_CONSUMPTION,
|
|
TELEMETRY_SOURCE_POWER,
|
|
TELEMETRY_SOURCE_ACCX,
|
|
TELEMETRY_SOURCE_ACCY,
|
|
TELEMETRY_SOURCE_ACCZ,
|
|
TELEMETRY_SOURCE_HDG,
|
|
TELEMETRY_SOURCE_VERTICAL_SPEED,
|
|
TELEMETRY_SOURCE_ASPEED,
|
|
TELEMETRY_SOURCE_DTE,
|
|
TELEMETRY_SOURCE_A1_MIN,
|
|
TELEMETRY_SOURCE_A2_MIN,
|
|
TELEMETRY_SOURCE_A3_MIN,
|
|
TELEMETRY_SOURCE_A4_MIN,
|
|
TELEMETRY_SOURCE_ALT_MIN,
|
|
TELEMETRY_SOURCE_ALT_MAX,
|
|
TELEMETRY_SOURCE_RPM_MAX,
|
|
TELEMETRY_SOURCE_T1_MAX,
|
|
TELEMETRY_SOURCE_T2_MAX,
|
|
TELEMETRY_SOURCE_SPEED_MAX,
|
|
TELEMETRY_SOURCE_DIST_MAX,
|
|
TELEMETRY_SOURCE_ASPEED_MAX,
|
|
TELEMETRY_SOURCE_CELL_MIN,
|
|
TELEMETRY_SOURCE_CELLS_MIN,
|
|
TELEMETRY_SOURCE_VFAS_MIN,
|
|
TELEMETRY_SOURCE_CURRENT_MAX,
|
|
TELEMETRY_SOURCE_POWER_MAX,
|
|
TELEMETRY_SOURCE_ACC,
|
|
TELEMETRY_SOURCE_GPS_TIME,
|
|
TELEMETRY_SOURCES_STATUS_COUNT = TELEMETRY_SOURCE_GPS_TIME+1,
|
|
TELEMETRY_SOURCES_DISPLAY_COUNT = TELEMETRY_SOURCE_POWER_MAX+1,
|
|
TELEMETRY_SOURCES_COUNT = TELEMETRY_SOURCE_POWER_MAX+1,
|
|
TELEMETRY_SOURCE_RESERVE = -1
|
|
};
|
|
|
|
enum RawSourceType {
|
|
SOURCE_TYPE_NONE,
|
|
SOURCE_TYPE_VIRTUAL_INPUT,
|
|
SOURCE_TYPE_LUA_OUTPUT,
|
|
SOURCE_TYPE_STICK, // and POTS
|
|
SOURCE_TYPE_ROTARY_ENCODER,
|
|
SOURCE_TYPE_TRIM,
|
|
SOURCE_TYPE_MAX,
|
|
SOURCE_TYPE_SWITCH,
|
|
SOURCE_TYPE_FUNCTIONSWITCH,
|
|
SOURCE_TYPE_CUSTOM_SWITCH,
|
|
SOURCE_TYPE_CYC,
|
|
SOURCE_TYPE_PPM,
|
|
SOURCE_TYPE_CH,
|
|
SOURCE_TYPE_GVAR,
|
|
SOURCE_TYPE_SPECIAL,
|
|
SOURCE_TYPE_TELEMETRY,
|
|
SOURCE_TYPE_SPACEMOUSE,
|
|
MAX_SOURCE_TYPE
|
|
};
|
|
|
|
enum RawSourceTypeSpecial {
|
|
SOURCE_TYPE_SPECIAL_TX_BATT,
|
|
SOURCE_TYPE_SPECIAL_TX_TIME,
|
|
SOURCE_TYPE_SPECIAL_TX_GPS,
|
|
SOURCE_TYPE_SPECIAL_FIRST_RESERVED,
|
|
SOURCE_TYPE_SPECIAL_RESERVED1 = SOURCE_TYPE_SPECIAL_FIRST_RESERVED,
|
|
SOURCE_TYPE_SPECIAL_RESERVED2,
|
|
SOURCE_TYPE_SPECIAL_RESERVED3,
|
|
SOURCE_TYPE_SPECIAL_RESERVED4,
|
|
SOURCE_TYPE_SPECIAL_LAST_RESERVED = SOURCE_TYPE_SPECIAL_RESERVED4,
|
|
SOURCE_TYPE_SPECIAL_FIRST_TIMER,
|
|
SOURCE_TYPE_SPECIAL_TIMER1 = SOURCE_TYPE_SPECIAL_FIRST_TIMER,
|
|
SOURCE_TYPE_SPECIAL_TIMER2,
|
|
SOURCE_TYPE_SPECIAL_TIMER3,
|
|
SOURCE_TYPE_SPECIAL_LAST_TIMER = SOURCE_TYPE_SPECIAL_TIMER3,
|
|
SOURCE_TYPE_SPECIAL_COUNT
|
|
};
|
|
|
|
constexpr int SOURCE_TYPE_STICK_THR_IDX { 3 }; // TODO is there a function to determine index?
|
|
|
|
class RawSourceRange
|
|
{
|
|
Q_DECLARE_TR_FUNCTIONS(RawSourceRange)
|
|
|
|
public:
|
|
RawSourceRange():
|
|
decimals(0),
|
|
min(0.0),
|
|
max(0.0),
|
|
step(1.0),
|
|
offset(0.0)
|
|
{
|
|
}
|
|
|
|
float getValue(int value);
|
|
|
|
int decimals;
|
|
double min;
|
|
double max;
|
|
double step;
|
|
double offset;
|
|
QString unit;
|
|
};
|
|
|
|
#define RANGE_DELTA_FUNCTION 1
|
|
#define RANGE_ABS_FUNCTION 2
|
|
|
|
class RawSource {
|
|
Q_DECLARE_TR_FUNCTIONS(RawSource)
|
|
|
|
public:
|
|
enum SourceGroups {
|
|
NoneGroup = 0x001,
|
|
SourcesGroup = 0x002,
|
|
TrimsGroup = 0x004,
|
|
SwitchesGroup = 0x008,
|
|
GVarsGroup = 0x010,
|
|
TelemGroup = 0x020,
|
|
InputsGroup = 0x040,
|
|
ScriptsGroup = 0x080,
|
|
|
|
InputSourceGroups = NoneGroup | SourcesGroup | TrimsGroup | SwitchesGroup | InputsGroup,
|
|
AllSourceGroups = InputSourceGroups | GVarsGroup | TelemGroup | ScriptsGroup
|
|
};
|
|
|
|
RawSource() { clear(); }
|
|
|
|
explicit RawSource(int value):
|
|
type(RawSourceType(abs(value)/65536)),
|
|
index(value >= 0 ? abs(value)%65536 : -(abs(value)%65536))
|
|
{
|
|
}
|
|
|
|
RawSource(RawSourceType type, int index=0):
|
|
type(type),
|
|
index(index)
|
|
{
|
|
}
|
|
|
|
inline const int toValue() const
|
|
{
|
|
return index >= 0 ? (type * 65536 + index) : -(type * 65536 - index);
|
|
}
|
|
|
|
RawSource convert(RadioDataConversionState & cstate);
|
|
QString toString(const ModelData * model = NULL, const GeneralSettings * const generalSettings = NULL, Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
RawSourceRange getRange(const ModelData * model, const GeneralSettings & settings, unsigned int flags=0) const;
|
|
bool isStick(int * potsIndex = NULL, Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
bool isPot(int * potsIndex = NULL, Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
bool isSlider(int * sliderIndex = NULL, Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
bool isTimeBased(Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
bool isAvailable(const ModelData * const model = NULL, const GeneralSettings * const gs = NULL, Board::Type board = Board::BOARD_UNKNOWN) const;
|
|
bool isSet() const { return type != SOURCE_TYPE_NONE || index != 0; }
|
|
void clear() { type = SOURCE_TYPE_NONE; index = 0; }
|
|
QStringList getStickList(Boards board) const;
|
|
QStringList getSwitchList(Boards board) const;
|
|
static StringTagMappingTable getSpecialTypesLookupTable();
|
|
static StringTagMappingTable getCyclicLookupTable();
|
|
|
|
bool operator == ( const RawSource & other) const {
|
|
return (this->type == other.type) && (this->index == other.index);
|
|
}
|
|
|
|
bool operator != ( const RawSource & other) const {
|
|
return (this->type != other.type) || (this->index != other.index);
|
|
}
|
|
|
|
RawSourceType type;
|
|
int index;
|
|
};
|
|
|
|
#endif // RAWSOURCE_H
|