mirror of
https://github.com/EdgeTX/edgetx.git
synced 2025-07-21 15:25:12 +03:00
Merge branch '2.3' of https://github.com/opentx/opentx into 2.3
This commit is contained in:
commit
b8408e3b53
61 changed files with 544 additions and 388 deletions
|
@ -44,6 +44,20 @@ bool ModuleData::isPxx2Module() const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool ModuleData::isPxx1Module() const
|
||||||
|
{
|
||||||
|
switch(protocol){
|
||||||
|
case PULSES_PXX_XJT_X16:
|
||||||
|
case PULSES_PXX_R9M:
|
||||||
|
case PULSES_PXX_R9M_LITE:
|
||||||
|
case PULSES_PXX_R9M_LITE_PRO:
|
||||||
|
return true;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QString ModuleData::rfProtocolToString() const
|
QString ModuleData::rfProtocolToString() const
|
||||||
{
|
{
|
||||||
switch (protocol) {
|
switch (protocol) {
|
||||||
|
|
|
@ -183,6 +183,7 @@ class ModuleData {
|
||||||
void clear() { memset(this, 0, sizeof(ModuleData)); }
|
void clear() { memset(this, 0, sizeof(ModuleData)); }
|
||||||
void convert(RadioDataConversionState & cstate);
|
void convert(RadioDataConversionState & cstate);
|
||||||
bool isPxx2Module() const;
|
bool isPxx2Module() const;
|
||||||
|
bool isPxx1Module() const;
|
||||||
QString polarityToString() const { return ppm.pulsePol ? tr("Positive") : tr("Negative"); }
|
QString polarityToString() const { return ppm.pulsePol ? tr("Positive") : tr("Negative"); }
|
||||||
QString rfProtocolToString() const;
|
QString rfProtocolToString() const;
|
||||||
QString subTypeToString(int type = -1) const;
|
QString subTypeToString(int type = -1) const;
|
||||||
|
|
|
@ -1856,10 +1856,11 @@ class CustomScreenField: public StructField {
|
||||||
|
|
||||||
class SensorField: public TransformedField {
|
class SensorField: public TransformedField {
|
||||||
public:
|
public:
|
||||||
SensorField(DataField * parent, SensorData & sensor, Board::Type board, unsigned int version):
|
SensorField(DataField * parent, const ModelData& model, SensorData & sensor, Board::Type board, unsigned int version):
|
||||||
TransformedField(parent, internalField),
|
TransformedField(parent, internalField),
|
||||||
internalField(this, "Sensor"),
|
internalField(this, "Sensor"),
|
||||||
sensor(sensor),
|
sensor(sensor),
|
||||||
|
model(model),
|
||||||
version(version),
|
version(version),
|
||||||
_param(0)
|
_param(0)
|
||||||
{
|
{
|
||||||
|
@ -1921,7 +1922,10 @@ class SensorField: public TransformedField {
|
||||||
if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) {
|
if (sensor.type == SensorData::TELEM_TYPE_CUSTOM) {
|
||||||
sensor.id = _id;
|
sensor.id = _id;
|
||||||
sensor.subid = _subid;
|
sensor.subid = _subid;
|
||||||
sensor.instance = (_instance & 0x1F) + (version <= 218 ? -1 : 0); // 5 bits instance
|
if (model.moduleData[0].isPxx1Module() || model.moduleData[1].isPxx1Module())
|
||||||
|
sensor.instance = (_instance & 0x1F) + (version <= 218 ? -1 : 0); // 5 bits instance
|
||||||
|
else
|
||||||
|
sensor.instance = _instance;
|
||||||
sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx
|
sensor.rxIdx = (_instance >> 5) & 0x03; // 2 bits Rx idx
|
||||||
sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx
|
sensor.moduleIdx = (_instance >> 7) & 0x1; // 1 bit module idx
|
||||||
sensor.ratio = _ratio;
|
sensor.ratio = _ratio;
|
||||||
|
@ -1954,6 +1958,7 @@ class SensorField: public TransformedField {
|
||||||
protected:
|
protected:
|
||||||
StructField internalField;
|
StructField internalField;
|
||||||
SensorData & sensor;
|
SensorData & sensor;
|
||||||
|
const ModelData& model;
|
||||||
unsigned int version;
|
unsigned int version;
|
||||||
unsigned int _id;
|
unsigned int _id;
|
||||||
unsigned int _subid;
|
unsigned int _subid;
|
||||||
|
@ -2426,7 +2431,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, Board::Type board, unsig
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i=0; i<MAX_TELEMETRY_SENSORS(board, version); ++i) {
|
for (int i=0; i<MAX_TELEMETRY_SENSORS(board, version); ++i) {
|
||||||
internalField.Append(new SensorField(this, modelData.sensorData[i], board, version));
|
internalField.Append(new SensorField(this, modelData, modelData.sensorData[i], board, version));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_TARANIS_X9E(board)) {
|
if (IS_TARANIS_X9E(board)) {
|
||||||
|
|
|
@ -97,7 +97,7 @@ void *bin_l_alloc (void *ud, void *ptr, size_t osize, size_t nsize)
|
||||||
free(ptr);
|
free(ptr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
#if defined(DEBUG)
|
#if defined(DEBUG)
|
||||||
|
|
|
@ -95,7 +95,7 @@ char * Bluetooth::readline(bool error_reset)
|
||||||
state = BLUETOOTH_STATE_OFF;
|
state = BLUETOOTH_STATE_OFF;
|
||||||
wakeupTime = get_tmr10ms() + 100; /* 1s */
|
wakeupTime = get_tmr10ms() + 100; /* 1s */
|
||||||
#endif
|
#endif
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -70,7 +70,7 @@ int toLongLongInt(const char ** argv, int index, long long int * val)
|
||||||
base = 16;
|
base = 16;
|
||||||
s = &argv[index][2];
|
s = &argv[index][2];
|
||||||
}
|
}
|
||||||
char * endptr = NULL;
|
char * endptr = nullptr;
|
||||||
*val = strtoll(s, &endptr, base);
|
*val = strtoll(s, &endptr, base);
|
||||||
if (*endptr == '\0')
|
if (*endptr == '\0')
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -782,7 +782,7 @@ const MemArea memAreas[] = {
|
||||||
{ "USART1", USART1, sizeof(USART_TypeDef) },
|
{ "USART1", USART1, sizeof(USART_TypeDef) },
|
||||||
{ "USART2", USART2, sizeof(USART_TypeDef) },
|
{ "USART2", USART2, sizeof(USART_TypeDef) },
|
||||||
{ "USART3", USART3, sizeof(USART_TypeDef) },
|
{ "USART3", USART3, sizeof(USART_TypeDef) },
|
||||||
{ NULL, NULL, 0 },
|
{ nullptr, nullptr, 0 },
|
||||||
};
|
};
|
||||||
|
|
||||||
int cliSet(const char ** argv)
|
int cliSet(const char ** argv)
|
||||||
|
@ -947,7 +947,7 @@ int cliDisplay(const char ** argv)
|
||||||
{
|
{
|
||||||
long long int address = 0;
|
long long int address = 0;
|
||||||
|
|
||||||
for (const MemArea * area = memAreas; area->name != NULL; area++) {
|
for (const MemArea * area = memAreas; area->name != nullptr; area++) {
|
||||||
if (!strcmp(area->name, argv[1])) {
|
if (!strcmp(area->name, argv[1])) {
|
||||||
dump((uint8_t *)area->start, area->size);
|
dump((uint8_t *)area->start, area->size);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1218,12 +1218,12 @@ const CliCommand cliCommands[] = {
|
||||||
#if defined(BLUETOOTH)
|
#if defined(BLUETOOTH)
|
||||||
{ "bt", cliBlueTooth, "<baudrate>|<command>" },
|
{ "bt", cliBlueTooth, "<baudrate>|<command>" },
|
||||||
#endif
|
#endif
|
||||||
{ NULL, NULL, NULL } /* sentinel */
|
{ nullptr, nullptr, nullptr } /* sentinel */
|
||||||
};
|
};
|
||||||
|
|
||||||
int cliHelp(const char ** argv)
|
int cliHelp(const char ** argv)
|
||||||
{
|
{
|
||||||
for (const CliCommand * command = cliCommands; command->name != NULL; command++) {
|
for (const CliCommand * command = cliCommands; command->name != nullptr; command++) {
|
||||||
if (argv[1][0] == '\0' || !strcmp(command->name, argv[0])) {
|
if (argv[1][0] == '\0' || !strcmp(command->name, argv[0])) {
|
||||||
serialPrint("%s %s", command->name, command->args);
|
serialPrint("%s %s", command->name, command->args);
|
||||||
if (argv[1][0] != '\0') {
|
if (argv[1][0] != '\0') {
|
||||||
|
@ -1242,7 +1242,7 @@ int cliExecCommand(const char ** argv)
|
||||||
if (argv[0][0] == '\0')
|
if (argv[0][0] == '\0')
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
for (const CliCommand * command = cliCommands; command->name != NULL; command++) {
|
for (const CliCommand * command = cliCommands; command->name != nullptr; command++) {
|
||||||
if (!strcmp(command->name, argv[0])) {
|
if (!strcmp(command->name, argv[0])) {
|
||||||
return command->func(argv);
|
return command->func(argv);
|
||||||
}
|
}
|
||||||
|
|
|
@ -249,12 +249,16 @@ enum UartModes {
|
||||||
|
|
||||||
enum TelemetryProtocol
|
enum TelemetryProtocol
|
||||||
{
|
{
|
||||||
TELEM_PROTO_FRSKY_D,
|
PROTOCOL_TELEMETRY_FIRST,
|
||||||
TELEM_PROTO_FRSKY_SPORT,
|
PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST,
|
||||||
TELEM_PROTO_CROSSFIRE,
|
PROTOCOL_TELEMETRY_FRSKY_D,
|
||||||
TELEM_PROTO_SPEKTRUM,
|
PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY,
|
||||||
TELEM_PROTO_LUA,
|
PROTOCOL_TELEMETRY_CROSSFIRE,
|
||||||
TELEM_PROTO_FLYSKY_IBUS,
|
PROTOCOL_TELEMETRY_SPEKTRUM,
|
||||||
|
PROTOCOL_TELEMETRY_FLYSKY_IBUS,
|
||||||
|
PROTOCOL_TELEMETRY_MULTIMODULE,
|
||||||
|
PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE,
|
||||||
|
PROTOCOL_TELEMETRY_LUA
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TELEM_LABEL_LEN 4
|
#define TELEM_LABEL_LEN 4
|
||||||
|
|
|
@ -379,7 +379,7 @@ PACK(struct TelemetrySensor {
|
||||||
int32_t getPrecDivisor() const;
|
int32_t getPrecDivisor() const;
|
||||||
bool isSameInstance(TelemetryProtocol protocol, uint8_t instance)
|
bool isSameInstance(TelemetryProtocol protocol, uint8_t instance)
|
||||||
{
|
{
|
||||||
if (protocol == TELEM_PROTO_FRSKY_SPORT) {
|
if (protocol == PROTOCOL_TELEMETRY_FRSKY_SPORT) {
|
||||||
if (((this->instance ^ instance) & 0x9F) == 0) {
|
if (((this->instance ^ instance) & 0x9F) == 0) {
|
||||||
this->instance = instance; // update the instance in case we had telemetry switching
|
this->instance = instance; // update the instance in case we had telemetry switching
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -22,12 +22,6 @@ set(GUI_SRC
|
||||||
view_statistics.cpp
|
view_statistics.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SRC
|
|
||||||
${SRC}
|
|
||||||
gui/common/widgets.cpp
|
|
||||||
gui/common/arm/widgets.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
if(FLIGHT_MODES)
|
if(FLIGHT_MODES)
|
||||||
set(GUI_SRC
|
set(GUI_SRC
|
||||||
${GUI_SRC}
|
${GUI_SRC}
|
||||||
|
|
|
@ -813,21 +813,6 @@ void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att)
|
||||||
drawSwitch(x, y, mode, att);
|
drawSwitch(x, y, mode, att);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att)
|
|
||||||
{
|
|
||||||
trim_t v = getRawTrimValue(fm, idx);
|
|
||||||
uint8_t mode = v.mode;
|
|
||||||
uint8_t p = mode >> 1;
|
|
||||||
char s[] = "--";
|
|
||||||
if (mode != TRIM_MODE_NONE) {
|
|
||||||
if (mode % 2 == 0)
|
|
||||||
s[0] = ':';
|
|
||||||
else
|
|
||||||
s[0] = '+';
|
|
||||||
s[1] = '0'+p;
|
|
||||||
}
|
|
||||||
lcdDrawText(x, y, s, att);
|
|
||||||
}
|
|
||||||
void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att)
|
void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att)
|
||||||
{
|
{
|
||||||
trim_t v = getRawTrimValue(fm, idx);
|
trim_t v = getRawTrimValue(fm, idx);
|
||||||
|
@ -841,15 +826,6 @@ void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags a
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
|
|
||||||
{
|
|
||||||
// convertUnit(val, unit);
|
|
||||||
lcdDrawNumber(x, y, val, att & (~NO_UNIT));
|
|
||||||
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
|
|
||||||
lcdDrawTextAtIndex(lcdLastRightPos/*+1*/, y, STR_VTELEMUNIT, unit, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags att, bool seconds=true)
|
void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags att, bool seconds=true)
|
||||||
{
|
{
|
||||||
att &= ~RIGHT & ~BOLD;
|
att &= ~RIGHT & ~BOLD;
|
||||||
|
|
|
@ -130,7 +130,6 @@ void drawSource(coord_t x, coord_t y, mixsrc_t idx, LcdFlags att=0);
|
||||||
void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
|
void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
|
||||||
void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0);
|
void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0);
|
||||||
|
|
||||||
void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att);
|
|
||||||
void drawShortTrimMode(coord_t x, coord_t y, uint8_t mode, uint8_t idx, LcdFlags att);
|
void drawShortTrimMode(coord_t x, coord_t y, uint8_t mode, uint8_t idx, LcdFlags att);
|
||||||
|
|
||||||
#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att)
|
#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att)
|
||||||
|
|
|
@ -33,7 +33,7 @@ void onModelCustomScriptMenu(const char *result)
|
||||||
ScriptData &sd = g_model.scriptsData[s_currIdx];
|
ScriptData &sd = g_model.scriptsData[s_currIdx];
|
||||||
|
|
||||||
if (result == STR_UPDATE_LIST) {
|
if (result == STR_UPDATE_LIST) {
|
||||||
if (!sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), NULL)) {
|
if (!sdListFiles(SCRIPTS_MIXES_PATH, SCRIPTS_EXT, sizeof(sd.file), nullptr)) {
|
||||||
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);
|
POPUP_WARNING(STR_NO_SCRIPTS_ON_SD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,7 +31,7 @@ const unsigned char sticks[] = {
|
||||||
#define SLIDER_5POS(y, value, label, event, attr) { \
|
#define SLIDER_5POS(y, value, label, event, attr) { \
|
||||||
int8_t tmp = value; \
|
int8_t tmp = value; \
|
||||||
drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, 2+tmp, 4, attr); \
|
drawSlider(RADIO_SETUP_2ND_COLUMN, y, LCD_W - 2 - RADIO_SETUP_2ND_COLUMN, 2+tmp, 4, attr); \
|
||||||
value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, NULL, tmp, -2, +2, attr, event); \
|
value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, nullptr, tmp, -2, +2, attr, event); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SPLASH)
|
#if defined(SPLASH)
|
||||||
|
|
|
@ -550,7 +550,7 @@ void menuMainView(event_t event)
|
||||||
lcdDrawText(lcdLastRightPos, 5*FH, "%", BOLD);
|
lcdDrawText(lcdLastRightPos, 5*FH, "%", BOLD);
|
||||||
}
|
}
|
||||||
lcdDrawText(lcdLastRightPos, 5*FH, "]", BOLD);
|
lcdDrawText(lcdLastRightPos, 5*FH, "]", BOLD);
|
||||||
warningText = NULL;
|
warningText = nullptr;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -22,12 +22,6 @@ set(GUI_SRC
|
||||||
view_statistics.cpp
|
view_statistics.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SRC
|
|
||||||
${SRC}
|
|
||||||
gui/common/widgets.cpp
|
|
||||||
gui/common/arm/widgets.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
if(FLIGHT_MODES)
|
if(FLIGHT_MODES)
|
||||||
set(GUI_SRC
|
set(GUI_SRC
|
||||||
${GUI_SRC}
|
${GUI_SRC}
|
||||||
|
|
|
@ -718,33 +718,6 @@ void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att)
|
||||||
drawSwitch(x, y, mode, att);
|
drawSwitch(x, y, mode, att);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att)
|
|
||||||
{
|
|
||||||
trim_t v = getRawTrimValue(phase, idx);
|
|
||||||
unsigned int mode = v.mode;
|
|
||||||
unsigned int p = mode >> 1;
|
|
||||||
|
|
||||||
if (mode == TRIM_MODE_NONE) {
|
|
||||||
lcdDrawText(x, y, "--", att);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (mode % 2 == 0)
|
|
||||||
lcdDrawChar(x, y, ':', att|FIXEDWIDTH);
|
|
||||||
else
|
|
||||||
lcdDrawChar(x, y, '+', att|FIXEDWIDTH);
|
|
||||||
lcdDrawChar(lcdNextPos, y, '0'+p, att);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
|
|
||||||
{
|
|
||||||
// convertUnit(val, unit);
|
|
||||||
lcdDrawNumber(x, y, val, att & (~NO_UNIT));
|
|
||||||
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
|
|
||||||
lcdDrawTextAtIndex(lcdLastRightPos/*+1*/, y, STR_VTELEMUNIT, unit, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags att, bool seconds=true)
|
void drawGPSCoord(coord_t x, coord_t y, int32_t value, const char * direction, LcdFlags att, bool seconds=true)
|
||||||
{
|
{
|
||||||
uint32_t absvalue = abs(value);
|
uint32_t absvalue = abs(value);
|
||||||
|
|
|
@ -123,7 +123,6 @@ void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0);
|
||||||
void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0);
|
void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0);
|
||||||
void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
|
void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
|
||||||
void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0);
|
void drawTimerMode(coord_t x, coord_t y, swsrc_t mode, LcdFlags att=0);
|
||||||
void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att);
|
|
||||||
|
|
||||||
#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att)
|
#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att)
|
||||||
void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr);
|
void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr);
|
||||||
|
|
|
@ -143,7 +143,7 @@ void copySelection(char * dst, const char * src, uint8_t size)
|
||||||
void onModelSetupBitmapMenu(const char * result)
|
void onModelSetupBitmapMenu(const char * result)
|
||||||
{
|
{
|
||||||
if (result == STR_UPDATE_LIST) {
|
if (result == STR_UPDATE_LIST) {
|
||||||
if (!sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), NULL)) {
|
if (!sdListFiles(BITMAPS_PATH, BITMAPS_EXT, sizeof(g_model.header.bitmap), nullptr)) {
|
||||||
POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
|
POPUP_WARNING(STR_NO_BITMAPS_ON_SD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,7 +52,7 @@ void onCustomFunctionsFileSelectionMenu(const char * result)
|
||||||
strcpy(directory, SOUNDS_PATH);
|
strcpy(directory, SOUNDS_PATH);
|
||||||
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
|
strncpy(directory+SOUNDS_PATH_LNG_OFS, currentLanguagePack->id, 2);
|
||||||
}
|
}
|
||||||
if (!sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), NULL)) {
|
if (!sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), nullptr)) {
|
||||||
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
|
POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ const unsigned char sticks[] = {
|
||||||
#define SLIDER_5POS(y, value, label, event, attr) { \
|
#define SLIDER_5POS(y, value, label, event, attr) { \
|
||||||
int8_t tmp = value; \
|
int8_t tmp = value; \
|
||||||
drawSlider(RADIO_SETUP_2ND_COLUMN, y, 2+tmp, 4, attr); \
|
drawSlider(RADIO_SETUP_2ND_COLUMN, y, 2+tmp, 4, attr); \
|
||||||
value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, NULL, tmp, -2, +2, attr, event); \
|
value = editChoice(RADIO_SETUP_2ND_COLUMN, y, label, nullptr, tmp, -2, +2, attr, event); \
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SPLASH)
|
#if defined(SPLASH)
|
||||||
|
|
|
@ -92,7 +92,7 @@ choice_t editChoice(coord_t x, coord_t y, const char * label, const char *values
|
||||||
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char *label, LcdFlags attr, event_t event )
|
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const char *label, LcdFlags attr, event_t event )
|
||||||
{
|
{
|
||||||
drawCheckBox(x, y, value, attr);
|
drawCheckBox(x, y, value, attr);
|
||||||
return editChoice(x, y, label, NULL, value, 0, 1, attr, event);
|
return editChoice(x, y, label, nullptr, value, 0, 1, attr, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event)
|
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event)
|
||||||
|
|
|
@ -26,12 +26,6 @@ set(GUI_SRC
|
||||||
view_statistics.cpp
|
view_statistics.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
set(SRC
|
|
||||||
${SRC}
|
|
||||||
gui/common/widgets.cpp
|
|
||||||
gui/common/arm/widgets.cpp
|
|
||||||
)
|
|
||||||
|
|
||||||
if(FLIGHT_MODES)
|
if(FLIGHT_MODES)
|
||||||
set(GUI_SRC
|
set(GUI_SRC
|
||||||
${GUI_SRC}
|
${GUI_SRC}
|
||||||
|
|
|
@ -18,11 +18,11 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _WIDGETS_H_
|
#ifndef _DRAW_FUNCTIONS_H_
|
||||||
#define _WIDGETS_H_
|
#define _DRAW_FUNCTIONS_H_
|
||||||
|
|
||||||
#include "opentx.h"
|
#include "opentx.h"
|
||||||
#include <stdio.h>
|
#include "common/colorlcd/draw_functions.h"
|
||||||
|
|
||||||
#define OPTION_MENU_NO_FOOTER 0x01
|
#define OPTION_MENU_NO_FOOTER 0x01
|
||||||
#define OPTION_MENU_TITLE_BAR 0x02
|
#define OPTION_MENU_TITLE_BAR 0x02
|
||||||
|
@ -78,4 +78,4 @@ void drawTrims(uint8_t flightMode);
|
||||||
|
|
||||||
void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags);
|
void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverIdx, LcdFlags flags);
|
||||||
|
|
||||||
#endif // _WIDGETS_H_
|
#endif // _DRAW_FUNCTIONS_H_
|
|
@ -24,7 +24,7 @@
|
||||||
#include "gui_common.h"
|
#include "gui_common.h"
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
#include "menus.h"
|
#include "menus.h"
|
||||||
#include "widgets.h"
|
#include "draw_functions.h"
|
||||||
#include "bitmaps.h"
|
#include "bitmaps.h"
|
||||||
#include "theme.h"
|
#include "theme.h"
|
||||||
|
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
#include "opentx.h"
|
#include "opentx.h"
|
||||||
|
|
||||||
unsigned int Topbar::getZonesCount() const
|
unsigned int Topbar::getZonesCount() const
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
set(GUI_SRC
|
set(GUI_SRC
|
||||||
${GUI_SRC}
|
${GUI_SRC}
|
||||||
../common/colorlcd/widgets.cpp
|
../common/colorlcd/draw_functions.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if(HELI)
|
if(HELI)
|
||||||
|
|
|
@ -20,6 +20,155 @@
|
||||||
|
|
||||||
#include "opentx.h"
|
#include "opentx.h"
|
||||||
|
|
||||||
|
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix)
|
||||||
|
{
|
||||||
|
char s[64];
|
||||||
|
char * tmp = (prefix ? strAppend(s, prefix) : s);
|
||||||
|
tmp = strAppend(tmp, str);
|
||||||
|
tmp = strAppendUnsigned(tmp, abs(idx));
|
||||||
|
if (suffix)
|
||||||
|
strAppend(tmp, suffix);
|
||||||
|
lcdDrawText(x, y, s, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
|
||||||
|
{
|
||||||
|
// convertUnit(val, unit);
|
||||||
|
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
|
||||||
|
char unitStr[8];
|
||||||
|
strAppend(unitStr, STR_VTELEMUNIT+1+unit*STR_VTELEMUNIT[0], STR_VTELEMUNIT[0]);
|
||||||
|
lcdDrawNumber(x, y, val, att, 0, NULL, unitStr);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcdDrawNumber(x, y, val, att);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event)
|
||||||
|
{
|
||||||
|
if (attr & INVERS) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL);
|
||||||
|
if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event )
|
||||||
|
{
|
||||||
|
value = editChoice(x, y, NULL, value, 0, 1, attr, event);
|
||||||
|
drawCheckBox(x, y, value, attr);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event)
|
||||||
|
{
|
||||||
|
if (attr & INVERS) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes);
|
||||||
|
drawSwitch(x, y, value, attr);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawFatalErrorScreen(const char * message)
|
||||||
|
{
|
||||||
|
lcdClear();
|
||||||
|
lcdDrawText(LCD_W/2, LCD_H/2-20, message, DBLSIZE|CENTERED|TEXT_BGCOLOR);
|
||||||
|
lcdRefresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void runFatalErrorScreen(const char * message)
|
||||||
|
{
|
||||||
|
while (1) {
|
||||||
|
drawFatalErrorScreen(message);
|
||||||
|
backlightEnable(100);
|
||||||
|
uint8_t refresh = false;
|
||||||
|
while (1) {
|
||||||
|
uint32_t pwr_check = pwrCheck();
|
||||||
|
if (pwr_check == e_power_off) {
|
||||||
|
boardOff();
|
||||||
|
return; // only happens in SIMU, required for proper shutdown
|
||||||
|
}
|
||||||
|
else if (pwr_check == e_power_press) {
|
||||||
|
refresh = true;
|
||||||
|
}
|
||||||
|
else if (pwr_check == e_power_on && refresh) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att)
|
||||||
|
{
|
||||||
|
float power_W_PREC1 = pow(10.0, (dBm - 30.0) / 10.0) * 10;
|
||||||
|
if (dBm >= 30) {
|
||||||
|
lcdDrawNumber(x, y, power_W_PREC1, PREC1 | att);
|
||||||
|
lcdDrawText(lcdNextPos, y, "W", att);
|
||||||
|
}
|
||||||
|
else if (dBm < 10) {
|
||||||
|
uint16_t power_MW_PREC1 = round(power_W_PREC1 * 1000);
|
||||||
|
lcdDrawNumber(x, y, power_MW_PREC1, PREC1 | att);
|
||||||
|
lcdDrawText(lcdNextPos, y, "mW", att);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
uint16_t power_MW = round(power_W_PREC1 * 100);
|
||||||
|
if (power_MW >= 50) {
|
||||||
|
power_MW = (power_MW / 5) * 5;
|
||||||
|
lcdDrawNumber(x, y, power_MW, att);
|
||||||
|
lcdDrawText(lcdNextPos, y, "mW", att);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcdDrawNumber(x, y, power_MW, att);
|
||||||
|
lcdDrawText(lcdNextPos, y, "mW", att);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags)
|
||||||
|
{
|
||||||
|
lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FLIGHT_MODES)
|
||||||
|
void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att)
|
||||||
|
{
|
||||||
|
if (idx==0) {
|
||||||
|
lcdDrawMMM(x, y, att);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO this code was not included in Taranis! and used with abs(...) on Horus
|
||||||
|
if (idx < 0) {
|
||||||
|
lcdDrawChar(x-2, y, '!', att);
|
||||||
|
idx = -idx;
|
||||||
|
}
|
||||||
|
#if defined(CONDENSED)
|
||||||
|
if (att & CONDENSED) {
|
||||||
|
lcdDrawNumber(x+FW*1, y, idx-1, (att & ~CONDENSED), 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
drawStringWithIndex(x, y, STR_FM, idx-1, att);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "opentx.h"
|
||||||
|
|
||||||
void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags att)
|
void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags att)
|
||||||
{
|
{
|
||||||
if (curve.value != 0) {
|
if (curve.value != 0) {
|
||||||
|
@ -133,7 +282,7 @@ void drawSourceCustomValue(coord_t x, coord_t y, source_t source, int32_t value,
|
||||||
lcdDrawNumber(x, y, value, flags|PREC1);
|
lcdDrawNumber(x, y, value, flags|PREC1);
|
||||||
}
|
}
|
||||||
#if defined(INTERNAL_GPS)
|
#if defined(INTERNAL_GPS)
|
||||||
else if (source == MIXSRC_TX_GPS) {
|
else if (source == MIXSRC_TX_GPS) {
|
||||||
if (gpsData.fix) {
|
if (gpsData.fix) {
|
||||||
drawGPSPosition(x, y, gpsData.longitude, gpsData.latitude, flags);
|
drawGPSPosition(x, y, gpsData.longitude, gpsData.latitude, flags);
|
||||||
}
|
}
|
||||||
|
@ -144,7 +293,7 @@ void drawSourceCustomValue(coord_t x, coord_t y, source_t source, int32_t value,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#if defined(GVARS)
|
#if defined(GVARS)
|
||||||
else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) {
|
else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) {
|
||||||
drawGVarValue(x, y, source - MIXSRC_FIRST_GVAR, value, flags);
|
drawGVarValue(x, y, source - MIXSRC_FIRST_GVAR, value, flags);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
40
radio/src/gui/common/colorlcd/draw_functions.h
Normal file
40
radio/src/gui/common/colorlcd/draw_functions.h
Normal file
|
@ -0,0 +1,40 @@
|
||||||
|
/*
|
||||||
|
* 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 __COLORLCD_DRAW_FUNCTIONS__
|
||||||
|
#define __COLORLCD_DRAW_FUNCTIONS__
|
||||||
|
|
||||||
|
#include "lcd.h"
|
||||||
|
|
||||||
|
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix);
|
||||||
|
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att);
|
||||||
|
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event);
|
||||||
|
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event);
|
||||||
|
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event);
|
||||||
|
void drawFatalErrorScreen(const char * message);
|
||||||
|
void runFatalErrorScreen(const char * message);
|
||||||
|
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att);
|
||||||
|
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags);
|
||||||
|
|
||||||
|
#if defined(FLIGHT_MODES)
|
||||||
|
void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif // __COLORLCD_DRAW_FUNCTIONS__
|
|
@ -1,121 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "opentx.h"
|
|
||||||
|
|
||||||
void drawStringWithIndex(coord_t x, coord_t y, const char * str, int idx, LcdFlags flags, const char * prefix, const char * suffix)
|
|
||||||
{
|
|
||||||
char s[64];
|
|
||||||
char * tmp = (prefix ? strAppend(s, prefix) : s);
|
|
||||||
tmp = strAppend(tmp, str);
|
|
||||||
tmp = strAppendUnsigned(tmp, abs(idx));
|
|
||||||
if (suffix)
|
|
||||||
strAppend(tmp, suffix);
|
|
||||||
lcdDrawText(x, y, s, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
|
|
||||||
{
|
|
||||||
// convertUnit(val, unit);
|
|
||||||
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
|
|
||||||
char unitStr[8];
|
|
||||||
strAppend(unitStr, STR_VTELEMUNIT+1+unit*STR_VTELEMUNIT[0], STR_VTELEMUNIT[0]);
|
|
||||||
lcdDrawNumber(x, y, val, att, 0, NULL, unitStr);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
lcdDrawNumber(x, y, val, att);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int editChoice(coord_t x, coord_t y, const char * values, int value, int min, int max, LcdFlags attr, event_t event)
|
|
||||||
{
|
|
||||||
if (attr & INVERS) value = checkIncDec(event, value, min, max, (isModelMenuDisplayed()) ? EE_MODEL : EE_GENERAL);
|
|
||||||
if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t event )
|
|
||||||
{
|
|
||||||
value = editChoice(x, y, NULL, value, 0, 1, attr, event);
|
|
||||||
drawCheckBox(x, y, value, attr);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
swsrc_t editSwitch(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event)
|
|
||||||
{
|
|
||||||
if (attr & INVERS) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes);
|
|
||||||
drawSwitch(x, y, value, attr);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawFatalErrorScreen(const char * message)
|
|
||||||
{
|
|
||||||
lcdClear();
|
|
||||||
lcdDrawText(LCD_W/2, LCD_H/2-20, message, DBLSIZE|CENTERED|TEXT_BGCOLOR);
|
|
||||||
lcdRefresh();
|
|
||||||
}
|
|
||||||
|
|
||||||
void runFatalErrorScreen(const char * message)
|
|
||||||
{
|
|
||||||
while (1) {
|
|
||||||
drawFatalErrorScreen(message);
|
|
||||||
backlightEnable(100);
|
|
||||||
uint8_t refresh = false;
|
|
||||||
while (1) {
|
|
||||||
uint32_t pwr_check = pwrCheck();
|
|
||||||
if (pwr_check == e_power_off) {
|
|
||||||
boardOff();
|
|
||||||
return; // only happens in SIMU, required for proper shutdown
|
|
||||||
}
|
|
||||||
else if (pwr_check == e_power_press) {
|
|
||||||
refresh = true;
|
|
||||||
}
|
|
||||||
else if (pwr_check == e_power_on && refresh) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att)
|
|
||||||
{
|
|
||||||
float power_W_PREC1 = pow(10.0, (dBm - 30.0) / 10.0) * 10;
|
|
||||||
if (dBm >= 30) {
|
|
||||||
lcdDrawNumber(x, y, power_W_PREC1, PREC1 | att);
|
|
||||||
lcdDrawText(lcdNextPos, y, "W", att);
|
|
||||||
}
|
|
||||||
else if (dBm < 10) {
|
|
||||||
uint16_t power_MW_PREC1 = round(power_W_PREC1 * 1000);
|
|
||||||
lcdDrawNumber(x, y, power_MW_PREC1, PREC1 | att);
|
|
||||||
lcdDrawText(lcdNextPos, y, "mW", att);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
uint16_t power_MW = round(power_W_PREC1 * 100);
|
|
||||||
if (power_MW >= 50) {
|
|
||||||
power_MW = (power_MW / 5) * 5;
|
|
||||||
lcdDrawNumber(x, y, power_MW, att);
|
|
||||||
lcdDrawText(lcdNextPos, y, "mW", att);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
lcdDrawNumber(x, y, power_MW, att);
|
|
||||||
lcdDrawText(lcdNextPos, y, "mW", att);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -3,7 +3,7 @@ add_definitions(-DGRAPHICS)
|
||||||
set(GUI_SRC
|
set(GUI_SRC
|
||||||
${GUI_SRC}
|
${GUI_SRC}
|
||||||
../common/stdlcd/menus.cpp
|
../common/stdlcd/menus.cpp
|
||||||
../common/stdlcd/widgets.cpp
|
../common/stdlcd/draw_functions.cpp
|
||||||
../common/stdlcd/popups.cpp
|
../common/stdlcd/popups.cpp
|
||||||
../common/stdlcd/model_inputs.cpp
|
../common/stdlcd/model_inputs.cpp
|
||||||
../common/stdlcd/model_mixes.cpp
|
../common/stdlcd/model_mixes.cpp
|
||||||
|
|
|
@ -33,6 +33,33 @@ void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, Lc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlags att)
|
||||||
|
{
|
||||||
|
trim_t v = getRawTrimValue(flightMode, idx);
|
||||||
|
unsigned int mode = v.mode;
|
||||||
|
unsigned int p = mode >> 1;
|
||||||
|
|
||||||
|
if (mode == TRIM_MODE_NONE) {
|
||||||
|
lcdDrawText(x, y, "--", att);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (mode % 2 == 0)
|
||||||
|
lcdDrawChar(x, y, ':', att|FIXEDWIDTH);
|
||||||
|
else
|
||||||
|
lcdDrawChar(x, y, '+', att|FIXEDWIDTH);
|
||||||
|
lcdDrawChar(lcdNextPos, y, '0'+p, att);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att)
|
||||||
|
{
|
||||||
|
// convertUnit(val, unit);
|
||||||
|
lcdDrawNumber(x, y, val, att & (~NO_UNIT));
|
||||||
|
if (!(att & NO_UNIT) && unit != UNIT_RAW) {
|
||||||
|
lcdDrawTextAtIndex(lcdLastRightPos/*+1*/, y, STR_VTELEMUNIT, unit, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
FlightModesType editFlightModes(coord_t x, coord_t y, event_t event, FlightModesType value, uint8_t attr)
|
FlightModesType editFlightModes(coord_t x, coord_t y, event_t event, FlightModesType value, uint8_t attr)
|
||||||
{
|
{
|
||||||
int posHorz = menuHorizontalPosition;
|
int posHorz = menuHorizontalPosition;
|
||||||
|
@ -233,3 +260,179 @@ void drawReceiverName(coord_t x, coord_t y, uint8_t moduleIdx, uint8_t receiverI
|
||||||
lcdDrawText(x, y, "External", flags);
|
lcdDrawText(x, y, "External", flags);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags)
|
||||||
|
{
|
||||||
|
lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(FLIGHT_MODES)
|
||||||
|
void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att)
|
||||||
|
{
|
||||||
|
if (idx==0) {
|
||||||
|
lcdDrawMMM(x, y, att);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// TODO this code was not included in Taranis! and used with abs(...) on Horus
|
||||||
|
if (idx < 0) {
|
||||||
|
lcdDrawChar(x-2, y, '!', att);
|
||||||
|
idx = -idx;
|
||||||
|
}
|
||||||
|
#if defined(CONDENSED)
|
||||||
|
if (att & CONDENSED) {
|
||||||
|
lcdDrawNumber(x+FW*1, y, idx-1, (att & ~CONDENSED), 1);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
drawStringWithIndex(x, y, STR_FM, idx-1, att);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags att)
|
||||||
|
{
|
||||||
|
if (curve.value != 0) {
|
||||||
|
switch (curve.type) {
|
||||||
|
case CURVE_REF_DIFF:
|
||||||
|
lcdDrawText(x, y, "D", att);
|
||||||
|
GVAR_MENU_ITEM(lcdNextPos, y, curve.value, -100, 100, LEFT|att, 0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURVE_REF_EXPO:
|
||||||
|
lcdDrawText(x, y, "E", att);
|
||||||
|
GVAR_MENU_ITEM(lcdNextPos, y, curve.value, -100, 100, LEFT|att, 0, 0);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURVE_REF_FUNC:
|
||||||
|
lcdDrawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, att);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case CURVE_REF_CUSTOM:
|
||||||
|
drawCurveName(x, y, curve.value, att);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawSensorCustomValue(coord_t x, coord_t y, uint8_t sensor, int32_t value, LcdFlags flags)
|
||||||
|
{
|
||||||
|
if (sensor >= MAX_TELEMETRY_SENSORS) {
|
||||||
|
// Lua luaLcdDrawChannel() can call us with a bad value
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
TelemetryItem & telemetryItem = telemetryItems[sensor];
|
||||||
|
TelemetrySensor & telemetrySensor = g_model.telemetrySensors[sensor];
|
||||||
|
|
||||||
|
if (telemetrySensor.unit == UNIT_DATETIME) {
|
||||||
|
drawDate(x, y, telemetryItem, flags);
|
||||||
|
}
|
||||||
|
else if (telemetrySensor.unit == UNIT_GPS) {
|
||||||
|
drawGPSSensorValue(x, y, telemetryItem, flags);
|
||||||
|
}
|
||||||
|
else if (telemetrySensor.unit == UNIT_BITFIELD) {
|
||||||
|
if (IS_FRSKY_SPORT_PROTOCOL()) {
|
||||||
|
if (telemetrySensor.id >= RBOX_STATE_FIRST_ID && telemetrySensor.id <= RBOX_STATE_LAST_ID) {
|
||||||
|
if (telemetrySensor.subId == 0) {
|
||||||
|
if (value == 0) {
|
||||||
|
lcdDrawText(x, y, "OK", flags);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (uint8_t i=0; i<16; i++) {
|
||||||
|
if (value & (1 << i)) {
|
||||||
|
char s[] = "CH__ KO";
|
||||||
|
strAppendUnsigned(&s[2], i+1, 2);
|
||||||
|
lcdDrawText(x, flags & DBLSIZE ? y+1 : y, s, flags & ~DBLSIZE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (value == 0) {
|
||||||
|
lcdDrawText(x, flags & DBLSIZE ? y+1 : y, "Rx OK", flags & ~DBLSIZE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
static const char * const RXS_STATUS[] = {
|
||||||
|
"Rx1 Ovl",
|
||||||
|
"Rx2 Ovl",
|
||||||
|
"SBUS Ovl",
|
||||||
|
"Rx1 FS",
|
||||||
|
"Rx1 LF",
|
||||||
|
"Rx2 FS",
|
||||||
|
"Rx2 LF",
|
||||||
|
"Rx1 Lost",
|
||||||
|
"Rx2 Lost",
|
||||||
|
"Rx1 NS",
|
||||||
|
"Rx2 NS",
|
||||||
|
};
|
||||||
|
for (uint8_t i=0; i<DIM(RXS_STATUS); i++) {
|
||||||
|
if (value & (1<<i)) {
|
||||||
|
lcdDrawText(x, flags & DBLSIZE ? y+1 : y, RXS_STATUS[i], flags & ~DBLSIZE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (telemetrySensor.unit == UNIT_TEXT) {
|
||||||
|
lcdDrawSizedText(x, flags & DBLSIZE ? y+1 : y, telemetryItem.text, sizeof(telemetryItem.text), flags & ~DBLSIZE);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (telemetrySensor.prec > 0) {
|
||||||
|
flags |= (telemetrySensor.prec==1 ? PREC1 : PREC2);
|
||||||
|
}
|
||||||
|
drawValueWithUnit(x, y, value, telemetrySensor.unit == UNIT_CELLS ? UNIT_VOLTS : telemetrySensor.unit, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawSourceCustomValue(coord_t x, coord_t y, source_t source, int32_t value, LcdFlags flags)
|
||||||
|
{
|
||||||
|
if (source >= MIXSRC_FIRST_TELEM) {
|
||||||
|
source = (source-MIXSRC_FIRST_TELEM) / 3;
|
||||||
|
drawSensorCustomValue(x, y, source, value, flags);
|
||||||
|
}
|
||||||
|
else if (source >= MIXSRC_FIRST_TIMER || source == MIXSRC_TX_TIME) {
|
||||||
|
if (value < 0) flags |= BLINK|INVERS;
|
||||||
|
drawTimer(x, y, value, flags);
|
||||||
|
}
|
||||||
|
else if (source == MIXSRC_TX_VOLTAGE) {
|
||||||
|
lcdDrawNumber(x, y, value, flags|PREC1);
|
||||||
|
}
|
||||||
|
#if defined(INTERNAL_GPS)
|
||||||
|
else if (source == MIXSRC_TX_GPS) {
|
||||||
|
if (gpsData.fix) {
|
||||||
|
drawGPSPosition(x, y, gpsData.longitude, gpsData.latitude, flags);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcdDrawText(x, y, "sats: ", flags);
|
||||||
|
lcdDrawNumber(lcdNextPos, y, gpsData.numSat, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#if defined(GVARS)
|
||||||
|
else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) {
|
||||||
|
drawGVarValue(x, y, source - MIXSRC_FIRST_GVAR, value, flags);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
else if (source < MIXSRC_FIRST_CH) {
|
||||||
|
lcdDrawNumber(x, y, calcRESXto100(value), flags);
|
||||||
|
}
|
||||||
|
else if (source <= MIXSRC_LAST_CH) {
|
||||||
|
#if defined(PPM_UNIT_PERCENT_PREC1)
|
||||||
|
lcdDrawNumber(x, y, calcRESXto1000(value), flags|PREC1);
|
||||||
|
#else
|
||||||
|
lcdDrawNumber(x, y, calcRESXto100(value), flags);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
lcdDrawNumber(x, y, value, flags);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawSourceValue(coord_t x, coord_t y, source_t source, LcdFlags flags)
|
||||||
|
{
|
||||||
|
getvalue_t value = getValue(source);
|
||||||
|
drawSourceCustomValue(x, y, source, value, flags);
|
||||||
|
}
|
|
@ -18,12 +18,13 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _COMMON_DRAW_FUNCTIONS_H_
|
#ifndef _STDLCD_DRAW_FUNCTIONS_H_
|
||||||
#define _COMMON_DRAW_FUNCTIONS_H_
|
#define _STDLCD_DRAW_FUNCTIONS_H_
|
||||||
|
|
||||||
#include "lcd.h"
|
#include "lcd.h"
|
||||||
|
|
||||||
void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0);
|
void drawStringWithIndex(coord_t x, coord_t y, const char * str, uint8_t idx, LcdFlags att=0);
|
||||||
|
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags att=0);
|
||||||
|
|
||||||
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0);
|
void drawPower(coord_t x, coord_t y, int8_t dBm, LcdFlags att = 0);
|
||||||
void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0);
|
void drawGVarName(coord_t x, coord_t y, int8_t index, LcdFlags flags=0);
|
||||||
|
@ -40,4 +41,7 @@ void drawStartupAnimation(uint32_t duration, uint32_t totalDuration);
|
||||||
void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message);
|
void drawShutdownAnimation(uint32_t duration, uint32_t totalDuration, const char * message);
|
||||||
void drawSleepBitmap();
|
void drawSleepBitmap();
|
||||||
|
|
||||||
#endif // _COMMON_DRAW_FUNCTIONS_H_
|
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0);
|
||||||
|
void drawTrimMode(coord_t x, coord_t y, uint8_t flightMode, uint8_t idx, LcdFlags att=0);
|
||||||
|
|
||||||
|
#endif // _STDLCD_DRAW_FUNCTIONS_H_
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "opentx.h"
|
|
||||||
|
|
||||||
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags)
|
|
||||||
{
|
|
||||||
lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(FLIGHT_MODES)
|
|
||||||
void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att)
|
|
||||||
{
|
|
||||||
if (idx==0) {
|
|
||||||
lcdDrawMMM(x, y, att);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// TODO this code was not included in Taranis! and used with abs(...) on Horus
|
|
||||||
if (idx < 0) {
|
|
||||||
lcdDrawChar(x-2, y, '!', att);
|
|
||||||
idx = -idx;
|
|
||||||
}
|
|
||||||
#if defined(CONDENSED)
|
|
||||||
if (att & CONDENSED) {
|
|
||||||
lcdDrawNumber(x+FW*1, y, idx-1, (att & ~CONDENSED), 1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
drawStringWithIndex(x, y, STR_FM, idx-1, att);
|
|
||||||
}
|
|
||||||
#endif
|
|
|
@ -72,7 +72,6 @@ bool isRssiSensorAvailable(int sensor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool isSensorAvailable(int sensor)
|
bool isSensorAvailable(int sensor)
|
||||||
{
|
{
|
||||||
if (sensor == 0)
|
if (sensor == 0)
|
||||||
|
|
|
@ -95,7 +95,6 @@ void drawFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0);
|
||||||
|
|
||||||
swsrc_t checkIncDecMovedSwitch(swsrc_t val);
|
swsrc_t checkIncDecMovedSwitch(swsrc_t val);
|
||||||
|
|
||||||
void drawValueWithUnit(coord_t x, coord_t y, int val, uint8_t unit, LcdFlags flags);
|
|
||||||
void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags flags=0);
|
void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags flags=0);
|
||||||
void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags=0);
|
void drawDate(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFlags flags=0);
|
||||||
void drawTelemScreenDate(coord_t x, coord_t y, source_t sensor, LcdFlags flags=0);
|
void drawTelemScreenDate(coord_t x, coord_t y, source_t sensor, LcdFlags flags=0);
|
||||||
|
@ -116,8 +115,6 @@ void drawFatalErrorScreen(const char * message);
|
||||||
void runFatalErrorScreen(const char * message);
|
void runFatalErrorScreen(const char * message);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void lcdDrawMMM(coord_t x, coord_t y, LcdFlags flags=0);
|
|
||||||
|
|
||||||
// model_setup Defines that are used in all uis in the same way
|
// model_setup Defines that are used in all uis in the same way
|
||||||
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1)
|
#define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON((uint8_t)1)
|
||||||
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1)
|
#define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((isModuleDSM2(EXTERNAL_MODULE) || isModuleCrossfire(EXTERNAL_MODULE) || isModuleSBUS(EXTERNAL_MODULE) || (isModuleMultimodule(EXTERNAL_MODULE) && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) != MODULE_SUBTYPE_MULTI_DSM2)) ? (uint8_t)0 : (uint8_t)1)
|
||||||
|
|
|
@ -432,6 +432,11 @@ When called without parameters, it will only return the status of the output buf
|
||||||
|
|
||||||
static int luaSportTelemetryPush(lua_State * L)
|
static int luaSportTelemetryPush(lua_State * L)
|
||||||
{
|
{
|
||||||
|
if (telemetryProtocol != PROTOCOL_TELEMETRY_FRSKY_SPORT) {
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (lua_gettop(L) == 0) {
|
if (lua_gettop(L) == 0) {
|
||||||
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
|
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -629,6 +634,11 @@ When called without parameters, it will only return the status of the output buf
|
||||||
*/
|
*/
|
||||||
static int luaCrossfireTelemetryPush(lua_State * L)
|
static int luaCrossfireTelemetryPush(lua_State * L)
|
||||||
{
|
{
|
||||||
|
if (telemetryProtocol != PROTOCOL_TELEMETRY_CROSSFIRE) {
|
||||||
|
lua_pushboolean(L, false);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (lua_gettop(L) == 0) {
|
if (lua_gettop(L) == 0) {
|
||||||
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
|
lua_pushboolean(L, outputTelemetryBuffer.isAvailable());
|
||||||
}
|
}
|
||||||
|
@ -1275,7 +1285,7 @@ static int luaSetTelemetryValue(lua_State * L)
|
||||||
zname[3] = hex2zchar((id & 0x000f) >> 0);
|
zname[3] = hex2zchar((id & 0x000f) >> 0);
|
||||||
}
|
}
|
||||||
if (id | subId | instance) {
|
if (id | subId | instance) {
|
||||||
int index = setTelemetryValue(TELEM_PROTO_LUA, id, subId, instance, value, unit, prec);
|
int index = setTelemetryValue(PROTOCOL_TELEMETRY_LUA, id, subId, instance, value, unit, prec);
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
TelemetrySensor &telemetrySensor = g_model.telemetrySensors[index];
|
TelemetrySensor &telemetrySensor = g_model.telemetrySensors[index];
|
||||||
telemetrySensor.id = id;
|
telemetrySensor.id = id;
|
||||||
|
@ -1599,6 +1609,7 @@ const luaR_value_entry opentxConstants[] = {
|
||||||
{ "SHADOWED", SHADOWED },
|
{ "SHADOWED", SHADOWED },
|
||||||
{ "COLOR", ZoneOption::Color },
|
{ "COLOR", ZoneOption::Color },
|
||||||
{ "BOOL", ZoneOption::Bool },
|
{ "BOOL", ZoneOption::Bool },
|
||||||
|
{ "STRING", ZoneOption::String },
|
||||||
{ "CUSTOM_COLOR", CUSTOM_COLOR },
|
{ "CUSTOM_COLOR", CUSTOM_COLOR },
|
||||||
{ "TEXT_COLOR", TEXT_COLOR },
|
{ "TEXT_COLOR", TEXT_COLOR },
|
||||||
{ "TEXT_BGCOLOR", TEXT_BGCOLOR },
|
{ "TEXT_BGCOLOR", TEXT_BGCOLOR },
|
||||||
|
|
|
@ -36,7 +36,7 @@ extern "C" {
|
||||||
#define MANUAL_SCRIPTS_MAX_INSTRUCTIONS (20000/100)
|
#define MANUAL_SCRIPTS_MAX_INSTRUCTIONS (20000/100)
|
||||||
#define LUA_WARNING_INFO_LEN 64
|
#define LUA_WARNING_INFO_LEN 64
|
||||||
|
|
||||||
lua_State *lsScripts = NULL;
|
lua_State *lsScripts = nullptr;
|
||||||
uint8_t luaState = 0;
|
uint8_t luaState = 0;
|
||||||
uint8_t luaScriptsCount = 0;
|
uint8_t luaScriptsCount = 0;
|
||||||
ScriptInternalData scriptInternalData[MAX_SCRIPTS];
|
ScriptInternalData scriptInternalData[MAX_SCRIPTS];
|
||||||
|
@ -256,7 +256,7 @@ void luaClose(lua_State ** L)
|
||||||
if (*L == lsScripts) luaDisable();
|
if (*L == lsScripts) luaDisable();
|
||||||
}
|
}
|
||||||
UNPROTECT_LUA();
|
UNPROTECT_LUA();
|
||||||
*L = NULL;
|
*L = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -362,7 +362,7 @@ static void luaDumpState(lua_State * L, const char * filename, const FILINFO * f
|
||||||
luaU_dump(L, getproto(L->top - 1), luaDumpWriter, &D, stripDebug);
|
luaU_dump(L, getproto(L->top - 1), luaDumpWriter, &D, stripDebug);
|
||||||
lua_unlock(L);
|
lua_unlock(L);
|
||||||
if (f_close(&D) == FR_OK) {
|
if (f_close(&D) == FR_OK) {
|
||||||
if (finfo != NULL)
|
if (finfo != nullptr)
|
||||||
f_utime(filename, finfo); // set the file mod time
|
f_utime(filename, finfo); // set the file mod time
|
||||||
TRACE("luaDumpState(%s): Saved bytecode to file.", filename);
|
TRACE("luaDumpState(%s): Saved bytecode to file.", filename);
|
||||||
}
|
}
|
||||||
|
@ -404,7 +404,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
{
|
{
|
||||||
if (luaState == INTERPRETER_PANIC) {
|
if (luaState == INTERPRETER_PANIC) {
|
||||||
return SCRIPT_PANIC;
|
return SCRIPT_PANIC;
|
||||||
} else if (filename == NULL) {
|
} else if (filename == nullptr) {
|
||||||
return SCRIPT_NOFILE;
|
return SCRIPT_NOFILE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -412,7 +412,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
char lmode[6] = "bt";
|
char lmode[6] = "bt";
|
||||||
uint8_t ret = SCRIPT_NOFILE;
|
uint8_t ret = SCRIPT_NOFILE;
|
||||||
|
|
||||||
if (mode != NULL) {
|
if (mode != nullptr) {
|
||||||
strncpy(lmode, mode, sizeof(lmode)-1);
|
strncpy(lmode, mode, sizeof(lmode)-1);
|
||||||
lmode[sizeof(lmode)-1] = '\0';
|
lmode[sizeof(lmode)-1] = '\0';
|
||||||
}
|
}
|
||||||
|
@ -432,7 +432,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
|
|
||||||
fnamelen = strlen(filename);
|
fnamelen = strlen(filename);
|
||||||
// check if file extension is already in the file name and strip it
|
// check if file extension is already in the file name and strip it
|
||||||
getFileExtension(filename, fnamelen, 0, NULL, &extlen);
|
getFileExtension(filename, fnamelen, 0, nullptr, &extlen);
|
||||||
fnamelen -= extlen;
|
fnamelen -= extlen;
|
||||||
if (fnamelen > sizeof(filenameFull) - sizeof(SCRIPT_BIN_EXT)) {
|
if (fnamelen > sizeof(filenameFull) - sizeof(SCRIPT_BIN_EXT)) {
|
||||||
TRACE_ERROR("luaLoadScriptFileToState(%s, %s): Error loading script: filename buffer overflow.\n", filename, lmode);
|
TRACE_ERROR("luaLoadScriptFileToState(%s, %s): Error loading script: filename buffer overflow.\n", filename, lmode);
|
||||||
|
@ -507,7 +507,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
TRACE("luaLoadScriptFileToState(%s, %s): loading %s", filename, lmode, filenameFull);
|
TRACE("luaLoadScriptFileToState(%s, %s): loading %s", filename, lmode, filenameFull);
|
||||||
|
|
||||||
// we don't pass <mode> on to loadfilex() because we want lua to load whatever file we specify, regardless of content
|
// we don't pass <mode> on to loadfilex() because we want lua to load whatever file we specify, regardless of content
|
||||||
lstatus = luaL_loadfilex(L, filenameFull, NULL);
|
lstatus = luaL_loadfilex(L, filenameFull, nullptr);
|
||||||
#if defined(LUA_COMPILER)
|
#if defined(LUA_COMPILER)
|
||||||
// Check for bytecode encoding problem, eg. compiled for x64. Unfortunately Lua doesn't provide a unique error code for this. See Lua/src/lundump.c.
|
// Check for bytecode encoding problem, eg. compiled for x64. Unfortunately Lua doesn't provide a unique error code for this. See Lua/src/lundump.c.
|
||||||
if (lstatus == LUA_ERRSYNTAX && loadFileType == 2 && frLuaS == FR_OK && strstr(lua_tostring(L, -1), "precompiled")) {
|
if (lstatus == LUA_ERRSYNTAX && loadFileType == 2 && frLuaS == FR_OK && strstr(lua_tostring(L, -1), "precompiled")) {
|
||||||
|
@ -515,7 +515,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
scriptNeedsCompile = true;
|
scriptNeedsCompile = true;
|
||||||
strcpy(filenameFull + fnamelen, SCRIPT_EXT);
|
strcpy(filenameFull + fnamelen, SCRIPT_EXT);
|
||||||
TRACE_ERROR("luaLoadScriptFileToState(%s, %s): Error loading script: %s\n\tRetrying with %s\n", filename, lmode, lua_tostring(L, -1), filenameFull);
|
TRACE_ERROR("luaLoadScriptFileToState(%s, %s): Error loading script: %s\n\tRetrying with %s\n", filename, lmode, lua_tostring(L, -1), filenameFull);
|
||||||
lstatus = luaL_loadfilex(L, filenameFull, NULL);
|
lstatus = luaL_loadfilex(L, filenameFull, nullptr);
|
||||||
}
|
}
|
||||||
if (lstatus == LUA_OK) {
|
if (lstatus == LUA_OK) {
|
||||||
if (scriptNeedsCompile && loadFileType == 1) {
|
if (scriptNeedsCompile && loadFileType == 1) {
|
||||||
|
@ -545,7 +545,7 @@ int luaLoadScriptFileToState(lua_State * L, const char * filename, const char *
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int luaLoad(lua_State * L, const char * filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=NULL)
|
static int luaLoad(lua_State * L, const char * filename, ScriptInternalData & sid, ScriptInputsOutputs * sio=nullptr)
|
||||||
{
|
{
|
||||||
int init = 0;
|
int init = 0;
|
||||||
int lstatus = 0;
|
int lstatus = 0;
|
||||||
|
@ -910,7 +910,7 @@ bool luaDoOneRunPermanentScript(event_t evt, int i, uint32_t scriptType)
|
||||||
#if defined(SIMU) || defined(DEBUG)
|
#if defined(SIMU) || defined(DEBUG)
|
||||||
const char *filename;
|
const char *filename;
|
||||||
#endif
|
#endif
|
||||||
ScriptInputsOutputs * sio = NULL;
|
ScriptInputsOutputs * sio = nullptr;
|
||||||
#if SCRIPT_MIX_FIRST > 0
|
#if SCRIPT_MIX_FIRST > 0
|
||||||
if ((scriptType & RUN_MIX_SCRIPT) && (sid.reference >= SCRIPT_MIX_FIRST && sid.reference <= SCRIPT_MIX_LAST)) {
|
if ((scriptType & RUN_MIX_SCRIPT) && (sid.reference >= SCRIPT_MIX_FIRST && sid.reference <= SCRIPT_MIX_LAST)) {
|
||||||
#else
|
#else
|
||||||
|
@ -1082,13 +1082,13 @@ void luaInit()
|
||||||
|
|
||||||
if (luaState != INTERPRETER_PANIC) {
|
if (luaState != INTERPRETER_PANIC) {
|
||||||
#if defined(USE_BIN_ALLOCATOR)
|
#if defined(USE_BIN_ALLOCATOR)
|
||||||
lsScripts = lua_newstate(bin_l_alloc, NULL); //we use our own allocator!
|
lsScripts = lua_newstate(bin_l_alloc, nullptr); //we use our own allocator!
|
||||||
#elif defined(LUA_ALLOCATOR_TRACER)
|
#elif defined(LUA_ALLOCATOR_TRACER)
|
||||||
memset(&lsScriptsTrace, 0 , sizeof(lsScriptsTrace));
|
memset(&lsScriptsTrace, 0 , sizeof(lsScriptsTrace));
|
||||||
lsScriptsTrace.script = "lua_newstate(scripts)";
|
lsScriptsTrace.script = "lua_newstate(scripts)";
|
||||||
lsScripts = lua_newstate(tracer_alloc, &lsScriptsTrace); //we use tracer allocator
|
lsScripts = lua_newstate(tracer_alloc, &lsScriptsTrace); //we use tracer allocator
|
||||||
#else
|
#else
|
||||||
lsScripts = lua_newstate(l_alloc, NULL); //we use Lua default allocator
|
lsScripts = lua_newstate(l_alloc, nullptr); //we use Lua default allocator
|
||||||
#endif
|
#endif
|
||||||
if (lsScripts) {
|
if (lsScripts) {
|
||||||
// install our panic handler
|
// install our panic handler
|
||||||
|
|
|
@ -261,19 +261,6 @@ enum ThrottleSources {
|
||||||
THROTTLE_SOURCE_CH1,
|
THROTTLE_SOURCE_CH1,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum TelemetryProtocols
|
|
||||||
{
|
|
||||||
PROTOCOL_TELEMETRY_FIRST,
|
|
||||||
PROTOCOL_TELEMETRY_FRSKY_SPORT = PROTOCOL_TELEMETRY_FIRST,
|
|
||||||
PROTOCOL_TELEMETRY_FRSKY_D,
|
|
||||||
PROTOCOL_TELEMETRY_FRSKY_D_SECONDARY,
|
|
||||||
PROTOCOL_TELEMETRY_CROSSFIRE,
|
|
||||||
PROTOCOL_TELEMETRY_SPEKTRUM,
|
|
||||||
PROTOCOL_TELEMETRY_FLYSKY_IBUS,
|
|
||||||
PROTOCOL_TELEMETRY_MULTIMODULE,
|
|
||||||
PROTOCOL_TELEMETRY_LAST=PROTOCOL_TELEMETRY_MULTIMODULE
|
|
||||||
};
|
|
||||||
|
|
||||||
enum DisplayTrims
|
enum DisplayTrims
|
||||||
{
|
{
|
||||||
DISPLAY_TRIMS_NEVER,
|
DISPLAY_TRIMS_NEVER,
|
||||||
|
|
|
@ -2048,7 +2048,7 @@ uint32_t pwrPressedDuration()
|
||||||
|
|
||||||
uint32_t pwrCheck()
|
uint32_t pwrCheck()
|
||||||
{
|
{
|
||||||
const char * message = NULL;
|
const char * message = nullptr;
|
||||||
|
|
||||||
enum PwrCheckState {
|
enum PwrCheckState {
|
||||||
PWR_CHECK_ON,
|
PWR_CHECK_ON,
|
||||||
|
|
|
@ -1210,7 +1210,7 @@ extern union ReusableBuffer reusableBuffer;
|
||||||
uint8_t zlen(const char *str, uint8_t size);
|
uint8_t zlen(const char *str, uint8_t size);
|
||||||
bool zexist(const char *str, uint8_t size);
|
bool zexist(const char *str, uint8_t size);
|
||||||
unsigned int effectiveLen(const char * str, unsigned int size);
|
unsigned int effectiveLen(const char * str, unsigned int size);
|
||||||
char * strcat_zchar(char *dest, const char *name, uint8_t size, const char *defaultName=NULL, uint8_t defaultNameSize=0, uint8_t defaultIdx=0);
|
char * strcat_zchar(char *dest, const char *name, uint8_t size, const char *defaultName=nullptr, uint8_t defaultNameSize=0, uint8_t defaultIdx=0);
|
||||||
#define strcatFlightmodeName(dest, idx) strcat_zchar(dest, g_model.flightModeData[idx].name, LEN_FLIGHT_MODE_NAME, STR_FM, PSIZE(TR_FM), idx+1)
|
#define strcatFlightmodeName(dest, idx) strcat_zchar(dest, g_model.flightModeData[idx].name, LEN_FLIGHT_MODE_NAME, STR_FM, PSIZE(TR_FM), idx+1)
|
||||||
#if defined(EEPROM)
|
#if defined(EEPROM)
|
||||||
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
|
#define strcat_modelname(dest, idx) strcat_zchar(dest, modelHeaders[idx].name, LEN_MODEL_NAME, STR_MODEL, PSIZE(TR_MODEL), idx+1)
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
* GNU General Public License for more details.
|
* GNU General Public License for more details.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _HELPERS_H_
|
#ifndef _OPENTX_HELPERS_H_
|
||||||
#define _HELPERS_H_
|
#define _OPENTX_HELPERS_H_
|
||||||
|
|
||||||
template<class t> inline t min(t a, t b) { return a<b?a:b; }
|
template<class t> inline t min(t a, t b) { return a<b?a:b; }
|
||||||
template<class t> inline t max(t a, t b) { return a>b?a:b; }
|
template<class t> inline t max(t a, t b) { return a>b?a:b; }
|
||||||
|
@ -27,4 +27,4 @@ template<class t> inline t sgn(t a) { return a>0 ? 1 : (a < 0 ? -1 : 0); }
|
||||||
template<class t> inline t limit(t mi, t x, t ma) { return min(max(mi,x),ma); }
|
template<class t> inline t limit(t mi, t x, t ma) { return min(max(mi,x),ma); }
|
||||||
template<class t> inline void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; }
|
template<class t> inline void SWAP(t & a, t & b) { t tmp = b; b = a; a = tmp; }
|
||||||
|
|
||||||
#endif // _HELPERS_H_
|
#endif // _OPENTX_HELPERS_H_
|
|
@ -23,7 +23,7 @@
|
||||||
|
|
||||||
#include "bitfield.h"
|
#include "bitfield.h"
|
||||||
#include "definitions.h"
|
#include "definitions.h"
|
||||||
#include "helpers.h"
|
#include "opentx_helpers.h"
|
||||||
#include "telemetry/telemetry.h"
|
#include "telemetry/telemetry.h"
|
||||||
#if defined(MULTIMODULE)
|
#if defined(MULTIMODULE)
|
||||||
#include "telemetry/multi.h"
|
#include "telemetry/multi.h"
|
||||||
|
|
|
@ -68,7 +68,7 @@ const char * sdCheckAndCreateDirectory(const char * path)
|
||||||
f_closedir(&archiveFolder);
|
f_closedir(&archiveFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isFileAvailable(const char * path, bool exclDir)
|
bool isFileAvailable(const char * path, bool exclDir)
|
||||||
|
@ -95,7 +95,7 @@ bool isFileAvailable(const char * path, bool exclDir)
|
||||||
@param match Optional container to hold the matched file extension (wide enough to hold LEN_FILE_EXTENSION_MAX + 1).
|
@param match Optional container to hold the matched file extension (wide enough to hold LEN_FILE_EXTENSION_MAX + 1).
|
||||||
@retval true if a file was found, false otherwise.
|
@retval true if a file was found, false otherwise.
|
||||||
*/
|
*/
|
||||||
bool isFilePatternAvailable(const char * path, const char * file, const char * pattern = NULL, bool exclDir = true, char * match = NULL)
|
bool isFilePatternAvailable(const char * path, const char * file, const char * pattern = nullptr, bool exclDir = true, char * match = nullptr)
|
||||||
{
|
{
|
||||||
uint8_t fplen;
|
uint8_t fplen;
|
||||||
char fqfp[LEN_FILE_PATH_MAX + _MAX_LFN + 1] = "\0";
|
char fqfp[LEN_FILE_PATH_MAX + _MAX_LFN + 1] = "\0";
|
||||||
|
@ -110,7 +110,7 @@ bool isFilePatternAvailable(const char * path, const char * file, const char * p
|
||||||
strcpy(fqfp + fplen, "/");
|
strcpy(fqfp + fplen, "/");
|
||||||
strncat(fqfp + (++fplen), file, _MAX_LFN);
|
strncat(fqfp + (++fplen), file, _MAX_LFN);
|
||||||
|
|
||||||
if (pattern == NULL) {
|
if (pattern == nullptr) {
|
||||||
// no extensions list, just check the filename as-is
|
// no extensions list, just check the filename as-is
|
||||||
return isFileAvailable(fqfp, exclDir);
|
return isFileAvailable(fqfp, exclDir);
|
||||||
}
|
}
|
||||||
|
@ -129,13 +129,13 @@ bool isFilePatternAvailable(const char * path, const char * file, const char * p
|
||||||
while (plen > 0 && ext) {
|
while (plen > 0 && ext) {
|
||||||
strncat(fqfp + len, ext, extlen);
|
strncat(fqfp + len, ext, extlen);
|
||||||
if (isFileAvailable(fqfp, exclDir)) {
|
if (isFileAvailable(fqfp, exclDir)) {
|
||||||
if (match != NULL) strncat(&(match[0]='\0'), ext, extlen);
|
if (match != nullptr) strncat(&(match[0]='\0'), ext, extlen);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
plen -= extlen;
|
plen -= extlen;
|
||||||
if (plen > 0) {
|
if (plen > 0) {
|
||||||
fqfp[len] = '\0';
|
fqfp[len] = '\0';
|
||||||
ext = getFileExtension(pattern, plen, 0, NULL, &extlen);
|
ext = getFileExtension(pattern, plen, 0, nullptr, &extlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,7 +147,7 @@ char * getFileIndex(char * filename, unsigned int & value)
|
||||||
value = 0;
|
value = 0;
|
||||||
char * pos = (char *)getFileExtension(filename);
|
char * pos = (char *)getFileExtension(filename);
|
||||||
if (!pos || pos == filename)
|
if (!pos || pos == filename)
|
||||||
return NULL;
|
return nullptr;
|
||||||
int multiplier = 1;
|
int multiplier = 1;
|
||||||
while (pos > filename) {
|
while (pos > filename) {
|
||||||
pos--;
|
pos--;
|
||||||
|
@ -179,7 +179,7 @@ int findNextFileIndex(char * filename, uint8_t size, const char * directory)
|
||||||
uint8_t extlen;
|
uint8_t extlen;
|
||||||
char * indexPos = getFileIndex(filename, index);
|
char * indexPos = getFileIndex(filename, index);
|
||||||
char extension[LEN_FILE_EXTENSION_MAX+1] = "\0";
|
char extension[LEN_FILE_EXTENSION_MAX+1] = "\0";
|
||||||
char * p = (char *)getFileExtension(filename, 0, 0, NULL, &extlen);
|
char * p = (char *)getFileExtension(filename, 0, 0, nullptr, &extlen);
|
||||||
if (p) strncat(extension, p, sizeof(extension)-1);
|
if (p) strncat(extension, p, sizeof(extension)-1);
|
||||||
while (1) {
|
while (1) {
|
||||||
index++;
|
index++;
|
||||||
|
@ -188,7 +188,7 @@ int findNextFileIndex(char * filename, uint8_t size, const char * directory)
|
||||||
}
|
}
|
||||||
char * pos = strAppendUnsigned(indexPos, index);
|
char * pos = strAppendUnsigned(indexPos, index);
|
||||||
strAppend(pos, extension);
|
strAppend(pos, extension);
|
||||||
if (!isFilePatternAvailable(directory, filename, NULL, false)) {
|
if (!isFilePatternAvailable(directory, filename, nullptr, false)) {
|
||||||
return index;
|
return index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -249,12 +249,12 @@ bool isExtensionMatching(const char * extension, const char * pattern, char * ma
|
||||||
plen = (int)fnlen;
|
plen = (int)fnlen;
|
||||||
while (plen > 0 && ext) {
|
while (plen > 0 && ext) {
|
||||||
if (!strncasecmp(extension, ext, extlen)) {
|
if (!strncasecmp(extension, ext, extlen)) {
|
||||||
if (match != NULL) strncat(&(match[0]='\0'), ext, extlen);
|
if (match != nullptr) strncat(&(match[0]='\0'), ext, extlen);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
plen -= extlen;
|
plen -= extlen;
|
||||||
if (plen > 0) {
|
if (plen > 0) {
|
||||||
ext = getFileExtension(pattern, plen, 0, NULL, &extlen);
|
ext = getFileExtension(pattern, plen, 0, nullptr, &extlen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -275,7 +275,7 @@ bool sdListFiles(const char * path, const char * extension, const uint8_t maxlen
|
||||||
|
|
||||||
if (selection) {
|
if (selection) {
|
||||||
s_last_flags = flags;
|
s_last_flags = flags;
|
||||||
if (!isFilePatternAvailable(path, selection, ((flags & LIST_SD_FILE_EXT) ? NULL : extension))) selection = NULL;
|
if (!isFilePatternAvailable(path, selection, ((flags & LIST_SD_FILE_EXT) ? nullptr : extension))) selection = nullptr;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
flags = s_last_flags;
|
flags = s_last_flags;
|
||||||
|
@ -475,7 +475,7 @@ const char * sdCopyFile(const char * srcPath, const char * destPath)
|
||||||
return SDCARD_ERROR(result);
|
return SDCARD_ERROR(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir)
|
const char * sdCopyFile(const char * srcFilename, const char * srcDir, const char * destFilename, const char * destDir)
|
||||||
|
|
|
@ -271,7 +271,7 @@ void convertModelData_218_to_219(ModelData &model)
|
||||||
|
|
||||||
for (uint8_t i=0; i<MAX_TELEMETRY_SENSORS_218; i++) {
|
for (uint8_t i=0; i<MAX_TELEMETRY_SENSORS_218; i++) {
|
||||||
newModel.telemetrySensors[i].id = oldModel.telemetrySensors[i].id;
|
newModel.telemetrySensors[i].id = oldModel.telemetrySensors[i].id;
|
||||||
if (oldModel.telemetrySensors[i].type == 0)
|
if (oldModel.telemetrySensors[i].type == 0 && (oldModel.moduleData[0].type == MODULE_TYPE_XJT_PXX1 || oldModel.moduleData[1].type == MODULE_TYPE_XJT_PXX1))
|
||||||
newModel.telemetrySensors[i].instance = 0xE0 + (oldModel.telemetrySensors[i].instance & 0x1F) - 1;
|
newModel.telemetrySensors[i].instance = 0xE0 + (oldModel.telemetrySensors[i].instance & 0x1F) - 1;
|
||||||
else
|
else
|
||||||
newModel.telemetrySensors[i].instance = oldModel.telemetrySensors[i].instance;
|
newModel.telemetrySensors[i].instance = oldModel.telemetrySensors[i].instance;
|
||||||
|
@ -321,7 +321,7 @@ void convertModelData_218_to_219(ModelData &model)
|
||||||
ZoneOptionValue & option = zoneData->widgetData.options[0];
|
ZoneOptionValue & option = zoneData->widgetData.options[0];
|
||||||
option.unsignedValue = convertSource_218_to_219(option.unsignedValue);
|
option.unsignedValue = convertSource_218_to_219(option.unsignedValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
newModel.screensType = oldModel.frsky.screensType;
|
newModel.screensType = oldModel.frsky.screensType;
|
||||||
memmove(&newModel.screens, &oldModel.frsky.screens, sizeof(newModel.screens));
|
memmove(&newModel.screens, &oldModel.frsky.screens, sizeof(newModel.screens));
|
||||||
|
|
|
@ -14,7 +14,6 @@ option(DSM2 "DSM2 TX Module" ON)
|
||||||
option(SBUS "SBUS TX Module" ON)
|
option(SBUS "SBUS TX Module" ON)
|
||||||
option(CROSSFIRE "Crossfire TX Module" ON)
|
option(CROSSFIRE "Crossfire TX Module" ON)
|
||||||
option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON)
|
option(MULTIMODULE "DIY Multiprotocol TX Module (https://github.com/pascallanger/DIY-Multiprotocol-TX-Module)" ON)
|
||||||
option(MULTI_SPORT "SPORT telemetry support" OFF)
|
|
||||||
option(SUPPORT_D16_EU_ONLY "XJT module only supports D16-EU and LR12-EU" OFF) # TODO rename to XJT_EU_ONLY
|
option(SUPPORT_D16_EU_ONLY "XJT module only supports D16-EU and LR12-EU" OFF) # TODO rename to XJT_EU_ONLY
|
||||||
option(DEBUG_INTERRUPTS "Count interrupts" OFF)
|
option(DEBUG_INTERRUPTS "Count interrupts" OFF)
|
||||||
option(DEBUG_LATENCY "Debug latency" OFF)
|
option(DEBUG_LATENCY "Debug latency" OFF)
|
||||||
|
@ -152,10 +151,6 @@ if(MULTIMODULE)
|
||||||
set(SRC ${SRC} pulses/multi.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp)
|
set(SRC ${SRC} pulses/multi.cpp telemetry/spektrum.cpp telemetry/flysky_ibus.cpp telemetry/multi.cpp)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(MULTI_SPORT)
|
|
||||||
add_definitions(-DMULTI_SPORT)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CROSSFIRE)
|
if(CROSSFIRE)
|
||||||
add_definitions(-DCROSSFIRE)
|
add_definitions(-DCROSSFIRE)
|
||||||
set(PULSES_SRC
|
set(PULSES_SRC
|
||||||
|
|
|
@ -378,7 +378,7 @@ void audioInit()
|
||||||
audioSendRiffHeader();
|
audioSendRiffHeader();
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t * currentBuffer = NULL;
|
uint8_t * currentBuffer = nullptr;
|
||||||
uint32_t currentSize = 0;
|
uint32_t currentSize = 0;
|
||||||
int16_t newVolume = -1;
|
int16_t newVolume = -1;
|
||||||
|
|
||||||
|
@ -389,7 +389,7 @@ void audioSetCurrentBuffer(const AudioBuffer * buffer)
|
||||||
currentSize = buffer->size * 2;
|
currentSize = buffer->size * 2;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
currentBuffer = NULL;
|
currentBuffer = nullptr;
|
||||||
currentSize = 0;
|
currentSize = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -413,7 +413,7 @@ void audioConsumeCurrentBuffer()
|
||||||
currentSize -= written;
|
currentSize -= written;
|
||||||
if (currentSize == 0) {
|
if (currentSize == 0) {
|
||||||
audioQueue.buffersFifo.freeNextFilledBuffer();
|
audioQueue.buffersFifo.freeNextFilledBuffer();
|
||||||
currentBuffer = NULL;
|
currentBuffer = nullptr;
|
||||||
currentSize = 0;
|
currentSize = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -365,7 +365,7 @@ void sdDone()
|
||||||
#if defined(LOG_TELEMETRY)
|
#if defined(LOG_TELEMETRY)
|
||||||
f_close(&g_telemetryFile);
|
f_close(&g_telemetryFile);
|
||||||
#endif
|
#endif
|
||||||
f_mount(NULL, "", 0); // unmount SD
|
f_mount(nullptr, "", 0); // unmount SD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -52,7 +52,7 @@ void firmwareTraceCb(const char * text)
|
||||||
|
|
||||||
OpenTxSimulator::OpenTxSimulator() :
|
OpenTxSimulator::OpenTxSimulator() :
|
||||||
SimulatorInterface(),
|
SimulatorInterface(),
|
||||||
m_timer10ms(NULL),
|
m_timer10ms(nullptr),
|
||||||
m_resetOutputsData(true),
|
m_resetOutputsData(true),
|
||||||
m_stopRequested(false)
|
m_stopRequested(false)
|
||||||
{
|
{
|
||||||
|
@ -62,7 +62,7 @@ OpenTxSimulator::OpenTxSimulator() :
|
||||||
|
|
||||||
OpenTxSimulator::~OpenTxSimulator()
|
OpenTxSimulator::~OpenTxSimulator()
|
||||||
{
|
{
|
||||||
traceCallback = NULL;
|
traceCallback = nullptr;
|
||||||
tracebackDevices.clear();
|
tracebackDevices.clear();
|
||||||
|
|
||||||
if (m_timer10ms)
|
if (m_timer10ms)
|
||||||
|
|
|
@ -51,7 +51,7 @@ class DLLEXPORT OpenTxSimulator : public SimulatorInterface
|
||||||
public slots:
|
public slots:
|
||||||
|
|
||||||
virtual void init();
|
virtual void init();
|
||||||
virtual void start(const char * filename = NULL, bool tests = true);
|
virtual void start(const char * filename = nullptr, bool tests = true);
|
||||||
virtual void stop();
|
virtual void stop();
|
||||||
virtual void setSdPath(const QString & sdPath = "", const QString & settingsPath = "");
|
virtual void setSdPath(const QString & sdPath = "", const QString & settingsPath = "");
|
||||||
virtual void setVolumeGain(const int value);
|
virtual void setVolumeGain(const int value);
|
||||||
|
|
|
@ -220,8 +220,8 @@ void StopSimu()
|
||||||
|
|
||||||
simu_shutdown = true;
|
simu_shutdown = true;
|
||||||
|
|
||||||
pthread_join(mixerTaskId, NULL);
|
pthread_join(mixerTaskId, nullptr);
|
||||||
pthread_join(menusTaskId, NULL);
|
pthread_join(menusTaskId, nullptr);
|
||||||
|
|
||||||
simu_running = false;
|
simu_running = false;
|
||||||
}
|
}
|
||||||
|
@ -348,7 +348,7 @@ void * audioThread(void *)
|
||||||
wanted.channels = 1; /* 1 = mono, 2 = stereo */
|
wanted.channels = 1; /* 1 = mono, 2 = stereo */
|
||||||
wanted.samples = AUDIO_BUFFER_SIZE*2; /* Good low-latency value for callback */
|
wanted.samples = AUDIO_BUFFER_SIZE*2; /* Good low-latency value for callback */
|
||||||
wanted.callback = fillAudioBuffer;
|
wanted.callback = fillAudioBuffer;
|
||||||
wanted.userdata = NULL;
|
wanted.userdata = nullptr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
SDL_OpenAudio() internally calls SDL_InitSubSystem(SDL_INIT_AUDIO),
|
SDL_OpenAudio() internally calls SDL_InitSubSystem(SDL_INIT_AUDIO),
|
||||||
|
@ -390,7 +390,7 @@ void StartAudioThread(int volumeGain)
|
||||||
void StopAudioThread()
|
void StopAudioThread()
|
||||||
{
|
{
|
||||||
simuAudio.threadRunning = false;
|
simuAudio.threadRunning = false;
|
||||||
pthread_join(simuAudio.threadPid, NULL);
|
pthread_join(simuAudio.threadPid, nullptr);
|
||||||
}
|
}
|
||||||
#endif // #if defined(SIMU_AUDIO)
|
#endif // #if defined(SIMU_AUDIO)
|
||||||
|
|
||||||
|
|
|
@ -361,7 +361,7 @@ TCHAR * f_gets (TCHAR* buff, int len, FIL* fil)
|
||||||
{
|
{
|
||||||
if (fil && fil->obj.fs) {
|
if (fil && fil->obj.fs) {
|
||||||
buff = fgets(buff, len, (FILE*)fil->obj.fs);
|
buff = fgets(buff, len, (FILE*)fil->obj.fs);
|
||||||
if (buff != NULL) {
|
if (buff != nullptr) {
|
||||||
fil->fptr = *buff;
|
fil->fptr = *buff;
|
||||||
}
|
}
|
||||||
// TRACE_SIMPGMSPACE("fgets(%p) %u, %s", fil->obj.fs, len, buff);
|
// TRACE_SIMPGMSPACE("fgets(%p) %u, %s", fil->obj.fs, len, buff);
|
||||||
|
@ -396,7 +396,7 @@ FRESULT f_close (FIL * fil)
|
||||||
TRACE_SIMPGMSPACE("f_close(%p) (FIL:%p)", fil->obj.fs, fil);
|
TRACE_SIMPGMSPACE("f_close(%p) (FIL:%p)", fil->obj.fs, fil);
|
||||||
if (fil->obj.fs) {
|
if (fil->obj.fs) {
|
||||||
fclose((FILE*)fil->obj.fs);
|
fclose((FILE*)fil->obj.fs);
|
||||||
fil->obj.fs = NULL;
|
fil->obj.fs = nullptr;
|
||||||
}
|
}
|
||||||
return FR_OK;
|
return FR_OK;
|
||||||
}
|
}
|
||||||
|
@ -516,7 +516,7 @@ FRESULT f_rename(const TCHAR *oldname, const TCHAR *newname)
|
||||||
|
|
||||||
FRESULT f_utime(const TCHAR* path, const FILINFO* fno)
|
FRESULT f_utime(const TCHAR* path, const FILINFO* fno)
|
||||||
{
|
{
|
||||||
if (fno == NULL)
|
if (fno == nullptr)
|
||||||
return FR_INVALID_PARAMETER;
|
return FR_INVALID_PARAMETER;
|
||||||
|
|
||||||
std::string simpath = convertToSimuPath(path);
|
std::string simpath = convertToSimuPath(path);
|
||||||
|
|
|
@ -1013,7 +1013,7 @@ void sdDone()
|
||||||
{
|
{
|
||||||
if (sdMounted()) {
|
if (sdMounted()) {
|
||||||
audioQueue.stopSD();
|
audioQueue.stopSD();
|
||||||
f_mount(NULL, "", 0); // unmount SD
|
f_mount(nullptr, "", 0); // unmount SD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -171,7 +171,7 @@ void usbMassStorage()
|
||||||
Card_state = SD_ST_DATA;
|
Card_state = SD_ST_DATA;
|
||||||
audioQueue.stopSD();
|
audioQueue.stopSD();
|
||||||
logsClose();
|
logsClose();
|
||||||
f_mount(NULL, "", 0); // unmount SD
|
f_mount(nullptr, "", 0); // unmount SD
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!initialized) {
|
if (!initialized) {
|
||||||
|
|
|
@ -69,7 +69,7 @@ const CrossfireSensor & getCrossfireSensor(uint8_t id, uint8_t subId)
|
||||||
void processCrossfireTelemetryValue(uint8_t index, int32_t value)
|
void processCrossfireTelemetryValue(uint8_t index, int32_t value)
|
||||||
{
|
{
|
||||||
const CrossfireSensor & sensor = crossfireSensors[index];
|
const CrossfireSensor & sensor = crossfireSensors[index];
|
||||||
setTelemetryValue(TELEM_PROTO_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, sensor.precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, sensor.precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool checkCrossfireTelemetryFrameCRC()
|
bool checkCrossfireTelemetryFrameCRC()
|
||||||
|
@ -164,7 +164,7 @@ void processCrossfireTelemetryFrame()
|
||||||
const CrossfireSensor & sensor = crossfireSensors[FLIGHT_MODE_INDEX];
|
const CrossfireSensor & sensor = crossfireSensors[FLIGHT_MODE_INDEX];
|
||||||
for (int i=0; i<min<int>(16, telemetryRxBuffer[1]-2); i+=4) {
|
for (int i=0; i<min<int>(16, telemetryRxBuffer[1]-2); i+=4) {
|
||||||
uint32_t value = *((uint32_t *)&telemetryRxBuffer[3+i]);
|
uint32_t value = *((uint32_t *)&telemetryRxBuffer[3+i]);
|
||||||
setTelemetryValue(TELEM_PROTO_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, i);
|
setTelemetryValue(PROTOCOL_TELEMETRY_CROSSFIRE, sensor.id, 0, sensor.subId, value, sensor.unit, i);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -106,17 +106,17 @@ static void processFlySkySensor(const uint8_t *packet)
|
||||||
else if (sensor->unit == UNIT_VOLTS)
|
else if (sensor->unit == UNIT_VOLTS)
|
||||||
// Voltage types are signed 16bit integers
|
// Voltage types are signed 16bit integers
|
||||||
value = (int16_t)value;
|
value = (int16_t)value;
|
||||||
setTelemetryValue(TELEM_PROTO_FLYSKY_IBUS, id, 0, instance, value, sensor->unit, sensor->precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FLYSKY_IBUS, id, 0, instance, value, sensor->unit, sensor->precision);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
setTelemetryValue(TELEM_PROTO_FLYSKY_IBUS, id, 0, instance, value, UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FLYSKY_IBUS, id, 0, instance, value, UNIT_RAW, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void processFlySkyPacket(const uint8_t *packet)
|
void processFlySkyPacket(const uint8_t *packet)
|
||||||
{
|
{
|
||||||
// Set TX RSSI Value, reverse MULTIs scaling
|
// Set TX RSSI Value, reverse MULTIs scaling
|
||||||
setTelemetryValue(TELEM_PROTO_FLYSKY_IBUS, TX_RSSI_ID, 0, 0, packet[0], UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FLYSKY_IBUS, TX_RSSI_ID, 0, 0, packet[0], UNIT_RAW, 0);
|
||||||
|
|
||||||
for (int sensor = 0; sensor < 7; sensor++) {
|
for (int sensor = 0; sensor < 7; sensor++) {
|
||||||
int index = 1 + (4 * sensor);
|
int index = 1 + (4 * sensor);
|
||||||
|
|
|
@ -68,9 +68,9 @@ void frskyDProcessPacket(const uint8_t *packet)
|
||||||
{
|
{
|
||||||
case LINKPKT: // A1/A2/RSSI values
|
case LINKPKT: // A1/A2/RSSI values
|
||||||
{
|
{
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A1_ID, 0, 0, packet[1], UNIT_VOLTS, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, D_A1_ID, 0, 0, packet[1], UNIT_VOLTS, 0);
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_D, D_A2_ID, 0, 0, packet[2], UNIT_VOLTS, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, D_A2_ID, 0, 0, packet[2], UNIT_VOLTS, 0);
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_D, D_RSSI_ID, 0, 0, packet[3], UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, D_RSSI_ID, 0, 0, packet[3], UNIT_RAW, 0);
|
||||||
telemetryData.rssi.set(packet[3]);
|
telemetryData.rssi.set(packet[3]);
|
||||||
telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected
|
telemetryStreaming = TELEMETRY_TIMEOUT10ms; // reset counter only if valid packets are being detected
|
||||||
break;
|
break;
|
||||||
|
@ -258,7 +258,7 @@ void processHubPacket(uint8_t id, int16_t value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_D, id, 0, 0, data, unit, precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_D, id, 0, 0, data, unit, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
void frskyDSetDefault(int index, uint16_t id)
|
void frskyDSetDefault(int index, uint16_t id)
|
||||||
|
|
|
@ -128,14 +128,14 @@ void sportProcessTelemetryPacket(uint16_t id, uint8_t subId, uint8_t instance, u
|
||||||
uint8_t cellsCount = (data & 0xF0) >> 4;
|
uint8_t cellsCount = (data & 0xF0) >> 4;
|
||||||
uint8_t cellIndex = (data & 0x0F);
|
uint8_t cellIndex = (data & 0x0F);
|
||||||
uint32_t mask = (cellsCount << 24) + (cellIndex << 16);
|
uint32_t mask = (cellsCount << 24) + (cellIndex << 16);
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, id, subId, instance, mask + (((data & 0x000FFF00) >> 8) / 5), unit, precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_SPORT, id, subId, instance, mask + (((data & 0x000FFF00) >> 8) / 5), unit, precision);
|
||||||
if (cellIndex+1 < cellsCount) {
|
if (cellIndex+1 < cellsCount) {
|
||||||
mask += (1 << 16);
|
mask += (1 << 16);
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, id, subId, instance, mask + (((data & 0xFFF00000) >> 20) / 5), unit, precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_SPORT, id, subId, instance, mask + (((data & 0xFFF00000) >> 20) / 5), unit, precision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
setTelemetryValue(TELEM_PROTO_FRSKY_SPORT, id, subId, instance, data, unit, precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_FRSKY_SPORT, id, subId, instance, data, unit, precision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,7 +170,7 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t origin, const uint8_t * packe
|
||||||
data = SPORT_DATA_U8(packet);
|
data = SPORT_DATA_U8(packet);
|
||||||
if (g_model.rssiSource) {
|
if (g_model.rssiSource) {
|
||||||
TelemetrySensor * sensor = &g_model.telemetrySensors[g_model.rssiSource - 1];
|
TelemetrySensor * sensor = &g_model.telemetrySensors[g_model.rssiSource - 1];
|
||||||
if (sensor->isSameInstance(TELEM_PROTO_FRSKY_SPORT, instance)) {
|
if (sensor->isSameInstance(PROTOCOL_TELEMETRY_FRSKY_SPORT, instance)) {
|
||||||
telemetryData.rssi.set(data);
|
telemetryData.rssi.set(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,14 +138,12 @@ static void processMultiTelemetryPaket(const uint8_t *packet)
|
||||||
TRACE("[MP] Received Frsky HUB telemetry len %d < 4", len);
|
TRACE("[MP] Received Frsky HUB telemetry len %d < 4", len);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined(MULTI_SPORT)
|
|
||||||
case FrSkySportTelemtry:
|
case FrSkySportTelemtry:
|
||||||
if (len >= 4)
|
if (len >= 4)
|
||||||
sportProcessTelemetryPacket(data);
|
sportProcessTelemetryPacket(data);
|
||||||
else
|
else
|
||||||
TRACE("[MP] Received sport telemetry len %d < 4", len);
|
TRACE("[MP] Received sport telemetry len %d < 4", len);
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
case InputSync:
|
case InputSync:
|
||||||
if (len >= 6)
|
if (len >= 6)
|
||||||
|
@ -158,7 +156,7 @@ static void processMultiTelemetryPaket(const uint8_t *packet)
|
||||||
// Just an ack to our command, ignore for now
|
// Just an ack to our command, ignore for now
|
||||||
break;
|
break;
|
||||||
|
|
||||||
#if defined(MULTI_SPORT) && defined(LUA)
|
#if defined(LUA)
|
||||||
case FrskySportPolling:
|
case FrskySportPolling:
|
||||||
if (len >= 1 && outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT && data[0] == outputTelemetryBuffer.sport.physicalId) {
|
if (len >= 1 && outputTelemetryBuffer.destination == TELEMETRY_ENDPOINT_SPORT && data[0] == outputTelemetryBuffer.sport.physicalId) {
|
||||||
TRACE("MP Sending sport data out.");
|
TRACE("MP Sending sport data out.");
|
||||||
|
|
|
@ -271,7 +271,7 @@ bool isSpektrumValidValue(int32_t value, const SpektrumDataType type)
|
||||||
|
|
||||||
void processSpektrumPacket(const uint8_t *packet)
|
void processSpektrumPacket(const uint8_t *packet)
|
||||||
{
|
{
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 0, 0, 0, packet[1], UNIT_RAW, 0);
|
||||||
// highest bit indicates that TM1100 is in use, ignore it
|
// highest bit indicates that TM1100 is in use, ignore it
|
||||||
uint8_t i2cAddress = (packet[2] & 0x7f);
|
uint8_t i2cAddress = (packet[2] & 0x7f);
|
||||||
uint8_t instance = packet[3];
|
uint8_t instance = packet[3];
|
||||||
|
@ -283,10 +283,10 @@ void processSpektrumPacket(const uint8_t *packet)
|
||||||
|
|
||||||
for (int i=5; i<SPEKTRUM_TELEMETRY_LENGTH; i++)
|
for (int i=5; i<SPEKTRUM_TELEMETRY_LENGTH; i++)
|
||||||
{
|
{
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, pseudoId, 0, instance, packet[i], UNIT_TEXT, i-5);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, pseudoId, 0, instance, packet[i], UNIT_TEXT, i-5);
|
||||||
}
|
}
|
||||||
// Set a sential \0 just for safety since we have the space there
|
// Set a sential \0 just for safety since we have the space there
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, pseudoId, 0, instance, '\0', UNIT_TEXT, 13);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, pseudoId, 0, instance, '\0', UNIT_TEXT, 13);
|
||||||
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
@ -335,7 +335,7 @@ void processSpektrumPacket(const uint8_t *packet)
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t pseudoId = (sensor->i2caddress << 8 | sensor->startByte);
|
uint16_t pseudoId = (sensor->i2caddress << 8 | sensor->startByte);
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, pseudoId, 0, instance, value, sensor->unit, sensor->precision);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, pseudoId, 0, instance, value, sensor->unit, sensor->precision);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!handled) {
|
if (!handled) {
|
||||||
|
@ -344,7 +344,7 @@ void processSpektrumPacket(const uint8_t *packet)
|
||||||
for (int startByte=0; startByte<14; startByte+=2) {
|
for (int startByte=0; startByte<14; startByte+=2) {
|
||||||
int32_t value = spektrumGetValue(packet + 4, startByte, uint16);
|
int32_t value = spektrumGetValue(packet + 4, startByte, uint16);
|
||||||
uint16_t pseudoId = i2cAddress << 8 | startByte;
|
uint16_t pseudoId = i2cAddress << 8 | startByte;
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, pseudoId, 0, instance, value, UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, pseudoId, 0, instance, value, UNIT_RAW, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -397,7 +397,7 @@ void processDSMBindPacket(const uint8_t *packet)
|
||||||
debugval = packet[7] << 24 | packet[6] << 16 | packet[5] << 8 | packet[4];
|
debugval = packet[7] << 24 | packet[6] << 16 | packet[5] << 8 | packet[4];
|
||||||
|
|
||||||
/* log the bind packet as telemetry for quick debugging */
|
/* log the bind packet as telemetry for quick debugging */
|
||||||
setTelemetryValue(TELEM_PROTO_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0);
|
setTelemetryValue(PROTOCOL_TELEMETRY_SPEKTRUM, (I2C_PSEUDO_TX << 8) + 4, 0, 0, debugval, UNIT_RAW, 0);
|
||||||
|
|
||||||
/* Finally stop binding as the rx just told us that it is bound */
|
/* Finally stop binding as the rx just told us that it is bound */
|
||||||
if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_DSM2 && moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) {
|
if (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_MULTIMODULE && g_model.moduleData[EXTERNAL_MODULE].getMultiProtocol(true) == MODULE_SUBTYPE_MULTI_DSM2 && moduleState[EXTERNAL_MODULE].mode == MODULE_MODE_BIND) {
|
||||||
|
|
|
@ -509,27 +509,27 @@ int setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, ui
|
||||||
int index = availableTelemetryIndex();
|
int index = availableTelemetryIndex();
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
switch (protocol) {
|
switch (protocol) {
|
||||||
case TELEM_PROTO_FRSKY_SPORT:
|
case PROTOCOL_TELEMETRY_FRSKY_SPORT:
|
||||||
frskySportSetDefault(index, id, subId, instance);
|
frskySportSetDefault(index, id, subId, instance);
|
||||||
break;
|
break;
|
||||||
case TELEM_PROTO_FRSKY_D:
|
case PROTOCOL_TELEMETRY_FRSKY_D:
|
||||||
frskyDSetDefault(index, id);
|
frskyDSetDefault(index, id);
|
||||||
break;
|
break;
|
||||||
#if defined(CROSSFIRE)
|
#if defined(CROSSFIRE)
|
||||||
case TELEM_PROTO_CROSSFIRE:
|
case PROTOCOL_TELEMETRY_CROSSFIRE:
|
||||||
crossfireSetDefault(index, id, instance);
|
crossfireSetDefault(index, id, instance);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if defined(MULTIMODULE)
|
#if defined(MULTIMODULE)
|
||||||
case TELEM_PROTO_SPEKTRUM:
|
case PROTOCOL_TELEMETRY_SPEKTRUM:
|
||||||
spektrumSetDefault(index, id, subId, instance);
|
spektrumSetDefault(index, id, subId, instance);
|
||||||
break;
|
break;
|
||||||
case TELEM_PROTO_FLYSKY_IBUS:
|
case PROTOCOL_TELEMETRY_FLYSKY_IBUS:
|
||||||
flySkySetDefault(index,id, subId, instance);
|
flySkySetDefault(index,id, subId, instance);
|
||||||
break;
|
break;
|
||||||
#endif
|
#endif
|
||||||
#if defined(LUA)
|
#if defined(LUA)
|
||||||
case TELEM_PROTO_LUA:
|
case PROTOCOL_TELEMETRY_LUA:
|
||||||
// Sensor will be initialized by calling function
|
// Sensor will be initialized by calling function
|
||||||
// This drops the first value
|
// This drops the first value
|
||||||
return index;
|
return index;
|
||||||
|
|
|
@ -86,65 +86,53 @@ def main():
|
||||||
maxsize = 65536 * 4
|
maxsize = 65536 * 4
|
||||||
elif board_name == "x9lite":
|
elif board_name == "x9lite":
|
||||||
cmake_options["PCB"] = "X9LITE"
|
cmake_options["PCB"] = "X9LITE"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9lite
|
firmware_options = options_taranis_x9lite
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x7":
|
elif board_name == "x7":
|
||||||
cmake_options["PCB"] = "X7"
|
cmake_options["PCB"] = "X7"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9dp
|
firmware_options = options_taranis_x9dp
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "xlite":
|
elif board_name == "xlite":
|
||||||
cmake_options["PCB"] = "XLITE"
|
cmake_options["PCB"] = "XLITE"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_xlite
|
firmware_options = options_taranis_xlite
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "xlites":
|
elif board_name == "xlites":
|
||||||
cmake_options["PCB"] = "XLITES"
|
cmake_options["PCB"] = "XLITES"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_xlites
|
firmware_options = options_taranis_xlites
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x9d":
|
elif board_name == "x9d":
|
||||||
cmake_options["PCB"] = "X9D"
|
cmake_options["PCB"] = "X9D"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9d
|
firmware_options = options_taranis_x9d
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x9d+":
|
elif board_name == "x9d+":
|
||||||
cmake_options["PCB"] = "X9D+"
|
cmake_options["PCB"] = "X9D+"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9dp
|
firmware_options = options_taranis_x9dp
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x9d+2019":
|
elif board_name == "x9d+2019":
|
||||||
cmake_options["PCB"] = "X9D+"
|
cmake_options["PCB"] = "X9D+"
|
||||||
cmake_options["PCBREV"] = "2019"
|
cmake_options["PCBREV"] = "2019"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9dp
|
firmware_options = options_taranis_x9dp
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x9e":
|
elif board_name == "x9e":
|
||||||
cmake_options["PCB"] = "X9E"
|
cmake_options["PCB"] = "X9E"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9e
|
firmware_options = options_taranis_x9e
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
elif board_name == "x10":
|
elif board_name == "x10":
|
||||||
cmake_options["PCB"] = "X10"
|
cmake_options["PCB"] = "X10"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_horus_x10
|
firmware_options = options_horus_x10
|
||||||
maxsize = 2 * 1024 * 1024
|
maxsize = 2 * 1024 * 1024
|
||||||
elif board_name == "x10express":
|
elif board_name == "x10express":
|
||||||
cmake_options["PCB"] = "X10"
|
cmake_options["PCB"] = "X10"
|
||||||
cmake_options["PCBREV"] = "EXPRESS"
|
cmake_options["PCBREV"] = "EXPRESS"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_horus_x10
|
firmware_options = options_horus_x10
|
||||||
maxsize = 2 * 1024 * 1024
|
maxsize = 2 * 1024 * 1024
|
||||||
elif board_name == "x12s":
|
elif board_name == "x12s":
|
||||||
cmake_options["PCB"] = "X12S"
|
cmake_options["PCB"] = "X12S"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_horus_x12s
|
firmware_options = options_horus_x12s
|
||||||
maxsize = 2 * 1024 * 1024
|
maxsize = 2 * 1024 * 1024
|
||||||
elif board_name == "t12":
|
elif board_name == "t12":
|
||||||
cmake_options["PCB"] = "X7"
|
cmake_options["PCB"] = "X7"
|
||||||
cmake_options["PCBREV"] = "T12"
|
cmake_options["PCBREV"] = "T12"
|
||||||
cmake_options["MULTI_SPORT"] = "ON"
|
|
||||||
firmware_options = options_taranis_x9dp
|
firmware_options = options_taranis_x9dp
|
||||||
maxsize = 65536 * 8
|
maxsize = 65536 * 8
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue