refactor: FLASH size optimisations for B&W (#4827)

This commit is contained in:
philmoz
2024-04-01 09:43:50 +10:00
committed by GitHub
parent 46f484e6e5
commit 6c5eada23a
36 changed files with 608 additions and 655 deletions
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

+6
View File
@@ -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))
+22
View File
@@ -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);
+14
View File
@@ -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)
+3 -38
View File
@@ -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_
+1 -4
View File
@@ -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;
+1 -5
View File
@@ -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
+1 -6
View File
@@ -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) {
+1 -4
View File
@@ -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);
+1 -1
View File
@@ -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
+2 -2
View File
@@ -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"
+44 -69
View File
@@ -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)
+1 -4
View File
@@ -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;
+1 -3
View File
@@ -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);
}
}
+1 -5
View File
@@ -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++) {
+1 -4
View File
@@ -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);
+15 -24
View File
@@ -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):
+1 -7
View File
@@ -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);
}
}
}
+1 -7
View File
@@ -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);
}
}
+114
View File
@@ -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);
}
+14 -101
View File
@@ -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++) {
+172 -3
View File
@@ -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
View File
@@ -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
View File
@@ -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) {
+50
View File
@@ -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
View File
@@ -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);
+91
View File
@@ -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();
}
+10 -96
View File
@@ -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_
+11 -32
View File
@@ -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;
}
+3 -3
View File
@@ -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);
+4 -4
View File
@@ -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}
+1 -1
View File
@@ -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);
+1 -1
View File
@@ -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 %}