refactor: FLASH size optimisations for B&W (#4827)
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 196 B After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 347 B After Width: | Height: | Size: 1.6 KiB |
@@ -86,6 +86,12 @@
|
||||
#define PACK(__Declaration__) __pragma( pack(push, 1) ) __Declaration__ __pragma( pack(pop) )
|
||||
#endif
|
||||
|
||||
#if defined(SIMU)
|
||||
#define PACK_NOT_SIMU(__Declaration__) __Declaration__
|
||||
#else
|
||||
#define PACK_NOT_SIMU(__Declaration__) PACK(__Declaration__)
|
||||
#endif
|
||||
|
||||
#if defined(SIMU)
|
||||
#define CONVERT_PTR_UINT(x) ((uint32_t)(uint64_t)(x))
|
||||
#define CONVERT_UINT_PTR(x) ((uint32_t*)(uint64_t)(x))
|
||||
|
||||
@@ -21,6 +21,28 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
const MenuHandler menuTabModel[MENU_MODEL_PAGES_COUNT] = {
|
||||
{ menuModelSelect, nullptr },
|
||||
{ menuModelSetup, nullptr },
|
||||
#if defined(HELI)
|
||||
{ menuModelHeli, modelHeliEnabled },
|
||||
#endif
|
||||
#if defined(FLIGHT_MODES)
|
||||
{ menuModelFlightModesAll, modelFMEnabled },
|
||||
#endif
|
||||
{ menuModelExposAll, nullptr },
|
||||
{ menuModelMixAll, nullptr },
|
||||
{ menuModelLimits, nullptr },
|
||||
{ menuModelCurvesAll, modelCurvesEnabled },
|
||||
{ menuModelLogicalSwitches, modelLSEnabled },
|
||||
{ menuModelSpecialFunctions, modelSFEnabled },
|
||||
#if defined(LUA_MODEL_SCRIPTS)
|
||||
{ menuModelCustomScripts, modelCustomScriptsEnabled },
|
||||
#endif
|
||||
{ menuModelTelemetry, modelTelemetryEnabled },
|
||||
{ menuModelDisplay, nullptr }
|
||||
};
|
||||
|
||||
uint8_t editDelay(coord_t y, event_t event, uint8_t attr, const char * str, uint8_t delay, uint8_t prec)
|
||||
{
|
||||
lcdDrawTextAlignedLeft(y, str);
|
||||
|
||||
@@ -21,6 +21,20 @@
|
||||
|
||||
#include "opentx.h"
|
||||
|
||||
const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
|
||||
#if defined(RADIO_TOOLS)
|
||||
{ menuRadioTools, nullptr },
|
||||
#endif
|
||||
#if defined(SDCARD)
|
||||
{ menuRadioSdManager, nullptr },
|
||||
#endif
|
||||
{ menuRadioSetup, nullptr },
|
||||
{ menuRadioSpecialFunctions, radioGFEnabled },
|
||||
{ menuRadioTrainer, radioTrainerEnabled },
|
||||
{ menuRadioHardware, nullptr },
|
||||
{ menuRadioVersion, nullptr }
|
||||
};
|
||||
|
||||
void menuRadioSpecialFunctions(event_t event)
|
||||
{
|
||||
#if defined(NAVIGATION_X7)
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _MENUS_H_
|
||||
#define _MENUS_H_
|
||||
#pragma once
|
||||
|
||||
#include "keys.h"
|
||||
#include "common/stdlcd/menus.h"
|
||||
@@ -82,19 +81,7 @@ void menuGhostModuleConfig(event_t event);
|
||||
extern bool radioGFEnabled();
|
||||
extern bool radioTrainerEnabled();
|
||||
|
||||
static const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT] = {
|
||||
#if defined(RADIO_TOOLS)
|
||||
{ menuRadioTools, nullptr },
|
||||
#endif
|
||||
#if defined(SDCARD)
|
||||
{ menuRadioSdManager, nullptr },
|
||||
#endif
|
||||
{ menuRadioSetup, nullptr },
|
||||
{ menuRadioSpecialFunctions, radioGFEnabled },
|
||||
{ menuRadioTrainer, radioTrainerEnabled },
|
||||
{ menuRadioHardware, nullptr },
|
||||
{ menuRadioVersion, nullptr }
|
||||
};
|
||||
extern const MenuHandler menuTabGeneral[MENU_RADIO_PAGES_COUNT];
|
||||
|
||||
enum MenuModelIndexes {
|
||||
MENU_MODEL_SELECT,
|
||||
@@ -150,31 +137,9 @@ extern bool modelSFEnabled();
|
||||
extern bool modelCustomScriptsEnabled();
|
||||
extern bool modelTelemetryEnabled();
|
||||
|
||||
static const MenuHandler menuTabModel[] = {
|
||||
{ menuModelSelect, nullptr },
|
||||
{ menuModelSetup, nullptr },
|
||||
#if defined(HELI)
|
||||
{ menuModelHeli, modelHeliEnabled },
|
||||
#endif
|
||||
#if defined(FLIGHT_MODES)
|
||||
{ menuModelFlightModesAll, modelFMEnabled },
|
||||
#endif
|
||||
{ menuModelExposAll, nullptr },
|
||||
{ menuModelMixAll, nullptr },
|
||||
{ menuModelLimits, nullptr },
|
||||
{ menuModelCurvesAll, modelCurvesEnabled },
|
||||
{ menuModelLogicalSwitches, modelLSEnabled },
|
||||
{ menuModelSpecialFunctions, modelSFEnabled },
|
||||
#if defined(LUA_MODEL_SCRIPTS)
|
||||
{ menuModelCustomScripts, modelCustomScriptsEnabled },
|
||||
#endif
|
||||
{ menuModelTelemetry, modelTelemetryEnabled },
|
||||
{ menuModelDisplay, nullptr }
|
||||
};
|
||||
extern const MenuHandler menuTabModel[MENU_MODEL_PAGES_COUNT];
|
||||
|
||||
void menuStatisticsView(event_t event);
|
||||
void menuStatisticsDebug(event_t event);
|
||||
void menuStatisticsDebug2(event_t event);
|
||||
void menuAboutView(event_t event);
|
||||
|
||||
#endif // _MENUS_H_
|
||||
|
||||
@@ -154,10 +154,7 @@ void menuModelCurveOne(event_t event)
|
||||
case EVT_KEY_LONG(KEY_ENTER):
|
||||
if (menuVerticalPosition > 1) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET);
|
||||
POPUP_MENU_ADD_ITEM(STR_MIRROR);
|
||||
POPUP_MENU_ADD_ITEM(STR_CLEAR);
|
||||
POPUP_MENU_START(onCurveOneMenu);
|
||||
POPUP_MENU_START(onCurveOneMenu, 3, STR_CURVE_PRESET, STR_MIRROR, STR_CLEAR);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -66,11 +66,7 @@ void menuModelFailsafe(event_t event)
|
||||
|
||||
if (sub == k && !READ_ONLY() && event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_NONE);
|
||||
POPUP_MENU_ADD_ITEM(STR_HOLD);
|
||||
POPUP_MENU_ADD_ITEM(STR_CHANNEL2FAILSAFE);
|
||||
POPUP_MENU_ADD_ITEM(STR_CHANNELS2FAILSAFE);
|
||||
POPUP_MENU_START(onFailsafeMenu);
|
||||
POPUP_MENU_START(onFailsafeMenu, 4, STR_NONE, STR_HOLD, STR_CHANNEL2FAILSAFE, STR_CHANNELS2FAILSAFE);
|
||||
}
|
||||
|
||||
// Channel
|
||||
|
||||
@@ -234,12 +234,7 @@ void menuModelLimits(event_t event)
|
||||
if (sub==k && event==EVT_KEY_FIRST(KEY_ENTER) && !READ_ONLY() && (k != MAX_OUTPUT_CHANNELS) ) {
|
||||
killEvents(event);
|
||||
s_editMode = 0;
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS);
|
||||
POPUP_MENU_START(onLimitsMenu);
|
||||
POPUP_MENU_START(onLimitsMenu, 5, STR_EDIT, STR_RESET, STR_COPY_TRIMS_TO_OFS, STR_COPY_STICKS_TO_OFS, STR_COPY_MIN_MAX_TO_OUTPUTS);
|
||||
}
|
||||
|
||||
if (k == MAX_OUTPUT_CHANNELS) {
|
||||
|
||||
@@ -174,10 +174,7 @@ void menuModelTelemetry(event_t event)
|
||||
s_currIdx = index;
|
||||
if (event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_START(onSensorMenu);
|
||||
POPUP_MENU_START(onSensorMenu, 3, STR_EDIT, STR_COPY, STR_DELETE);
|
||||
}
|
||||
else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
pushMenu(menuModelSensor);
|
||||
|
||||
@@ -28,7 +28,7 @@ const unsigned char ASTERISK_BITMAP[] = {
|
||||
void drawAlertBox(const char * title, const char * text, const char * action)
|
||||
{
|
||||
lcdClear();
|
||||
lcdDraw1bitBitmap(2, 0, ASTERISK_BITMAP, 0, 0);
|
||||
lcdDraw1bitBitmap(2, 2, ASTERISK_BITMAP, 0, 0);
|
||||
|
||||
#define MESSAGE_LCD_OFFSET 6*FW
|
||||
|
||||
|
||||
@@ -22,8 +22,8 @@
|
||||
#include "opentx.h"
|
||||
|
||||
|
||||
#define SLEEP_BITMAP_WIDTH 60
|
||||
#define SLEEP_BITMAP_HEIGHT 60
|
||||
#define SLEEP_BITMAP_WIDTH 42
|
||||
#define SLEEP_BITMAP_HEIGHT 47
|
||||
|
||||
const unsigned char bmp_sleep[] = {
|
||||
#include "sleep.lbm"
|
||||
|
||||
@@ -49,10 +49,10 @@
|
||||
#define TRIM_LV_X 3
|
||||
#define TRIM_RV_X (LCD_W-4)
|
||||
#define TRIM_RH_X (LCD_W-TRIM_LEN-5)
|
||||
#define TRIM_LH_NEG (TRIM_LH_X+1*FW)
|
||||
#define TRIM_LH_POS (TRIM_LH_X-4*FW)
|
||||
#define TRIM_RH_NEG (TRIM_RH_X+1*FW)
|
||||
#define TRIM_RH_POS (TRIM_RH_X-4*FW)
|
||||
#define TRIM_LH_NEG (TRIM_LH_X+3*FW+1)
|
||||
#define TRIM_LH_POS (TRIM_LH_X-4*FW+3)
|
||||
#define TRIM_RH_NEG (TRIM_RH_X+3*FW+1)
|
||||
#define TRIM_RH_POS (TRIM_RH_X-4*FW+3)
|
||||
#define RSSSI_X (30)
|
||||
#define RSSSI_Y (31)
|
||||
#define RSSI_MAX 105
|
||||
@@ -148,43 +148,48 @@ void doMainScreenGraphics()
|
||||
|
||||
void displayTrims(uint8_t phase)
|
||||
{
|
||||
for (uint8_t i = 0; i < keysGetMaxTrims(); i++) {
|
||||
#if defined(SURFACE_RADIO)
|
||||
static coord_t x[] = {TRIM_RH_X, TRIM_LH_X, TRIM_RV_X, TRIM_LV_X, TRIM_LV_X};
|
||||
static uint8_t vert[] = {0, 0, 1, 1, 1};
|
||||
static uint8_t x[] = {TRIM_RH_X, TRIM_LH_X, TRIM_RV_X, TRIM_LV_X, TRIM_LV_X};
|
||||
static uint8_t vert[] = {0, 0, 1, 1, 1};
|
||||
#else
|
||||
static coord_t x[] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X, TRIM_LH_X, TRIM_LV_X, TRIM_RH_X, TRIM_RV_X};
|
||||
static uint8_t vert[] = {0, 1, 1, 0, 0, 1, 0, 1};
|
||||
static uint8_t x[] = {TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X, TRIM_LH_X, TRIM_LV_X, TRIM_RH_X, TRIM_RV_X};
|
||||
static uint8_t vert[] = {0, 1, 1, 0, 0, 1, 0, 1};
|
||||
#endif
|
||||
coord_t xm, ym;
|
||||
uint8_t stickIndex = inputMappingConvertMode(i);
|
||||
xm = x[stickIndex];
|
||||
uint8_t att = ROUND;
|
||||
int16_t val = getTrimValue(phase, i);
|
||||
|
||||
bool squareMarker = (keysGetMaxTrims() <= 4);
|
||||
|
||||
for (uint8_t i = 0; i < keysGetMaxTrims(); i++) {
|
||||
|
||||
if (getRawTrimValue(phase, i).mode == TRIM_MODE_NONE || getRawTrimValue(phase, i).mode == TRIM_MODE_3POS)
|
||||
continue;
|
||||
|
||||
coord_t ym;
|
||||
uint8_t stickIndex = inputMappingConvertMode(i);
|
||||
coord_t xm = x[stickIndex];
|
||||
uint8_t att = ROUND;
|
||||
int16_t val = getTrimValue(phase, i);
|
||||
|
||||
int16_t dir = val;
|
||||
bool exttrim = false;
|
||||
if (val < TRIM_MIN || val > TRIM_MAX) {
|
||||
exttrim = true;
|
||||
}
|
||||
if (val < -(TRIM_LEN + 1) * 4) {
|
||||
val = -(TRIM_LEN + 1);
|
||||
val = (val * TRIM_LEN) / TRIM_MAX;
|
||||
if (val < -TRIM_LEN) {
|
||||
val = -TRIM_LEN;
|
||||
}
|
||||
else if (val > (TRIM_LEN + 1) * 4) {
|
||||
val = TRIM_LEN + 1;
|
||||
}
|
||||
else {
|
||||
val /= 4;
|
||||
else if (val > TRIM_LEN) {
|
||||
val = TRIM_LEN;
|
||||
}
|
||||
|
||||
uint8_t nx, ny;
|
||||
LcdFlags nFlg = TINSIZE;
|
||||
|
||||
if (vert[i]) {
|
||||
ym = 31;
|
||||
if (!getPixel(xm, ym))
|
||||
lcdDrawSolidVerticalLine(xm, ym - TRIM_LEN, TRIM_LEN * 2 + 1);
|
||||
if (keysGetMaxTrims() <= 4) {
|
||||
if (squareMarker) {
|
||||
if (i != 2 || !g_model.thrTrim) {
|
||||
lcdDrawSolidVerticalLine(xm - 1, ym - 1, 3);
|
||||
lcdDrawSolidVerticalLine(xm + 1, ym - 1, 3);
|
||||
@@ -200,14 +205,6 @@ void displayTrims(uint8_t phase)
|
||||
if (exttrim) {
|
||||
lcdDrawSolidHorizontalLine(xm - 1, ym, 3);
|
||||
}
|
||||
if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) {
|
||||
if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS ||
|
||||
(trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) {
|
||||
lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir),
|
||||
TINSIZE | VERTICAL);
|
||||
}
|
||||
}
|
||||
lcdDrawSquare(xm - 3, ym - 3, 7, att);
|
||||
}
|
||||
else {
|
||||
ym -= val;
|
||||
@@ -221,20 +218,16 @@ void displayTrims(uint8_t phase)
|
||||
lcdDrawSolidVerticalLine(xm + 2, ym - 1, 3);
|
||||
lcdDrawSolidVerticalLine(xm + 3, ym - 2, 5);
|
||||
}
|
||||
if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) {
|
||||
if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS ||
|
||||
(trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) {
|
||||
lcdDrawNumber(dir > 0 ? 12 : 40, xm - 2, -abs(dir),
|
||||
TINSIZE | VERTICAL);
|
||||
}
|
||||
}
|
||||
}
|
||||
nx = dir > 0 ? 12 : 52;
|
||||
ny = xm - 2;
|
||||
nFlg |= VERTICAL;
|
||||
}
|
||||
else {
|
||||
ym = 60;
|
||||
if (!getPixel(xm, ym))
|
||||
lcdDrawSolidHorizontalLine(xm - TRIM_LEN, ym, TRIM_LEN * 2 + 1);
|
||||
if (keysGetMaxTrims() <= 4) {
|
||||
if (squareMarker) {
|
||||
lcdDrawSolidHorizontalLine(xm - 1, ym - 1, 3);
|
||||
lcdDrawSolidHorizontalLine(xm - 1, ym + 1, 3);
|
||||
xm += val;
|
||||
@@ -248,16 +241,6 @@ void displayTrims(uint8_t phase)
|
||||
if (exttrim) {
|
||||
lcdDrawSolidVerticalLine(xm, ym - 1, 3);
|
||||
}
|
||||
if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0) {
|
||||
if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS ||
|
||||
(trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) {
|
||||
lcdDrawNumber(
|
||||
(stickIndex == 0 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG)
|
||||
: (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)),
|
||||
ym - 2, -abs(dir), TINSIZE);
|
||||
}
|
||||
}
|
||||
lcdDrawSquare(xm - 3, ym - 3, 7, att);
|
||||
}
|
||||
else {
|
||||
xm += val;
|
||||
@@ -271,18 +254,19 @@ void displayTrims(uint8_t phase)
|
||||
lcdDrawSolidHorizontalLine(xm - 1, ym - 2, 3);
|
||||
lcdDrawSolidHorizontalLine(xm - 2, ym - 3, 5);
|
||||
}
|
||||
if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) {
|
||||
if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS ||
|
||||
(trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) {
|
||||
lcdDrawNumber(
|
||||
(xm < LCD_W / 2 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG)
|
||||
: (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG)),
|
||||
ym - 2, -abs(dir), TINSIZE);
|
||||
}
|
||||
}
|
||||
}
|
||||
nx = xm < LCD_W / 2 ? (dir > 0 ? TRIM_LH_POS : TRIM_LH_NEG)
|
||||
: (dir > 0 ? TRIM_RH_POS : TRIM_RH_NEG);
|
||||
ny = ym - 2;
|
||||
}
|
||||
if (g_model.displayTrims != DISPLAY_TRIMS_NEVER && dir != 0 && i < 4) {
|
||||
if (g_model.displayTrims == DISPLAY_TRIMS_ALWAYS ||
|
||||
(trimsDisplayTimer > 0 && (trimsDisplayMask & (1 << i)))) {
|
||||
lcdDrawNumber(nx, ny, -abs(dir), nFlg | (dir < 0 ? RIGHT : 0));
|
||||
}
|
||||
}
|
||||
|
||||
if (squareMarker)
|
||||
lcdDrawSquare(xm - 3, ym - 3, 7, att);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -388,12 +372,7 @@ void onMainViewMenu(const char * result)
|
||||
pushModelNotes();
|
||||
}
|
||||
else if (result == STR_RESET_SUBMENU) {
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER1);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER2);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER3);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
|
||||
POPUP_MENU_START(onMainViewMenu);
|
||||
POPUP_MENU_START(onMainViewMenu, 5, STR_RESET_FLIGHT, STR_RESET_TIMER1, STR_RESET_TIMER2, STR_RESET_TIMER3, STR_RESET_TELEMETRY);
|
||||
}
|
||||
else if (result == STR_RESET_TELEMETRY) {
|
||||
telemetryReset();
|
||||
@@ -474,11 +453,7 @@ void menuMainView(event_t event)
|
||||
POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES);
|
||||
}
|
||||
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_SUBMENU);
|
||||
|
||||
POPUP_MENU_ADD_ITEM(STR_STATISTICS);
|
||||
POPUP_MENU_ADD_ITEM(STR_ABOUT_US);
|
||||
POPUP_MENU_START(onMainViewMenu);
|
||||
POPUP_MENU_START(onMainViewMenu, 3, STR_RESET_SUBMENU, STR_STATISTICS, STR_ABOUT_US);
|
||||
break;
|
||||
|
||||
#if defined(EVT_KEY_LAST_MENU)
|
||||
|
||||
@@ -162,10 +162,7 @@ void menuModelCurveOne(event_t event)
|
||||
case EVT_KEY_LONG(KEY_ENTER):
|
||||
if (menuVerticalPosition > 1) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_CURVE_PRESET);
|
||||
POPUP_MENU_ADD_ITEM(STR_MIRROR);
|
||||
POPUP_MENU_ADD_ITEM(STR_CLEAR);
|
||||
POPUP_MENU_START(onCurveOneMenu);
|
||||
POPUP_MENU_START(onCurveOneMenu, 3, STR_CURVE_PRESET, STR_MIRROR, STR_CLEAR);
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
@@ -198,8 +198,6 @@ void menuModelGVars(event_t event)
|
||||
|
||||
if ((menuHorizontalPosition<0 || !modelFMEnabled()) && event==EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_CLEAR);
|
||||
POPUP_MENU_START(onGVARSMenu);
|
||||
POPUP_MENU_START(onGVARSMenu, 2, STR_EDIT, STR_CLEAR);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -148,11 +148,7 @@ void menuModelLimits(event_t event)
|
||||
putsChn(0, y, k+1, (sub==k && menuHorizontalPosition < 0) ? INVERS : 0);
|
||||
if (sub==k && menuHorizontalPosition < 0 && event==EVT_KEY_LONG(KEY_ENTER) && !READ_ONLY()) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_TRIMS_TO_OFS);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_STICKS_TO_OFS);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY_MIN_MAX_TO_OUTPUTS);
|
||||
POPUP_MENU_START(onLimitsMenu);
|
||||
POPUP_MENU_START(onLimitsMenu, 4, STR_RESET, STR_COPY_TRIMS_TO_OFS, STR_COPY_STICKS_TO_OFS, STR_COPY_MIN_MAX_TO_OUTPUTS);
|
||||
}
|
||||
|
||||
for (int j=0; j<ITEM_LIMITS_COUNT; j++) {
|
||||
|
||||
@@ -161,10 +161,7 @@ void menuModelTelemetry(event_t event)
|
||||
s_currIdx = index;
|
||||
if (event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_START(onSensorMenu);
|
||||
POPUP_MENU_START(onSensorMenu, 3, STR_EDIT, STR_COPY, STR_DELETE);
|
||||
}
|
||||
else if (event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
pushMenu(menuModelSensor);
|
||||
|
||||
@@ -112,32 +112,31 @@ void doMainScreenGraphics()
|
||||
|
||||
void displayTrims(uint8_t phase)
|
||||
{
|
||||
static uint8_t x[] = { TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X };
|
||||
static uint8_t vert[] = { 0, 1, 1, 0 };
|
||||
|
||||
for (unsigned int i = 0; i < MAX_STICKS; i++) {
|
||||
coord_t x[] = { TRIM_LH_X, TRIM_LV_X, TRIM_RV_X, TRIM_RH_X };
|
||||
uint8_t vert[] = { 0, 1, 1, 0 };
|
||||
coord_t xm, ym;
|
||||
if(getRawTrimValue(phase, i).mode == TRIM_MODE_NONE || getRawTrimValue(phase, i).mode == TRIM_MODE_3POS)
|
||||
continue;
|
||||
|
||||
coord_t ym;
|
||||
unsigned int stickIndex = inputMappingConvertMode(i);
|
||||
xm = x[stickIndex];
|
||||
coord_t xm = x[stickIndex];
|
||||
|
||||
uint32_t att = ROUND;
|
||||
int32_t trim = getTrimValue(phase, i);
|
||||
int32_t val = trim;
|
||||
bool exttrim = false;
|
||||
|
||||
if(getRawTrimValue(phase, i).mode == TRIM_MODE_NONE || getRawTrimValue(phase, i).mode == TRIM_MODE_3POS)
|
||||
continue;
|
||||
|
||||
if (val < TRIM_MIN || val > TRIM_MAX) {
|
||||
exttrim = true;
|
||||
}
|
||||
if (val < -(TRIM_LEN+1)*4) {
|
||||
val = -(TRIM_LEN+1);
|
||||
val = (val * TRIM_LEN) / TRIM_MAX;
|
||||
if (val < -TRIM_LEN) {
|
||||
val = -TRIM_LEN;
|
||||
}
|
||||
else if (val > (TRIM_LEN+1)*4) {
|
||||
val = TRIM_LEN+1;
|
||||
}
|
||||
else {
|
||||
val /= 4;
|
||||
else if (val > TRIM_LEN) {
|
||||
val = TRIM_LEN;
|
||||
}
|
||||
|
||||
if (vert[i]) {
|
||||
@@ -411,12 +410,7 @@ void onMainViewMenu(const char * result)
|
||||
pushModelNotes();
|
||||
}
|
||||
else if (result == STR_RESET_SUBMENU) {
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER1);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER2);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TIMER3);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
|
||||
POPUP_MENU_START(onMainViewMenu);
|
||||
POPUP_MENU_START(onMainViewMenu, 5, STR_RESET_FLIGHT, STR_RESET_TIMER1, STR_RESET_TIMER2, STR_RESET_TIMER3, STR_RESET_TELEMETRY);
|
||||
}
|
||||
else if (result == STR_RESET_TELEMETRY) {
|
||||
telemetryReset();
|
||||
@@ -482,10 +476,7 @@ void menuMainView(event_t event)
|
||||
if (modelHasNotes()) {
|
||||
POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES);
|
||||
}
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_SUBMENU);
|
||||
POPUP_MENU_ADD_ITEM(STR_STATISTICS);
|
||||
POPUP_MENU_ADD_ITEM(STR_ABOUT_US);
|
||||
POPUP_MENU_START(onMainViewMenu);
|
||||
POPUP_MENU_START(onMainViewMenu, 3, STR_RESET_SUBMENU, STR_STATISTICS, STR_ABOUT_US);
|
||||
break;
|
||||
|
||||
case EVT_KEY_BREAK(KEY_MENU):
|
||||
|
||||
@@ -319,13 +319,7 @@ void menuModelExposAll(event_t event)
|
||||
else {
|
||||
event = 0;
|
||||
s_copyMode = 0;
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_INSERT_BEFORE);
|
||||
POPUP_MENU_ADD_ITEM(STR_INSERT_AFTER);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY);
|
||||
POPUP_MENU_ADD_ITEM(STR_MOVE);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_START(onExposMenu);
|
||||
POPUP_MENU_START(onExposMenu, 6, STR_EDIT, STR_INSERT_BEFORE, STR_INSERT_AFTER, STR_COPY, STR_MOVE, STR_DELETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -236,13 +236,7 @@ void menuModelMixAll(event_t event)
|
||||
else {
|
||||
event = 0;
|
||||
s_copyMode = 0;
|
||||
POPUP_MENU_ADD_ITEM(STR_EDIT);
|
||||
POPUP_MENU_ADD_ITEM(STR_INSERT_BEFORE);
|
||||
POPUP_MENU_ADD_ITEM(STR_INSERT_AFTER);
|
||||
POPUP_MENU_ADD_ITEM(STR_COPY);
|
||||
POPUP_MENU_ADD_ITEM(STR_MOVE);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_START(onMixesMenu);
|
||||
POPUP_MENU_START(onMixesMenu, 6, STR_EDIT, STR_INSERT_BEFORE, STR_INSERT_AFTER, STR_COPY, STR_MOVE, STR_DELETE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,9 +72,7 @@ void onPXX2BindMenu(const char * result)
|
||||
}
|
||||
else if (isModuleR9MAccess(moduleIdx) && reusableBuffer.moduleSetup.pxx2.moduleInformation.information.variant == PXX2_VARIANT_FLEX) {
|
||||
reusableBuffer.moduleSetup.bindInformation.step = BIND_RX_NAME_SELECTED;
|
||||
POPUP_MENU_ADD_ITEM(STR_FLEX_868);
|
||||
POPUP_MENU_ADD_ITEM(STR_FLEX_915);
|
||||
POPUP_MENU_START(onPXX2R9MBindModeMenu);
|
||||
POPUP_MENU_START(onPXX2R9MBindModeMenu, 2, STR_FLEX_868, STR_FLEX_915);
|
||||
}
|
||||
else {
|
||||
#if defined(SIMU)
|
||||
@@ -332,11 +330,6 @@ void modelSetupModulePxx2ReceiverLine(uint8_t moduleIdx, uint8_t receiverIdx, co
|
||||
}
|
||||
|
||||
if (attr && event == EVT_KEY_BREAK(KEY_ENTER)) {
|
||||
POPUP_MENU_ADD_ITEM(STR_BIND);
|
||||
POPUP_MENU_ADD_ITEM(STR_OPTIONS);
|
||||
POPUP_MENU_ADD_ITEM(STR_SHARE);
|
||||
POPUP_MENU_ADD_ITEM(STR_DELETE);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET);
|
||||
POPUP_MENU_START(onPXX2ReceiverMenu);
|
||||
POPUP_MENU_START(onPXX2ReceiverMenu, 5, STR_BIND, STR_OPTIONS, STR_SHARE, STR_DELETE, STR_RESET);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -247,3 +247,117 @@ void drawProgressScreen(const char * title, const char * message, int num, int d
|
||||
}
|
||||
lcdRefresh();
|
||||
}
|
||||
|
||||
void CLEAR_POPUP()
|
||||
{
|
||||
warningText = nullptr;
|
||||
warningInfoText = nullptr;
|
||||
popupMenuTitle = nullptr;
|
||||
popupMenuHandler = nullptr;
|
||||
popupMenuItemsCount = 0;
|
||||
}
|
||||
|
||||
void POPUP_WAIT(const char * s)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_WAIT;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
void POPUP_INFORMATION(const char * s)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_INFO;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
void POPUP_WARNING(const char * message, const char * info, bool waitForClose)
|
||||
{
|
||||
(void)waitForClose;
|
||||
|
||||
warningText = message;
|
||||
warningInfoText = info;
|
||||
warningInfoLength = info ? strlen(info) : 0;
|
||||
warningInfoFlags = 0;
|
||||
warningType = WARNING_TYPE_ASTERISK;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags)
|
||||
{
|
||||
warningInfoText = info;
|
||||
warningInfoLength = length;
|
||||
warningInfoFlags = flags;
|
||||
}
|
||||
|
||||
void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler)
|
||||
{
|
||||
if (s != warningText) {
|
||||
killAllEvents();
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_CONFIRM;
|
||||
popupFunc = runPopupWarning;
|
||||
popupMenuHandler = handler;
|
||||
}
|
||||
}
|
||||
|
||||
void POPUP_INPUT(const char * s, PopupFunc func)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_INPUT;
|
||||
popupFunc = func;
|
||||
}
|
||||
|
||||
bool isEventCaughtByPopup()
|
||||
{
|
||||
if (warningText && warningType != WARNING_TYPE_WAIT)
|
||||
return true;
|
||||
|
||||
if (popupMenuItemsCount > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void POPUP_MENU_ADD_ITEM(const char * s)
|
||||
{
|
||||
popupMenuOffsetType = MENU_OFFSET_INTERNAL;
|
||||
if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) {
|
||||
popupMenuItems[popupMenuItemsCount++] = s;
|
||||
}
|
||||
}
|
||||
|
||||
void POPUP_MENU_SELECT_ITEM(uint8_t index)
|
||||
{
|
||||
popupMenuSelectedItem = (index > 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0);
|
||||
}
|
||||
|
||||
void POPUP_MENU_TITLE(const char * s)
|
||||
{
|
||||
popupMenuTitle = s;
|
||||
}
|
||||
|
||||
void POPUP_MENU_START(PopupMenuHandler handler)
|
||||
{
|
||||
if (handler != popupMenuHandler) {
|
||||
killAllEvents();
|
||||
AUDIO_KEY_PRESS();
|
||||
popupMenuHandler = handler;
|
||||
}
|
||||
}
|
||||
|
||||
void POPUP_MENU_START(PopupMenuHandler handler, int count, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, count);
|
||||
for(int i = 0; i < count; i += 1) {
|
||||
const char* s = va_arg(ap, const char*);
|
||||
POPUP_MENU_ADD_ITEM(s);
|
||||
}
|
||||
va_end(ap);
|
||||
POPUP_MENU_START(handler);
|
||||
}
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _STDLCD_POPUPS_H_
|
||||
#define _STDLCD_POPUPS_H_
|
||||
#pragma once
|
||||
|
||||
#include <inttypes.h>
|
||||
#include "audio.h"
|
||||
@@ -80,89 +79,17 @@ enum
|
||||
inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags) { }
|
||||
#else
|
||||
#define DISPLAY_WARNING(evt) (*popupFunc)(evt)
|
||||
inline void CLEAR_POPUP()
|
||||
{
|
||||
warningText = nullptr;
|
||||
warningInfoText = nullptr;
|
||||
popupMenuTitle = nullptr;
|
||||
popupMenuHandler = nullptr;
|
||||
popupMenuItemsCount = 0;
|
||||
}
|
||||
|
||||
inline void POPUP_WAIT(const char * s)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_WAIT;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
inline void POPUP_INFORMATION(const char * s)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_INFO;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
inline void POPUP_WARNING(const char * message, const char * info = nullptr, bool waitForClose = true)
|
||||
{
|
||||
(void)waitForClose;
|
||||
|
||||
warningText = message;
|
||||
warningInfoText = info;
|
||||
warningInfoLength = info ? strlen(info) : 0;
|
||||
warningInfoFlags = 0;
|
||||
warningType = WARNING_TYPE_ASTERISK;
|
||||
popupFunc = runPopupWarning;
|
||||
}
|
||||
|
||||
inline void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags)
|
||||
{
|
||||
warningInfoText = info;
|
||||
warningInfoLength = length;
|
||||
warningInfoFlags = flags;
|
||||
}
|
||||
|
||||
inline void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler)
|
||||
{
|
||||
if (s != warningText) {
|
||||
killAllEvents();
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_CONFIRM;
|
||||
popupFunc = runPopupWarning;
|
||||
popupMenuHandler = handler;
|
||||
}
|
||||
}
|
||||
|
||||
inline void POPUP_INPUT(const char * s, PopupFunc func)
|
||||
{
|
||||
warningText = s;
|
||||
warningInfoText = nullptr;
|
||||
warningType = WARNING_TYPE_INPUT;
|
||||
popupFunc = func;
|
||||
}
|
||||
|
||||
inline bool isEventCaughtByPopup()
|
||||
{
|
||||
if (warningText && warningType != WARNING_TYPE_WAIT)
|
||||
return true;
|
||||
|
||||
if (popupMenuItemsCount > 0)
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
extern void CLEAR_POPUP();
|
||||
extern void POPUP_WAIT(const char * s);
|
||||
extern void POPUP_INFORMATION(const char * s);
|
||||
extern void POPUP_WARNING(const char * message, const char * info = nullptr, bool waitForClose = true);
|
||||
extern void SET_WARNING_INFO(const char * info, uint8_t length, uint8_t flags);
|
||||
extern void POPUP_CONFIRMATION(const char * s, PopupMenuHandler handler);
|
||||
extern void POPUP_INPUT(const char * s, PopupFunc func);
|
||||
extern bool isEventCaughtByPopup();
|
||||
#endif
|
||||
|
||||
inline void POPUP_MENU_ADD_ITEM(const char * s)
|
||||
{
|
||||
popupMenuOffsetType = MENU_OFFSET_INTERNAL;
|
||||
if (popupMenuItemsCount < POPUP_MENU_MAX_LINES) {
|
||||
popupMenuItems[popupMenuItemsCount++] = s;
|
||||
}
|
||||
}
|
||||
extern void POPUP_MENU_ADD_ITEM(const char * s);
|
||||
|
||||
#if defined(SDCARD)
|
||||
#define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s)
|
||||
@@ -170,26 +97,12 @@ inline void POPUP_MENU_ADD_ITEM(const char * s)
|
||||
#define POPUP_MENU_ADD_SD_ITEM(s)
|
||||
#endif
|
||||
|
||||
inline void POPUP_MENU_SELECT_ITEM(uint8_t index)
|
||||
{
|
||||
popupMenuSelectedItem = (index > 0 ? (index < popupMenuItemsCount ? index : popupMenuItemsCount) : 0);
|
||||
}
|
||||
extern void POPUP_MENU_SELECT_ITEM(uint8_t index);
|
||||
|
||||
inline void POPUP_MENU_TITLE(const char * s)
|
||||
{
|
||||
popupMenuTitle = s;
|
||||
}
|
||||
extern void POPUP_MENU_TITLE(const char * s);
|
||||
|
||||
inline void POPUP_MENU_START(PopupMenuHandler handler)
|
||||
{
|
||||
if (handler != popupMenuHandler) {
|
||||
killAllEvents();
|
||||
AUDIO_KEY_PRESS();
|
||||
popupMenuHandler = handler;
|
||||
}
|
||||
}
|
||||
extern void POPUP_MENU_START(PopupMenuHandler handler);
|
||||
extern void POPUP_MENU_START(PopupMenuHandler handler, int count, ...);
|
||||
|
||||
// For compatability with color LCD code base, not (currently) required for B&W
|
||||
#define POPUP_WARNING_ON_UI_TASK POPUP_WARNING
|
||||
|
||||
#endif // _STDLCD_POPUPS_H_
|
||||
|
||||
@@ -73,9 +73,7 @@ void menuViewTelemetry(event_t event)
|
||||
}
|
||||
else if (event == EVT_KEY_LONG(KEY_ENTER)) {
|
||||
killEvents(event);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_TELEMETRY);
|
||||
POPUP_MENU_ADD_ITEM(STR_RESET_FLIGHT);
|
||||
POPUP_MENU_START(onMainViewMenu);
|
||||
POPUP_MENU_START(onMainViewMenu, 2, STR_RESET_TELEMETRY, STR_RESET_FLIGHT);
|
||||
}
|
||||
|
||||
for (int i=0; i<=TELEMETRY_SCREEN_TYPE_MAX; i++) {
|
||||
|
||||
@@ -699,9 +699,7 @@ void checkExternalAntenna()
|
||||
#if defined(COLORLCD)
|
||||
runAntennaSelectionMenu();
|
||||
#else
|
||||
POPUP_MENU_ADD_ITEM(STR_USE_INTERNAL_ANTENNA);
|
||||
POPUP_MENU_ADD_ITEM(STR_USE_EXTERNAL_ANTENNA);
|
||||
POPUP_MENU_START(onAntennaSelection);
|
||||
POPUP_MENU_START(onAntennaSelection, 2, STR_USE_INTERNAL_ANTENNA, STR_USE_EXTERNAL_ANTENNA);
|
||||
#endif
|
||||
} else {
|
||||
globalData.externalAntennaEnabled = false;
|
||||
@@ -1240,3 +1238,174 @@ void setPotType(int index, int value)
|
||||
{
|
||||
g_eeGeneral.potsConfig = bfSet<potconfig_t>(g_eeGeneral.potsConfig, value, (POT_CFG_BITS * index), POT_CFG_TYPE_BITS);
|
||||
}
|
||||
|
||||
#if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
|
||||
uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax)
|
||||
{
|
||||
if (horTab) {
|
||||
uint8_t result = 0;
|
||||
while (result < horTabMax && horTab[result] >= HIDDEN_ROW)
|
||||
++result;
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t MODULE_BIND_ROWS(int moduleIdx)
|
||||
{
|
||||
if (isModuleCrossfire(moduleIdx))
|
||||
return 0;
|
||||
|
||||
if (isModuleMultimodule(moduleIdx)) {
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || isModuleAFHDS3(moduleIdx) || isModuleDSMP(moduleIdx)) {
|
||||
return 1;
|
||||
}
|
||||
else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) {
|
||||
return 2;
|
||||
}
|
||||
else {
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
|
||||
{
|
||||
if (!IS_MODULE_ENABLED(moduleIdx)) {
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
else if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) ||
|
||||
isModuleGhost(moduleIdx) || isModuleSBUS(moduleIdx) ||
|
||||
isModuleDSMP(moduleIdx)) {
|
||||
// fixed number of channels
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
|
||||
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
if (protocol < MODULE_SUBTYPE_MULTI_LAST) {
|
||||
const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol);
|
||||
if (pdef->disable_ch_mapping)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
|
||||
uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW;
|
||||
}
|
||||
|
||||
return MULTI_DISABLE_CHAN_MAP_ROW_STATIC(moduleIdx);
|
||||
}
|
||||
|
||||
bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol < MODULE_SUBTYPE_MULTI_LAST) {
|
||||
return true;
|
||||
}
|
||||
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
return status.protocolValid();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx)
|
||||
{
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
int proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
|
||||
if (status.isValid()) {
|
||||
TRACE("(%d) status.protocolSubNbr = %d", proto, status.protocolSubNbr);
|
||||
return status.protocolSubNbr > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (proto > MODULE_SUBTYPE_MULTI_LAST) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
auto subProto = getMultiProtocolDefinition(proto);
|
||||
return subProto->subTypeString != nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx)
|
||||
{
|
||||
#if LCD_W < 212
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : HIDDEN_ROW);
|
||||
else
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW);
|
||||
#else
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return false;
|
||||
|
||||
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
|
||||
if (status.isValid())
|
||||
return status.optionDisp;
|
||||
|
||||
if (protocol < MODULE_SUBTYPE_MULTI_LAST)
|
||||
return getMultiProtocolDefinition(protocol)->optionsstr != nullptr;
|
||||
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx)
|
||||
{
|
||||
if(isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx))
|
||||
return TITLE_ROW;
|
||||
if(isModuleAFHDS3(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
if(isModuleGhost(moduleIdx))
|
||||
return 0;
|
||||
return MULTIMODULE_OPTIONS_ROW(moduleIdx);
|
||||
}
|
||||
|
||||
+10
-161
@@ -39,18 +39,7 @@
|
||||
#endif
|
||||
|
||||
#if defined(NAVIGATION_X7) || defined(NAVIGATION_X9D)
|
||||
inline uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax)
|
||||
{
|
||||
if (horTab) {
|
||||
uint8_t result = 0;
|
||||
while (result < horTabMax && horTab[result] >= HIDDEN_ROW)
|
||||
++result;
|
||||
return result;
|
||||
}
|
||||
else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
extern uint8_t MENU_FIRST_LINE_EDIT(const uint8_t * horTab, uint8_t horTabMax);
|
||||
#endif
|
||||
|
||||
#if defined(LIBOPENUI)
|
||||
@@ -147,52 +136,8 @@ void drawSourceValue(coord_t x, coord_t y, source_t channel, LcdFlags flags=0);
|
||||
#define IF_INTERNAL_MODULE_ON(x) (IS_INTERNAL_MODULE_ENABLED() ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
#define IF_MODULE_ON(moduleIndex, x) (IS_MODULE_ENABLED(moduleIndex) ? (uint8_t)(x) : HIDDEN_ROW)
|
||||
|
||||
inline uint8_t MODULE_BIND_ROWS(int moduleIdx)
|
||||
{
|
||||
if (isModuleCrossfire(moduleIdx))
|
||||
return 0;
|
||||
|
||||
if (isModuleMultimodule(moduleIdx)) {
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return 1;
|
||||
else
|
||||
return 2;
|
||||
}
|
||||
else if (isModuleXJTD8(moduleIdx) || isModuleSBUS(moduleIdx) || isModuleAFHDS3(moduleIdx) || isModuleDSMP(moduleIdx)) {
|
||||
return 1;
|
||||
}
|
||||
else if (isModulePPM(moduleIdx) || isModulePXX1(moduleIdx) || isModulePXX2(moduleIdx) || isModuleDSM2(moduleIdx)) {
|
||||
return 2;
|
||||
}
|
||||
else {
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
}
|
||||
|
||||
inline uint8_t MODULE_CHANNELS_ROWS(int moduleIdx)
|
||||
{
|
||||
if (!IS_MODULE_ENABLED(moduleIdx)) {
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
#if defined(MULTIMODULE)
|
||||
else if (isModuleMultimodule(moduleIdx)) {
|
||||
if (IS_RX_MULTI(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
else if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
else if (isModuleDSM2(moduleIdx) || isModuleCrossfire(moduleIdx) ||
|
||||
isModuleGhost(moduleIdx) || isModuleSBUS(moduleIdx) ||
|
||||
isModuleDSMP(moduleIdx)) {
|
||||
// fixed number of channels
|
||||
return 0;
|
||||
} else {
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
extern uint8_t MODULE_BIND_ROWS(int moduleIdx);
|
||||
extern uint8_t MODULE_CHANNELS_ROWS(int moduleIdx);
|
||||
|
||||
#if defined(EXTERNAL_ANTENNA) && defined(INTERNAL_MODULE_PXX1)
|
||||
void onAntennaSwitchConfirm(const char * result);
|
||||
@@ -229,101 +174,13 @@ inline uint8_t IF_ALLOW_RACING_MODE(int)
|
||||
#endif
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
extern uint8_t MULTI_DISABLE_CHAN_MAP_ROW_STATIC(uint8_t moduleIdx);
|
||||
extern uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx);
|
||||
extern bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx);
|
||||
extern bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx);
|
||||
extern uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx);
|
||||
extern uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx);
|
||||
|
||||
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
if (protocol < MODULE_SUBTYPE_MULTI_LAST) {
|
||||
const mm_protocol_definition * pdef = getMultiProtocolDefinition(protocol);
|
||||
if (pdef->disable_ch_mapping)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return HIDDEN_ROW;
|
||||
}
|
||||
|
||||
inline uint8_t MULTI_DISABLE_CHAN_MAP_ROW(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
return status.supportsDisableMapping() == true ? 0 : HIDDEN_ROW;
|
||||
}
|
||||
|
||||
return MULTI_DISABLE_CHAN_MAP_ROW_STATIC(moduleIdx);
|
||||
}
|
||||
|
||||
inline bool MULTIMODULE_PROTOCOL_KNOWN(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol < MODULE_SUBTYPE_MULTI_LAST) {
|
||||
return true;
|
||||
}
|
||||
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
if (status.isValid()) {
|
||||
return status.protocolValid();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool MULTIMODULE_HAS_SUBTYPE(uint8_t moduleIdx)
|
||||
{
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
int proto = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
|
||||
if (status.isValid()) {
|
||||
TRACE("(%d) status.protocolSubNbr = %d", proto, status.protocolSubNbr);
|
||||
return status.protocolSubNbr > 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (proto > MODULE_SUBTYPE_MULTI_LAST) {
|
||||
return true;
|
||||
}
|
||||
else {
|
||||
auto subProto = getMultiProtocolDefinition(proto);
|
||||
return subProto->subTypeString != nullptr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
inline uint8_t MULTIMODULE_RFPROTO_COLUMNS(uint8_t moduleIdx)
|
||||
{
|
||||
#if LCD_W < 212
|
||||
if (g_model.moduleData[moduleIdx].multi.rfProtocol == MODULE_SUBTYPE_MULTI_DSM2)
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : HIDDEN_ROW);
|
||||
else
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 0 : HIDDEN_ROW);
|
||||
#else
|
||||
return (MULTIMODULE_HAS_SUBTYPE(moduleIdx) ? (uint8_t) 1 : 0);
|
||||
#endif
|
||||
}
|
||||
|
||||
inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
|
||||
{
|
||||
if (!isModuleMultimodule(moduleIdx))
|
||||
return false;
|
||||
|
||||
uint8_t protocol = g_model.moduleData[moduleIdx].multi.rfProtocol;
|
||||
MultiModuleStatus &status = getMultiModuleStatus(moduleIdx);
|
||||
|
||||
if (status.isValid())
|
||||
return status.optionDisp;
|
||||
|
||||
if (protocol < MODULE_SUBTYPE_MULTI_LAST)
|
||||
return getMultiProtocolDefinition(protocol)->optionsstr != nullptr;
|
||||
|
||||
return false;
|
||||
}
|
||||
#if defined(MANUFACTURER_FRSKY)
|
||||
#define MULTIMODULE_MODULE_ROWS(moduleIdx) (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, (MULTIMODULE_PROTOCOL_KNOWN(moduleIdx) && !IS_RX_MULTI(moduleIdx)) ? (uint8_t) 0 : HIDDEN_ROW, MULTI_DISABLE_CHAN_MAP_ROW(moduleIdx), // AUTOBIND, DISABLE TELEM, DISABLE CN.MAP
|
||||
#else
|
||||
@@ -363,15 +220,7 @@ inline uint8_t MULTIMODULE_HASOPTIONS(uint8_t moduleIdx)
|
||||
|
||||
#define FAILSAFE_ROW(moduleIdx) isModuleFailsafeAvailable(moduleIdx) ? (g_model.moduleData[moduleIdx].failsafeMode==FAILSAFE_CUSTOM ? (uint8_t)1 : (uint8_t)0) : HIDDEN_ROW
|
||||
|
||||
inline uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx) {
|
||||
if(isModuleR9MNonAccess(moduleIdx) || isModuleSBUS(moduleIdx))
|
||||
return TITLE_ROW;
|
||||
if(isModuleAFHDS3(moduleIdx))
|
||||
return HIDDEN_ROW;
|
||||
if(isModuleGhost(moduleIdx))
|
||||
return 0;
|
||||
return MULTIMODULE_OPTIONS_ROW(moduleIdx);
|
||||
}
|
||||
extern uint8_t MODULE_OPTION_ROW(uint8_t moduleIdx);
|
||||
|
||||
void editStickHardwareSettings(coord_t x, coord_t y, int idx, event_t event,
|
||||
LcdFlags flags, uint8_t old_editMode);
|
||||
|
||||
+6
-9
@@ -118,13 +118,12 @@ void onUSBConnectMenu(const char *result)
|
||||
void openUsbMenu()
|
||||
{
|
||||
if (popupMenuHandler != onUSBConnectMenu) {
|
||||
POPUP_MENU_ADD_ITEM(STR_USB_JOYSTICK);
|
||||
POPUP_MENU_ADD_ITEM(STR_USB_MASS_STORAGE);
|
||||
#if defined(USB_SERIAL)
|
||||
POPUP_MENU_ADD_ITEM(STR_USB_SERIAL);
|
||||
#endif
|
||||
POPUP_MENU_TITLE(STR_SELECT_MODE);
|
||||
POPUP_MENU_START(onUSBConnectMenu);
|
||||
#if defined(USB_SERIAL)
|
||||
POPUP_MENU_START(onUSBConnectMenu, 3, STR_USB_JOYSTICK, STR_USB_MASS_STORAGE, STR_USB_SERIAL);
|
||||
#else
|
||||
POPUP_MENU_START(onUSBConnectMenu, 2, STR_USB_JOYSTICK, STR_USB_MASS_STORAGE);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -251,9 +250,7 @@ void handleJackConnection()
|
||||
enableTrainer();
|
||||
}
|
||||
else if (popupMenuItemsCount == 0) {
|
||||
POPUP_MENU_ADD_ITEM(STR_JACK_HEADPHONE);
|
||||
POPUP_MENU_ADD_ITEM(STR_JACK_TRAINER);
|
||||
POPUP_MENU_START(onJackConnectMenu);
|
||||
POPUP_MENU_START(onJackConnectMenu, 2, STR_JACK_HEADPHONE, STR_JACK_TRAINER);
|
||||
}
|
||||
}
|
||||
else if (jackState == SPEAKER_ACTIVE && !isJackPlugged() && popupMenuItemsCount > 0 && popupMenuHandler == onJackConnectMenu) {
|
||||
|
||||
@@ -1885,3 +1885,53 @@ bool modelCustomScriptsEnabled() {
|
||||
bool modelTelemetryEnabled() {
|
||||
return FEATURE_ENABLED(modelTelemetryDisabled);
|
||||
}
|
||||
|
||||
void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags)
|
||||
{
|
||||
if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) {
|
||||
valMax = g_model.extendedTrims ? TRIM_EXTENDED_MAX : TRIM_MAX;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#if defined(LUA_INPUTS)
|
||||
else if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) {
|
||||
valMax = 30000;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#endif
|
||||
else if (source < MIXSRC_FIRST_CH) {
|
||||
valMax = 100;
|
||||
valMin = -valMax;
|
||||
}
|
||||
else if (source <= MIXSRC_LAST_CH) {
|
||||
valMax = g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#if defined(GVARS)
|
||||
else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) {
|
||||
valMax = min<int>(CFN_GVAR_CST_MAX, MODEL_GVAR_MAX(source-MIXSRC_FIRST_GVAR));
|
||||
valMin = max<int>(CFN_GVAR_CST_MIN, MODEL_GVAR_MIN(source-MIXSRC_FIRST_GVAR));
|
||||
if (flags && g_model.gvars[source-MIXSRC_FIRST_GVAR].prec)
|
||||
*flags |= PREC1;
|
||||
}
|
||||
#endif
|
||||
else if (source == MIXSRC_TX_VOLTAGE) {
|
||||
valMax = 255;
|
||||
valMin = 0;
|
||||
if (flags)
|
||||
*flags |= PREC1;
|
||||
}
|
||||
else if (source == MIXSRC_TX_TIME) {
|
||||
valMax = 23 * 60 + 59;
|
||||
valMin = 0;
|
||||
}
|
||||
else if (source >= MIXSRC_FIRST_TIMER && source <= MIXSRC_LAST_TIMER) {
|
||||
valMax = 9 * 60 * 60 - 1;
|
||||
valMin = -valMax;
|
||||
if (flags)
|
||||
*flags |= TIMEHOUR;
|
||||
}
|
||||
else {
|
||||
valMax = 30000;
|
||||
valMin = -valMax;
|
||||
}
|
||||
}
|
||||
|
||||
+1
-49
@@ -389,55 +389,7 @@ inline int calcRESXto100(int x)
|
||||
|
||||
int expo(int x, int k);
|
||||
|
||||
inline void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0)
|
||||
{
|
||||
if (source >= MIXSRC_FIRST_TRIM && source <= MIXSRC_LAST_TRIM) {
|
||||
valMax = g_model.extendedTrims ? TRIM_EXTENDED_MAX : TRIM_MAX;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#if defined(LUA_INPUTS)
|
||||
else if (source >= MIXSRC_FIRST_LUA && source <= MIXSRC_LAST_LUA) {
|
||||
valMax = 30000;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#endif
|
||||
else if (source < MIXSRC_FIRST_CH) {
|
||||
valMax = 100;
|
||||
valMin = -valMax;
|
||||
}
|
||||
else if (source <= MIXSRC_LAST_CH) {
|
||||
valMax = g_model.extendedLimits ? LIMIT_EXT_PERCENT : 100;
|
||||
valMin = -valMax;
|
||||
}
|
||||
#if defined(GVARS)
|
||||
else if (source >= MIXSRC_FIRST_GVAR && source <= MIXSRC_LAST_GVAR) {
|
||||
valMax = min<int>(CFN_GVAR_CST_MAX, MODEL_GVAR_MAX(source-MIXSRC_FIRST_GVAR));
|
||||
valMin = max<int>(CFN_GVAR_CST_MIN, MODEL_GVAR_MIN(source-MIXSRC_FIRST_GVAR));
|
||||
if (flags && g_model.gvars[source-MIXSRC_FIRST_GVAR].prec)
|
||||
*flags |= PREC1;
|
||||
}
|
||||
#endif
|
||||
else if (source == MIXSRC_TX_VOLTAGE) {
|
||||
valMax = 255;
|
||||
valMin = 0;
|
||||
if (flags)
|
||||
*flags |= PREC1;
|
||||
}
|
||||
else if (source == MIXSRC_TX_TIME) {
|
||||
valMax = 23 * 60 + 59;
|
||||
valMin = 0;
|
||||
}
|
||||
else if (source >= MIXSRC_FIRST_TIMER && source <= MIXSRC_LAST_TIMER) {
|
||||
valMax = 9 * 60 * 60 - 1;
|
||||
valMin = -valMax;
|
||||
if (flags)
|
||||
*flags |= TIMEHOUR;
|
||||
}
|
||||
else {
|
||||
valMax = 30000;
|
||||
valMin = -valMax;
|
||||
}
|
||||
}
|
||||
extern void getMixSrcRange(const int source, int16_t & valMin, int16_t & valMax, LcdFlags * flags = 0);
|
||||
|
||||
void applyExpos(int16_t * anas, uint8_t mode, uint8_t ovwrIdx=0, int16_t ovwrValue=0);
|
||||
int16_t applyLimits(uint8_t channel, int32_t value);
|
||||
|
||||
@@ -42,3 +42,94 @@ bool isExternalAntennaEnabled()
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int8_t maxModuleChannels_M8(uint8_t moduleIdx)
|
||||
{
|
||||
if (isExtraModule(moduleIdx)) {
|
||||
return MAX_EXTRA_MODULE_CHANNELS_M8;
|
||||
} else if (isModuleXJT(moduleIdx)) {
|
||||
return maxChannelsXJT_M8[1 + g_model.moduleData[moduleIdx].subType];
|
||||
} else if (isModuleISRMD16(moduleIdx)) {
|
||||
return maxChannelsXJT_M8[MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16];
|
||||
} else if (isModuleR9M(moduleIdx)) {
|
||||
if (isModuleR9M_LBT(moduleIdx)) {
|
||||
if (isModuleR9MLite(moduleIdx))
|
||||
return g_model.moduleData[moduleIdx].pxx.power ==
|
||||
R9M_LITE_LBT_POWER_25_8CH
|
||||
? 0
|
||||
: 8;
|
||||
else
|
||||
return g_model.moduleData[moduleIdx].pxx.power == R9M_LBT_POWER_25_8CH
|
||||
? 0
|
||||
: 8;
|
||||
} else {
|
||||
return 8; // always 16 channels in FCC / FLEX
|
||||
}
|
||||
} else if (isModuleMultimoduleDSM2(moduleIdx)) {
|
||||
return 4; // 12 channels
|
||||
} else if (isModuleDSMP(moduleIdx) &&
|
||||
(g_model.moduleData[moduleIdx].dsmp.flags != 0)) {
|
||||
return g_model.moduleData[moduleIdx].channelsCount;
|
||||
} else {
|
||||
return maxChannelsModules_M8[g_model.moduleData[moduleIdx].type];
|
||||
}
|
||||
}
|
||||
|
||||
int8_t sentModuleChannels(uint8_t idx)
|
||||
{
|
||||
if (isModuleCrossfire(idx))
|
||||
return CROSSFIRE_CHANNELS_COUNT;
|
||||
else if (isModuleGhost(idx))
|
||||
return GHOST_CHANNELS_COUNT;
|
||||
else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx))
|
||||
return 16;
|
||||
else if (isModuleSBUS(idx))
|
||||
return 16;
|
||||
else
|
||||
return sentModulePXXChannels(idx);
|
||||
}
|
||||
|
||||
uint8_t getMaxRxNum(uint8_t idx)
|
||||
{
|
||||
if (isModuleDSM2(idx))
|
||||
return 20;
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
if (isModuleMultimodule(idx)) {
|
||||
switch (g_model.moduleData[idx].multi.rfProtocol) {
|
||||
case MODULE_SUBTYPE_MULTI_OLRS:
|
||||
return MODULE_SUBTYPE_MULTI_OLRS_RXNUM;
|
||||
case MODULE_SUBTYPE_MULTI_BUGS:
|
||||
return MODULE_SUBTYPE_MULTI_BUGS_RXNUM;
|
||||
case MODULE_SUBTYPE_MULTI_BUGS_MINI:
|
||||
return MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
if (isModuleAFHDS3(idx)) return AFHDS3_MAX_MODEL_ID;
|
||||
#endif
|
||||
|
||||
return MAX_RXNUM;
|
||||
}
|
||||
|
||||
void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
{
|
||||
ModuleData & moduleData = g_model.moduleData[moduleIdx];
|
||||
memclear(&moduleData, sizeof(ModuleData));
|
||||
moduleData.type = moduleType;
|
||||
moduleData.channelsCount = defaultModuleChannels_M8(moduleIdx);
|
||||
if (moduleData.type == MODULE_TYPE_SBUS)
|
||||
moduleData.sbus.refreshRate = -31;
|
||||
else if (moduleData.type == MODULE_TYPE_PPM)
|
||||
setDefaultPpmFrameLength(moduleIdx);
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) {
|
||||
resetAfhds2AOptions(moduleIdx);
|
||||
}
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) {
|
||||
resetAfhds3Options(moduleIdx);
|
||||
}
|
||||
else
|
||||
resetAccessAuthenticationCount();
|
||||
}
|
||||
|
||||
@@ -19,8 +19,7 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef _MODULES_HELPERS_H_
|
||||
#define _MODULES_HELPERS_H_
|
||||
#pragma once
|
||||
|
||||
#include "libopenui/src/bitfield.h"
|
||||
#include "definitions.h"
|
||||
@@ -85,14 +84,14 @@ extern uint32_t NV14internalModuleFwVersion;
|
||||
|
||||
const uint8_t getMaxMultiOptions();
|
||||
|
||||
struct mm_protocol_definition {
|
||||
PACK_NOT_SIMU(struct mm_protocol_definition {
|
||||
uint8_t protocol;
|
||||
uint8_t maxSubtype;
|
||||
bool failsafe;
|
||||
bool disable_ch_mapping;
|
||||
uint8_t maxSubtype:6;
|
||||
bool failsafe:1;
|
||||
bool disable_ch_mapping:1;
|
||||
const char* const* subTypeString;
|
||||
const char* optionsstr;
|
||||
};
|
||||
});
|
||||
|
||||
const mm_protocol_definition *getMultiProtocolDefinition (uint8_t protocol);
|
||||
|
||||
@@ -461,37 +460,7 @@ static_assert(MODULE_SUBTYPE_PXX1_LAST + 2 == sizeof(maxChannelsXJT_M8),
|
||||
constexpr int8_t MAX_TRAINER_CHANNELS_M8 = MAX_TRAINER_CHANNELS - 8;
|
||||
constexpr int8_t MAX_EXTRA_MODULE_CHANNELS_M8 = 8; // only 16ch PPM
|
||||
|
||||
inline int8_t maxModuleChannels_M8(uint8_t moduleIdx)
|
||||
{
|
||||
if (isExtraModule(moduleIdx)) {
|
||||
return MAX_EXTRA_MODULE_CHANNELS_M8;
|
||||
} else if (isModuleXJT(moduleIdx)) {
|
||||
return maxChannelsXJT_M8[1 + g_model.moduleData[moduleIdx].subType];
|
||||
} else if (isModuleISRMD16(moduleIdx)) {
|
||||
return maxChannelsXJT_M8[MODULE_SUBTYPE_ISRM_PXX2_ACCST_D16];
|
||||
} else if (isModuleR9M(moduleIdx)) {
|
||||
if (isModuleR9M_LBT(moduleIdx)) {
|
||||
if (isModuleR9MLite(moduleIdx))
|
||||
return g_model.moduleData[moduleIdx].pxx.power ==
|
||||
R9M_LITE_LBT_POWER_25_8CH
|
||||
? 0
|
||||
: 8;
|
||||
else
|
||||
return g_model.moduleData[moduleIdx].pxx.power == R9M_LBT_POWER_25_8CH
|
||||
? 0
|
||||
: 8;
|
||||
} else {
|
||||
return 8; // always 16 channels in FCC / FLEX
|
||||
}
|
||||
} else if (isModuleMultimoduleDSM2(moduleIdx)) {
|
||||
return 4; // 12 channels
|
||||
} else if (isModuleDSMP(moduleIdx) &&
|
||||
(g_model.moduleData[moduleIdx].dsmp.flags != 0)) {
|
||||
return g_model.moduleData[moduleIdx].channelsCount;
|
||||
} else {
|
||||
return maxChannelsModules_M8[g_model.moduleData[moduleIdx].type];
|
||||
}
|
||||
}
|
||||
extern int8_t maxModuleChannels_M8(uint8_t moduleIdx);
|
||||
|
||||
inline int8_t maxModuleChannels(uint8_t moduleIdx)
|
||||
{
|
||||
@@ -525,19 +494,7 @@ inline uint8_t sentModulePXXChannels(uint8_t idx)
|
||||
return 8 + g_model.moduleData[idx].channelsCount;
|
||||
}
|
||||
|
||||
inline int8_t sentModuleChannels(uint8_t idx)
|
||||
{
|
||||
if (isModuleCrossfire(idx))
|
||||
return CROSSFIRE_CHANNELS_COUNT;
|
||||
else if (isModuleGhost(idx))
|
||||
return GHOST_CHANNELS_COUNT;
|
||||
else if (isModuleMultimodule(idx) && !isModuleMultimoduleDSM2(idx))
|
||||
return 16;
|
||||
else if (isModuleSBUS(idx))
|
||||
return 16;
|
||||
else
|
||||
return sentModulePXXChannels(idx);
|
||||
}
|
||||
extern int8_t sentModuleChannels(uint8_t idx);
|
||||
|
||||
inline bool isDefaultModelRegistrationID()
|
||||
{
|
||||
@@ -676,30 +633,7 @@ inline bool isModuleRangeAvailable(uint8_t moduleIdx)
|
||||
|
||||
constexpr uint8_t MAX_RXNUM = 63;
|
||||
|
||||
inline uint8_t getMaxRxNum(uint8_t idx)
|
||||
{
|
||||
if (isModuleDSM2(idx))
|
||||
return 20;
|
||||
|
||||
#if defined(MULTIMODULE)
|
||||
if (isModuleMultimodule(idx)) {
|
||||
switch (g_model.moduleData[idx].multi.rfProtocol) {
|
||||
case MODULE_SUBTYPE_MULTI_OLRS:
|
||||
return MODULE_SUBTYPE_MULTI_OLRS_RXNUM;
|
||||
case MODULE_SUBTYPE_MULTI_BUGS:
|
||||
return MODULE_SUBTYPE_MULTI_BUGS_RXNUM;
|
||||
case MODULE_SUBTYPE_MULTI_BUGS_MINI:
|
||||
return MODULE_SUBTYPE_MULTI_BUGS_MINI_RXNUM;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AFHDS3)
|
||||
if (isModuleAFHDS3(idx)) return AFHDS3_MAX_MODEL_ID;
|
||||
#endif
|
||||
|
||||
return MAX_RXNUM;
|
||||
}
|
||||
extern uint8_t getMaxRxNum(uint8_t idx);
|
||||
|
||||
inline const char * getModuleDelay(uint8_t idx)
|
||||
{
|
||||
@@ -827,26 +761,6 @@ inline void resetAfhds2AOptions(uint8_t moduleIdx)
|
||||
#endif
|
||||
}
|
||||
|
||||
inline void setModuleType(uint8_t moduleIdx, uint8_t moduleType)
|
||||
{
|
||||
ModuleData & moduleData = g_model.moduleData[moduleIdx];
|
||||
memclear(&moduleData, sizeof(ModuleData));
|
||||
moduleData.type = moduleType;
|
||||
moduleData.channelsCount = defaultModuleChannels_M8(moduleIdx);
|
||||
if (moduleData.type == MODULE_TYPE_SBUS)
|
||||
moduleData.sbus.refreshRate = -31;
|
||||
else if (moduleData.type == MODULE_TYPE_PPM)
|
||||
setDefaultPpmFrameLength(moduleIdx);
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS2A) {
|
||||
resetAfhds2AOptions(moduleIdx);
|
||||
}
|
||||
else if (moduleData.type == MODULE_TYPE_FLYSKY_AFHDS3) {
|
||||
resetAfhds3Options(moduleIdx);
|
||||
}
|
||||
else
|
||||
resetAccessAuthenticationCount();
|
||||
}
|
||||
extern void setModuleType(uint8_t moduleIdx, uint8_t moduleType);
|
||||
|
||||
extern bool isExternalAntennaEnabled();
|
||||
|
||||
#endif // _MODULES_HELPERS_H_
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <cinttypes>
|
||||
|
||||
#include <stdio.h>
|
||||
#include "yaml_bits.h"
|
||||
#include "yaml_parser.h"
|
||||
@@ -192,53 +194,31 @@ uint32_t yaml_hex2uint(const char* val, uint8_t val_len)
|
||||
return i_val;
|
||||
}
|
||||
|
||||
static char int2str_buffer[MAX_STR] = {0};
|
||||
static const char _int2str_lookup[] = { '0', '1', '2', '3', '4', '5', '6' , '7', '8', '9' };
|
||||
constexpr int INT2STR_LEN = 16;
|
||||
|
||||
static char int2str_buffer[INT2STR_LEN] = {0};
|
||||
|
||||
char* yaml_unsigned2str(uint32_t i)
|
||||
{
|
||||
char* c = &(int2str_buffer[MAX_STR-2]);
|
||||
do {
|
||||
*(c--) = _int2str_lookup[i % 10];
|
||||
i = i / 10;
|
||||
} while((c > int2str_buffer) && i);
|
||||
|
||||
return (c + 1);
|
||||
snprintf(int2str_buffer, INT2STR_LEN, "%" PRIu32, i);
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
char* yaml_signed2str(int32_t i)
|
||||
{
|
||||
if (i < 0) {
|
||||
char* c = yaml_unsigned2str(-i);
|
||||
*(--c) = '-';
|
||||
return c;
|
||||
}
|
||||
|
||||
return yaml_unsigned2str((uint32_t)i);
|
||||
snprintf(int2str_buffer, INT2STR_LEN, "%" PRId32, i);
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
static const char _int2hex_lookup[] = {'0', '1', '2', '3',
|
||||
'4', '5', '6', '7',
|
||||
'8', '9', 'A', 'B',
|
||||
'C', 'D', 'E', 'F'};
|
||||
|
||||
char* yaml_unsigned2hex(uint32_t i)
|
||||
{
|
||||
char* c = int2str_buffer;
|
||||
for (int n = sizeof(uint32_t) * 2; n > 0; n--) {
|
||||
*(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF];
|
||||
}
|
||||
*c = '\0';
|
||||
snprintf(int2str_buffer, INT2STR_LEN, "%08" PRIX32, i);
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
char* yaml_rgb2hex(uint32_t i)
|
||||
{
|
||||
char* c = int2str_buffer;
|
||||
for (int n = 3 * 2; n > 0; n--) {
|
||||
*(c++) = _int2hex_lookup[(i >> ((n - 1) * 4)) & 0xF];
|
||||
}
|
||||
*c = '\0';
|
||||
snprintf(int2str_buffer, INT2STR_LEN, "%06" PRIX32, i);
|
||||
return int2str_buffer;
|
||||
}
|
||||
|
||||
@@ -250,4 +230,3 @@ int32_t yaml_to_signed(uint32_t i, uint32_t bits)
|
||||
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
@@ -42,11 +42,11 @@ enum YamlDataType {
|
||||
YDT_CUSTOM
|
||||
};
|
||||
|
||||
struct YamlIdStr
|
||||
PACK_NOT_SIMU(struct YamlIdStr
|
||||
{
|
||||
int id;
|
||||
int16_t id;
|
||||
const char* str;
|
||||
};
|
||||
});
|
||||
|
||||
// return false if error
|
||||
typedef bool (*yaml_writer_func)(void* opaque, const char* str, size_t len);
|
||||
|
||||
@@ -99,12 +99,12 @@ void frskyDProcessPacket(uint8_t module, const uint8_t *packet, uint8_t len)
|
||||
}
|
||||
}
|
||||
|
||||
struct FrSkyDSensor {
|
||||
PACK_NOT_SIMU(struct FrSkyDSensor {
|
||||
const uint8_t id;
|
||||
const TelemetryUnit unit;
|
||||
const uint8_t prec;
|
||||
const TelemetryUnit unit:6;
|
||||
const uint8_t prec:2;
|
||||
const char * name;
|
||||
};
|
||||
});
|
||||
|
||||
#define FS(id,name,unit,prec) {id,unit,prec,name}
|
||||
|
||||
|
||||
@@ -291,7 +291,7 @@ void sportProcessTelemetryPacketWithoutCrc(uint8_t module, uint8_t origin, const
|
||||
}
|
||||
else if (dataId == R9_PWR_ID) {
|
||||
// convert 'dBm' to 'mW'
|
||||
static const uint32_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10},
|
||||
static const uint16_t r9pwrs[][2] = {{0, 1}, {5, 3}, {10, 10},
|
||||
{13, 20}, {14, 25}, {20, 100},
|
||||
{23, 200}, {27, 500}, {30, 1000}};
|
||||
uint32_t dBm = SPORT_DATA_U8(packet);
|
||||
|
||||
@@ -15,7 +15,7 @@ static const etx_hal_adc_input_t _main_inputs[] = {
|
||||
{% set flex_offset = n_mains %}
|
||||
{% set flex_inputs = adc_inputs.inputs | selectattr('type', '==', 'FLEX') | list %}
|
||||
{% set n_flex = flex_inputs | count %}
|
||||
static etx_hal_adc_input_t _flex_inputs[] = {
|
||||
static const etx_hal_adc_input_t _flex_inputs[] = {
|
||||
{% for input in flex_inputs %}
|
||||
{ "{{ input.name }}", "{{ input.label }}", "{{ input.short_label }}" },
|
||||
{% endfor %}
|
||||
|
||||
Reference in New Issue
Block a user