diff --git a/companion/src/eeprominterface.h b/companion/src/eeprominterface.h index 30f81b58c7..4baf3e596b 100644 --- a/companion/src/eeprominterface.h +++ b/companion/src/eeprominterface.h @@ -154,23 +154,6 @@ enum FailsafeModes { #define BC_BIT_REA (0x80) #define BC_BIT_REB (0x100) -// TODO remove this enum! -enum EnumKeys { - KEY_MENU, - KEY_EXIT, -#if defined(PCBTARANIS) - KEY_ENTER, - KEY_PAGE, - KEY_PLUS, - KEY_MINUS, -#else - KEY_DOWN, - KEY_UP, - KEY_RIGHT, - KEY_LEFT, -#endif -}; - #define CHAR_FOR_NAMES " ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-." #define CHAR_FOR_NAMES_REGEX "[ A-Za-z0-9_.-,]*" diff --git a/companion/src/firmwares/er9x/simulator/er9xsimulator.cpp b/companion/src/firmwares/er9x/simulator/er9xsimulator.cpp index 3a6e261aa4..c86ef080d8 100644 --- a/companion/src/firmwares/er9x/simulator/er9xsimulator.cpp +++ b/companion/src/firmwares/er9x/simulator/er9xsimulator.cpp @@ -24,8 +24,9 @@ #undef min #undef max -#define NUM_POTS 3 -#define SWSRC_SW1 DSW_SW1 +#define NUM_POTS 3 +#define NUM_SLIDERS 0 +#define SWSRC_SW1 DSW_SW1 #include diff --git a/companion/src/firmwares/ersky9x/simulator/ersky9xsimulator.cpp b/companion/src/firmwares/ersky9x/simulator/ersky9xsimulator.cpp index 17644655b6..757c18d4d1 100644 --- a/companion/src/firmwares/ersky9x/simulator/ersky9xsimulator.cpp +++ b/companion/src/firmwares/ersky9x/simulator/ersky9xsimulator.cpp @@ -31,8 +31,9 @@ #define AUDIO #define REVB -#define NUM_POTS 3 -#define SWSRC_SW1 DSW_SW1 +#define NUM_POTS 3 +#define NUM_SLIDERS 0 +#define SWSRC_SW1 DSW_SW1 #undef min #undef max diff --git a/companion/src/firmwares/opentx/opentxeeprom.cpp b/companion/src/firmwares/opentx/opentxeeprom.cpp index 9a399397f5..f1a824c189 100644 --- a/companion/src/firmwares/opentx/opentxeeprom.cpp +++ b/companion/src/firmwares/opentx/opentxeeprom.cpp @@ -26,7 +26,7 @@ #define MAX_CUSTOM_FUNCTIONS(board, version) (IS_ARM(board) ? (version >= 216 ? 64 : 32) : (IS_DBLEEPROM(board, version) ? 24 : 16)) #define MAX_CURVES(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 216) ? 32 : 16) : 8) #define MAX_GVARS(board, version) ((IS_ARM(board) && version >= 216) ? 9 : 5) -#define MAX_SENSORS(board, version) (32) +#define MAX_TELEMETRY_SENSORS(board, version) (32) #define NUM_PPM_INPUTS(board, version) ((IS_ARM(board) && version >= 216) ? 16 : 8) #define ROTENC_COUNT(board, version) (IS_ARM(board) ? ((IS_TARANIS(board) && version >= 218) ? 0 : 1) : (IS_2560(board) ? 2 : 0)) @@ -3271,7 +3271,7 @@ OpenTxModelData::OpenTxModelData(ModelData & modelData, BoardEnum board, unsigne } if (IS_ARM(board) && version >= 217) { - for (int i=0; i #include diff --git a/companion/src/simulation/simulatorimport.h b/companion/src/simulation/simulatorimport.h index 6ab5e1d0f7..1c0ee208ff 100644 --- a/companion/src/simulation/simulatorimport.h +++ b/companion/src/simulation/simulatorimport.h @@ -16,8 +16,8 @@ #include -#if !defined(NUM_LOGICAL_SWITCH) && defined(NUM_CSW) -#define NUM_LOGICAL_SWITCH NUM_CSW +#if !defined(MAX_LOGICAL_SWITCHES) && defined(NUM_CSW) +#define MAX_LOGICAL_SWITCHES NUM_CSW #endif #ifdef INIT_IMPORT @@ -31,7 +31,7 @@ telemetryStreaming = 20; #undef SETVALUES_IMPORT for (int i=0; i-[on|off].wav - for (int i=0; i g_model.points + sizeof(g_model.points)) { + AUDIO_WARNING2(); + return false; + } + + int8_t * nextCrv = curveAddress(index+1); + memmove(nextCrv+shift, nextCrv, 5*(MAX_CURVES-index-1)+curveEnd[MAX_CURVES-1]-curveEnd[index]); + if (shift < 0) memclear(&g_model.points[MAX_CURVE_POINTS-1] + shift, -shift); + while (index MAX_CURVE_POINTS-5*MAX_CURVES) { + AUDIO_WARNING2(); + return false; + } + + int8_t * crv = curveAddress(index); + if (shift < 0) { + for (uint8_t i=0; ipoints + 5; #define MMULT 1024 if (i == 0) { @@ -86,7 +147,7 @@ s32 compute_tangent(CurveInfo * crv, int8_t * points, int i) if (x1 > x0) m = (MMULT * (points[1] - points[0])) / (x1 - x0); } else { - s32 delta = (2 * 100) / (num_points - 1); + int32_t delta = (2 * 100) / (num_points - 1); m = (MMULT * (points[1] - points[0])) / delta; } } @@ -99,7 +160,7 @@ s32 compute_tangent(CurveInfo * crv, int8_t * points, int i) if (x1 > x0) m = (MMULT * (points[num_points-1] - points[num_points-2])) / (x1 - x0); } else { - s32 delta = (2 * 100) / (num_points - 1); + int32_t delta = (2 * 100) / (num_points - 1); m = (MMULT * (points[num_points-1] - points[num_points-2])) / delta; } } @@ -107,7 +168,7 @@ s32 compute_tangent(CurveInfo * crv, int8_t * points, int i) //apply monotone rules from //http://en.wikipedia.org/wiki/Monotone_cubic_interpolation //1) compute slopes of secant lines - s32 d0=0, d1=0; + int32_t d0=0, d1=0; if (crv->type == CURVE_TYPE_CUSTOM) { int8_t x0 = CUSTOM_POINT_X(points, num_points, i-1); int8_t x1 = CUSTOM_POINT_X(points, num_points, i); @@ -116,7 +177,7 @@ s32 compute_tangent(CurveInfo * crv, int8_t * points, int i) if (x2 > x1) d1 = (MMULT * (points[i+1] - points[i])) / (x2 - x1); } else { - s32 delta = (2 * 100) / (num_points - 1); + int32_t delta = (2 * 100) / (num_points - 1); d0 = (MMULT * (points[i] - points[i-1])) / (delta); d1 = (MMULT * (points[i+1] - points[i])) / (delta); } @@ -154,7 +215,7 @@ int16_t hermite_spline(int16_t x, uint8_t idx) x = RESX; for (int i=0; i0 ? calc100toRESX(points[count+i-1]) : -RESX); p3x = (i= p0x && x <= p3x) { - s32 p0y = calc100toRESX(points[i]); - s32 p3y = calc100toRESX(points[i+1]); - s32 m0 = compute_tangent(&crv, points, i); - s32 m3 = compute_tangent(&crv, points, i+1); - s32 y; - s32 h = p3x - p0x; - s32 t = (h > 0 ? (MMULT * (x - p0x)) / h : 0); - s32 t2 = t * t / MMULT; - s32 t3 = t2 * t / MMULT; - s32 h00 = 2*t3 - 3*t2 + MMULT; - s32 h10 = t3 - 2*t2 + t; - s32 h01 = -2*t3 + 3*t2; - s32 h11 = t3 - t2; + int32_t p0y = calc100toRESX(points[i]); + int32_t p3y = calc100toRESX(points[i+1]); + int32_t m0 = compute_tangent(&crv, points, i); + int32_t m3 = compute_tangent(&crv, points, i+1); + int32_t y; + int32_t h = p3x - p0x; + int32_t t = (h > 0 ? (MMULT * (x - p0x)) / h : 0); + int32_t t2 = t * t / MMULT; + int32_t t3 = t2 * t / MMULT; + int32_t h00 = 2*t3 - 3*t2 + MMULT; + int32_t h10 = t3 - 2*t2 + t; + int32_t h01 = -2*t3 + 3*t2; + int32_t h11 = t3 - t2; y = p0y * h00 + h * (m0 * h10 / MMULT) + p3y * h01 + h * (m3 * h11 / MMULT); y /= MMULT; return y; @@ -189,14 +250,14 @@ int16_t hermite_spline(int16_t x, uint8_t idx) int intpol(int x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 100 { -#if defined(XCURVES) - CurveInfo &crv = g_model.curves[idx]; - int8_t *points = curveAddress(idx); +#if defined(CPUARM) + CurveInfo & crv = g_model.curves[idx]; + int8_t * points = curveAddress(idx); uint8_t count = crv.points+5; bool custom = (crv.type == CURVE_TYPE_CUSTOM); #else CurveInfo crv = curveInfo(idx); - int8_t *points = crv.crv; + int8_t * points = crv.crv; uint8_t count = crv.points; bool custom = crv.custom; #endif @@ -232,36 +293,23 @@ int intpol(int x, uint8_t idx) // -100, -75, -50, -25, 0 ,25 ,50, 75, 100 return erg / 25; // 100*D5/RESX; } -#if defined(CURVES) && defined(XCURVES) +#if defined(CPUARM) int applyCurve(int x, CurveRef & curve) { switch (curve.type) { case CURVE_REF_DIFF: { -#if defined(CPUARM) int curveParam = GET_GVAR_PREC1(curve.value, -100, 100, mixerCurrentFlightMode); if (curveParam > 0 && x < 0) x = (x * (1000 - curveParam)) / 1000; else if (curveParam < 0 && x > 0) x = (x * (1000 + curveParam)) / 1000; return x; -#else - int curveParam = calc100to256(GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode)); - if (curveParam > 0 && x < 0) - x = (x * (256 - curveParam)) >> 8; - else if (curveParam < 0 && x > 0) - x = (x * (256 + curveParam)) >> 8; - return x; -#endif } case CURVE_REF_EXPO: { -#if defined(CPUARM) int curveParam = GET_GVAR_PREC1(curve.value, -100, 100, mixerCurrentFlightMode) / 10; -#else - int curveParam = GET_GVAR(curve.value, -100, 100, mixerCurrentFlightMode); -#endif return expo(x, curveParam); } @@ -306,13 +354,13 @@ int applyCustomCurve(int x, uint8_t idx) if (idx >= MAX_CURVES) return 0; - CurveInfo &crv = g_model.curves[idx]; + CurveInfo & crv = g_model.curves[idx]; if (crv.smooth) return hermite_spline(x, idx); else return intpol(x, idx); } -#elif defined(CURVES) +#else int applyCurve(int x, int8_t idx) { /* already tried to have only one return at the end */ @@ -435,3 +483,32 @@ int expo(int x, int k) } return neg? -y : y; } + +point_t getPoint(uint8_t i) +{ + point_t result = {0, 0}; +#if defined(CPUARM) + CurveInfo & crv = g_model.curves[s_curveChan]; + int8_t * points = curveAddress(s_curveChan); + bool custom = (crv.type == CURVE_TYPE_CUSTOM); + uint8_t count = 5+crv.points; +#else + CurveInfo crv = curveInfo(s_curveChan); + int8_t * points = crv.crv; + bool custom = crv.custom; + uint8_t count = crv.points; +#endif + if (i < count) { + result.x = CURVE_CENTER_X-1-CURVE_SIDE_WIDTH + i*CURVE_SIDE_WIDTH*2/(count-1); + result.y = CURVE_CENTER_Y - (points[i]) * (CURVE_SIDE_WIDTH-1) / 100; + if (custom && i>0 && i= 212 enum MainViews { VIEW_TIMERS, VIEW_INPUTS, @@ -325,10 +314,7 @@ enum UartModes { #define LEN_ANA_NAME 3 #define LEN_MODEL_FILENAME 16 #define LEN_BLUETOOTH_NAME 10 -#elif defined(PCBFLAMENCO) - #define LEN_SWITCH_NAME 3 - #define LEN_ANA_NAME 3 -#elif defined(PCBTARANIS) +#elif defined(CPUARM) #define LEN_SWITCH_NAME 3 #define LEN_ANA_NAME 3 #define LEN_BLUETOOTH_NAME 10 @@ -487,7 +473,7 @@ enum TelemetryUnit { }; #endif -#if defined(PCBTARANIS) +#if LCD_W >= 212 #define NUM_LINE_ITEMS 3 #else #define NUM_LINE_ITEMS 2 @@ -699,7 +685,7 @@ enum SwitchSources { SWSRC_SWA, SWSRC_SWB, SWSRC_SWC, - SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+NUM_LOGICAL_SWITCH-1, + SWSRC_LAST_LOGICAL_SWITCH = SWSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, SWSRC_ON, SWSRC_ONE, @@ -710,7 +696,7 @@ enum SwitchSources { SWSRC_TELEMETRY_STREAMING, SWSRC_FIRST_SENSOR, - SWSRC_LAST_SENSOR = SWSRC_FIRST_SENSOR+MAX_SENSORS-1, + SWSRC_LAST_SENSOR = SWSRC_FIRST_SENSOR+MAX_TELEMETRY_SENSORS-1, #endif SWSRC_COUNT, @@ -739,10 +725,12 @@ enum SwitchSources { enum MixSources { MIXSRC_NONE, -#if defined(VIRTUALINPUTS) - MIXSRC_FIRST_INPUT, LUA_EXPORT_MULTIPLE("input", "Input [I%d]", MAX_INPUTS) +#if defined(VIRTUAL_INPUTS) + MIXSRC_FIRST_INPUT, LUA_EXPORT_MULTIPLE("input", "Input [I%d]", MAX_INPUTS) MIXSRC_LAST_INPUT = MIXSRC_FIRST_INPUT+MAX_INPUTS-1, - +#endif + +#if defined(LUA_INPUTS) MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1, #endif @@ -877,18 +865,18 @@ enum MixSources { MIXSRC_LAST_SWITCH = MIXSRC_TRN, #endif MIXSRC_FIRST_LOGICAL_SWITCH, - MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", NUM_LOGICAL_SWITCH) + MIXSRC_SW1 = MIXSRC_FIRST_LOGICAL_SWITCH, LUA_EXPORT_MULTIPLE("ls", "Logical switch L%d", MAX_LOGICAL_SWITCHES) MIXSRC_SW9 = MIXSRC_SW1 + 8, MIXSRC_SWA, MIXSRC_SWB, MIXSRC_SWC, - MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+NUM_LOGICAL_SWITCH-1, + MIXSRC_LAST_LOGICAL_SWITCH = MIXSRC_FIRST_LOGICAL_SWITCH+MAX_LOGICAL_SWITCHES-1, - MIXSRC_FIRST_TRAINER, LUA_EXPORT_MULTIPLE("trn", "Trainer input %d", NUM_TRAINER) - MIXSRC_LAST_TRAINER = MIXSRC_FIRST_TRAINER+NUM_TRAINER-1, + MIXSRC_FIRST_TRAINER, LUA_EXPORT_MULTIPLE("trn", "Trainer input %d", MAX_TRAINER_CHANNELS) + MIXSRC_LAST_TRAINER = MIXSRC_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, MIXSRC_FIRST_CH, - MIXSRC_CH1 = MIXSRC_FIRST_CH, LUA_EXPORT_MULTIPLE("ch", "Channel CH%d", NUM_CHNOUT) + MIXSRC_CH1 = MIXSRC_FIRST_CH, LUA_EXPORT_MULTIPLE("ch", "Channel CH%d", MAX_OUTPUT_CHANNELS) MIXSRC_CH2, MIXSRC_CH3, MIXSRC_CH4, @@ -904,7 +892,7 @@ enum MixSources { MIXSRC_CH14, MIXSRC_CH15, MIXSRC_CH16, - MIXSRC_LAST_CH = MIXSRC_CH1+NUM_CHNOUT-1, + MIXSRC_LAST_CH = MIXSRC_CH1+MAX_OUTPUT_CHANNELS-1, MIXSRC_FIRST_GVAR, MIXSRC_GVAR1 = MIXSRC_FIRST_GVAR, LUA_EXPORT_MULTIPLE("gvar", "Global variable %d", MAX_GVARS) @@ -927,7 +915,7 @@ enum MixSources { MIXSRC_FIRST_TELEM, #if defined(CPUARM) - MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_SENSORS-1 + MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+3*MAX_TELEMETRY_SENSORS-1 #else MIXSRC_LAST_TELEM = MIXSRC_FIRST_TELEM+NUM_TELEMETRY-1 #endif @@ -1029,7 +1017,7 @@ enum ResetFunctionParam { #endif #if defined(CPUARM) FUNC_RESET_PARAM_FIRST_TELEM, - FUNC_RESET_PARAM_LAST_TELEM = FUNC_RESET_PARAM_FIRST_TELEM + MAX_SENSORS, + FUNC_RESET_PARAM_LAST_TELEM = FUNC_RESET_PARAM_FIRST_TELEM + MAX_TELEMETRY_SENSORS, #endif FUNC_RESET_PARAMS_COUNT, FUNC_RESET_PARAM_LAST = FUNC_RESET_PARAMS_COUNT-1, diff --git a/radio/src/datastructs.h b/radio/src/datastructs.h index f1a011cb08..0f11b3637a 100644 --- a/radio/src/datastructs.h +++ b/radio/src/datastructs.h @@ -76,7 +76,7 @@ typedef uint8_t source_t; * Mixer structure */ -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) PACK(struct CurveRef { uint8_t type; int8_t value; @@ -100,29 +100,9 @@ PACK(struct MixData { uint8_t speedDown; NOBACKUP(char name[LEN_EXPOMIX_NAME]); }); -#elif defined(CPUARM) -PACK(struct MixData { - uint8_t destCh:5; - uint8_t mixWarn:3; // mixer warning - uint16_t flightModes:9; - uint16_t curveMode:1; - uint16_t noExpo:1; - int16_t carryTrim:3; - uint16_t mltpx:2; // multiplex method: 0 means +=, 1 means *=, 2 means := - int16_t weight; - int8_t swtch; - int8_t curveParam; - uint8_t delayUp; - uint8_t delayDown; - uint8_t speedUp; - uint8_t speedDown; - uint8_t srcRaw; - int16_t offset; - NOBACKUP(char name[LEN_EXPOMIX_NAME]); -}); #elif defined(CPUM2560) || defined(CPUM2561) PACK(struct MixData { - uint8_t destCh:4; // 0, 1..NUM_CHNOUT + uint8_t destCh:4; // 0, 1..MAX_OUTPUT_CHANNELS uint8_t curveMode:1; // O=curve, 1=differential uint8_t noExpo:1; uint8_t weightMode:1; @@ -144,7 +124,7 @@ PACK(struct MixData { }); #else PACK(struct MixData { - uint8_t destCh:4; // 0, 1..NUM_CHNOUT + uint8_t destCh:4; // 0, 1..MAX_OUTPUT_CHANNELS uint8_t curveMode:1; // O=curve, 1=differential uint8_t noExpo:1; uint8_t weightMode:1; @@ -169,7 +149,7 @@ PACK(struct MixData { * Expo/Input structure */ -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) PACK(struct ExpoData { uint16_t mode:2; uint16_t scale:14; @@ -184,17 +164,6 @@ PACK(struct ExpoData { int8_t offset; CurveRef curve; }); -#elif defined(CPUARM) -PACK(struct ExpoData { - uint16_t mode:2; // 0=end, 1=pos, 2=neg, 3=both - uint16_t chn:3; - uint16_t curveMode:2; - uint16_t flightModes:9; - int8_t swtch; - int8_t weight; - NOBACKUP(char name[LEN_EXPOMIX_NAME]); - int8_t curveParam; -}); #elif defined(CPUM2560) || defined(CPUM2561) PACK(struct ExpoData { uint8_t mode:2; // 0=end, 1=pos, 2=neg, 3=both @@ -222,7 +191,7 @@ PACK(struct ExpoData { * Limit structure */ -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) PACK(struct LimitData { int32_t min:11; int32_t max:11; @@ -287,7 +256,7 @@ PACK(struct CustomFunctionData { uint16_t func:7; PACK(union { NOBACKUP(PACK(struct { - char name[LEN_CFN_NAME]; + char name[LEN_FUNCTION_NAME]; }) play); PACK(struct { @@ -341,14 +310,14 @@ PACK(struct CustomFunctionData { * FlightMode structure */ - #if defined(VIRTUALINPUTS) - PACK(struct trim_t { - int16_t value:11; - uint16_t mode:5; - }); - #else - typedef int16_t trim_t; - #endif +#if defined(CPUARM) +PACK(struct trim_t { + int16_t value:11; + uint16_t mode:5; +}); +#else +typedef int16_t trim_t; +#endif typedef int16_t gvar_t; @@ -394,15 +363,13 @@ PACK(struct FlightModeData { * Curve structure */ -#if defined(XCURVES) +#if defined(CPUARM) PACK(struct CurveData { uint8_t type:1; uint8_t smooth:1; int8_t points:6; // TODO conversion NOBACKUP(char name[LEN_CURVE_NAME]); }); -#elif defined(CPUARM) -typedef int16_t CurveData; #else typedef int8_t CurveData; #endif @@ -463,7 +430,7 @@ PACK(struct TimerData { * Swash Ring structure */ -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) PACK(struct SwashRingData { uint8_t type; uint8_t value; @@ -685,7 +652,7 @@ PACK(struct ModuleData { uint8_t failsafeMode:4; //only 3 bits used uint8_t subType:3; uint8_t invertedSerial:1; // telemetry serial inverted from standard - int16_t failsafeChannels[NUM_CHNOUT]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; union { struct { int8_t delay:6; @@ -786,13 +753,13 @@ PACK(struct CustomScreenData { #endif #if defined(PCBHORUS) - #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS]); + #define MODELDATA_EXTRA NOBACKUP(uint8_t spare:3); NOBACKUP(uint8_t trainerMode:3); NOBACKUP(uint8_t potsWarnMode:2); ModuleData moduleData[NUM_MODULES+1]; NOBACKUP(ScriptData scriptsData[MAX_SCRIPTS]); NOBACKUP(char inputNames[MAX_INPUTS][LEN_INPUT_NAME]); NOBACKUP(uint8_t potsWarnEnabled); NOBACKUP(int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]); #elif defined(PCBFLAMENCO) - #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS]; + #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBTARANIS) - #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS]; + #define MODELDATA_EXTRA uint8_t spare:3; uint8_t trainerMode:3; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; ScriptData scriptsData[MAX_SCRIPTS]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #elif defined(PCBSKY9X) - #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS]; uint8_t rxBattAlarms[2]; + #define MODELDATA_EXTRA uint8_t spare:6; uint8_t potsWarnMode:2; ModuleData moduleData[NUM_MODULES+1]; char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; uint8_t potsWarnEnabled; int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; uint8_t rxBattAlarms[2]; #else #define MODELDATA_EXTRA #endif @@ -817,14 +784,14 @@ PACK(struct ModelData { AVR_FIELD(int8_t ppmDelay) BeepANACenter beepANACenter; MixData mixData[MAX_MIXERS]; - LimitData limitData[NUM_CHNOUT]; + LimitData limitData[MAX_OUTPUT_CHANNELS]; ExpoData expoData[MAX_EXPOS]; CurveData curves[MAX_CURVES]; - int8_t points[NUM_POINTS]; + int8_t points[MAX_CURVE_POINTS]; - LogicalSwitchData logicalSw[NUM_LOGICAL_SWITCH]; - CustomFunctionData customFn[NUM_CFN]; + LogicalSwitchData logicalSw[MAX_LOGICAL_SWITCHES]; + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; SwashRingData swashR; FlightModeData flightModeData[MAX_FLIGHT_MODES]; @@ -840,7 +807,7 @@ PACK(struct ModelData { MODELDATA_EXTRA - ARM_FIELD(NOBACKUP(TelemetrySensor telemetrySensors[MAX_SENSORS])) + ARM_FIELD(NOBACKUP(TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS])) TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) @@ -903,7 +870,7 @@ PACK(struct TrainerData { NOBACKUP(int8_t varioPitch); \ NOBACKUP(int8_t varioRange); \ NOBACKUP(int8_t varioRepeat); \ - CustomFunctionData customFn[NUM_CFN]; + CustomFunctionData customFn[MAX_SPECIAL_FUNCTIONS]; #endif #if defined(PCBHORUS) @@ -914,7 +881,7 @@ PACK(struct TrainerData { uint32_t switchConfig; \ uint8_t potsConfig; /* two bits per pot */ \ NOBACKUP(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]); \ - NOBACKUP(char anaNames[NUM_STICKS+NUM_POTS][LEN_ANA_NAME]); \ + NOBACKUP(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]); \ NOBACKUP(char currModelFilename[LEN_MODEL_FILENAME+1]); \ NOBACKUP(uint8_t bluetoothEnable:1); \ NOBACKUP(uint8_t blOffBright:7); \ @@ -927,7 +894,7 @@ PACK(struct TrainerData { uint32_t switchConfig; \ uint8_t potsType; /*two bits for every pot*/\ char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+NUM_POTS][LEN_ANA_NAME]; + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; #elif defined(PCBTARANIS) #if defined(PCBX9E) #define BLUETOOTH_FIELDS \ @@ -945,7 +912,7 @@ PACK(struct TrainerData { swarnstate_t switchUnlockStates; \ swconfig_t switchConfig; \ char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ - char anaNames[NUM_STICKS+NUM_POTS][LEN_ANA_NAME]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; \ BLUETOOTH_FIELDS #elif defined(PCBSKY9X) #define EXTRA_GENERAL_FIELDS \ @@ -957,7 +924,9 @@ PACK(struct TrainerData { int8_t temperatureCalib; \ uint8_t optrexDisplay; \ uint8_t sticksGain; \ - uint8_t rotarySteps; + uint8_t rotarySteps; \ + char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]; \ + char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]; #elif defined(CPUARM) #define EXTRA_GENERAL_FIELDS EXTRA_GENERAL_FIELDS_ARM #elif defined(PXX) @@ -978,7 +947,7 @@ PACK(struct TrainerData { PACK(struct RadioData { NOBACKUP(uint8_t version); NOBACKUP(uint16_t variant); - CalibData calib[NUM_STICKS+NUM_POTS+NUM_MOUSE_ANALOGS]; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; NOBACKUP(uint16_t chkSum); N_HORUS_FIELD(int8_t currModel); N_HORUS_FIELD(uint8_t contrast); @@ -1053,16 +1022,18 @@ static inline void check_struct() #define CHKSIZE(x, y) check_size() #define CHKTYPE(x, y) check_size() -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) CHKSIZE(CurveRef, 2); #endif /* Difference between Taranis/Horus is LEN_EXPOMIX_NAME */ /* Sky9x does not have virtualinputs */ - /* LEN_CFN_NAME is the difference in CustomFunctionData */ + /* LEN_FUNCTION_NAME is the difference in CustomFunctionData */ -#if defined(PCBTARANIS) +#if defined(PCBX7D) + // TODO +#elif defined(PCBTARANIS) CHKSIZE(MixData, 22); CHKSIZE(ExpoData, 19); CHKSIZE(LimitData, 13); @@ -1081,6 +1052,9 @@ static inline void check_struct() #if defined(PCBX9E) CHKSIZE(RadioData, 952); CHKSIZE(ModelData, 6520); +#elif defined(PCBX7D) + CHKSIZE(RadioData, 839); + CHKSIZE(ModelData, 6504); #else CHKSIZE(RadioData, 872); CHKSIZE(ModelData, 6507); @@ -1105,19 +1079,19 @@ static inline void check_struct() #elif defined(PCBSKY9X) CHKSIZE(MixData, 20); - CHKSIZE(ExpoData, 11); - CHKSIZE(LimitData, 5); + CHKSIZE(ExpoData, 17); + CHKSIZE(LimitData, 13); CHKSIZE(CustomFunctionData, 9); CHKSIZE(FlightModeData, 38); CHKSIZE(TimerData, 11); - CHKSIZE(SwashRingData, 3); + CHKSIZE(SwashRingData, 8); CHKSIZE(FrSkyBarData, 5); CHKSIZE(FrSkyLineData, 2); CHKSIZE(FrSkyTelemetryData, 90); CHKSIZE(ModelHeader, 12); - CHKTYPE(CurveData, 2); - CHKSIZE(RadioData, 685); - CHKSIZE(ModelData, 4671); + CHKTYPE(CurveData, 4); + CHKSIZE(RadioData, 727); + CHKSIZE(ModelData, 5252); #else // Common for all variants CHKSIZE(LimitData, 5); diff --git a/radio/src/fonts/extra_11px.png b/radio/src/fonts/extra_11px.png new file mode 100644 index 0000000000..73280e2746 Binary files /dev/null and b/radio/src/fonts/extra_11px.png differ diff --git a/radio/src/functions.cpp b/radio/src/functions.cpp index 7489a6cc24..701c7cf6ed 100644 --- a/radio/src/functions.cpp +++ b/radio/src/functions.cpp @@ -262,7 +262,7 @@ void evalFunctions() MASK_CFN_TYPE newActiveSwitches = 0; #if defined(CPUARM) - uint8_t playFirstIndex = (functions == g_model.customFn ? 1 : 1+NUM_CFN); + uint8_t playFirstIndex = (functions == g_model.customFn ? 1 : 1+MAX_SPECIAL_FUNCTIONS); #define PLAY_INDEX (i+playFirstIndex) #else #define PLAY_INDEX (i+1) @@ -273,7 +273,7 @@ void evalFunctions() #endif #if defined(OVERRIDE_CHANNEL_FUNCTION) - for (uint8_t i=0; i=FUNC_RESET_PARAM_FIRST_TELEM) { uint8_t item = CFN_PARAM(cfn)-FUNC_RESET_PARAM_FIRST_TELEM; - if (item < MAX_SENSORS) { + if (item < MAX_TELEMETRY_SENSORS) { telemetryItems[item].clear(); } } @@ -376,7 +376,7 @@ void evalFunctions() { unsigned int moduleIndex = CFN_PARAM(cfn); if (moduleIndex < NUM_MODULES) { - for (int ch=0; ch= NUM_CHANNELS(moduleIndex) + g_model.moduleData[moduleIndex].channelsStart) { g_model.moduleData[moduleIndex].failsafeChannels[ch] = 0; } diff --git a/radio/src/gui/128x64/gui.h b/radio/src/gui/128x64/gui.h index 6ab689dcda..9d99f1572b 100644 --- a/radio/src/gui/128x64/gui.h +++ b/radio/src/gui/128x64/gui.h @@ -22,25 +22,401 @@ #define _GUI_H_ #include "gui_common.h" -#include "lcd.h" #include "menus.h" +#include "popups.h" -extern const pm_uchar sticks[] PROGMEM; +#define MENUS_SCROLLBAR_WIDTH 0 + +#if defined(PCBX7D) + #define HEADER_LINE 0 + #define HEADER_LINE_COLUMNS +#else + #define HEADER_LINE 1 + #define HEADER_LINE_COLUMNS 0, +#endif + +#define MENU_COLUMNS 1 +#define COLUMN_X 0 +#define drawFieldLabel(x, y, str) lcdDrawTextAlignedLeft(y, str) #define NUM_BODY_LINES (LCD_LINES-1) #define MENU_HEADER_HEIGHT FH #define MENU_INIT_VPOS 0 -#define DEFAULT_SCROLLBAR_X (LCD_W-1) -#define WCHART (LCD_H/2) -#define X0 (LCD_W-WCHART-2) -#define Y0 (LCD_H/2) +#define CURVE_SIDE_WIDTH (LCD_H/2) +#define CURVE_CENTER_X (LCD_W-CURVE_SIDE_WIDTH-2) +#define CURVE_CENTER_Y (LCD_H/2) #define MIXES_2ND_COLUMN (12*FW) +// Temporary no highlight +extern uint8_t noHighlightCounter; +#define NO_HIGHLIGHT() (noHighlightCounter > 0) +#define START_NO_HIGHLIGHT() do { noHighlightCounter = 25; } while(0) + + +#if !defined(CPUM64) +void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr); +#elif defined(GRAPHICS) +void display5posSlider(coord_t x, coord_t y, uint8_t value, uint8_t attr); + #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) +#else + #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) +#endif + +#if defined(NAVIGATION_POT1) +extern int16_t p1valdiff; +#else + #define p1valdiff 0 +#endif + +#if defined(NAVIGATION_POT2) +extern int8_t p2valdiff; +#else + #define p2valdiff 0 +#endif + +extern int8_t checkIncDec_Ret; // global helper vars + +#define EDIT_SELECT_MENU -1 +#define EDIT_SELECT_FIELD 0 +#define EDIT_MODIFY_FIELD 1 +#define EDIT_MODIFY_STRING 2 +extern int8_t s_editMode; // global editmode + +// checkIncDec flags +#define EE_GENERAL 0x01 +#define EE_MODEL 0x02 +#define NO_INCDEC_MARKS 0x04 +#define INCDEC_SWITCH 0x08 +#define INCDEC_SOURCE 0x10 +#define INCDEC_REP10 0x40 +#define NO_DBLKEYS 0x80 + +#if defined(CPUARM) +#define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL + #define INCDEC_SET_FLAG(f) incdecFlag = (f) + #define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn + #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) +#elif defined(CPUM64) +#define INCDEC_DECLARE_VARS(f) + #define INCDEC_SET_FLAG(f) + #define INCDEC_ENABLE_CHECK(fn) + #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, EE_MODEL) +#else + #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f) + #define INCDEC_SET_FLAG(f) incdecFlag = (f) + #define INCDEC_ENABLE_CHECK(fn) + #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag) +#endif + +// mawrow special values +#define TITLE_ROW ((uint8_t)-1) +#define HIDDEN_ROW ((uint8_t)-2) + +#if defined(CPUARM) +struct CheckIncDecStops { + const int count; + const int stops[]; + int min() const + { + return stops[0]; + } + int max() const + { + return stops[count-1]; + } + bool contains(int value) const + { + for (int i=0; i= 0x0e) + #define CASE_EVT_ROTARY_BREAK case EVT_ROTARY_BREAK: + #define CASE_EVT_ROTARY_LONG case EVT_ROTARY_LONG: + #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: + #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: + void repeatLastCursorMove(uint8_t event); + #define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) putEvent(event); else repeatLastCursorMove(event); } + #define MOVE_CURSOR_FROM_HERE() if (menuHorizontalPosition > 0) REPEAT_LAST_CURSOR_MOVE() +#else + #define IS_ROTARY_LEFT(evt) (0) + #define IS_ROTARY_RIGHT(evt) (0) + #define IS_ROTARY_BREAK(evt) (0) + #define IS_ROTARY_LONG(evt) (0) + #define IS_ROTARY_EVENT(evt) (0) + #define CASE_EVT_ROTARY_BREAK + #define CASE_EVT_ROTARY_LONG + #define CASE_EVT_ROTARY_LEFT + #define CASE_EVT_ROTARY_RIGHT + void repeatLastCursorMove(uint8_t event); + #define REPEAT_LAST_CURSOR_MOVE() repeatLastCursorMove(event) + #define MOVE_CURSOR_FROM_HERE() REPEAT_LAST_CURSOR_MOVE() +#endif + +#define POS_HORZ_INIT(posVert) 0 +#define EDIT_MODE_INIT -1 + +typedef int (*FnFuncP) (int x); +void drawFunction(FnFuncP fn, uint8_t offset=0); + +uint8_t switchToMix(uint8_t source); + +void deleteExpoMix(uint8_t expo, uint8_t idx); + +void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); + +extern const pm_uchar sticks[] PROGMEM; + void drawSplash(); void drawScreenIndex(uint8_t index, uint8_t count, uint8_t attr); void drawStick(coord_t centrex, int16_t xval, int16_t yval); +void drawPotsBars(); +void doMainScreenGraphics(); + inline void drawProgressBar(const char * label) { // TODO @@ -59,7 +435,7 @@ void drawVerticalScrollbar(coord_t x, coord_t y, coord_t h, uint16_t offset, uin #endif #if defined(PCBTARANIS) -void drawAlertBox(const char * title, const char * text, const char * action); +void drawAlertBox(const pm_char * title, const pm_char * text, const char * action); #endif #if defined(VOICE) @@ -81,4 +457,16 @@ void showAlertBox(const pm_char * title, const pm_char * text, const char * acti #endif #define IS_OTHER_VIEW_DISPLAYED() false -#endif // _GUI_H_ \ No newline at end of file +#if defined(CPUARM) +void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags flags); +void editCurveRef(coord_t x, coord_t y, CurveRef & curve, uint8_t event, LcdFlags flags); +#endif + +#if defined(FLIGHT_MODES) +void displayFlightModes(coord_t x, coord_t y, FlightModesType value); +FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr); +#else +#define displayFlightModes(...) +#endif + +#endif // _GUI_H_ diff --git a/radio/src/gui/128x64/lcd.cpp b/radio/src/gui/128x64/lcd.cpp index b1a09abdac..070543485b 100644 --- a/radio/src/gui/128x64/lcd.cpp +++ b/radio/src/gui/128x64/lcd.cpp @@ -116,6 +116,103 @@ void lcdPutPattern(coord_t x, coord_t y, const uint8_t * pattern, uint8_t width, } } +#if defined(CPUARM) && !defined(BOOT) +struct PatternData +{ + uint8_t width; + uint8_t height; + const uint8_t * data; +}; + +uint8_t getPatternWidth(const PatternData * pattern) +{ + uint8_t result = 0; + uint8_t lines = (pattern->height+7)/8; + const uint8_t * data = pattern->data; + for (int8_t i=0; iwidth; i++) { + for (uint8_t j=0; j=',' && c<=':') + c_remapped = c - ',' + 1; + else if (c>='A' && c<='Z') + c_remapped = c - 'A' + 16; + else if (c>='a' && c<='z') + c_remapped = c - 'a' + 42; + else if (c=='_') + c_remapped = 4; + else if (c!=' ') + flags &= ~BOLD; + } + + if (fontsize == DBLSIZE) { + pattern->width = 10; + pattern->height = 16; + if (c >= 0xC0) { + pattern->data = &font_10x14_extra[((uint16_t)(c-0xC0))*20]; + } + else { + if (c >= 128) + c_remapped = c - 60; + pattern->data = &font_10x14[((uint16_t)c_remapped)*20]; + } + } + else if (fontsize == XXLSIZE) { + pattern->width = 22; + pattern->height = 38; + pattern->data = &font_22x38_num[((uint16_t)c-'0'+5)*110]; + } + else if (fontsize == MIDSIZE) { + pattern->width = 8; + pattern->height = 12; + pattern->data = &font_8x10[((uint16_t)c-0x20)*16]; + } + else if (fontsize == SMLSIZE) { + pattern->width = 5; + pattern->height = 6; + pattern->data = (c < 0xc0 ? &font_4x6[(c-0x20)*5] : &font_4x6_extra[(c-0xc0)*5]); + } + else if (fontsize == TINSIZE) { + pattern->width = 3; + pattern->height = 5; + pattern->data = &font_3x5[((uint16_t)c-0x20)*3]; + } + else if (flags & BOLD) { + pattern->width = 5; + pattern->height = 7; + pattern->data = &font_5x7_B[c_remapped*5]; + } + else { + pattern->width = 5; + pattern->height = 7; + pattern->data = (c < 0xC0) ? &font_5x7[(c-0x20)*5] : &font_5x7_extra[(c-0xC0)*5]; + } +} + +uint8_t getCharWidth(char c, LcdFlags flags) +{ + PatternData pattern; + getCharPattern(&pattern, c, flags); + return getPatternWidth(&pattern); +} +#endif + void lcdDrawChar(coord_t x, coord_t y, const unsigned char c, LcdFlags flags) { const pm_uchar * q; @@ -192,13 +289,39 @@ void lcdDrawChar(coord_t x, coord_t y, const unsigned char c) lcdDrawChar(x, y, c, 0); } +#if defined(CPUARM) && !defined(BOOT) +uint8_t getTextWidth(const char * s, uint8_t len, LcdFlags flags) +{ + uint8_t width = 0; + while (len--) { + unsigned char c = (flags & ZCHAR) ? idx2char(*s) : *s; + if (!c) { + break; + } + width += getCharWidth(c, flags) + 1; + s++; + } + return width; +} +#endif + void lcdDrawSizedText(coord_t x, coord_t y, const pm_char * s, uint8_t len, LcdFlags flags) { const coord_t orig_x = x; + #if defined(CPUARM) const uint8_t orig_len = len; uint32_t fontsize = FONTSIZE(flags); #endif + +#if defined(CPUARM) && !defined(BOOT) + uint8_t width = 0; + if (flags & RIGHT) { + width = getTextWidth(s, len, flags); + x -= width; + } +#endif + bool setx = false; while (len--) { unsigned char c; @@ -259,9 +382,14 @@ void lcdDrawSizedText(coord_t x, coord_t y, const pm_char * s, uint8_t len, LcdF } lcdLastPos = x; lcdNextPos = x; -#if defined(CPUARM) - if (fontsize == MIDSIZE) +#if defined(CPUARM) && !defined(BOOT) + if (fontsize == MIDSIZE) { lcdLastPos += 1; + } + if (flags & RIGHT) { + lcdLastPos -= width; + lcdNextPos -= width; + } #endif } @@ -334,6 +462,7 @@ void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags flags, uint8_t l uint8_t fw = FWNUM; int8_t mode = MODE(flags); flags &= ~LEADING0; + #if defined(CPUARM) uint32_t fontsize = FONTSIZE(flags); bool dblsize = (fontsize == DBLSIZE); @@ -386,16 +515,17 @@ void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags flags, uint8_t l fw -= 1; } else { - if (flags & LEFT) { - if (mode > 0) + if (IS_LEFT_ALIGNED(flags)) { + if (mode > 0) { x += 2; + } } #if defined(BOLD_FONT) && !defined(CPUM64) || defined(TELEMETRY_NONE) if (flags & BOLD) fw += 1; #endif } - if (flags & LEFT) { + if (IS_LEFT_ALIGNED(flags)) { x += len * fw; if (neg) { x += ((xxlsize|dblsize|midsize) ? 7 : FWNUM); @@ -568,30 +698,31 @@ void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat, #endif } -void lcdDrawTelemetryTopBar() +void drawTelemetryTopBar() { putsModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0); uint8_t att = (IS_TXBATT_WARNING() ? BLINK : 0); putsVBat(14*FW,0,att); if (g_model.timers[0].mode) { att = (timersStates[0].val<0 ? BLINK : 0); - putsTimer(17*FW+5*FWNUM+1, 0, timersStates[0].val, att, att); + drawTimer(17*FW+5*FWNUM+1, 0, timersStates[0].val, att, att); } lcdInvertLine(0); } #if defined(CPUARM) && defined(RTCLOCK) -void putsRtcTime(coord_t x, coord_t y, LcdFlags att) +void drawRtcTime(coord_t x, coord_t y, LcdFlags att) { - putsTimer(x, y, getValue(MIXSRC_TX_TIME), att, att); + drawTimer(x, y, getValue(MIXSRC_TX_TIME), att, att); } #endif -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2) +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2) { div_t qr; - if (!(att & LEFT)) { + if (IS_RIGHT_ALIGNED(att)) { + att -= RIGHT; if (att & DBLSIZE) x -= 5*(2*FWNUM)-4; else if (att & MIDSIZE) @@ -622,12 +753,12 @@ void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2 att &= ~DBLSIZE; #endif #if defined(CPUARM) && defined(RTCLOCK) - if (att&TIMEBLINK) + if (att & TIMEBLINK) lcdDrawChar(lcdLastPos, y, separator, BLINK); else #endif lcdDrawChar(lcdLastPos, y, separator, att&att2); - lcdDrawNumber(lcdNextPos, y, qr.rem, att2|LEADING0|LEFT, 2); + lcdDrawNumber(lcdNextPos, y, qr.rem, (att2|LEADING0|LEFT) & (~RIGHT), 2); } // TODO to be optimized with putsValueWithUnit @@ -642,20 +773,97 @@ void putsVBat(coord_t x, coord_t y, LcdFlags att) putsVolts(x, y, g_vbat100mV, att); } -void drawStringWithIndex(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att) +#if defined(CPUARM) +void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) { - lcdDrawText(x, y, str, att & ~LEADING0); - lcdDrawNumber(lcdNextPos, y, idx, att|LEFT, 2); + if (idx == MIXSRC_NONE) { + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, 0, att); // TODO macro + } + else if (idx <= MIXSRC_LAST_INPUT) { + lcdDrawChar(x+2, y+1, CHR_INPUT, TINSIZE); + lcdDrawFilledRect(x, y, 7, 7); + if (ZEXIST(g_model.inputNames[idx-MIXSRC_FIRST_INPUT])) + lcdDrawSizedText(x+8, y, g_model.inputNames[idx-MIXSRC_FIRST_INPUT], LEN_INPUT_NAME, ZCHAR|att); + else + lcdDrawNumber(x+8, y, idx, att|LEADING0|LEFT, 2); + } +#if defined(LUA_INPUTS) + else if (idx <= MIXSRC_LAST_LUA) { + div_t qr = div(idx-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); +#if defined(LUA_MODEL_SCRIPTS) + if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInputsOutputs[qr.quot].outputsCount) { + lcdDrawChar(x+2, y+1, '1'+qr.quot, TINSIZE); + lcdDrawFilledRect(x, y, 7, 7); + lcdDrawSizedText(x+8, y, scriptInputsOutputs[qr.quot].outputs[qr.rem].name, att & STREXPANDED ? 9 : 4, att); + } + else +#endif + { + drawStringWithIndex(x, y, "LUA", qr.quot+1, att); + lcdDrawChar(lcdLastPos, y, 'a'+qr.rem, att); + } + } +#endif + else if (idx < MIXSRC_LAST_POT) { + idx = idx - MIXSRC_Rud; + if (ZEXIST(g_eeGeneral.anaNames[idx])) { + if (idx < MIXSRC_FIRST_POT-MIXSRC_Rud ) + lcdDrawChar(x, y, '\307', att); // stick symbol + else if (idx <= MIXSRC_LAST_POT-MIXSRC_Rud ) + lcdDrawChar(x, y, '\310', att); // pot symbol + else + lcdDrawChar(x, y, '\311', att); // slider symbol + lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, ZCHAR|att); + } + else { + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + 1, att); + } + } + else if (idx >= MIXSRC_FIRST_SWITCH && idx <= MIXSRC_LAST_SWITCH) { + idx = idx-MIXSRC_FIRST_SWITCH; + if (ZEXIST(g_eeGeneral.switchNames[idx])) { + lcdDrawChar(x, y, '\312', att); //switch symbol + lcdDrawSizedText(lcdNextPos, y, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME, ZCHAR|att); + } + else { + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1, att); + } + } + else if (idx < MIXSRC_SW1) + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att); + else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) + drawSwitch(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); + else if (idx < MIXSRC_CH1) + drawStringWithIndex(x, y, STR_PPM_TRAINER, idx-MIXSRC_FIRST_TRAINER+1, att); + else if (idx <= MIXSRC_LAST_CH) { + drawStringWithIndex(x, y, STR_CH, idx-MIXSRC_CH1+1, att); + if (ZEXIST(g_model.limitData[idx-MIXSRC_CH1].name) && (att & STREXPANDED)) { + lcdDrawChar(lcdLastPos, y, ' ', att|SMLSIZE); + lcdDrawSizedText(lcdLastPos+3, y, g_model.limitData[idx-MIXSRC_CH1].name, LEN_CHANNEL_NAME, ZCHAR|att|SMLSIZE); + } + } + else if (idx <= MIXSRC_LAST_GVAR) { + drawStringWithIndex(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); + } + else if (idx < MIXSRC_FIRST_TELEM) { + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); + } + else { + idx -= MIXSRC_FIRST_TELEM; + div_t qr = div(idx, 3); + lcdDrawSizedText(x, y, g_model.telemetrySensors[qr.quot].label, TELEM_LABEL_LEN, ZCHAR|att); + if (qr.rem) lcdDrawChar(lcdLastPos, y, qr.rem==2 ? '+' : '-', att); + } } - -void putsMixerSource(coord_t x, coord_t y, uint8_t idx, LcdFlags att) +#else +void drawSource(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { if (idx < MIXSRC_THR) lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx, att); else if (idx < MIXSRC_SW1) - putsSwitches(x, y, idx-MIXSRC_THR+1+3*(1), att); + drawSwitch(x, y, idx-MIXSRC_THR+1+3*(1), att); else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) - putsSwitches(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); + drawSwitch(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); else if (idx < MIXSRC_CH1) drawStringWithIndex(x, y, STR_PPM_TRAINER, idx-MIXSRC_FIRST_TRAINER+1, att); else if (idx <= MIXSRC_LAST_CH) { @@ -666,7 +874,7 @@ void putsMixerSource(coord_t x, coord_t y, uint8_t idx, LcdFlags att) drawStringWithIndex(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); #endif else if (idx < MIXSRC_FIRST_TELEM) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-(MIXSRC_SW1-MIXSRC_THR)-NUM_LOGICAL_SWITCH-NUM_TRAINER-NUM_CHNOUT-MAX_GVARS, att); + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-(MIXSRC_SW1-MIXSRC_THR)-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); } #if defined(CPUARM) else { @@ -680,6 +888,7 @@ void putsMixerSource(coord_t x, coord_t y, uint8_t idx, LcdFlags att) lcdDrawTextAtIndex(x, y, STR_VTELEMCHNS, idx-MIXSRC_FIRST_TELEM+1, att); #endif } +#endif void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { @@ -698,7 +907,15 @@ void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) } } -void putsSwitches(coord_t x, coord_t y, int8_t idx, LcdFlags att) +#if defined(CPUARM) +void drawSwitch(coord_t x, coord_t y, swsrc_t idx, LcdFlags flags) +{ + char s[8]; + getSwitchString(s, idx); + lcdDrawText(x, y, s, flags); +} +#else +void drawSwitch(coord_t x, coord_t y, swsrc_t idx, LcdFlags att) { if (idx == SWSRC_OFF) return lcdDrawTextAtIndex(x, y, STR_OFFON, 0, att); @@ -713,17 +930,6 @@ void putsSwitches(coord_t x, coord_t y, int8_t idx, LcdFlags att) #endif return lcdDrawTextAtIndex(x, y, STR_VSWITCHES, idx, att); } - -#if defined(FLIGHT_MODES) -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att) -{ - if (idx==0) { lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, att); return; } - if (idx < 0) { lcdDrawChar(x-2, y, '!', att); idx = -idx; } - if (att & CONDENSED) - lcdDrawNumber(x+FW*1, y, idx-1, (att & ~CONDENSED), 1); - else - drawStringWithIndex(x, y, STR_FP, idx-1, att); -} #endif void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att) @@ -738,7 +944,7 @@ void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att) drawStringWithIndex(x, y, STR_CV, idx-CURVE_BASE+1, att); } -void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) +void drawTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) { if (mode >= 0) { if (mode < TMRMODE_COUNT) @@ -746,22 +952,52 @@ void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) else mode -= (TMRMODE_COUNT-1); } - putsSwitches(x, y, mode, att); + drawSwitch(x, y, mode, att); } -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) +#if defined(CPUARM) +void drawTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att) { - trim_t v = getRawTrimValue(phase, idx); + trim_t v = getRawTrimValue(fm, idx); + uint8_t mode = v.mode; + uint8_t p = mode >> 1; + char s[] = "--"; + if (mode != TRIM_MODE_NONE) { + if (mode % 2 == 0) + s[0] = ':'; + else + s[0] = '+'; + s[1] = '0'+p; + } + lcdDrawText(x, y, s, att); +} +void drawShortTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att) +{ + trim_t v = getRawTrimValue(fm, idx); + uint8_t mode = v.mode; + uint8_t p = v.mode >> 1; + if (mode == TRIM_MODE_NONE) { + putsChnLetter(x, y, idx+1, att); + } + else { + lcdDrawChar(x, y, '0'+p, att); + } +} +#else +void drawTrimMode(coord_t x, coord_t y, uint8_t fm, uint8_t idx, LcdFlags att) +{ + trim_t v = getRawTrimValue(fm, idx); if (v > TRIM_EXTENDED_MAX) { uint8_t p = v - TRIM_EXTENDED_MAX - 1; - if (p >= phase) p++; + if (p >= fm) p++; lcdDrawChar(x, y, '0'+p, att); } else { putsChnLetter(x, y, idx+1, att); } } +#endif #if ROTARY_ENCODERS > 0 void putsRotaryEncoderMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) @@ -870,7 +1106,7 @@ void displayGpsCoords(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFl void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, lcdint_t value, LcdFlags att) { - if (channel >= MAX_SENSORS) return; + if (channel >= MAX_TELEMETRY_SENSORS) return; TelemetryItem & telemetryItem = telemetryItems[channel]; TelemetrySensor & telemetrySensor = g_model.telemetrySensors[channel]; if (telemetrySensor.unit == UNIT_DATETIME) { @@ -896,7 +1132,7 @@ void putsChannelValue(coord_t x, coord_t y, source_t channel, lcdint_t value, Lc putsTelemetryChannelValue(x, y, channel, value, att); } else if (channel >= MIXSRC_FIRST_TIMER || channel == MIXSRC_TX_TIME) { - putsTimer(x, y, value, att, att); + drawTimer(x, y, value, att, att); } else if (channel == MIXSRC_TX_VOLTAGE) { lcdDrawNumber(x, y, value, att|PREC1); @@ -941,10 +1177,8 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, lcdint_t v switch (channel) { #if defined(CPUARM) && defined(RTCLOCK) case TELEM_TX_TIME-1: - { - putsRtcTime(x, y, att); + drawRtcTime(x, y, att); break; - } #endif case TELEM_TIMER1-1: case TELEM_TIMER2-1: @@ -952,7 +1186,7 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, lcdint_t v case TELEM_TIMER3-1: #endif att &= ~NO_UNIT; - putsTimer(x, y, val, att, att); + drawTimer(x, y, val, att, att); break; #if defined(TELEMETRY_FRSKY) case TELEM_MIN_A1-1: @@ -1080,7 +1314,7 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, lcdint_t v case TELEM_TIMER1-1: case TELEM_TIMER2-1: att &= ~NO_UNIT; - putsTimer(x, y, val, att, att); + drawTimer(x, y, val, att, att); break; case TELEM_TX_VOLTAGE-1: @@ -1251,44 +1485,6 @@ void lcdDrawChar(coord_t x, uint8_t y, const unsigned char c, LcdFlags flags) } #endif -void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att) -{ - ASSERT_IN_DISPLAY(p); - - if (att & FORCE) - *p |= mask; - else if (att & ERASE) - *p &= ~mask; - else - *p ^= mask; -} - -void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att) -{ - uint8_t *p = &displayBuf[ y / 8 * LCD_W + x ]; - if (p= LCD_H) return; - if (x+w > LCD_W) { w = LCD_W - x; } - - uint8_t *p = &displayBuf[ y / 8 * LCD_W + x ]; - uint8_t msk = BITMASK(y%8); - while (w--) { - if(pat&1) { - lcdMaskPoint(p, msk, att); - pat = (pat >> 1) | 0x80; - } - else { - pat = pat >> 1; - } - p++; - } -} - #if defined(CPUM64) void lcdDrawVerticalLine(coord_t x, int8_t y, int8_t h, uint8_t pat) { @@ -1323,6 +1519,84 @@ void lcdDrawVerticalLine(coord_t x, int8_t y, int8_t h, uint8_t pat) } #else // allows the att parameter... + +#endif + +#define LCD_IMG_FUNCTION(NAME, TYPE, READ_BYTE) \ +void NAME(coord_t x, coord_t y, TYPE img, uint8_t idx, LcdFlags att) \ +{ \ + TYPE q = img; \ + uint8_t w = READ_BYTE(q++); \ + uint8_t hb = (READ_BYTE(q++)+7)/8; \ + bool inv = (att & INVERS) ? true : (att & BLINK ? BLINK_ON_PHASE : false); \ + q += idx*w*hb; \ + for (uint8_t yb = 0; yb < hb; yb++) { \ + uint8_t *p = &displayBuf[ (y / 8 + yb) * LCD_W + x ]; \ + for (coord_t i=0; i= LCD_H) return; + if (x+w > LCD_W) { w = LCD_W - x; } + + uint8_t *p = &displayBuf[ y / 8 * LCD_W + x ]; + uint8_t msk = BITMASK(y%8); + while (w--) { + if(pat&1) { + lcdMaskPoint(p, msk, att); + pat = (pat >> 1) | 0x80; + } + else { + pat = pat >> 1; + } + p++; + } +} + void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlags att) { if (x >= LCD_W) return; @@ -1360,40 +1634,17 @@ void lcdDrawVerticalLine(coord_t x, scoord_t y, scoord_t h, uint8_t pat, LcdFlag lcdMaskPoint(p, (BITMASK(h)-1) & pat, att); } } -#endif -void lcdInvertLine(int8_t y) +#if defined(PWR_PRESS_BUTTON) +void drawShutdownAnimation(uint32_t index) { - uint8_t *p = &displayBuf[y * LCD_W]; - for (coord_t x=0; x= i) { + lcdDrawFilledRect(LCD_W / 2 - 28 + 10 * i, LCD_H / 2 - 3, 6, 6, SOLID, 0); + } } + lcdRefresh(); } - -#define LCD_IMG_FUNCTION(NAME, TYPE, READ_BYTE) \ -void NAME(coord_t x, coord_t y, TYPE img, uint8_t idx, LcdFlags att) \ -{ \ - TYPE q = img; \ - uint8_t w = READ_BYTE(q++); \ - uint8_t hb = (READ_BYTE(q++)+7)/8; \ - bool inv = (att & INVERS) ? true : (att & BLINK ? BLINK_ON_PHASE : false); \ - q += idx*w*hb; \ - for (uint8_t yb = 0; yb < hb; yb++) { \ - uint8_t *p = &displayBuf[ (y / 8 + yb) * LCD_W + x ]; \ - for (coord_t i=0; i -#define LCD_W 128 -#define LCD_H 64 -#define BOX_WIDTH 23 -#define coord_t uint8_t -#define scoord_t int8_t +#define BOX_WIDTH 23 +#define coord_t uint8_t +#define scoord_t int8_t #define CENTER -#define CENTER_OFS 0 -#define CONTRAST_MIN 10 -#define CONTRAST_MAX 45 +#define CENTER_OFS 0 +#define CONTRAST_MIN 10 +#define CONTRAST_MAX 45 #if defined(CPUARM) - #define lcdint_t int32_t - #define lcduint_t uint32_t + typedef int32_t lcdint_t; + typedef uint32_t lcduint_t; #else - #define lcdint_t int16_t - #define lcduint_t uint16_t + typedef int16_t lcdint_t; + typedef uint16_t lcduint_t; #endif -#define FW 6 -#define FWNUM 5 -#define FH 8 +#define FW 6 +#define FWNUM 5 +#define FH 8 -#define LCD_LINES (LCD_H/FH) -#define LCD_COLS (LCD_W/FW) +#define LCD_LINES (LCD_H/FH) +#define LCD_COLS (LCD_W/FW) /* lcd common flags */ -#define BLINK 0x01 +#define BLINK 0x01 /* lcd text flags */ -#define INVERS 0x02 +#define INVERS 0x02 #if defined(BOLD_FONT) - #define BOLD 0x40 + #define BOLD 0x40 #else - #define BOLD 0x00 + #define BOLD 0x00 #endif /* lcd putc flags */ -#define CONDENSED 0x08 -#define FIXEDWIDTH 0x10 +#define CONDENSED 0x08 +#define FIXEDWIDTH 0x10 /* lcd puts flags */ /* no 0x80 here because of "GV"1 which is aligned LEFT */ /* no 0x10 here because of "MODEL"01 which uses LEADING0 */ #if defined(CPUARM) - #define BSS 0x00 + #define BSS 0x00 #else - #define BSS 0x20 + #define BSS 0x20 #endif -#define ZCHAR 0x80 +#define ZCHAR 0x80 /* lcd outdez flags */ -#define UNSIGN 0x08 -#define LEADING0 0x10 -#define PREC1 0x20 -#define PREC2 0x30 -#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) -#define LEFT 0x80 /* align left */ -#define RIGHT 0x00 /* fake */ +#define UNSIGN 0x08 +#define LEADING0 0x10 +#define PREC1 0x20 +#define PREC2 0x30 +#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) +#if defined(CPUARM) +#define LEFT 0x00 /* fake */ +#define RIGHT 0x04 /* align right */ +#define IS_LEFT_ALIGNED(att) !((att) & RIGHT) +#else +#define LEFT 0x80 /* align left */ +#define RIGHT 0x00 /* fake */ +#define IS_LEFT_ALIGNED(att) ((att) & LEFT) +#endif +#define IS_RIGHT_ALIGNED(att) (!IS_LEFT_ALIGNED(att)) /* line, rect, square flags */ -#define FORCE 0x02 -#define ERASE 0x04 -#define ROUND 0x08 +#define FORCE 0x02 +#define ERASE 0x04 +#define ROUND 0x08 /* telemetry flags */ -#define NO_UNIT 0x40 +#define NO_UNIT 0x40 #if defined(CPUARM) - #define FONTSIZE(x) ((x) & 0x0700) - #define TINSIZE 0x0100 - #define SMLSIZE 0x0200 - #define MIDSIZE 0x0300 - #define DBLSIZE 0x0400 - #define XXLSIZE 0x0500 - #define ERASEBG 0x8000 - #define VERTICAL 0x0800 + #define FONTSIZE(x) ((x) & 0x0700) + #define TINSIZE 0x0100 + #define SMLSIZE 0x0200 + #define MIDSIZE 0x0300 + #define DBLSIZE 0x0400 + #define XXLSIZE 0x0500 + #define ERASEBG 0x8000 + #define VERTICAL 0x0800 #else - #define DBLSIZE 0x04 - #define MIDSIZE DBLSIZE - #define SMLSIZE 0x00 - #define TINSIZE 0x00 - #define XXLSIZE 0x00 - #define ERASEBG 0x00 + #define DBLSIZE 0x04 + #define MIDSIZE DBLSIZE + #define SMLSIZE 0x00 + #define TINSIZE 0x00 + #define XXLSIZE 0x00 + #define ERASEBG 0x00 #endif #if defined(CPUARM) - #define TIMEBLINK 0x1000 - #define TIMEHOUR 0x2000 - #define STREXPANDED 0x4000 + #define TIMEBLINK 0x1000 + #define TIMEHOUR 0x2000 + #define STREXPANDED 0x4000 #else - #define STREXPANDED 0x00 + #define STREXPANDED 0x00 #endif #if defined(CPUARM) - #define LcdFlags uint32_t + typedef uint32_t LcdFlags; #else - #define LcdFlags uint8_t + typedef uint8_t LcdFlags; #endif -#define display_t uint8_t -#define DISPLAY_BUFFER_SIZE (LCD_W*((LCD_H+7)/8)) +#define display_t uint8_t +#define DISPLAY_BUFFER_SIZE (LCD_W*((LCD_H+7)/8)) extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; -#define lcdRefreshWait() - extern coord_t lcdLastPos; extern coord_t lcdNextPos; -#define DISPLAY_END (displayBuf + DISPLAY_BUFFER_SIZE) -#define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) +#define DISPLAY_END (displayBuf + DISPLAY_BUFFER_SIZE) +#define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) #if defined(PCBSTD) && defined(VOICE) extern volatile uint8_t LcdLock ; @@ -170,19 +174,27 @@ void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode, uint8_t le void lcdDrawNumber(coord_t x, coord_t y, lcdint_t val, LcdFlags mode=0); void lcdDraw8bitsNumber(coord_t x, coord_t y, int8_t val); -void drawStringWithIndex(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att=0); -void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); -void putsSwitches(coord_t x, coord_t y, int8_t swtch, LcdFlags att=0); -void putsMixerSource(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); +void drawStringWithIndex(coord_t x, coord_t y, const pm_char * str, uint8_t idx, LcdFlags att=0); +void putsModelName(coord_t x, coord_t y, char * name, uint8_t id, LcdFlags att); +#if !defined(BOOT) // TODO not here ... +void drawSwitch(coord_t x, coord_t y, swsrc_t swtch, LcdFlags att=0); +void drawSource(coord_t x, coord_t y, mixsrc_t idx, LcdFlags att=0); +#endif void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); +void drawTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); + +void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); +#if defined(CPUARM) +void drawShortTrimMode(coord_t x, coord_t y, uint8_t mode, uint8_t idx, LcdFlags att); +#else +#define drawShortTrimMode drawTrimMode +#endif + #if defined(ROTARY_ENCODERS) void putsRotaryEncoderMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); #endif -#define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att) +#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); @@ -202,11 +214,11 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, lcdint_t v #define FlightModesType uint8_t #endif -void putsRtcTime(coord_t x, coord_t y, LcdFlags att); -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); +void drawRtcTime(coord_t x, coord_t y, LcdFlags att); +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); -#define SOLID 0xff -#define DOTTED 0x55 +#define SOLID 0xff +#define DOTTED 0x55 void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att=0); @@ -230,7 +242,7 @@ void lcdInvertLine(int8_t line); #define lcdInvertLastLine() lcdInvertLine(LCD_LINES-1) inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) { lcdDrawRect(x, y, w, w, SOLID, att); } -void lcdDrawTelemetryTopBar(); +void drawTelemetryTopBar(); #define V_BAR(xx, yy, ll) \ lcdDrawSolidVerticalLine(xx-1,yy-ll,ll); \ @@ -241,33 +253,26 @@ void lcdDrawTelemetryTopBar(); void lcd_imgfar(coord_t x, coord_t y, const uint_farptr_t img, uint8_t idx, LcdFlags att); // progmem "far" #endif +void lcdClear(void); void lcd_img(coord_t x, coord_t y, const pm_uchar * img, uint8_t idx, LcdFlags att=0); -void lcdSetRefVolt(unsigned char val); -void lcdClear(); -void lcdSetContrast(); -void lcdInit(); -#define lcdOff() - -void lcdRefresh(); - -#if defined(LCD_KS108) -void lcdRefreshSide(); -#endif - -#if defined(LCD_ST7920) -uint8_t lcdRefresh_ST7920(uint8_t full); -#define IS_LCD_REFRESH_ALLOWED() (0==lcdstate) -#else -#define IS_LCD_REFRESH_ALLOWED() (1) -#endif - #if defined(BOOT) - #define BLINK_ON_PHASE (0) + #define BLINK_ON_PHASE (0) #else - #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6)) + #define BLINK_ON_PHASE (g_blinkTmr10ms & (1<<6)) #endif +inline display_t getPixel(uint8_t x, uint8_t y) +{ + if (x>=LCD_W || y>=LCD_H) { + return 0; + } + + display_t * p = &displayBuf[y / 2 * LCD_W + x]; + return (y & 1) ? (*p >> 4) : (*p & 0x0F); +} const char * writeScreenshot(); +void drawShutdownAnimation(uint32_t index); + #endif // _LCD_H_ diff --git a/radio/src/gui/128x64/menu_model.cpp b/radio/src/gui/128x64/menu_model.cpp index 81d2591bd9..41ab99ca11 100644 --- a/radio/src/gui/128x64/menu_model.cpp +++ b/radio/src/gui/128x64/menu_model.cpp @@ -35,14 +35,107 @@ uint8_t editDelay(const coord_t y, const uint8_t event, const uint8_t attr, cons uint8_t s_copyMode = 0; int8_t s_copySrcRow; int8_t s_copyTgtOfs; +uint8_t s_maxLines = 8; +uint8_t s_copySrcIdx; +uint8_t s_copySrcCh; #if defined(CPUM64) #define editNameCursorPos menuHorizontalPosition #else - static uint8_t editNameCursorPos = 0; + uint8_t editNameCursorPos = 0; #endif -void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active) +#if defined(PCBX7D) +void editName(coord_t x, coord_t y, char * name, uint8_t size, uint8_t event, uint8_t active/* TODO, uint8_t attr*/) +{ + LcdFlags attr = ZCHAR; // TODO in args + uint8_t mode = 0; + if (active) { + if (s_editMode <= 0) + mode = INVERS + FIXEDWIDTH; + else + mode = FIXEDWIDTH; + } + + lcdDrawSizedText(x, y, name, size, attr | mode); + coord_t backupNextPos = lcdNextPos; + + if (active) { + uint8_t cur = editNameCursorPos; + if (s_editMode > 0) { + int8_t c = name[cur]; + int8_t v = c; + + if (event==EVT_KEY_FIRST(KEY_DOWN) || event==EVT_KEY_FIRST(KEY_UP) || event==EVT_KEY_REPT(KEY_DOWN) || event==EVT_KEY_REPT(KEY_UP)) { + if (attr == ZCHAR) { + v = checkIncDec(event, abs(v), 0, ZCHAR_MAX, 0); + if (c <= 0) v = -v; + } + else { + v = checkIncDec(event, abs(v), '0', 'z', 0); + } + + } + + switch (event) { + case EVT_ROTARY_BREAK: + if (s_editMode == EDIT_MODIFY_FIELD) { + s_editMode = EDIT_MODIFY_STRING; + cur = 0; + } + else if (cur=-26 && v<=26) { + v = -v; // toggle case + } + } + else { + if (v == ' ') { + s_editMode = 0; + killEvents(event); + break; + } + else if (v>='A' && v<='Z') { + v = 'a'+v-'A'; // toggle case + } + else if (v>='a' && v<='z') { + v = 'A'+v-'a'; // toggle case + } + } + break; + } + + if (c != v) { + name[cur] = v; + storageDirty(menuVerticalPositions[0] == 0 ? EE_MODEL : EE_GENERAL); + } + + if (attr == ZCHAR) { + lcdDrawChar(x+editNameCursorPos*FW, y, idx2char(v), ERASEBG|INVERS|FIXEDWIDTH); + } + else { + lcdDrawChar(x+editNameCursorPos*FW, y, v, ERASEBG|INVERS|FIXEDWIDTH); + } + } + else { + cur = 0; + } + editNameCursorPos = cur; + lcdNextPos = backupNextPos; + } +} +#else +void editName(coord_t x, coord_t y, char * name, uint8_t size, uint8_t event, uint8_t active) { #if defined(CPUM64) // in order to save flash @@ -94,7 +187,7 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_LONG: - if (v==0) { + if (v == 0) { s_editMode = 0; killEvents(event); break; @@ -125,9 +218,10 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin editNameCursorPos = cur; } } +#endif #if !defined(CPUM64) -void editSingleName(coord_t x, coord_t y, const pm_char *label, char *name, uint8_t size, uint8_t event, uint8_t active) +void editSingleName(coord_t x, coord_t y, const pm_char * label, char * name, uint8_t size, uint8_t event, uint8_t active) { lcdDrawTextAlignedLeft(y, label); editName(x, y, name, size, event, active); diff --git a/radio/src/gui/128x64/menu_radio.cpp b/radio/src/gui/128x64/menu_radio.cpp index 898b096258..b069cb69d6 100644 --- a/radio/src/gui/128x64/menu_radio.cpp +++ b/radio/src/gui/128x64/menu_radio.cpp @@ -23,7 +23,7 @@ #if defined(CPUARM) void menuRadioSpecialFunctions(uint8_t event) { - MENU(STR_MENUSPECIALFUNCS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, NUM_CFN+1, {0, NAVIGATION_LINE_BY_LINE|4/*repeated*/}); + MENU(STR_MENUSPECIALFUNCS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, HEADER_LINE+MAX_SPECIAL_FUNCTIONS, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); return menuSpecialFunctions(event, g_eeGeneral.customFn, &globalFunctionsContext); } #endif diff --git a/radio/src/gui/128x64/menus.h b/radio/src/gui/128x64/menus.h index 28e8ffc394..8572e17ae7 100644 --- a/radio/src/gui/128x64/menus.h +++ b/radio/src/gui/128x64/menus.h @@ -23,64 +23,53 @@ #include "keys.h" -#define MENUS_SCROLLBAR_WIDTH 0 -#define MENU_COLUMNS 1 -#define COLUMN_X 0 -#define drawFieldLabel(x, y, str) lcdDrawTextAlignedLeft(y, str) - -// Menus related stuff ... -#if defined(SDCARD) - typedef uint16_t vertpos_t; +#if defined(PCBX7D) +typedef int8_t horzpos_t; +#define NAVIGATION_LINE_BY_LINE 0x40 +#define IS_LINE_SELECTED(sub, k) ((sub)==(k) && menuHorizontalPosition < 0) #else - typedef uint8_t vertpos_t; +typedef uint8_t horzpos_t; +#define NAVIGATION_LINE_BY_LINE 0 +#define IS_LINE_SELECTED(sub, k) (false) #endif -#define horzpos_t uint8_t +#if defined(SDCARD) +typedef uint16_t vertpos_t; +#else +typedef uint8_t vertpos_t; +#endif + +typedef void (*MenuHandlerFunc)(uint8_t event); #if defined(CPUARM) - extern tmr10ms_t menuEntryTime; +extern tmr10ms_t menuEntryTime; #endif extern vertpos_t menuVerticalPosition; extern horzpos_t menuHorizontalPosition; extern vertpos_t menuVerticalOffset; -extern uint8_t calibrationState; - -// Temporary no highlight -extern uint8_t noHighlightCounter; -#define NO_HIGHLIGHT() (noHighlightCounter > 0) -#define START_NO_HIGHLIGHT() do { noHighlightCounter = 25; } while(0) - -void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr); - -typedef void (* MenuHandlerFunc)(uint8_t event); +extern uint8_t menuCalibrationState; extern MenuHandlerFunc menuHandlers[5]; extern uint8_t menuVerticalPositions[4]; extern uint8_t menuLevel; extern uint8_t menuEvent; -/// goto given Menu, but substitute current menu in menuStack void chainMenu(MenuHandlerFunc newMenu); -/// goto given Menu, store current menu in menuStack void pushMenu(MenuHandlerFunc newMenu); -/// return to last menu in menustack void popMenu(); -///deliver address of last menu which was popped from + inline MenuHandlerFunc lastPopMenu() { return menuHandlers[menuLevel+1]; } -void drawPotsBars(); -void doMainScreenGraphics(); -void menuFirstCalib(uint8_t event); - void onMainViewMenu(const char * result); + +void menuFirstCalib(uint8_t event); void menuMainView(uint8_t event); void menuViewTelemetryFrsky(uint8_t event); void menuViewTelemetryMavlink(uint8_t event); - void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext); enum MenuRadioIndexes @@ -90,9 +79,9 @@ enum MenuRadioIndexes CASE_CPUARM(MENU_RADIO_SPECIAL_FUNCTIONS) MENU_RADIO_TRAINER, MENU_RADIO_VERSION, - MENU_RADIO_DIAG_KEYS, - MENU_RADIO_DIAG_ANALOGS, - CASE_CPUARM(MENU_RADIO_HARDWARE) + MENU_RADIO_SWITCHES_TEST, + MENU_RADIO_ANALOGS_TEST, + CASE_PCBSKY9X(MENU_RADIO_HARDWARE) MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT }; @@ -115,11 +104,11 @@ static const MenuHandlerFunc menuTabGeneral[] PROGMEM = { menuRadioVersion, menuRadioDiagKeys, menuRadioDiagAnalogs, - CASE_CPUARM(menuRadioHardware) + CASE_PCBSKY9X(menuRadioHardware) menuRadioCalibration }; -enum EnumTabModel { +enum MenuModelIndexes { MENU_MODEL_SELECT, MENU_MODEL_SETUP, CASE_HELI(MENU_MODEL_HELI) @@ -132,6 +121,7 @@ enum EnumTabModel { MENU_MODEL_SPECIAL_FUNCTIONS, CASE_FRSKY(MENU_MODEL_TELEMETRY_FRSKY) CASE_MAVLINK(MENU_MODEL_TELEMETRY_MAVLINK) + CASE_CPUARM(MENU_MODEL_DISPLAY) CASE_TEMPLATES(MENU_MODEL_TEMPLATES) MENU_MODEL_PAGES_COUNT }; @@ -150,6 +140,7 @@ void menuModelLogicalSwitches(uint8_t event); void menuModelSpecialFunctions(uint8_t event); void menuModelTelemetryFrsky(uint8_t event); void menuModelTelemetryMavlink(uint8_t event); +void menuModelDisplay(uint8_t event); void menuModelTemplates(uint8_t event); void menuModelExpoOne(uint8_t event); @@ -166,404 +157,16 @@ static const MenuHandlerFunc menuTabModel[] PROGMEM = { menuModelSpecialFunctions, CASE_FRSKY(menuModelTelemetryFrsky) CASE_MAVLINK(menuModelTelemetryMavlink) + CASE_CPUARM(menuModelDisplay) CASE_TEMPLATES(menuModelTemplates) }; void menuStatisticsView(uint8_t event); void menuStatisticsDebug(uint8_t event); void menuAboutView(uint8_t event); + #if defined(DEBUG_TRACE_BUFFER) void menuTraceBuffer(uint8_t event); #endif -#if !defined(CPUM64) - void drawSlider(coord_t x, coord_t y, uint8_t value, uint8_t max, uint8_t attr); -#elif defined(GRAPHICS) - void display5posSlider(coord_t x, coord_t y, uint8_t value, uint8_t attr); - #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) -#else - #define drawSlider(x, y, value, max, attr) lcdDrawNumber(x, y, value, attr|LEFT) -#endif - -#if defined(NAVIGATION_POT1) - extern int16_t p1valdiff; -#else - #define p1valdiff 0 -#endif - -#if defined(NAVIGATION_POT2) - extern int8_t p2valdiff; -#else - #define p2valdiff 0 -#endif - -extern int8_t checkIncDec_Ret; // global helper vars - -#define EDIT_SELECT_MENU -1 -#define EDIT_SELECT_FIELD 0 -#define EDIT_MODIFY_FIELD 1 -#define EDIT_MODIFY_STRING 2 -extern int8_t s_editMode; // global editmode - -// checkIncDec flags -#define EE_GENERAL 0x01 -#define EE_MODEL 0x02 -#define NO_INCDEC_MARKS 0x04 -#define INCDEC_SWITCH 0x08 -#define INCDEC_SOURCE 0x10 -#define INCDEC_REP10 0x40 -#define NO_DBLKEYS 0x80 - -#if defined(CPUARM) - #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f); IsValueAvailable isValueAvailable = NULL - #define INCDEC_SET_FLAG(f) incdecFlag = (f) - #define INCDEC_ENABLE_CHECK(fn) isValueAvailable = fn - #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag, isValueAvailable) -#elif defined(CPUM64) - #define INCDEC_DECLARE_VARS(f) - #define INCDEC_SET_FLAG(f) - #define INCDEC_ENABLE_CHECK(fn) - #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, EE_MODEL) -#else - #define INCDEC_DECLARE_VARS(f) uint8_t incdecFlag = (f) - #define INCDEC_SET_FLAG(f) incdecFlag = (f) - #define INCDEC_ENABLE_CHECK(fn) - #define CHECK_INCDEC_PARAM(event, var, min, max) checkIncDec(event, var, min, max, incdecFlag) -#endif - -// mawrow special values -#define TITLE_ROW ((uint8_t)-1) -#define HIDDEN_ROW ((uint8_t)-2) - -#if defined(CPUARM) -struct CheckIncDecStops { - const int count; - const int stops[]; - int min() const - { - return stops[0]; - } - int max() const - { - return stops[count-1]; - } - bool contains(int value) const - { - for (int i=0; i= 0x0e) - #define CASE_EVT_ROTARY_BREAK case EVT_ROTARY_BREAK: - #define CASE_EVT_ROTARY_LONG case EVT_ROTARY_LONG: - #define CASE_EVT_ROTARY_LEFT case EVT_ROTARY_LEFT: - #define CASE_EVT_ROTARY_RIGHT case EVT_ROTARY_RIGHT: - void repeatLastCursorMove(uint8_t event); - #define REPEAT_LAST_CURSOR_MOVE() { if (EVT_KEY_MASK(event) >= 0x0e) putEvent(event); else repeatLastCursorMove(event); } - #define MOVE_CURSOR_FROM_HERE() if (menuHorizontalPosition > 0) REPEAT_LAST_CURSOR_MOVE() -#else - #define IS_ROTARY_LEFT(evt) (0) - #define IS_ROTARY_RIGHT(evt) (0) - #define IS_ROTARY_BREAK(evt) (0) - #define IS_ROTARY_LONG(evt) (0) - #define IS_ROTARY_EVENT(evt) (0) - #define CASE_EVT_ROTARY_BREAK - #define CASE_EVT_ROTARY_LONG - #define CASE_EVT_ROTARY_LEFT - #define CASE_EVT_ROTARY_RIGHT - void repeatLastCursorMove(uint8_t event); - #define REPEAT_LAST_CURSOR_MOVE() repeatLastCursorMove(event) - #define MOVE_CURSOR_FROM_HERE() REPEAT_LAST_CURSOR_MOVE() -#endif - -#define POS_HORZ_INIT(posVert) 0 -#define EDIT_MODE_INIT -1 - -typedef int16_t (*FnFuncP) (int16_t x); -void drawFunction(FnFuncP fn, uint8_t offset=0); - -uint8_t switchToMix(uint8_t source); - -void deleteExpoMix(uint8_t expo, uint8_t idx); - #endif // _MENUS_H_ diff --git a/radio/src/gui/128x64/model_curves.cpp b/radio/src/gui/128x64/model_curve_simple_edit.cpp similarity index 57% rename from radio/src/gui/128x64/model_curves.cpp rename to radio/src/gui/128x64/model_curve_simple_edit.cpp index ed092419b2..d60901a97b 100644 --- a/radio/src/gui/128x64/model_curves.cpp +++ b/radio/src/gui/128x64/model_curve_simple_edit.cpp @@ -2,7 +2,7 @@ * Copyright (C) OpenTX * * Based on code named - * th9x - http://code.google.com/p/th9x + * th9x - http://code.google.com/p/th9x * er9x - http://code.google.com/p/er9x * gruvin9x - http://code.google.com/p/gruvin9x * @@ -20,73 +20,6 @@ #include "opentx.h" -uint8_t s_curveChan; - -int16_t curveFn(int16_t x) -{ - return applyCustomCurve(x, s_curveChan); -} - -struct point_t { - coord_t x; - coord_t y; -}; - -point_t getPoint(uint8_t i) -{ - point_t result = {0, 0}; - CurveInfo crv = curveInfo(s_curveChan); - int8_t *points = crv.crv; - bool custom = crv.custom; - uint8_t count = crv.points; - if (i < count) { - result.x = X0-1-WCHART+i*WCHART/(count/2); - result.y = (LCD_H-1) - (100 + points[i]) * (LCD_H-1) / 200; - if (custom && i>0 && i NUM_POINTS-5*MAX_CURVES) { - AUDIO_WARNING2(); - return false; - } - - int8_t *crv = curveAddress(index); - if (shift < 0) { - for (uint8_t i=0; i 4) @@ -118,6 +53,7 @@ void menuModelCurveOne(uint8_t event) killEvents(event); } break; + case EVT_KEY_BREAK(KEY_EXIT): if (s_editMode > 0) { if (--s_editMode == 0) @@ -136,7 +72,7 @@ void menuModelCurveOne(uint8_t event) if (crv.custom) { moveCurve(s_curveChan, -crv.points+2); } - else if (crv.points > MIN_POINTS) { + else if (crv.points > MIN_POINTS_PER_CURVE) { moveCurve(s_curveChan, -1, (crv.points+1)/2); } else { @@ -154,7 +90,7 @@ void menuModelCurveOne(uint8_t event) if (!crv.custom) { moveCurve(s_curveChan, crv.points-2, crv.points); } - else if (crv.points < MAX_POINTS) { + else if (crv.points < MAX_POINTS_PER_CURVE) { if (moveCurve(s_curveChan, 1)) { for (int8_t i=crv.points+crv.points-2; i>=0; i--) { if (i%2) @@ -176,7 +112,7 @@ void menuModelCurveOne(uint8_t event) lcdDrawNumber(5*FW-2, 7*FH, crv.points, LEFT|attr); lcdDrawText(lcdLastPos, 7*FH, crv.custom ? PSTR("pt'") : PSTR("pt"), attr); - DrawCurve(); + drawCurve(); if (s_editMode>0) { uint8_t i = menuHorizontalPosition; @@ -201,59 +137,3 @@ void menuModelCurveOne(uint8_t event) CHECK_INCDEC_MODELVAR(event, crv.crv[crv.points+i-1], i==1 ? -99 : crv.crv[crv.points+i-2]+1, i==crv.points-2 ? 99 : crv.crv[crv.points+i]-1); // edit X on left/right } } - -#if defined(GVARS) - #define CURVE_SELECTED() (sub >= 0 && sub < MAX_CURVES) - #define GVAR_SELECTED() (sub >= MAX_CURVES) -#else - #define CURVE_SELECTED() (sub >= 0) -#endif - -void menuModelCurvesAll(uint8_t event) -{ -#if defined(GVARS) && defined(PCBSTD) - SIMPLE_MENU(STR_MENUCURVES, menuTabModel, MENU_MODEL_CURVES, 1+MAX_CURVES+MAX_GVARS); -#else - SIMPLE_MENU(STR_MENUCURVES, menuTabModel, MENU_MODEL_CURVES, 1+MAX_CURVES); -#endif - - int8_t sub = menuVerticalPosition - 1; - - switch (event) { -#if defined(ROTARY_ENCODER_NAVIGATION) - case EVT_ROTARY_BREAK: -#endif - case EVT_KEY_FIRST(KEY_RIGHT): - case EVT_KEY_FIRST(KEY_ENTER): - if (CURVE_SELECTED() && !READ_ONLY()) { - s_curveChan = sub; - pushMenu(menuModelCurveOne); - } - break; - } - - for (uint8_t i=0; i= MAX_CURVES) { - drawStringWithIndex(0, y, STR_GV, k-MAX_CURVES+1); - if (GVAR_SELECTED()) { - if (attr && s_editMode>0) attr |= BLINK; - lcdDrawNumber(10*FW, y, GVAR_VALUE(k-MAX_CURVES, -1), attr); - if (attr) g_model.gvars[k-MAX_CURVES] = checkIncDec(event, g_model.gvars[k-MAX_CURVES], -1000, 1000, EE_MODEL); - } - } - else -#endif - { - drawStringWithIndex(0, y, STR_CV, k+1, attr); - } - } - - if (CURVE_SELECTED()) { - s_curveChan = sub; - DrawCurve(23); - } -} diff --git a/radio/src/gui/128x64/model_display.cpp b/radio/src/gui/128x64/model_display.cpp new file mode 100644 index 0000000000..6ee6055695 --- /dev/null +++ b/radio/src/gui/128x64/model_display.cpp @@ -0,0 +1,241 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +enum MenuModelDisplayItems { + ITEM_DISPLAY_SCREEN_LABEL1, + ITEM_DISPLAY_SCREEN_LINE1, + ITEM_DISPLAY_SCREEN_LINE2, + ITEM_DISPLAY_SCREEN_LINE3, + ITEM_DISPLAY_SCREEN_LINE4, + ITEM_DISPLAY_SCREEN_LABEL2, + ITEM_DISPLAY_SCREEN_LINE5, + ITEM_DISPLAY_SCREEN_LINE6, + ITEM_DISPLAY_SCREEN_LINE7, + ITEM_DISPLAY_SCREEN_LINE8, + ITEM_DISPLAY_SCREEN_LABEL3, + ITEM_DISPLAY_SCREEN_LINE9, + ITEM_DISPLAY_SCREEN_LINE10, + ITEM_DISPLAY_SCREEN_LINE11, + ITEM_DISPLAY_SCREEN_LINE12, + ITEM_DISPLAY_SCREEN_LABEL4, + ITEM_DISPLAY_SCREEN_LINE13, + ITEM_DISPLAY_SCREEN_LINE14, + ITEM_DISPLAY_SCREEN_LINE15, + ITEM_DISPLAY_SCREEN_LINE16, + ITEM_DISPLAY_MAX +}; + +#define DISPLAY_COL1 (1*FW) +#if defined(TRANSLATIONS_FR) || defined(TRANSLATIONS_CZ) + #define DISPLAY_COL2 (9*FW) +#else + #define DISPLAY_COL2 (8*FW) +#endif +#define DISPLAY_COL3 (18*FW+2) + +#if defined(LUA) + #define SCREEN_TYPE_ROWS 1 + #define DISPLAY_LINE_ROWS(x) ((TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE || TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_SCRIPT) ? HIDDEN_ROW : (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_GAUGES ? (uint8_t)2 : (uint8_t)1)) +#else + #define SCREEN_TYPE_ROWS 0 + #define DISPLAY_LINE_ROWS(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_GAUGES ? (uint8_t)2 : (uint8_t)1)) +#endif + +#define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, DISPLAY_LINE_ROWS(x), DISPLAY_LINE_ROWS(x), DISPLAY_LINE_ROWS(x), DISPLAY_LINE_ROWS(x) +#define TELEMETRY_CURRENT_SCREEN(k) (k < ITEM_DISPLAY_SCREEN_LABEL2 ? 0 : (k < ITEM_DISPLAY_SCREEN_LABEL3 ? 1 : (k < ITEM_DISPLAY_SCREEN_LABEL4 ? 2 : 3))) + +#if defined(LUA) +void onTelemetryScriptFileSelectionMenu(const char *result) +{ + int screenIndex = TELEMETRY_CURRENT_SCREEN(menuVerticalPosition - HEADER_LINE); + + if (result == STR_UPDATE_LIST) { + if (!sdListFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), NULL)) { + POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); + } + } + else { + // The user choosed a file in the list + memcpy(g_model.frsky.screens[screenIndex].script.file, result, sizeof(g_model.frsky.screens[screenIndex].script.file)); + storageDirty(EE_MODEL); + LUA_LOAD_MODEL_SCRIPTS(); + } +} +#endif + +void menuModelDisplay(uint8_t event) +{ + MENU(STR_MENU_DISPLAY, menuTabModel, MENU_MODEL_DISPLAY, HEADER_LINE + ITEM_DISPLAY_MAX, { HEADER_LINE_COLUMNS TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1), TELEMETRY_SCREEN_ROWS(2), TELEMETRY_SCREEN_ROWS(3) }); + + int8_t sub = menuVerticalPosition - HEADER_LINE; + + for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS); + LcdFlags attr = (sub == k ? blink : 0); + + switch (k) { + case ITEM_DISPLAY_SCREEN_LABEL1: + case ITEM_DISPLAY_SCREEN_LABEL2: + case ITEM_DISPLAY_SCREEN_LABEL3: + case ITEM_DISPLAY_SCREEN_LABEL4: + { + uint8_t screenIndex = TELEMETRY_CURRENT_SCREEN(k); + drawStringWithIndex(0*FW, y, STR_SCREEN, screenIndex+1); + TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex); + TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(DISPLAY_COL2, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (menuHorizontalPosition==0 ? attr : 0), event); + if (newScreenType != oldScreenType) { + g_model.frsky.screensType = (g_model.frsky.screensType & (~(0x03 << (2*screenIndex)))) | (newScreenType << (2*screenIndex)); + memset(&g_model.frsky.screens[screenIndex], 0, sizeof(g_model.frsky.screens[screenIndex])); + } +#if defined(LUA) + if (newScreenType == TELEMETRY_SCREEN_TYPE_SCRIPT) { + TelemetryScriptData & scriptData = g_model.frsky.screens[screenIndex].script; + + // TODO better function name for --- + // TODO function for these lines + if (ZEXIST(scriptData.file)) + lcdDrawSizedText(DISPLAY_COL2+7*FW, y, scriptData.file, sizeof(scriptData.file), (menuHorizontalPosition==1 ? attr : 0)); + else + lcdDrawTextAtIndex(DISPLAY_COL2+7*FW, y, STR_VCSWFUNC, 0, (menuHorizontalPosition==1 ? attr : 0)); + + if (menuHorizontalPosition==1 && attr && event==EVT_KEY_BREAK(KEY_ENTER) && READ_ONLY_UNLOCKED()) { + s_editMode = 0; + if (sdListFiles(SCRIPTS_TELEM_PATH, SCRIPTS_EXT, sizeof(g_model.frsky.screens[screenIndex].script.file), g_model.frsky.screens[screenIndex].script.file)) { + POPUP_MENU_START(onTelemetryScriptFileSelectionMenu); + } + else { + POPUP_WARNING(STR_NO_SCRIPTS_ON_SD); + } + } + } + else if (attr) { + MOVE_CURSOR_FROM_HERE(); + } +#endif + break; + } + + case ITEM_DISPLAY_SCREEN_LINE1: + case ITEM_DISPLAY_SCREEN_LINE2: + case ITEM_DISPLAY_SCREEN_LINE3: + case ITEM_DISPLAY_SCREEN_LINE4: + case ITEM_DISPLAY_SCREEN_LINE5: + case ITEM_DISPLAY_SCREEN_LINE6: + case ITEM_DISPLAY_SCREEN_LINE7: + case ITEM_DISPLAY_SCREEN_LINE8: + case ITEM_DISPLAY_SCREEN_LINE9: + case ITEM_DISPLAY_SCREEN_LINE10: + case ITEM_DISPLAY_SCREEN_LINE11: + case ITEM_DISPLAY_SCREEN_LINE12: + case ITEM_DISPLAY_SCREEN_LINE13: + case ITEM_DISPLAY_SCREEN_LINE14: + case ITEM_DISPLAY_SCREEN_LINE15: + case ITEM_DISPLAY_SCREEN_LINE16: + { + uint8_t screenIndex, lineIndex; + if (k < ITEM_DISPLAY_SCREEN_LABEL2) { + screenIndex = 0; + lineIndex = k-ITEM_DISPLAY_SCREEN_LINE1; + } + else if (k >= ITEM_DISPLAY_SCREEN_LABEL4) { + screenIndex = 3; + lineIndex = k-ITEM_DISPLAY_SCREEN_LINE13; + } + else if (k >= ITEM_DISPLAY_SCREEN_LABEL3) { + screenIndex = 2; + lineIndex = k-ITEM_DISPLAY_SCREEN_LINE9; + } + else { + screenIndex = 1; + lineIndex = k-ITEM_DISPLAY_SCREEN_LINE5; + } + + if (IS_BARS_SCREEN(screenIndex)) { + FrSkyBarData & bar = g_model.frsky.screens[screenIndex].bars[lineIndex]; + source_t barSource = bar.source; + drawSource(DISPLAY_COL1, y, barSource, menuHorizontalPosition==0 ? attr : 0); + int barMax = getMaximumValue(barSource); + int barMin = -barMax; + if (barSource) { + if (barSource <= MIXSRC_LAST_CH) { + putsChannelValue(DISPLAY_COL2, y, barSource, calc100toRESX(bar.barMin), (menuHorizontalPosition==1 ? attr : 0) | LEFT); + putsChannelValue(DISPLAY_COL3, y, barSource, calc100toRESX(bar.barMax), (menuHorizontalPosition==2 ? attr : 0) | LEFT); + } + else { + putsChannelValue(DISPLAY_COL2, y, barSource, bar.barMin, (menuHorizontalPosition==1 ? attr : 0) | LEFT); + putsChannelValue(DISPLAY_COL3, y, barSource, bar.barMax, (menuHorizontalPosition==2 ? attr : 0) | LEFT); + } + } + else if (attr) { + MOVE_CURSOR_FROM_HERE(); + } + if (attr && s_editMode>0) { + switch (menuHorizontalPosition) { + case 0: + bar.source = checkIncDec(event, barSource, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); + if (checkIncDec_Ret) { + if (barSource <= MIXSRC_LAST_CH) { + bar.barMin = -100; + bar.barMax = 100; + } + else { + bar.barMin = 0; + bar.barMax = 0; + } + } + break; + case 1: + bar.barMin = checkIncDec(event, bar.barMin, barMin, bar.barMax, EE_MODEL|NO_INCDEC_MARKS); + break; + case 2: + bar.barMax = checkIncDec(event, bar.barMax, bar.barMin, barMax, EE_MODEL|NO_INCDEC_MARKS); + break; + } + } + } + else { + for (int c=0; c0) { + value = checkIncDec(event, value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); + } + } + if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { + REPEAT_LAST_CURSOR_MOVE(); + } + } + break; + } + } + } +} diff --git a/radio/src/gui/128x64/model_flightmodes.cpp b/radio/src/gui/128x64/model_flightmodes.cpp index c6a5626eea..a4bc457ab8 100644 --- a/radio/src/gui/128x64/model_flightmodes.cpp +++ b/radio/src/gui/128x64/model_flightmodes.cpp @@ -31,7 +31,31 @@ void displayFlightModes(coord_t x, coord_t y, FlightModesType value) } while (p!=0); } -enum menuModelPhaseItems { +#if !defined(CPUARM) +FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr) +{ + drawFieldLabel(x, y, STR_FLMODE); + + uint8_t posHorz = menuHorizontalPosition; + + for (uint8_t p=0; p0 ? BLINK|INVERS : INVERS) : 0); #endif - switch(i) { + switch (i) { case ITEM_MODEL_PHASE_NAME: editSingleName(MIXES_2ND_COLUMN, y, STR_PHASENAME, fm->name, sizeof(fm->name), event, attr); break; + case ITEM_MODEL_PHASE_SWITCH: fm->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, fm->swtch, attr, event); break; + case ITEM_MODEL_PHASE_TRIMS: lcdDrawTextAlignedLeft(y, STR_TRIMS); - for (uint8_t t=0; t0) || p1valdiff)) { +#if defined(CPUARM) + for (uint8_t t = 0; t < NUM_STICKS; t++) { + drawTrimMode(MIXES_2ND_COLUMN + (t*2*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); + if (s_editMode && attr && menuHorizontalPosition == t) { + trim_t & v = fm->trim[t]; + v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); + } + } +#else + for (uint8_t t = 0; t < NUM_STICKS; t++) { + drawTrimMode(MIXES_2ND_COLUMN + (t*FW), y, s_currIdx, t, menuHorizontalPosition == t ? attr : 0); + if (attr && menuHorizontalPosition == t && ((editMode > 0) || p1valdiff)) { int16_t v = getRawTrimValue(s_currIdx, t); - if (v < TRIM_EXTENDED_MAX) v = TRIM_EXTENDED_MAX; - v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX+MAX_FLIGHT_MODES-1, EE_MODEL); + if (v < TRIM_EXTENDED_MAX) + v = TRIM_EXTENDED_MAX; + v = checkIncDec(event, v, TRIM_EXTENDED_MAX, TRIM_EXTENDED_MAX + MAX_FLIGHT_MODES - 1, EE_MODEL); if (checkIncDec_Ret) { - if (v == TRIM_EXTENDED_MAX) v = 0; + if (v == TRIM_EXTENDED_MAX) + v = 0; setTrimValue(s_currIdx, t, v); } } } +#endif break; #if ROTARY_ENCODERS > 0 @@ -158,7 +201,7 @@ void menuModelPhaseOne(uint8_t event) if (v > GVAR_MAX) { uint8_t p = v - GVAR_MAX - 1; if (p >= s_currIdx) p++; - putsFlightMode(11*FW, y, p+1, posHorz==1 ? attr : 0); + drawFlightMode(11*FW, y, p+1, posHorz==1 ? attr : 0); } else { lcdDrawText(11*FW, y, STR_OWN, posHorz==1 ? attr : 0); @@ -187,27 +230,27 @@ void menuModelPhaseOne(uint8_t event) #if defined(ROTARY_ENCODERS) #if ROTARY_ENCODERS > 2 - #define NAME_OFS (-4-12) - #define SWITCH_OFS (-FW/2-2-13) - #define TRIMS_OFS (-FW/2-4-15) - #define ROTARY_ENC_OFS (0) + #define NAME_OFS (-4-12) + #define SWITCH_OFS (-FW/2-2-13) + #define TRIMS_OFS (-FW/2-4-15) + #define ROTARY_ENC_OFS (0) #else - #define NAME_OFS (-4) - #define SWITCH_OFS (-FW/2-2) - #define TRIMS_OFS (-FW/2-4) - #define ROTARY_ENC_OFS (2) + #define NAME_OFS (-4) + #define SWITCH_OFS (-FW/2-2) + #define TRIMS_OFS (-FW/2-4) + #define ROTARY_ENC_OFS (2) #endif #else - #define NAME_OFS 0 - #define SWITCH_OFS (FW/2) - #define TRIMS_OFS (FW/2) + #define NAME_OFS 0 + #define SWITCH_OFS (FW/2) + #define TRIMS_OFS (FW/2) #endif void menuModelFlightModesAll(uint8_t event) { - SIMPLE_MENU(STR_MENUFLIGHTPHASES, menuTabModel, MENU_MODEL_FLIGHT_MODES, 1+MAX_FLIGHT_MODES+1); + SIMPLE_MENU(STR_MENUFLIGHTMODES, menuTabModel, MENU_MODEL_FLIGHT_MODES, HEADER_LINE+MAX_FLIGHT_MODES+1); - int8_t sub = menuVerticalPosition - 1; + int8_t sub = menuVerticalPosition - HEADER_LINE; switch (event) { CASE_EVT_ROTARY_BREAK @@ -217,7 +260,9 @@ void menuModelFlightModesAll(uint8_t event) trimsCheckTimer = 200; // 2 seconds } // no break +#if !defined(PCBX7D) case EVT_KEY_FIRST(KEY_RIGHT): +#endif if (sub >= 0 && sub < MAX_FLIGHT_MODES) { s_currIdx = sub; pushMenu(menuModelPhaseOne); @@ -234,17 +279,17 @@ void menuModelFlightModesAll(uint8_t event) uint8_t y = 1 + (i+1)*FH; #endif att = (i==sub ? INVERS : 0); - FlightModeData *p = flightModeAddress(i); - putsFlightMode(0, y, i+1, att|(getFlightMode()==i ? BOLD : 0)); + FlightModeData * p = flightModeAddress(i); + drawFlightMode(0, y, i+1, att|(getFlightMode()==i ? BOLD : 0)); lcdDrawSizedText(4*FW+NAME_OFS, y, p->name, sizeof(p->name), ZCHAR); if (i == 0) { lcdDrawText((5+LEN_FLIGHT_MODE_NAME)*FW+SWITCH_OFS, y, STR_DEFAULT); } else { - putsSwitches((5+LEN_FLIGHT_MODE_NAME)*FW+SWITCH_OFS, y, p->swtch, 0); + drawSwitch((5+LEN_FLIGHT_MODE_NAME)*FW+SWITCH_OFS, y, p->swtch, 0); for (uint8_t t=0; tfadeIn || p->fadeOut) { - lcdDrawChar(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O')); + lcdDrawChar(LCD_W-FW, y, (p->fadeIn && p->fadeOut) ? '*' : (p->fadeIn ? 'I' : 'O')); } } @@ -263,7 +308,7 @@ void menuModelFlightModesAll(uint8_t event) #endif lcdDrawTextAlignedLeft((LCD_LINES-1)*FH+1, STR_CHECKTRIMS); - putsFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, mixerCurrentFlightMode+1); + drawFlightMode(OFS_CHECKTRIMS, (LCD_LINES-1)*FH+1, mixerCurrentFlightMode+1); if (sub==MAX_FLIGHT_MODES && !trimsCheckTimer) { lcdInvertLastLine(); } diff --git a/radio/src/gui/128x64/model_heli.cpp b/radio/src/gui/128x64/model_heli.cpp deleted file mode 100644 index 1030cd09c6..0000000000 --- a/radio/src/gui/128x64/model_heli.cpp +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include "opentx.h" - -enum menuModelHeliItems { - ITEM_HELI_SWASHTYPE, - ITEM_HELI_COLLECTIVE, - ITEM_HELI_SWASHRING, - ITEM_HELI_ELEDIRECTION, - ITEM_HELI_AILDIRECTION, - ITEM_HELI_COLDIRECTION -}; - -#define HELI_PARAM_OFS (14*FW) - -void menuModelHeli(uint8_t event) -{ - SIMPLE_MENU(STR_MENUHELISETUP, menuTabModel, MENU_MODEL_HELI, 7); - - uint8_t sub = menuVerticalPosition - 1; - - for (uint8_t i=0; i<6; i++) { - coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; - uint8_t attr = (sub == i ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); - switch(i) { - case ITEM_HELI_SWASHTYPE: - g_model.swashR.type = selectMenuItem(HELI_PARAM_OFS, y, STR_SWASHTYPE, STR_VSWASHTYPE, g_model.swashR.type, 0, SWASH_TYPE_MAX, attr, event); - break; - - case ITEM_HELI_COLLECTIVE: - g_model.swashR.collectiveSource = selectMenuItem(HELI_PARAM_OFS, y, STR_COLLECTIVE, NULL, g_model.swashR.collectiveSource, 0, MIXSRC_LAST_CH, attr, event); - putsMixerSource(HELI_PARAM_OFS, y, g_model.swashR.collectiveSource, attr); - break; - - case ITEM_HELI_SWASHRING: - lcdDrawTextAlignedLeft(y, STR_SWASHRING); - lcdDrawNumber(HELI_PARAM_OFS, y, g_model.swashR.value, LEFT|attr); - if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.swashR.value, 100); - break; - - case ITEM_HELI_ELEDIRECTION: - g_model.swashR.invertELE = selectMenuItem(HELI_PARAM_OFS, y, STR_ELEDIRECTION, STR_MMMINV, g_model.swashR.invertELE, 0, 1, attr, event); - break; - - case ITEM_HELI_AILDIRECTION: - g_model.swashR.invertAIL = selectMenuItem(HELI_PARAM_OFS, y, STR_AILDIRECTION, STR_MMMINV, g_model.swashR.invertAIL, 0, 1, attr, event); - break; - - case ITEM_HELI_COLDIRECTION: - g_model.swashR.invertCOL = selectMenuItem(HELI_PARAM_OFS, y, STR_COLDIRECTION, STR_MMMINV, g_model.swashR.invertCOL, 0, 1, attr, event); - break; - } - } -} diff --git a/radio/src/gui/128x64/model_inputs.cpp b/radio/src/gui/128x64/model_inputs.cpp new file mode 100644 index 0000000000..6ae83b47cd --- /dev/null +++ b/radio/src/gui/128x64/model_inputs.cpp @@ -0,0 +1,574 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +#define EXPO_ONE_2ND_COLUMN (7*FW+3*FW+2) +#define EXPO_ONE_FM_WIDTH (5*FW) + +int expoFn(int x) +{ + ExpoData * ed = expoAddress(s_currIdx); + int16_t anas[NUM_INPUTS] = {0}; + applyExpos(anas, e_perout_mode_inactive_flight_mode, ed->srcRaw, x); + return anas[ed->chn]; +} + +void drawFunction(FnFuncP fn, uint8_t offset) +{ + lcdDrawVerticalLine(CURVE_CENTER_X-offset, 0/*TODO CURVE_CENTER_Y-CURVE_SIDE_WIDTH*/, CURVE_SIDE_WIDTH*2, 0xee); + lcdDrawHorizontalLine(CURVE_CENTER_X-CURVE_SIDE_WIDTH-offset, CURVE_CENTER_Y, CURVE_SIDE_WIDTH*2, 0xee); + + coord_t prev_yv = (coord_t)-1; + + for (int xv=-CURVE_SIDE_WIDTH; xv<=CURVE_SIDE_WIDTH; xv++) { + coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/CURVE_SIDE_WIDTH))) / 2 * (LCD_H-1) / RESX); + if (prev_yv != (coord_t)-1) { + if (abs((int8_t)yv-prev_yv) <= 1) { + lcdDrawPoint(CURVE_CENTER_X+xv-offset-1, prev_yv, FORCE); + } + else { + uint8_t tmp = (prev_yv < yv ? 0 : 1); + lcdDrawSolidVerticalLine(CURVE_CENTER_X+xv-offset-1, yv+tmp, prev_yv-yv); + } + } + prev_yv = yv; + } +} + +uint8_t getExposCount() +{ + uint8_t count = 0; + uint8_t ch ; + + for (int i=MAX_EXPOS-1 ; i>=0; i--) { + ch = EXPO_VALID(expoAddress(i)); + if (ch != 0) { + count++; + } + } + return count; +} + +bool reachExposLimit() +{ + if (getExposCount() >= MAX_EXPOS) { + POPUP_WARNING(STR_NOFREEEXPO); + return true; + } + return false; +} + +void deleteExpo(uint8_t idx) +{ + pauseMixerCalculations(); + ExpoData * expo = expoAddress(idx); + int input = expo->chn; + memmove(expo, expo+1, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + memclear(&g_model.expoData[MAX_EXPOS-1], sizeof(ExpoData)); + if (!isInputAvailable(input)) { + memclear(&g_model.inputNames[input], LEN_INPUT_NAME); + } + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +// TODO avoid this global s_currCh on ARM boards ... +int8_t s_currCh; +void insertExpo(uint8_t idx) +{ + pauseMixerCalculations(); + ExpoData * expo = expoAddress(idx); + memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + memclear(expo, sizeof(ExpoData)); + expo->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + expo->curve.type = CURVE_REF_EXPO; + expo->mode = 3; // pos+neg + expo->chn = s_currCh - 1; + expo->weight = 100; + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +void copyExpo(uint8_t idx) +{ + pauseMixerCalculations(); + ExpoData * expo = expoAddress(idx); + memmove(expo+1, expo, (MAX_EXPOS-(idx+1))*sizeof(ExpoData)); + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +bool swapExpos(uint8_t & idx, uint8_t up) +{ + ExpoData * x, * y; + int8_t tgt_idx = (up ? idx-1 : idx+1); + + x = expoAddress(idx); + + if (tgt_idx < 0) { + if (x->chn == 0) + return false; + x->chn--; + return true; + } + + if (tgt_idx == MAX_EXPOS) { + if (x->chn == NUM_INPUTS-1) + return false; + x->chn++; + return true; + } + + y = expoAddress(tgt_idx); + if (x->chn != y->chn || !EXPO_VALID(y)) { + if (up) { + if (x->chn>0) x->chn--; + else return false; + } + else { + if (x->chnchn++; + else return false; + } + return true; + } + + pauseMixerCalculations(); + memswap(x, y, sizeof(ExpoData)); + resumeMixerCalculations(); + + idx = tgt_idx; + return true; +} + +enum ExposFields { + EXPO_FIELD_INPUT_NAME, + EXPO_FIELD_LINE_NAME, + EXPO_FIELD_SOURCE, + EXPO_FIELD_SCALE, + EXPO_FIELD_WEIGHT, + EXPO_FIELD_OFFSET, + CASE_CURVES(EXPO_FIELD_CURVE_LABEL) + CASE_CURVES(EXPO_FIELD_CURVE) + CASE_FLIGHT_MODES(EXPO_FIELD_FLIGHT_MODES_LABEL) + CASE_FLIGHT_MODES(EXPO_FIELD_FLIGHT_MODES) + EXPO_FIELD_SWITCH, + EXPO_FIELD_SIDE, + EXPO_FIELD_TRIM, + EXPO_FIELD_MAX +}; + +void menuModelExpoOne(uint8_t event) +{ + if (event == EVT_KEY_LONG(KEY_MENU)) { + // TODO pushMenu(menuChannelsView); + killEvents(event); + } + + ExpoData * ed = expoAddress(s_currIdx); + drawSource(PSIZE(TR_MENUINPUTS)*FW+FW, 0, MIXSRC_FIRST_INPUT+ed->chn, 0); + + SUBMENU(STR_MENUINPUTS, EXPO_FIELD_MAX, {0, 0, 0, ed->srcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)0 : (uint8_t)HIDDEN_ROW, 0, 0, CASE_CURVES(LABEL(Curve)) CASE_CURVES(1) CASE_FLIGHT_MODES(LABEL(Flight Mode)) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); + + int8_t sub = menuVerticalPosition; + + coord_t y = MENU_HEADER_HEIGHT + 1; + + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); + + switch (i) { + case EXPO_FIELD_INPUT_NAME: + editSingleName(EXPO_ONE_2ND_COLUMN-LEN_INPUT_NAME*FW, y, STR_INPUTNAME, g_model.inputNames[ed->chn], LEN_INPUT_NAME, event, attr); + break; + + case EXPO_FIELD_LINE_NAME: + editSingleName(EXPO_ONE_2ND_COLUMN-LEN_EXPOMIX_NAME*FW, y, STR_EXPONAME, ed->name, LEN_EXPOMIX_NAME, event, attr); + break; + + case EXPO_FIELD_SOURCE: + lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, RIGHT|STREXPANDED|attr); + if (attr) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); + break; + + case EXPO_FIELD_SCALE: + lcdDrawTextAlignedLeft(y, STR_SCALE); + putsTelemetryChannelValue(EXPO_ONE_2ND_COLUMN, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), attr); + if (attr) ed->scale = checkIncDec(event, ed->scale, 0, maxTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1), EE_MODEL); + break; + + case EXPO_FIELD_WEIGHT: + lcdDrawTextAlignedLeft(y, STR_WEIGHT); + ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, MIN_EXPO_WEIGHT, 100, RIGHT | attr, 0, event); + break; + + case EXPO_FIELD_OFFSET: + lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + ed->offset = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->offset, -100, 100, RIGHT | attr, 0, event); + break; + +#if defined(CURVES) + case EXPO_FIELD_CURVE_LABEL: + lcdDrawTextAlignedLeft(y, STR_CURVE); + break; + + case EXPO_FIELD_CURVE: + editCurveRef(EXPO_ONE_2ND_COLUMN, y, ed->curve, event, RIGHT | attr); + break; +#endif + +#if defined(FLIGHT_MODES) + case EXPO_FIELD_FLIGHT_MODES_LABEL: + lcdDrawTextAlignedLeft(y, STR_FLMODE); + break; + + case EXPO_FIELD_FLIGHT_MODES: + ed->flightModes = editFlightModes(EXPO_ONE_2ND_COLUMN-9*FW+1, y, event, ed->flightModes, attr); + break; +#endif + + case EXPO_FIELD_SWITCH: + ed->swtch = switchMenuItem(EXPO_ONE_2ND_COLUMN, y, ed->swtch, RIGHT | attr, event); + break; + + case EXPO_FIELD_SIDE: + ed->mode = 4 - selectMenuItem(EXPO_ONE_2ND_COLUMN, y, STR_SIDE, STR_VSIDE, 4-ed->mode, 1, 3, RIGHT | attr, event); + break; + + case EXPO_FIELD_TRIM: + uint8_t not_stick = (ed->srcRaw > MIXSRC_Ail); + int8_t carryTrim = -ed->carryTrim; + lcdDrawTextAlignedLeft(y, STR_TRIM); + lcdDrawTextAtIndex(EXPO_ONE_2ND_COLUMN, y, STR_VMIXTRIMS, (not_stick && carryTrim == 0) ? 0 : carryTrim+1, RIGHT | (menuHorizontalPosition==0 ? attr : 0)); + if (attr) ed->carryTrim = -checkIncDecModel(event, carryTrim, not_stick ? TRIM_ON : -TRIM_OFF, -TRIM_LAST); + break; + } + y += FH; + } + + drawFunction(expoFn); + + int x512 = getValue(ed->srcRaw); + if (ed->srcRaw >= MIXSRC_FIRST_TELEM) { + putsTelemetryChannelValue(LCD_W-8, 6*FH, (ed->srcRaw - MIXSRC_FIRST_TELEM) / 3, x512, 0); + if (ed->scale > 0) x512 = (x512 * 1024) / convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale); + } + else { + lcdDrawNumber(LCD_W-8, 6*FH, calcRESXto1000(x512), RIGHT | PREC1); + } + x512 = limit(-1024, x512, 1024); + int y512 = expoFn(x512); + y512 = limit(-1024, y512, 1024); + lcdDrawNumber(LCD_W-8-6*FW, 1*FH, calcRESXto1000(y512), RIGHT | PREC1); + + x512 = CURVE_CENTER_X+x512/(RESX/CURVE_SIDE_WIDTH); + y512 = (LCD_H-1) - ((y512+RESX)/2) * (LCD_H-1) / RESX; + + lcdDrawSolidVerticalLine(x512, y512-3, 3*2+1); + lcdDrawSolidHorizontalLine(x512-3, y512, 3*2+1); +} + +#define _STR_MAX(x) PSTR("/" #x) +#define STR_MAX(x) _STR_MAX(x) + +#define EXPO_LINE_WEIGHT_POS 7*FW+8 +#define EXPO_LINE_SRC_POS 8*FW+3 +#define EXPO_LINE_INFOS_POS 11*FW+11 +#define EXPO_LINE_CURVE_POS 11*FW+11 +#define EXPO_LINE_SWITCH_POS 17*FW +#define EXPO_LINE_SIDE_POS 20*FW+2 +#define EXPO_LINE_SELECT_POS 4*FW+2 + +void onExposMenu(const char * result) +{ + uint8_t chn = expoAddress(s_currIdx)->chn + 1; + + if (result == STR_EDIT) { + pushMenu(menuModelExpoOne); + } + else if (result == STR_INSERT_BEFORE || result == STR_INSERT_AFTER) { + if (!reachExposLimit()) { + s_currCh = chn; + if (result == STR_INSERT_AFTER) { s_currIdx++; menuVerticalPosition++; } + insertExpo(s_currIdx); + pushMenu(menuModelExpoOne); + } + } + else if (result == STR_COPY || result == STR_MOVE) { + s_copyMode = (result == STR_COPY ? COPY_MODE : MOVE_MODE); + s_copySrcIdx = s_currIdx; + s_copySrcCh = chn; + s_copySrcRow = menuVerticalPosition; + } + else if (result == STR_DELETE) { + deleteExpo(s_currIdx); + } +} + +void displayExpoInfos(coord_t y, ExpoData * ed) +{ + drawCurveRef(EXPO_LINE_CURVE_POS, y, ed->curve, 0); + drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); + if (ed->mode != 3) { + lcdDrawChar(EXPO_LINE_SIDE_POS, y, ed->mode == 2 ? 126 : 127); + } +} + +void displayExpoLine(coord_t y, ExpoData * ed) +{ + drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0); + + if (ed->name[0]) + lcdDrawSizedText(EXPO_LINE_INFOS_POS, y, ed->name, LEN_EXPOMIX_NAME, ZCHAR); + else if (!ed->flightModes || ((ed->curve.value || ed->swtch) && ((get_tmr10ms() / 200) & 1))) + displayExpoInfos(y, ed); + else + displayFlightModes(EXPO_LINE_INFOS_POS, y, ed->flightModes); +} + +void menuModelExposAll(uint8_t event) +{ + int8_t sub = menuVerticalPosition - HEADER_LINE; + + if (s_editMode > 0) { + s_editMode = 0; + } + + uint8_t chn = expoAddress(s_currIdx)->chn + 1; + + switch (event) { + case EVT_ENTRY: + case EVT_ENTRY_UP: + s_copyMode = 0; + s_copyTgtOfs = 0; + break; + case EVT_KEY_LONG(KEY_EXIT): + if (s_copyMode && s_copyTgtOfs == 0) { + deleteExpo(s_currIdx); + killEvents(event); + event = 0; + } + // no break + case EVT_KEY_BREAK(KEY_EXIT): + if (s_copyMode) { + if (s_copyTgtOfs) { + // cancel the current copy / move operation + if (s_copyMode == COPY_MODE) { + deleteExpo(s_currIdx); + } + else { + do { + swapExpos(s_currIdx, s_copyTgtOfs > 0); + s_copyTgtOfs += (s_copyTgtOfs < 0 ? +1 : -1); + } while (s_copyTgtOfs != 0); + storageDirty(EE_MODEL); + } + menuVerticalPosition = s_copySrcRow; + s_copyTgtOfs = 0; + } + s_copyMode = 0; + event = 0; + } + break; + case EVT_KEY_BREAK(KEY_ENTER): + if ((!s_currCh || (s_copyMode && !s_copyTgtOfs)) && !READ_ONLY()) { + s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); + s_copySrcIdx = s_currIdx; + s_copySrcCh = chn; + s_copySrcRow = sub; + break; + } + // no break + case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); + if (s_copyTgtOfs) { + s_copyMode = 0; + s_copyTgtOfs = 0; + } + else { + if (READ_ONLY()) { + if (!s_currCh) { + pushMenu(menuModelExpoOne); + } + } + else { + if (s_copyMode) s_currCh = 0; + if (s_currCh) { + if (reachExposLimit()) break; + insertExpo(s_currIdx); + pushMenu(menuModelExpoOne); + s_copyMode = 0; + } + 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); + } + } + } + break; + case EVT_KEY_LONG(KEY_LEFT): + case EVT_KEY_LONG(KEY_RIGHT): + if (s_copyMode && !s_copyTgtOfs) { + if (reachExposLimit()) break; + s_currCh = chn; + if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } + insertExpo(s_currIdx); + pushMenu(menuModelExpoOne); + s_copyMode = 0; + killEvents(event); + } + break; + case EVT_KEY_FIRST(KEY_UP): + case EVT_KEY_REPT(KEY_UP): + case EVT_KEY_FIRST(KEY_DOWN): + case EVT_KEY_REPT(KEY_DOWN): + if (s_copyMode) { + uint8_t key = (event & 0x1f); + uint8_t next_ofs = (key==KEY_UP ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); + + if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { + // insert a mix on the same channel (just above / just below) + if (reachExposLimit()) break; + copyExpo(s_currIdx); + if (key==KEY_DOWN) s_currIdx++; + else if (sub-menuVerticalOffset >= 6) menuVerticalOffset++; + } + else if (next_ofs==0 && s_copyMode==COPY_MODE) { + // delete the mix + deleteExpo(s_currIdx); + if (key==KEY_UP) s_currIdx--; + } + else { + // only swap the mix with its neighbor + if (!swapExpos(s_currIdx, key==KEY_UP)) break; + storageDirty(EE_MODEL); + } + + s_copyTgtOfs = next_ofs; + } + break; + } + + lcdDrawNumber(FW*sizeof(TR_MENUINPUTS)+FW+FW/2, 0, getExposCount(), RIGHT); + lcdDrawText(FW*sizeof(TR_MENUINPUTS)+FW+FW/2, 0, STR_MAX(MAX_EXPOS)); + +#if 0 + // NOT ENOUGH SPACE ? + // Value + uint8_t index = expoAddress(s_currIdx)->chn; + if (!s_currCh) { + lcdDrawNumber(127, 2, calcRESXto1000(anas[index]), PREC1|TINSIZE|RIGHT); + } +#endif + + SIMPLE_MENU(STR_MENUINPUTS, menuTabModel, MENU_MODEL_INPUTS, HEADER_LINE + s_maxLines); + + // Gauge + if (!s_currCh) { + // NOT ENOUGH SPACE ? drawGauge(127, 1, 58, 6, anas[index], 1024); + } + + sub = menuVerticalPosition - HEADER_LINE; + s_currCh = 0; + int cur = 0; + int i = 0; + + for (int ch=1; ch<=NUM_INPUTS; ch++) { + ExpoData * ed; + coord_t y = MENU_HEADER_HEIGHT+1+(cur-menuVerticalOffset)*FH; + if (ichn+1 == ch && EXPO_VALID(ed)) { + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + drawSource(0, y, ch, 0); + } + uint8_t mixCnt = 0; + do { + if (s_copyMode) { + if (s_copyMode == MOVE_MODE && cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES && s_copySrcCh == ch && s_copyTgtOfs != 0 && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + lcdDrawRect(18, y-1, LCD_W-18, 9, DOTTED); + cur++; y+=FH; + } + if (s_currIdx == i) { + sub = cur; + menuVerticalPosition = cur + HEADER_LINE; + s_currCh = ch; + } + } + else if (sub == cur) { + s_currIdx = i; + } + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + LcdFlags attr = ((s_copyMode || sub != cur) ? 0 : INVERS); + + GVAR_MENU_ITEM(EXPO_LINE_WEIGHT_POS, y, ed->weight, MIN_EXPO_WEIGHT, 100, RIGHT | attr | (isExpoActive(i) ? BOLD : 0), 0, 0); + displayExpoLine(y, ed); + + if (s_copyMode) { + if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + /* draw a border around the raw on selection mode (copy/move) */ + lcdDrawRect(EXPO_LINE_SELECT_POS, y-1, LCD_W-EXPO_LINE_SELECT_POS, 9, s_copyMode == COPY_MODE ? SOLID : DOTTED); + } + if (cur == sub) { + /* invert the raw when it's the current one */ + lcdDrawFilledRect(EXPO_LINE_SELECT_POS+1, y, LCD_W-EXPO_LINE_SELECT_POS-2, 7); + } + } + } + cur++; y+=FH; mixCnt++; i++; ed++; + } while (ichn+1 == ch && EXPO_VALID(ed)); + if (s_copyMode == MOVE_MODE && cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + lcdDrawRect(EXPO_LINE_SELECT_POS, y-1, LCD_W-EXPO_LINE_SELECT_POS, 9, DOTTED); + cur++; + } + } + else { + uint8_t attr = 0; + if (sub == cur) { + s_currIdx = i; + s_currCh = ch; + if (!s_copyMode) { + attr = INVERS; + } + } + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + drawSource(0, y, ch, attr); + if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) { + lcdDrawRect(EXPO_LINE_SELECT_POS, y-1, LCD_W-EXPO_LINE_SELECT_POS, 9, DOTTED); + } + } + cur++; + } + } + s_maxLines = cur; + if (sub >= s_maxLines-1) menuVerticalPosition = s_maxLines - 1 + HEADER_LINE; +} diff --git a/radio/src/gui/128x64/model_inputs_mixes.cpp b/radio/src/gui/128x64/model_inputs_mixes.cpp index aeaed4a2e1..34f7c612f8 100644 --- a/radio/src/gui/128x64/model_inputs_mixes.cpp +++ b/radio/src/gui/128x64/model_inputs_mixes.cpp @@ -23,42 +23,7 @@ #define EXPO_ONE_2ND_COLUMN (7*FW+3*FW+2) #define EXPO_ONE_FM_WIDTH (5*FW) -#if defined(FLIGHT_MODES) -void displayFlightModes(coord_t x, coord_t y, FlightModesType value); -FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr) -{ - drawFieldLabel(x, y, STR_FLMODE); - - uint8_t posHorz = menuHorizontalPosition; - -#if defined(CPUARM) - bool expoMenu = (x==EXPO_ONE_2ND_COLUMN-5*FW); -#endif - - for (uint8_t p=0; p EXPO_ONE_2ND_COLUMN-FW))) - continue; -#endif - lcdDrawChar(x, y, '0'+p, ((posHorz==p) && attr) ? BLINK|INVERS : ((value & (1<destCh == NUM_CHNOUT-1) + if (((MixData *)x)->destCh == MAX_OUTPUT_CHANNELS-1) return false; ((MixData *)x)->destCh++; return true; @@ -234,7 +199,7 @@ bool swapExpoMix(uint8_t expo, uint8_t &idx, uint8_t up) else return false; } else { - if (destChdestCh++; + if (destChdestCh++; else return false; } return true; @@ -266,21 +231,18 @@ enum ExposFields { void menuModelExpoOne(uint8_t event) { - ExpoData *ed = expoAddress(s_currIdx); - putsMixerSource(7*FW+FW/2, 0, MIXSRC_Rud+ed->chn, 0); + ExpoData * ed = expoAddress(s_currIdx); + drawSource(7*FW+FW/2, 0, MIXSRC_Rud+ed->chn, 0); SUBMENU(STR_MENUINPUTS, EXPO_FIELD_MAX, {CASE_CPUARM(0) 0, 0, CASE_CURVES(CURVE_ROWS) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); - SET_SCROLLBAR_X(EXPO_ONE_2ND_COLUMN+10*FW); - int8_t sub = menuVerticalPosition; coord_t y = MENU_HEADER_HEIGHT + 1; for (uint8_t i=0; i0 ? BLINK|INVERS : INVERS) : 0); - switch(i) - { + switch (i) { #if defined(CPUARM) case EXPO_FIELD_NAME: editSingleName(EXPO_ONE_2ND_COLUMN-sizeof(ed->name)*FW, y, STR_EXPONAME, ed->name, sizeof(ed->name), event, attr); @@ -289,7 +251,7 @@ void menuModelExpoOne(uint8_t event) case EXPO_FIELD_WEIGHT: lcdDrawTextAlignedLeft(y, STR_WEIGHT); - ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN, y, ed->weight, MIN_EXPO_WEIGHT, 100, attr, 0, event); + ed->weight = GVAR_MENU_ITEM(EXPO_ONE_2ND_COLUMN-4*FW, y, ed->weight, MIN_EXPO_WEIGHT, 100, attr, 0, event); break; case EXPO_FIELD_EXPO: @@ -348,10 +310,10 @@ void menuModelExpoOne(uint8_t event) lcdDrawNumber(LCD_W-8-6*FW, 1*FH, calcRESXto100(y512), 0); #if defined(CPUARM) - x512 = X0+x512/(RESX/WCHART); + x512 = CURVE_CENTER_X+x512/(RESX/CURVE_SIDE_WIDTH); y512 = (LCD_H-1) - ((y512+RESX)/2) * (LCD_H-1) / RESX; #else - x512 = X0+x512/(RESXu/WCHART); + x512 = CURVE_CENTER_X+x512/(RESXu/CURVE_SIDE_WIDTH); y512 = (LCD_H-1) - (uint16_t)((y512+RESX)/2) * (LCD_H-1) / RESX; #endif @@ -457,34 +419,15 @@ void menuModelMixOne(uint8_t event) SUBMENU_NOTITLE(MIX_FIELD_COUNT, {CASE_CPUARM(0) 0, 0, 0, 1, CASE_CURVES(1) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); #endif -#if MENU_COLUMNS > 1 - lcdDrawSolidVerticalLine(MENU_COLUMN2_X-4, FH+1, LCD_H-FH-1); -#endif - int8_t sub = menuVerticalPosition; int8_t editMode = s_editMode; - for (uint8_t k=0; k 1 - coord_t y; - coord_t COLUMN_X; - if (k >= LCD_LINES-1) { - y = 1 + (k-LCD_LINES+2)*FH; - COLUMN_X = MENU_COLUMN2_X; - } - else { - y = 1 + (k+1)*FH; - COLUMN_X = 0; - } - int8_t i = k; -#else + for (uint8_t k=0; k0 ? BLINK|INVERS : INVERS) : 0); - switch(i) { + switch (i) { #if defined(CPUARM) case MIX_FIELD_NAME: editSingleName(COLUMN_X+MIXES_2ND_COLUMN, y, STR_MIXNAME, md2->name, sizeof(md2->name), event, attr); @@ -492,7 +435,7 @@ void menuModelMixOne(uint8_t event) #endif case MIX_FIELD_SOURCE: drawFieldLabel(COLUMN_X, y, NO_INDENT(STR_SOURCE)); - putsMixerSource(COLUMN_X+MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); + drawSource(COLUMN_X+MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; case MIX_FIELD_WEIGHT: @@ -599,10 +542,6 @@ void menuModelMixOne(uint8_t event) } } -static uint8_t s_maxLines = 8; -static uint8_t s_copySrcIdx; -static uint8_t s_copySrcCh; - #define _STR_MAX(x) PSTR("/" #x) #define STR_MAX(x) _STR_MAX(x) @@ -613,7 +552,7 @@ static uint8_t s_copySrcCh; #define EXPO_LINE_SIDE_POS 14*FW+2 #define EXPO_LINE_SELECT_POS 24 #define EXPO_LINE_FM_POS - #define EXPO_LINE_NAME_POS LCD_W-LEN_EXPOMIX_NAME*FW-MENUS_SCROLLBAR_WIDTH + #define EXPO_LINE_NAME_POS LCD_W-LEN_EXPOMIX_NAME*FW #define MIX_LINE_SRC_POS 4*FW-1 #define MIX_LINE_WEIGHT_POS 11*FW+3 #define MIX_LINE_CURVE_POS 12*FW+2 @@ -628,7 +567,7 @@ static uint8_t s_copySrcCh; #else #define EXPO_LINE_SIDE_POS 15*FW+2 #endif - #define EXPO_LINE_FM_POS LCD_W-FW-MENUS_SCROLLBAR_WIDTH + #define EXPO_LINE_FM_POS LCD_W-FW #define EXPO_LINE_SELECT_POS 24 #define MIX_LINE_SRC_POS 4*FW-1 #define MIX_LINE_WEIGHT_POS 11*FW+3 @@ -676,7 +615,7 @@ void displayMixInfos(coord_t y, MixData *md) } if (md->swtch) { - putsSwitches(MIX_LINE_SWITCH_POS, y, md->swtch); + drawSwitch(MIX_LINE_SWITCH_POS, y, md->swtch); } } @@ -701,7 +640,7 @@ void displayExpoInfos(coord_t y, ExpoData *ed) else displayGVar(EXPO_LINE_EXPO_POS, y, ed->curveParam, -100, 100); - putsSwitches(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); + drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); } #if defined(CPUARM) @@ -884,13 +823,13 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) uint8_t cur = 1; uint8_t i = 0; - for (uint8_t ch=1; ch<=(expo ? NUM_INPUTS : NUM_CHNOUT); ch++) { + for (uint8_t ch=1; ch<=(expo ? NUM_INPUTS : MAX_OUTPUT_CHANNELS); ch++) { void *pointer = NULL; MixData * &md = (MixData * &)pointer; ExpoData * &ed = (ExpoData * &)pointer; coord_t y = MENU_HEADER_HEIGHT-FH+1+(cur-menuVerticalOffset)*FH; if (expo ? (ichn+1 == ch && EXPO_VALID(ed)) : (isrcRaw && md->destCh+1 == ch)) { if (menuVerticalOffset < cur && cur-menuVerticalOffset < LCD_LINES) { if (expo) { - putsMixerSource(0, y, MIXSRC_Rud+ch-1, 0); + drawSource(0, y, MIXSRC_Rud+ch-1, 0); } else { putsChn(0, y, ch, 0); // show CHx @@ -923,7 +862,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) else { if (mixCnt > 0) lcdDrawTextAtIndex(FW, y, STR_VMLTPX2, md->mltpx, 0); - putsMixerSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0); + drawSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0); gvarWeightItem(MIX_LINE_WEIGHT_POS, y, md, attr | (isMixActive(i) ? BOLD : 0), event); @@ -965,7 +904,7 @@ void menuModelExpoMix(uint8_t expo, uint8_t event) } if (menuVerticalOffset < cur && cur-menuVerticalOffset < LCD_LINES) { if (expo) { - putsMixerSource(0, y, MIXSRC_Rud+ch-1, attr); + drawSource(0, y, MIXSRC_Rud+ch-1, attr); } else { putsChn(0, y, ch, attr); // show CHx diff --git a/radio/src/gui/128x64/model_logical_switches.cpp b/radio/src/gui/128x64/model_logical_switches.cpp index 92d7b1e138..1c4e59ad52 100644 --- a/radio/src/gui/128x64/model_logical_switches.cpp +++ b/radio/src/gui/128x64/model_logical_switches.cpp @@ -64,9 +64,9 @@ void menuModelLogicalSwitchOne(uint8_t event) LogicalSwitchData * cs = lswAddress(s_currIdx); uint8_t sw = SWSRC_SW1+s_currIdx; - putsSwitches(14*FW, 0, sw, (getSwitch(sw) ? BOLD : 0)); + drawSwitch(14*FW, 0, sw, (getSwitch(sw) ? BOLD : 0)); - SUBMENU_NOTITLE(LS_FIELD_COUNT, {0, 0, 1, 0 /*, 0...*/}); + SUBMENU_NOTITLE(LS_FIELD_COUNT, { 0, 0, 1, 0 /*, 0...*/ }); int8_t sub = menuVerticalPosition; @@ -79,7 +79,8 @@ void menuModelLogicalSwitchOne(uint8_t event) uint8_t i = k + menuVerticalOffset; uint8_t attr = (sub==i ? (s_editMode>0 ? BLINK|INVERS : INVERS) : 0); uint8_t cstate = lswFamily(cs->func); - switch(i) { + + switch (i) { case LS_FIELD_FUNCTION: lcdDrawTextAlignedLeft(y, STR_FUNC); lcdDrawTextAtIndex(CSWONE_2ND_COLUMN, y, STR_VCSWFUNC, cs->func, attr); @@ -99,12 +100,13 @@ void menuModelLogicalSwitchOne(uint8_t event) } } break; + case LS_FIELD_V1: { lcdDrawTextAlignedLeft(y, STR_V1); int v1_min=0, v1_max=MIXSRC_LAST_TELEM; if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY || cstate == LS_FAMILY_EDGE) { - putsSwitches(CSWONE_2ND_COLUMN, y, v1_val, attr); + drawSwitch(CSWONE_2ND_COLUMN, y, v1_val, attr); v1_min = SWSRC_OFF+1; v1_max = SWSRC_ON-1; } else if (cstate == LS_FAMILY_TIMER) { @@ -114,7 +116,7 @@ void menuModelLogicalSwitchOne(uint8_t event) } else { v1_val = (uint8_t)cs->v1; - putsMixerSource(CSWONE_2ND_COLUMN, y, v1_val, attr); + drawSource(CSWONE_2ND_COLUMN, y, v1_val, attr); INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -123,12 +125,13 @@ void menuModelLogicalSwitchOne(uint8_t event) } break; } + case LS_FIELD_V2: { lcdDrawTextAlignedLeft(y, STR_V2); int v2_min=0, v2_max=MIXSRC_LAST_TELEM; if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSWONE_2ND_COLUMN, y, cs->v2, attr); + drawSwitch(CSWONE_2ND_COLUMN, y, cs->v2, attr); v2_min = SWSRC_OFF+1; v2_max = SWSRC_ON-1; } else if (cstate == LS_FAMILY_TIMER) { @@ -146,7 +149,7 @@ void menuModelLogicalSwitchOne(uint8_t event) v2_min = -129; v2_max = 122; } else if (cstate == LS_FAMILY_COMP) { - putsMixerSource(CSWONE_2ND_COLUMN, y, cs->v2, attr); + drawSource(CSWONE_2ND_COLUMN, y, cs->v2, attr); INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -184,11 +187,13 @@ void menuModelLogicalSwitchOne(uint8_t event) } break; } + case LS_FIELD_ANDSW: lcdDrawTextAlignedLeft(y, STR_AND_SWITCH); - putsSwitches(CSWONE_2ND_COLUMN, y, cs->andsw, attr); + drawSwitch(CSWONE_2ND_COLUMN, y, cs->andsw, attr); if (attr) CHECK_INCDEC_MODELVAR(event, cs->andsw, -MAX_LS_ANDSW, MAX_LS_ANDSW); break; + case LS_FIELD_DURATION: lcdDrawTextAlignedLeft(y, STR_DURATION); if (cs->duration > 0) @@ -197,6 +202,7 @@ void menuModelLogicalSwitchOne(uint8_t event) lcdDrawTextAtIndex(CSWONE_2ND_COLUMN, y, STR_MMMINV, 0, attr); if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, cs->duration, MAX_LS_DURATION); break; + case LS_FIELD_DELAY: lcdDrawTextAlignedLeft(y, STR_DELAY); if (cs->delay > 0) @@ -211,17 +217,19 @@ void menuModelLogicalSwitchOne(uint8_t event) void menuModelLogicalSwitches(uint8_t event) { - SIMPLE_MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, NUM_LOGICAL_SWITCH+1); + SIMPLE_MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, HEADER_LINE+MAX_LOGICAL_SWITCHES); coord_t y = 0; uint8_t k = 0; - int8_t sub = menuVerticalPosition - 1; + int8_t sub = menuVerticalPosition - HEADER_LINE; switch (event) { #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_BREAK: #endif +#if !defined(PCBX7D) case EVT_KEY_FIRST(KEY_RIGHT): +#endif case EVT_KEY_FIRST(KEY_ENTER): if (sub >= 0) { s_currIdx = sub; @@ -232,13 +240,13 @@ void menuModelLogicalSwitches(uint8_t event) for (uint8_t i=0; ifunc > 0) { // CSW func @@ -248,15 +256,15 @@ void menuModelLogicalSwitches(uint8_t event) uint8_t cstate = lswFamily(cs->func); if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); - putsSwitches(CSW_3RD_COLUMN, y, cs->v2, 0); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSwitch(CSW_3RD_COLUMN, y, cs->v2, 0); } else if (cstate == LS_FAMILY_COMP) { - putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); - putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, 0); + drawSource(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSource(CSW_3RD_COLUMN, y, cs->v2, 0); } else if (cstate == LS_FAMILY_EDGE) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, 0); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, 0, 0); } else if (cstate == LS_FAMILY_TIMER) { @@ -265,7 +273,7 @@ void menuModelLogicalSwitches(uint8_t event) } else { uint8_t v1 = cs->v1; - putsMixerSource(CSW_2ND_COLUMN, y, v1, 0); + drawSource(CSW_2ND_COLUMN, y, v1, 0); if (v1 >= MIXSRC_FIRST_TELEM) { #if defined(CPUARM) putsChannelValue(CSW_3RD_COLUMN, y, v1, convertLswTelemValue(cs), LEFT); @@ -279,7 +287,7 @@ void menuModelLogicalSwitches(uint8_t event) } // CSW and switch - putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, 0); + drawSwitch(CSW_4TH_COLUMN, y, cs->andsw, 0); } } } @@ -290,10 +298,10 @@ void menuModelLogicalSwitches(uint8_t event) { INCDEC_DECLARE_VARS(EE_MODEL); - MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, NUM_LOGICAL_SWITCH+1, {0, NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/}); + MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, HEADER_LINE+MAX_LOGICAL_SWITCHES, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/}); uint8_t k = 0; - int8_t sub = menuVerticalPosition - 1; + int8_t sub = menuVerticalPosition - HEADER_LINE; horzpos_t horz = menuHorizontalPosition; for (uint8_t i=0; ifunc, horz==0 ? attr : 0); @@ -322,8 +330,8 @@ void menuModelLogicalSwitches(uint8_t event) #endif if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); - putsSwitches(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_3RD_COLUMN, y, cs->v2, attr2); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v2_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); @@ -331,7 +339,7 @@ void menuModelLogicalSwitches(uint8_t event) } #if defined(CPUARM) else if (cstate == LS_FAMILY_EDGE) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, attr2, horz==LS_FIELD_V3 ? attr : 0); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min=-129; v2_max = 122; @@ -350,8 +358,8 @@ void menuModelLogicalSwitches(uint8_t event) #if defined(CPUARM) v1_val = (uint8_t)cs->v1; #endif - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); - putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_3RD_COLUMN, y, cs->v2, attr2); INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -367,7 +375,7 @@ void menuModelLogicalSwitches(uint8_t event) #if defined(CPUARM) v1_val = (uint8_t)cs->v1; #endif - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); if (horz == 1) { INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailableInCustomSwitches); @@ -438,13 +446,13 @@ void menuModelLogicalSwitches(uint8_t event) // CSW AND switch #if defined(CPUARM) - putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, horz==LS_FIELD_ANDSW ? attr : 0); + drawSwitch(CSW_4TH_COLUMN, y, cs->andsw, horz==LS_FIELD_ANDSW ? attr : 0); #else uint8_t andsw = cs->andsw; if (andsw > SWSRC_LAST_SWITCH) { andsw += SWSRC_SW1-SWSRC_LAST_SWITCH-1; } - putsSwitches(CSW_4TH_COLUMN, y, andsw, horz==LS_FIELD_ANDSW ? attr : 0); + drawSwitch(CSW_4TH_COLUMN, y, andsw, horz==LS_FIELD_ANDSW ? attr : 0); #endif #if defined(CPUARM) diff --git a/radio/src/gui/128x64/model_mixes.cpp b/radio/src/gui/128x64/model_mixes.cpp new file mode 100644 index 0000000000..c159385f3b --- /dev/null +++ b/radio/src/gui/128x64/model_mixes.cpp @@ -0,0 +1,603 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +uint8_t getMixesCount() +{ + uint8_t count = 0; + uint8_t ch ; + + for (int i=MAX_MIXERS-1; i>=0; i--) { + ch = mixAddress(i)->srcRaw; + if (ch != 0) { + count++; + } + } + return count; +} + +bool reachMixesLimit() +{ + if (getMixesCount() >= MAX_MIXERS) { + POPUP_WARNING(STR_NOFREEMIXER); + return true; + } + return false; +} + +void deleteMix(uint8_t idx) +{ + pauseMixerCalculations(); + MixData * mix = mixAddress(idx); + memmove(mix, mix+1, (MAX_MIXERS-(idx+1))*sizeof(MixData)); + memclear(&g_model.mixData[MAX_MIXERS-1], sizeof(MixData)); + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +void insertMix(uint8_t idx) +{ + pauseMixerCalculations(); + MixData * mix = mixAddress(idx); + memmove(mix+1, mix, (MAX_MIXERS-(idx+1))*sizeof(MixData)); + memclear(mix, sizeof(MixData)); + mix->destCh = s_currCh-1; + mix->srcRaw = s_currCh; + if (!isSourceAvailable(mix->srcRaw)) { + mix->srcRaw = (s_currCh > 4 ? MIXSRC_Rud - 1 + s_currCh : MIXSRC_Rud - 1 + channel_order(s_currCh)); + while (!isSourceAvailable(mix->srcRaw)) { + mix->srcRaw += 1; + } + } + mix->weight = 100; + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +void copyMix(uint8_t idx) +{ + pauseMixerCalculations(); + MixData * mix = mixAddress(idx); + memmove(mix+1, mix, (MAX_MIXERS-(idx+1))*sizeof(MixData)); + resumeMixerCalculations(); + storageDirty(EE_MODEL); +} + +bool swapMixes(uint8_t & idx, uint8_t up) +{ + MixData * x, * y; + int8_t tgt_idx = (up ? idx-1 : idx+1); + + x = mixAddress(idx); + + if (tgt_idx < 0) { + if (x->destCh == 0) + return false; + x->destCh--; + return true; + } + + if (tgt_idx == MAX_MIXERS) { + if (x->destCh == MAX_OUTPUT_CHANNELS-1) + return false; + x->destCh++; + return true; + } + + y = mixAddress(tgt_idx); + uint8_t destCh = x->destCh; + if(!y->srcRaw || destCh != y->destCh) { + if (up) { + if (destCh>0) x->destCh--; + else return false; + } + else { + if (destChdestCh++; + else return false; + } + return true; + } + + pauseMixerCalculations(); + memswap(x, y, sizeof(MixData)); + resumeMixerCalculations(); + + idx = tgt_idx; + return true; +} + +enum MixFields { + MIX_FIELD_NAME, + MIX_FIELD_SOURCE, + MIX_FIELD_WEIGHT, + MIX_FIELD_OFFSET, + MIX_FIELD_TRIM, + CASE_CURVES(MIX_FIELD_CURVE) + CASE_FLIGHT_MODES(MIX_FIELD_FLIGHT_MODE) + MIX_FIELD_SWITCH, + MIX_FIELD_WARNING, + MIX_FIELD_MLTPX, + MIX_FIELD_DELAY_UP, + MIX_FIELD_DELAY_DOWN, + MIX_FIELD_SLOW_UP, + MIX_FIELD_SLOW_DOWN, + MIX_FIELD_COUNT +}; + +void gvarWeightItem(coord_t x, coord_t y, MixData *md, uint8_t attr, uint8_t event) +{ + u_int8int16_t weight; + MD_WEIGHT_TO_UNION(md, weight); + weight.word = GVAR_MENU_ITEM(x, y, weight.word, GV_RANGELARGE_WEIGHT_NEG, GV_RANGELARGE_WEIGHT, attr, 0, event); + MD_UNION_TO_WEIGHT(weight, md); +} + +void drawOffsetBar(uint8_t x, uint8_t y, MixData * md) +{ + const int gaugeWidth = 33; + const int gaugeHeight = 6; + + int offset = GET_GVAR(MD_OFFSET(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); + int weight = GET_GVAR(MD_WEIGHT(md), GV_RANGELARGE_NEG, GV_RANGELARGE, mixerCurrentFlightMode); + int barMin = offset - weight; + int barMax = offset + weight; + if (y > 15) { + lcdDrawNumber(x-((barMin >= 0) ? 2 : 3), y-6, barMin, TINSIZE|LEFT); + lcdDrawNumber(x+gaugeWidth+1, y-6, barMax, TINSIZE|RIGHT); + } + if (weight < 0) { + barMin = -barMin; + barMax = -barMax; + } + if (barMin < -101) + barMin = -101; + if (barMax > 101) + barMax = 101; + lcdDrawHorizontalLine(x-2, y, gaugeWidth+2, DOTTED); + lcdDrawHorizontalLine(x-2, y+gaugeHeight, gaugeWidth+2, DOTTED); + lcdDrawSolidVerticalLine(x-2, y+1, gaugeHeight-1); + lcdDrawSolidVerticalLine(x+gaugeWidth-1, y+1, gaugeHeight-1); + if (barMin <= barMax) { + int8_t right = (barMax * gaugeWidth) / 200; + int8_t left = ((barMin * gaugeWidth) / 200)-1; + lcdDrawFilledRect(x+gaugeWidth/2+left, y+2, right-left, gaugeHeight-3); + } + lcdDrawSolidVerticalLine(x+gaugeWidth/2-1, y, gaugeHeight+1); + if (barMin == -101) { + for (uint8_t i=0; i<3; ++i) { + lcdDrawPoint(x+i, y+4-i); + lcdDrawPoint(x+3+i, y+4-i); + } + } + if (barMax == 101) { + for (uint8_t i=0; i<3; ++i) { + lcdDrawPoint(x+gaugeWidth-8+i, y+4-i); + lcdDrawPoint(x+gaugeWidth-5+i, y+4-i); + } + } +} + +void menuModelMixOne(uint8_t event) +{ + if (event == EVT_KEY_LONG(KEY_MENU)) { + // TODO pushMenu(menuChannelsView); + killEvents(event); + } + + MixData * md2 = mixAddress(s_currIdx) ; + putsChn(PSIZE(TR_MIXER)*FW+FW, 0, md2->destCh+1,0); + + SUBMENU(STR_MIXER, MIX_FIELD_COUNT, {0, 0, 0, 0, 0, CASE_CURVES(1) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0, 0 /*, ...*/}); + + int8_t sub = menuVerticalPosition; + int8_t editMode = s_editMode; + + for (int k=0; k= LCD_LINES-1) + y = 1 + (k-LCD_LINES+2)*FH; + else + y = 1 + (k+1)*FH; + int8_t i = k; + + i += menuVerticalOffset; + + LcdFlags attr = (sub==i ? (editMode>0 ? BLINK|INVERS : INVERS) : 0); + switch(i) { + case MIX_FIELD_NAME: + editSingleName(MIXES_2ND_COLUMN, y, STR_MIXNAME, md2->name, sizeof(md2->name), event, attr); + break; + + case MIX_FIELD_SOURCE: + lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); + drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); + if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); + break; + + case MIX_FIELD_WEIGHT: + lcdDrawTextAlignedLeft(y, STR_WEIGHT); + gvarWeightItem(MIXES_2ND_COLUMN, y, md2, attr|LEFT, event); + break; + + case MIX_FIELD_OFFSET: + { + lcdDrawTextAlignedLeft(y, NO_INDENT(STR_OFFSET)); + u_int8int16_t offset; + MD_OFFSET_TO_UNION(md2, offset); + offset.word = GVAR_MENU_ITEM(MIXES_2ND_COLUMN, y, offset.word, GV_RANGELARGE_OFFSET_NEG, GV_RANGELARGE_OFFSET, attr|LEFT, 0, event); + MD_UNION_TO_OFFSET(offset, md2); + drawOffsetBar(MIXES_2ND_COLUMN+22, y, md2); + break; + } + + case MIX_FIELD_TRIM: + lcdDrawTextAlignedLeft(y, STR_TRIM); + drawCheckBox(MIXES_2ND_COLUMN, y, !md2->carryTrim, attr); + if (attr) md2->carryTrim = !checkIncDecModel(event, !md2->carryTrim, 0, 1); + break; + +#if defined(CURVES) + case MIX_FIELD_CURVE: + lcdDrawTextAlignedLeft(y, STR_CURVE); + editCurveRef(MIXES_2ND_COLUMN, y, md2->curve, event, attr); + break; +#endif + +#if defined(FLIGHT_MODES) + case MIX_FIELD_FLIGHT_MODE: + lcdDrawTextAlignedLeft(y, STR_FLMODE); + md2->flightModes = editFlightModes(MIXES_2ND_COLUMN, y, event, md2->flightModes, attr); + break; +#endif + + case MIX_FIELD_SWITCH: + md2->swtch = switchMenuItem(MIXES_2ND_COLUMN, y, md2->swtch, attr, event); + break; + + case MIX_FIELD_WARNING: + drawFieldLabel(MIXES_2ND_COLUMN, y, STR_MIXWARNING); + if (md2->mixWarn) + lcdDrawNumber(MIXES_2ND_COLUMN, y, md2->mixWarn, attr|LEFT); + else + lcdDrawText(MIXES_2ND_COLUMN, y, STR_OFF, attr); + if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, md2->mixWarn, 3); + break; + + case MIX_FIELD_MLTPX: + md2->mltpx = selectMenuItem(MIXES_2ND_COLUMN, y, STR_MULTPX, STR_VMLTPX, md2->mltpx, 0, 2, attr, event); + break; + + case MIX_FIELD_DELAY_UP: + md2->delayUp = EDIT_DELAY(0, y, event, attr, STR_DELAYUP, md2->delayUp); + break; + + case MIX_FIELD_DELAY_DOWN: + md2->delayDown = EDIT_DELAY(0, y, event, attr, STR_DELAYDOWN, md2->delayDown); + break; + + case MIX_FIELD_SLOW_UP: + md2->speedUp = EDIT_DELAY(0, y, event, attr, STR_SLOWUP, md2->speedUp); + break; + + case MIX_FIELD_SLOW_DOWN: + md2->speedDown = EDIT_DELAY(0, y, event, attr, STR_SLOWDOWN, md2->speedDown); + break; + } + } +} + +#define _STR_MAX(x) PSTR("/" #x) +#define STR_MAX(x) _STR_MAX(x) + +#define MIX_LINE_WEIGHT_POS 6*FW+8 +#define MIX_LINE_SRC_POS 7*FW+3 +#define MIX_LINE_CURVE_POS 12*FW +#define MIX_LINE_SWITCH_POS 16*FW+4 +#define MIX_LINE_FM_POS 13*FW+3 +#define MIX_LINE_DELAY_POS 20*FW+2 +#define MIX_LINE_NAME_POS LCD_W-LEN_EXPOMIX_NAME*FW + +void onMixesMenu(const char * result) +{ + uint8_t chn = mixAddress(s_currIdx)->destCh + 1; + + if (result == STR_EDIT) { + pushMenu(menuModelMixOne); + } + else if (result == STR_INSERT_BEFORE || result == STR_INSERT_AFTER) { + if (!reachMixesLimit()) { + s_currCh = chn; + if (result == STR_INSERT_AFTER) { s_currIdx++; menuVerticalPosition++; } + insertMix(s_currIdx); + pushMenu(menuModelMixOne); + } + } + else if (result == STR_COPY || result == STR_MOVE) { + s_copyMode = (result == STR_COPY ? COPY_MODE : MOVE_MODE); + s_copySrcIdx = s_currIdx; + s_copySrcCh = chn; + s_copySrcRow = menuVerticalPosition; + } + else if (result == STR_DELETE) { + deleteMix(s_currIdx); + } +} + +void displayHeaderChannelName(uint8_t ch) +{ + uint8_t len = zlen(g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name)); + if (len) { + lcdDrawSizedText(80, 1, g_model.limitData[ch].name, len, ZCHAR|SMLSIZE); + } +} + +void displayMixInfos(coord_t y, MixData * md) +{ + drawCurveRef(MIX_LINE_CURVE_POS, y, md->curve, 0); + + if (md->swtch) { + drawSwitch(MIX_LINE_SWITCH_POS, y, md->swtch); + } + + char cs = ' '; + if (md->speedDown || md->speedUp) + cs = 'S'; + if (md->delayUp || md->delayDown) + cs = (cs == 'S' ? '*' : 'D'); + lcdDrawChar(MIX_LINE_DELAY_POS, y, cs); +} + +void displayMixLine(coord_t y, MixData * md) +{ + if (md->name[0]) + lcdDrawSizedText(MIX_LINE_NAME_POS, y, md->name, sizeof(md->name), ZCHAR); + else if (!md->flightModes || ((md->curve.value || md->swtch) && ((get_tmr10ms() / 200) & 1))) + displayMixInfos(y, md); + else + displayFlightModes(MIX_LINE_FM_POS, y, md->flightModes); +} + +void menuModelMixAll(uint8_t event) +{ + int8_t sub = menuVerticalPosition - HEADER_LINE; + + if (s_editMode > 0) { + s_editMode = 0; + } + + uint8_t chn = mixAddress(s_currIdx)->destCh + 1; + + switch (event) { + case EVT_ENTRY: + case EVT_ENTRY_UP: + s_copyMode = 0; + s_copyTgtOfs = 0; + break; + case EVT_KEY_LONG(KEY_EXIT): + if (s_copyMode && s_copyTgtOfs == 0) { + deleteMix(s_currIdx); + killEvents(event); + event = 0; + } + // no break + case EVT_KEY_BREAK(KEY_EXIT): + if (s_copyMode) { + if (s_copyTgtOfs) { + // cancel the current copy / move operation + if (s_copyMode == COPY_MODE) { + deleteMix(s_currIdx); + } + else { + do { + swapMixes(s_currIdx, s_copyTgtOfs > 0); + s_copyTgtOfs += (s_copyTgtOfs < 0 ? +1 : -1); + } while (s_copyTgtOfs != 0); + storageDirty(EE_MODEL); + } + menuVerticalPosition = s_copySrcRow + HEADER_LINE; + s_copyTgtOfs = 0; + } + s_copyMode = 0; + event = 0; + } + break; + case EVT_KEY_BREAK(KEY_ENTER): + if ((!s_currCh || (s_copyMode && !s_copyTgtOfs)) && !READ_ONLY()) { + s_copyMode = (s_copyMode == COPY_MODE ? MOVE_MODE : COPY_MODE); + s_copySrcIdx = s_currIdx; + s_copySrcCh = chn; + s_copySrcRow = sub; + break; + } + // no break + + case EVT_KEY_LONG(KEY_ENTER): + killEvents(event); + if (s_copyTgtOfs) { + s_copyMode = 0; + s_copyTgtOfs = 0; + } + else { + if (READ_ONLY()) { + if (!s_currCh) { + pushMenu(menuModelMixOne); + } + } + else { + if (s_copyMode) s_currCh = 0; + if (s_currCh) { + if (reachMixesLimit()) break; + insertMix(s_currIdx); + pushMenu(menuModelMixOne); + s_copyMode = 0; + } + 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); + } + } + } + break; + case EVT_KEY_LONG(KEY_LEFT): + case EVT_KEY_LONG(KEY_RIGHT): + if (s_copyMode && !s_copyTgtOfs) { + if (reachMixesLimit()) break; + s_currCh = chn; + if (event == EVT_KEY_LONG(KEY_RIGHT)) { s_currIdx++; menuVerticalPosition++; } + insertMix(s_currIdx); + pushMenu(menuModelMixOne); + s_copyMode = 0; + killEvents(event); + } + break; + case EVT_KEY_FIRST(KEY_UP): + case EVT_KEY_REPT(KEY_UP): + case EVT_KEY_FIRST(KEY_DOWN): + case EVT_KEY_REPT(KEY_DOWN): + if (s_copyMode) { + uint8_t key = (event & 0x1f); + uint8_t next_ofs = (key==KEY_UP ? s_copyTgtOfs - 1 : s_copyTgtOfs + 1); + + if (s_copyTgtOfs==0 && s_copyMode==COPY_MODE) { + // insert a mix on the same channel (just above / just below) + if (reachMixesLimit()) break; + copyMix(s_currIdx); + if (key==KEY_DOWN) s_currIdx++; + else if (sub-menuVerticalOffset >= 6) menuVerticalOffset++; + } + else if (next_ofs==0 && s_copyMode==COPY_MODE) { + // delete the mix + deleteMix(s_currIdx); + if (key==KEY_UP) s_currIdx--; + } + else { + // only swap the mix with its neighbor + if (!swapMixes(s_currIdx, key==KEY_UP)) break; + storageDirty(EE_MODEL); + } + + s_copyTgtOfs = next_ofs; + } + break; + } + + lcdDrawNumber(FW*sizeof(TR_MIXER)+FW+FW/2, 0, getMixesCount(), RIGHT); + lcdDrawText(FW*sizeof(TR_MIXER)+FW+FW/2, 0, STR_MAX(MAX_MIXERS)); + + // Value + uint8_t index = mixAddress(s_currIdx)->destCh; + if (!s_currCh) { + displayHeaderChannelName(index); + /// NOT ENOUGH SPACE ? lcdDrawNumber(127, 2, calcRESXto1000(ex_chans[index]), PREC1|TINSIZE|RIGHT); + } + + SIMPLE_MENU(STR_MIXER, menuTabModel, MENU_MODEL_MIXES, HEADER_LINE + s_maxLines); + + // Gauge + if (!s_currCh) { + // TODO ? drawGauge(127, 1, 58, 6, ex_chans[index], 1024); + } + + sub = menuVerticalPosition - HEADER_LINE; + s_currCh = 0; + int cur = 0; + int i = 0; + + for (int ch=1; ch<=MAX_OUTPUT_CHANNELS; ch++) { + MixData * md; + coord_t y = MENU_HEADER_HEIGHT+1+(cur-menuVerticalOffset)*FH; + if (isrcRaw && md->destCh+1 == ch) { + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + putsChn(0, y, ch, 0); // show CHx + } + uint8_t mixCnt = 0; + do { + if (s_copyMode) { + if (s_copyMode == MOVE_MODE && cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES && s_copySrcCh == ch && s_copyTgtOfs != 0 && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + lcdDrawRect(22, y-1, LCD_W-22, 9, DOTTED); + cur++; y+=FH; + } + if (s_currIdx == i) { + sub = cur; + menuVerticalPosition = cur + HEADER_LINE; + s_currCh = ch; + } + } + else if (sub == cur) { + s_currIdx = i; + } + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + uint8_t attr = ((s_copyMode || sub != cur) ? 0 : INVERS); + + if (mixCnt > 0) lcdDrawTextAtIndex(FW, y, STR_VMLTPX2, md->mltpx, 0); + + drawSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0); + + gvarWeightItem(MIX_LINE_WEIGHT_POS, y, md, RIGHT | attr | (isMixActive(i) ? BOLD : 0), 0); + + displayMixLine(y, md); + + if (s_copyMode) { + if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + /* draw a border around the raw on selection mode (copy/move) */ + lcdDrawRect(22, y-1, LCD_W-22, 9, s_copyMode == COPY_MODE ? SOLID : DOTTED); + } + if (cur == sub) { + /* invert the raw when it's the current one */ + lcdDrawFilledRect(23, y, LCD_W-24, 7); + } + } + } + cur++; y+=FH; mixCnt++; i++; md++; + } while (isrcRaw && md->destCh+1 == ch); + if (s_copyMode == MOVE_MODE && cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { + lcdDrawRect(22, y-1, LCD_W-22, 9, DOTTED); + cur++; + } + } + else { + uint8_t attr = 0; + if (sub == cur) { + s_currIdx = i; + s_currCh = ch; + if (!s_copyMode) { + attr = INVERS; + } + } + if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { + putsChn(0, y, ch, attr); // show CHx + if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) { + lcdDrawRect(22, y-1, LCD_W-22, 9, DOTTED); + } + } + cur++; + } + } + s_maxLines = cur; + if (sub >= s_maxLines-1) menuVerticalPosition = s_maxLines - 1 + HEADER_LINE; +} diff --git a/radio/src/gui/128x64/model_outputs.cpp b/radio/src/gui/128x64/model_outputs.cpp index f08e097f48..928d20d396 100644 --- a/radio/src/gui/128x64/model_outputs.cpp +++ b/radio/src/gui/128x64/model_outputs.cpp @@ -30,19 +30,19 @@ bool isThrottleOutput(uint8_t ch) return false; } -enum LimitsItems { - ITEM_LIMITS_OFFSET, - ITEM_LIMITS_MIN, - ITEM_LIMITS_MAX, - ITEM_LIMITS_DIRECTION, +enum MenuModelOutputsItems { + ITEM_OUTPUTS_OFFSET, + ITEM_OUTPUTS_MIN, + ITEM_OUTPUTS_MAX, + ITEM_OUTPUTS_DIRECTION, #if defined(PPM_CENTER_ADJUSTABLE) - ITEM_LIMITS_PPM_CENTER, + ITEM_OUTPUTS_PPM_CENTER, #endif #if defined(PPM_LIMITS_SYMETRICAL) - ITEM_LIMITS_SYMETRICAL, + ITEM_OUTPUTS_SYMETRICAL, #endif - ITEM_LIMITS_COUNT, - ITEM_LIMITS_MAXROW = ITEM_LIMITS_COUNT-1 + ITEM_OUTPUTS_COUNT, + ITEM_OUTPUTS_MAXROW = ITEM_OUTPUTS_COUNT-1 }; #if defined(PPM_UNIT_US) @@ -89,26 +89,26 @@ enum LimitsItems { void menuModelLimits(uint8_t event) { - uint8_t sub = menuVerticalPosition - 1; + uint8_t sub = menuVerticalPosition - HEADER_LINE; - if (sub < NUM_CHNOUT) { + if (sub < MAX_OUTPUT_CHANNELS) { #if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_UNIT_US) - lcdDrawNumber(13*FW, 0, PPM_CH_CENTER(sub)+channelOutputs[sub]/2, 0); + lcdDrawNumber(13*FW, 0, PPM_CH_CENTER(sub)+channelOutputs[sub]/2, RIGHT); lcdDrawText(13*FW, 0, STR_US); #else - lcdDrawNumber(13*FW, 0, calcRESXto1000(channelOutputs[sub]), PREC1); + lcdDrawNumber(13*FW, 0, calcRESXto1000(channelOutputs[sub]), RIGHT|PREC1); #endif } #if defined(CPUARM) - MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, 1+NUM_CHNOUT+1, {0, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, 0}); + MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, HEADER_LINE+MAX_OUTPUT_CHANNELS+1, { HEADER_LINE_COLUMNS NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_OUTPUTS_MAXROW, 0}); #else - MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, 1+NUM_CHNOUT+1, {0, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, ITEM_LIMITS_MAXROW, 0}); + MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, HEADER_LINE+MAX_OUTPUT_CHANNELS+1, { HEADER_LINE_COLUMNS ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, ITEM_OUTPUTS_MAXROW, 0}); #endif if (warningResult) { warningResult = 0; - LimitData *ld = limitAddress(sub); + LimitData * ld = limitAddress(sub); ld->revert = !ld->revert; storageDirty(EE_MODEL); } @@ -117,13 +117,13 @@ void menuModelLimits(uint8_t event) coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; uint8_t k = i+menuVerticalOffset; - if (k==NUM_CHNOUT) { + if (k == MAX_OUTPUT_CHANNELS) { // last line available - add the "copy trim menu" line - uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0; + LcdFlags attr = (sub==MAX_OUTPUT_CHANNELS) ? INVERS : 0; lcdDrawText(CENTER_OFS, y, STR_TRIMS2OFFSETS, NO_HIGHLIGHT() ? 0 : attr); if (attr) { s_editMode = 0; - if (event==EVT_KEY_LONG(KEY_ENTER)) { + if (event == EVT_KEY_LONG(KEY_ENTER)) { START_NO_HIGHLIGHT(); killEvents(event); moveTrimsToOffsets(); // if highlighted and menu pressed - move trims to offsets @@ -132,7 +132,7 @@ void menuModelLimits(uint8_t event) return; } - LimitData *ld = limitAddress(k); + LimitData * ld = limitAddress(k); #if !defined(PPM_CENTER_ADJUSTABLE) int16_t v = (ld->revert) ? -LIMIT_OFS(ld) : LIMIT_OFS(ld); @@ -144,20 +144,19 @@ void menuModelLimits(uint8_t event) #endif int8_t limit = (g_model.extendedLimits ? LIMIT_EXT_MAX : 100); + + putsChn(0, y, k+1, IS_LINE_SELECTED(sub, k) ? INVERS : 0); - putsChn(0, y, k+1, 0); - - for (uint8_t j=0; j0) ? BLINK|INVERS : INVERS) : 0); uint8_t active = (attr && (s_editMode>0 || p1valdiff)) ; if (active) STICK_SCROLL_DISABLE(); - switch(j) - { - case ITEM_LIMITS_OFFSET: + switch (j) { + case ITEM_OUTPUTS_OFFSET: #if defined(PPM_UNIT_US) - lcdDrawNumber(LIMITS_OFFSET_POS, y, ((int32_t)ld->offset*128) / 25, attr|PREC1); + lcdDrawNumber(LIMITS_OFFSET_POS, y, ((int32_t)ld->offset*128) / 25, attr|PREC1|RIGHT); #else - lcdDrawNumber(LIMITS_OFFSET_POS, y, ld->offset, attr|PREC1); + lcdDrawNumber(LIMITS_OFFSET_POS, y, ld->offset, attr|PREC1|RIGHT); #endif if (active) { #if defined(CPUARM) @@ -172,8 +171,8 @@ void menuModelLimits(uint8_t event) } break; - case ITEM_LIMITS_MIN: - lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR); + case ITEM_OUTPUTS_MIN: + lcdDrawNumber(LIMITS_MIN_POS, y, MIN_MAX_DISPLAY(ld->min-LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); #if defined(CPUARM) if (active) ld->min = LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->min-LIMITS_MIN_MAX_OFFSET, -limit, 0, EE_MODEL, NULL, stops1000); #else @@ -181,8 +180,8 @@ void menuModelLimits(uint8_t event) #endif break; - case ITEM_LIMITS_MAX: - lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR); + case ITEM_OUTPUTS_MAX: + lcdDrawNumber(LIMITS_MAX_POS, y, MIN_MAX_DISPLAY(ld->max+LIMITS_MIN_MAX_OFFSET), MIN_MAX_ATTR|RIGHT); #if defined(CPUARM) if (active) ld->max = -LIMITS_MIN_MAX_OFFSET + checkIncDec(event, ld->max+LIMITS_MIN_MAX_OFFSET, 0, +limit, EE_MODEL, NULL, stops1000); #else @@ -190,7 +189,7 @@ void menuModelLimits(uint8_t event) #endif break; - case ITEM_LIMITS_DIRECTION: + case ITEM_OUTPUTS_DIRECTION: { uint8_t revert = ld->revert; #if defined(PPM_CENTER_ADJUSTABLE) @@ -211,8 +210,8 @@ void menuModelLimits(uint8_t event) } #if defined(PPM_CENTER_ADJUSTABLE) - case ITEM_LIMITS_PPM_CENTER: - lcdDrawNumber(LIMITS_PPM_CENTER_POS, y, PPM_CENTER+ld->ppmCenter, attr); + case ITEM_OUTPUTS_PPM_CENTER: + lcdDrawNumber(LIMITS_PPM_CENTER_POS, y, PPM_CENTER+ld->ppmCenter, RIGHT|attr); if (active) { CHECK_INCDEC_MODELVAR(event, ld->ppmCenter, -PPM_CENTER_MAX, +PPM_CENTER_MAX); } @@ -220,11 +219,11 @@ void menuModelLimits(uint8_t event) #endif #if defined(PPM_LIMITS_SYMETRICAL) - case ITEM_LIMITS_SYMETRICAL: + case ITEM_OUTPUTS_SYMETRICAL: #if defined(CPUARM) - lcdDrawChar(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, ld->symetrical ? '=' : '\306', attr); + lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '\306', attr); #else - lcdDrawChar(LCD_W-FW-MENUS_SCROLLBAR_WIDTH, y, ld->symetrical ? '=' : '^', attr); + lcdDrawChar(LCD_W-FW, y, ld->symetrical ? '=' : '^', attr); #endif if (active) { CHECK_INCDEC_MODELVAR_ZERO(event, ld->symetrical, 1); diff --git a/radio/src/gui/128x64/model_select.cpp b/radio/src/gui/128x64/model_select.cpp index d033e5c801..f822d1dc61 100644 --- a/radio/src/gui/128x64/model_select.cpp +++ b/radio/src/gui/128x64/model_select.cpp @@ -49,7 +49,7 @@ void onModelSelectMenu(const char *result) else if (result == STR_RESTORE_MODEL || result == STR_UPDATE_LIST) { if (!sdListFiles(MODELS_PATH, MODELS_EXT, MENU_LINE_LENGTH-1, NULL)) { POPUP_WARNING(STR_NO_MODELS_ON_SD); - popupMenuFlags = 0; + POPUP_MENU_UNSET_BSS_FLAG(); } } #endif @@ -92,7 +92,7 @@ void menuModelSelect(uint8_t event) int8_t oldSub = menuVerticalPosition; - check_submenu_simple(_event_, MAX_MODELS-1); + check_submenu_simple(_event_, MAX_MODELS-HEADER_LINE); #if defined(NAVIGATION_POT2) if (event==0 && p2valdiff<0) { @@ -110,8 +110,7 @@ void menuModelSelect(uint8_t event) int8_t sub = menuVerticalPosition; - switch (event) - { + switch (event) { case EVT_ENTRY: menuVerticalPosition = sub = g_eeGeneral.currModel; if (sub >= LCD_LINES-1) menuVerticalOffset = sub-LCD_LINES+2; @@ -253,7 +252,17 @@ void menuModelSelect(uint8_t event) s_copySrcRow = -1; } break; + +#if defined(PCBX7D) + case EVT_KEY_LONG(KEY_PAGE): + chainMenu(menuTabModel[DIM(menuTabModel)-1]); + killEvents(event); + break; + case EVT_KEY_BREAK(KEY_PAGE): + chainMenu(menuModelSetup); + break; +#else #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ROTARY_LEFT: case EVT_ROTARY_RIGHT: @@ -273,6 +282,7 @@ void menuModelSelect(uint8_t event) #if defined(ROTARY_ENCODER_NAVIGATION) } // no break +#endif #endif case EVT_KEY_FIRST(KEY_UP): @@ -302,13 +312,19 @@ void menuModelSelect(uint8_t event) break; } -#if !defined(PCBSKY9X) +#if defined(EEPROM_RLC) && defined(CPUARM) + lcdDrawText(9*FW-(LEN_FREE-4)*FW-4, 0, STR_FREE); + if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree(); + lcdDrawNumber(lcdLastPos+3, 0, reusableBuffer.modelsel.eepromfree, LEFT); +#elif defined(EEPROM_RLC) lcdDrawText(9*FW-(LEN_FREE-4)*FW, 0, STR_FREE); if (event) reusableBuffer.modelsel.eepromfree = EeFsGetFree(); - lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, 0); + lcdDrawNumber(17*FW, 0, reusableBuffer.modelsel.eepromfree, RIGHT); #endif - -#if defined(ROTARY_ENCODER_NAVIGATION) + +#if defined(PCBX7D) + drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), 0); +#elif defined(ROTARY_ENCODER_NAVIGATION) drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? ((IS_RE_NAVIGATION_ENABLE() && s_editMode < 0) ? INVERS|BLINK : INVERS) : 0); #else drawScreenIndex(MENU_MODEL_SELECT, DIM(menuTabModel), (sub == g_eeGeneral.currModel) ? INVERS : 0); @@ -320,7 +336,7 @@ void menuModelSelect(uint8_t event) coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; uint8_t k = i+menuVerticalOffset; - lcdDrawNumber(3*FW+2, y, k+1, LEADING0+((!s_copyMode && sub==k) ? INVERS : 0), 2); + lcdDrawNumber(3*FW+2, y, k+1, RIGHT+LEADING0+((!s_copyMode && sub==k) ? INVERS : 0), 2); if (s_copyMode == MOVE_MODE || (s_copyMode == COPY_MODE && s_copySrcRow >= 0)) { if (k == sub) { @@ -347,10 +363,11 @@ void menuModelSelect(uint8_t event) char * name = reusableBuffer.modelsel.listnames[i]; if (event) eeLoadModelName(k, name); putsModelName(4*FW, y, name, k, 0); - lcdDrawNumber(20*FW, y, eeModelSize(k), 0); + lcdDrawNumber(20*FW, y, eeModelSize(k), RIGHT); #endif - if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) + if (k==g_eeGeneral.currModel && (s_copyMode!=COPY_MODE || s_copySrcRow<0 || i+menuVerticalOffset!=(vertpos_t)sub)) { lcdDrawChar(1, y, '*'); + } } if (s_copyMode && (vertpos_t)sub==i+menuVerticalOffset) { diff --git a/radio/src/gui/128x64/model_setup.cpp b/radio/src/gui/128x64/model_setup.cpp index 4587054764..610f5e2895 100644 --- a/radio/src/gui/128x64/model_setup.cpp +++ b/radio/src/gui/128x64/model_setup.cpp @@ -25,7 +25,7 @@ uint8_t g_moduleIdx; void menuModelFailsafe(uint8_t event); #endif -enum menuModelSetupItems { +enum MenuModelSetupItems { ITEM_MODEL_NAME, ITEM_MODEL_TIMER1, CASE_CPUARM(ITEM_MODEL_TIMER1_NAME) @@ -55,6 +55,13 @@ enum menuModelSetupItems { ITEM_MODEL_SWITCHES_WARNING, ITEM_MODEL_BEEP_CENTER, CASE_CPUARM(ITEM_MODEL_USE_GLOBAL_FUNCTIONS) +#if defined(PCBX7D) + ITEM_MODEL_INTERNAL_MODULE_LABEL, + ITEM_MODEL_INTERNAL_MODULE_MODE, + ITEM_MODEL_INTERNAL_MODULE_CHANNELS, + ITEM_MODEL_INTERNAL_MODULE_BIND, + ITEM_MODEL_INTERNAL_MODULE_FAILSAFE, +#endif #if defined(CPUARM) ITEM_MODEL_EXTERNAL_MODULE_LABEL, ITEM_MODEL_EXTERNAL_MODULE_MODE, @@ -79,6 +86,12 @@ enum menuModelSetupItems { #else ITEM_MODEL_PPM1_PROTOCOL, ITEM_MODEL_PPM1_PARAMS, +#endif +#if defined(PCBX7D) + ITEM_MODEL_TRAINER_LABEL, + ITEM_MODEL_TRAINER_MODE, + ITEM_MODEL_TRAINER_CHANNELS, + ITEM_MODEL_TRAINER_SETTINGS, #endif ITEM_MODEL_SETUP_MAX }; @@ -89,23 +102,37 @@ enum menuModelSetupItems { #define FIELD_PROTOCOL_MAX 1 #endif -#define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW-MENUS_SCROLLBAR_WIDTH) +#define MODEL_SETUP_2ND_COLUMN (LCD_W-11*FW) #define MODEL_SETUP_BIND_OFS 2*FW+1 #define MODEL_SETUP_RANGE_OFS 4*FW+3 #define MODEL_SETUP_SET_FAILSAFE_OFS 7*FW-2 -#if defined(PCBSKY9X) && !defined(REVA) - #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) +#if defined(PCBX7D) + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_TRAINER_LABEL ? TRAINER_MODULE : (k>=ITEM_MODEL_EXTERNAL_MODULE_LABEL ? EXTERNAL_MODULE : INTERNAL_MODULE)) +#elif defined(PCBSKY9X) && !defined(REVA) + #define CURRENT_MODULE_EDITED(k) (k>=ITEM_MODEL_EXTRA_MODULE_LABEL ? EXTRA_MODULE : EXTERNAL_MODULE) #else #define CURRENT_MODULE_EDITED(k) (EXTERNAL_MODULE) #endif -void menuModelSetup(uint8_t event) -{ #if defined(CPUARM) - #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)(x) : HIDDEN_ROW) + +#if !defined(TARANIS_INTERNAL_PPM) + #define INTERNAL_MODULE_MODE_ROWS 0 // (OFF / RF protocols) +#else + #define INTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(INTERNAL_MODULE) ? (uint8_t)1 : (uint8_t)0) // Module type + RF protocols +#endif +#if defined(TARANIS_INTERNAL_PPM) + #define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) +#else + #define IF_INTERNAL_MODULE_ON(x) (g_model.moduleData[INTERNAL_MODULE].rfProtocol == RF_PROTO_OFF ? HIDDEN_ROW : (uint8_t)(x)) +#endif + #define IF_EXTERNAL_MODULE_ON(x) (g_model.moduleData[EXTERNAL_MODULE].type == MODULE_TYPE_NONE ? HIDDEN_ROW : (uint8_t)(x)) + #define IF_TRAINER_ON(x) (g_model.trainerMode == TRAINER_MODE_SLAVE ? (uint8_t)(x) : HIDDEN_ROW) #define IS_D8_RX(x) (g_model.moduleData[x].rfProtocol == RF_PROTO_D8) + #define IF_EXTERNAL_MODULE_XJT(x) (IS_MODULE_XJT(EXTERNAL_MODULE) ? (uint8_t)(x) : HIDDEN_ROW) + #define INTERNAL_MODULE_CHANNELS_ROWS IF_INTERNAL_MODULE_ON(1) #define EXTERNAL_MODULE_CHANNELS_ROWS IF_EXTERNAL_MODULE_ON((IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)0 : (uint8_t)1) #define EXTERNAL_MODULE_BIND_ROWS() (IS_MODULE_XJT(EXTERNAL_MODULE) && IS_D8_RX(EXTERNAL_MODULE)) ? (uint8_t)1 : (IS_MODULE_PPM(EXTERNAL_MODULE) || IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)2 : HIDDEN_ROW @@ -114,10 +141,9 @@ void menuModelSetup(uint8_t event) #else #define OUTPUT_TYPE_ROWS() #endif - #define TRAINER_CHANNELS_ROWS() (HIDDEN_ROW) #define PORT_CHANNELS_ROWS(x) (x==EXTERNAL_MODULE ? EXTERNAL_MODULE_CHANNELS_ROWS : 0) -#if defined MULTIMODULE +#if defined(MULTIMODULE) #define MULTIMODULE_HASOPTIONS(x) (x == MM_RF_PROTO_HUBSAN || x == MM_RF_PROTO_FRSKY || x == MM_RF_PROTO_DSM2 || x == MM_RF_PROTO_SFHSS || x >= MM_RF_PROTO_CUSTOM) #define MULTIMODULE_FAILSAFEROWS(x) (IS_MODULE_MULTIMODULE(x) && (MULTIMODULE_HASOPTIONS(g_model.moduleData[x].multi.rfProtocol))) ? (uint8_t) 0: HIDDEN_ROW #else @@ -140,16 +166,41 @@ void menuModelSetup(uint8_t event) #define EXTERNAL_MODULE_MODE_ROWS (IS_MODULE_XJT(EXTERNAL_MODULE) || IS_MODULE_DSM2(EXTERNAL_MODULE) || IS_MODULE_MULTIMODULE(EXTERNAL_MODULE)) ? (uint8_t)1 : (uint8_t)0 #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES (1+ITEM_MODEL_SETUP_MAX) - #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) + #define MODEL_SETUP_MAX_LINES (HEADER_LINE+ITEM_MODEL_SETUP_MAX) + #define POT_WARN_ITEMS() ((g_model.nPotsToWarn >> 6) ? (uint8_t)NUM_POTS+NUM_SLIDERS : (uint8_t)0) #define TIMER_ROWS 2, 0, CASE_PERSISTENT_TIMERS(0) 0, 0 #if defined(PCBSKY9X) && !defined(REVA) #define EXTRA_MODULE_ROWS LABEL(ExtraModule), 1, 2, #else #define EXTRA_MODULE_ROWS #endif + +#if defined(PCBX7D) + #define TRAINER_CHANNELS_ROWS() IF_TRAINER_ON(1) + #define TRAINER_MODULE_ROWS LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2) +#else #define TRAINER_MODULE_ROWS - MENU_TAB({ 0, 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, 6, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, 0, +#endif + +#elif defined(CPUM64) + #define CURSOR_ON_CELL (true) + #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? HEADER_LINE+ITEM_MODEL_SETUP_MAX : HEADER_LINE+ITEM_MODEL_SETUP_MAX-1) +#else + #define CURSOR_ON_CELL (true) + #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? HEADER_LINE+ITEM_MODEL_SETUP_MAX : HEADER_LINE+ITEM_MODEL_SETUP_MAX-1) +#endif + +void menuModelSetup(uint8_t event) +{ +#if defined(CPUARM) + MENU_TAB({ HEADER_LINE_COLUMNS 0, TIMER_ROWS, TIMER_ROWS, TIMER_ROWS, 0, 1, 0, 0, 0, 0, 0, CASE_CPUARM(LABEL(PreflightCheck)) CASE_CPUARM(0) 0, NUM_SWITCHES-1, NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1, 0, +#if defined(PCBX7D) + LABEL(InternalModule), + INTERNAL_MODULE_MODE_ROWS, + INTERNAL_MODULE_CHANNELS_ROWS, + IF_INTERNAL_MODULE_ON(HAS_RF_PROTOCOL_MODELINDEX(g_model.moduleData[INTERNAL_MODULE].rfProtocol) ? (uint8_t)2 : (uint8_t)1), + IF_INTERNAL_MODULE_ON(FAILSAFE_ROWS(INTERNAL_MODULE)), +#endif LABEL(ExternalModule), EXTERNAL_MODULE_MODE_ROWS, MULTIMODULE_SUBTYPE_ROWS(EXTERNAL_MODULE) @@ -161,15 +212,11 @@ void menuModelSetup(uint8_t event) EXTRA_MODULE_ROWS TRAINER_MODULE_ROWS }); #elif defined(CPUM64) - #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) uint8_t protocol = g_model.protocol; - MENU_TAB({ 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2 }); + MENU_TAB({ HEADER_LINE_COLUMNS 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2 }); #else - #define CURSOR_ON_CELL (true) - #define MODEL_SETUP_MAX_LINES ((IS_PPM_PROTOCOL(protocol)||IS_DSM2_PROTOCOL(protocol)||IS_PXX_PROTOCOL(protocol)) ? 1+ITEM_MODEL_SETUP_MAX : ITEM_MODEL_SETUP_MAX) uint8_t protocol = g_model.protocol; - MENU_TAB({ 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, NUM_SWITCHES, NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, CASE_PCBSKY9X(1) CASE_PCBSKY9X(2) }); + MENU_TAB({ HEADER_LINE_COLUMNS 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 2, CASE_PERSISTENT_TIMERS(0) 0, 0, 0, 1, 0, 0, 0, 0, 0, NUM_SWITCHES, NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1, FIELD_PROTOCOL_MAX, 2, CASE_PCBSKY9X(1) CASE_PCBSKY9X(2) }); #endif MENU_CHECK(menuTabModel, MENU_MODEL_SETUP, MODEL_SETUP_MAX_LINES); @@ -185,7 +232,7 @@ void menuModelSetup(uint8_t event) TITLE(STR_MENUSETUP); - uint8_t sub = menuVerticalPosition - 1; + uint8_t sub = menuVerticalPosition - HEADER_LINE; int8_t editMode = s_editMode; for (uint8_t i=0; i= (int)DIM(mstate_tab)) { return; } @@ -204,7 +251,7 @@ void menuModelSetup(uint8_t event) LcdFlags blink = ((editMode>0) ? BLINK|INVERS : INVERS); LcdFlags attr = (sub == k ? blink : 0); - switch(k) { + switch (k) { case ITEM_MODEL_NAME: editSingleName(MODEL_SETUP_2ND_COLUMN, y, STR_MODELNAME, g_model.header.name, sizeof(g_model.header.name), event, attr); #if defined(CPUARM) @@ -220,8 +267,8 @@ void menuModelSetup(uint8_t event) unsigned int timerIdx = (k>=ITEM_MODEL_TIMER3 ? 2 : (k>=ITEM_MODEL_TIMER2 ? 1 : 0)); TimerData * timer = &g_model.timers[timerIdx]; drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1); - putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); - putsTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr : 0, menuHorizontalPosition==2 ? attr : 0); + drawTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); + drawTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, RIGHT | (menuHorizontalPosition==1 ? attr : 0), menuHorizontalPosition==2 ? attr : 0); if (attr && (editMode>0 || p1valdiff)) { div_t qr = div(timer->start, 60); switch (menuHorizontalPosition) { @@ -311,8 +358,8 @@ void menuModelSetup(uint8_t event) } else { drawStringWithIndex(0*FW, y, STR_TIMER, k>=ITEM_MODEL_TIMER2 ? 2 : 1); - putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); - putsTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr : 0, menuHorizontalPosition==2 ? attr : 0); + drawTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer->mode, menuHorizontalPosition==0 ? attr : 0); + drawTimer(MODEL_SETUP_2ND_COLUMN+5*FW-2+5*FWNUM+1, y, timer->start, menuHorizontalPosition==1 ? attr : 0, menuHorizontalPosition==2 ? attr : 0); if (attr && (editMode>0 || p1valdiff)) { div_t qr = div(timer->start, 60); switch (menuHorizontalPosition) { @@ -358,7 +405,7 @@ void menuModelSetup(uint8_t event) ON_OFF_MENU_ITEM(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, attr, event); #else ON_OFF_MENU_ITEM(g_model.extendedTrims, MODEL_SETUP_2ND_COLUMN, y, STR_ETRIMS, menuHorizontalPosition<=0 ? attr : 0, event==EVT_KEY_BREAK(KEY_ENTER) ? event : 0); - lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_RESET_BTN, (menuHorizontalPosition>0 && !NO_HIGHLIGHT()) ? attr : 0); + lcdDrawText(MODEL_SETUP_2ND_COLUMN+4*FW, y, STR_RESET_BTN, (menuHorizontalPosition>0 && !NO_HIGHLIGHT()) ? attr : 0); if (attr && menuHorizontalPosition>0) { s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)) { @@ -390,13 +437,13 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_THROTTLE_TRACE: { lcdDrawTextAlignedLeft(y, STR_TTRACE); - if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_CHNOUT); + if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS); uint8_t idx = g_model.thrTraceSrc + MIXSRC_Thr; if (idx > MIXSRC_Thr) idx += 1; - if (idx >= MIXSRC_FIRST_POT+NUM_POTS) - idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS; - putsMixerSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); + if (idx >= MIXSRC_FIRST_POT+NUM_POTS+NUM_SLIDERS) + idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS - NUM_SLIDERS; + drawSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); break; } @@ -492,7 +539,7 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_BEEP_CENTER: lcdDrawTextAlignedLeft(y, STR_BEEPCTR); - for (uint8_t i=0; i 0 || p1valdiff)) { @@ -670,6 +736,23 @@ void menuModelSetup(uint8_t event) } break; #endif + +#if defined(PCBX7D) + case ITEM_MODEL_TRAINER_LABEL: + lcdDrawTextAlignedLeft(y, STR_TRAINER); + break; + + case ITEM_MODEL_TRAINER_MODE: + lcdDrawTextAlignedLeft(y, STR_MODE); + lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, STR_VTRAINERMODES, g_model.trainerMode, attr); + if (attr) g_model.trainerMode = checkIncDec(event, g_model.trainerMode, 0, HAS_WIRELESS_TRAINER_HARDWARE() ? TRAINER_MODE_MASTER_BATTERY_COMPARTMENT : TRAINER_MODE_MASTER_CPPM_EXTERNAL_MODULE, EE_MODEL, isTrainerModeAvailable); + break; +#endif + +#if defined(PCBX7D) + case ITEM_MODEL_INTERNAL_MODULE_CHANNELS: + case ITEM_MODEL_TRAINER_CHANNELS: +#endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_CHANNELS: #endif @@ -701,7 +784,11 @@ void menuModelSetup(uint8_t event) break; } #endif - + +#if defined(PCBX7D) + case ITEM_MODEL_TRAINER_SETTINGS: + case ITEM_MODEL_INTERNAL_MODULE_BIND: +#endif #if defined(PCBSKY9X) case ITEM_MODEL_EXTRA_MODULE_BIND: #endif @@ -715,9 +802,8 @@ void menuModelSetup(uint8_t event) lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)moduleData.ppm.frameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppm.delay*50)+300, (CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (moduleData.ppm.delay*50)+300, RIGHT | ((CURSOR_ON_LINE() || menuHorizontalPosition==1) ? attr : 0)); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, moduleData.ppm.pulsePol ? '+' : '-', (CURSOR_ON_LINE() || menuHorizontalPosition==2) ? attr : 0); - if (attr && (editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: @@ -782,7 +868,10 @@ void menuModelSetup(uint8_t event) break; } #endif - + +#if defined(PCBX7D) + case ITEM_MODEL_INTERNAL_MODULE_FAILSAFE: +#endif #if defined(CPUARM) case ITEM_MODEL_EXTERNAL_MODULE_FAILSAFE: { @@ -813,7 +902,7 @@ void menuModelSetup(uint8_t event) } } else { - lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN - MENUS_SCROLLBAR_WIDTH, 8); + lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN, y, LCD_W - MODEL_SETUP_2ND_COLUMN, 8); } } } @@ -905,9 +994,9 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_PPM2_PARAMS: lcdDrawTextAlignedLeft(y, STR_PPMFRAME); lcdDrawText(MODEL_SETUP_2ND_COLUMN+3*FW, y, STR_MS); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.moduleData[1].ppmFrameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1|LEFT); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN, y, (int16_t)g_model.moduleData[1].ppmFrameLength*5 + 225, (menuHorizontalPosition<=0 ? attr : 0) | PREC1 | LEFT); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, 'u'); - lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.moduleData[1].ppmDelay*50)+300, (menuHorizontalPosition < 0 || menuHorizontalPosition==1) ? attr : 0); + lcdDrawNumber(MODEL_SETUP_2ND_COLUMN+8*FW+2, y, (g_model.moduleData[1].ppmDelay*50)+300, RIGHT | ((menuHorizontalPosition < 0 || menuHorizontalPosition==1) ? attr : 0)); lcdDrawChar(MODEL_SETUP_2ND_COLUMN+10*FW, y, g_model.moduleData[1].ppmPulsePol ? '+' : '-', (menuHorizontalPosition < 0 || menuHorizontalPosition==2) ? attr : 0); if (attr && (editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { @@ -1005,9 +1094,7 @@ void menuModelFailsafe(uint8_t event) SEND_FAILSAFE_NOW(g_moduleIdx); } - SIMPLE_SUBMENU_NOTITLE(NUM_CHNOUT); - - SET_SCROLLBAR_X(0); + SIMPLE_SUBMENU_NOTITLE(MAX_OUTPUT_CHANNELS); #define COL_W (LCD_W) const uint8_t SLIDER_W = 90; diff --git a/radio/src/gui/128x64/model_special_functions.cpp b/radio/src/gui/128x64/model_special_functions.cpp index 29b1cc6165..a8e16d8d3f 100644 --- a/radio/src/gui/128x64/model_special_functions.cpp +++ b/radio/src/gui/128x64/model_special_functions.cpp @@ -59,7 +59,7 @@ void onCustomFunctionsFileSelectionMenu(const char *result) } if (!sdListFiles(directory, func==FUNC_PLAY_SCRIPT ? SCRIPTS_EXT : SOUNDS_EXT, sizeof(cfn->play.name), NULL)) { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); - popupMenuFlags = 0; + POPUP_MENU_UNSET_BSS_FLAG(); } } else { @@ -72,7 +72,7 @@ void onCustomFunctionsFileSelectionMenu(const char *result) void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext) { - int8_t sub = menuVerticalPosition - 1; + int8_t sub = menuVerticalPosition - HEADER_LINE; #if defined(CPUARM) uint8_t eeFlags = (functions == g_model.customFn) ? EE_MODEL : EE_GENERAL; @@ -80,18 +80,18 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF uint8_t eeFlags = EE_MODEL; #endif - for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS) : 0); uint8_t active = (attr && (s_editMode>0 || p1valdiff)); switch (j) { case 0: - putsSwitches(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); + drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); #if defined(CPUARM) if (func == FUNC_OVERRIDE_CHANNEL && functions != g_model.customFn) { @@ -122,7 +122,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF case 2: { - int8_t maxParam = NUM_CHNOUT-1; + int8_t maxParam = MAX_OUTPUT_CHANNELS-1; #if defined(OVERRIDE_CHANNEL_FUNCTION) if (func == FUNC_OVERRIDE_CHANNEL) { putsChn(lcdNextPos, y, CFN_CH_INDEX(cfn)+1, attr); @@ -132,9 +132,9 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF if (func == FUNC_TRAINER) { maxParam = 4; #if defined(CPUARM) - putsMixerSource(lcdNextPos, y, CFN_CH_INDEX(cfn)==0 ? 0 : MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); + drawSource(lcdNextPos, y, CFN_CH_INDEX(cfn)==0 ? 0 : MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); #else - putsMixerSource(lcdNextPos, y, MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); + drawSource(lcdNextPos, y, MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); #endif } #if defined(GVARS) @@ -197,7 +197,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF #if defined(CPUARM) else if (func == FUNC_SET_TIMER) { val_max = 539*60+59; - putsTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr); + drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT, attr); } #endif #if defined(AUDIO) @@ -234,21 +234,21 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF } else { POPUP_WARNING(func==FUNC_PLAY_SCRIPT ? STR_NO_SCRIPTS_ON_SD : STR_NO_SOUNDS_ON_SD); - popupMenuFlags = 0; + POPUP_MENU_UNSET_BSS_FLAG(); } } break; } else if (func == FUNC_PLAY_VALUE) { val_max = MIXSRC_LAST_TELEM; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); INCDEC_ENABLE_CHECK(isSourceAvailable); } #endif #if defined(CPUARM) else if (func == FUNC_VOLUME) { val_max = MIXSRC_LAST_CH; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -278,7 +278,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF } else if (func == FUNC_PLAY_VALUE) { val_max = MIXSRC_FIRST_TELEM + TELEM_DISPLAY_MAX - 1; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); INCDEC_ENABLE_CHECK(functionsContext == &globalFunctionsContext ? isSourceAvailableInGlobalFunctions : isSourceAvailable); } #endif @@ -303,7 +303,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF break; case FUNC_ADJUST_GVAR_SOURCE: val_max = MIXSRC_LAST_CH; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); break; @@ -377,6 +377,6 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF void menuModelSpecialFunctions(uint8_t event) { - MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, NUM_CFN+1, {0, NAVIGATION_LINE_BY_LINE|4/*repeated*/}); + MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS+1, {0, NAVIGATION_LINE_BY_LINE|4/*repeated*/}); return menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext); } diff --git a/radio/src/gui/128x64/model_telemetry.cpp b/radio/src/gui/128x64/model_telemetry.cpp index b1cde37877..df2b3ff08c 100644 --- a/radio/src/gui/128x64/model_telemetry.cpp +++ b/radio/src/gui/128x64/model_telemetry.cpp @@ -96,6 +96,8 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_VARIO_SOURCE, #endif CASE_VARIO(ITEM_TELEMETRY_VARIO_RANGE) +#if !defined(CPUARM) + // TODO check the cost of moving them to a new screen on the 9X ITEM_TELEMETRY_SCREEN_LABEL1, ITEM_TELEMETRY_SCREEN_LINE1, ITEM_TELEMETRY_SCREEN_LINE2, @@ -106,17 +108,6 @@ enum MenuModelTelemetryFrskyItems { ITEM_TELEMETRY_SCREEN_LINE6, ITEM_TELEMETRY_SCREEN_LINE7, ITEM_TELEMETRY_SCREEN_LINE8, -#if defined(CPUARM) - ITEM_TELEMETRY_SCREEN_LABEL3, - ITEM_TELEMETRY_SCREEN_LINE9, - ITEM_TELEMETRY_SCREEN_LINE10, - ITEM_TELEMETRY_SCREEN_LINE11, - ITEM_TELEMETRY_SCREEN_LINE12, - ITEM_TELEMETRY_SCREEN_LABEL4, - ITEM_TELEMETRY_SCREEN_LINE13, - ITEM_TELEMETRY_SCREEN_LINE14, - ITEM_TELEMETRY_SCREEN_LINE15, - ITEM_TELEMETRY_SCREEN_LINE16, #endif ITEM_TELEMETRY_MAX }; @@ -181,12 +172,11 @@ enum MenuModelTelemetryFrskyItems { #endif #if defined(CPUARM) - #define TELEMETRY_SCREEN_LINE(x) (TELEMETRY_SCREEN_TYPE(x) == TELEMETRY_SCREEN_TYPE_NONE ? HIDDEN_ROW : (uint8_t)2) - #define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x), TELEMETRY_SCREEN_LINE(x) - #define TELEMETRY_CURRENT_SCREEN(k) (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 0 : (k < ITEM_TELEMETRY_SCREEN_LABEL3 ? 1 : (k < ITEM_TELEMETRY_SCREEN_LABEL4 ? 2 : 3))) + #define TELEMETRY_SCREENS_ROWS #else #define TELEMETRY_SCREEN_ROWS(x) SCREEN_TYPE_ROWS, 2, 2, 2, 2 #define TELEMETRY_CURRENT_CHANNEL(k) (k >= ITEM_TELEMETRY_A2_LABEL ? TELEM_ANA_A2 : TELEM_ANA_A1) + #define TELEMETRY_SCREENS_ROWS TELEMETRY_SCREEN_ROWS(0), TELEMETRY_SCREEN_ROWS(1) #endif #if defined(CPUARM) @@ -322,25 +312,25 @@ void menuModelSensor(uint8_t event) if (sensor->type == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { lcdDrawTextAlignedLeft(y, STR_CELLSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); if (attr) { - sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); + sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); } break; } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawTextAlignedLeft(y, STR_GPSSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); if (attr) { - sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); + sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); } break; } else if (sensor->formula == TELEM_FORMULA_CONSUMPTION) { lcdDrawTextAlignedLeft(y, STR_CURRENTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { - sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCurrentSensor); + sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCurrentSensor); } break; } @@ -372,9 +362,9 @@ void menuModelSensor(uint8_t event) } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawTextAlignedLeft(y, STR_ALTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); if (attr) { - sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); + sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); } break; } @@ -396,14 +386,14 @@ void menuModelSensor(uint8_t event) drawStringWithIndex(0, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_SENSORS, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } if (source < 0) { lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr); - putsMixerSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); } else { - putsMixerSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); } break; } @@ -436,14 +426,14 @@ void onSensorMenu(const char *result) { uint8_t index = menuVerticalPosition - 1 - ITEM_TELEMETRY_SENSOR1; - if (index < MAX_SENSORS) { + if (index < MAX_TELEMETRY_SENSORS) { if (result == STR_EDIT) { pushMenu(menuModelSensor); } else if (result == STR_DELETE) { delTelemetryIndex(index); index += 1; - if (index0 && sub<=ITEM_TELEMETRY_RSSI_ALARM2) frskySendAlarms(); // update FrSky module when edit mode exited break; @@ -498,7 +490,7 @@ void menuModelTelemetryFrsky(uint8_t event) uint8_t k = i + menuVerticalOffset; #if defined(CPUARM) for (int j=0; j<=k; j++) { - if (mstate_tab[j+1] == HIDDEN_ROW) + if (mstate_tab[j+HEADER_LINE] == HIDDEN_ROW) k++; } #endif @@ -513,7 +505,7 @@ void menuModelTelemetryFrsky(uint8_t event) #endif #if defined(CPUARM) - if (k>=ITEM_TELEMETRY_SENSOR1 && k=ITEM_TELEMETRY_SENSOR1 && k0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: @@ -806,23 +798,9 @@ void menuModelTelemetryFrsky(uint8_t event) break; #endif +#if !defined(CPUARM) case ITEM_TELEMETRY_SCREEN_LABEL1: case ITEM_TELEMETRY_SCREEN_LABEL2: -#if defined(CPUARM) - case ITEM_TELEMETRY_SCREEN_LABEL3: - case ITEM_TELEMETRY_SCREEN_LABEL4: - { - uint8_t screenIndex = TELEMETRY_CURRENT_SCREEN(k); - drawStringWithIndex(0*FW, y, STR_SCREEN, screenIndex+1); - TelemetryScreenType oldScreenType = TELEMETRY_SCREEN_TYPE(screenIndex); - TelemetryScreenType newScreenType = (TelemetryScreenType)selectMenuItem(TELEM_SCRTYPE_COL, y, PSTR(""), STR_VTELEMSCREENTYPE, oldScreenType, 0, TELEMETRY_SCREEN_TYPE_MAX, (menuHorizontalPosition==0 ? attr : 0), event); - if (newScreenType != oldScreenType) { - g_model.frsky.screensType = (g_model.frsky.screensType & (~(0x03 << (2*screenIndex)))) | (newScreenType << (2*screenIndex)); - memset(&g_model.frsky.screens[screenIndex], 0, sizeof(g_model.frsky.screens[screenIndex])); - } - break; - } -#else { uint8_t screenIndex = (k < ITEM_TELEMETRY_SCREEN_LABEL2 ? 1 : 2); drawStringWithIndex(0*FW, y, STR_SCREEN, screenIndex); @@ -833,7 +811,6 @@ void menuModelTelemetryFrsky(uint8_t event) #endif break; } -#endif case ITEM_TELEMETRY_SCREEN_LINE1: case ITEM_TELEMETRY_SCREEN_LINE2: @@ -843,33 +820,12 @@ void menuModelTelemetryFrsky(uint8_t event) case ITEM_TELEMETRY_SCREEN_LINE6: case ITEM_TELEMETRY_SCREEN_LINE7: case ITEM_TELEMETRY_SCREEN_LINE8: - -#if defined(CPUARM) - case ITEM_TELEMETRY_SCREEN_LINE9: - case ITEM_TELEMETRY_SCREEN_LINE10: - case ITEM_TELEMETRY_SCREEN_LINE11: - case ITEM_TELEMETRY_SCREEN_LINE12: - case ITEM_TELEMETRY_SCREEN_LINE13: - case ITEM_TELEMETRY_SCREEN_LINE14: - case ITEM_TELEMETRY_SCREEN_LINE15: - case ITEM_TELEMETRY_SCREEN_LINE16: -#endif { uint8_t screenIndex, lineIndex; if (k < ITEM_TELEMETRY_SCREEN_LABEL2) { screenIndex = 0; lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE1; } -#if defined(CPUARM) - else if (k >= ITEM_TELEMETRY_SCREEN_LABEL4) { - screenIndex = 3; - lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE13; - } - else if (k >= ITEM_TELEMETRY_SCREEN_LABEL3) { - screenIndex = 2; - lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE9; - } -#endif else { screenIndex = 1; lineIndex = k-ITEM_TELEMETRY_SCREEN_LINE5; @@ -879,58 +835,28 @@ void menuModelTelemetryFrsky(uint8_t event) if (IS_BARS_SCREEN(screenIndex)) { FrSkyBarData & bar = g_model.frsky.screens[screenIndex].bars[lineIndex]; source_t barSource = bar.source; -#if defined(CPUARM) - putsMixerSource(TELEM_COL1, y, barSource, menuHorizontalPosition==0 ? attr : 0); - if (barSource) { - if (barSource <= MIXSRC_LAST_CH) { - putsChannelValue(TELEM_BARS_COLMIN, y, barSource, calc100toRESX(bar.barMin), (menuHorizontalPosition==1 ? attr : 0) | LEFT); - putsChannelValue(TELEM_BARS_COLMAX, y, barSource, calc100toRESX(bar.barMax), (menuHorizontalPosition==2 ? attr : 0) | LEFT); - } - else { - putsChannelValue(TELEM_BARS_COLMIN, y, barSource, bar.barMin, (menuHorizontalPosition==1 ? attr : 0) | LEFT); - putsChannelValue(TELEM_BARS_COLMAX, y, barSource, bar.barMax, (menuHorizontalPosition==2 ? attr : 0) | LEFT); - } - } -#else lcdDrawTextAtIndex(TELEM_COL1, y, STR_VTELEMCHNS, barSource, menuHorizontalPosition==0 ? attr : 0); if (barSource) { putsTelemetryChannelValue(TELEM_BARS_COLMIN, y, barSource-1, convertBarTelemValue(barSource, bar.barMin), (menuHorizontalPosition==1 ? attr : 0) | LEFT); putsTelemetryChannelValue(TELEM_BARS_COLMAX, y, barSource-1, convertBarTelemValue(barSource, 255-bar.barMax), (menuHorizontalPosition==2 ? attr : 0) | LEFT); } -#endif else if (attr && menuHorizontalPosition>0) { menuHorizontalPosition = 0; } if (attr && (s_editMode>0 || p1valdiff)) { switch (menuHorizontalPosition) { case 0: -#if defined(CPUARM) - bar.source = CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, barSource, MIXSRC_LAST_TELEM, isSourceAvailable); -#else bar.source = CHECK_INCDEC_MODELVAR_ZERO(event, barSource, TELEM_DISPLAY_MAX); -#endif if (checkIncDec_Ret) { bar.barMin = 0; -#if defined(CPUARM) - bar.barMax = 0; -#else bar.barMax = 255 - maxBarTelemValue(bar.source); -#endif } break; case 1: -#if defined(CPUARM) - bar.barMin = checkIncDec(event, bar.barMin, -30000, bar.barMax, EE_MODEL|NO_INCDEC_MARKS); -#else bar.barMin = checkIncDec(event, bar.barMin, 0, 254-bar.barMax, EE_MODEL|NO_INCDEC_MARKS); -#endif break; case 2: -#if defined(CPUARM) - bar.barMax = checkIncDec(event, bar.barMax, bar.barMin, 30000, EE_MODEL|NO_INCDEC_MARKS); -#else bar.barMax = 255 - checkIncDec(event, 255-bar.barMax, bar.barMin+1, maxBarTelemValue(barSource), EE_MODEL|NO_INCDEC_MARKS); -#endif break; } } @@ -942,17 +868,10 @@ void menuModelTelemetryFrsky(uint8_t event) uint8_t cellAttr = (menuHorizontalPosition==c ? attr : 0); source_t & value = g_model.frsky.screens[screenIndex].lines[lineIndex].sources[c]; uint8_t pos[] = {INDENT_WIDTH, TELEM_COL2}; -#if defined(CPUARM) - putsMixerSource(pos[c], y, value, cellAttr); - if (cellAttr && (s_editMode>0 || p1valdiff)) { - CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, value, MIXSRC_LAST_TELEM, isSourceAvailable); - } -#else lcdDrawTextAtIndex(pos[c], y, STR_VTELEMCHNS, value, cellAttr); if (cellAttr && (s_editMode>0 || p1valdiff)) { CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, value, (lineIndex==3 && c==0) ? TELEM_STATUS_MAX : TELEM_DISPLAY_MAX, isTelemetrySourceAvailable); } -#endif } if (attr && menuHorizontalPosition == NUM_LINE_ITEMS) { REPEAT_LAST_CURSOR_MOVE(); @@ -960,6 +879,7 @@ void menuModelTelemetryFrsky(uint8_t event) } break; } +#endif // !defined(CPUARM) } } } diff --git a/radio/src/gui/128x64/navigation.cpp b/radio/src/gui/128x64/navigation.cpp index 642ab407da..fccb20b691 100644 --- a/radio/src/gui/128x64/navigation.cpp +++ b/radio/src/gui/128x64/navigation.cpp @@ -23,7 +23,7 @@ vertpos_t menuVerticalOffset; int8_t s_editMode; uint8_t noHighlightCounter; -uint8_t calibrationState; +uint8_t menuCalibrationState; vertpos_t menuVerticalPosition; horzpos_t menuHorizontalPosition; @@ -41,7 +41,7 @@ int8_t checkIncDecMovedSwitch(int8_t val) if (s_editMode>0) { int8_t swtch = getMovedSwitch(); if (swtch) { - if (IS_MOMENTARY(val) && swtch==val) + if (IS_CONFIG_TOGGLE(swtch) && swtch==val) val = -val; else val = swtch; @@ -53,16 +53,229 @@ int8_t checkIncDecMovedSwitch(int8_t val) int8_t checkIncDec_Ret; -#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) -#define DBLKEYS_PRESSED_UP_DWN(in) ((in & (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) -#define DBLKEYS_PRESSED_RGT_UP(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) -#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) +#if defined(PCBX7D) +#define DBLKEYS_PRESSED_RGT_LFT(in) (false) +#define DBLKEYS_PRESSED_UP_DWN(in) (false) +#define DBLKEYS_PRESSED_RGT_UP(in) (false) +#define DBLKEYS_PRESSED_LFT_DWN(in) (false) +#else +#define DBLKEYS_PRESSED_RGT_LFT(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_LEFT)) +#define DBLKEYS_PRESSED_UP_DWN(in) ((in & (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_UP + KEYS_GPIO_PIN_DOWN)) +#define DBLKEYS_PRESSED_RGT_UP(in) ((in & (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) == (KEYS_GPIO_PIN_RIGHT + KEYS_GPIO_PIN_UP)) +#define DBLKEYS_PRESSED_LFT_DWN(in) ((in & (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) == (KEYS_GPIO_PIN_LEFT + KEYS_GPIO_PIN_DOWN)) +#endif #if defined(CPUARM) INIT_STOPS(stops100, 3, -100, 0, 100) INIT_STOPS(stops1000, 3, -1000, 0, 1000) INIT_STOPS(stopsSwitch, 15, SWSRC_FIRST, CATEGORY_END(-SWSRC_FIRST_LOGICAL_SWITCH), CATEGORY_END(-SWSRC_FIRST_TRIM), CATEGORY_END(-SWSRC_LAST_SWITCH+1), 0, CATEGORY_END(SWSRC_LAST_SWITCH), CATEGORY_END(SWSRC_FIRST_TRIM-1), CATEGORY_END(SWSRC_FIRST_LOGICAL_SWITCH-1), SWSRC_LAST) + #if defined(PCBX7D) +int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, const CheckIncDecStops &stops) +{ + int newval = val; + +#if defined(DBLKEYS) + uint32_t in = KEYS_PRESSED(); + if (!(i_flags & NO_DBLKEYS) && (EVT_KEY_MASK(event))) { + bool dblkey = true; + if (DBLKEYS_PRESSED_RGT_LFT(in)) { + if (!isValueAvailable || isValueAvailable(-val)) { + newval = -val; + } + } + else if (DBLKEYS_PRESSED_RGT_UP(in)) { + newval = (i_max > stops.max() ? stops.max() : i_max); + while (isValueAvailable && !isValueAvailable(newval) && newval>i_min) { + --newval; + } + } + else if (DBLKEYS_PRESSED_LFT_DWN(in)) { + newval = (i_min < stops.min() ? stops.min() : i_min); + while (isValueAvailable && !isValueAvailable(newval) && newval0 && (event==EVT_KEY_FIRST(KEY_PLUS) || event==EVT_KEY_REPT(KEY_PLUS))) { + do { + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval += min(10, i_max-val); + } + else { + newval++; + } + } while (isValueAvailable && !isValueAvailable(newval) && newval<=i_max); + if (newval > i_max) { + newval = val; + killEvents(event); + AUDIO_KEY_ERROR(); + } + } + else if (s_editMode>0 && (event==EVT_KEY_FIRST(KEY_MINUS) || event==EVT_KEY_REPT(KEY_MINUS))) { + do { + if (IS_KEY_REPT(event) && (i_flags & INCDEC_REP10)) { + newval -= min(10, val-i_min); + } + else { + newval--; + } + } while (isValueAvailable && !isValueAvailable(newval) && newval>=i_min); + if (newval < i_min) { + newval = val; + killEvents(event); + AUDIO_KEY_ERROR(); + } + } + + if (!READ_ONLY() && i_min==0 && i_max==1 && event==EVT_KEY_BREAK(KEY_ENTER)) { + s_editMode = 0; + newval = !val; + } + +#if defined(AUTOSWITCH) + if (i_flags & INCDEC_SWITCH) { + newval = checkIncDecMovedSwitch(newval); + } +#endif + +#if defined(AUTOSOURCE) + if (i_flags & INCDEC_SOURCE) { + if (s_editMode>0) { + int source = GET_MOVED_SOURCE(i_min, i_max); + if (source) { + newval = source; + } +#if defined(AUTOSWITCH) + else { + unsigned int swtch = abs(getMovedSwitch()); + if (swtch) { + newval = switchToMix(swtch); + } + } +#endif + } + } +#endif + + if (newval != val) { + if (!(i_flags & NO_INCDEC_MARKS) && (newval != i_max) && (newval != i_min) && stops.contains(newval)) { + bool pause = (newval > val ? !stops.contains(newval+1) : !stops.contains(newval-1)); + if (pause) { + pauseEvents(event); // delay before auto-repeat continues + } + } + storageDirty(i_flags & (EE_GENERAL|EE_MODEL)); + checkIncDec_Ret = (newval > val ? 1 : -1); + if (!IS_KEY_REPT(event)) { + AUDIO_KEY_PRESS(); + } + } + else { + checkIncDec_Ret = 0; + } + + if (i_flags & INCDEC_SOURCE) { + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + // TODO checkIncDecSelection = MIXSRC_NONE; + + if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) { + if (getFirstAvailable(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE) { + POPUP_MENU_ADD_ITEM(STR_MENU_INPUTS); + } + } +#if defined(LUA_MODEL_SCRIPTS) + if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) { + if (getFirstAvailable(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE) { + POPUP_MENU_ADD_ITEM(STR_MENU_LUA); + } + } +#endif + if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) POPUP_MENU_ADD_ITEM(STR_MENU_STICKS); + if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) POPUP_MENU_ADD_ITEM(STR_MENU_POTS); + if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) POPUP_MENU_ADD_ITEM(STR_MENU_MAX); +#if defined(HELI) + if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI) POPUP_MENU_ADD_ITEM(STR_MENU_HELI); +#endif + if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); + if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); + if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) POPUP_MENU_ADD_ITEM(STR_MENU_TRAINER); + if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) POPUP_MENU_ADD_ITEM(STR_MENU_CHANNELS); + if (i_min <= MIXSRC_FIRST_GVAR && i_max >= MIXSRC_FIRST_GVAR && isValueAvailable(MIXSRC_FIRST_GVAR)) { + POPUP_MENU_ADD_ITEM(STR_MENU_GVARS); + } + + if (i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { + for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { + TelemetrySensor * sensor = & g_model.telemetrySensors[i]; + if (sensor->isAvailable()) { + POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); + break; + } + } + } + // TODO POPUP_MENU_START(onSourceLongEnterPress); + } + #if 0 // TODO + if (checkIncDecSelection != 0) { + newval = checkIncDecSelection; + if (checkIncDecSelection != MIXSRC_MAX) + s_editMode = EDIT_MODIFY_FIELD; + checkIncDecSelection = 0; + } + #endif + } + #if 0 // TODO + else if (i_flags & INCDEC_SWITCH) { + if (event == EVT_KEY_LONG(KEY_ENTER)) { + killEvents(event); + checkIncDecSelection = SWSRC_NONE; + if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); + if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); + if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { + for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { + if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { + POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); + break; + } + } + } + if (isValueAvailable && isValueAvailable(SWSRC_ON)) POPUP_MENU_ADD_ITEM(STR_MENU_OTHER); + if (isValueAvailable && isValueAvailable(-newval)) POPUP_MENU_ADD_ITEM(STR_MENU_INVERT); + POPUP_MENU_START(onSwitchLongEnterPress); + s_editMode = EDIT_MODIFY_FIELD; + } + if (checkIncDecSelection != 0) { + newval = (checkIncDecSelection == SWSRC_INVERT ? -newval : checkIncDecSelection); + s_editMode = EDIT_MODIFY_FIELD; + checkIncDecSelection = 0; + } + } + #endif + return newval; +} + #else int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int i_flags, IsValueAvailable isValueAvailable, const CheckIncDecStops &stops) { int newval = val; @@ -182,6 +395,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } return newval; } + #endif #else int16_t checkIncDec(uint8_t event, int16_t val, int16_t i_min, int16_t i_max, uint8_t i_flags) { @@ -316,6 +530,253 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max) tmr10ms_t menuEntryTime; #endif +#if defined(PCBX7D) +#define MAXCOL_RAW(row) (horTab ? pgm_read_byte(horTab+min(row, (vertpos_t)horTabMax)) : (const uint8_t)0) +#define MAXCOL(row) (MAXCOL_RAW(row) >= HIDDEN_ROW ? MAXCOL_RAW(row) : (const uint8_t)(MAXCOL_RAW(row) & (~NAVIGATION_LINE_BY_LINE))) +#define COLATTR(row) (MAXCOL_RAW(row) == (uint8_t)-1 ? (const uint8_t)0 : (const uint8_t)(MAXCOL_RAW(row) & NAVIGATION_LINE_BY_LINE)) +#define MENU_FIRST_LINE_EDIT (menuTab ? (MAXCOL((uint16_t)0) >= HIDDEN_ROW ? (MAXCOL((uint16_t)1) >= HIDDEN_ROW ? 2 : 1) : 0) : 0) +#define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0) +#define EDIT_MODE_INIT 0 // TODO enum + +void check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, const pm_uint8_t * horTab, uint8_t horTabMax, vertpos_t rowcount) +{ + vertpos_t l_posVert = menuVerticalPosition; + horzpos_t l_posHorz = menuHorizontalPosition; + + uint8_t maxcol = MAXCOL(l_posVert); + + if (menuTab) { + int cc = curr; + switch (event) { +#if 0 // TODO + case EVT_KEY_LONG(KEY_MENU): + if (menuTab == menuTabModel) { + killEvents(event); + if (modelHasNotes()) { + POPUP_MENU_ADD_SD_ITEM(STR_VIEW_CHANNELS); + POPUP_MENU_ADD_ITEM(STR_VIEW_NOTES); + POPUP_MENU_START(onLongMenuPress); + } + else { + pushMenu(menuChannelsView); + } + } + break; +#endif + + case EVT_KEY_LONG(KEY_PAGE): + if (curr > 0) + cc = curr - 1; + else + cc = menuTabSize-1; + killEvents(event); + break; + + case EVT_KEY_BREAK(KEY_PAGE): + if (curr < (menuTabSize-1)) + cc = curr + 1; + else + cc = 0; + break; + } + + if (!menuCalibrationState && cc != curr) { + chainMenu((MenuHandlerFunc)pgm_read_adr(&menuTab[cc])); + } + + // TODO if (!(flags&CHECK_FLAG_NO_SCREEN_INDEX)) { + drawScreenIndex(curr, menuTabSize, 0); + // } + + // TODO lcdDrawFilledRect(0, 0, LCD_W, MENU_HEADER_HEIGHT, SOLID, FILL_WHITE|GREY_DEFAULT); + } + + DISPLAY_PROGRESS_BAR(menuTab ? lcdLastPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); + + switch (event) { + case EVT_ENTRY: + menuEntryTime = get_tmr10ms(); + s_editMode = EDIT_MODE_INIT; + l_posVert = MENU_FIRST_LINE_EDIT; + l_posHorz = POS_HORZ_INIT(l_posVert); + break; + + case EVT_ENTRY_UP: + menuEntryTime = get_tmr10ms(); + s_editMode = 0; + l_posHorz = POS_HORZ_INIT(l_posVert); + break; + + case EVT_ROTARY_BREAK: + if (s_editMode > 1) break; + if (menuHorizontalPosition < 0 && maxcol > 0 && READ_ONLY_UNLOCKED()) { + l_posHorz = 0; + AUDIO_KEY_PRESS(); + } + else if (READ_ONLY_UNLOCKED()) { + s_editMode = (s_editMode<=0); + AUDIO_KEY_PRESS(); + } + break; + + case EVT_KEY_LONG(KEY_EXIT): + s_editMode = 0; // TODO needed? we call ENTRY_UP after which does the same + popMenu(); + break; + + case EVT_KEY_BREAK(KEY_EXIT): + if (s_editMode > 0) { + s_editMode = 0; + AUDIO_KEY_PRESS(); + break; + } + + if (l_posHorz >= 0 && (COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { + l_posHorz = -1; + AUDIO_KEY_PRESS(); + } + else { + uint8_t posVertInit = MENU_FIRST_LINE_EDIT; + if (menuVerticalOffset != 0 || l_posVert != posVertInit) { + menuVerticalOffset = 0; + l_posVert = posVertInit; + l_posHorz = POS_HORZ_INIT(l_posVert); + AUDIO_KEY_PRESS(); + } + else { + popMenu(); + } + } + break; + + case EVT_KEY_FIRST(KEY_RIGHT): + AUDIO_KEY_PRESS(); + // no break + case EVT_KEY_REPT(KEY_RIGHT): + if (s_editMode > 0) break; // TODO it was != + if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { + if (l_posHorz >= 0) { + INC(l_posHorz, 0, maxcol); + break; + } + } + else { + if (l_posHorz < maxcol) { + l_posHorz++; + break; + } + else { + l_posHorz = 0; + } + } + + do { + INC(l_posVert, MENU_FIRST_LINE_EDIT, rowcount-1); + } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); + + s_editMode = 0; // if we go down, we must be in this mode + + l_posHorz = POS_HORZ_INIT(l_posVert); + break; + + case EVT_KEY_FIRST(KEY_LEFT): + AUDIO_KEY_PRESS(); + // no break + case EVT_KEY_REPT(KEY_LEFT): + if (s_editMode > 0) break; // TODO it was != + if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) { + if (l_posHorz >= 0) { + DEC(l_posHorz, 0, maxcol); + break; + } + } + else if (l_posHorz > 0) { + l_posHorz--; + break; + } + else { + l_posHorz = 0xff; + } + + do { + DEC(l_posVert, MENU_FIRST_LINE_EDIT, rowcount-1); + } while (CURSOR_NOT_ALLOWED_IN_ROW(l_posVert)); + + s_editMode = 0; // if we go up, we must be in this mode + + if ((COLATTR(l_posVert) & NAVIGATION_LINE_BY_LINE)) + l_posHorz = -1; + else + l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); + + break; + } + + int linesCount = rowcount; + + if (l_posVert == 0 || (l_posVert==1 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW) || (l_posVert==2 && MAXCOL(vertpos_t(0)) >= HIDDEN_ROW && MAXCOL(vertpos_t(1)) >= HIDDEN_ROW)) { + menuVerticalOffset = 0; + if (horTab) { + linesCount = 0; + for (int i=0; ihorTabMax || horTab[i] != HIDDEN_ROW) { + linesCount++; + } + } + } + } + else if (horTab) { + if (rowcount > NUM_BODY_LINES) { + while (1) { + vertpos_t firstLine = 0; + for (int numLines=0; firstLine=horTabMax || horTab[firstLine] != HIDDEN_ROW) { + numLines++; + } + } + if (l_posVert < firstLine) { + menuVerticalOffset--; + } + else { + vertpos_t lastLine = firstLine; + for (int numLines=0; lastLine=horTabMax || horTab[lastLine] != HIDDEN_ROW) { + numLines++; + } + } + if (l_posVert >= lastLine) { + menuVerticalOffset++; + } + else { + linesCount = menuVerticalOffset + NUM_BODY_LINES; + for (int i=lastLine; ihorTabMax || horTab[i] != HIDDEN_ROW) { + linesCount++; + } + } + break; + } + } + } + } + } + else { + if (l_posVert>=NUM_BODY_LINES+menuVerticalOffset) { + menuVerticalOffset = l_posVert-NUM_BODY_LINES+1; + } + else if (l_posVert 0) { @@ -416,7 +876,7 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t #endif } - calibrationState = 0; + menuCalibrationState = 0; drawScreenIndex(curr, menuTabSize, attr); } @@ -434,7 +894,7 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t } } - switch(event) + switch (event) { case EVT_ENTRY: #if defined(CPUARM) @@ -442,7 +902,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t #endif l_posVert = 0; l_posHorz = POS_HORZ_INIT(l_posVert); - SET_SCROLLBAR_X(LCD_W-1); #if defined(ROTARY_ENCODER_NAVIGATION) if (menuTab) { s_editMode = EDIT_MODE_INIT; @@ -457,7 +916,6 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t #if defined(ROTARY_ENCODER_NAVIGATION) case EVT_ENTRY_UP: s_editMode = 0; - SET_SCROLLBAR_X(LCD_W-1); break; case EVT_ROTARY_BREAK: @@ -532,12 +990,13 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t INC(l_posHorz, 0, maxcol); break; #endif - - case EVT_KEY_REPT(KEY_DOWN): //inc + +#if !defined(PCBX7D) + case EVT_KEY_REPT(KEY_DOWN): if (!IS_ROTARY_RIGHT(event) && l_posVert==maxrow) break; // no break - case EVT_KEY_FIRST(KEY_DOWN): //inc + case EVT_KEY_FIRST(KEY_DOWN): if (s_editMode>0) break; do { INC(l_posVert, 0, maxrow); @@ -547,8 +1006,9 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t s_editMode = 0; // if we go down, we must be in this mode #endif - l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); + l_posHorz = min(l_posHorz, MAXCOL(l_posVert)); break; +#endif case EVT_KEY_REPT(KEY_LEFT): //dec if (l_posHorz==0) break; @@ -576,10 +1036,11 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t break; #endif - case EVT_KEY_REPT(KEY_UP): //dec +#if !defined(PCBX7D) + case EVT_KEY_REPT(KEY_UP): if (!IS_ROTARY_LEFT(event) && l_posVert==0) break; // no break - case EVT_KEY_FIRST(KEY_UP): //dec + case EVT_KEY_FIRST(KEY_UP): if (s_editMode>0) break; do { @@ -592,6 +1053,7 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t l_posHorz = min((uint8_t)l_posHorz, MAXCOL(l_posVert)); break; +#endif } uint8_t maxLines = menuTab ? LCD_LINES-1 : LCD_LINES-2; @@ -670,8 +1132,9 @@ void check(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t } #endif } +#endif -void check_simple(event_t event, uint8_t curr, const MenuHandlerFunc *menuTab, uint8_t menuTabSize, vertpos_t maxrow) +void check_simple(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuTabSize, vertpos_t maxrow) { check(event, curr, menuTab, menuTabSize, 0, 0, maxrow); } diff --git a/radio/src/gui/128x64/popups.cpp b/radio/src/gui/128x64/popups.cpp index ee94cd1f36..efbb9772ca 100644 --- a/radio/src/gui/128x64/popups.cpp +++ b/radio/src/gui/128x64/popups.cpp @@ -53,14 +53,14 @@ void showMessageBox(const pm_char * pstr) lcdRefresh(); } -const pm_uchar asterisk_lbm[] PROGMEM = { +const pm_uchar ASTERISK_BITMAP[] PROGMEM = { #include "asterisk.lbm" }; -void showAlertBox(const pm_char * title, const pm_char * text, const char * action ALERT_SOUND_ARG) +void drawAlertBox(const pm_char * title, const pm_char * text, const char * action) { lcdClear(); - lcd_img(2, 0, asterisk_lbm, 0, 0); + lcd_img(2, 0, ASTERISK_BITMAP, 0, 0); #define MESSAGE_LCD_OFFSET 6*FW @@ -71,7 +71,7 @@ void showAlertBox(const pm_char * title, const pm_char * text, const char * acti lcdDrawText(MESSAGE_LCD_OFFSET, 0, title, DBLSIZE); lcdDrawText(MESSAGE_LCD_OFFSET, 2*FH, STR_WARNING, DBLSIZE); #endif - + lcdDrawFilledRect(0, 0, LCD_W, 32); if (text) { lcdDrawTextAlignedLeft(5*FH, text); @@ -79,10 +79,16 @@ void showAlertBox(const pm_char * title, const pm_char * text, const char * acti if (action) { lcdDrawTextAlignedLeft(7*FH, action); } - AUDIO_ERROR_MESSAGE(sound); - + #undef MESSAGE_LCD_OFFSET +} +void showAlertBox(const pm_char * title, const pm_char * text, const char * action ALERT_SOUND_ARG) +{ + drawAlertBox(title, text, action); + + AUDIO_ERROR_MESSAGE(sound); + lcdRefresh(); lcdSetContrast(); clearKeyEvents(); @@ -134,7 +140,12 @@ uint8_t s_menu_item = 0; uint16_t popupMenuNoItems = 0; uint8_t popupMenuFlags = 0; uint16_t popupMenuOffset = 0; -void (*popupMenuHandler)(const char *result); +void (*popupMenuHandler)(const char * result); + +#if defined(CPUARM) +uint8_t popupMenuOffsetType = MENU_OFFSET_INTERNAL; +#endif + const char * runPopupMenu(uint8_t event) { const char * result = NULL; diff --git a/radio/src/gui/128x64/popups.h b/radio/src/gui/128x64/popups.h new file mode 100644 index 0000000000..a9a31347d0 --- /dev/null +++ b/radio/src/gui/128x64/popups.h @@ -0,0 +1,107 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _POPUPS_H_ +#define _POPUPS_H_ + +#define MENU_X 10 +#define MENU_Y 16 +#define MENU_W LCD_W-(2*MENU_X) +#define WARNING_LINE_LEN 20 +#define WARNING_LINE_X 16 +#define WARNING_LINE_Y 3*FH + +void drawMessageBox(); +void showMessageBox(const pm_char * title); +void runPopupWarning(uint8_t event); + +#if defined(CPUARM) +extern void (*popupFunc)(uint8_t event); +extern int16_t warningInputValue; +extern int16_t warningInputValueMin; +extern int16_t warningInputValueMax; +extern uint8_t warningInfoFlags; +#endif + +#if !defined(GUI) + #define DISPLAY_WARNING(...) + #define POPUP_WARNING(...) + #define POPUP_CONFIRMATION(...) + #define POPUP_INPUT(...) + #define WARNING_INFO_FLAGS 0 + #define SET_WARNING_INFO(...) +#elif defined(CPUARM) + #define DISPLAY_WARNING (*popupFunc) + #define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) + #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) + #define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) + #define WARNING_INFO_FLAGS warningInfoFlags + #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) +#else + #define DISPLAY_WARNING runPopupWarning + #define POPUP_WARNING(s) warningText = s + #define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM) + #define WARNING_INFO_FLAGS ZCHAR + #define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len) +#endif + +#if defined(SDCARD) + #define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) +#else + #define POPUP_MENU_ADD_SD_ITEM(s) +#endif + +#define MENU_MAX_DISPLAY_LINES 6 + +#if defined(CPUARM) + #define NAVIGATION_MENUS + #define POPUP_MENU_ADD_ITEM(s) do { if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) + #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) + #define POPUP_MENU_MAX_LINES 12 + #define MENU_LINE_LENGTH (LEN_MODEL_NAME+1) + #define POPUP_MENU_SET_BSS_FLAG() + #define POPUP_MENU_UNSET_BSS_FLAG() + enum { + MENU_OFFSET_INTERNAL, + MENU_OFFSET_EXTERNAL + }; + extern uint8_t popupMenuOffsetType; +#elif defined(SDCARD) || (defined(ROTARY_ENCODER_NAVIGATION) && !defined(CPUM64)) + #define NAVIGATION_MENUS + #define POPUP_MENU_ADD_ITEM(s) do { if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) + #define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) + #define POPUP_MENU_MAX_LINES MENU_MAX_DISPLAY_LINES + #define MENU_LINE_LENGTH (LEN_MODEL_NAME+1) + #define POPUP_MENU_SET_BSS_FLAG() (popupMenuFlags = BSS) + #define POPUP_MENU_UNSET_BSS_FLAG() (popupMenuFlags = 0) + extern uint8_t popupMenuFlags; +#else + #define popupMenuNoItems 0 +#endif + +#if defined(NAVIGATION_MENUS) + extern uint16_t popupMenuOffset; + extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; + extern uint16_t popupMenuNoItems; + const char * runPopupMenu(uint8_t event); + extern void (*popupMenuHandler)(const char * result); +#endif + +#endif // _POPUPS_H_ diff --git a/radio/src/gui/128x64/radio_calibration.cpp b/radio/src/gui/128x64/radio_calibration.cpp index 15ebc572d2..4e44385fbe 100644 --- a/radio/src/gui/128x64/radio_calibration.cpp +++ b/radio/src/gui/128x64/radio_calibration.cpp @@ -33,7 +33,7 @@ enum CalibrationState { void menuCommonCalib(uint8_t event) { - for (uint8_t i=0; i 50) { g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; @@ -113,7 +113,7 @@ void menuRadioCalibration(uint8_t event) check_simple(event, MENU_RADIO_CALIBRATION, menuTabGeneral, DIM(menuTabGeneral), 0); if (menuEvent) { - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; } TITLE(STR_MENUCALIBRATION); @@ -123,7 +123,7 @@ void menuRadioCalibration(uint8_t event) void menuFirstCalib(uint8_t event) { if (event == EVT_KEY_BREAK(KEY_EXIT) || reusableBuffer.calib.state == CALIB_FINISHED) { - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; chainMenu(menuMainView); } else { diff --git a/radio/src/gui/128x64/radio_diaganas.cpp b/radio/src/gui/128x64/radio_diaganas.cpp index da7c27a404..7a7630d9fd 100644 --- a/radio/src/gui/128x64/radio_diaganas.cpp +++ b/radio/src/gui/128x64/radio_diaganas.cpp @@ -22,20 +22,21 @@ void menuRadioDiagAnalogs(uint8_t event) { +// TODO enum #if defined(TX_CAPACITY_MEASUREMENT) - #define ANAS_ITEMS_COUNT 4 -#elif defined(PCBSKY9X) #define ANAS_ITEMS_COUNT 3 -#else +#elif defined(PCBSKY9X) #define ANAS_ITEMS_COUNT 2 +#else + #define ANAS_ITEMS_COUNT 1 #endif - SIMPLE_MENU(STR_MENUANA, menuTabGeneral, MENU_RADIO_DIAG_ANALOGS, ANAS_ITEMS_COUNT); + SIMPLE_MENU(STR_MENU_RADIO_ANALOGS, menuTabGeneral, MENU_RADIO_ANALOGS_TEST, HEADER_LINE+ANAS_ITEMS_COUNT); STICK_SCROLL_DISABLE(); - for (uint8_t i=0; i 9 + for (uint8_t i=0; i 9 coord_t y = MENU_HEADER_HEIGHT + 1 + (i/3)*FH; const uint8_t x_coord[] = {0, 70, 154}; uint8_t x = x_coord[i%3]; @@ -43,39 +44,48 @@ void menuRadioDiagAnalogs(uint8_t event) lcdDrawChar(x+2*FW-2, y, ':'); #else coord_t y = MENU_HEADER_HEIGHT + 1 + (i/2)*FH; - uint8_t x = i&1 ? 64+5 : 0; + uint8_t x = (i & 1) ? LCD_W/2+FW : 0; drawStringWithIndex(x, y, PSTR("A"), i+1); lcdDrawChar(lcdNextPos, y, ':'); #endif lcdDrawHexNumber(x+3*FW-1, y, anaIn(i)); +#if defined(CPUARM) + lcdDrawNumber(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256, RIGHT); +#else lcdDraw8bitsNumber(x+10*FW-1, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256); +#endif } #if !defined(CPUARM) // Display raw BandGap result (debug) lcdDrawText(64+5, MENU_HEADER_HEIGHT+1+3*FH, STR_BG); - lcdDrawNumber(64+5+6*FW-3, 1+4*FH, BandGap, 0); + lcdDrawNumber(64+5+6*FW-3, 1+4*FH, BandGap, RIGHT); #endif #if defined(PCBSKY9X) lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+4*FH, STR_BATT_CALIB); static int32_t adcBatt; + // TODO board.cpp adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; uint32_t batCalV = (adcBatt + adcBatt*(g_eeGeneral.txVoltageCalibration)/128) * 4191; batCalV /= 55296; - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+4*FH, batCalV, (menuVerticalPosition==1 ? INVERS : 0)); + putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT+1+4*FH, batCalV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0)); #elif defined(PCBGRUVIN9X) lcdDrawTextAlignedLeft(6*FH-2, STR_BATT_CALIB); // Gruvin wants 2 decimal places and instant update of volts calib field when button pressed + // TODO board.cpp static uint16_t adcBatt; adcBatt = ((adcBatt * 7) + anaIn(TX_VOLTAGE)) / 8; // running average, sourced directly (to avoid unending debate :P) uint32_t batCalV = ((uint32_t)adcBatt*1390 + (10*(int32_t)adcBatt*g_eeGeneral.txVoltageCalibration)/8) / BandGap; - lcdDrawNumber(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, batCalV, PREC2|(menuVerticalPosition==1 ? INVERS : 0)); + lcdDrawNumber(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, batCalV, PREC2|(menuVerticalPosition==HEADER_LINE ? INVERS : 0)); #else - lcdDrawTextAlignedLeft(6*FH-2, STR_BATT_CALIB); - putsVolts(LEN_CALIB_FIELDS*FW+4*FW, 6*FH-2, g_vbat100mV, (menuVerticalPosition==1 ? INVERS : 0)); + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, STR_BATT_CALIB); + putsVolts(LEN_CALIB_FIELDS*FW+4*FW, MENU_HEADER_HEIGHT + 1 + (NUM_STICKS+NUM_POTS+NUM_SLIDERS+1)/2 * FH, g_vbat100mV, (menuVerticalPosition==HEADER_LINE ? INVERS : 0)); #endif - if (menuVerticalPosition==1) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); + + if (menuVerticalPosition == HEADER_LINE) { + CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); + } #if defined(TX_CAPACITY_MEASUREMENT) lcdDrawTextAlignedLeft(6*FH+1, STR_CURRENT_CALIB); diff --git a/radio/src/gui/128x64/radio_diagkeys.cpp b/radio/src/gui/128x64/radio_diagkeys.cpp index a1ea9fc6dc..a023dc5a83 100644 --- a/radio/src/gui/128x64/radio_diagkeys.cpp +++ b/radio/src/gui/128x64/radio_diagkeys.cpp @@ -20,45 +20,55 @@ #include "opentx.h" -void displayKeyState(uint8_t x, uint8_t y, EnumKeys key) +void displayKeyState(uint8_t x, uint8_t y, uint8_t key) { - uint8_t t = switchState(key); + uint8_t t = keyState(key); lcdDrawChar(x, y, t+'0', t ? INVERS : 0); } void menuRadioDiagKeys(uint8_t event) { - SIMPLE_MENU(STR_MENUDIAG, menuTabGeneral, MENU_RADIO_DIAG_KEYS, 1); + SIMPLE_MENU(STR_MENU_RADIO_SWITCHES, menuTabGeneral, MENU_RADIO_SWITCHES_TEST, 1); lcdDrawText(14*FW, MENU_HEADER_HEIGHT+2*FH, STR_VTRIM); - for(uint8_t i=0; i<9; i++) { + for (uint8_t i=0; i<9; i++) { coord_t y; - if (i<8) { + if (i < 8) { y = MENU_HEADER_HEIGHT + FH*3 + FH*(i/2); if (i&1) lcd_img(14*FW, y, sticks, i/2, 0); - displayKeyState(i&1? 20*FW : 18*FW, y, (EnumKeys)(TRM_BASE+i)); + displayKeyState(i&1? 20*FW : 18*FW, y, TRM_BASE+i); } - if (i<6) { - y = i*FH+MENU_HEADER_HEIGHT+FH; + if (i < 6) { + y = MENU_HEADER_HEIGHT + FH + FH*i; lcdDrawTextAtIndex(0, y, STR_VKEYS, (5-i), 0); - displayKeyState(5*FW+2, y, (EnumKeys)(KEY_MENU+(5-i))); + displayKeyState(5*FW+2, y, KEY_MENU+(5-i)); } - - if (i != SW_ID0-SW_BASE) { - y = MENU_HEADER_HEIGHT+i*FH-2*FH; - putsSwitches(8*FW, y, i+1, 0); //ohne off,on - displayKeyState(11*FW+2, y, (EnumKeys)(SW_BASE+i)); + +#if defined(PCBTARANIS) + if (i < NUM_SWITCHES) { + if (SWITCH_EXISTS(i)) { + getvalue_t val = getValue(MIXSRC_FIRST_SWITCH+i); + getvalue_t sw = ((val < 0) ? 3*i+1 : ((val == 0) ? 3*i+2 : 3*i+3)); + drawSwitch(8*FW, y, sw, 0); + } } +#else + if (i != SW_ID0) { + y = MENU_HEADER_HEIGHT +i*FH - 2*FH; + drawSwitch(8*FW, y, i+1, 0); + displayKeyState(11*FW+2, y, i); + } +#endif } -#if defined(ROTARY_ENCODERS) || defined(ROTARY_ENCODER_NAVIGATION) - for(uint8_t i=0; i 0) s_editMode = 0; - switch(_event) { + switch (_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); reusableBuffer.sdmanager.offset = 65535; break; +#if !defined(PCBX7D) CASE_EVT_ROTARY_BREAK case EVT_KEY_FIRST(KEY_RIGHT): +#endif case EVT_KEY_FIRST(KEY_ENTER): { - if (menuVerticalPosition > 0) { - vertpos_t index = menuVerticalPosition-1-menuVerticalOffset; + if (menuVerticalPosition >= HEADER_LINE) { + vertpos_t index = menuVerticalPosition-HEADER_LINE-menuVerticalOffset; if (!reusableBuffer.sdmanager.lines[index][SD_SCREEN_FILE_LENGTH+1]) { f_chdir(reusableBuffer.sdmanager.lines[index]); menuVerticalOffset = 0; - menuVerticalPosition = 1; + menuVerticalPosition = HEADER_LINE; reusableBuffer.sdmanager.offset = 65535; killEvents(_event); break; @@ -156,7 +152,8 @@ void menuRadioSdManager(uint8_t _event) break; // no break; } - + +#if !defined(PCBX7D) case EVT_KEY_LONG(KEY_ENTER): killEvents(_event); if (menuVerticalPosition == 0) { @@ -186,9 +183,17 @@ void menuRadioSdManager(uint8_t _event) } POPUP_MENU_START(onSdManagerMenu); break; +#endif } if (reusableBuffer.sdmanager.offset != menuVerticalOffset) { + FILINFO fno; + DIR dir; + char * fn; /* This function is assuming non-Unicode cfg. */ + TCHAR lfn[_MAX_LFN + 1]; + fno.lfname = lfn; + fno.lfsize = sizeof(lfn); + if (menuVerticalOffset == 0) { reusableBuffer.sdmanager.offset = 0; memset(reusableBuffer.sdmanager.lines, 0, sizeof(reusableBuffer.sdmanager.lines)); @@ -209,7 +214,7 @@ void menuRadioSdManager(uint8_t _event) reusableBuffer.sdmanager.count = 0; - FRESULT res = f_opendir(&dir, "."); /* Open the directory */ + FRESULT res = f_opendir(&dir, "."); // Open the directory if (res == FR_OK) { for (;;) { res = f_readdir(&dir, &fno); /* Read a directory item */ @@ -228,7 +233,7 @@ void menuRadioSdManager(uint8_t _event) if (menuVerticalOffset == 0) { for (uint8_t i=0; i=0; i--) { - char *line = reusableBuffer.sdmanager.lines[i]; + char * line = reusableBuffer.sdmanager.lines[i]; if (line[0] == '\0' || isFilenameGreater(isfile, fn, line)) { if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[i])); @@ -273,7 +278,7 @@ void menuRadioSdManager(uint8_t _event) for (uint8_t i=0; i0) ? BLINK|INVERS : INVERS); uint8_t attr = (sub == k ? blink : 0); - switch(k) { + switch (k) { #if defined(RTCLOCK) case ITEM_SETUP_DATE: lcdDrawTextAlignedLeft(y, STR_DATE); - lcdDrawChar(RADIO_SETUP_DATE_COLUMN, y, '-'); lcdDrawChar(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, '-'); + lcdDrawChar(RADIO_SETUP_DATE_COLUMN, y, '-'); + lcdDrawChar(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, '-'); for (uint8_t j=0; j<3; j++) { uint8_t rowattr = (menuHorizontalPosition==j ? attr : 0); switch (j) { case 0: - lcdDrawNumber(RADIO_SETUP_DATE_COLUMN, y, t.tm_year+1900, rowattr); + lcdDrawNumber(RADIO_SETUP_DATE_COLUMN, y, t.tm_year+1900, rowattr|RIGHT); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_year = checkIncDec(event, t.tm_year, 112, 200, 0); break; case 1: - lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, t.tm_mon+1, rowattr|LEADING0, 2); + lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, t.tm_mon+1, rowattr|LEADING0|RIGHT, 2); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_mon = checkIncDec(event, t.tm_mon, 0, 11, 0); break; case 2: @@ -175,7 +176,7 @@ void menuRadioSetup(uint8_t event) int8_t dlim = (((((year%4==0) && (year%100!=0)) || (year%400==0)) && (t.tm_mon==1)) ? 1 : 0); static const pm_uint8_t dmon[] PROGMEM = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; dlim += pgm_read_byte(&dmon[t.tm_mon]); - lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+6*FW-4, y, t.tm_mday, rowattr|LEADING0, 2); + lcdDrawNumber(RADIO_SETUP_DATE_COLUMN+6*FW-4, y, t.tm_mday, rowattr|LEADING0|RIGHT, 2); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_mday = checkIncDec(event, t.tm_mday, 1, dlim, 0); break; } @@ -193,21 +194,22 @@ void menuRadioSetup(uint8_t event) uint8_t rowattr = (menuHorizontalPosition==j ? attr : 0); switch (j) { case 0: - lcdDrawNumber(RADIO_SETUP_TIME_COLUMN, y, t.tm_hour, rowattr|LEADING0, 2); + lcdDrawNumber(RADIO_SETUP_TIME_COLUMN, y, t.tm_hour, rowattr|LEADING0|RIGHT, 2); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_hour = checkIncDec(event, t.tm_hour, 0, 23, 0); break; case 1: - lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+3*FWNUM, y, t.tm_min, rowattr|LEADING0, 2); + lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+3*FWNUM, y, t.tm_min, rowattr|LEADING0|RIGHT, 2); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_min = checkIncDec(event, t.tm_min, 0, 59, 0); break; case 2: - lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+6*FWNUM, y, t.tm_sec, rowattr|LEADING0, 2); + lcdDrawNumber(RADIO_SETUP_TIME_COLUMN+6*FWNUM, y, t.tm_sec, rowattr|LEADING0|RIGHT, 2); if (rowattr && (s_editMode>0 || p1valdiff)) t.tm_sec = checkIncDec(event, t.tm_sec, 0, 59, 0); break; } } - if (attr && checkIncDec_Ret) + if (attr && checkIncDec_Ret) { g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated + } break; #endif @@ -238,7 +240,7 @@ void menuRadioSetup(uint8_t event) #endif break; -#if defined(BUZZER) +#if defined(BUZZER) // AUDIO + BUZZER case ITEM_SETUP_BUZZER_MODE: g_eeGeneral.buzzerMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_BUZZER, STR_VBEEPMODE, g_eeGeneral.buzzerMode, -2, 1, attr, event); #if defined(TELEMETRY_FRSKY) @@ -246,7 +248,7 @@ void menuRadioSetup(uint8_t event) #endif break; #endif -#elif defined(BUZZER) +#elif defined(BUZZER) // BUZZER only case ITEM_SETUP_BUZZER_MODE: g_eeGeneral.beepMode = selectMenuItem(RADIO_SETUP_2ND_COLUMN, y, STR_SPEAKER, STR_VBEEPMODE, g_eeGeneral.beepMode, -2, 1, attr, event); #if defined(TELEMETRY_FRSKY) @@ -563,7 +565,7 @@ void menuRadioSetup(uint8_t event) case ITEM_SETUP_STICK_MODE: lcdDrawChar(2*FW, y, '1'+reusableBuffer.generalSettings.stickMode, attr); for (uint8_t i=0; i<4; i++) { - putsMixerSource((6+4*i)*FW, y, MIXSRC_Rud + pgm_read_byte(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); + drawSource((6+4*i)*FW, y, MIXSRC_Rud + pgm_read_byte(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i), 0); } if (attr && s_editMode>0) { CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); diff --git a/radio/src/gui/128x64/radio_trainer.cpp b/radio/src/gui/128x64/radio_trainer.cpp index b2cf401888..a9be9fc286 100644 --- a/radio/src/gui/128x64/radio_trainer.cpp +++ b/radio/src/gui/128x64/radio_trainer.cpp @@ -20,14 +20,12 @@ #include "opentx.h" -#define TRAINER_CALIB_POS 8 - void menuRadioTrainer(uint8_t event) { uint8_t y; bool slave = SLAVE_MODE(); - MENU(STR_MENUTRAINER, menuTabGeneral, MENU_RADIO_TRAINER, (slave ? 1 : 7), {0, 2, 2, 2, 2, 0/*, 0*/}); + MENU(STR_MENUTRAINER, menuTabGeneral, MENU_RADIO_TRAINER, (slave ? HEADER_LINE : HEADER_LINE+6), {HEADER_LINE_COLUMNS 2, 2, 2, 2, 0/*, 0*/}); if (slave) { lcdDrawText(7*FW, 4*FH, STR_SLAVE); @@ -40,24 +38,24 @@ void menuRadioTrainer(uint8_t event) y = MENU_HEADER_HEIGHT + 1 + FH; - for (uint8_t i=1; i<=NUM_STICKS; i++) { + for (uint8_t i=HEADER_LINE; imode, attr); if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->mode, 0, 2); break; case 1: - lcdDrawNumber(11*FW, y, td->studWeight, attr); + lcdDrawNumber(11*FW, y, td->studWeight, attr|RIGHT); if (attr&BLINK) CHECK_INCDEC_GENVAR(event, td->studWeight, -125, 125); break; @@ -70,20 +68,20 @@ void menuRadioTrainer(uint8_t event) y += FH; } - attr = (menuVerticalPosition==5) ? blink : 0; + attr = (menuVerticalPosition==HEADER_LINE+4) ? blink : 0; lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+1+5*FH, STR_MULTIPLIER); - lcdDrawNumber(LEN_MULTIPLIER*FW+3*FW, MENU_HEADER_HEIGHT+1+5*FH, g_eeGeneral.PPM_Multiplier+10, attr|PREC1); + lcdDrawNumber(LEN_MULTIPLIER*FW+3*FW, MENU_HEADER_HEIGHT+1+5*FH, g_eeGeneral.PPM_Multiplier+10, attr|PREC1|RIGHT); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.PPM_Multiplier, -10, 40); - attr = (menuVerticalPosition==6) ? INVERS : 0; - if (attr) s_editMode = 0; + attr = (menuVerticalPosition==HEADER_LINE+5) ? INVERS : 0; lcdDrawText(0*FW, MENU_HEADER_HEIGHT+1+6*FH, STR_CAL, attr); for (uint8_t i=0; i<4; i++) { - uint8_t x = (i*TRAINER_CALIB_POS+16)*FW/2; - lcdDrawNumber(x, MENU_HEADER_HEIGHT+1+6*FH, (ppmInput[i]-g_eeGeneral.trainer.calib[i])/5, 0); + uint8_t x = (i*8+16)*FW/2; + lcdDrawNumber(x, MENU_HEADER_HEIGHT+1+6*FH, (ppmInput[i]-g_eeGeneral.trainer.calib[i])/5, RIGHT); } if (attr) { + s_editMode = 0; if (event==EVT_KEY_LONG(KEY_ENTER)){ memcpy(g_eeGeneral.trainer.calib, ppmInput, sizeof(g_eeGeneral.trainer.calib)); storageDirty(EE_GENERAL); diff --git a/radio/src/gui/128x64/radio_version.cpp b/radio/src/gui/128x64/radio_version.cpp index 2348af6078..004e725930 100644 --- a/radio/src/gui/128x64/radio_version.cpp +++ b/radio/src/gui/128x64/radio_version.cpp @@ -22,6 +22,21 @@ void menuRadioVersion(uint8_t event) { +#if defined(CPUARM) && defined(EEPROM_RLC) + if (warningResult) { + warningResult = 0; + showMessageBox(STR_STORAGE_FORMAT); + storageEraseAll(false); + NVIC_SystemReset(); + } +#endif + +#if defined(STM32) + if (event == EVT_ENTRY) { + getCPUUniqueID(reusableBuffer.version.id); + } +#endif + SIMPLE_MENU(STR_MENUVERSION, menuTabGeneral, MENU_RADIO_VERSION, 1); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+FH, vers_stamp); @@ -34,5 +49,16 @@ void menuRadioVersion(uint8_t event) else { lcdDrawTextAlignedLeft(6*FH, PSTR("CoPr: ---")); } +#elif defined(CPUARM) && defined(EEPROM_RLC) + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+5*FH+1, STR_EEBACKUP); + lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+6*FH+1, STR_FACTORYRESET); + lcdDrawFilledRect(0, MENU_HEADER_HEIGHT+5*FH, LCD_W, 2*FH+1, SOLID); + + if (event == EVT_KEY_LONG(KEY_ENTER)) { + eepromBackup(); + } + else if (event == EVT_KEY_LONG(KEY_MENU)) { + POPUP_CONFIRMATION(STR_CONFIRMRESET); + } #endif } diff --git a/radio/src/gui/128x64/view_channels.cpp b/radio/src/gui/128x64/view_channels.cpp new file mode 100644 index 0000000000..f18fe42228 --- /dev/null +++ b/radio/src/gui/128x64/view_channels.cpp @@ -0,0 +1,116 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void menuChannelsView(uint8_t event) +{ + static bool longNames = false; + bool newLongNames = false; + static bool secondPage = false; +#ifdef MIXERS_MONITOR + static bool mixersView = false; +#endif + uint8_t ch; + + switch(event) + { + case EVT_KEY_BREAK(KEY_EXIT): + popMenu(); + break; + case EVT_KEY_FIRST(KEY_RIGHT): + case EVT_KEY_FIRST(KEY_LEFT): + secondPage = !secondPage; + break; +#ifdef MIXERS_MONITOR + case EVT_KEY_FIRST(KEY_ENTER): + mixersView = !mixersView; + break; +#endif + } + + if (secondPage) + ch = 16; + else + ch = 0; + +#ifdef MIXERS_MONITOR + if (mixersView) + lcd_putsCenter(0*FH, MIXERS_MONITOR); + else +#endif + lcd_putsCenter(0*FH, CHANNELS_MONITOR); + + lcdInvertLine(0); + + // Column separator + lcdDrawSolidVerticalLine(LCD_W/2, FH, LCD_H-FH); + + for (uint8_t col=0; col<2; col++) { + + uint8_t x = col*LCD_W/2+1; + + // Channels + for (uint8_t line=0; line<8; line++) { + uint8_t y = 9+line*7; +#ifdef MIXERS_MONITOR + int32_t val = (mixersView) ? ex_chans[ch] : channelOutputs[ch]; +#else + int32_t val = channelOutputs[ch]; +#endif + uint8_t ofs = (col ? 0 : 1); + + // Channel name if present, number if not + uint8_t lenLabel = ZLEN(g_model.limitData[ch].name); + if (lenLabel > 4) { + newLongNames = longNames = true; + } + + if (lenLabel > 0) + lcdDrawSizedText(x+1-ofs, y, g_model.limitData[ch].name, sizeof(g_model.limitData[ch].name), ZCHAR | SMLSIZE); + else + putsChn(x+1-ofs, y, ch+1, SMLSIZE); + + // Value +#if defined(PPM_UNIT_US) + uint8_t wbar = (longNames ? 54 : 64); + lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, PPM_CH_CENTER(ch)+val/2, TINSIZE|RIGHT); +#elif defined(PPM_UNIT_PERCENT_PREC1) + uint8_t wbar = (longNames ? 48 : 58); + lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val), PREC1|TINSIZE|RIGHT); +#else + uint8_t wbar = (longNames ? 54 : 64); + lcdDrawNumber(x+LCD_W/2-3-wbar-ofs, y+1, calcRESXto1000(val)/10, TINSIZE|RIGHT); +#endif + + // Gauge +#ifdef MIXERS_MONITOR + uint16_t lim = mixersView ? 512*2*2 : (g_model.extendedLimits ? 640*2 : 512*2); +#else + uint16_t lim = g_model.extendedLimits ? 640*2 : 512*2; +#endif + // TODO ? drawGauge(x+LCD_W/2-3-wbar-ofs, y, wbar, 6, val, lim); + + ch++; + } + } + + longNames = newLongNames; +} diff --git a/radio/src/gui/128x64/view_main.cpp b/radio/src/gui/128x64/view_main.cpp index c129cc86fe..a14e105645 100644 --- a/radio/src/gui/128x64/view_main.cpp +++ b/radio/src/gui/128x64/view_main.cpp @@ -46,10 +46,9 @@ void drawPotsBars() { // Optimization by Mike Blandford - uint8_t x, i, len ; // declare temporary variables - for (x=LCD_W/2-5, i=NUM_STICKS; i= 0 ? MAINTMR_LBL_COL : MAINTMR_LBL_COL-7); #if defined(CPUARM) uint8_t len = zlen(g_model.timers[0].name, LEN_TIMER_NAME); @@ -177,10 +176,10 @@ void displayTimers() lcdDrawSizedText(xLabel, FH*3, g_model.timers[0].name, len, ZCHAR); } else { - putsTimerMode(xLabel, FH*3, g_model.timers[0].mode); + drawTimerMode(xLabel, FH*3, g_model.timers[0].mode); } #else - putsTimerMode(xLabel, FH*3, g_model.timers[0].mode); + drawTimerMode(xLabel, FH*3, g_model.timers[0].mode); #endif } } @@ -188,7 +187,7 @@ void displayTimers() void displayBattVoltage() { #if defined(BATTGRAPH) - putsVBat(VBATT_X-8, VBATT_Y+1, 0); + putsVBat(VBATT_X-8, VBATT_Y+1, RIGHT); lcdDrawFilledRect(VBATT_X-25, VBATT_Y+9, 21, 5); lcdDrawSolidVerticalLine(VBATT_X-4, VBATT_Y+10, 3); uint8_t count = GET_TXBATT_BARS(); @@ -207,10 +206,10 @@ void displayBattVoltage() void displayVoltageOrAlarm() { if (g_eeGeneral.temperatureWarn && getTemperature() >= g_eeGeneral.temperatureWarn) { - putsValueWithUnit(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE); + putsValueWithUnit(6*FW-1, 2*FH, getTemperature(), UNIT_TEMPERATURE, BLINK|INVERS|DBLSIZE|RIGHT); } else if (g_eeGeneral.mAhWarn && (g_eeGeneral.mAhUsed + Current_used * (488 + g_eeGeneral.txCurrentCalibration)/8192/36) / 500 >= g_eeGeneral.mAhWarn) { - putsValueWithUnit(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.txCurrentCalibration)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE); + putsValueWithUnit(7*FW-1, 2*FH, (g_eeGeneral.mAhUsed + Current_used*(488 + g_eeGeneral.txCurrentCalibration)/8192/36)/10, UNIT_MAH, BLINK|INVERS|DBLSIZE|RIGHT); } else { displayBattVoltage(); @@ -220,11 +219,22 @@ void displayVoltageOrAlarm() #define displayVoltageOrAlarm() displayBattVoltage() #endif -#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_RIGHT) -#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_LEFT) -#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_DOWN) -#define EVT_KEY_STATISTICS EVT_KEY_LONG(KEY_UP) -#define EVT_KEY_CONTEXT_MENU EVT_KEY_BREAK(KEY_MENU) +#if defined(PCBX7D) +#define EVT_KEY_CONTEXT_MENU EVT_KEY_LONG(KEY_ENTER) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_PAGE) +#define EVT_KEY_MODEL_MENU EVT_KEY_BREAK(KEY_MENU) +#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_MENU) +#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_PAGE) +#else +#define EVT_KEY_CONTEXT_MENU EVT_KEY_BREAK(KEY_MENU) +#define EVT_KEY_PREVIOUS_VIEW EVT_KEY_BREAK(KEY_UP) +#define EVT_KEY_NEXT_VIEW EVT_KEY_BREAK(KEY_DOWN) +#define EVT_KEY_MODEL_MENU EVT_KEY_LONG(KEY_RIGHT) +#define EVT_KEY_GENERAL_MENU EVT_KEY_LONG(KEY_LEFT) +#define EVT_KEY_LAST_MENU EVT_KEY_LONG(KEY_MENU) +#define EVT_KEY_TELEMETRY EVT_KEY_LONG(KEY_DOWN) +#define EVT_KEY_STATISTICS EVT_KEY_LONG(KEY_UP) +#endif #if defined(NAVIGATION_MENUS) void onMainViewMenu(const char *result) @@ -280,8 +290,7 @@ void menuMainView(uint8_t event) uint8_t view = g_eeGeneral.view; uint8_t view_base = view & 0x0f; - switch(event) { - + switch (event) { case EVT_ENTRY: killEvents(KEY_EXIT); killEvents(KEY_UP); @@ -300,7 +309,7 @@ void menuMainView(uint8_t event) case EVT_KEY_BREAK(KEY_RIGHT): case EVT_KEY_BREAK(KEY_LEFT): if (view_base <= VIEW_INPUTS) { -#if defined(PCBSKY9X) +#if defined(CPUARM) if (view_base == VIEW_INPUTS) g_eeGeneral.view ^= ALTERNATE_VIEW; else @@ -343,11 +352,13 @@ void menuMainView(uint8_t event) #endif #if MENUS_LOCK != 2 /*no menus*/ - case EVT_KEY_LONG(KEY_MENU):// go to last menu +#if defined(EVT_KEY_LAST_MENU) + case EVT_KEY_LAST_MENU: pushMenu(lastPopMenu()); killEvents(event); break; - +#endif + CASE_EVT_ROTARY_BREAK case EVT_KEY_MODEL_MENU: pushMenu(menuModelSelect); @@ -360,17 +371,28 @@ void menuMainView(uint8_t event) killEvents(event); break; #endif - - case EVT_KEY_BREAK(KEY_UP): - case EVT_KEY_BREAK(KEY_DOWN): - g_eeGeneral.view = (event == EVT_KEY_BREAK(KEY_UP) ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1)); + +#if defined(EVT_KEY_PREVIOUS_VIEW) + // TODO try to split those 2 cases on 9X + case EVT_KEY_PREVIOUS_VIEW: + case EVT_KEY_NEXT_VIEW: + // TODO try to split those 2 cases on 9X + g_eeGeneral.view = (event == EVT_KEY_PREVIOUS_VIEW ? (view_base == VIEW_COUNT-1 ? 0 : view_base+1) : (view_base == 0 ? VIEW_COUNT-1 : view_base-1)); storageDirty(EE_GENERAL); break; - +#else + case EVT_KEY_NEXT_VIEW: + g_eeGeneral.view = (view_base == 0 ? VIEW_COUNT-1 : view_base-1); + storageDirty(EE_GENERAL); + break; +#endif + +#if defined(EVT_KEY_STATISTICS) case EVT_KEY_STATISTICS: chainMenu(menuStatisticsView); killEvents(event); break; +#endif case EVT_KEY_TELEMETRY: #if defined(TELEMETRY_FRSKY) @@ -432,7 +454,7 @@ void menuMainView(uint8_t event) if (view_base < VIEW_INPUTS) { // scroll bar lcdDrawHorizontalLine(38, 34, 54, DOTTED); -#if defined(PCBSKY9X) +#if defined(CPUARM) lcdDrawSolidHorizontalLine(38 + (g_eeGeneral.view / ALTERNATE_VIEW) * 13, 34, 13, SOLID); #else lcdDrawSolidHorizontalLine((g_eeGeneral.view & ALTERNATE_VIEW) ? 64 : 38, 34, 26, SOLID); @@ -440,7 +462,7 @@ void menuMainView(uint8_t event) for (uint8_t i=0; i<8; i++) { uint8_t x0,y0; -#if defined(PCBSKY9X) +#if defined(CPUARM) uint8_t chan = 8*(g_eeGeneral.view / ALTERNATE_VIEW) + i; #else uint8_t chan = (g_eeGeneral.view & ALTERNATE_VIEW) ? 8+i : i; @@ -448,37 +470,36 @@ void menuMainView(uint8_t event) int16_t val = channelOutputs[chan]; - switch(view_base) - { + switch (view_base) { case VIEW_OUTPUTS_VALUES: x0 = (i%4*9+3)*FW/2; y0 = i/4*FH+40; #if defined(PPM_UNIT_US) - lcdDrawNumber(x0+4*FW , y0, PPM_CH_CENTER(chan)+val/2, 0); + lcdDrawNumber(x0+4*FW , y0, PPM_CH_CENTER(chan)+val/2, RIGHT); #elif defined(PPM_UNIT_PERCENT_PREC1) - lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val), PREC1); + lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val), RIGHT|PREC1); #else - lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val)/10, 0); // G: Don't like the decimal part* + lcdDrawNumber(x0+4*FW , y0, calcRESXto1000(val)/10, RIGHT); // G: Don't like the decimal part* #endif break; case VIEW_OUTPUTS_BARS: #define WBAR2 (50/2) - x0 = i<4 ? LCD_W/4+2 : LCD_W*3/4-2; - y0 = 38+(i%4)*5; + x0 = i<4 ? LCD_W/4+2 : LCD_W*3/4-2; + y0 = 38+(i%4)*5; uint16_t lim = g_model.extendedLimits ? 640*2 : 512*2; int8_t len = (abs(val) * WBAR2 + lim/2) / lim; - if(len>WBAR2) len = WBAR2; // prevent bars from going over the end - comment for debugging + if (len>WBAR2) len = WBAR2; // prevent bars from going over the end - comment for debugging lcdDrawHorizontalLine(x0-WBAR2, y0, WBAR2*2+1, DOTTED); - lcdDrawSolidVerticalLine(x0,y0-2,5); - if (val>0) - x0+=1; + lcdDrawSolidVerticalLine(x0, y0-2,5 ); + if (val > 0) + x0 += 1; else - x0-=len; - lcdDrawSolidHorizontalLine(x0,y0+1,len); - lcdDrawSolidHorizontalLine(x0,y0-1,len); + x0 -= len; + lcdDrawSolidHorizontalLine(x0, y0+1, len); + lcdDrawSolidHorizontalLine(x0, y0-1, len); break; } } @@ -489,15 +510,17 @@ void menuMainView(uint8_t event) doMainScreenGraphics(); // Switches +#if !defined(PCBX7D) for (uint8_t i=SWSRC_THR; i<=SWSRC_TRN; i++) { int8_t sw = (i == SWSRC_TRN ? (switchState(SW_ID0) ? SWSRC_ID0 : (switchState(SW_ID1) ? SWSRC_ID1 : SWSRC_ID2)) : i); uint8_t x = 2*FW-2, y = i*FH+1; - if (i>=SWSRC_AIL) { + if (i >= SWSRC_AIL) { x = 17*FW-1; y -= 3*FH; } - putsSwitches(x, y, sw, getSwitch(i) ? INVERS : 0); + drawSwitch(x, y, sw, getSwitch(i) ? INVERS : 0); } +#endif } else { #if defined(PCBMEGA2560) && defined(ROTARY_ENCODERS) @@ -515,22 +538,22 @@ void menuMainView(uint8_t event) #endif // PCBGRUVIN9X && ROTARY_ENCODERS // Logical Switches -#if defined(PCBSKY9X) - for (uint8_t i=0; i2 ? 3*FW+2 : (3*FW-1)) + (i/3>2 ? 2*FW : 0), 4*FH+1 + (i%3)*FH, SWSRC_SW1+i, getSwitch(SWSRC_SW1+i) ? INVERS : 0); + for (uint8_t i=0; i2 ? 3*FW+2 : (3*FW-1)) + (i/3>2 ? 2*FW : 0), 4*FH+1 + (i%3)*FH, SWSRC_SW1+i, getSwitch(SWSRC_SW1+i) ? INVERS : 0); #elif !defined(PCBSTD) - for (uint8_t i=0; i= 0 ? TMR2_LBL_COL : TMR2_LBL_COL-7, FH*6, g_model.timers[1].mode); + drawTimer(33+FW+2+10*FWNUM-4, FH*5, timersStates[1].val, DBLSIZE|RIGHT, DBLSIZE); + drawTimerMode(timersStates[1].val >= 0 ? TMR2_LBL_COL : TMR2_LBL_COL-7, FH*6, g_model.timers[1].mode); // lcdDrawNumber(33+11*FW, FH*6, s_timerVal_10ms[1], LEADING0, 2); // 1/100s } diff --git a/radio/src/gui/128x64/view_mavlink.cpp b/radio/src/gui/128x64/view_mavlink.cpp index c53a87c63a..4cb0cf9d2a 100644 --- a/radio/src/gui/128x64/view_mavlink.cpp +++ b/radio/src/gui/128x64/view_mavlink.cpp @@ -25,7 +25,7 @@ #include "view_mavlink.h" -#define VIEW_MAVLINK_2ND_COLUMN (LCD_W-6*FW-3-MENUS_SCROLLBAR_WIDTH) +#define VIEW_MAVLINK_2ND_COLUMN (LCD_W-6*FW-3) uint8_t MAVLINK_menu = MENU_INFO; diff --git a/radio/src/gui/128x64/view_statistics.cpp b/radio/src/gui/128x64/view_statistics.cpp index 50bfd4f240..7fe69419be 100644 --- a/radio/src/gui/128x64/view_statistics.cpp +++ b/radio/src/gui/128x64/view_statistics.cpp @@ -24,8 +24,7 @@ void menuStatisticsView(uint8_t event) { TITLE(STR_MENUSTAT); - switch(event) - { + switch (event) { case EVT_KEY_FIRST(KEY_UP): chainMenu(menuStatisticsDebug); break; @@ -43,13 +42,14 @@ void menuStatisticsView(uint8_t event) } lcdDrawText( 1*FW, FH*0, STR_TOTTM1TM2THRTHP); - putsTimer( 5*FW+5*FWNUM+1, FH*1, timersStates[0].val, 0, 0); - putsTimer( 12*FW+5*FWNUM+1, FH*1, timersStates[1].val, 0, 0); + + drawTimer( 5*FW+5*FWNUM+1, FH*1, timersStates[0].val, RIGHT, 0); + drawTimer( 12*FW+5*FWNUM+1, FH*1, timersStates[1].val, RIGHT, 0); - putsTimer( 5*FW+5*FWNUM+1, FH*2, s_timeCumThr, 0, 0); - putsTimer( 12*FW+5*FWNUM+1, FH*2, s_timeCum16ThrP/16, 0, 0); + drawTimer( 5*FW+5*FWNUM+1, FH*2, s_timeCumThr, RIGHT, 0); + drawTimer( 12*FW+5*FWNUM+1, FH*2, s_timeCum16ThrP/16, RIGHT, 0); - putsTimer( 12*FW+5*FWNUM+1, FH*0, sessionTimer, 0, 0); + drawTimer( 12*FW+5*FWNUM+1, FH*0, sessionTimer, RIGHT, 0); #if defined(THRTRACE) const coord_t x = 5; @@ -68,37 +68,37 @@ void menuStatisticsView(uint8_t event) #endif } -#if defined(PCBSKY9X) - #define MENU_DEBUG_COL1_OFS (11*FW-3) - #define MENU_DEBUG_COL2_OFS (17*FW) - #define MENU_DEBUG_Y_CURRENT (1*FH) - #define MENU_DEBUG_Y_MAH (2*FH) - #define MENU_DEBUG_Y_CPU_TEMP (3*FH) - #define MENU_DEBUG_Y_COPROC (4*FH) - #define MENU_DEBUG_Y_MIXMAX (5*FH) - #define MENU_DEBUG_Y_RTOS (6*FH) +#if defined(CPUARM) + #define MENU_DEBUG_COL1_OFS (11*FW-3) + #define MENU_DEBUG_COL2_OFS (17*FW) + #define MENU_DEBUG_Y_CURRENT (1*FH) + #define MENU_DEBUG_Y_MAH (2*FH) + #define MENU_DEBUG_Y_CPU_TEMP (3*FH) + #define MENU_DEBUG_Y_COPROC (4*FH) + #define MENU_DEBUG_Y_MIXMAX (5*FH) + #define MENU_DEBUG_Y_RTOS (6*FH) #else - #define MENU_DEBUG_COL1_OFS (14*FW) + #define MENU_DEBUG_COL1_OFS (14*FW) #endif void menuStatisticsDebug(uint8_t event) { TITLE(STR_MENUDEBUG); - switch(event) - { + switch (event) { #if defined(CPUARM) case EVT_KEY_LONG(KEY_ENTER): - g_eeGeneral.mAhUsed = 0; - g_eeGeneral.globalTimer = 0; - storageDirty(EE_GENERAL); #if defined(PCBSKY9X) + g_eeGeneral.mAhUsed = 0; Current_used = 0; #endif + g_eeGeneral.globalTimer = 0; sessionTimer = 0; + storageDirty(EE_GENERAL); killEvents(event); break; #endif + case EVT_KEY_FIRST(KEY_ENTER): #if !defined(CPUARM) g_tmr1Latency_min = 0xff; @@ -116,6 +116,7 @@ void menuStatisticsDebug(uint8_t event) case EVT_KEY_FIRST(KEY_DOWN): chainMenu(menuStatisticsView); break; + case EVT_KEY_FIRST(KEY_EXIT): chainMenu(menuMainView); break; diff --git a/radio/src/gui/128x64/view_telemetry.cpp b/radio/src/gui/128x64/view_telemetry.cpp index e481776a22..85f18e39aa 100644 --- a/radio/src/gui/128x64/view_telemetry.cpp +++ b/radio/src/gui/128x64/view_telemetry.cpp @@ -236,7 +236,7 @@ bool displayGaugesTelemetryScreen(FrSkyScreenData & screen) if (source && barMax > barMin) { uint8_t y = barHeight+6+i*(barHeight+6); #if defined(CPUARM) - putsMixerSource(0, y+barHeight-5, source, 0); + drawSource(0, y+barHeight-5, source, 0); #else lcdDrawTextAtIndex(0, y+barHeight-5, STR_VTELEMCHNS, source, 0); #endif @@ -334,7 +334,7 @@ bool displayNumbersTelemetryScreen(FrSkyScreenData & screen) // we don't display GPS name, no space for it } else { - putsMixerSource(pos[j], 1+FH+2*FH*i, field, 0); + drawSource(pos[j], 1+FH+2*FH*i, field, 0); } if (field >= MIXSRC_FIRST_TELEM) { @@ -448,7 +448,7 @@ bool displayTelemetryScreen() } #endif - lcdDrawTelemetryTopBar(); + drawTelemetryTopBar(); if (s_frsky_view < MAX_TELEMETRY_SCREENS) { return displayCustomTelemetryScreen(s_frsky_view); @@ -533,8 +533,8 @@ void menuViewTelemetryFrsky(uint8_t event) } } - lcdDrawTelemetryTopBar(); - lcdDrawText(8*FW, 3*FH, "No Telemetry Screens"); + drawTelemetryTopBar(); + lcdDrawText(2*FW, 3*FH, "No Telemetry Screens"); displayRssiLine(); #else if (!displayTelemetryScreen()) { diff --git a/radio/src/gui/128x64/view_text.cpp b/radio/src/gui/128x64/view_text.cpp index b0a3c8cec8..c6d426536c 100644 --- a/radio/src/gui/128x64/view_text.cpp +++ b/radio/src/gui/128x64/view_text.cpp @@ -125,7 +125,7 @@ void menuTextView(uint8_t event) lcdDrawText(0, i*FH+FH+1, s_text_screen[i], FIXEDWIDTH); } - char *title = s_text_file; + char * title = s_text_file; #if defined(SIMU) if (!strncmp(title, "./", 2)) title += 2; #else diff --git a/radio/src/gui/128x64/widgets.cpp b/radio/src/gui/128x64/widgets.cpp index a3ec902e54..0e850fda5f 100644 --- a/radio/src/gui/128x64/widgets.cpp +++ b/radio/src/gui/128x64/widgets.cpp @@ -49,10 +49,10 @@ void drawCheckBox(coord_t x, coord_t y, uint8_t value, LcdFlags attr) void drawScreenIndex(uint8_t index, uint8_t count, uint8_t attr) { - lcdDrawNumber(LCD_W, 0, count, attr); + lcdDrawNumber(LCD_W, 0, count, RIGHT | attr); coord_t x = 1+LCD_W-FW*(count>9 ? 3 : 2); lcdDrawChar(x, 0, '/', attr); - lcdDrawNumber(x, 0, index+1, attr); + lcdDrawNumber(x, 0, index+1, RIGHT | attr); } #if !defined(CPUM64) @@ -76,7 +76,7 @@ select_menu_value_t selectMenuItem(coord_t x, coord_t y, const pm_char *label, c { drawFieldLabel(x, y, label); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); - if (attr) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); return value; } @@ -93,8 +93,8 @@ uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const pm_char *label, int8_t switchMenuItem(coord_t x, coord_t y, int8_t value, LcdFlags attr, uint8_t event) { drawFieldLabel(x, y, STR_SWITCH); - putsSwitches(x, y, value, attr); - if (attr) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); + drawSwitch(x, y, value, attr); + if (attr & (~RIGHT)) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); return value; } diff --git a/radio/src/gui/212x64/gui.h b/radio/src/gui/212x64/gui.h index ef93742003..b8046835d5 100644 --- a/radio/src/gui/212x64/gui.h +++ b/radio/src/gui/212x64/gui.h @@ -24,6 +24,10 @@ #include "gui_common.h" #include "lcd.h" #include "menus.h" +#include "popups.h" + +#define HEADER_LINE 0 +#define HEADER_LINE_COLUMNS #define DEFAULT_SCROLLBAR_X (LCD_W-1) #define NUM_BODY_LINES (LCD_LINES-1) @@ -36,9 +40,9 @@ #define MODEL_BITMAP_SIZE BITMAP_BUFFER_SIZE(MODEL_BITMAP_WIDTH, MODEL_BITMAP_HEIGHT) #define LOAD_MODEL_BITMAP() loadModelBitmap(g_model.header.bitmap, modelBitmap) -#define WCHART (LCD_H/2) -#define X0 (LCD_W-WCHART-2) -#define Y0 (LCD_H/2) +#define CURVE_SIDE_WIDTH (LCD_H/2) +#define CURVE_CENTER_X (LCD_W-CURVE_SIDE_WIDTH-2) +#define CURVE_CENTER_Y (LCD_H/2) #if defined(TRANSLATIONS_FR) #define MENU_COLUMNS 1 @@ -84,6 +88,7 @@ void updateProgressBar(int num, int den); void drawGauge(coord_t x, coord_t y, coord_t w, coord_t h, int32_t val, int32_t max); void drawColumnHeader(const char * const * headers, uint8_t index); void drawStick(coord_t centrex, int16_t xval, int16_t yval); +void drawCurveRef(coord_t x, coord_t y, CurveRef & curve, LcdFlags att); void drawAlertBox(const char * title, const char * text, const char * action); #define ALERT_SOUND_ARG , uint8_t sound @@ -91,7 +96,6 @@ void showAlertBox(const char * title, const char * text, const char * action, ui void doMainScreenGraphics(); - typedef uint16_t FlightModesType; extern int8_t checkIncDec_Ret; // global helper vars @@ -254,7 +258,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int #endif extern uint8_t s_curveChan; -void editCurveRef(coord_t x, coord_t y, CurveRef & curve, uint8_t event, uint8_t attr); +void editCurveRef(coord_t x, coord_t y, CurveRef & curve, uint8_t event, LcdFlags flags); extern uint8_t editNameCursorPos; void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active, uint8_t attr=ZCHAR); @@ -299,49 +303,6 @@ uint8_t getMixesCount(); void deleteMix(uint8_t idx); void insertMix(uint8_t idx); -#define MENU_X 30 -#define MENU_Y 16 -#define MENU_W LCD_W-(2*MENU_X) -#define WARNING_LINE_LEN 32 -#define WARNING_LINE_X 16 -#define WARNING_LINE_Y 3*FH - -void drawMessageBox(const char * title); -void showMessageBox(const char * title); -void runPopupWarning(uint8_t event); - -extern void (*popupFunc)(uint8_t event); -extern int16_t warningInputValue; -extern int16_t warningInputValueMin; -extern int16_t warningInputValueMax; -extern uint8_t warningInfoFlags; - -#define DISPLAY_WARNING (*popupFunc) -#define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) -#define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) -#define WARNING_INFO_FLAGS warningInfoFlags -#define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) - -#define NAVIGATION_MENUS -#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) -#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while(0) -#define POPUP_MENU_MAX_LINES 12 -#define MENU_MAX_DISPLAY_LINES 6 -#define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) -#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) -#define POPUP_MENU_ITEMS_FROM_BSS() -extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; -extern uint16_t popupMenuNoItems; -extern uint16_t popupMenuOffset; -enum { - MENU_OFFSET_INTERNAL, - MENU_OFFSET_EXTERNAL -}; -extern uint8_t popupMenuOffsetType; -const char * runPopupMenu(uint8_t event); -extern void (*popupMenuHandler)(const char *result); - #define STATUS_LINE_LENGTH 32 extern char statusLineMsg[STATUS_LINE_LENGTH]; void showStatusLine(); @@ -357,21 +318,8 @@ void menuChannelsView(uint8_t event); #define LABEL(...) (uint8_t)-1 -#if defined(PCBX9E) && !defined(SIMU) -#define KEY_UP KEY_MINUS - #define KEY_DOWN KEY_PLUS - #define KEY_RIGHT KEY_PLUS - #define KEY_LEFT KEY_MINUS - #define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_LEFT) - #define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_RIGHT) -#else - #define KEY_UP KEY_PLUS - #define KEY_DOWN KEY_MINUS - #define KEY_RIGHT KEY_MINUS - #define KEY_LEFT KEY_PLUS - #define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_LEFT) - #define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_RIGHT) -#endif +#define CURSOR_MOVED_LEFT(event) (EVT_KEY_MASK(event) == KEY_LEFT) +#define CURSOR_MOVED_RIGHT(event) (EVT_KEY_MASK(event) == KEY_RIGHT) #define REPEAT_LAST_CURSOR_MOVE() { if (CURSOR_MOVED_LEFT(event) || CURSOR_MOVED_RIGHT(event)) putEvent(event); else menuHorizontalPosition = 0; } #define MOVE_CURSOR_FROM_HERE() if (menuHorizontalPosition > 0) REPEAT_LAST_CURSOR_MOVE() @@ -380,7 +328,7 @@ void menuChannelsView(uint8_t event); #define POS_HORZ_INIT(posVert) ((COLATTR(posVert) & NAVIGATION_LINE_BY_LINE) ? -1 : 0) #define EDIT_MODE_INIT 0 // TODO enum -typedef int16_t (*FnFuncP) (int16_t x); +typedef int (*FnFuncP) (int x); void drawFunction(FnFuncP fn, uint8_t offset=0); void onSourceLongEnterPress(const char *result); @@ -396,7 +344,7 @@ extern const pm_uchar sticks[] PROGMEM; void displayFlightModes(coord_t x, coord_t y, FlightModesType value); FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr); #else - #define displayFlightModes(...) +#define displayFlightModes(...) #endif #define IS_MAIN_VIEW_DISPLAYED() menuHandlers[0] == menuMainView diff --git a/radio/src/gui/212x64/lcd.cpp b/radio/src/gui/212x64/lcd.cpp index ab8ab1cbd3..3f10ddf787 100644 --- a/radio/src/gui/212x64/lcd.cpp +++ b/radio/src/gui/212x64/lcd.cpp @@ -314,8 +314,9 @@ void lcdDrawSizedText(coord_t x, coord_t y, const char * s, uint8_t len, LcdFlag lcdLastPos = x; lcdNextPos = x; - if (fontsize == MIDSIZE) + if (fontsize == MIDSIZE) { lcdLastPos += 1; + } if (flags & RIGHT) { lcdLastPos -= width; @@ -578,30 +579,30 @@ void lcdDrawFilledRect(coord_t x, scoord_t y, coord_t w, coord_t h, uint8_t pat, } } -void lcdDrawTelemetryTopBar() +void drawTelemetryTopBar() { putsModelName(0, 0, g_model.header.name, g_eeGeneral.currModel, 0); uint8_t att = (IS_TXBATT_WARNING() ? BLINK : 0); putsVBat(12*FW, 0, att); if (g_model.timers[0].mode) { att = (timersStates[0].val<0 ? BLINK : 0); - putsTimer(22*FW, 0, timersStates[0].val, att, att); - putsMixerSource(18*FW+2, 1, MIXSRC_TIMER1, SMLSIZE); + drawTimer(22*FW, 0, timersStates[0].val, att, att); + drawSource(18*FW+2, 1, MIXSRC_TIMER1, SMLSIZE); } if (g_model.timers[1].mode) { att = (timersStates[1].val<0 ? BLINK : 0); - putsTimer(31*FW, 0, timersStates[1].val, att, att); - putsMixerSource(27*FW+2, 1, MIXSRC_TIMER2, SMLSIZE); + drawTimer(31*FW, 0, timersStates[1].val, att, att); + drawSource(27*FW+2, 1, MIXSRC_TIMER2, SMLSIZE); } lcdInvertLine(0); } -void putsRtcTime(coord_t x, coord_t y, LcdFlags att) +void drawRtcTime(coord_t x, coord_t y, LcdFlags att) { - putsTimer(x, y, getValue(MIXSRC_TX_TIME), att, att); + drawTimer(x, y, getValue(MIXSRC_TX_TIME), att, att); } -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2) +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2) { div_t qr; @@ -656,19 +657,13 @@ void putsVBat(coord_t x, coord_t y, LcdFlags att) putsVolts(x, y, g_vbat100mV, att); } -void drawStringWithIndex(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att) -{ - lcdDrawText(x, y, str, att & ~LEADING0); - lcdDrawNumber(lcdNextPos, y, idx, att|LEFT, 2); -} - void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att) { uint8_t length = STR_VSRCRAW[0]; lcdDrawSizedText(x, y, STR_VSRCRAW+2+length*(idx+1), length-1, att); } -void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) +void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) { if (idx == MIXSRC_NONE) { lcdDrawTextAtIndex(x, y, STR_VSRCRAW, 0, att); // TODO macro @@ -724,7 +719,7 @@ void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) else if (idx < MIXSRC_SW1) lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1, att); else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) - putsSwitches(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); + drawSwitch(x, y, SWSRC_SW1+idx-MIXSRC_SW1, att); else if (idx < MIXSRC_CH1) drawStringWithIndex(x, y, STR_PPM_TRAINER, idx-MIXSRC_FIRST_TRAINER+1, att); else if (idx <= MIXSRC_LAST_CH) { @@ -738,7 +733,7 @@ void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att) drawStringWithIndex(x, y, STR_GV, idx-MIXSRC_GVAR1+1, att); } else if (idx < MIXSRC_FIRST_TELEM) { - lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-NUM_LOGICAL_SWITCH-NUM_TRAINER-NUM_CHNOUT-MAX_GVARS, att); + lcdDrawTextAtIndex(x, y, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS, att); } else { idx -= MIXSRC_FIRST_TELEM; @@ -765,115 +760,21 @@ void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) } } -void putsSwitches(coord_t x, coord_t y, int32_t idx, LcdFlags att) +void drawSwitch(coord_t x, coord_t y, int32_t idx, LcdFlags flags) { - if (idx == SWSRC_NONE) { - return lcdDrawTextAtIndex(x, y, STR_VSWITCHES, 0, att); - } - else if (idx == SWSRC_OFF) { - return lcdDrawTextAtIndex(x, y, STR_OFFON, 0, att); - } - - if (idx < 0) { - lcdDrawChar(x-2, y, '!', att); - idx = -idx; - } - - if (idx <= SWSRC_LAST_SWITCH) { - div_t swinfo = switchInfo(idx); - if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) { - lcdDrawSizedText(x, y, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME, ZCHAR|att); - } - else { - lcdDrawChar(x, y, 'S', att); - lcdDrawChar(lcdNextPos, y, 'A'+swinfo.quot, att); - } - char c = "\300-\301"[swinfo.rem]; - lcdDrawChar(lcdNextPos, y, c, att); - } - else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) { - div_t swinfo = div(idx - SWSRC_FIRST_MULTIPOS_SWITCH, XPOTS_MULTIPOS_COUNT); - drawStringWithIndex(x, y, "S", swinfo.quot*10+swinfo.rem+11, att); - } - else if (idx <= SWSRC_LAST_TRIM) { - lcdDrawTextAtIndex(x, y, STR_VSWITCHES, idx-SWSRC_FIRST_TRIM+1, att); - } - else if (idx <= SWSRC_LAST_LOGICAL_SWITCH) { - drawStringWithIndex(x, y, "L", idx-SWSRC_FIRST_LOGICAL_SWITCH+1, att); - } - else if (idx <= SWSRC_ONE) { - lcdDrawTextAtIndex(x, y, STR_VSWITCHES, idx-SWSRC_ON+1+(2*NUM_STICKS), att); - } - else if (idx <= SWSRC_LAST_FLIGHT_MODE) { - drawStringWithIndex(x, y, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE, att); - } - else if (idx == SWSRC_TELEMETRY_STREAMING) { - lcdDrawText(x, y, "Tele", att); - } - else if (idx <= SWSRC_LAST_FLIGHT_MODE) { - drawStringWithIndex(x, y, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE, att); - } - else if (idx == SWSRC_TELEMETRY_STREAMING) { - lcdDrawText(x, y, "Tele", att); - } - else { - lcdDrawSizedText(x, y, g_model.telemetrySensors[idx-SWSRC_FIRST_SENSOR].label, TELEM_LABEL_LEN, ZCHAR|att); - } -} - -#if defined(FLIGHT_MODES) -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att) -{ - if (idx==0) - lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, att); - else - drawStringWithIndex(x, y, STR_FP, idx-1, att); -} -#endif - -void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att) -{ - if (curve.value != 0) { - switch (curve.type) { - case CURVE_REF_DIFF: - lcdDrawChar(x, y, 'D', att); - GVAR_MENU_ITEM(x+FW, y, curve.value, -100, 100, LEFT|att, 0, 0); - break; - - case CURVE_REF_EXPO: - lcdDrawChar(x, y, 'E', att); - GVAR_MENU_ITEM(x+FW, y, curve.value, -100, 100, LEFT|att, 0, 0); - break; - - case CURVE_REF_FUNC: - lcdDrawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, att); - break; - - case CURVE_REF_CUSTOM: - drawCurveName(x, y, curve.value, att); - break; - } - } + char s[8]; + getSwitchString(s, idx); + lcdDrawText(x, y, s, flags); } void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) { - if (idx == 0) { - return lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, flags); - } - - if (idx < 0) { - lcdDrawChar(x-3, y, '!', flags); - idx = -idx; - } - - if (ZEXIST(g_model.curves[idx-1].name)) - lcdDrawSizedText(x, y, g_model.curves[idx-1].name, LEN_CURVE_NAME, ZCHAR|flags); - else - drawStringWithIndex(x, y, STR_CV, idx, flags); + char s[8]; + getCurveString(s, idx); + lcdDrawText(x, y, s, flags); } -void putsTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att) +void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att) { if (mode >= 0) { if (mode < TMRMODE_COUNT) @@ -881,10 +782,10 @@ void putsTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att) else mode -= (TMRMODE_COUNT-1); } - putsSwitches(x, y, mode, att); + drawSwitch(x, y, mode, att); } -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) +void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) { trim_t v = getRawTrimValue(phase, idx); unsigned int mode = v.mode; @@ -997,7 +898,7 @@ void displayGpsCoords(coord_t x, coord_t y, TelemetryItem & telemetryItem, LcdFl void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t value, LcdFlags att) { - if (channel >= MAX_SENSORS) + if (channel >= MAX_TELEMETRY_SENSORS) return; // Lua luaLcdDrawChannel() can call us with a bad value TelemetryItem & telemetryItem = telemetryItems[channel]; @@ -1074,7 +975,7 @@ void putsChannelValue(coord_t x, coord_t y, source_t channel, int32_t value, Lcd putsTelemetryChannelValue(x, y, channel, value, att); } else if (channel >= MIXSRC_FIRST_TIMER || channel == MIXSRC_TX_TIME) { - putsTimer(x, y, value, att, att); + drawTimer(x, y, value, att, att); } else if (channel == MIXSRC_TX_VOLTAGE) { lcdDrawNumber(x, y, value, att|PREC1); diff --git a/radio/src/gui/212x64/lcd.h b/radio/src/gui/212x64/lcd.h index 681cfdd593..34ff7776af 100644 --- a/radio/src/gui/212x64/lcd.h +++ b/radio/src/gui/212x64/lcd.h @@ -21,73 +21,72 @@ #ifndef _LCD_H_ #define _LCD_H_ -#define LCD_W 212 -#define LCD_H 64 -#define BOX_WIDTH 31 -#define coord_t int -#define scoord_t int -#define CENTER "\015" -#define CENTER_OFS (7*FW-FW/2) -#define CONTRAST_MIN 0 -#define CONTRAST_MAX 45 -#define lcdint_t int32_t +#define BOX_WIDTH 31 +#define coord_t int +#define scoord_t int +#define CENTER "\015" +#define CENTER_OFS (7*FW-FW/2) +#define CONTRAST_MIN 0 +#define CONTRAST_MAX 45 -#define FW 6 -#define FWNUM 5 -#define FH 8 +#define lcdint_t int32_t -#define LCD_LINES (LCD_H/FH) -#define LCD_COLS (LCD_W/FW) +#define FW 6 +#define FWNUM 5 +#define FH 8 + +#define LCD_LINES (LCD_H/FH) +#define LCD_COLS (LCD_W/FW) /* lcdDrawText flags */ -#define BLINK 0x01 -#define INVERS 0x02 -#define BOLD 0x04 -#define LEFT 0x00 -#define RIGHT 0x08 -#define FIXEDWIDTH 0x10 +#define BLINK 0x01 +#define INVERS 0x02 +#define BOLD 0x04 +#define LEFT 0x00 +#define RIGHT 0x08 +#define FIXEDWIDTH 0x10 /* no 0x80 here because of "GV"1 which is aligned LEFT */ /* no 0x10 here because of "MODEL"01 which uses LEADING0 */ -#define ZCHAR 0x80 +#define ZCHAR 0x80 /* lcdDrawNumber additional flags */ -#define LEADING0 0x10 -#define PREC1 0x20 -#define PREC2 0x30 -#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) +#define LEADING0 0x10 +#define PREC1 0x20 +#define PREC2 0x30 +#define MODE(flags) ((((int8_t)(flags) & 0x30) - 0x10) >> 4) /* line, rect, square flags */ -#define FORCE 0x02 -#define ERASE 0x04 -#define ROUND 0x08 -#define FILL_WHITE 0x10 +#define FORCE 0x02 +#define ERASE 0x04 +#define ROUND 0x08 +#define FILL_WHITE 0x10 /* telemetry flags */ -#define NO_UNIT 0x40 +#define NO_UNIT 0x40 -#define FONTSIZE(x) ((x) & 0x0700) -#define TINSIZE 0x0100 -#define SMLSIZE 0x0200 -#define MIDSIZE 0x0300 -#define DBLSIZE 0x0400 -#define XXLSIZE 0x0500 -#define ERASEBG 0x8000 -#define VERTICAL 0x0800 +#define FONTSIZE(x) ((x) & 0x0700) +#define TINSIZE 0x0100 +#define SMLSIZE 0x0200 +#define MIDSIZE 0x0300 +#define DBLSIZE 0x0400 +#define XXLSIZE 0x0500 +#define ERASEBG 0x8000 +#define VERTICAL 0x0800 -#define TIMEBLINK 0x1000 -#define TIMEHOUR 0x2000 -#define STREXPANDED 0x4000 +#define TIMEBLINK 0x1000 +#define TIMEHOUR 0x2000 +#define STREXPANDED 0x4000 -#define GREY(x) ((x) * 0x010000) -#define WHITE GREY(0xf) -#define GREY_DEFAULT GREY(11) -#define COLOUR_MASK(x) ((x) & 0x0F0000) +#define GREY(x) ((x) * 0x010000) +#define WHITE GREY(0xf) +#define GREY_DEFAULT GREY(11) +#define COLOUR_MASK(x) ((x) & 0x0F0000) -#define LcdFlags uint32_t +#define LcdFlags uint32_t -#define display_t uint8_t -#define DISPLAY_BUFFER_SIZE (LCD_W*LCD_H*4/8) +#define display_t uint8_t +#define DISPLAY_BUFFER_SIZE (LCD_W*LCD_H*4/8) #if (defined(PCBX9E) || defined(PCBX9DP)) && defined(LCD_DUAL_BUFFER) extern display_t displayBuf1[DISPLAY_BUFFER_SIZE]; @@ -97,17 +96,11 @@ extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; #endif -#if (defined(PCBX9E) || defined(PCBX9DP)) && !defined(LCD_DUAL_BUFFER) && !defined(SIMU) - void lcdRefreshWait(); -#else - #define lcdRefreshWait() -#endif - extern coord_t lcdLastPos; extern coord_t lcdNextPos; -#define DISPLAY_END (displayBuf + DISPLAY_BUFFER_SIZE) -#define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) +#define DISPLAY_END (displayBuf + DISPLAY_BUFFER_SIZE) +#define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) #if defined(BOOT) // TODO quick & dirty :( @@ -133,18 +126,14 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags mode=0); void drawStringWithIndex(coord_t x, coord_t y, const pm_char *str, uint8_t idx, LcdFlags att=0); void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); -void putsSwitches(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0); +void drawSwitch(coord_t x, coord_t y, int32_t swtch, LcdFlags att=0); void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); -void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -#if !defined(BOOT) -void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att); -#endif +void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void putsTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att=0); -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); +void drawTimerMode(coord_t x, coord_t y, int32_t mode, LcdFlags att=0); +void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); -#define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att) +#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsVolts(coord_t x, coord_t y, uint16_t volts, LcdFlags att); @@ -158,11 +147,11 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t va #define putstime_t int32_t -void putsRtcTime(coord_t x, coord_t y, LcdFlags att); -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); +void drawRtcTime(coord_t x, coord_t y, LcdFlags att); +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att, LcdFlags att2); -#define SOLID 0xff -#define DOTTED 0x55 +#define SOLID 0xff +#define DOTTED 0x55 void lcdDrawPoint(coord_t x, coord_t y, LcdFlags att=0); void lcdMaskPoint(uint8_t *p, uint8_t mask, LcdFlags att=0); @@ -185,9 +174,9 @@ inline void lcdDrawSquare(coord_t x, coord_t y, coord_t w, LcdFlags att=0) void lcdInvertLine(int8_t line); #define lcdInvertLastLine() lcdInvertLine(LCD_LINES-1) -void drawShutdownBitmap(uint32_t index); +void drawShutdownAnimation(uint32_t index); void drawSleepBitmap(); -void lcdDrawTelemetryTopBar(); +void drawTelemetryTopBar(); #define V_BAR(xx, yy, ll) \ lcdDrawSolidVerticalLine(xx-1,yy-ll,ll); \ @@ -199,15 +188,7 @@ void lcd_img(coord_t x, coord_t y, const pm_uchar * img, uint8_t idx, LcdFlags a void lcdDrawBitmap(coord_t x, coord_t y, const uint8_t * img, coord_t offset=0, coord_t width=0); #define LCD_ICON(x, y, icon) lcdDrawBitmap(x, y, icons, icon) -void lcdSetRefVolt(unsigned char val); void lcdClear(); -void lcdSetContrast(); - -#if (defined(PCBX9E) || defined(PCBX9DP)) && !defined(SIMU) - void lcdRefresh(bool wait=true); -#else - void lcdRefresh(); -#endif uint8_t * lcdLoadBitmap(uint8_t * dest, const char * filename, uint16_t width, uint16_t height); const char * writeScreenshot(); diff --git a/radio/src/gui/212x64/menu_model.cpp b/radio/src/gui/212x64/menu_model.cpp index d0714ff079..fb8007eff8 100644 --- a/radio/src/gui/212x64/menu_model.cpp +++ b/radio/src/gui/212x64/menu_model.cpp @@ -71,7 +71,7 @@ uint8_t s_copySrcCh; uint8_t editNameCursorPos = 0; -void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uint8_t active, uint8_t attr) +void editName(coord_t x, coord_t y, char * name, uint8_t size, uint8_t event, uint8_t active, uint8_t attr) { uint8_t mode = 0; if (active) { @@ -159,7 +159,7 @@ void editName(coord_t x, coord_t y, char *name, uint8_t size, uint8_t event, uin } } -void editSingleName(coord_t x, coord_t y, const pm_char *label, char *name, uint8_t size, uint8_t event, uint8_t active) +void editSingleName(coord_t x, coord_t y, const pm_char * label, char *name, uint8_t size, uint8_t event, uint8_t active) { lcdDrawTextAlignedLeft(y, label); editName(x, y, name, size, event, active); diff --git a/radio/src/gui/212x64/menu_radio.cpp b/radio/src/gui/212x64/menu_radio.cpp index bab47ec000..7e6563d866 100644 --- a/radio/src/gui/212x64/menu_radio.cpp +++ b/radio/src/gui/212x64/menu_radio.cpp @@ -34,6 +34,6 @@ const MenuHandlerFunc menuTabGeneral[] = { void menuRadioSpecialFunctions(uint8_t event) { - MENU(STR_MENUSPECIALFUNCS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, NUM_CFN, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); + MENU(STR_MENUSPECIALFUNCS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); return menuSpecialFunctions(event, g_eeGeneral.customFn, &globalFunctionsContext); } diff --git a/radio/src/gui/212x64/menus.h b/radio/src/gui/212x64/menus.h index 30b1c076de..0c3a1b306e 100644 --- a/radio/src/gui/212x64/menus.h +++ b/radio/src/gui/212x64/menus.h @@ -23,15 +23,16 @@ #include "keys.h" -typedef uint16_t vertpos_t; typedef int8_t horzpos_t; +typedef uint16_t vertpos_t; + typedef void (*MenuHandlerFunc)(uint8_t event); extern tmr10ms_t menuEntryTime; extern vertpos_t menuVerticalPosition; extern horzpos_t menuHorizontalPosition; extern vertpos_t menuVerticalOffset; -extern uint8_t calibrationState; +extern uint8_t menuCalibrationState; extern MenuHandlerFunc menuHandlers[5]; extern uint8_t menuVerticalPositions[4]; @@ -48,9 +49,7 @@ void menuFirstCalib(uint8_t event); void menuMainViewChannelsMonitor(uint8_t event); void menuChannelsView(uint8_t event); void menuMainView(uint8_t event); -#if defined(TELEMETRY_FRSKY) void menuViewTelemetryFrsky(uint8_t event); -#endif void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomFunctionsContext * functionsContext); void menuModelNotes(uint8_t event); void menuStatisticsView(uint8_t event); @@ -60,14 +59,14 @@ void menuAboutView(uint8_t event); void menuTraceBuffer(uint8_t event); #endif -enum EnumTabRadio { +enum MenuRadioIndexes { MENU_RADIO_SETUP, MENU_RADIO_SD_MANAGER, MENU_RADIO_SPECIAL_FUNCTIONS, MENU_RADIO_TRAINER, MENU_RADIO_VERSION, - MENU_RADIO_DIAG_KEYS, - MENU_RADIO_DIAG_ANALOGS, + MENU_RADIO_SWITCHES_TEST, + MENU_RADIO_ANALOGS_TEST, MENU_RADIO_HARDWARE, MENU_RADIO_CALIBRATION, MENU_RADIO_PAGES_COUNT @@ -85,7 +84,7 @@ void menuRadioCalibration(uint8_t event); extern const MenuHandlerFunc menuTabGeneral[MENU_RADIO_PAGES_COUNT]; -enum EnumTabModel { +enum MenuModelIndexes { MENU_MODEL_SELECT, MENU_MODEL_SETUP, CASE_HELI(MENU_MODEL_HELI) diff --git a/radio/src/gui/212x64/model_custom_scripts.cpp b/radio/src/gui/212x64/model_custom_scripts.cpp index db5d03d777..3112d23d94 100644 --- a/radio/src/gui/212x64/model_custom_scripts.cpp +++ b/radio/src/gui/212x64/model_custom_scripts.cpp @@ -97,7 +97,7 @@ void menuModelCustomScriptOne(uint8_t event) } else { uint8_t *source = (uint8_t *)&g_model.scriptsData[s_currIdx].inputs[inputIdx]; - putsMixerSource(SCRIPT_ONE_2ND_COLUMN_POS, y, *source + scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, attr); + drawSource(SCRIPT_ONE_2ND_COLUMN_POS, y, *source + scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, attr); if (attr) { CHECK_INCDEC_MODELSOURCE(event, *source, scriptInputsOutputs[s_currIdx].inputs[inputIdx].min-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def, scriptInputsOutputs[s_currIdx].inputs[inputIdx].max-scriptInputsOutputs[s_currIdx].inputs[inputIdx].def); } @@ -110,7 +110,7 @@ void menuModelCustomScriptOne(uint8_t event) lcdDrawText(SCRIPT_ONE_3RD_COLUMN_POS, FH+1, STR_OUTPUTS); for (int i=0; i0) { value = checkIncDec(event, value, 0, MIXSRC_LAST_TELEM, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isSourceAvailable); } diff --git a/radio/src/gui/212x64/model_flightmodes.cpp b/radio/src/gui/212x64/model_flightmodes.cpp index 01741fec03..7583ee4287 100644 --- a/radio/src/gui/212x64/model_flightmodes.cpp +++ b/radio/src/gui/212x64/model_flightmodes.cpp @@ -30,36 +30,6 @@ void displayFlightModes(coord_t x, coord_t y, FlightModesType value) } } -FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr) -{ - drawFieldLabel(x, y, STR_FLMODE); - - int posHorz = menuHorizontalPosition; - - for (int p=0; p0) ? BLINK|INVERS : INVERS) : 0); @@ -136,7 +106,7 @@ void menuModelFlightModesAll(uint8_t event) case ITEM_FLIGHT_MODES_SWITCH: if (k>0) { - putsSwitches((4+LEN_FLIGHT_MODE_NAME)*FW+FW/2, y, p->swtch, attr); + drawSwitch((4+LEN_FLIGHT_MODE_NAME)*FW+FW/2, y, p->swtch, attr); if (active) CHECK_INCDEC_MODELSWITCH(event, p->swtch, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); } break; @@ -147,7 +117,7 @@ void menuModelFlightModesAll(uint8_t event) case ITEM_FLIGHT_MODES_TRIM_AIL: { uint8_t t = j-ITEM_FLIGHT_MODES_TRIM_RUD; - putsTrimMode((4+LEN_FLIGHT_MODE_NAME)*FW+j*(5*FW/2), y, k, t, attr); + drawTrimMode((4+LEN_FLIGHT_MODE_NAME)*FW+j*(5*FW/2), y, k, t, attr); if (active) { trim_t & v = p->trim[t]; v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); diff --git a/radio/src/gui/212x64/model_gvars.cpp b/radio/src/gui/212x64/model_gvars.cpp index 307c2f66eb..cffa18eae7 100644 --- a/radio/src/gui/212x64/model_gvars.cpp +++ b/radio/src/gui/212x64/model_gvars.cpp @@ -28,7 +28,7 @@ void editGVarValue(coord_t x, coord_t y, uint8_t event, uint8_t gvar, uint8_t fl if (v > GVAR_MAX) { uint8_t fm = v - GVAR_MAX - 1; if (fm >= flightMode) fm++; - putsFlightMode(x, y, fm + 1, flags&(~LEFT)); + drawFlightMode(x, y, fm + 1, flags&(~LEFT)); vmin = GVAR_MAX + 1; vmax = GVAR_MAX + MAX_FLIGHT_MODES - 1; } diff --git a/radio/src/gui/212x64/model_inputs.cpp b/radio/src/gui/212x64/model_inputs.cpp index bafd555b7f..41293fbc7f 100644 --- a/radio/src/gui/212x64/model_inputs.cpp +++ b/radio/src/gui/212x64/model_inputs.cpp @@ -23,7 +23,7 @@ #define EXPO_ONE_2ND_COLUMN (LCD_W-8*FW-90) #define EXPO_ONE_FM_WIDTH (9*FW) -int16_t expoFn(int16_t x) +int expoFn(int x) { ExpoData * ed = expoAddress(s_currIdx); int16_t anas[NUM_INPUTS] = {0}; @@ -33,20 +33,20 @@ int16_t expoFn(int16_t x) void drawFunction(FnFuncP fn, uint8_t offset) { - lcdDrawVerticalLine(X0-offset, 0/*TODO Y0-WCHART*/, WCHART*2, 0xee); - lcdDrawHorizontalLine(X0-WCHART-offset, Y0, WCHART*2, 0xee); + lcdDrawVerticalLine(CURVE_CENTER_X-offset, CURVE_CENTER_Y-CURVE_SIDE_WIDTH, CURVE_SIDE_WIDTH*2, 0xee); + lcdDrawHorizontalLine(CURVE_CENTER_X-CURVE_SIDE_WIDTH-offset, CURVE_CENTER_Y, CURVE_SIDE_WIDTH*2, 0xee); coord_t prev_yv = (coord_t)-1; - for (int xv=-WCHART; xv<=WCHART; xv++) { - coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/WCHART))) / 2 * (LCD_H-1) / RESX); + for (int xv=-CURVE_SIDE_WIDTH; xv<=CURVE_SIDE_WIDTH; xv++) { + coord_t yv = (LCD_H-1) - (((uint16_t)RESX + fn(xv * (RESX/CURVE_SIDE_WIDTH))) / 2 * (LCD_H-1) / RESX); if (prev_yv != (coord_t)-1) { if (abs((int8_t)yv-prev_yv) <= 1) { - lcdDrawPoint(X0+xv-offset-1, prev_yv, FORCE); + lcdDrawPoint(CURVE_CENTER_X+xv-offset-1, prev_yv, FORCE); } else { uint8_t tmp = (prev_yv < yv ? 0 : 1); - lcdDrawSolidVerticalLine(X0+xv-offset-1, yv+tmp, prev_yv-yv); + lcdDrawSolidVerticalLine(CURVE_CENTER_X+xv-offset-1, yv+tmp, prev_yv-yv); } } prev_yv = yv; @@ -183,7 +183,7 @@ void menuModelExpoOne(uint8_t event) } ExpoData * ed = expoAddress(s_currIdx); - putsMixerSource(PSIZE(TR_MENUINPUTS)*FW+FW, 0, MIXSRC_FIRST_INPUT+ed->chn, 0); + drawSource(PSIZE(TR_MENUINPUTS)*FW+FW, 0, MIXSRC_FIRST_INPUT+ed->chn, 0); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); SUBMENU(STR_MENUINPUTS, EXPO_FIELD_MAX, {0, 0, 0, ed->srcRaw >= MIXSRC_FIRST_TELEM ? (uint8_t)0 : (uint8_t)HIDDEN_ROW, 0, 0, CASE_CURVES(CURVE_ROWS) CASE_FLIGHT_MODES((MAX_FLIGHT_MODES-1) | NAVIGATION_LINE_BY_LINE) 0 /*, ...*/}); @@ -214,7 +214,7 @@ void menuModelExpoOne(uint8_t event) case EXPO_FIELD_SOURCE: lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); - putsMixerSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, STREXPANDED|attr); + drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, STREXPANDED|attr); if (attr) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); break; @@ -243,6 +243,7 @@ void menuModelExpoOne(uint8_t event) #if defined(FLIGHT_MODES) case EXPO_FIELD_FLIGHT_MODES: + drawFieldLabel(EXPO_ONE_2ND_COLUMN, y, STR_FLMODE); ed->flightModes = editFlightModes(EXPO_ONE_2ND_COLUMN, y, event, ed->flightModes, attr); break; #endif @@ -281,7 +282,7 @@ void menuModelExpoOne(uint8_t event) y512 = limit(-1024, y512, 1024); lcdDrawNumber(LCD_W-8-6*FW, 1*FH, calcRESXto1000(y512), RIGHT | PREC1); - x512 = X0+x512/(RESX/WCHART); + x512 = CURVE_CENTER_X+x512/(RESX/CURVE_SIDE_WIDTH); y512 = (LCD_H-1) - ((y512+RESX)/2) * (LCD_H-1) / RESX; lcdDrawSolidVerticalLine(x512, y512-3, 3*2+1); @@ -327,15 +328,15 @@ void onExposMenu(const char * result) } } -void displayExpoInfos(coord_t y, ExpoData *ed) +void displayExpoInfos(coord_t y, ExpoData * ed) { - putsCurveRef(EXPO_LINE_CURVE_POS, y, ed->curve, 0); - putsSwitches(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); + drawCurveRef(EXPO_LINE_CURVE_POS, y, ed->curve, 0); + drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch, 0); } -void displayExpoLine(coord_t y, ExpoData *ed) +void displayExpoLine(coord_t y, ExpoData * ed) { - putsMixerSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0); + drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw, 0); if (ed->carryTrim != TRIM_ON) { lcdDrawChar(EXPO_LINE_TRIM_POS, y, ed->carryTrim > 0 ? '-' : STR_RETA123[-ed->carryTrim]); @@ -507,7 +508,7 @@ void menuModelExposAll(uint8_t event) coord_t y = MENU_HEADER_HEIGHT+1+(cur-menuVerticalOffset)*FH; if (ichn+1 == ch && EXPO_VALID(ed)) { if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { - putsMixerSource(0, y, ch, 0); + drawSource(0, y, ch, 0); } uint8_t mixCnt = 0; do { @@ -561,7 +562,7 @@ void menuModelExposAll(uint8_t event) } } if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { - putsMixerSource(0, y, ch, attr); + drawSource(0, y, ch, attr); if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) { lcdDrawRect(EXPO_LINE_SELECT_POS, y-1, LCD_W-EXPO_LINE_SELECT_POS, 9, DOTTED); } diff --git a/radio/src/gui/212x64/model_logical_switches.cpp b/radio/src/gui/212x64/model_logical_switches.cpp index baaa468431..171eeed1ba 100644 --- a/radio/src/gui/212x64/model_logical_switches.cpp +++ b/radio/src/gui/212x64/model_logical_switches.cpp @@ -76,7 +76,7 @@ void menuModelLogicalSwitches(uint8_t event) { INCDEC_DECLARE_VARS(EE_MODEL); - MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, NUM_LOGICAL_SWITCH, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/ }); + MENU(STR_MENULOGICALSWITCHES, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, MAX_LOGICAL_SWITCHES, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/ }); int k = 0; int sub = menuVerticalPosition; @@ -108,7 +108,7 @@ void menuModelLogicalSwitches(uint8_t event) // CSW name unsigned int sw = SWSRC_SW1+k; - putsSwitches(0, y, sw, (getSwitch(sw) ? BOLD : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); + drawSwitch(0, y, sw, (getSwitch(sw) ? BOLD : 0) | ((sub==k && CURSOR_ON_LINE()) ? INVERS : 0)); // CSW func lcdDrawTextAtIndex(CSW_1ST_COLUMN, y, STR_VCSWFUNC, cs->func, horz==0 ? attr : 0); @@ -120,15 +120,15 @@ void menuModelLogicalSwitches(uint8_t event) int v3_min=-1, v3_max=100; if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); - putsSwitches(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_3RD_COLUMN, y, cs->v2, attr2); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v2_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); INCDEC_ENABLE_CHECK(isSwitchAvailableInLogicalSwitches); } else if (cstate == LS_FAMILY_EDGE) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, attr2, horz==LS_FIELD_V3 ? attr : 0); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min=-129; v2_max = 122; @@ -144,8 +144,8 @@ void menuModelLogicalSwitches(uint8_t event) } else if (cstate == LS_FAMILY_COMP) { v1_val = cs->v1; - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); - putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_3RD_COLUMN, y, cs->v2, attr2); INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -159,7 +159,7 @@ void menuModelLogicalSwitches(uint8_t event) } else { v1_val = cs->v1; - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); if (horz == 1) { INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailableInCustomSwitches); @@ -179,7 +179,7 @@ void menuModelLogicalSwitches(uint8_t event) } // CSW AND switch - putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, horz==LS_FIELD_ANDSW ? attr : 0); + drawSwitch(CSW_4TH_COLUMN, y, cs->andsw, horz==LS_FIELD_ANDSW ? attr : 0); // CSW duration if (cs->duration > 0) diff --git a/radio/src/gui/212x64/model_mixes.cpp b/radio/src/gui/212x64/model_mixes.cpp index e9e8af77f5..e5a2b64d7a 100644 --- a/radio/src/gui/212x64/model_mixes.cpp +++ b/radio/src/gui/212x64/model_mixes.cpp @@ -96,7 +96,7 @@ bool swapMixes(uint8_t & idx, uint8_t up) } if (tgt_idx == MAX_MIXERS) { - if (x->destCh == NUM_CHNOUT-1) + if (x->destCh == MAX_OUTPUT_CHANNELS-1) return false; x->destCh++; return true; @@ -110,7 +110,7 @@ bool swapMixes(uint8_t & idx, uint8_t up) else return false; } else { - if (destChdestCh++; + if (destChdestCh++; else return false; } return true; @@ -235,7 +235,7 @@ void menuModelMixOne(uint8_t event) case MIX_FIELD_SOURCE: lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); - putsMixerSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); + drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, STREXPANDED|attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; @@ -270,6 +270,7 @@ void menuModelMixOne(uint8_t event) #if defined(FLIGHT_MODES) case MIX_FIELD_FLIGHT_MODE: + drawFieldLabel(MIXES_2ND_COLUMN, y, STR_FLMODE); md2->flightModes = editFlightModes(MIXES_2ND_COLUMN, y, event, md2->flightModes, attr); break; #endif @@ -355,16 +356,16 @@ void displayHeaderChannelName(uint8_t ch) } } -void displayMixInfos(coord_t y, MixData *md) +void displayMixInfos(coord_t y, MixData * md) { - putsCurveRef(MIX_LINE_CURVE_POS, y, md->curve, 0); + drawCurveRef(MIX_LINE_CURVE_POS, y, md->curve, 0); if (md->swtch) { - putsSwitches(MIX_LINE_SWITCH_POS, y, md->swtch); + drawSwitch(MIX_LINE_SWITCH_POS, y, md->swtch); } } -void displayMixLine(coord_t y, MixData *md) +void displayMixLine(coord_t y, MixData * md) { if (md->name[0]) lcdDrawSizedText(MIX_LINE_NAME_POS, y, md->name, sizeof(md->name), ZCHAR); @@ -372,6 +373,13 @@ void displayMixLine(coord_t y, MixData *md) displayMixInfos(y, md); else displayFlightModes(MIX_LINE_FM_POS, y, md->flightModes); + + char cs = ' '; + if (md->speedDown || md->speedUp) + cs = 'S'; + if (md->delayUp || md->delayDown) + cs = (cs == 'S' ? '*' : 'D'); + lcdDrawChar(MIX_LINE_DELAY_POS, y, cs); } void menuModelMixAll(uint8_t event) @@ -527,7 +535,7 @@ void menuModelMixAll(uint8_t event) int cur = 0; int i = 0; - for (int ch=1; ch<=NUM_CHNOUT; ch++) { + for (int ch=1; ch<=MAX_OUTPUT_CHANNELS; ch++) { MixData * md; coord_t y = MENU_HEADER_HEIGHT+1+(cur-menuVerticalOffset)*FH; if (isrcRaw && md->destCh+1 == ch) { @@ -554,19 +562,12 @@ void menuModelMixAll(uint8_t event) if (mixCnt > 0) lcdDrawTextAtIndex(FW, y, STR_VMLTPX2, md->mltpx, 0); - putsMixerSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0); + drawSource(MIX_LINE_SRC_POS, y, md->srcRaw, 0); gvarWeightItem(MIX_LINE_WEIGHT_POS, y, md, RIGHT | attr | (isMixActive(i) ? BOLD : 0), 0); displayMixLine(y, md); - - char cs = ' '; - if (md->speedDown || md->speedUp) - cs = 'S'; - if (md->delayUp || md->delayDown) - cs = (cs =='S' ? '*' : 'D'); - lcdDrawChar(MIX_LINE_DELAY_POS, y, cs); - + if (s_copyMode) { if ((s_copyMode==COPY_MODE || s_copyTgtOfs == 0) && s_copySrcCh == ch && i == (s_copySrcIdx + (s_copyTgtOfs<0))) { /* draw a border around the raw on selection mode (copy/move) */ diff --git a/radio/src/gui/212x64/model_outputs.cpp b/radio/src/gui/212x64/model_outputs.cpp index 822abc405d..c99478e00d 100644 --- a/radio/src/gui/212x64/model_outputs.cpp +++ b/radio/src/gui/212x64/model_outputs.cpp @@ -101,7 +101,7 @@ void menuModelLimits(uint8_t event) { int sub = menuVerticalPosition; - if (sub < NUM_CHNOUT) { + if (sub < MAX_OUTPUT_CHANNELS) { #if defined(PPM_CENTER_ADJUSTABLE) || defined(PPM_UNIT_US) lcdDrawNumber(13*FW, 0, PPM_CH_CENTER(sub)+channelOutputs[sub]/2, RIGHT); lcdDrawText(13*FW, 0, STR_US); @@ -110,9 +110,9 @@ void menuModelLimits(uint8_t event) #endif } - MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, NUM_CHNOUT+1, { NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, 0 }); + MENU(STR_MENULIMITS, menuTabModel, MENU_MODEL_OUTPUTS, MAX_OUTPUT_CHANNELS+1, { NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, 0 }); - if (sub=0) { + if (sub=0) { drawColumnHeader(STR_LIMITS_HEADERS, menuHorizontalPosition); } @@ -127,9 +127,9 @@ void menuModelLimits(uint8_t event) coord_t y = MENU_HEADER_HEIGHT + 1 + i*FH; uint8_t k = i+menuVerticalOffset; - if (k==NUM_CHNOUT) { + if (k==MAX_OUTPUT_CHANNELS) { // last line available - add the "copy trim menu" line - uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0; + uint8_t attr = (sub==MAX_OUTPUT_CHANNELS) ? INVERS : 0; lcdDrawText(CENTER_OFS, y, STR_TRIMS2OFFSETS, NO_HIGHLIGHT() ? 0 : attr); if (attr) { s_editMode = 0; diff --git a/radio/src/gui/212x64/model_setup.cpp b/radio/src/gui/212x64/model_setup.cpp index 532f64d359..85b3dadb37 100644 --- a/radio/src/gui/212x64/model_setup.cpp +++ b/radio/src/gui/212x64/model_setup.cpp @@ -23,7 +23,7 @@ uint8_t g_moduleIdx; void menuModelFailsafe(uint8_t event); -enum menuModelSetupItems { +enum MenuModelSetupItems { ITEM_MODEL_NAME, ITEM_MODEL_BITMAP, ITEM_MODEL_TIMER1, @@ -126,8 +126,8 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, uint8_t event) { TimerData & timer = g_model.timers[timerIdx]; drawStringWithIndex(0*FW, y, STR_TIMER, timerIdx+1); - putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, menuHorizontalPosition==0 ? attr : 0); - putsTimer(MODEL_SETUP_3RD_COLUMN, y, timer.start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR); + drawTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, menuHorizontalPosition==0 ? attr : 0); + drawTimer(MODEL_SETUP_3RD_COLUMN, y, timer.start, menuHorizontalPosition==1 ? attr|TIMEHOUR : TIMEHOUR, menuHorizontalPosition==2 ? attr|TIMEHOUR : TIMEHOUR); if (attr && menuHorizontalPosition < 0) { lcdDrawFilledRect(MODEL_SETUP_2ND_COLUMN-1, y-1, 13*FW-3, FH+1); } @@ -250,11 +250,11 @@ int getSwitchWarningsCount() #endif #if defined(PCBX9E) #define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)), uint8_t(getSwitchWarningsCount() > 8 ? TITLE_ROW : HIDDEN_ROW), uint8_t(getSwitchWarningsCount() > 16 ? TITLE_ROW : HIDDEN_ROW) - #define POT_WARN_ITEMS() uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|NUM_POTS : 0), uint8_t(g_model.potsWarnMode ? TITLE_ROW : HIDDEN_ROW) + #define POT_WARN_ITEMS() uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(NUM_POTS+NUM_SLIDERS) : 0), uint8_t(g_model.potsWarnMode ? TITLE_ROW : HIDDEN_ROW) #define TOPLCD_ROWS 0, #else #define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|getSwitchWarningsCount()) - #define POT_WARN_ITEMS() uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|NUM_POTS : 0) + #define POT_WARN_ITEMS() uint8_t(g_model.potsWarnMode ? NAVIGATION_LINE_BY_LINE|(NUM_POTS+NUM_SLIDERS) : 0) #define TOPLCD_ROWS #endif @@ -266,7 +266,7 @@ void menuModelSetup(uint8_t event) #if defined(TARANIS_INTERNAL_PPM) MENU_TAB({ 0, 0, TIMERS_ROWS, TOPLCD_ROWS 0, 1, 0, 0, LABEL(Throttle), 0, 0, 0, - LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, + LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1), 0, LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, INTERNAL_MODULE_CHANNELS_ROWS, @@ -280,7 +280,7 @@ void menuModelSetup(uint8_t event) LABEL(Trainer), 0, TRAINER_CHANNELS_ROWS(), IF_TRAINER_ON(2)}); #else MENU_TAB({ 0, 0, TIMERS_ROWS, TOPLCD_ROWS 0, 1, 0, 0, LABEL(Throttle), 0, 0, 0, LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), - NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, + NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1), 0, LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, INTERNAL_MODULE_CHANNELS_ROWS, @@ -451,13 +451,13 @@ void menuModelSetup(uint8_t event) case ITEM_MODEL_THROTTLE_TRACE: { lcdDrawTextAlignedLeft(y, STR_TTRACE); - if (attr) CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, g_model.thrTraceSrc, NUM_POTS+NUM_CHNOUT, isThrottleSourceAvailable); + if (attr) CHECK_INCDEC_MODELVAR_ZERO_CHECK(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS, isThrottleSourceAvailable); uint8_t idx = g_model.thrTraceSrc + MIXSRC_Thr; if (idx > MIXSRC_Thr) idx += 1; - if (idx >= MIXSRC_FIRST_POT+NUM_POTS) - idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS; - putsMixerSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); + if (idx >= MIXSRC_FIRST_POT+NUM_POTS+NUM_SLIDERS) + idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS - NUM_SLIDERS; + drawSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); break; } @@ -592,8 +592,8 @@ void menuModelSetup(uint8_t event) } if (g_model.potsWarnMode) { coord_t x = MODEL_SETUP_2ND_COLUMN+28; - for (int i=0; i=POT1 && i=POT1 && i0); switch (j) { case ITEM_CUSTOM_FUNCTIONS_SWITCH: - putsSwitches(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); + drawSwitch(MODEL_SPECIAL_FUNC_1ST_COLUMN, y, CFN_SWITCH(cfn), attr | ((functionsContext->activeSwitches & ((MASK_CFN_TYPE)1 << k)) ? BOLD : 0)); if (active || AUTOSWITCH_ENTER_LONG()) CHECK_INCDEC_SWITCH(event, CFN_SWITCH(cfn), SWSRC_FIRST, SWSRC_LAST, eeFlags, isSwitchAvailableInCustomFunctions); if (func == FUNC_OVERRIDE_CHANNEL && functions != g_model.customFn) { func = CFN_FUNC(cfn) = func+1; @@ -206,7 +206,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF case ITEM_CUSTOM_FUNCTIONS_PARAM1: { - int8_t maxParam = NUM_CHNOUT-1; + int8_t maxParam = MAX_OUTPUT_CHANNELS-1; #if defined(OVERRIDE_CHANNEL_FUNCTION) if (func == FUNC_OVERRIDE_CHANNEL) { putsChn(lcdNextPos, y, CFN_CH_INDEX(cfn)+1, attr); @@ -215,7 +215,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF #endif if (func == FUNC_TRAINER) { maxParam = NUM_STICKS; - putsMixerSource(lcdNextPos, y, CFN_CH_INDEX(cfn)==0 ? 0 : MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); + drawSource(lcdNextPos, y, CFN_CH_INDEX(cfn)==0 ? 0 : MIXSRC_Rud+CFN_CH_INDEX(cfn)-1, attr); } #if defined(GVARS) else if (func == FUNC_ADJUST_GVAR) { @@ -268,7 +268,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF } else if (func == FUNC_SET_TIMER) { val_max = 539*60+59; //8:59:59 - putsTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr); + drawTimer(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr|LEFT|TIMEHOUR, attr); } else if (func == FUNC_PLAY_SOUND) { val_max = AU_SPECIAL_SOUND_LAST-AU_SPECIAL_SOUND_FIRST-1; @@ -308,7 +308,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF } else if (func == FUNC_PLAY_VALUE) { val_max = MIXSRC_LAST_TELEM; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); if (active) { INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(functionsContext == &globalFunctionsContext ? isSourceAvailableInGlobalFunctions : isSourceAvailable); @@ -317,7 +317,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF #endif else if (func == FUNC_VOLUME) { val_max = MIXSRC_LAST_CH; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); if (active) { INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); @@ -350,7 +350,7 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF break; case FUNC_ADJUST_GVAR_SOURCE: val_max = MIXSRC_LAST_CH; - putsMixerSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); + drawSource(MODEL_SPECIAL_FUNC_3RD_COLUMN, y, val_displayed, attr); if (active) { INCDEC_SET_FLAG(eeFlags | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); @@ -423,6 +423,6 @@ void menuSpecialFunctions(uint8_t event, CustomFunctionData * functions, CustomF void menuModelSpecialFunctions(uint8_t event) { - MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, NUM_CFN, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); + MENU(STR_MENUCUSTOMFUNC, menuTabModel, MENU_MODEL_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); return menuSpecialFunctions(event, g_model.customFn, &modelFunctionsContext); } diff --git a/radio/src/gui/212x64/model_telemetry.cpp b/radio/src/gui/212x64/model_telemetry.cpp index 1b625f14c4..ea0f0e1e2e 100644 --- a/radio/src/gui/212x64/model_telemetry.cpp +++ b/radio/src/gui/212x64/model_telemetry.cpp @@ -226,33 +226,33 @@ void menuModelSensor(uint8_t event) if (sensor->type == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { lcdDrawTextAlignedLeft(y, STR_CELLSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); if (attr) { - sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); + sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); } break; } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawTextAlignedLeft(y, STR_GPSSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); if (attr) { - sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); + sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); } break; } else if (sensor->formula == TELEM_FORMULA_CONSUMPTION) { lcdDrawTextAlignedLeft(y, STR_CURRENTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { - sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } break; } else if (sensor->formula == TELEM_FORMULA_TOTALIZE) { lcdDrawTextAlignedLeft(y, NO_INDENT(STR_SOURCE)); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { - sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } break; } @@ -284,9 +284,9 @@ void menuModelSensor(uint8_t event) } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawTextAlignedLeft(y, STR_ALTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); if (attr) { - sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); + sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); } break; } @@ -314,14 +314,14 @@ void menuModelSensor(uint8_t event) drawStringWithIndex(0, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_SENSORS, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } if (source < 0) { lcdDrawChar(SENSOR_2ND_COLUMN, y, '-', attr); - putsMixerSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(lcdNextPos, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); } else { - putsMixerSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); } break; } @@ -360,14 +360,14 @@ void onSensorMenu(const char *result) { int index = menuVerticalPosition - ITEM_TELEMETRY_SENSOR1; - if (index < MAX_SENSORS) { + if (index < MAX_TELEMETRY_SENSORS) { if (result == STR_EDIT) { pushMenu(menuModelSensor); } else if (result == STR_DELETE) { delTelemetryIndex(index); index += 1; - if (index0) ? BLINK|INVERS : INVERS); LcdFlags attr = (menuVerticalPosition == k ? blink : 0); - if (k>=ITEM_TELEMETRY_SENSOR1 && k=ITEM_TELEMETRY_SENSOR1 && kisAvailable()) { checkIncDecSelection = MIXSRC_FIRST_TELEM + 3*i; @@ -99,7 +99,7 @@ void onSwitchLongEnterPress(const char *result) else if (result == STR_MENU_TRIMS) checkIncDecSelection = SWSRC_FIRST_TRIM; else if (result == STR_MENU_LOGICAL_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, NUM_LOGICAL_SWITCH, isLogicalSwitchAvailable); + checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, MAX_LOGICAL_SWITCHES, isLogicalSwitchAvailable); else if (result == STR_MENU_OTHER) checkIncDecSelection = SWSRC_ON; else if (result == STR_MENU_INVERT) @@ -267,7 +267,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int } if (i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_SENSORS; i++) { + for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { TelemetrySensor * sensor = & g_model.telemetrySensors[i]; if (sensor->isAvailable()) { POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); @@ -291,7 +291,7 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { - for (int i = 0; i < NUM_LOGICAL_SWITCH; i++) { + for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); break; @@ -374,7 +374,7 @@ void check(const char * name, event_t event, uint8_t curr, const MenuHandlerFunc break; } - if (!calibrationState && cc != curr) { + if (!menuCalibrationState && cc != curr) { chainMenu((MenuHandlerFunc)pgm_read_adr(&menuTab[cc])); } @@ -387,8 +387,7 @@ void check(const char * name, event_t event, uint8_t curr, const MenuHandlerFunc DISPLAY_PROGRESS_BAR(menuTab ? lcdLastPos-2*FW-((curr+1)/10*FWNUM)-2 : 20*FW+1); - switch(event) - { + switch (event) { case EVT_ENTRY: menuEntryTime = get_tmr10ms(); s_editMode = EDIT_MODE_INIT; diff --git a/radio/src/gui/212x64/popups.cpp b/radio/src/gui/212x64/popups.cpp index 5ce99e4afd..7c98c70156 100644 --- a/radio/src/gui/212x64/popups.cpp +++ b/radio/src/gui/212x64/popups.cpp @@ -51,14 +51,14 @@ void showMessageBox(const char * title) lcdRefresh(); } -const pm_uchar asterisk_lbm[] PROGMEM = { +const pm_uchar ASTERISK_BITMAP[] PROGMEM = { #include "asterisk.lbm" }; void drawAlertBox(const char * title, const char * text, const char * action) { lcdClear(); - lcdDrawBitmap(0, 0, asterisk_lbm); + lcdDrawBitmap(0, 0, ASTERISK_BITMAP); #define MESSAGE_LCD_OFFSET 60 diff --git a/radio/src/gui/212x64/popups.h b/radio/src/gui/212x64/popups.h new file mode 100644 index 0000000000..9537dede81 --- /dev/null +++ b/radio/src/gui/212x64/popups.h @@ -0,0 +1,67 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#ifndef _POPUPS_H_ +#define _POPUPS_H_ + +#define MENU_X 30 +#define MENU_Y 16 +#define MENU_W LCD_W-(2*MENU_X) +#define WARNING_LINE_LEN 32 +#define WARNING_LINE_X 16 +#define WARNING_LINE_Y 3*FH + +void drawMessageBox(const char * title); +void showMessageBox(const char * title); +void runPopupWarning(uint8_t event); + +extern void (*popupFunc)(uint8_t event); +extern int16_t warningInputValue; +extern int16_t warningInputValueMin; +extern int16_t warningInputValueMax; +extern uint8_t warningInfoFlags; + +#define DISPLAY_WARNING (*popupFunc) +#define POPUP_WARNING(s) (warningText = s, warningInfoText = 0, popupFunc = runPopupWarning) +#define POPUP_CONFIRMATION(s) (warningText = s, warningType = WARNING_TYPE_CONFIRM, warningInfoText = 0, popupFunc = runPopupWarning) +#define POPUP_INPUT(s, func, start, min, max) (warningText = s, warningType = WARNING_TYPE_INPUT, popupFunc = func, warningInputValue = start, warningInputValueMin = min, warningInputValueMax = max) +#define WARNING_INFO_FLAGS warningInfoFlags +#define SET_WARNING_INFO(info, len, flags) (warningInfoText = info, warningInfoLength = len, warningInfoFlags = flags) + +#define NAVIGATION_MENUS +#define POPUP_MENU_ADD_ITEM(s) do { popupMenuOffsetType = MENU_OFFSET_INTERNAL; if (popupMenuNoItems < POPUP_MENU_MAX_LINES) popupMenuItems[popupMenuNoItems++] = s; } while (0) +#define POPUP_MENU_START(func) do { popupMenuHandler = (func); AUDIO_KEY_PRESS(); } while (0) +#define POPUP_MENU_MAX_LINES 12 +#define MENU_MAX_DISPLAY_LINES 6 +#define POPUP_MENU_ADD_SD_ITEM(s) POPUP_MENU_ADD_ITEM(s) +#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) +#define POPUP_MENU_SET_BSS_FLAG() +extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; +extern uint16_t popupMenuNoItems; +extern uint16_t popupMenuOffset; +enum { + MENU_OFFSET_INTERNAL, + MENU_OFFSET_EXTERNAL +}; +extern uint8_t popupMenuOffsetType; +const char * runPopupMenu(uint8_t event); +extern void (*popupMenuHandler)(const char * result); + +#endif // _POPUPS_H_ diff --git a/radio/src/gui/212x64/radio_calibration.cpp b/radio/src/gui/212x64/radio_calibration.cpp index 7d7f572c88..76c5a1fa38 100644 --- a/radio/src/gui/212x64/radio_calibration.cpp +++ b/radio/src/gui/212x64/radio_calibration.cpp @@ -36,10 +36,9 @@ enum CalibrationState { void drawPotsBars() { // Optimization by Mike Blandford - uint8_t x, i, len ; // declare temporary variables - for (x=LCD_W/2-(NUM_POTS/2)*BAR_SPACING+BAR_SPACING/2, i=NUM_STICKS; i> 1; @@ -132,7 +131,7 @@ void menuCommonCalib(uint8_t event) lcdDrawText(0*FW, MENU_HEADER_HEIGHT+FH, STR_MOVESTICKSPOTS, INVERS); lcdDrawTextAlignedLeft(MENU_HEADER_HEIGHT+2*FH, STR_MENUWHENDONE); - for (uint8_t i=0; i 50) { g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; @@ -202,14 +201,14 @@ void menuRadioCalibration(uint8_t event) check_simple(STR_MENUCALIBRATION, event, MENU_RADIO_CALIBRATION, menuTabGeneral, DIM(menuTabGeneral), 0); menuCommonCalib(READ_ONLY() ? 0 : event); if (menuEvent) { - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; } } void menuFirstCalib(uint8_t event) { if (event == EVT_KEY_BREAK(KEY_EXIT) || reusableBuffer.calib.state == CALIB_FINISHED) { - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; chainMenu(menuMainView); } else { diff --git a/radio/src/gui/212x64/radio_diaganas.cpp b/radio/src/gui/212x64/radio_diaganas.cpp index 304dc4d34e..cf418bae96 100644 --- a/radio/src/gui/212x64/radio_diaganas.cpp +++ b/radio/src/gui/212x64/radio_diaganas.cpp @@ -22,11 +22,11 @@ void menuRadioDiagAnalogs(uint8_t event) { - SIMPLE_MENU(STR_MENUANA, menuTabGeneral, MENU_RADIO_DIAG_ANALOGS, 0); + SIMPLE_MENU(STR_MENU_RADIO_ANALOGS, menuTabGeneral, MENU_RADIO_ANALOGS_TEST, 0); STICK_SCROLL_DISABLE(); - for (int i=0; i0) ? BLINK|INVERS : INVERS) : 0); switch (k) { - case ITEM_SETUP_HW_LABEL_STICKS: + case ITEM_RADIO_HARDWARE_LABEL_STICKS: lcdDrawTextAlignedLeft(y, STR_STICKS); break; - case ITEM_SETUP_HW_STICK1: - case ITEM_SETUP_HW_STICK2: - case ITEM_SETUP_HW_STICK3: - case ITEM_SETUP_HW_STICK4: - case ITEM_SETUP_HW_LS: - case ITEM_SETUP_HW_RS: + case ITEM_RADIO_HARDWARE_STICK1: + case ITEM_RADIO_HARDWARE_STICK2: + case ITEM_RADIO_HARDWARE_STICK3: + case ITEM_RADIO_HARDWARE_STICK4: + case ITEM_RADIO_HARDWARE_LS: + case ITEM_RADIO_HARDWARE_RS: { - int idx = (k<=ITEM_SETUP_HW_STICK4 ? k-ITEM_SETUP_HW_STICK1 : k-ITEM_SETUP_HW_LS+MIXSRC_SLIDER1-MIXSRC_Rud); + int idx = (k<=ITEM_RADIO_HARDWARE_STICK4 ? k-ITEM_RADIO_HARDWARE_STICK1 : k-ITEM_RADIO_HARDWARE_LS+MIXSRC_SLIDER1-MIXSRC_Rud); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, idx+1, 0); if (ZEXIST(g_eeGeneral.anaNames[idx]) || attr) editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, event, attr); @@ -115,10 +115,10 @@ void menuRadioHardware(uint8_t event) break; } #if defined(PCBX9E) - case ITEM_SETUP_HW_LS2: - case ITEM_SETUP_HW_RS2: + case ITEM_RADIO_HARDWARE_LS2: + case ITEM_RADIO_HARDWARE_RS2: { - int idx = k - ITEM_SETUP_HW_LS2; + int idx = k - ITEM_RADIO_HARDWARE_LS2; uint8_t mask = (0x01 << idx); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_XPOTS+2+idx+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_XPOTS+2+idx]) || (attr && menuHorizontalPosition == 0)) @@ -132,19 +132,19 @@ void menuRadioHardware(uint8_t event) break; } #endif - case ITEM_SETUP_HW_LABEL_POTS: + case ITEM_RADIO_HARDWARE_LABEL_POTS: lcdDrawTextAlignedLeft(y, STR_POTS); break; - case ITEM_SETUP_HW_POT1: - case ITEM_SETUP_HW_POT2: + case ITEM_RADIO_HARDWARE_POT1: + case ITEM_RADIO_HARDWARE_POT2: #if defined(PCBX9DP) || defined(PCBX9E) - case ITEM_SETUP_HW_POT3: + case ITEM_RADIO_HARDWARE_POT3: #endif #if defined(PCBX9E) - case ITEM_SETUP_HW_POT4: + case ITEM_RADIO_HARDWARE_POT4: #endif { - int idx = k - ITEM_SETUP_HW_POT1; + int idx = k - ITEM_RADIO_HARDWARE_POT1; uint8_t shift = (2*idx); uint8_t mask = (0x03 << shift); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0); @@ -158,31 +158,31 @@ void menuRadioHardware(uint8_t event) g_eeGeneral.potsConfig |= (potType << shift); break; } - case ITEM_SETUP_HW_LABEL_SWITCHES: + case ITEM_RADIO_HARDWARE_LABEL_SWITCHES: lcdDrawTextAlignedLeft(y, STR_SWITCHES); break; - case ITEM_SETUP_HW_SA: - case ITEM_SETUP_HW_SB: - case ITEM_SETUP_HW_SC: - case ITEM_SETUP_HW_SD: - case ITEM_SETUP_HW_SE: - case ITEM_SETUP_HW_SF: - case ITEM_SETUP_HW_SG: - case ITEM_SETUP_HW_SH: + case ITEM_RADIO_HARDWARE_SA: + case ITEM_RADIO_HARDWARE_SB: + case ITEM_RADIO_HARDWARE_SC: + case ITEM_RADIO_HARDWARE_SD: + case ITEM_RADIO_HARDWARE_SE: + case ITEM_RADIO_HARDWARE_SF: + case ITEM_RADIO_HARDWARE_SG: + case ITEM_RADIO_HARDWARE_SH: #if defined(PCBX9E) - case ITEM_SETUP_HW_SI: - case ITEM_SETUP_HW_SJ: - case ITEM_SETUP_HW_SK: - case ITEM_SETUP_HW_SL: - case ITEM_SETUP_HW_SM: - case ITEM_SETUP_HW_SN: - case ITEM_SETUP_HW_SO: - case ITEM_SETUP_HW_SP: - case ITEM_SETUP_HW_SQ: - case ITEM_SETUP_HW_SR: + case ITEM_RADIO_HARDWARE_SI: + case ITEM_RADIO_HARDWARE_SJ: + case ITEM_RADIO_HARDWARE_SK: + case ITEM_RADIO_HARDWARE_SL: + case ITEM_RADIO_HARDWARE_SM: + case ITEM_RADIO_HARDWARE_SN: + case ITEM_RADIO_HARDWARE_SO: + case ITEM_RADIO_HARDWARE_SP: + case ITEM_RADIO_HARDWARE_SQ: + case ITEM_RADIO_HARDWARE_SR: #endif { - int index = k-ITEM_SETUP_HW_SA; + int index = k-ITEM_RADIO_HARDWARE_SA; int config = SWITCH_CONFIG(index); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0)) @@ -197,7 +197,7 @@ void menuRadioHardware(uint8_t event) break; } #if defined(PCBX9E) - case ITEM_SETUP_HW_BLUETOOTH: + case ITEM_RADIO_HARDWARE_BLUETOOTH: lcdDrawTextAlignedLeft(y, "Bluetooth"); drawCheckBox(HW_SETTINGS_COLUMN, y, g_eeGeneral.bluetoothEnable, menuHorizontalPosition == 0 ? attr : 0); if (attr && menuHorizontalPosition == 0) { @@ -206,13 +206,13 @@ void menuRadioHardware(uint8_t event) editName(HW_SETTINGS_COLUMN+5*FW, y, g_eeGeneral.bluetoothName, LEN_BLUETOOTH_NAME, event, menuHorizontalPosition == 1 ? attr : 0); break; #endif - case ITEM_SETUP_HW_UART3_MODE: + case ITEM_RADIO_HARDWARE_UART3_MODE: g_eeGeneral.serial2Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.serial2Mode, 0, UART_MODE_MAX, attr, event); if (attr && checkIncDec_Ret) { serial2Init(g_eeGeneral.serial2Mode, MODEL_TELEMETRY_PROTOCOL()); } break; - case ITEM_SETUP_HW_JITTER_FILTER: + case ITEM_RADIO_HARDWARE_JITTER_FILTER: { uint8_t b = 1-g_eeGeneral.jitterFilter; g_eeGeneral.jitterFilter = 1 - editCheckBox(b, HW_SETTINGS_COLUMN, y, STR_JITTER_FILTER, attr, event); diff --git a/radio/src/gui/212x64/radio_sdmanager.cpp b/radio/src/gui/212x64/radio_sdmanager.cpp index 4b11f5a182..c58dd8e404 100644 --- a/radio/src/gui/212x64/radio_sdmanager.cpp +++ b/radio/src/gui/212x64/radio_sdmanager.cpp @@ -250,7 +250,7 @@ void menuRadioSdManager(event_t _event) int index = menuVerticalPosition-menuVerticalOffset; - switch(_event) { + switch (_event) { case EVT_ENTRY: f_chdir(ROOT_PATH); REFRESH_FILES(); @@ -366,7 +366,7 @@ void menuRadioSdManager(event_t _event) reusableBuffer.sdmanager.count = 0; - FRESULT res = f_opendir(&dir, "."); /* Open the directory */ + FRESULT res = f_opendir(&dir, "."); // Open the directory if (res == FR_OK) { for (;;) { res = f_readdir(&dir, &fno); /* Read a directory item */ @@ -384,8 +384,8 @@ void menuRadioSdManager(event_t _event) bool isfile = !(fno.fattrib & AM_DIR); if (menuVerticalOffset == 0) { - for (int i=0; i=0; i--) { - char *line = reusableBuffer.sdmanager.lines[i]; + char * line = reusableBuffer.sdmanager.lines[i]; if (line[0] == '\0' || isFilenameGreater(isfile, fn, line)) { if (i > 0) memmove(reusableBuffer.sdmanager.lines[0], reusableBuffer.sdmanager.lines[1], sizeof(reusableBuffer.sdmanager.lines[0]) * i); memset(line, 0, sizeof(reusableBuffer.sdmanager.lines[0])); @@ -427,7 +427,7 @@ void menuRadioSdManager(event_t _event) reusableBuffer.sdmanager.offset = menuVerticalOffset; - for (int i=0; i0) ? BLINK|INVERS : INVERS); uint8_t attr = (sub == k ? blink : 0); - switch(k) { + switch (k) { case ITEM_SETUP_DATE: lcdDrawTextAlignedLeft(y, STR_DATE); lcdDrawChar(RADIO_SETUP_DATE_COLUMN, y, '-'); lcdDrawChar(RADIO_SETUP_DATE_COLUMN+3*FW-2, y, '-'); @@ -183,8 +183,9 @@ void menuRadioSetup(uint8_t event) } } if (attr && menuHorizontalPosition < 0) lcdDrawFilledRect(RADIO_SETUP_2ND_COLUMN, y, LCD_W-RADIO_SETUP_2ND_COLUMN-MENUS_SCROLLBAR_WIDTH, 8); - if (attr && checkIncDec_Ret) + if (attr && checkIncDec_Ret) { g_rtcTime = gmktime(&t); // update local timestamp and get wday calculated + } break; case ITEM_SETUP_BATTERY_CALIB: diff --git a/radio/src/gui/212x64/radio_version.cpp b/radio/src/gui/212x64/radio_version.cpp index 19a5b242e5..e632ae9e0b 100644 --- a/radio/src/gui/212x64/radio_version.cpp +++ b/radio/src/gui/212x64/radio_version.cpp @@ -20,62 +20,13 @@ #include "opentx.h" -void backupEeprom() -{ - char filename[60]; - uint8_t buffer[1024]; - FIL file; - - lcdClear(); - drawProgressBar(STR_WRITING); - - // reset unexpectedShutdown to prevent warning when user restores EEPROM backup - g_eeGeneral.unexpectedShutdown = 0; - storageDirty(EE_GENERAL); - storageCheck(true); - - // create the directory if needed... - const char * error = sdCheckAndCreateDirectory(EEPROMS_PATH); - if (error) { - POPUP_WARNING(error); - return; - } - - // prepare the filename... - char * tmp = strAppend(filename, EEPROMS_PATH "/eeprom"); - tmp = strAppendDate(tmp, true); - strAppend(tmp, EEPROM_EXT); - - // open the file for writing... - f_open(&file, filename, FA_WRITE | FA_CREATE_ALWAYS); - - for (int i=0; i=NUM_LOGICAL_SWITCH*3/4) ? BITMAP_X+28 : ((i>=NUM_LOGICAL_SWITCH/2) ? BITMAP_X+25 : ((i>=NUM_LOGICAL_SWITCH/4) ? 21 : 18))) + 3*i) +#define VSWITCH_X(i) (((i>=MAX_LOGICAL_SWITCHES*3/4) ? BITMAP_X+28 : ((i>=MAX_LOGICAL_SWITCHES/2) ? BITMAP_X+25 : ((i>=MAX_LOGICAL_SWITCHES/4) ? 21 : 18))) + 3*i) #define VSWITCH_Y (LCD_H-9) #define TRIM_LH_X (32+9) #define TRIM_LV_X 10 @@ -161,7 +161,7 @@ void displayTrims(uint8_t phase) void drawSliders() { - for (uint8_t i=NUM_STICKS; i 3600) - putsTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, TIMEHOUR, 0); + drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, TIMEHOUR, 0); else - putsTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, 0, 0); + drawTimer(STATS_3RD_COLUMN + STATS_LABEL_WIDTH, FH*i+1, timersStates[i].val, 0, 0); } #if defined(THRTRACE) @@ -228,7 +228,7 @@ void menuTraceBuffer(uint8_t event) if (te) { //time putstime_t tme = te->time % SECS_PER_DAY; - putsTimer(4*FW, y, tme, TIMEHOUR|LEFT, TIMEHOUR|LEFT); + drawTimer(4*FW, y, tme, TIMEHOUR|LEFT, TIMEHOUR|LEFT); //event lcdDrawNumber(14*FW, y, te->event, LEADING0|LEFT, 3); //data diff --git a/radio/src/gui/212x64/view_telemetry.cpp b/radio/src/gui/212x64/view_telemetry.cpp index bdb877eaf3..68cb824f42 100644 --- a/radio/src/gui/212x64/view_telemetry.cpp +++ b/radio/src/gui/212x64/view_telemetry.cpp @@ -69,7 +69,7 @@ void displayGaugesTelemetryScreen(FrSkyScreenData & screen) } if (source && barMax > barMin) { int y = barHeight+6+i*(barHeight+6); - putsMixerSource(0, y+barHeight-5, source, 0); + drawSource(0, y+barHeight-5, source, 0); lcdDrawRect(BAR_LEFT, y, BAR_WIDTH+1, barHeight+2); getvalue_t value = getValue(source); putsChannel(BAR_LEFT+2+BAR_WIDTH, y+barHeight-5, source, LEFT); @@ -130,7 +130,7 @@ bool displayNumbersTelemetryScreen(FrSkyScreenData & screen) // we don't display GPS name, no space for it } else { - putsMixerSource(pos[j], 1+FH+2*FH*i, field, 0); + drawSource(pos[j], 1+FH+2*FH*i, field, 0); } if (field >= MIXSRC_FIRST_TELEM) { @@ -186,7 +186,7 @@ bool displayTelemetryScreen() return false; } - lcdDrawTelemetryTopBar(); + drawTelemetryTopBar(); if (s_frsky_view < MAX_TELEMETRY_SCREENS) { displayCustomTelemetryScreen(s_frsky_view); @@ -253,7 +253,7 @@ void menuViewTelemetryFrsky(uint8_t event) } } - lcdDrawTelemetryTopBar(); + drawTelemetryTopBar(); lcdDrawText(8*FW, 3*FH, "No Telemetry Screens"); displayRssiLine(); } diff --git a/radio/src/gui/212x64/widgets.cpp b/radio/src/gui/212x64/widgets.cpp index 702d116d8c..e1b10f9281 100644 --- a/radio/src/gui/212x64/widgets.cpp +++ b/radio/src/gui/212x64/widgets.cpp @@ -40,7 +40,7 @@ const pm_uchar bmp_shutdown[] PROGMEM = { #define SHUTDOWN_BITMAP_WIDTH 60 #define SHUTDOWN_BITMAP_HEIGHT 60 -void drawShutdownBitmap(uint32_t index) +void drawShutdownAnimation(uint32_t index) { index /= (PWR_PRESS_SHUTDOWN / 4); lcdRefreshWait(); @@ -133,7 +133,7 @@ select_menu_value_t selectMenuItem(coord_t x, coord_t y, const pm_char *label, c { drawFieldLabel(x, y, label); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); - if (attr) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); return value; } @@ -146,8 +146,8 @@ uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, const pm_char *label, swsrc_t switchMenuItem(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, uint8_t event) { drawFieldLabel(x, y, STR_SWITCH); - putsSwitches(x, y, value, attr); - if (attr) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); + drawSwitch(x, y, value, attr); + if (attr & (~RIGHT)) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); return value; } diff --git a/radio/src/gui/480x272/lcd.cpp b/radio/src/gui/480x272/lcd.cpp index b78b254bcc..dd1c7ea55c 100644 --- a/radio/src/gui/480x272/lcd.cpp +++ b/radio/src/gui/480x272/lcd.cpp @@ -210,9 +210,9 @@ void lcdDrawLine(coord_t x1, coord_t y1, coord_t x2, coord_t y2, uint8_t pat, Lc } #endif -void putsRtcTime(coord_t x, coord_t y, LcdFlags att) +void drawRtcTime(coord_t x, coord_t y, LcdFlags att) { - putsTimer(x, y, getValue(MIXSRC_TX_TIME), att); + drawTimer(x, y, getValue(MIXSRC_TX_TIME), att); } void getTimerString(char * str, putstime_t tme, LcdFlags att) @@ -243,7 +243,7 @@ void getTimerString(char * str, putstime_t tme, LcdFlags att) *str = '\0'; } -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att) +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att) { char str[LEN_TIMER_STRING]; // "-00:00:00" getTimerString(str, tme, att); @@ -263,152 +263,7 @@ void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att) lcdDrawSizedText(x, y, STR_VSRCRAW+2+length*(idx+1), length-1, att); } -char * getStringAtIndex(char * dest, const char * s, int idx) -{ - uint8_t len = s[0]; - strncpy(dest, s+1+len*idx, len); - dest[len] = '\0'; - return dest; -} - -char * getStringWithIndex(char * dest, const char * s, int idx) -{ - strAppendUnsigned(strAppend(dest, s), abs(idx)); - return dest; -} - -char * getSwitchString(char * dest, swsrc_t idx) -{ - if (idx == SWSRC_NONE) { - return getStringAtIndex(dest, STR_VSWITCHES, 0); - } - else if (idx == SWSRC_OFF) { - return getStringAtIndex(dest, STR_OFFON, 0); - } - - char * s = dest; - if (idx < 0) { - *s++ = '!'; - idx = -idx; - } - - if (idx <= SWSRC_LAST_SWITCH) { - div_t swinfo = switchInfo(idx); - if (ZEXIST(g_eeGeneral.switchNames[swinfo.quot])) { - s += zchar2str(s, g_eeGeneral.switchNames[swinfo.quot], LEN_SWITCH_NAME); - // TODO tous zchar2str - } - else { - *s++ = 'S'; - *s++ = 'A'+swinfo.quot; - } - *s++ = "\300-\301"[swinfo.rem]; - *s = '\0'; - } - else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) { - div_t swinfo = div(idx - SWSRC_FIRST_MULTIPOS_SWITCH, XPOTS_MULTIPOS_COUNT); - getStringWithIndex(s, "S", swinfo.quot*10+swinfo.rem+11); - } - else if (idx <= SWSRC_LAST_TRIM) { - getStringAtIndex(s, STR_VSWITCHES, idx-SWSRC_FIRST_TRIM+1); - } - else if (idx <= SWSRC_LAST_LOGICAL_SWITCH) { - getStringWithIndex(s, "L", idx-SWSRC_FIRST_LOGICAL_SWITCH+1); - } - else if (idx <= SWSRC_ONE) { - getStringAtIndex(s, STR_VSWITCHES, idx-SWSRC_ON+2+(SWSRC_LAST_TRIM-SWSRC_FIRST_TRIM)); - } - else if (idx <= SWSRC_LAST_FLIGHT_MODE) { - getStringWithIndex(s, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE); - } - else if (idx == SWSRC_TELEMETRY_STREAMING) { - strcpy(s, "Tele"); - } - else { - zchar2str(s, g_model.telemetrySensors[idx-SWSRC_FIRST_SENSOR].label, TELEM_LABEL_LEN); - } - - return dest; -} - -char * getSourceString(char * dest, mixsrc_t idx) -{ - if (idx == MIXSRC_NONE) { - return getStringAtIndex(dest, STR_VSRCRAW, 0); - } - else if (idx <= MIXSRC_LAST_INPUT) { - idx -= MIXSRC_FIRST_INPUT; - *dest++ = '\314'; - if (ZEXIST(g_model.inputNames[idx])) { - zchar2str(dest, g_model.inputNames[idx], LEN_INPUT_NAME); - dest[LEN_INPUT_NAME] = '\0'; - } - else { - strAppendUnsigned(dest, idx, 2); - } - } - else if (idx <= MIXSRC_LAST_LUA) { -#if defined(LUA_MODEL_SCRIPTS) - div_t qr = div(idx-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); - if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInputsOutputs[qr.quot].outputsCount) { - *dest++ = '\322'; - // *dest++ = '1'+qr.quot; - strcpy(dest, scriptInputsOutputs[qr.quot].outputs[qr.rem].name); - } -#endif - } - else if (idx <= MIXSRC_LAST_POT) { - idx -= MIXSRC_Rud; - if (ZEXIST(g_eeGeneral.anaNames[idx])) { - zchar2str(dest, g_eeGeneral.anaNames[idx], LEN_ANA_NAME); - dest[LEN_ANA_NAME] = '\0'; - } - else { - getStringAtIndex(dest, STR_VSRCRAW, idx + 1); - } - } - else if (idx <= MIXSRC_LAST_TRIM) { - idx -= MIXSRC_Rud; - getStringAtIndex(dest, STR_VSRCRAW, idx + 1); - } - else if (idx <= MIXSRC_LAST_SWITCH) { - idx -= MIXSRC_FIRST_SWITCH; - if (ZEXIST(g_eeGeneral.switchNames[idx])) { - zchar2str(dest, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME); - dest[LEN_SWITCH_NAME] = '\0'; - } - else { - getStringAtIndex(dest, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1); - } - } - else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) { - getSwitchString(dest, SWSRC_SW1 + idx - MIXSRC_SW1); - } - else if (idx <= MIXSRC_LAST_TRAINER) { - getStringWithIndex(dest, STR_PPM_TRAINER, idx - MIXSRC_FIRST_TRAINER + 1); - } - else if (idx <= MIXSRC_LAST_CH) { - getStringWithIndex(dest, STR_CH, idx - MIXSRC_CH1 + 1); - } - else if (idx <= MIXSRC_LAST_GVAR) { - getStringWithIndex(dest, STR_GV, idx - MIXSRC_GVAR1 + 1); - } - else if (idx < MIXSRC_FIRST_TELEM) { - getStringAtIndex(dest, STR_VSRCRAW, idx-MIXSRC_Rud+1-NUM_LOGICAL_SWITCH-NUM_TRAINER-NUM_CHNOUT-MAX_GVARS); - } - else { - idx -= MIXSRC_FIRST_TELEM; - div_t qr = div(idx, 3); - dest[0] = '\321'; - int pos = 1 + zchar2str(&dest[1], g_model.telemetrySensors[qr.quot].label, sizeof(g_model.telemetrySensors[qr.quot].label)); - if (qr.rem) dest[pos++] = (qr.rem==2 ? '+' : '-'); - dest[pos] = '\0'; - } - - return dest; -} - -void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags flags) +void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags flags) { char s[16]; getSourceString(s, idx); @@ -432,70 +287,21 @@ void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att) } } -void putsSwitches(coord_t x, coord_t y, swsrc_t idx, LcdFlags flags) +void drawSwitch(coord_t x, coord_t y, swsrc_t idx, LcdFlags flags) { char s[8]; getSwitchString(s, idx); lcdDrawText(x, y, s, flags); } -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att) -{ - if (idx==0) { - lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, att); - } - else { - drawStringWithIndex(x, y, STR_FP, abs(idx)-1, att); - } -} - -void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att) -{ - if (curve.value != 0) { - switch (curve.type) { - case CURVE_REF_DIFF: - lcdDrawText(x, y, "D", att); - GVAR_MENU_ITEM(lcdNextPos, y, curve.value, -100, 100, LEFT|att, 0, 0); - break; - - case CURVE_REF_EXPO: - lcdDrawText(x, y, "E", att); - GVAR_MENU_ITEM(lcdNextPos, y, curve.value, -100, 100, LEFT|att, 0, 0); - break; - - case CURVE_REF_FUNC: - lcdDrawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, att); - break; - - case CURVE_REF_CUSTOM: - drawCurveName(x, y, curve.value, att); - break; - } - } -} - void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags flags) { - if (idx == 0) { - return lcdDrawTextAtIndex(x, y, STR_MMMINV, 0, flags); - } - bool neg = false; - if (idx < 0) { - idx = -idx; - neg = true; - } - if (ZEXIST(g_model.curves[idx-1].name)) - lcdDrawSizedText(x, y, g_model.curves[idx-1].name, LEN_CURVE_NAME, ZCHAR|flags); - else - drawStringWithIndex(x, y, STR_CV, idx, flags); - if (neg) { - if ((flags&INVERS) && ((~flags&BLINK) || BLINK_ON_PHASE)) - flags &= ~(INVERS|BLINK); - lcdDrawChar(x-3, y, '!', flags); - } + char s[8]; + getCurveString(s, idx); + lcdDrawText(x, y, s, flags); } -void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) +void drawTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) { if (mode >= 0) { if (mode < TMRMODE_COUNT) @@ -503,10 +309,10 @@ void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att) else mode -= (TMRMODE_COUNT-1); } - putsSwitches(x, y, mode, att); + drawSwitch(x, y, mode, att); } -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) +void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att) { trim_t v = getRawTrimValue(phase, idx); unsigned int mode = v.mode; @@ -583,7 +389,7 @@ void putsChannelValue(coord_t x, coord_t y, source_t channel, int32_t value, Lcd putsTelemetryChannelValue(x, y, channel, value, att); } else if (channel >= MIXSRC_FIRST_TIMER || channel == MIXSRC_TX_TIME) { - putsTimer(x, y, value, att); + drawTimer(x, y, value, att); } else if (channel == MIXSRC_TX_VOLTAGE) { lcdDrawNumber(x, y, value, att|PREC1); diff --git a/radio/src/gui/480x272/lcd.h b/radio/src/gui/480x272/lcd.h index ec10b7f17a..f0306185fa 100644 --- a/radio/src/gui/480x272/lcd.h +++ b/radio/src/gui/480x272/lcd.h @@ -23,14 +23,10 @@ #include "bitmapbuffer.h" -#if defined(PCBHORUS) - #define LCD_W 480 - #define LCD_H 272 - #define LCD_COLS 30 -#else - #define LCD_W 800 - #define LCD_H 480 +#if LCD_W >= 480 #define LCD_COLS 40 +#else + #define LCD_COLS 30 #endif #define CENTER @@ -106,8 +102,6 @@ extern display_t displayBuf[DISPLAY_BUFFER_SIZE]; #define displayBuf lcd->getData() #endif -#define lcdRefreshWait() - #define DISPLAY_END (displayBuf + DISPLAY_BUFFER_SIZE) #define ASSERT_IN_DISPLAY(p) assert((p) >= displayBuf && (p) < DISPLAY_END) @@ -138,15 +132,13 @@ void lcdDrawNumber(coord_t x, coord_t y, int32_t val, LcdFlags flags=0, uint8_t void drawStringWithIndex(coord_t x, coord_t y, const pm_char *str, int idx, LcdFlags att=0, const char *prefix=""); void putsModelName(coord_t x, coord_t y, char *name, uint8_t id, LcdFlags att); void putsStickName(coord_t x, coord_t y, uint8_t idx, LcdFlags att=0); -void putsSwitches(coord_t x, coord_t y, swsrc_t swtch, LcdFlags flags=0); -void putsMixerSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); -void putsFlightMode(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void putsCurveRef(coord_t x, coord_t y, CurveRef &curve, LcdFlags att=0); +void drawSwitch(coord_t x, coord_t y, swsrc_t swtch, LcdFlags flags=0); +void drawSource(coord_t x, coord_t y, uint32_t idx, LcdFlags att=0); void drawCurveName(coord_t x, coord_t y, int8_t idx, LcdFlags att=0); -void putsTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); -void putsTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); +void drawTimerMode(coord_t x, coord_t y, int8_t mode, LcdFlags att=0); +void drawTrimMode(coord_t x, coord_t y, uint8_t phase, uint8_t idx, LcdFlags att); -#define putsChn(x, y, idx, att) putsMixerSource(x, y, MIXSRC_CH1+idx-1, att) +#define putsChn(x, y, idx, att) drawSource(x, y, MIXSRC_CH1+idx-1, att) void putsChnLetter(coord_t x, coord_t y, uint8_t idx, LcdFlags attr); void putsChannelValue(coord_t x, coord_t y, source_t channel, int32_t val, LcdFlags att=0); @@ -157,8 +149,8 @@ void putsTelemetryChannelValue(coord_t x, coord_t y, uint8_t channel, int32_t va #define LEN_TIMER_STRING 10 void getTimerString(char * str, putstime_t tme, LcdFlags att=0); -void putsRtcTime(coord_t x, coord_t y, LcdFlags att=0); -void putsTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att=0); +void drawRtcTime(coord_t x, coord_t y, LcdFlags att=0); +void drawTimer(coord_t x, coord_t y, putstime_t tme, LcdFlags att=0); #define SOLID 0xff #define DOTTED 0x55 @@ -259,10 +251,6 @@ inline void lcdDrawBitmapPattern(coord_t x, coord_t y, const uint8_t * img, LcdF lcd->drawBitmapPattern(x, y, img, flags, offset, width); } -#define lcdSetRefVolt(...) -void lcdSetContrast(); -#define lcdOff(...) - #if defined(BOOT) #define BLINK_ON_PHASE (0) #else diff --git a/radio/src/gui/480x272/menu_model.cpp b/radio/src/gui/480x272/menu_model.cpp index fbc9f47898..8948fbfb2a 100644 --- a/radio/src/gui/480x272/menu_model.cpp +++ b/radio/src/gui/480x272/menu_model.cpp @@ -43,7 +43,7 @@ const MenuHandlerFunc menuTabModel[] = { extern uint8_t s_curveChan; -void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, uint8_t attr); +void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags attr); uint8_t editDelay(const coord_t x, const coord_t y, const event_t event, const uint8_t attr, uint8_t delay) { diff --git a/radio/src/gui/480x272/menu_radio.cpp b/radio/src/gui/480x272/menu_radio.cpp index 47be02e1a9..eab69242e3 100644 --- a/radio/src/gui/480x272/menu_radio.cpp +++ b/radio/src/gui/480x272/menu_radio.cpp @@ -31,6 +31,6 @@ const MenuHandlerFunc menuTabGeneral[] = { bool menuRadioSpecialFunctions(event_t event) { - MENU(STR_MENUSPECIALFUNCS, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, NUM_CFN, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); + MENU(STR_MENUSPECIALFUNCS, RADIO_ICONS, menuTabGeneral, MENU_RADIO_SPECIAL_FUNCTIONS, MAX_SPECIAL_FUNCTIONS, { NAVIGATION_LINE_BY_LINE|4/*repeated*/ }); return menuSpecialFunctions(event, g_eeGeneral.customFn, globalFunctionsContext); } diff --git a/radio/src/gui/480x272/menus.h b/radio/src/gui/480x272/menus.h index af09d2462c..7da63c80dc 100644 --- a/radio/src/gui/480x272/menus.h +++ b/radio/src/gui/480x272/menus.h @@ -34,7 +34,7 @@ extern uint16_t linesCount; extern int menuVerticalPosition; extern int menuHorizontalPosition; extern int menuVerticalOffset; -extern uint8_t calibrationState; +extern uint8_t menuCalibrationState; // Temporary no highlight extern uint8_t noHighlightCounter; @@ -422,7 +422,7 @@ extern uint8_t editNameCursorPos; void editName(coord_t x, coord_t y, char *name, uint8_t size, event_t event, uint8_t active, LcdFlags flags=ZCHAR); uint8_t editDelay(const coord_t x, const coord_t y, const event_t event, const uint8_t attr, uint8_t delay); -void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, uint8_t attr); +void editCurveRef(coord_t x, coord_t y, CurveRef & curve, event_t event, LcdFlags flags); extern uint8_t s_curveChan; @@ -491,7 +491,7 @@ extern uint8_t warningInfoFlags; #define POPUP_MENU_MAX_LINES 12 #define MENU_MAX_DISPLAY_LINES 9 #define MENU_LINE_LENGTH (LEN_MODEL_NAME+12) -#define POPUP_MENU_ITEMS_FROM_BSS() +#define POPUP_MENU_SET_BSS_FLAG() extern const char * popupMenuItems[POPUP_MENU_MAX_LINES]; extern uint16_t popupMenuNoItems; extern uint16_t popupMenuOffset; diff --git a/radio/src/gui/480x272/model_curves.cpp b/radio/src/gui/480x272/model_curves.cpp index 9f82f6a730..a9c458ee7e 100644 --- a/radio/src/gui/480x272/model_curves.cpp +++ b/radio/src/gui/480x272/model_curves.cpp @@ -21,69 +21,9 @@ #include #include "opentx.h" -uint8_t s_curveChan; - -int curveFn(int x) -{ - return applyCustomCurve(x, s_curveChan); -} - -struct point_t { - coord_t x; - coord_t y; -}; - -point_t getPoint(uint8_t i) -{ - point_t result = {0, 0}; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); - bool custom = (crv.type == CURVE_TYPE_CUSTOM); - uint8_t count = 5+crv.points; - if (i < count) { - result.x = CURVE_CENTER_X-1-CURVE_SIDE_WIDTH+i*CURVE_SIDE_WIDTH*2/(count-1); - result.y = CURVE_CENTER_Y - (points[i]) * (CURVE_SIDE_WIDTH-1) / 100; - if (custom && i>0 && i g_model.points + sizeof(g_model.points)) { - AUDIO_WARNING2(); - return false; - } - - int8_t *nextCrv = curveAddress(index+1); - memmove(nextCrv+shift, nextCrv, 5*(MAX_CURVES-index-1)+curveEnd[MAX_CURVES-1]-curveEnd[index]); - if (shift < 0) memclear(&g_model.points[NUM_POINTS-1] + shift, -shift); - while (index0) ? BLINK|INVERS : INVERS) : 0); @@ -138,7 +138,7 @@ bool menuModelFlightModesAll(event_t event) if (k == 0) lcdDrawText(FLIGHT_MODES_SWITCH_COLUMN, y, "N/A"); else - putsSwitches(FLIGHT_MODES_SWITCH_COLUMN, y, p->swtch, attr); + drawSwitch(FLIGHT_MODES_SWITCH_COLUMN, y, p->swtch, attr); break; case ITEM_FLIGHT_MODES_TRIM_RUD: @@ -153,7 +153,7 @@ bool menuModelFlightModesAll(event_t event) trim_t & v = p->trim[t]; v.mode = checkIncDec(event, v.mode==TRIM_MODE_NONE ? -1 : v.mode, -1, k==0 ? 0 : 2*MAX_FLIGHT_MODES-1, EE_MODEL, isTrimModeAvailable); } - putsTrimMode(FLIGHT_MODES_TRIMS_COLUMN+j*FLIGHT_MODES_TRIM_WIDTH, y, k, t, attr); + drawTrimMode(FLIGHT_MODES_TRIMS_COLUMN+j*FLIGHT_MODES_TRIM_WIDTH, y, k, t, attr); break; } diff --git a/radio/src/gui/480x272/model_gvars.cpp b/radio/src/gui/480x272/model_gvars.cpp index 60ea979856..39c6c4fdcb 100644 --- a/radio/src/gui/480x272/model_gvars.cpp +++ b/radio/src/gui/480x272/model_gvars.cpp @@ -71,7 +71,7 @@ bool menuModelGVars(event_t event) if (v > GVAR_MAX) { uint8_t p = v - GVAR_MAX - 1; if (p >= j-1) p++; - putsFlightMode(x-21, y, p+1, attr); + drawFlightMode(x-21, y, p+1, attr); vmin = GVAR_MAX+1; vmax = GVAR_MAX+MAX_FLIGHT_MODES-1; } else { diff --git a/radio/src/gui/480x272/model_heli.cpp b/radio/src/gui/480x272/model_heli.cpp index 3fdd254c38..6ce2e14a7c 100644 --- a/radio/src/gui/480x272/model_heli.cpp +++ b/radio/src/gui/480x272/model_heli.cpp @@ -20,7 +20,7 @@ #include "opentx.h" -enum menuModelHeliItems { +enum MenuModelHeliItems { ITEM_HELI_SWASHTYPE, ITEM_HELI_SWASHRING, ITEM_HELI_ELE, @@ -37,10 +37,10 @@ enum menuModelHeliItems { bool menuModelHeli(event_t event) { SIMPLE_MENU(STR_MENUHELISETUP, MODEL_ICONS, menuTabModel, MENU_MODEL_HELI, ITEM_HELI_MAX); + + uint8_t sub = menuVerticalPosition; - int sub = menuVerticalPosition; - - for (unsigned int i=0; i0) ? BLINK|INVERS : INVERS); @@ -60,7 +60,7 @@ bool menuModelHeli(event_t event) case ITEM_HELI_ELE: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ELEVATOR); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.elevatorSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.elevatorSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.elevatorSource, 0, MIXSRC_LAST_CH); break; @@ -72,7 +72,7 @@ bool menuModelHeli(event_t event) case ITEM_HELI_AIL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_AILERON); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.aileronSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.aileronSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.aileronSource, 0, MIXSRC_LAST_CH); break; @@ -84,7 +84,7 @@ bool menuModelHeli(event_t event) case ITEM_HELI_COL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_COLLECTIVE); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.collectiveSource, 0, MIXSRC_LAST_CH); break; diff --git a/radio/src/gui/480x272/model_inputs.cpp b/radio/src/gui/480x272/model_inputs.cpp index 6981769319..6b76a025d0 100644 --- a/radio/src/gui/480x272/model_inputs.cpp +++ b/radio/src/gui/480x272/model_inputs.cpp @@ -233,7 +233,7 @@ bool menuModelExpoOne(event_t event) case EXPO_FIELD_SOURCE: lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); - putsMixerSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, menuHorizontalPosition==0 ? attr : 0); + drawSource(EXPO_ONE_2ND_COLUMN, y, ed->srcRaw, menuHorizontalPosition==0 ? attr : 0); if (attr && menuHorizontalPosition==0) ed->srcRaw = checkIncDec(event, ed->srcRaw, INPUTSRC_FIRST, INPUTSRC_LAST, EE_MODEL|INCDEC_SOURCE|NO_INCDEC_MARKS, isInputSourceAvailable); if (ed->srcRaw >= MIXSRC_FIRST_TELEM) { putsTelemetryChannelValue(EXPO_ONE_2ND_COLUMN+60, y, (ed->srcRaw - MIXSRC_FIRST_TELEM)/3, convertTelemValue(ed->srcRaw - MIXSRC_FIRST_TELEM + 1, ed->scale), LEFT|(menuHorizontalPosition==1?attr:0)); @@ -336,20 +336,20 @@ void onExposMenu(const char * result) } } -void displayExpoInfos(coord_t y, ExpoData *ed) +void displayExpoInfos(coord_t y, ExpoData * ed) { - putsCurveRef(EXPO_LINE_CURVE_POS, y, ed->curve); + drawCurveRef(EXPO_LINE_CURVE_POS, y, ed->curve); if (ed->swtch) { - putsSwitches(EXPO_LINE_SWITCH_POS, y, ed->swtch); + drawSwitch(EXPO_LINE_SWITCH_POS, y, ed->swtch); } if (ed->mode != 3) { lcdDrawText(EXPO_LINE_SIDE_POS, y, ed->mode == 2 ? "\176" : "\177"); } } -void displayExpoLine(coord_t y, ExpoData *ed) +void displayExpoLine(coord_t y, ExpoData * ed) { - putsMixerSource(EXPO_LINE_SRC_POS, y, ed->srcRaw); + drawSource(EXPO_LINE_SRC_POS, y, ed->srcRaw); displayExpoInfos(y, ed); displayFlightModes(EXPO_LINE_FM_POS, y, ed->flightModes, 0); @@ -493,7 +493,7 @@ bool menuModelExposAll(event_t event) coord_t y = MENU_CONTENT_TOP + (cur-menuVerticalOffset)*FH; if ((ichn+1 == ch && EXPO_VALID(ed))) { if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { - putsMixerSource(MENUS_MARGIN_LEFT, y, ch); + drawSource(MENUS_MARGIN_LEFT, y, ch); } uint8_t mixCnt = 0; do { @@ -544,7 +544,7 @@ bool menuModelExposAll(event_t event) } } if (cur-menuVerticalOffset >= 0 && cur-menuVerticalOffset < NUM_BODY_LINES) { - putsMixerSource(MENUS_MARGIN_LEFT, y, ch, attr); + drawSource(MENUS_MARGIN_LEFT, y, ch, attr); if (s_copyMode == MOVE_MODE && s_copySrcCh == ch) { lineExpoSurround(y); } diff --git a/radio/src/gui/480x272/model_logical_switches.cpp b/radio/src/gui/480x272/model_logical_switches.cpp index 903ebf8f0d..ca4b1d858e 100644 --- a/radio/src/gui/480x272/model_logical_switches.cpp +++ b/radio/src/gui/480x272/model_logical_switches.cpp @@ -76,7 +76,7 @@ bool menuModelLogicalSwitches(event_t event) { INCDEC_DECLARE_VARS(EE_MODEL); - MENU(STR_MENULOGICALSWITCHES, MODEL_ICONS, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, NUM_LOGICAL_SWITCH, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/} ); + MENU(STR_MENULOGICALSWITCHES, MODEL_ICONS, menuTabModel, MENU_MODEL_LOGICAL_SWITCHES, MAX_LOGICAL_SWITCHES, { NAVIGATION_LINE_BY_LINE|LS_FIELD_LAST/*repeated...*/} ); LogicalSwitchData * cs = lswAddress(menuVerticalPosition); uint8_t cstate = lswFamily(cs->func); @@ -110,7 +110,7 @@ bool menuModelLogicalSwitches(event_t event) // CSW name unsigned int sw = SWSRC_SW1+k; - putsSwitches(MENUS_MARGIN_LEFT, y, sw, (getSwitch(sw) ? BOLD : 0) | ((menuVerticalPosition==k && CURSOR_ON_LINE()) ? INVERS : 0)); + drawSwitch(MENUS_MARGIN_LEFT, y, sw, (getSwitch(sw) ? BOLD : 0) | ((menuVerticalPosition==k && CURSOR_ON_LINE()) ? INVERS : 0)); // CSW func lcdDrawTextAtIndex(CSW_1ST_COLUMN, y, STR_VCSWFUNC, cs->func, menuHorizontalPosition==0 ? attr : 0); @@ -122,15 +122,15 @@ bool menuModelLogicalSwitches(event_t event) int v3_min=-1, v3_max=100; if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); - putsSwitches(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_3RD_COLUMN, y, cs->v2, attr2); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v2_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; INCDEC_SET_FLAG(EE_MODEL | INCDEC_SWITCH); INCDEC_ENABLE_CHECK(isSwitchAvailableInLogicalSwitches); } else if (cstate == LS_FAMILY_EDGE) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, attr1); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, attr1); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, attr2, (menuHorizontalPosition==LS_FIELD_V3 ? attr : 0)); v1_min = SWSRC_FIRST_IN_LOGICAL_SWITCHES; v1_max = SWSRC_LAST_IN_LOGICAL_SWITCHES; v2_min=-129; v2_max = 122; @@ -146,8 +146,8 @@ bool menuModelLogicalSwitches(event_t event) } else if (cstate == LS_FAMILY_COMP) { v1_val = cs->v1; - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); - putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, attr2); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_3RD_COLUMN, y, cs->v2, attr2); INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailable); } @@ -161,7 +161,7 @@ bool menuModelLogicalSwitches(event_t event) } else { v1_val = cs->v1; - putsMixerSource(CSW_2ND_COLUMN, y, v1_val, attr1); + drawSource(CSW_2ND_COLUMN, y, v1_val, attr1); if (menuHorizontalPosition == 1) { INCDEC_SET_FLAG(EE_MODEL | INCDEC_SOURCE); INCDEC_ENABLE_CHECK(isSourceAvailableInCustomSwitches); @@ -176,7 +176,7 @@ bool menuModelLogicalSwitches(event_t event) } // CSW AND switch - putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, menuHorizontalPosition==LS_FIELD_ANDSW ? attr : 0); + drawSwitch(CSW_4TH_COLUMN, y, cs->andsw, menuHorizontalPosition==LS_FIELD_ANDSW ? attr : 0); // CSW duration if (cs->duration > 0) diff --git a/radio/src/gui/480x272/model_mixes.cpp b/radio/src/gui/480x272/model_mixes.cpp index 0df3ccb306..28d62bfb62 100644 --- a/radio/src/gui/480x272/model_mixes.cpp +++ b/radio/src/gui/480x272/model_mixes.cpp @@ -24,7 +24,7 @@ int getMixesLinesCount() { int lastch = -1; - uint8_t count = NUM_CHNOUT; + uint8_t count = MAX_OUTPUT_CHANNELS; for (int i=0; isrcRaw; if (!valid) @@ -116,7 +116,7 @@ bool swapMixes(uint8_t & idx, uint8_t up) } if (tgt_idx == MAX_MIXERS) { - if (x->destCh == NUM_CHNOUT-1) + if (x->destCh == MAX_OUTPUT_CHANNELS-1) return false; x->destCh++; return true; @@ -130,7 +130,7 @@ bool swapMixes(uint8_t & idx, uint8_t up) else return false; } else { - if (destChdestCh++; + if (destChdestCh++; else return false; } return true; @@ -201,7 +201,7 @@ bool menuModelMixOne(event_t event) break; case MIX_FIELD_SOURCE: lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); - putsMixerSource(MIXES_2ND_COLUMN, y, md2->srcRaw, attr); + drawSource(MIXES_2ND_COLUMN, y, md2->srcRaw, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, md2->srcRaw, 1, MIXSRC_LAST); break; case MIX_FIELD_WEIGHT: @@ -324,11 +324,11 @@ void onMixesMenu(const char * result) void displayMixInfos(coord_t y, MixData *md) { if (md->curve.value != 0 ) lcd->drawBitmap(MIX_LINE_CURVE_ICON, y + 2, mixerSetupCurveBitmap); - putsCurveRef(MIX_LINE_CURVE_POS, y, md->curve); + drawCurveRef(MIX_LINE_CURVE_POS, y, md->curve); if (md->swtch) { lcd->drawBitmap(MIX_LINE_SWITCH_ICON, y + 2, mixerSetupSwitchBitmap); - putsSwitches(MIX_LINE_SWITCH_POS, y, md->swtch); + drawSwitch(MIX_LINE_SWITCH_POS, y, md->swtch); } } @@ -519,7 +519,7 @@ bool menuModelMixAll(event_t event) int cur = 0; int i = 0; - for (int ch=1; ch<=NUM_CHNOUT; ch++) { + for (int ch=1; ch<=MAX_OUTPUT_CHANNELS; ch++) { MixData * md; coord_t y = MENU_CONTENT_TOP + (cur-menuVerticalOffset)*FH; if (isrcRaw && md->destCh+1 == ch) { @@ -547,7 +547,7 @@ bool menuModelMixAll(event_t event) if (mixCnt > 0) lcd->drawBitmap(10, y, mpx_mode[md->mltpx]); - putsMixerSource(MIX_LINE_SRC_POS, y, md->srcRaw); + drawSource(MIX_LINE_SRC_POS, y, md->srcRaw); gvarWeightItem(MIX_LINE_WEIGHT_POS, y, md, RIGHT | attr | (isMixActive(i) ? BOLD : 0), event); diff --git a/radio/src/gui/480x272/model_outputs.cpp b/radio/src/gui/480x272/model_outputs.cpp index ab89dcf496..3cbe89bb90 100644 --- a/radio/src/gui/480x272/model_outputs.cpp +++ b/radio/src/gui/480x272/model_outputs.cpp @@ -23,7 +23,7 @@ bool isThrottleOutput(uint8_t ch) { for (uint8_t i=0; idestCh==ch && mix->srcRaw==MIXSRC_Thr) return true; } @@ -49,15 +49,15 @@ enum LimitsItems { ITEM_LIMITS_MAXROW = ITEM_LIMITS_COUNT-1 }; - #define LIMITS_NAME_POS 52 - #define LIMITS_OFFSET_POS 160 - #define LIMITS_MIN_POS 220 - #define LIMITS_DIRECTION_POS 240 - #define LIMITS_MAX_POS 300 - #define LIMITS_REVERT_POS 320 - #define LIMITS_CURVE_POS 350 - #define LIMITS_PPM_CENTER_POS 440 - #define LIMITS_SYMETRICAL_POS 450 +#define LIMITS_NAME_POS 52 +#define LIMITS_OFFSET_POS 160 +#define LIMITS_MIN_POS 220 +#define LIMITS_DIRECTION_POS 235 +#define LIMITS_MAX_POS 300 +#define LIMITS_REVERT_POS 312 +#define LIMITS_CURVE_POS 340 +#define LIMITS_PPM_CENTER_POS 440 +#define LIMITS_SYMETRICAL_POS 450 #define LIMITS_MIN_MAX_OFFSET 1000 #define CONVERT_US_MIN_MAX(x) (((x)*1280)/250) @@ -93,7 +93,7 @@ void onLimitsMenu(const char *result) bool menuModelLimits(event_t event) { - MENU(STR_MENULIMITS, MODEL_ICONS, menuTabModel, MENU_MODEL_OUTPUTS, NUM_CHNOUT+1, + MENU(STR_MENULIMITS, MODEL_ICONS, menuTabModel, MENU_MODEL_OUTPUTS, MAX_OUTPUT_CHANNELS+1, { NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, NAVIGATION_LINE_BY_LINE|ITEM_LIMITS_MAXROW, @@ -102,7 +102,7 @@ bool menuModelLimits(event_t event) uint32_t sub = menuVerticalPosition; - if (sub=0) { + if (sub=0) { drawColumnHeader(STR_LIMITS_HEADERS, NULL, menuHorizontalPosition); } @@ -117,9 +117,9 @@ bool menuModelLimits(event_t event) coord_t y = MENU_CONTENT_TOP + i*FH; uint8_t k = i+menuVerticalOffset; - if (k==NUM_CHNOUT) { + if (k==MAX_OUTPUT_CHANNELS) { // last line available - add the "copy trim menu" line - uint8_t attr = (sub==NUM_CHNOUT) ? INVERS : 0; + uint8_t attr = (sub==MAX_OUTPUT_CHANNELS) ? INVERS : 0; // TODO CENTER attribute lcdDrawText(100, y, STR_TRIMS2OFFSETS, NO_HIGHLIGHT() ? 0 : attr); if (attr) { diff --git a/radio/src/gui/480x272/model_setup.cpp b/radio/src/gui/480x272/model_setup.cpp index ed7fe3caa2..aba719aacb 100644 --- a/radio/src/gui/480x272/model_setup.cpp +++ b/radio/src/gui/480x272/model_setup.cpp @@ -110,8 +110,8 @@ void editTimerMode(int timerIdx, coord_t y, LcdFlags attr, event_t event) lcdDrawSolidFilledRect(MODEL_SETUP_2ND_COLUMN-INVERT_HORZ_MARGIN, y-INVERT_VERT_MARGIN+1, 115+2*INVERT_HORZ_MARGIN, INVERT_LINE_HEIGHT, TEXT_INVERTED_BGCOLOR); } drawStringWithIndex(MENUS_MARGIN_LEFT, y, STR_TIMER, timerIdx+1); - putsTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, (menuHorizontalPosition<=0 ? attr : 0)); - putsTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer.start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR)); + drawTimerMode(MODEL_SETUP_2ND_COLUMN, y, timer.mode, (menuHorizontalPosition<=0 ? attr : 0)); + drawTimer(MODEL_SETUP_2ND_COLUMN+50, y, timer.start, (menuHorizontalPosition!=0 ? attr|TIMEHOUR : TIMEHOUR)); if (attr && s_editMode>0) { switch (menuHorizontalPosition) { case 0: @@ -217,7 +217,7 @@ int getSwitchWarningsCount() #endif #define SW_WARN_ITEMS() uint8_t(NAVIGATION_LINE_BY_LINE|(getSwitchWarningsCount()-1)) -#define POT_WARN_ITEMS() ((g_model.potsWarnMode >> 6) ? (uint8_t)NUM_POTS : (uint8_t)0) +#define POT_WARN_ITEMS() ((g_model.potsWarnMode >> 6) ? uint8_t(NUM_POTS+NUM_SLIDERS) : (uint8_t)0) bool menuModelSetup(event_t event) { @@ -234,7 +234,7 @@ bool menuModelSetup(event_t event) MENU(STR_MENUSETUP, MODEL_ICONS, menuTabModel, MENU_MODEL_SETUP, ITEM_MODEL_SETUP_MAX, { 0, 0, TIMERS_ROWS, 0, 1, 0, 0, LABEL(Throttle), 0, 0, 0, - LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_ROTARY_ENCODERS-1), 0, + LABEL(PreflightCheck), 0, 0, SW_WARN_ITEMS(), POT_WARN_ITEMS(), NAVIGATION_LINE_BY_LINE|(NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_ROTARY_ENCODERS-1), 0, LABEL(InternalModule), INTERNAL_MODULE_MODE_ROWS, INTERNAL_MODULE_CHANNELS_ROWS, @@ -406,13 +406,13 @@ bool menuModelSetup(event_t event) case ITEM_MODEL_THROTTLE_TRACE: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_TTRACE); - if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_CHNOUT); + if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.thrTraceSrc, NUM_POTS+NUM_SLIDERS+MAX_OUTPUT_CHANNELS); uint8_t idx = g_model.thrTraceSrc + MIXSRC_Thr; if (idx > MIXSRC_Thr) idx += 1; - if (idx >= MIXSRC_FIRST_POT+NUM_POTS) - idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS; - putsMixerSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); + if (idx >= MIXSRC_FIRST_POT+NUM_POTS+NUM_SLIDERS) + idx += MIXSRC_CH1 - MIXSRC_FIRST_POT - NUM_POTS - NUM_SLIDERS; + drawSource(MODEL_SETUP_2ND_COLUMN, y, idx, attr); break; } @@ -508,7 +508,7 @@ bool menuModelSetup(event_t event) lcdDrawTextAtIndex(MODEL_SETUP_2ND_COLUMN, y, PSTR("\004""OFF\0""Man\0""Auto"), g_model.potsWarnMode, (menuHorizontalPosition == 0) ? attr : 0); if (g_model.potsWarnMode) { coord_t x = MODEL_SETUP_2ND_COLUMN+30; - for (int i=0; itype == TELEM_TYPE_CALCULATED) { if (sensor->formula == TELEM_FORMULA_CELL) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CELLSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->cell.source ? MIXSRC_FIRST_TELEM+3*(sensor->cell.source-1) : 0, attr); if (attr) { - sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); + sensor->cell.source = checkIncDec(event, sensor->cell.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isCellsSensor); } break; } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_GPSSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.gps ? MIXSRC_FIRST_TELEM+3*(sensor->dist.gps-1) : 0, attr); if (attr) { - sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); + sensor->dist.gps = checkIncDec(event, sensor->dist.gps, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isGPSSensor); } break; } else if (sensor->formula == TELEM_FORMULA_CONSUMPTION) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_CURRENTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { - sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isTelemetryFieldAvailable); + sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isTelemetryFieldAvailable); } break; } else if (sensor->formula == TELEM_FORMULA_TOTALIZE) { lcdDrawText(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE)); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->consumption.source ? MIXSRC_FIRST_TELEM+3*(sensor->consumption.source-1) : 0, attr); if (attr) { - sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isTelemetryFieldComparisonAvailable); + sensor->consumption.source = checkIncDec(event, sensor->consumption.source, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isTelemetryFieldComparisonAvailable); } break; } @@ -288,9 +288,9 @@ bool menuModelSensor(event_t event) } else if (sensor->formula == TELEM_FORMULA_DIST) { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_ALTSENSOR); - putsMixerSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, sensor->dist.alt ? MIXSRC_FIRST_TELEM+3*(sensor->dist.alt-1) : 0, attr); if (attr) { - sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); + sensor->dist.alt = checkIncDec(event, sensor->dist.alt, 0, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isAltSensor); } break; } @@ -318,14 +318,14 @@ bool menuModelSensor(event_t event) drawStringWithIndex(MENUS_MARGIN_LEFT, y, NO_INDENT(STR_SOURCE), k-SENSOR_FIELD_PARAM1+1); int8_t & source = sensor->calc.sources[k-SENSOR_FIELD_PARAM1]; if (attr) { - source = checkIncDec(event, source, -MAX_SENSORS, MAX_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); + source = checkIncDec(event, source, -MAX_TELEMETRY_SENSORS, MAX_TELEMETRY_SENSORS, EE_MODEL|NO_INCDEC_MARKS, isSensorAvailable); } if (source < 0) { lcdDrawText(SENSOR_2ND_COLUMN, y, "-", attr); - putsMixerSource(SENSOR_2ND_COLUMN+5, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); + drawSource(SENSOR_2ND_COLUMN+5, y, MIXSRC_FIRST_TELEM+3*(-1-source), attr); } else { - putsMixerSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); + drawSource(SENSOR_2ND_COLUMN, y, source ? MIXSRC_FIRST_TELEM+3*(source-1) : 0, attr); } break; } @@ -367,14 +367,14 @@ void onSensorMenu(const char *result) { int index = menuVerticalPosition - ITEM_TELEMETRY_SENSOR1; - if (index < MAX_SENSORS) { + if (index < MAX_TELEMETRY_SENSORS) { if (result == STR_EDIT) { pushMenu(menuModelSensor); } else if (result == STR_DELETE) { delTelemetryIndex(index); index += 1; - if (index0) ? BLINK|INVERS : INVERS); LcdFlags attr = (menuVerticalPosition == k ? blink : 0); - if (k>=ITEM_TELEMETRY_SENSOR1 && k=ITEM_TELEMETRY_SENSOR1 && kisAvailable()) { checkIncDecSelection = MIXSRC_FIRST_TELEM + 3*i; @@ -99,7 +99,7 @@ void onSwitchLongEnterPress(const char *result) else if (result == STR_MENU_TRIMS) checkIncDecSelection = SWSRC_FIRST_TRIM; else if (result == STR_MENU_LOGICAL_SWITCHES) - checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, NUM_LOGICAL_SWITCH, isLogicalSwitchAvailable); + checkIncDecSelection = SWSRC_FIRST_LOGICAL_SWITCH + getFirstAvailable(0, MAX_LOGICAL_SWITCHES, isLogicalSwitchAvailable); else if (result == STR_MENU_OTHER) checkIncDecSelection = SWSRC_ON; else if (result == STR_MENU_INVERT) @@ -241,7 +241,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla } if (i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) { - for (int i = 0; i < MAX_SENSORS; i++) { + for (int i = 0; i < MAX_TELEMETRY_SENSORS; i++) { TelemetrySensor * sensor = & g_model.telemetrySensors[i]; if (sensor->isAvailable()) { POPUP_MENU_ADD_ITEM(STR_MENU_TELEMETRY); @@ -265,7 +265,7 @@ int checkIncDec(event_t event, int val, int i_min, int i_max, unsigned int i_fla if (i_min <= SWSRC_FIRST_SWITCH && i_max >= SWSRC_LAST_SWITCH) POPUP_MENU_ADD_ITEM(STR_MENU_SWITCHES); if (i_min <= SWSRC_FIRST_TRIM && i_max >= SWSRC_LAST_TRIM) POPUP_MENU_ADD_ITEM(STR_MENU_TRIMS); if (i_min <= SWSRC_FIRST_LOGICAL_SWITCH && i_max >= SWSRC_LAST_LOGICAL_SWITCH) { - for (int i = 0; i < NUM_LOGICAL_SWITCH; i++) { + for (int i = 0; i < MAX_LOGICAL_SWITCHES; i++) { if (isValueAvailable && isValueAvailable(SWSRC_FIRST_LOGICAL_SWITCH+i)) { POPUP_MENU_ADD_ITEM(STR_MENU_LOGICAL_SWITCHES); break; @@ -366,7 +366,7 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t return false; } - if (menuTab && !calibrationState) { + if (menuTab && !menuCalibrationState) { int cc = curr; switch (event) { case EVT_KEY_FIRST(KEY_PGDN): @@ -436,7 +436,7 @@ bool check(event_t event, uint8_t curr, const MenuHandlerFunc * menuTab, uint8_t menuHorizontalPosition = POS_HORZ_INIT(menuVerticalPosition); AUDIO_KEY_PRESS(); } - else if (!calibrationState) { + else if (!menuCalibrationState) { popMenu(); } } diff --git a/radio/src/gui/480x272/radio_calibration.cpp b/radio/src/gui/480x272/radio_calibration.cpp index f9294d4bd0..c81035444a 100644 --- a/radio/src/gui/480x272/radio_calibration.cpp +++ b/radio/src/gui/480x272/radio_calibration.cpp @@ -81,8 +81,8 @@ bool menuCommonCalib(event_t event) { drawMenuTemplate(NULL, ICON_RADIO_CALIBRATION, NULL, OPTION_MENU_NO_FOOTER); - for (uint8_t i=0; i= POT1 && i <= POT_LAST) { @@ -124,25 +124,25 @@ bool menuCommonCalib(event_t event) switch (event) { case EVT_ENTRY: - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; break; case EVT_KEY_FIRST(KEY_EXIT): - if (calibrationState == CALIB_START) { + if (menuCalibrationState == CALIB_START) { killEvents(KEY_EXIT); popMenu(); } else { - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; } break; case EVT_KEY_FIRST(KEY_ENTER): - calibrationState++; + menuCalibrationState++; break; } - switch (calibrationState) { + switch (menuCalibrationState) { case CALIB_START: // START CALIBRATION if (!READ_ONLY()) { @@ -155,10 +155,10 @@ bool menuCommonCalib(event_t event) // SET MIDPOINT lcdDrawText(50, 3, STR_MENUCALIBRATION, MENU_TITLE_COLOR); lcdDrawText(50, 3+FH, STR_SETMIDPOINT, MENU_TITLE_COLOR); - for (int i=0; i 50) { g_eeGeneral.calib[i].mid = reusableBuffer.calib.midVals[i]; int16_t v = reusableBuffer.calib.midVals[i] - reusableBuffer.calib.loVals[i]; @@ -207,11 +207,11 @@ bool menuCommonCalib(event_t event) case CALIB_STORE: g_eeGeneral.chkSum = evalChkSum(); storageDirty(EE_GENERAL); - calibrationState = CALIB_FINISHED; + menuCalibrationState = CALIB_FINISHED; break; default: - calibrationState = CALIB_START; + menuCalibrationState = CALIB_START; break; } @@ -230,8 +230,8 @@ bool menuCommonCalib(event_t event) bool menuRadioCalibration(event_t event) { if (event == EVT_ENTRY || event == EVT_ENTRY_UP) TRACE("Menu %s displayed ...", STR_MENUCALIBRATION); - if (calibrationState == CALIB_FINISHED) { - calibrationState = CALIB_START; + if (menuCalibrationState == CALIB_FINISHED) { + menuCalibrationState = CALIB_START; popMenu(); return false; } @@ -246,8 +246,8 @@ bool menuRadioCalibration(event_t event) bool menuFirstCalib(event_t event) { - if (event == EVT_KEY_BREAK(KEY_EXIT) || calibrationState == CALIB_FINISHED) { - calibrationState = CALIB_START; + if (event == EVT_KEY_BREAK(KEY_EXIT) || menuCalibrationState == CALIB_FINISHED) { + menuCalibrationState = CALIB_START; chainMenu(menuMainView); return false; } diff --git a/radio/src/gui/480x272/radio_hardware.cpp b/radio/src/gui/480x272/radio_hardware.cpp index 62822694d6..f5ce8f50cb 100644 --- a/radio/src/gui/480x272/radio_hardware.cpp +++ b/radio/src/gui/480x272/radio_hardware.cpp @@ -20,35 +20,35 @@ #include "opentx.h" -enum menuRadioHwItems { - ITEM_SETUP_HW_CALIBRATION, - ITEM_SETUP_HW_LABEL_STICKS, - ITEM_SETUP_HW_STICK1, - ITEM_SETUP_HW_STICK2, - ITEM_SETUP_HW_STICK3, - ITEM_SETUP_HW_STICK4, - ITEM_SETUP_HW_LABEL_POTS, - ITEM_SETUP_HW_POT1, - ITEM_SETUP_HW_POT2, - ITEM_SETUP_HW_POT3, - ITEM_SETUP_HW_LS, - ITEM_SETUP_HW_RS, - ITEM_SETUP_HW_LS2, - ITEM_SETUP_HW_RS2, - ITEM_SETUP_HW_LABEL_SWITCHES, - ITEM_SETUP_HW_SA, - ITEM_SETUP_HW_SB, - ITEM_SETUP_HW_SC, - ITEM_SETUP_HW_SD, - ITEM_SETUP_HW_SE, - ITEM_SETUP_HW_SF, - ITEM_SETUP_HW_SG, - ITEM_SETUP_HW_SH, - ITEM_SETUP_HW_BLUETOOTH, - // ITEM_SETUP_HW_UART3_MODE, - ITEM_SETUP_HW_JITTER_FILTER, - ITEM_SETUP_HW_BAT_CAL, - ITEM_SETUP_HW_MAX +enum MenuRadioHardwareItems { + ITEM_RADIO_HARDWARE_CALIBRATION, + ITEM_RADIO_HARDWARE_LABEL_STICKS, + ITEM_RADIO_HARDWARE_STICK1, + ITEM_RADIO_HARDWARE_STICK2, + ITEM_RADIO_HARDWARE_STICK3, + ITEM_RADIO_HARDWARE_STICK4, + ITEM_RADIO_HARDWARE_LABEL_POTS, + ITEM_RADIO_HARDWARE_POT1, + ITEM_RADIO_HARDWARE_POT2, + ITEM_RADIO_HARDWARE_POT3, + ITEM_RADIO_HARDWARE_LS, + ITEM_RADIO_HARDWARE_RS, + ITEM_RADIO_HARDWARE_LS2, + ITEM_RADIO_HARDWARE_RS2, + ITEM_RADIO_HARDWARE_LABEL_SWITCHES, + ITEM_RADIO_HARDWARE_SA, + ITEM_RADIO_HARDWARE_SB, + ITEM_RADIO_HARDWARE_SC, + ITEM_RADIO_HARDWARE_SD, + ITEM_RADIO_HARDWARE_SE, + ITEM_RADIO_HARDWARE_SF, + ITEM_RADIO_HARDWARE_SG, + ITEM_RADIO_HARDWARE_SH, + ITEM_RADIO_HARDWARE_BLUETOOTH, + // ITEM_RADIO_HARDWARE_UART3_MODE, + ITEM_RADIO_HARDWARE_JITTER_FILTER, + ITEM_RADIO_HARDWARE_BAT_CAL, + ITEM_RADIO_HARDWARE_MAX }; #define HW_SETTINGS_COLUMN 150 @@ -59,7 +59,7 @@ enum menuRadioHwItems { bool menuRadioHardware(event_t event) { - MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_SETUP_HW_MAX, { 0, LABEL(Sticks), 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, BLUETOOTH_ROWS 0 }); + MENU(STR_HARDWARE, RADIO_ICONS, menuTabGeneral, MENU_RADIO_HARDWARE, ITEM_RADIO_HARDWARE_MAX, { 0, LABEL(Sticks), 0, 0, 0, 0, LABEL(Pots), POTS_ROWS, LABEL(Switches), SWITCHES_ROWS, BLUETOOTH_ROWS 0 }); uint8_t sub = menuVerticalPosition; @@ -72,21 +72,21 @@ bool menuRadioHardware(event_t event) } LcdFlags attr = (sub == k ? ((s_editMode>0) ? BLINK|INVERS : INVERS) : 0); switch (k) { - case ITEM_SETUP_HW_CALIBRATION: + case ITEM_RADIO_HARDWARE_CALIBRATION: lcdDrawText(MENUS_MARGIN_LEFT, y, "Calibration", attr); if (attr && s_editMode>0) { pushMenu(menuRadioCalibration); } break; - case ITEM_SETUP_HW_LABEL_STICKS: + case ITEM_RADIO_HARDWARE_LABEL_STICKS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_STICKS); break; - case ITEM_SETUP_HW_STICK1: - case ITEM_SETUP_HW_STICK2: - case ITEM_SETUP_HW_STICK3: - case ITEM_SETUP_HW_STICK4: + case ITEM_RADIO_HARDWARE_STICK1: + case ITEM_RADIO_HARDWARE_STICK2: + case ITEM_RADIO_HARDWARE_STICK3: + case ITEM_RADIO_HARDWARE_STICK4: { - int idx = k - ITEM_SETUP_HW_STICK1; + int idx = k - ITEM_RADIO_HARDWARE_STICK1; lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, idx+1, 0); if (ZEXIST(g_eeGeneral.anaNames[idx]) || attr) editName(HW_SETTINGS_COLUMN, y, g_eeGeneral.anaNames[idx], LEN_ANA_NAME, event, attr); @@ -94,12 +94,12 @@ bool menuRadioHardware(event_t event) lcdDrawTextAtIndex(HW_SETTINGS_COLUMN, y, STR_MMMINV, 0, 0); break; } - case ITEM_SETUP_HW_LS: - case ITEM_SETUP_HW_RS: - case ITEM_SETUP_HW_LS2: - case ITEM_SETUP_HW_RS2: + case ITEM_RADIO_HARDWARE_LS: + case ITEM_RADIO_HARDWARE_RS: + case ITEM_RADIO_HARDWARE_LS2: + case ITEM_RADIO_HARDWARE_RS2: { - int idx = k - ITEM_SETUP_HW_LS; + int idx = k - ITEM_RADIO_HARDWARE_LS; uint8_t mask = (0x01 << idx); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+NUM_XPOTS+idx+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.anaNames[NUM_STICKS+NUM_XPOTS+2+idx]) || (attr && menuHorizontalPosition == 0)) @@ -112,14 +112,14 @@ bool menuRadioHardware(event_t event) g_eeGeneral.slidersConfig |= (potType << idx); break; } - case ITEM_SETUP_HW_LABEL_POTS: + case ITEM_RADIO_HARDWARE_LABEL_POTS: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_POTS); break; - case ITEM_SETUP_HW_POT1: - case ITEM_SETUP_HW_POT2: - case ITEM_SETUP_HW_POT3: + case ITEM_RADIO_HARDWARE_POT1: + case ITEM_RADIO_HARDWARE_POT2: + case ITEM_RADIO_HARDWARE_POT3: { - int idx = k - ITEM_SETUP_HW_POT1; + int idx = k - ITEM_RADIO_HARDWARE_POT1; uint8_t shift = (2*idx); uint8_t mask = (0x03 << shift); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, NUM_STICKS+idx+1, menuHorizontalPosition < 0 ? attr : 0); @@ -133,19 +133,19 @@ bool menuRadioHardware(event_t event) g_eeGeneral.potsConfig |= (potType << shift); break; } - case ITEM_SETUP_HW_LABEL_SWITCHES: + case ITEM_RADIO_HARDWARE_LABEL_SWITCHES: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_SWITCHES); break; - case ITEM_SETUP_HW_SA: - case ITEM_SETUP_HW_SB: - case ITEM_SETUP_HW_SC: - case ITEM_SETUP_HW_SD: - case ITEM_SETUP_HW_SE: - case ITEM_SETUP_HW_SF: - case ITEM_SETUP_HW_SG: - case ITEM_SETUP_HW_SH: + case ITEM_RADIO_HARDWARE_SA: + case ITEM_RADIO_HARDWARE_SB: + case ITEM_RADIO_HARDWARE_SC: + case ITEM_RADIO_HARDWARE_SD: + case ITEM_RADIO_HARDWARE_SE: + case ITEM_RADIO_HARDWARE_SF: + case ITEM_RADIO_HARDWARE_SG: + case ITEM_RADIO_HARDWARE_SH: { - int index = k-ITEM_SETUP_HW_SA; + int index = k-ITEM_RADIO_HARDWARE_SA; int config = SWITCH_CONFIG(index); lcdDrawTextAtIndex(INDENT_WIDTH, y, STR_VSRCRAW, MIXSRC_FIRST_SWITCH-MIXSRC_Rud+index+1, menuHorizontalPosition < 0 ? attr : 0); if (ZEXIST(g_eeGeneral.switchNames[index]) || (attr && menuHorizontalPosition == 0)) @@ -160,7 +160,7 @@ bool menuRadioHardware(event_t event) break; } - case ITEM_SETUP_HW_BLUETOOTH: + case ITEM_RADIO_HARDWARE_BLUETOOTH: lcdDrawText(MENUS_MARGIN_LEFT, y, "Bluetooth"); drawCheckBox(HW_SETTINGS_COLUMN, y, g_eeGeneral.bluetoothEnable, menuHorizontalPosition == 0 ? attr : 0); if (attr && menuHorizontalPosition == 0) { @@ -170,7 +170,7 @@ bool menuRadioHardware(event_t event) break; #if 0 - case ITEM_SETUP_HW_UART3_MODE: + case ITEM_RADIO_HARDWARE_UART3_MODE: g_eeGeneral.serial2Mode = selectMenuItem(HW_SETTINGS_COLUMN, y, STR_UART3MODE, STR_UART3MODES, g_eeGeneral.serial2Mode, 0, UART_MODE_MAX, attr, event); if (attr && checkIncDec_Ret) { serial2Init(g_eeGeneral.serial2Mode, MODEL_TELEMETRY_PROTOCOL()); @@ -178,7 +178,7 @@ bool menuRadioHardware(event_t event) break; #endif - case ITEM_SETUP_HW_JITTER_FILTER: + case ITEM_RADIO_HARDWARE_JITTER_FILTER: { lcdDrawText(MENUS_MARGIN_LEFT, y, STR_JITTER_FILTER); uint8_t b = 1-g_eeGeneral.jitterFilter; @@ -186,7 +186,7 @@ bool menuRadioHardware(event_t event) break; } - case ITEM_SETUP_HW_BAT_CAL: + case ITEM_RADIO_HARDWARE_BAT_CAL: lcdDrawText(MENUS_MARGIN_LEFT, y, STR_BATT_CALIB); lcdDrawNumber(HW_SETTINGS_COLUMN, y, getBatteryVoltage(), attr|LEFT|PREC2, 0, NULL, "V"); if (attr) CHECK_INCDEC_GENVAR(event, g_eeGeneral.txVoltageCalibration, -127, 127); diff --git a/radio/src/gui/480x272/radio_setup.cpp b/radio/src/gui/480x272/radio_setup.cpp index c68ed32f71..32105360dd 100644 --- a/radio/src/gui/480x272/radio_setup.cpp +++ b/radio/src/gui/480x272/radio_setup.cpp @@ -503,7 +503,7 @@ bool menuRadioSetup(event_t event) s[0] = '1'+reusableBuffer.generalSettings.stickMode; lcdDrawText(RADIO_SETUP_2ND_COLUMN, y, s, attr); for (uint8_t i=0; i<4; i++) { - putsMixerSource(RADIO_SETUP_2ND_COLUMN + 40 + 50*i, y, MIXSRC_Rud + pgm_read_byte(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i)); + drawSource(RADIO_SETUP_2ND_COLUMN + 40 + 50*i, y, MIXSRC_Rud + pgm_read_byte(modn12x3 + 4*reusableBuffer.generalSettings.stickMode + i)); } if (attr && s_editMode>0) { CHECK_INCDEC_GENVAR(event, reusableBuffer.generalSettings.stickMode, 0, 3); diff --git a/radio/src/gui/480x272/radio_trainer.cpp b/radio/src/gui/480x272/radio_trainer.cpp index f4e9545084..adc2856a7d 100644 --- a/radio/src/gui/480x272/radio_trainer.cpp +++ b/radio/src/gui/480x272/radio_trainer.cpp @@ -52,7 +52,7 @@ bool menuRadioTrainer(event_t event) uint8_t chan = channel_order(i); volatile TrainerMix *td = &g_eeGeneral.trainer.mix[chan-1]; - putsMixerSource(MENUS_MARGIN_LEFT, y, MIXSRC_Rud-1+chan, ((sub==i && CURSOR_ON_LINE()) ? INVERS : 0)); + drawSource(MENUS_MARGIN_LEFT, y, MIXSRC_Rud-1+chan, ((sub==i && CURSOR_ON_LINE()) ? INVERS : 0)); for (int j=0; j<3; j++) { diff --git a/radio/src/gui/480x272/radio_version.cpp b/radio/src/gui/480x272/radio_version.cpp index aeab63430a..dbec813eed 100644 --- a/radio/src/gui/480x272/radio_version.cpp +++ b/radio/src/gui/480x272/radio_version.cpp @@ -39,7 +39,7 @@ bool menuRadioVersion(event_t event) // TODO EEPROM erase + backup // lcd_putsCenter(MENU_HEADER_HEIGHT+6*FH, STR_EEBACKUP); // if (event == EVT_KEY_LONG(KEY_ENTER)) { - // backupEeprom(); + // eepromBackup(); // } DEBUG_TIMER_STOP(debugTimerVersion); return true; diff --git a/radio/src/gui/480x272/screens_setup.cpp b/radio/src/gui/480x272/screens_setup.cpp index d46d1f9c75..a0872218ad 100644 --- a/radio/src/gui/480x272/screens_setup.cpp +++ b/radio/src/gui/480x272/screens_setup.cpp @@ -120,7 +120,7 @@ bool editZoneOption(coord_t y, const ZoneOption * option, ZoneOptionValue * valu } } else if (option->type == ZoneOption::Source) { - putsMixerSource(SCREENS_SETUP_2ND_COLUMN, y, value->unsignedValue, attr); + drawSource(SCREENS_SETUP_2ND_COLUMN, y, value->unsignedValue, attr); if (attr) { CHECK_INCDEC_MODELSOURCE(event, value->unsignedValue, 1, MIXSRC_LAST_TELEM); } diff --git a/radio/src/gui/480x272/view_logical_switches.cpp b/radio/src/gui/480x272/view_logical_switches.cpp index b8fd9b0f10..d5de75cc83 100644 --- a/radio/src/gui/480x272/view_logical_switches.cpp +++ b/radio/src/gui/480x272/view_logical_switches.cpp @@ -34,7 +34,7 @@ #define CSW_4TH_COLUMN 280 #define CSW_5TH_COLUMN 340 #define CSW_6TH_COLUMN 390 -#define NUM_LOGICAL_SWITCH 64 +#define MAX_LOGICAL_SWITCHES 64 extern void putsEdgeDelayParam(coord_t, coord_t, LogicalSwitchData *, uint8_t, uint8_t); @@ -46,28 +46,28 @@ void displayLogicalSwitchedDetails(coord_t x, coord_t y, uint8_t idx) unsigned int cstate = lswFamily(cs->func); if (cstate == LS_FAMILY_BOOL || cstate == LS_FAMILY_STICKY) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); - putsSwitches(CSW_3RD_COLUMN, y, cs->v2, 0); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSwitch(CSW_3RD_COLUMN, y, cs->v2, 0); } else if (cstate == LS_FAMILY_EDGE) { - putsSwitches(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSwitch(CSW_2ND_COLUMN, y, cs->v1, 0); putsEdgeDelayParam(CSW_3RD_COLUMN, y, cs, 0, 0); } else if (cstate == LS_FAMILY_COMP) { - putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); - putsMixerSource(CSW_3RD_COLUMN, y, cs->v2, 0); + drawSource(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSource(CSW_3RD_COLUMN, y, cs->v2, 0); } else if (cstate == LS_FAMILY_TIMER) { lcdDrawNumber(CSW_2ND_COLUMN, y, lswTimerValue(cs->v1), LEFT | PREC1); lcdDrawNumber(CSW_3RD_COLUMN, y, lswTimerValue(cs->v2), LEFT | PREC1); } else { - putsMixerSource(CSW_2ND_COLUMN, y, cs->v1, 0); + drawSource(CSW_2ND_COLUMN, y, cs->v1, 0); putsChannelValue(CSW_3RD_COLUMN, y, cs->v1, cs->v1 <= MIXSRC_LAST_CH ? calc100toRESX(cs->v2) : cs->v2, LEFT); } // CSW AND switch - putsSwitches(CSW_4TH_COLUMN, y, cs->andsw, 0); + drawSwitch(CSW_4TH_COLUMN, y, cs->andsw, 0); // CSW duration if (cs->duration > 0) @@ -91,7 +91,7 @@ bool menuLogicalSwitchesMonitor(event_t event) { char lsString[] = "L64"; lcdColorTable[CUSTOM_COLOR_INDEX] = RGB(160, 160, 160); - for (uint8_t i = 0; i < NUM_LOGICAL_SWITCH; i++) { + for (uint8_t i = 0; i < MAX_LOGICAL_SWITCHES; i++) { LcdFlags attr = (menuHorizontalPosition == i ? INVERS : 0) | LEFT; LogicalSwitchData * cs = lswAddress(i); strAppendSigned(&lsString[1], i + 1, 2); @@ -111,7 +111,7 @@ bool menuLogicalSwitchesMonitor(event_t event) bool menuLogicalSwitches(event_t event) { - MENU(STR_MONITOR_SWITCHES, MONITOR_ICONS, menuTabMonitors, e_MonLogicalSwitches, 1, { NUM_LOGICAL_SWITCH - 1 }); + MENU(STR_MONITOR_SWITCHES, MONITOR_ICONS, menuTabMonitors, e_MonLogicalSwitches, 1, { MAX_LOGICAL_SWITCHES - 1 }); lastMonitorPage = e_MonLogicalSwitches; return menuLogicalSwitchesMonitor(event); } diff --git a/radio/src/gui/480x272/view_statistics.cpp b/radio/src/gui/480x272/view_statistics.cpp index b4bc07fd20..9b914d7ea8 100644 --- a/radio/src/gui/480x272/view_statistics.cpp +++ b/radio/src/gui/480x272/view_statistics.cpp @@ -39,23 +39,23 @@ bool menuStatsGraph(event_t event) MENU("Statistics", STATS_ICONS, menuTabStats, e_StatsGraph, 0, { 0 }); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP, "Session"); - putsTimer(MENU_STATS_COLUMN1, MENU_CONTENT_TOP, sessionTimer, TIMEHOUR); + drawTimer(MENU_STATS_COLUMN1, MENU_CONTENT_TOP, sessionTimer, TIMEHOUR); lcdDrawText(MENU_STATS_COLUMN2, MENU_CONTENT_TOP, "Battery"); - putsTimer(MENU_STATS_COLUMN3, MENU_CONTENT_TOP, g_eeGeneral.globalTimer+sessionTimer, TIMEHOUR); + drawTimer(MENU_STATS_COLUMN3, MENU_CONTENT_TOP, g_eeGeneral.globalTimer+sessionTimer, TIMEHOUR); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+FH, "Throttle"); - putsTimer(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+FH, s_timeCumThr, TIMEHOUR); + drawTimer(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+FH, s_timeCumThr, TIMEHOUR); lcdDrawText(MENU_STATS_COLUMN2, MENU_CONTENT_TOP+FH, "Throttle %", TIMEHOUR); - putsTimer(MENU_STATS_COLUMN3, MENU_CONTENT_TOP+FH, s_timeCum16ThrP/16, TIMEHOUR); + drawTimer(MENU_STATS_COLUMN3, MENU_CONTENT_TOP+FH, s_timeCum16ThrP/16, TIMEHOUR); lcdDrawText(MENUS_MARGIN_LEFT, MENU_CONTENT_TOP+2*FH, "Timers"); lcdDrawText(MENU_STATS_COLUMN1, MENU_CONTENT_TOP+2*FH, "[1]", HEADER_COLOR); - putsTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[0].val, TIMEHOUR); + drawTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[0].val, TIMEHOUR); lcdDrawText(MENU_STATS_COLUMN2, MENU_CONTENT_TOP+2*FH, "[2]", HEADER_COLOR); - putsTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[1].val, TIMEHOUR); + drawTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[1].val, TIMEHOUR); #if TIMERS > 2 lcdDrawText(MENU_STATS_COLUMN3, MENU_CONTENT_TOP+2*FH, "[3]", HEADER_COLOR); - putsTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[2].val, TIMEHOUR); + drawTimer(lcdNextPos+5, MENU_CONTENT_TOP+2*FH, timersStates[2].val, TIMEHOUR); #endif const coord_t x = 10; @@ -160,10 +160,10 @@ bool menuStatsAnalogs(event_t event) lcdDrawNumber(x+140, y, avgJitter[i].get()); lcdDrawNumber(x+180, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*250/256, PREC1); #else - if (i < NUM_STICKS+NUM_POTS) + if (i < NUM_STICKS+NUM_POTS+NUM_SLIDERS) lcdDrawNumber(x+100, y, (int16_t)calibratedStick[CONVERT_MODE(i)]*25/256); else if (i >= MOUSE1) - lcdDrawNumber(x+100, y, (int16_t)calibratedStick[NUM_STICKS+NUM_POTS+i-MOUSE1]*25/256); + lcdDrawNumber(x+100, y, (int16_t)calibratedStick[NUM_STICKS+NUM_POTS+NUM_SLIDERS+i-MOUSE1]*25/256); #endif } @@ -212,7 +212,7 @@ bool menuStatsTraces(event_t event) if (te) { // time putstime_t tme = te->time % SECS_PER_DAY; - putsTimer(STATS_TRACES_TIME_POS, y, tme, TIMEHOUR|LEFT); + drawTimer(STATS_TRACES_TIME_POS, y, tme, TIMEHOUR|LEFT); // event lcdDrawNumber(STATS_TRACES_EVENT_POS, y, te->event, LEADING0|LEFT, 3); // data diff --git a/radio/src/gui/480x272/widgets.cpp b/radio/src/gui/480x272/widgets.cpp index f9465f5233..1e6eb99e0d 100644 --- a/radio/src/gui/480x272/widgets.cpp +++ b/radio/src/gui/480x272/widgets.cpp @@ -180,7 +180,7 @@ void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons, u select_menu_value_t selectMenuItem(coord_t x, coord_t y, const pm_char * values, select_menu_value_t value, select_menu_value_t min, select_menu_value_t max, LcdFlags attr, event_t event) { - if (attr) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); + if (attr & (~RIGHT)) value = checkIncDec(event, value, min, max, (menuVerticalPositions[0] == 0) ? EE_MODEL : EE_GENERAL); if (values) lcdDrawTextAtIndex(x, y, values, value-min, attr); return value; } @@ -194,7 +194,7 @@ uint8_t editCheckBox(uint8_t value, coord_t x, coord_t y, LcdFlags attr, event_t swsrc_t switchMenuItem(coord_t x, coord_t y, swsrc_t value, LcdFlags attr, event_t event) { if (attr) CHECK_INCDEC_MODELSWITCH(event, value, SWSRC_FIRST_IN_MIXES, SWSRC_LAST_IN_MIXES, isSwitchAvailableInMixes); - putsSwitches(x, y, value, attr); + drawSwitch(x, y, value, attr); return value; } @@ -395,7 +395,7 @@ void drawSleepBitmap() } #define SHUTDOWN_CIRCLE_DIAMETER 150 -void drawShutdownBitmap(uint32_t index) +void drawShutdownAnimation(uint32_t index) { static uint32_t last_index = 0xffffffff; static const BitmapBuffer * shutdown = BitmapBuffer::load(getThemePath("shutdown.bmp")); diff --git a/radio/src/gui/480x272/widgets.h b/radio/src/gui/480x272/widgets.h index 531523ef12..364a7c0f6c 100644 --- a/radio/src/gui/480x272/widgets.h +++ b/radio/src/gui/480x272/widgets.h @@ -73,7 +73,7 @@ int16_t editGVarFieldValue(coord_t x, coord_t y, int16_t value, int16_t min, int void drawMenuTemplate(const char * title, uint8_t icon, const uint8_t * icons=NULL, uint32_t options=0); void drawSplash(); void drawSleepBitmap(); -void drawShutdownBitmap(uint32_t index); +void drawShutdownAnimation(uint32_t index); // Main view standard widgets void drawTopBar(); diff --git a/radio/src/gui/480x272/widgets/gauge.cpp b/radio/src/gui/480x272/widgets/gauge.cpp index 6cb7b357b3..5e87725404 100644 --- a/radio/src/gui/480x272/widgets/gauge.cpp +++ b/radio/src/gui/480x272/widgets/gauge.cpp @@ -59,7 +59,7 @@ void GaugeWidget::refresh() int percent = divRoundClosest(100 * (value_in_range - min), (max - min)); // Gauge label - putsMixerSource(zone.x, zone.y, index, SMLSIZE | TEXT_INVERTED_COLOR); + drawSource(zone.x, zone.y, index, SMLSIZE | TEXT_INVERTED_COLOR); // Gauge lcdSetColor(color); diff --git a/radio/src/gui/480x272/widgets/timer.cpp b/radio/src/gui/480x272/widgets/timer.cpp index 799be4c496..a1dd13a621 100644 --- a/radio/src/gui/480x272/widgets/timer.cpp +++ b/radio/src/gui/480x272/widgets/timer.cpp @@ -61,10 +61,10 @@ void TimerWidget::refresh() lcdDrawBitmapPattern(zone.x + 3, zone.y + 4, LBM_TIMER, MAINVIEW_GRAPHICS_COLOR); } if (abs(timerState.val) >= 3600) { - putsTimer(zone.x + 70, zone.y + 31, abs(timerState.val), TEXT_COLOR | MIDSIZE | LEFT | TIMEHOUR); + drawTimer(zone.x + 70, zone.y + 31, abs(timerState.val), TEXT_COLOR | MIDSIZE | LEFT | TIMEHOUR); } else { - putsTimer(zone.x + 76, zone.y + 31, abs(timerState.val), TEXT_COLOR | DBLSIZE | LEFT); + drawTimer(zone.x + 76, zone.y + 31, abs(timerState.val), TEXT_COLOR | DBLSIZE | LEFT); } if (ZLEN(timerData.name) > 0) { lcdDrawSizedText(zone.x + 78, zone.y + 20, timerData.name, LEN_TIMER_NAME, ZCHAR | SMLSIZE | TEXT_COLOR); @@ -78,18 +78,18 @@ void TimerWidget::refresh() drawStringWithIndex(zone.x + 2, zone.y, "TMR", index + 1, SMLSIZE | TEXT_INVERTED_COLOR); if (zone.w > 100 && zone.h > 40) { if (abs(timerState.val) >= 3600) { - putsTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | TIMEHOUR); + drawTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | TIMEHOUR); } else { - putsTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | MIDSIZE); + drawTimer(zone.x + 3, zone.y + 16, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | MIDSIZE); } } else { if (abs(timerState.val) >= 3600) { - putsTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | SMLSIZE | TIMEHOUR); + drawTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT | SMLSIZE | TIMEHOUR); } else { - putsTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT); + drawTimer(zone.x + 3, zone.y + 14, abs(timerState.val), TEXT_INVERTED_COLOR | LEFT); } } } diff --git a/radio/src/gui/480x272/widgets/value.cpp b/radio/src/gui/480x272/widgets/value.cpp index bed4539805..09dfe188b8 100644 --- a/radio/src/gui/480x272/widgets/value.cpp +++ b/radio/src/gui/480x272/widgets/value.cpp @@ -81,9 +81,9 @@ void ValueWidget::refresh() if (timerState.val < 0) { lcdSetColor(ALARM_COLOR_INDEX); } - putsMixerSource(x+NUMBERS_PADDING, y+2, field, CUSTOM_COLOR); - putsMixerSource(x+NUMBERS_PADDING + 1, y + 3, field, BLACK); - putsTimer(xValue, yValue, abs(timerState.val), attrValue|DBLSIZE|CUSTOM_COLOR); + drawSource(x+NUMBERS_PADDING, y+2, field, CUSTOM_COLOR); + drawSource(x+NUMBERS_PADDING + 1, y + 3, field, BLACK); + drawTimer(xValue, yValue, abs(timerState.val), attrValue|DBLSIZE|CUSTOM_COLOR); return; } @@ -94,8 +94,8 @@ void ValueWidget::refresh() } } - putsMixerSource(xLabel + 1, yLabel + 1, field, attrLabel|BLACK); - putsMixerSource(xLabel, yLabel, field, attrLabel|CUSTOM_COLOR); + drawSource(xLabel + 1, yLabel + 1, field, attrLabel|BLACK); + drawSource(xLabel, yLabel, field, attrLabel|CUSTOM_COLOR); putsChannel(xValue + 1, yValue + 1, field, attrValue|BLACK); putsChannel(xValue, yValue, field, attrValue|CUSTOM_COLOR); diff --git a/radio/src/gui/CMakeLists.txt b/radio/src/gui/CMakeLists.txt new file mode 100644 index 0000000000..47bbf3514a --- /dev/null +++ b/radio/src/gui/CMakeLists.txt @@ -0,0 +1,31 @@ +set(GUI_SRC + ${GUI_SRC} + lcd.cpp + ../common/widgets.cpp + splash.cpp + fonts.cpp + navigation.cpp + popups.cpp + widgets.cpp + menus.cpp + menu_model.cpp + model_select.cpp + model_setup.cpp + model_outputs.cpp + model_logical_switches.cpp + model_special_functions.cpp + model_telemetry.cpp + menu_radio.cpp + radio_setup.cpp + radio_trainer.cpp + radio_version.cpp + radio_calibration.cpp + view_main.cpp + view_statistics.cpp + ) + +include_directories(gui gui/${GUI_DIR}) + +if(GUI_DIR STREQUAL 128x64 OR GUI_DIR STREQUAL 212x64) + include(gui/common/stdlcd/CMakeLists.txt) +endif() diff --git a/radio/src/gui/common/stdlcd/CMakeLists.txt b/radio/src/gui/common/stdlcd/CMakeLists.txt new file mode 100644 index 0000000000..2073da6e37 --- /dev/null +++ b/radio/src/gui/common/stdlcd/CMakeLists.txt @@ -0,0 +1,23 @@ +set(GUI_SRC + ${GUI_SRC} + ../common/stdlcd/widgets.cpp + ) + +if(HELI) + set(GUI_SRC ${GUI_SRC} ../common/stdlcd/model_heli.cpp) +endif() + +if(ARCH STREQUAL ARM) + add_definitions(-DGRAPHICS) + set(CURVE_EDIT_SRC ../common/stdlcd/model_curve_edit.cpp) +else() + set(CURVE_EDIT_SRC model_curve_simple_edit.cpp) +endif() + +if(CURVES) + set(GUI_SRC + ${GUI_SRC} + ../common/stdlcd/model_curves.cpp + ${CURVE_EDIT_SRC} + ) +endif() diff --git a/radio/src/gui/212x64/model_curves.cpp b/radio/src/gui/common/stdlcd/model_curve_edit.cpp similarity index 57% rename from radio/src/gui/212x64/model_curves.cpp rename to radio/src/gui/common/stdlcd/model_curve_edit.cpp index 7a99f1e63d..90c78384d9 100644 --- a/radio/src/gui/212x64/model_curves.cpp +++ b/radio/src/gui/common/stdlcd/model_curve_edit.cpp @@ -20,78 +20,6 @@ #include "opentx.h" -uint8_t s_curveChan; - -int16_t curveFn(int16_t x) -{ - return applyCustomCurve(x, s_curveChan); -} - -struct point_t { - coord_t x; - coord_t y; -}; - -point_t getPoint(uint8_t i) -{ - point_t result = {0, 0}; - CurveInfo & crv = g_model.curves[s_curveChan]; - int8_t * points = curveAddress(s_curveChan); - bool custom = (crv.type == CURVE_TYPE_CUSTOM); - uint8_t count = 5+crv.points; - if (i < count) { - result.x = X0-1-WCHART+i*WCHART*2/(count-1); - result.y = (LCD_H-1) - (100 + points[i]) * (LCD_H-1) / 200; - if (custom && i>0 && i g_model.points + sizeof(g_model.points)) { - AUDIO_WARNING2(); - return false; - } - - int8_t *nextCrv = curveAddress(index+1); - memmove(nextCrv+shift, nextCrv, 5*(MAX_CURVES-index-1)+curveEnd[MAX_CURVES-1]-curveEnd[index]); - if (shift < 0) memclear(&g_model.points[NUM_POINTS-1] + shift, -shift); - while (index= 212 + lcdDrawText(11*FW+FW/2, 0, TR_PT "\002X\006Y"); lcdDrawFilledRect(0, 0, LCD_W, FH, SOLID, FILL_WHITE|GREY_DEFAULT); +#endif SIMPLE_SUBMENU(STR_MENUCURVES, 4 + 5+crv.points + (crv.type==CURVE_TYPE_CUSTOM ? 5+crv.points-2 : 0)); - lcdDrawTextAlignedLeft(FH+1, STR_NAME); - editName(INDENT_WIDTH, 2*FH+1, crv.name, sizeof(crv.name), event, menuVerticalPosition==0); - - uint8_t attr = (menuVerticalPosition==1 ? (s_editMode>0 ? INVERS|BLINK : INVERS) : 0); - lcdDrawTextAlignedLeft(3*FH+1, STR_TYPE); - lcdDrawTextAtIndex(INDENT_WIDTH, 4*FH+1, STR_CURVE_TYPES, crv.type, attr); + // Curve name + lcdDrawTextAlignedLeft(FH + 1, STR_NAME); + editName(INDENT_WIDTH, 2 * FH + 1, crv.name, sizeof(crv.name), event, menuVerticalPosition == 0); + + // Curve type + lcdDrawTextAlignedLeft(3 * FH + 1, NO_INDENT(STR_TYPE)); + LcdFlags attr = (menuVerticalPosition == 1 ? (s_editMode > 0 ? INVERS | BLINK : INVERS) : 0); + lcdDrawTextAtIndex(INDENT_WIDTH, 4 * FH + 1, STR_CURVE_TYPES, crv.type, attr); if (attr) { uint8_t newType = checkIncDecModelZero(event, crv.type, CURVE_TYPE_LAST); if (newType != crv.type) { - for (int i=1; i<4+crv.points; i++) { - points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5+crv.points, i)), s_curveChan)); + for (int i = 1; i < 4 + crv.points; i++) { + points[i] = calcRESXto100(applyCustomCurve(calc100toRESX(getCurveX(5 + crv.points, i)), s_curveChan)); } - moveCurve(s_curveChan, checkIncDec_Ret > 0 ? 3+crv.points : -3-crv.points); + moveCurve(s_curveChan, checkIncDec_Ret > 0 ? 3 + crv.points : -3 - crv.points); if (newType == CURVE_TYPE_CUSTOM) { - resetCustomCurveX(points, 5+crv.points); + resetCustomCurveX(points, 5 + crv.points); } crv.type = newType; } @@ -176,7 +108,7 @@ void menuModelCurveOne(uint8_t event) if (attr) { int8_t count = checkIncDecModel(event, crv.points, -3, 12); // 2pts - 17pts if (checkIncDec_Ret) { - int8_t newPoints[MAX_POINTS]; + int8_t newPoints[MAX_POINTS_PER_CURVE]; newPoints[0] = points[0]; newPoints[4+count] = points[4+crv.points]; for (int i=1; i<4+count; i++) @@ -195,11 +127,12 @@ void menuModelCurveOne(uint8_t event) drawCheckBox(7 * FW, 7 * FH + 1, crv.smooth, menuVerticalPosition == 3 ? INVERS : 0); if (menuVerticalPosition==3) crv.smooth = checkIncDecModel(event, crv.smooth, 0, 1); - switch(event) { + switch (event) { case EVT_ENTRY: pointsOfs = 0; SET_SCROLLBAR_X(0); break; + case EVT_KEY_LONG(KEY_ENTER): if (menuVerticalPosition > 1) { killEvents(event); @@ -209,12 +142,17 @@ void menuModelCurveOne(uint8_t event) POPUP_MENU_START(onCurveOneMenu); } break; + +#if defined(PCBTARANIS) && LCD >= 212 + // TODO case EVT_KEY_LONG(KEY_MENU): pushMenu(menuChannelsView); killEvents(event); + break; +#endif } - DrawCurve(FW); + drawCurve(FW); uint8_t posY = FH+1; attr = (s_editMode > 0 ? INVERS|BLINK : INVERS); @@ -233,7 +171,9 @@ void menuModelCurveOne(uint8_t event) if (i>=pointsOfs && i0 && i<5+crv.points-1) x = points[5+crv.points+i-1]; + if (crv.type==CURVE_TYPE_CUSTOM && i>0 && i<5+crv.points-1) { + x = points[5+crv.points+i-1]; + } lcdDrawNumber(6+10*FW+FW/2, posY, i+1, LEFT); lcdDrawNumber(3+14*FW, posY, x, LEFT|(selectionMode==1?attr:0)); lcdDrawNumber(3+18*FW, posY, points[i], LEFT|(selectionMode==2?attr:0)); @@ -257,66 +197,3 @@ void menuModelCurveOne(uint8_t event) } } } - -void editCurveRef(coord_t x, coord_t y, CurveRef & curve, uint8_t event, uint8_t attr) -{ - lcdDrawTextAtIndex(x, y, "\004DiffExpoFuncCstm", curve.type, menuHorizontalPosition==0 ? attr : 0); - if (attr && menuHorizontalPosition==0) { - CHECK_INCDEC_MODELVAR_ZERO(event, curve.type, CURVE_REF_CUSTOM); - if (checkIncDec_Ret) curve.value = 0; - } - switch (curve.type) { - case CURVE_REF_DIFF: - case CURVE_REF_EXPO: - curve.value = GVAR_MENU_ITEM(x+5*FW+2, y, curve.value, -100, 100, menuHorizontalPosition==1 ? LEFT|attr : LEFT, 0, event); - break; - case CURVE_REF_FUNC: - lcdDrawTextAtIndex(x+5*FW+2, y, STR_VCURVEFUNC, curve.value, menuHorizontalPosition==1 ? attr : 0); - if (attr && menuHorizontalPosition==1) CHECK_INCDEC_MODELVAR_ZERO(event, curve.value, CURVE_BASE-1); - break; - case CURVE_REF_CUSTOM: - drawCurveName(x+5*FW+2, y, curve.value, menuHorizontalPosition==1 ? attr : 0); - if (attr && menuHorizontalPosition==1) { - if (event==EVT_KEY_LONG(KEY_ENTER) && curve.value!=0) { - s_curveChan = (curve.value<0 ? -curve.value-1 : curve.value-1); - pushMenu(menuModelCurveOne); - } - else { - CHECK_INCDEC_MODELVAR(event, curve.value, -MAX_CURVES, MAX_CURVES); - } - } - break; - } -} - -void menuModelCurvesAll(uint8_t event) -{ - SIMPLE_MENU(STR_MENUCURVES, menuTabModel, MENU_MODEL_CURVES, MAX_CURVES); - - int sub = menuVerticalPosition; - - switch (event) { - case EVT_KEY_BREAK(KEY_ENTER): - if (!READ_ONLY()) { - s_curveChan = sub; - pushMenu(menuModelCurveOne); - } - break; - } - - for (int i=0; i= 0 && sub < MAX_CURVES) + #define GVAR_SELECTED() (sub >= MAX_CURVES) +#else + #define CURVE_SELECTED() (sub >= 0) +#endif + +void drawCurve(coord_t offset) +{ + drawFunction(applyCurrentCurve, offset); + + uint8_t i = 0; + do { + point_t point = getPoint(i); + i++; + if (point.x == 0) break; + lcdDrawFilledRect(point.x-offset, point.y-1, 3, 3, SOLID, FORCE); // do markup square + } while (1); +} + +void menuModelCurvesAll(uint8_t event) +{ +#if defined(GVARS_IN_CURVES_SCREEN) + SIMPLE_MENU(STR_MENUCURVES, menuTabModel, MENU_MODEL_CURVES, HEADER_LINE+MAX_CURVES+MAX_GVARS); +#else + SIMPLE_MENU(STR_MENUCURVES, menuTabModel, MENU_MODEL_CURVES, HEADER_LINE+MAX_CURVES); +#endif + + int8_t sub = menuVerticalPosition - HEADER_LINE; + + switch (event) { +#if defined(ROTARY_ENCODER_NAVIGATION) + case EVT_ROTARY_BREAK: +#endif +#if !defined(PCBTARANIS) + case EVT_KEY_FIRST(KEY_RIGHT): +#endif + case EVT_KEY_FIRST(KEY_ENTER): + if (CURVE_SELECTED() && !READ_ONLY()) { + s_curveChan = sub; + pushMenu(menuModelCurveOne); + } + break; + } + + for (uint8_t i=0; i= MAX_CURVES) { + drawStringWithIndex(0, y, STR_GV, k-MAX_CURVES+1); + if (GVAR_SELECTED()) { + if (attr && s_editMode>0) attr |= BLINK; + lcdDrawNumber(10*FW, y, GVAR_VALUE(k-MAX_CURVES, -1), attr); + if (attr) g_model.gvars[k-MAX_CURVES] = checkIncDec(event, g_model.gvars[k-MAX_CURVES], -1000, 1000, EE_MODEL); + } + } + else +#endif + { + drawStringWithIndex(0, y, STR_CV, k+1, attr); +#if defined(CPUARM) + CurveData & crv = g_model.curves[k]; + editName(4*FW, y, crv.name, sizeof(crv.name), 0, 0); +#if LCD_W >= 212 + lcdDrawNumber(11*FW, y, 5+crv.points, LEFT); + lcdDrawText(lcdLastPos, y, STR_PTS, 0); +#endif +#endif + } + } + + if (CURVE_SELECTED()) { + s_curveChan = sub; +#if !defined(CPUARM) || LCD_W >= 212 + drawCurve(23); +#else + drawCurve(10); +#endif + } +} + +#if defined(CPUARM) +void editCurveRef(coord_t x, coord_t y, CurveRef & curve, uint8_t event, LcdFlags flags) +{ + coord_t x1 = x; + if (flags & RIGHT) { + x1 -= 8*FW; + flags -= RIGHT; + } + else { + x += 8*FW; + } + + lcdDrawTextAtIndex(x1, y, "\004DiffExpoFuncCstm", curve.type, menuHorizontalPosition==0 ? flags : 0); + if (flags && menuHorizontalPosition==0) { + CHECK_INCDEC_MODELVAR_ZERO(event, curve.type, CURVE_REF_CUSTOM); + if (checkIncDec_Ret) curve.value = 0; + } + switch (curve.type) { + case CURVE_REF_DIFF: + case CURVE_REF_EXPO: + curve.value = GVAR_MENU_ITEM(x, y, curve.value, -100, 100, RIGHT | (menuHorizontalPosition==1 ? flags : 0), 0, event); + break; + case CURVE_REF_FUNC: + lcdDrawTextAtIndex(x, y, STR_VCURVEFUNC, curve.value, RIGHT | (menuHorizontalPosition==1 ? flags : 0)); + if (flags && menuHorizontalPosition==1) CHECK_INCDEC_MODELVAR_ZERO(event, curve.value, CURVE_BASE-1); + break; + case CURVE_REF_CUSTOM: + drawCurveName(x, y, curve.value, RIGHT | (menuHorizontalPosition==1 ? flags : 0)); + if (flags && menuHorizontalPosition==1) { + if (event==EVT_KEY_LONG(KEY_ENTER) && curve.value!=0) { + s_curveChan = (curve.value<0 ? -curve.value-1 : curve.value-1); + pushMenu(menuModelCurveOne); + } + else { + CHECK_INCDEC_MODELVAR(event, curve.value, -MAX_CURVES, MAX_CURVES); + } + } + break; + } +} +#endif diff --git a/radio/src/gui/212x64/model_heli.cpp b/radio/src/gui/common/stdlcd/model_heli.cpp similarity index 62% rename from radio/src/gui/212x64/model_heli.cpp rename to radio/src/gui/common/stdlcd/model_heli.cpp index fd689a093a..8e65e89c0b 100644 --- a/radio/src/gui/212x64/model_heli.cpp +++ b/radio/src/gui/common/stdlcd/model_heli.cpp @@ -20,33 +20,49 @@ #include "opentx.h" -enum menuModelHeliItems { +enum MenuModelHeliItems { ITEM_HELI_SWASHTYPE, ITEM_HELI_SWASHRING, +#if defined(VIRTUAL_INPUTS) ITEM_HELI_ELE, ITEM_HELI_ELE_WEIGHT, ITEM_HELI_AIL, ITEM_HELI_AIL_WEIGHT, ITEM_HELI_COL, ITEM_HELI_COL_WEIGHT, +#else + ITEM_HELI_COLLECTIVE, + ITEM_HELI_ELEDIRECTION, + ITEM_HELI_AILDIRECTION, + ITEM_HELI_COLDIRECTION, +#endif ITEM_HELI_MAX }; +#if LCD_W >= 212 #define MODEL_HELI_2ND_COLUMN (LCD_W-17*FW-MENUS_SCROLLBAR_WIDTH) +#else +#define MODEL_HELI_2ND_COLUMN (14*FW) +#endif void menuModelHeli(uint8_t event) { - SIMPLE_MENU(STR_MENUHELISETUP, menuTabModel, MENU_MODEL_HELI, ITEM_HELI_MAX); + SIMPLE_MENU(STR_MENUHELISETUP, menuTabModel, MENU_MODEL_HELI, HEADER_LINE+ITEM_HELI_MAX); - int sub = menuVerticalPosition; + uint8_t sub = menuVerticalPosition - HEADER_LINE; - for (unsigned int i=0; i0) ? BLINK|INVERS : INVERS); + uint8_t k = i + menuVerticalOffset; +#else + for (uint8_t k=0; k 0 ? BLINK|INVERS : INVERS); LcdFlags attr = (sub == k ? blink : 0); - switch(k) { + switch (k) { case ITEM_HELI_SWASHTYPE: g_model.swashR.type = selectMenuItem(MODEL_HELI_2ND_COLUMN, y, STR_SWASHTYPE, STR_VSWASHTYPE, g_model.swashR.type, 0, SWASH_TYPE_MAX, attr, event); break; @@ -57,9 +73,10 @@ void menuModelHeli(uint8_t event) if (attr) CHECK_INCDEC_MODELVAR_ZERO(event, g_model.swashR.value, 100); break; +#if defined(VIRTUAL_INPUTS) case ITEM_HELI_ELE: lcdDrawTextAlignedLeft(y, STR_ELEVATOR); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.elevatorSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.elevatorSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.elevatorSource, 0, MIXSRC_LAST_CH); break; @@ -71,7 +88,7 @@ void menuModelHeli(uint8_t event) case ITEM_HELI_AIL: lcdDrawTextAlignedLeft(y, STR_AILERON); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.aileronSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.aileronSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.aileronSource, 0, MIXSRC_LAST_CH); break; @@ -83,7 +100,7 @@ void menuModelHeli(uint8_t event) case ITEM_HELI_COL: lcdDrawTextAlignedLeft(y, STR_COLLECTIVE); - putsMixerSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveSource, attr); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveSource, attr); if (attr) CHECK_INCDEC_MODELSOURCE(event, g_model.swashR.collectiveSource, 0, MIXSRC_LAST_CH); break; @@ -92,6 +109,24 @@ void menuModelHeli(uint8_t event) lcdDrawNumber(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveWeight, LEFT|attr); if (attr) CHECK_INCDEC_MODELVAR(event, g_model.swashR.collectiveWeight, -100, 100); break; +#else + case ITEM_HELI_COLLECTIVE: + g_model.swashR.collectiveSource = selectMenuItem(MODEL_HELI_2ND_COLUMN, y, STR_COLLECTIVE, NULL, g_model.swashR.collectiveSource, 0, MIXSRC_LAST_CH, attr, event); + drawSource(MODEL_HELI_2ND_COLUMN, y, g_model.swashR.collectiveSource, attr); + break; + + case ITEM_HELI_ELEDIRECTION: + g_model.swashR.invertELE = selectMenuItem(MODEL_HELI_2ND_COLUMN, y, STR_ELEDIRECTION, STR_MMMINV, g_model.swashR.invertELE, 0, 1, attr, event); + break; + + case ITEM_HELI_AILDIRECTION: + g_model.swashR.invertAIL = selectMenuItem(MODEL_HELI_2ND_COLUMN, y, STR_AILDIRECTION, STR_MMMINV, g_model.swashR.invertAIL, 0, 1, attr, event); + break; + + case ITEM_HELI_COLDIRECTION: + g_model.swashR.invertCOL = selectMenuItem(MODEL_HELI_2ND_COLUMN, y, STR_COLDIRECTION, STR_MMMINV, g_model.swashR.invertCOL, 0, 1, attr, event); + break; +#endif } } } diff --git a/radio/src/gui/common/stdlcd/widgets.cpp b/radio/src/gui/common/stdlcd/widgets.cpp new file mode 100644 index 0000000000..72dd5a7b71 --- /dev/null +++ b/radio/src/gui/common/stdlcd/widgets.cpp @@ -0,0 +1,57 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void drawStringWithIndex(coord_t x, coord_t y, const pm_char * str, uint8_t idx, LcdFlags att) +{ + lcdDrawText(x, y, str, att & ~LEADING0); + lcdDrawNumber(lcdNextPos, y, idx, att|LEFT, 2); +} + +#if defined(CPUARM) +FlightModesType editFlightModes(coord_t x, coord_t y, uint8_t event, FlightModesType value, uint8_t attr) +{ + int posHorz = menuHorizontalPosition; + + for (uint8_t p=0; p MAX_SENSORS ) { + if (sensor <= 0 || sensor > MAX_TELEMETRY_SENSORS ) { return true; } else { @@ -149,24 +147,22 @@ int getChannelsUsed() bool isSourceAvailable(int source) { -#if defined(VIRTUALINPUTS) if (source>=MIXSRC_FIRST_INPUT && source<=MIXSRC_LAST_INPUT) { return isInputAvailable(source - MIXSRC_FIRST_INPUT); } -#endif #if defined(LUA_MODEL_SCRIPTS) if (source>=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) { div_t qr = div(source-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); return (qr.rem=MIXSRC_FIRST_LUA && source<=MIXSRC_LAST_LUA) return false; #endif if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { - return IS_POT_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); + return IS_POT_OR_SLIDER_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); } if (source>=MIXSRC_FIRST_SWITCH && source<=MIXSRC_LAST_SWITCH) { @@ -231,7 +227,7 @@ bool isSourceAvailableInCustomSwitches(int source) bool isInputSourceAvailable(int source) { if (source>=MIXSRC_FIRST_POT && source<=MIXSRC_LAST_POT) { - return IS_POT_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); + return IS_POT_OR_SLIDER_AVAILABLE(POT1+source-MIXSRC_FIRST_POT); } if (source>=MIXSRC_Rud && source<=MIXSRC_MAX) @@ -300,11 +296,12 @@ bool isSwitchAvailable(int swtch, SwitchContext context) if (!SWITCH_EXISTS(swinfo.quot)) { return false; } - if (!IS_3POS(swinfo.quot)) { + if (!IS_CONFIG_3POS(swinfo.quot)) { if (negative) { return false; } - if (IS_3POS_MIDDLE(swinfo.rem)) { + if (swinfo.rem == 1) { + // mid position not available for 2POS switches return false; } } @@ -404,7 +401,7 @@ bool isSwitchAvailableInTimers(int swtch) bool isThrottleSourceAvailable(int source) { - if (source >= THROTTLE_SOURCE_FIRST_POT && source < THROTTLE_SOURCE_FIRST_POT+NUM_POTS && !IS_POT_AVAILABLE(POT1+source-THROTTLE_SOURCE_FIRST_POT)) + if (source >= THROTTLE_SOURCE_FIRST_POT && source < THROTTLE_SOURCE_FIRST_POT+NUM_POTS+NUM_SLIDERS && !IS_POT_OR_SLIDER_AVAILABLE(POT1+source-THROTTLE_SOURCE_FIRST_POT)) return false; else return true; diff --git a/radio/src/keys.cpp b/radio/src/keys.cpp index 57ec999851..b2af5ab86a 100644 --- a/radio/src/keys.cpp +++ b/radio/src/keys.cpp @@ -117,9 +117,9 @@ void Key::input(bool val) } } -EnumKeys Key::key() const -{ - return static_cast(this - keys); +uint8_t Key::key() const +{ + return (this - keys); } void pauseEvents(uint8_t event) diff --git a/radio/src/keys.h b/radio/src/keys.h index 0da66e1f75..253503514a 100644 --- a/radio/src/keys.h +++ b/radio/src/keys.h @@ -21,161 +21,6 @@ #ifndef _KEYS_H_ #define _KEYS_H_ -enum EnumKeys { -#if defined(PCBHORUS) - KEY_PGUP, - KEY_PGDN, - KEY_ENTER, - KEY_MODEL, - KEY_UP=KEY_MODEL, - KEY_EXIT, - KEY_DOWN=KEY_EXIT, - KEY_TELEM, - KEY_RIGHT=KEY_TELEM, - KEY_RADIO, - KEY_LEFT=KEY_RADIO, -#elif defined(PCBFLAMENCO) - KEY_MENU, - KEY_EXIT, - KEY_ENTER, - KEY_PAGE, - KEY_PLUS, // TODO remove - KEY_MINUS, // TODO remove -#elif defined(PCBTARANIS) - KEY_MENU, - KEY_EXIT, - KEY_ENTER, - KEY_PAGE, - KEY_PLUS, - KEY_MINUS, -#else - KEY_MENU, - KEY_ENTER=KEY_MENU, - KEY_EXIT, - KEY_DOWN, - KEY_UP, - KEY_RIGHT, - KEY_LEFT, -#endif - - TRM_BASE, - TRM_LH_DWN = TRM_BASE, - TRM_LH_UP, - TRM_LV_DWN, - TRM_LV_UP, - TRM_RV_DWN, - TRM_RV_UP, - TRM_RH_DWN, - TRM_RH_UP, - -#if defined(PCBHORUS) - TRM_LS_DWN, - TRM_LS_UP, - TRM_RS_DWN, - TRM_RS_UP, - TRM_LAST = TRM_RS_UP, -#else - TRM_LAST = TRM_RH_UP, -#endif - -#if ROTARY_ENCODERS > 0 || defined(ROTARY_ENCODER_NAVIGATION) - BTN_REa, -#endif -#if ROTARY_ENCODERS > 0 - BTN_REb, -#endif - - NUM_KEYS, - SW_BASE=NUM_KEYS, - -#if defined(PCBFLAMENCO) - SW_SA0=SW_BASE, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SC3, - SW_SC4, - SW_SC5, - SW_SE0, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, -#elif defined(PCBTARANIS) || defined(PCBHORUS) - SW_SA0=SW_BASE, - SW_SA1, - SW_SA2, - SW_SB0, - SW_SB1, - SW_SB2, - SW_SC0, - SW_SC1, - SW_SC2, - SW_SD0, - SW_SD1, - SW_SD2, - SW_SE0, - SW_SE1, - SW_SE2, - SW_SF0, - SW_SF1, - SW_SF2, - SW_SG0, - SW_SG1, - SW_SG2, - SW_SH0, - SW_SH1, - SW_SH2, -#if defined(PCBX9E) - SW_SI0, - SW_SI1, - SW_SI2, - SW_SJ0, - SW_SJ1, - SW_SJ2, - SW_SK0, - SW_SK1, - SW_SK2, - SW_SL0, - SW_SL1, - SW_SL2, - SW_SM0, - SW_SM1, - SW_SM2, - SW_SN0, - SW_SN1, - SW_SN2, - SW_SO0, - SW_SO1, - SW_SO2, - SW_SP0, - SW_SP1, - SW_SP2, - SW_SQ0, - SW_SQ1, - SW_SQ2, - SW_SR0, - SW_SR1, - SW_SR2, -#endif -#else - SW_ID0=SW_BASE, - SW_ID1, - SW_ID2, - SW_THR, - SW_RUD, - SW_ELE, - SW_AIL, - SW_GEA, - SW_TRN, -#endif - -}; - #define EVT_KEY_MASK(e) ((e) & 0x1f) #if defined(PCBHORUS) @@ -250,7 +95,7 @@ class Key bool state() { return m_vals > 0; } void pauseEvents() { m_state = KSTATE_PAUSE; m_cnt = 0; } void killEvents() { m_state = KSTATE_KILLED; } - EnumKeys key() const; + uint8_t key() const; }; extern Key keys[NUM_KEYS]; @@ -265,8 +110,8 @@ extern event_t s_evt; #define putEvent(evt) s_evt = evt -void pauseEvents(uint8_t enuk); -void killEvents(uint8_t enuk); +void pauseEvents(uint8_t index); +void killEvents(uint8_t index); #if defined(CPUARM) bool clearKeyEvents(); diff --git a/radio/src/loadboot.cpp b/radio/src/loadboot.cpp index 92cf8e62c4..ae687e9805 100644 --- a/radio/src/loadboot.cpp +++ b/radio/src/loadboot.cpp @@ -29,7 +29,7 @@ #if defined(PCBTARANIS) void bwdt_reset() { - IWDG->KR = 0xAAAA; // reload + IWDG->KR = 0xAAAA; // reload } #endif @@ -82,7 +82,7 @@ void _bootStart() GPIOD->MODER = (GPIOD->MODER & 0xFFFFFFFC) | 1; // General purpose output mode } - // TRIMS_GPIO_PIN_LHR is on PG0 on 9XE and on PE3 on Taranis + // TRIMS_GPIO_PIN_LHR is on PG0 on X9E and on PE3 on Taranis // TRIMS_GPIO_PIN_RHL is on PC1 on all versions // turn on pull-ups on trim keys GPIOC->PUPDR = 0x00000004; diff --git a/radio/src/logs.cpp b/radio/src/logs.cpp index 5fb01ef476..d7ba176739 100644 --- a/radio/src/logs.cpp +++ b/radio/src/logs.cpp @@ -26,12 +26,12 @@ const pm_char * g_logError = NULL; uint8_t logDelay; #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) - #define get2PosState(sw) (switchState(SW_ ## sw ## 0) ? -1 : 1) + #define GET_2POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : 1) #else - #define get2PosState(sw) (switchState(SW_ ## sw) ? -1 : 1) + #define GET_2POS_STATE(sw) (switchState(SW_ ## sw) ? -1 : 1) #endif -#define get3PosState(sw) (switchState(SW_ ## sw ## 0) ? -1 : (switchState(SW_ ## sw ## 2) ? 1 : 0)) +#define GET_3POS_STATE(sw) (switchState(SW_ ## sw ## 0) ? -1 : (switchState(SW_ ## sw ## 2) ? 1 : 0)) const pm_char * openLogs() { @@ -155,7 +155,7 @@ void writeHeader() #if defined(CPUARM) char label[TELEM_LABEL_LEN+7]; - for (int i=0; ifunc); @@ -736,7 +736,7 @@ that parameter remains unchanged. static int luaModelSetLogicalSwitch(lua_State *L) { unsigned int idx = luaL_checkunsigned(L, 1); - if (idx < NUM_LOGICAL_SWITCH) { + if (idx < MAX_LOGICAL_SWITCHES) { LogicalSwitchData * sw = lswAddress(idx); memclear(sw, sizeof(LogicalSwitchData)); luaL_checktype(L, -1, LUA_TTABLE); @@ -859,7 +859,7 @@ Get Custom Function parameters static int luaModelGetCustomFunction(lua_State *L) { unsigned int idx = luaL_checkunsigned(L, 1); - if (idx < NUM_CFN) { + if (idx < MAX_SPECIAL_FUNCTIONS) { CustomFunctionData * cfn = &g_model.customFn[idx]; lua_newtable(L); lua_pushtableinteger(L, "switch", CFN_SWITCH(cfn)); @@ -897,7 +897,7 @@ that parameter remains unchanged. static int luaModelSetCustomFunction(lua_State *L) { unsigned int idx = luaL_checkunsigned(L, 1); - if (idx < NUM_CFN) { + if (idx < MAX_SPECIAL_FUNCTIONS) { CustomFunctionData * cfn = &g_model.customFn[idx]; memclear(cfn, sizeof(CustomFunctionData)); luaL_checktype(L, -1, LUA_TTABLE); @@ -959,7 +959,7 @@ Get servo parameters static int luaModelGetOutput(lua_State *L) { unsigned int idx = luaL_checkunsigned(L, 1); - if (idx < NUM_CHNOUT) { + if (idx < MAX_OUTPUT_CHANNELS) { LimitData * limit = limitAddress(idx); lua_newtable(L); lua_pushtablezstring(L, "name", limit->name); @@ -997,7 +997,7 @@ that parameter remains unchanged. static int luaModelSetOutput(lua_State *L) { unsigned int idx = luaL_checkunsigned(L, 1); - if (idx < NUM_CHNOUT) { + if (idx < MAX_OUTPUT_CHANNELS) { LimitData * limit = limitAddress(idx); luaL_checktype(L, -1, LUA_TTABLE); for (lua_pushnil(L); lua_next(L, -2); lua_pop(L, 1)) { diff --git a/radio/src/lua/interface.cpp b/radio/src/lua/interface.cpp index 37d53ceeae..fd019dfa80 100644 --- a/radio/src/lua/interface.cpp +++ b/radio/src/lua/interface.cpp @@ -407,7 +407,7 @@ void luaLoadPermanentScripts() } // Load custom function scripts - for (int i=0; iflightModes & (1<swtch)) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) int32_t v; if (ed->srcRaw == ovwrIdx) { v = ovwrValue; @@ -91,7 +91,7 @@ void applyExpos(int16_t * anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS) cur_chn = ed->chn; //========== CURVE================= -#if defined(XCURVES) +#if defined(CPUARM) if (ed->curve.value) { v = applyCurve(v, ed->curve); } @@ -115,7 +115,7 @@ void applyExpos(int16_t * anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS) v = ((int32_t)v * weight) >> 8; #endif -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) //========== OFFSET =============== int32_t offset = GET_GVAR_PREC1(ed->offset, -100, 100, mixerCurrentFlightMode); if (offset) v += div_and_round(calc100toRESX(offset), 10); @@ -158,7 +158,7 @@ int16_t applyLimits(uint8_t channel, int32_t value) { LimitData * lim = limitAddress(channel); -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && defined(CURVES) if (lim->curve) { // TODO we loose precision here, applyCustomCurve could work with int32_t on ARM boards... if (lim->curve > 0) @@ -227,7 +227,7 @@ int16_t applyLimits(uint8_t channel, int32_t value) return ofs; } -// TODO same naming convention than the putsMixerSource +// TODO same naming convention than the drawSource getvalue_t getValue(mixsrc_t i) { @@ -235,13 +235,13 @@ getvalue_t getValue(mixsrc_t i) return 0; } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) else if (i <= MIXSRC_LAST_INPUT) { return anas[i-MIXSRC_FIRST_INPUT]; } #endif -#if defined(LUAINPUTS) +#if defined(LUA_INPUTS) else if (i < MIXSRC_LAST_LUA) { #if defined(LUA_MODEL_SCRIPTS) div_t qr = div(i-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); @@ -252,7 +252,7 @@ getvalue_t getValue(mixsrc_t i) } #endif -#if defined(LUAINPUTS) +#if defined(LUA_INPUTS) else if (i <= MIXSRC_LAST_POT+NUM_MOUSE_ANALOGS) { return calibratedStick[i-MIXSRC_Rud]; } @@ -294,7 +294,7 @@ getvalue_t getValue(mixsrc_t i) else if ((i >= MIXSRC_FIRST_SWITCH) && (i <= MIXSRC_LAST_SWITCH)) { mixsrc_t sw = i-MIXSRC_FIRST_SWITCH; if (SWITCH_EXISTS(sw)) { - return (switchState((EnumKeys)(SW_BASE+(3*sw))) ? -1024 : (switchState((EnumKeys)(SW_BASE+(3*sw)+1)) ? 0 : 1024)); + return (switchState(3*sw) ? -1024 : (switchState(3*sw+1) ? 0 : 1024)); } else { return 0; @@ -302,7 +302,7 @@ getvalue_t getValue(mixsrc_t i) } #else else if (i == MIXSRC_3POS) { - return (getSwitch(SW_ID0-SW_BASE+1) ? -1024 : (getSwitch(SW_ID1-SW_BASE+1) ? 0 : 1024)); + return (getSwitch(SW_ID0+1) ? -1024 : (getSwitch(SW_ID1+1) ? 0 : 1024)); } // don't use switchState directly to give getSwitch possibility to hack values if needed for switch warning else if (i < MIXSRC_SW1) { @@ -411,7 +411,7 @@ void evalInputs(uint8_t mode) { BeepANACenter anaCenter = 0; -#if defined(HELI) && !defined(VIRTUALINPUTS) +#if defined(HELI) && !defined(VIRTUAL_INPUTS) uint16_t d = 0; if (g_model.swashR.value) { uint32_t v = (int32_t(calibratedStick[ELE_STICK])*calibratedStick[ELE_STICK] + int32_t(calibratedStick[AIL_STICK])*calibratedStick[AIL_STICK]); @@ -423,7 +423,7 @@ void evalInputs(uint8_t mode) } #endif - for (uint8_t i=0; i [-1024..1024] uint8_t ch = (i < NUM_STICKS ? CONVERT_MODE(i) : i); int16_t v = anaIn(i); @@ -442,7 +442,8 @@ void evalInputs(uint8_t mode) if (v < -RESX) v = -RESX; if (v > RESX) v = RESX; -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && !defined(PCBX7D) + // TODO why not in the driver? if (i==POT1 || i==SLIDER1) { v = -v; } @@ -462,8 +463,8 @@ void evalInputs(uint8_t mode) if (mode == e_perout_mode_normal) { if (tmp==0 || (tmp==1 && (bpanaCenter & mask))) { anaCenter |= mask; - if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && !calibrationState) { - if (!IS_POT(i) || IS_POT_AVAILABLE(i)) { + if ((g_model.beepANACenter & mask) && !(bpanaCenter & mask) && !menuCalibrationState) { + if (!IS_POT(i) || IS_POT_OR_SLIDER_AVAILABLE(i)) { AUDIO_POT_MIDDLE(i); } } @@ -474,7 +475,7 @@ void evalInputs(uint8_t mode) #endif if (ch < NUM_STICKS) { // only do this for sticks -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) if (mode & e_perout_mode_nosticks) { v = 0; } @@ -501,7 +502,7 @@ void evalInputs(uint8_t mode) } } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) calibratedStick[ch] = v; #else #if defined(HELI) @@ -518,14 +519,14 @@ void evalInputs(uint8_t mode) #if defined(ROTARY_ENCODERS) for (uint8_t i=0; i 0 for (uint8_t i=0; imid; @@ -551,7 +552,7 @@ void evalInputs(uint8_t mode) } } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) int getStickTrimValue(int stick, int stickValue) { if (stick < 0) @@ -593,7 +594,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) #endif #if defined(HELI) -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) int heliEleValue = getValue(g_model.swashR.elevatorSource); int heliAilValue = getValue(g_model.swashR.aileronSource); #else @@ -616,7 +617,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) #define REZ_SWASH_Y(x) ((x)) // 1024 => 1024 if (g_model.swashR.type) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) getvalue_t vp = heliEleValue + getSourceTrimValue(g_model.swashR.elevatorSource); getvalue_t vr = heliAilValue + getSourceTrimValue(g_model.swashR.aileronSource); #else @@ -627,7 +628,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) if (g_model.swashR.collectiveSource) vc = getValue(g_model.swashR.collectiveSource); -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) vp = (vp * g_model.swashR.elevatorWeight) / 100; vr = (vr * g_model.swashR.aileronWeight) / 100; vc = (vc * g_model.swashR.collectiveWeight) / 100; @@ -727,7 +728,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) //========== VALUE =============== getvalue_t v = 0; if (mode > e_perout_mode_inactive_flight_mode) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) if (!mixEnabled) { continue; } @@ -744,7 +745,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) #endif } else { -#if !defined(VIRTUALINPUTS) +#if !defined(VIRTUAL_INPUTS) if (stickIndex < NUM_STICKS) { v = md->noExpo ? rawAnas[stickIndex] : anas[stickIndex]; } @@ -813,7 +814,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) //========== TRIMS ================ if (!(mode & e_perout_mode_notrims)) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) if (md->carryTrim == 0) { v += getSourceTrimValue(md->srcRaw, v); } @@ -886,7 +887,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) } //========== CURVES =============== -#if defined(XCURVES) +#if defined(CPUARM) if (apply_offset_and_curve && md->curve.type != CURVE_REF_DIFF && md->curve.value) { v = applyCurve(v, md->curve); } @@ -914,7 +915,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) } //========== DIFFERENTIAL ========= -#if defined(XCURVES) +#if defined(CPUARM) if (md->curve.type == CURVE_REF_DIFF && md->curve.value) { dv = applyCurve(dv, md->curve); } @@ -929,7 +930,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) } #endif - int32_t *ptr = &chans[md->destCh]; // Save calculating address several times + int32_t * ptr = &chans[md->destCh]; // Save calculating address several times switch (md->mltpx) { case MLTPX_REP: @@ -1003,7 +1004,7 @@ void evalFlightModeMixes(uint8_t mode, uint8_t tick10ms) mixWarning = lv_mixWarning; } -int32_t sum_chans512[NUM_CHNOUT] = {0}; +int32_t sum_chans512[MAX_OUTPUT_CHANNELS] = {0}; #define MAX_ACT 0xffff @@ -1074,7 +1075,7 @@ void evalMixes(uint8_t tick10ms) if (flightModesFade & ((ACTIVE_PHASES_TYPE)1 << p)) { mixerCurrentFlightMode = p; evalFlightModeMixes(p==fm ? e_perout_mode_normal : e_perout_mode_inactive_flight_mode, p==fm ? tick10ms : 0); - for (uint8_t i=0; i> 4) * fp_act[p]; weight += fp_act[p]; } @@ -1107,7 +1108,7 @@ void evalMixes(uint8_t tick10ms) } //========== LIMITS =============== - for (uint8_t i=0; i 1024*256 // later we multiply by the limit (up to 100) and then we need to normalize // at the end chans[i] = chans[i]/256 => -1024..1024 diff --git a/radio/src/myeeprom.h b/radio/src/myeeprom.h index 40899a9831..192a836449 100644 --- a/radio/src/myeeprom.h +++ b/radio/src/myeeprom.h @@ -138,7 +138,7 @@ #define CFN_GVAR_CST_MAX 125 #endif -#if defined(VIRTUALINPUTS) +#if defined(PCBTARANIS) || defined(PCBHORUS) || defined(PCBFLAMENCO) enum SwitchConfig { SWITCH_NONE, SWITCH_TOGGLE, @@ -157,11 +157,12 @@ }; #define SWITCH_CONFIG(x) ((g_eeGeneral.switchConfig >> (2*(x))) & 0x03) #define SWITCH_EXISTS(x) (SWITCH_CONFIG(x) != SWITCH_NONE) - #define IS_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS) - #define IS_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE) - #define IS_3POS_MIDDLE(x) ((x) == 1) - #define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !IS_TOGGLE(x)) + #define IS_CONFIG_3POS(x) (SWITCH_CONFIG(x) == SWITCH_3POS) + #define IS_CONFIG_TOGGLE(x) (SWITCH_CONFIG(x) == SWITCH_TOGGLE) + #define SWITCH_WARNING_ALLOWED(x) (SWITCH_EXISTS(x) && !IS_CONFIG_TOGGLE(x)) #else + #define IS_CONFIG_3POS(x) IS_3POS(x) + #define IS_CONFIG_TOGGLE(x) IS_TOGGLE(x) #define switchInfo(x) ((x) >= 3 ? (x)-2 : 0) #define SWITCH_EXISTS(x) true #endif @@ -187,20 +188,16 @@ enum CurveRefType { CURVE_REF_CUSTOM }; -#if !defined(XCURVES) +#if !defined(CPUARM) #define MODE_DIFFERENTIAL 0 #define MODE_EXPO 0 #define MODE_CURVE 1 #endif -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define MIN_EXPO_WEIGHT -100 #define EXPO_VALID(ed) ((ed)->mode) #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) -#elif defined(CPUARM) -#define MIN_EXPO_WEIGHT 0 -#define EXPO_VALID(ed) ((ed)->mode) -#define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) #elif defined(CPUM2560) || defined(CPUM2561) #define MIN_EXPO_WEIGHT 0 #define EXPO_VALID(ed) ((ed)->mode) @@ -211,7 +208,7 @@ enum CurveRefType { #define EXPO_MODE_ENABLE(ed, v) (((v)<0 && ((ed)->mode&1)) || ((v)>=0 && ((ed)->mode&2))) #endif -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define limit_min_max_t int16_t #define LIMIT_EXT_PERCENT 150 #define LIMIT_EXT_MAX (LIMIT_EXT_PERCENT*10) @@ -447,7 +444,7 @@ enum SwashType { #define TRIMS_ARRAY_SIZE 5 #else #define TRIMS_ARRAY_SIZE 8 - #if defined(VIRTUALINPUTS) + #if defined(CPUARM) #define TRIM_MODE_NONE 0x1F // 0b11111 #endif #endif diff --git a/radio/src/opentx.cpp b/radio/src/opentx.cpp index 5384934f98..41ff85ffa3 100644 --- a/radio/src/opentx.cpp +++ b/radio/src/opentx.cpp @@ -46,7 +46,7 @@ audioQueue audio; uint8_t heartbeat; #if defined(OVERRIDE_CHANNEL_FUNCTION) -safetych_t safetyCh[NUM_CHNOUT]; +safetych_t safetyCh[MAX_OUTPUT_CHANNELS]; #endif union ReusableBuffer reusableBuffer; @@ -318,7 +318,7 @@ uint16_t evalChkSum() return sum; } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) void clearInputs() { memset(g_model.expoData, 0, sizeof(g_model.expoData)); // clear all expos @@ -360,7 +360,7 @@ inline void applyDefaultTemplate() #else void applyDefaultTemplate() { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) defaultInputs(); // calls storageDirty internally #else storageDirty(EE_MODEL); @@ -370,7 +370,7 @@ void applyDefaultTemplate() MixData * mix = mixAddress(i); mix->destCh = i; mix->weight = 100; -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) mix->srcRaw = i+1; #else mix->srcRaw = MIXSRC_Rud - 1 + channel_order(i+1); @@ -465,7 +465,7 @@ void modelDefault(uint8_t id) #endif } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) bool isInputRecursive(int index) { ExpoData * line = expoAddress(0); @@ -487,7 +487,7 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS) int8_t result = 0; static tmr10ms_t s_move_last_time = 0; -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) static int16_t inputsStates[MAX_INPUTS]; if (min <= MIXSRC_FIRST_INPUT) { for (uint8_t i=0; i 512) { result = MIXSRC_Rud+i; break; @@ -517,7 +517,7 @@ int8_t getMovedSource(GET_MOVED_SOURCE_PARAMS) } if (result || recent) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) memcpy(inputsStates, anas, sizeof(inputsStates)); #endif memcpy(sourcesStates, calibratedStick, sizeof(sourcesStates)); @@ -543,7 +543,7 @@ uint8_t getFlightMode() trim_t getRawTrimValue(uint8_t phase, uint8_t idx) { - FlightModeData *p = flightModeAddress(phase); + FlightModeData * p = flightModeAddress(phase); #if defined(PCBSTD) return (((trim_t)p->trim[idx]) << 2) + ((p->trim_ext >> (2*idx)) & 0x03); #else @@ -553,7 +553,7 @@ trim_t getRawTrimValue(uint8_t phase, uint8_t idx) int getTrimValue(uint8_t phase, uint8_t idx) { -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) int result = 0; for (uint8_t i=0; i> INAC_STICKS_SHIFT; for (uint8_t i=0; i> INAC_SWITCHES_SHIFT; @@ -950,9 +950,9 @@ void checkBacklight() bool backlightOn = (g_eeGeneral.backlightMode == e_backlight_mode_on || lightOffCounter || isFunctionActive(FUNCTION_BACKLIGHT)); if (flashCounter) backlightOn = !backlightOn; if (backlightOn) - BACKLIGHT_ON(); + BACKLIGHT_ENABLE(); else - BACKLIGHT_OFF(); + BACKLIGHT_DISABLE(); #if defined(PCBSTD) && defined(VOICE) && !defined(SIMU) Voice.voice_process() ; @@ -1168,10 +1168,10 @@ void checkLowEEPROM() void checkTHR() { - uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; + uint8_t thrchn = ((g_model.thrTraceSrc==0) || (g_model.thrTraceSrc>NUM_POTS+NUM_SLIDERS)) ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1; // throttle channel is either the stick according stick mode (already handled in evalInputs) // or P1 to P3; - // in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS) we assume the throttle stick is the input + // in case an output channel is choosen as throttle source (thrTraceSrc>NUM_POTS+NUM_SLIDERS) we assume the throttle stick is the input // no other information available at the moment, and good enough to my option (otherwise too much exceptions...) #if defined(MODULE_ALWAYS_SEND_PULSES) @@ -1181,7 +1181,7 @@ void checkTHR() } else { calibratedStick[thrchn] = -1024; -#if !defined(VIRTUALINPUTS) +#if !defined(VIRTUAL_INPUTS) if (thrchn < NUM_STICKS) { rawAnas[thrchn] = anas[thrchn] = calibratedStick[thrchn]; } @@ -1342,7 +1342,7 @@ uint8_t checkTrim(uint8_t event) } else { phase = getTrimFlightPhase(mixerCurrentFlightMode, idx); -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) before = getTrimValue(phase, idx); #else before = getRawTrimValue(phase, idx); @@ -1351,7 +1351,7 @@ uint8_t checkTrim(uint8_t event) } #else phase = getTrimFlightPhase(mixerCurrentFlightMode, idx); -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) before = getTrimValue(phase, idx); #else before = getRawTrimValue(phase, idx); @@ -1398,7 +1398,7 @@ uint8_t checkTrim(uint8_t event) else #endif { -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) if (!setTrimValue(phase, idx, after)) { // we don't play a beep, so we exit now the function return; @@ -1443,7 +1443,7 @@ JitterMeter avgJitter[NUMBER_ANALOG]; tmr10ms_t jitterResetTime = 0; #endif -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) #define JITTER_FILTER_STRENGTH 4 // tune this value, bigger value - more filtering (range: 1-5) (see explanation below) #define ANALOG_SCALE 1 // tune this value, bigger value - more filtering (range: 0-1) (see explanation below) @@ -1464,15 +1464,8 @@ tmr10ms_t jitterResetTime = 0; #if !defined(SIMU) uint16_t anaIn(uint8_t chan) { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) return ANA_FILT(chan); -#elif defined(PCBSKY9X) && !defined(REVA) - static const uint8_t crossAna[]={1,5,7,0,4,6,2,3}; - if (chan == TX_CURRENT) { - return Current_analogue ; - } - volatile uint16_t *p = &s_anaFilt[pgm_read_byte(crossAna+chan)]; - return *p; #else #if defined(TELEMETRY_MOD_14051) || defined(TELEMETRY_MOD_14051_SWAPPED) static const pm_char crossAna[] PROGMEM = {3,1,2,0,4,5,6,0/* shouldn't be used */,TX_VOLTAGE}; @@ -1513,7 +1506,7 @@ void getADC() for (uint8_t x=0; x> (1 - ANALOG_SCALE); -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) // Jitter filter: // * pass trough any big change directly // * for small change use Modified moving average (MMA) filter @@ -1567,7 +1560,7 @@ void getADC() } #endif -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define ANAFILT_MAX (2 * RESX * JITTER_ALPHA * ANALOG_MULTIPLIER - 1) StepsCalibData * calib = (StepsCalibData *) &g_eeGeneral.calib[x]; if (IS_POT_MULTIPOS(x) && IS_MULTIPOS_CALIBRATED(calib)) { @@ -1581,7 +1574,7 @@ void getADC() } } } -#endif // defined(VIRTUALINPUTS) +#endif // defined(CPUARM) } } #endif @@ -1655,7 +1648,7 @@ void evalTrims() for (uint8_t i=0; i throttle trim if applicable int16_t trim = getTrimValue(phase, i); -#if !defined(VIRTUALINPUTS) +#if !defined(CPUARM) if (i==THR_STICK && g_model.thrTrim) { int16_t trimMin = g_model.extendedTrims ? TRIM_EXTENDED_MIN : TRIM_MIN; trim = (((g_model.throttleReversed)?(int32_t)(trim+trimMin):(int32_t)(trim-trimMin)) * (RESX-anas[i])) >> (RESX_SHIFT+1); @@ -1728,8 +1721,8 @@ void doMixerCalculations() /* Throttle trace */ int16_t val; - if (g_model.thrTraceSrc > NUM_POTS) { - uint8_t ch = g_model.thrTraceSrc-NUM_POTS-1; + if (g_model.thrTraceSrc > NUM_POTS+NUM_SLIDERS) { + uint8_t ch = g_model.thrTraceSrc-NUM_POTS+NUM_SLIDERS-1; val = channelOutputs[ch]; LimitData *lim = limitAddress(ch); @@ -1765,7 +1758,7 @@ void doMixerCalculations() if (val<0) val=0; // prevent val be negative, which would corrupt throttle trace and timers; could occur if safetyswitch is smaller than limits } else { -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) val = RESX + calibratedStick[g_model.thrTraceSrc == 0 ? THR_STICK : g_model.thrTraceSrc+NUM_STICKS-1]; #else val = RESX + (g_model.thrTraceSrc == 0 ? rawAnas[THR_STICK] : calibratedStick[g_model.thrTraceSrc+NUM_STICKS-1]); @@ -1967,7 +1960,7 @@ void opentxClose(uint8_t shutdown) saveTimers(); #if defined(CPUARM) - for (int i=0; i PWR_PRESS_SHUTDOWN) { #if defined(SHUTDOWN_CONFIRMATION) @@ -2788,7 +2781,7 @@ uint32_t pwrCheck() #endif } else { - drawShutdownBitmap(pwrPressedDuration()); + drawShutdownAnimation(pwrPressedDuration()); return e_power_press; } } diff --git a/radio/src/opentx.h b/radio/src/opentx.h index 3938f986e7..03e4b3e908 100644 --- a/radio/src/opentx.h +++ b/radio/src/opentx.h @@ -281,9 +281,8 @@ #define SWSRC_ID0 SWSRC_SA0 #define SWSRC_ID1 SWSRC_SA1 #define SWSRC_ID2 SWSRC_SA2 + #define IS_MOMENTARY(sw) false // TODO #else - #define IS_3POS(sw) ((sw) == 0) - #define IS_MOMENTARY(sw) (sw == SWSRC_TRN) #define SW_DSM2_BIND SW_TRN #endif @@ -301,36 +300,35 @@ void memswap(void * a, void * b, uint8_t size); #if defined(PCBHORUS) - #define IS_POT_AVAILABLE(x) (true) #define IS_POT_MULTIPOS(x) ((x)==POT2) #define IS_POT_WITHOUT_DETENT(x) (true) #elif defined(PCBFLAMENCO) - #define IS_POT_AVAILABLE(x) (true) #define IS_POT_MULTIPOS(x) (false) #define IS_POT_WITHOUT_DETENT(x) (false) #elif defined(PCBX9E) #define IS_SLIDER_AVAILABLE(x) ((x)==SLIDER1 || (x)==SLIDER2 || (g_eeGeneral.slidersConfig & (0x01 << ((x)-SLIDER3)))) - #define IS_POT_AVAILABLE(x) ((x)=SLIDER1 && IS_SLIDER_AVAILABLE(x))) #define IS_POT_MULTIPOS(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_MULTIPOS_SWITCH) #define IS_POT_WITHOUT_DETENT(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_WITHOUT_DETENT) #elif defined(PCBX9DP) - #define IS_POT_AVAILABLE(x) ((x)!=POT3 || (g_eeGeneral.potsConfig & (0x03 << (2*((x)-POT1))))!=POT_NONE) #define IS_POT_MULTIPOS(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_MULTIPOS_SWITCH) #define IS_POT_WITHOUT_DETENT(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_WITHOUT_DETENT) #elif defined(PCBTARANIS) - #define IS_POT_AVAILABLE(x) ((x)!=POT3) #define IS_POT_MULTIPOS(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_MULTIPOS_SWITCH) #define IS_POT_WITHOUT_DETENT(x) ((x)>=POT1 && (x)<=POT_LAST && ((g_eeGeneral.potsConfig>>(2*((x)-POT1)))&0x03)==POT_WITHOUT_DETENT) #else - #define IS_POT_AVAILABLE(x) (true) #define IS_POT_MULTIPOS(x) (false) #define IS_POT_WITHOUT_DETENT(x) (true) #endif -#define IS_POT(x) ((x)>=POT1 && (x)<=POT_LAST) +#if defined(PCBTARANIS) + #define IS_POT_OR_SLIDER_AVAILABLE(x) (IS_POT(x) || IS_SLIDER(x)) +#else + #define IS_POT_OR_SLIDER_AVAILABLE(x) (true) +#endif + #define IS_MULTIPOS_CALIBRATED(cal) (cal->count>0 && cal->countCNT; } #elif defined(PCBSKY9X) static inline uint16_t getTmr2MHz() { return TC1->TC_CHANNEL[0].TC_CV; } @@ -934,14 +913,6 @@ void backlightOn(); void checkBacklight(); void doLoopCommonActions(); -#if defined(PCBSTD) && defined(VOICE) && !defined(SIMU) - #define BACKLIGHT_ON() (Voice.Backlight = 1) - #define BACKLIGHT_OFF() (Voice.Backlight = 0) -#else - #define BACKLIGHT_ON() backlightEnable() - #define BACKLIGHT_OFF() backlightDisable() -#endif - #define BITMASK(bit) (1<<(bit)) /// liefert Dimension eines Arrays @@ -1055,28 +1026,19 @@ extern uint8_t g_beepVal[5]; #include "trainer_input.h" -extern int32_t chans[NUM_CHNOUT]; -extern int16_t ex_chans[NUM_CHNOUT]; // Outputs (before LIMITS) of the last perMain -extern int16_t channelOutputs[NUM_CHNOUT]; +extern int32_t chans[MAX_OUTPUT_CHANNELS]; +extern int16_t ex_chans[MAX_OUTPUT_CHANNELS]; // Outputs (before LIMITS) of the last perMain +extern int16_t channelOutputs[MAX_OUTPUT_CHANNELS]; extern uint16_t BandGap; -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define NUM_INPUTS (MAX_INPUTS) #else #define NUM_INPUTS (NUM_STICKS) #endif -int intpol(int x, uint8_t idx); int expo(int x, int k); -#if defined(CURVES) && defined(XCURVES) - int applyCurve(int x, CurveRef & curve); -#elif defined(CURVES) - int applyCurve(int x, int8_t idx); -#else - #define applyCurve(x, idx) (x) -#endif - #if defined(CPUARM) inline int getMaximumValue(int source) { @@ -1091,13 +1053,54 @@ int expo(int x, int k); } #endif -#if defined(XCURVES) - int applyCustomCurve(int x, uint8_t idx); +// Curves +enum BaseCurves { + CURVE_NONE, + CURVE_X_GT0, + CURVE_X_LT0, + CURVE_ABS_X, + CURVE_F_GT0, + CURVE_F_LT0, + CURVE_ABS_F, + CURVE_BASE +}; +int8_t * curveAddress(uint8_t idx); +struct point_t +{ + coord_t x; + coord_t y; +}; +point_t getPoint(uint8_t i); +#if !defined(CURVES) +#define LOAD_MODEL_CURVES() +#define applyCurve(x, idx) (x) +#elif defined(CPUARM) +typedef CurveData CurveInfo; +void loadCurves(); +#define LOAD_MODEL_CURVES() loadCurves() +int intpol(int x, uint8_t idx); +int applyCurve(int x, CurveRef & curve); +int applyCustomCurve(int x, uint8_t idx); +int applyCurrentCurve(int x); +int8_t getCurveX(int noPoints, int point); +void resetCustomCurveX(int8_t * points, int noPoints); +bool moveCurve(uint8_t index, int8_t shift); // TODO bool? #else - #define applyCustomCurve(x, idx) intpol(x, idx) +struct CurveInfo { + int8_t * crv; + uint8_t points:7; + uint8_t custom:1; +}; +CurveInfo curveInfo(uint8_t idx); +int intpol(int x, uint8_t idx); +int applyCurve(int x, int8_t idx); +#define LOAD_MODEL_CURVES() +#define applyCustomCurve(x, idx) intpol(x, idx) +int applyCurrentCurve(int x); +bool moveCurve(uint8_t index, int8_t shift, int8_t custom=0); #endif -#if defined(XCURVES) +#if defined(CPUARM) #define APPLY_EXPOS_EXTRA_PARAMS_INC , uint8_t ovwrIdx=0, int16_t ovwrValue=0 #define APPLY_EXPOS_EXTRA_PARAMS , uint8_t ovwrIdx, int16_t ovwrValue #else @@ -1105,17 +1108,17 @@ int expo(int x, int k); #define APPLY_EXPOS_EXTRA_PARAMS #endif -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) void clearInputs(); void defaultInputs(); #endif -void applyExpos(int16_t *anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS_INC); +void applyExpos(int16_t * anas, uint8_t mode APPLY_EXPOS_EXTRA_PARAMS_INC); int16_t applyLimits(uint8_t channel, int32_t value); void evalInputs(uint8_t mode); uint16_t anaIn(uint8_t chan); -extern int16_t calibratedStick[NUM_STICKS+NUM_POTS+NUM_MOUSE_ANALOGS]; +extern int16_t calibratedStick[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; #define FLASH_DURATION 20 /*200ms*/ @@ -1128,30 +1131,18 @@ FlightModeData *flightModeAddress(uint8_t idx); ExpoData *expoAddress(uint8_t idx); MixData *mixAddress(uint8_t idx); LimitData *limitAddress(uint8_t idx); -int8_t *curveAddress(uint8_t idx); LogicalSwitchData *lswAddress(uint8_t idx); -#if defined(XCURVES) -typedef CurveData CurveInfo; -#else -struct CurveInfo { - int8_t * crv; - uint8_t points:7; - uint8_t custom:1; -}; -extern CurveInfo curveInfo(uint8_t idx); -#endif - // static variables used in evalFlightModeMixes - moved here so they don't interfere with the stack // It's also easier to initialize them here. -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) extern int8_t virtualInputsTrims[NUM_INPUTS]; #else extern int16_t rawAnas[NUM_INPUTS]; #endif -extern int16_t anas [NUM_INPUTS]; -extern int16_t trims[NUM_STICKS+NUM_AUX_TRIMS]; +extern int16_t anas [NUM_INPUTS]; +extern int16_t trims[NUM_STICKS+NUM_AUX_TRIMS]; extern BeepANACenter bpanaCenter; extern uint8_t s_mixer_first_run_done; @@ -1191,10 +1182,10 @@ PACK(typedef struct { }) SwOn; #endif -extern SwOn swOn [MAX_MIXERS]; -extern int24_t act [MAX_MIXERS]; +extern SwOn swOn[MAX_MIXERS]; +extern int24_t act[MAX_MIXERS]; -#ifdef BOLD_FONT +#if defined(BOLD_FONT) inline bool isExpoActive(uint8_t expo) { return swOn[expo].activeExpo; @@ -1209,7 +1200,7 @@ extern int24_t act [MAX_MIXERS]; #define isMixActive(x) false #endif -enum CswFunctionFamilies { +enum LogicalSwitchFamilies { LS_FAMILY_OFS, LS_FAMILY_BOOL, LS_FAMILY_COMP, @@ -1422,7 +1413,7 @@ void opentxClose(uint8_t shutdown=true); void opentxInit(); void opentxResume(); -#if defined(PCBHORUS) && !defined(SIMU) +#if defined(PCBHORUS) || defined(PCBX7D) #define LED_ERROR_BEGIN() ledRed() #define LED_ERROR_END() ledBlue() #else @@ -1438,7 +1429,7 @@ union ReusableBuffer struct { char listnames[NUM_BODY_LINES][LEN_MODEL_NAME]; -#if !defined(CPUARM) +#if defined(EEPROM_RLC) && LCD_W < 212 uint16_t eepromfree; #endif #if defined(SDCARD) @@ -1452,9 +1443,9 @@ union ReusableBuffer // 103 bytes struct { - int16_t midVals[NUM_STICKS+NUM_POTS+NUM_MOUSE_ANALOGS]; - int16_t loVals[NUM_STICKS+NUM_POTS+NUM_MOUSE_ANALOGS]; - int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_MOUSE_ANALOGS]; + int16_t midVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; + int16_t loVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; + int16_t hiVals[NUM_STICKS+NUM_POTS+NUM_SLIDERS+NUM_MOUSE_ANALOGS]; uint8_t state; #if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) struct { @@ -1478,7 +1469,7 @@ union ReusableBuffer } sdmanager; #endif -#if defined(CPUSTM32) +#if defined(STM32) struct { char id[27]; diff --git a/radio/src/pulses/ppm_arm.cpp b/radio/src/pulses/ppm_arm.cpp index a681b88857..04b8f50c7a 100644 --- a/radio/src/pulses/ppm_arm.cpp +++ b/radio/src/pulses/ppm_arm.cpp @@ -30,9 +30,9 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) // The pulse ISR is 2mhz that's why everything is multiplied by 2 uint32_t firstCh = g_model.moduleData[port].channelsStart; - uint32_t lastCh = min(NUM_CHNOUT, firstCh + 8 + g_model.moduleData[port].channelsCount); + uint32_t lastCh = min(MAX_OUTPUT_CHANNELS, firstCh + 8 + g_model.moduleData[port].channelsCount); -#if defined(CPUSTM32) +#if defined(STM32) ppmPulsesData->ptr = ppmPulsesData->pulses; #else uint16_t * ptr = ppmPulsesData->pulses; @@ -44,14 +44,14 @@ void setupPulsesPPM(uint8_t port, PpmPulsesData * ppmPulsesData) for (uint32_t i=firstCh; iptr++ = v; /* as Pat MacKenzie suggests */ #else *ptr++ = v; /* as Pat MacKenzie suggests */ #endif } rest = limit(9000, rest, 65535); /* avoids that CCR2 is bigger than ARR which would cause reboot */ -#if defined(CPUSTM32) +#if defined(STM32) *ppmPulsesData->ptr++ = rest; #else *ptr = rest; diff --git a/radio/src/sbus.cpp b/radio/src/sbus.cpp index 575e5dfa6a..5fbd5f4453 100644 --- a/radio/src/sbus.cpp +++ b/radio/src/sbus.cpp @@ -49,7 +49,7 @@ void processSbusFrame(uint8_t * sbus, int16_t * pulses, uint32_t size) uint32_t inputbitsavailable = 0; uint32_t inputbits = 0; - for (uint32_t i=0; isetValue(0); } - for(int i=0; isetRange(-1024, 1024); knobs[i]->setValue(0); @@ -139,7 +139,7 @@ Open9xSim::~Open9xSim() delete sliders[2]; delete sliders[3]; - for(int i=0; i= 212 #define BL_COLOR FXRGB(47, 123, 227) #else #define BL_COLOR FXRGB(150, 200, 152) @@ -472,7 +472,7 @@ void Open9xSim::refreshDisplay() FXColor color = FXRGB(255*((z&0xF00)>>8)/0x0f, 255*((z&0x0F0)>>4)/0x0f, 255*(z&0x00F)/0x0f); setPixel(x, y, color); } -#elif defined(PCBTARANIS) +#elif LCD_W >= 212 display_t * p = &simuLcdBuf[y / 2 * LCD_W + x]; uint8_t z = (y & 1) ? (*p >> 4) : (*p & 0x0F); if (z) { @@ -560,7 +560,7 @@ uint16_t anaIn(uint8_t chan) { if (chansliders[chan]->getValue(); - else if (chanknobs[chan-NUM_STICKS]->getValue(); #if defined(PCBHORUS) else if (chan == TX_VOLTAGE) diff --git a/radio/src/storage/eeprom_conversions.cpp b/radio/src/storage/eeprom_conversions.cpp index 42007a7f23..16658b9061 100644 --- a/radio/src/storage/eeprom_conversions.cpp +++ b/radio/src/storage/eeprom_conversions.cpp @@ -96,7 +96,7 @@ enum Mix216Sources { MIXSRC216_LAST_LOGICAL_SWITCH = MIXSRC216_FIRST_LOGICAL_SWITCH+32-1, MIXSRC216_FIRST_TRAINER, - MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+NUM_TRAINER-1, + MIXSRC216_LAST_TRAINER = MIXSRC216_FIRST_TRAINER+MAX_TRAINER_CHANNELS-1, MIXSRC216_FIRST_CH, MIXSRC216_CH1 = MIXSRC216_FIRST_CH, @@ -115,7 +115,7 @@ enum Mix216Sources { MIXSRC216_CH14, MIXSRC216_CH15, MIXSRC216_CH16, - MIXSRC216_LAST_CH = MIXSRC216_CH1+NUM_CHNOUT-1, + MIXSRC216_LAST_CH = MIXSRC216_CH1+MAX_OUTPUT_CHANNELS-1, MIXSRC216_GVAR1, MIXSRC216_LAST_GVAR = MIXSRC216_GVAR1+MAX_GVARS-1, @@ -194,15 +194,13 @@ enum Telemetry216Source { TELEM216_GPS_TIME, }; -#if defined(XCURVES) +#if defined(CPUARM) PACK(typedef struct { uint8_t type:3; uint8_t smooth:1; uint8_t spare:4; int8_t points; }) CurveData_v216; -#else -typedef int16_t CurveData_v216; #endif #if defined(PCBTARANIS) @@ -478,7 +476,7 @@ PACK(typedef struct { uint8_t channelsStart; int8_t channelsCount; // 0=8 channels uint8_t failsafeMode; - int16_t failsafeChannels[NUM_CHNOUT]; + int16_t failsafeChannels[MAX_OUTPUT_CHANNELS]; int8_t ppmDelay; int8_t ppmFrameLength; uint8_t ppmPulsePol; @@ -493,14 +491,14 @@ PACK(typedef struct { ScriptData_v216 scriptsData[MAX_SCRIPTS]; \ char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ uint8_t nPotsToWarn; \ - int8_t potPosition[NUM_POTS]; \ + int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ uint8_t spare[2]; #elif defined(PCBSKY9X) #define MODELDATA_EXTRA_216 \ uint8_t externalModule; \ ModuleData_v216 moduleData[NUM_MODULES+1]; \ uint8_t nPotsToWarn; \ - int8_t potPosition[NUM_POTS]; \ + int8_t potPosition[NUM_POTS+NUM_SLIDERS]; \ uint8_t rxBattAlarms[2]; #endif @@ -514,18 +512,18 @@ PACK(typedef struct { ScriptData scriptsData[MAX_SCRIPTS]; \ char inputNames[MAX_INPUTS][LEN_INPUT_NAME]; \ uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS]; + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; #else #define MODELDATA_EXTRA_217 \ uint8_t spare:6; \ uint8_t potsWarnMode:2; \ ModuleData moduleData[NUM_MODULES+1]; \ uint8_t potsWarnEnabled; \ - int8_t potsWarnPosition[NUM_POTS]; \ + int8_t potsWarnPosition[NUM_POTS+NUM_SLIDERS]; \ uint8_t rxBattAlarms[2]; #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 PACK(typedef struct { char name[LEN_MODEL_NAME]; uint8_t modelId; @@ -556,14 +554,14 @@ PACK(typedef struct { AVR_FIELD(int8_t ppmDelay) BeepANACenter beepANACenter; // 1<<0->A1.. 1<<6->A7 MixData_v216 mixData[MAX_MIXERS]; - LimitData_v216 limitData[NUM_CHNOUT]; + LimitData_v216 limitData[MAX_OUTPUT_CHANNELS]; ExpoData_v216 expoData[MAX_EXPOS]; CurveData_v216 curves[MAX_CURVES]; - int8_t points[NUM_POINTS]; + int8_t points[MAX_CURVE_POINTS]; LogicalSwitchData_v216 logicalSw[32]; - CustomFunctionData_v216 customFn[NUM_CFN]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; SwashRingData_v216 swashR; FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; @@ -596,14 +594,14 @@ PACK(typedef struct { uint8_t throttleReversed:1; BeepANACenter beepANACenter; MixData_v217 mixData[MAX_MIXERS]; - LimitData limitData[NUM_CHNOUT]; + LimitData limitData[MAX_OUTPUT_CHANNELS]; ExpoData_v217 expoData[MAX_EXPOS]; CurveData_v216 curves[MAX_CURVES]; - int8_t points[NUM_POINTS]; + int8_t points[MAX_CURVE_POINTS]; LogicalSwitchData_v217 logicalSw[32]; - CustomFunctionData_v216 customFn[NUM_CFN]; + CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]; SwashRingData swashR; FlightModeData_v216 flightModeData[MAX_FLIGHT_MODES]; @@ -618,7 +616,7 @@ PACK(typedef struct { MODELDATA_EXTRA_217 - TelemetrySensor telemetrySensors[MAX_SENSORS]; + TelemetrySensor telemetrySensors[MAX_TELEMETRY_SENSORS]; TARANIS_PCBX9E_FIELD(uint8_t toplcdTimer) }) ModelData_v217; @@ -702,7 +700,7 @@ int ConvertGVar_216_to_217(int value) PACK(typedef struct { uint8_t version; uint16_t variant; - CalibData calib[NUM_STICKS+NUM_POTS]; + CalibData calib[NUM_STICKS+NUM_POTS+NUM_SLIDERS]; uint16_t chkSum; int8_t currModel; uint8_t contrast; @@ -767,11 +765,11 @@ PACK(typedef struct { TARANIS_FIELD(uint8_t potsConfig) TARANIS_FIELD(uint8_t backlightColor) TARANIS_FIELD(swarnstate_t switchUnlockStates) - TARANIS_FIELD(CustomFunctionData_v216 customFn[NUM_CFN]) + TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) TARANIS_FIELD(swconfig_t switchConfig) TARANIS_FIELD(char switchNames[NUM_SWITCHES][LEN_SWITCH_NAME]) - TARANIS_FIELD(char anaNames[NUM_STICKS + NUM_POTS][LEN_ANA_NAME]) - N_TARANIS_FIELD(CustomFunctionData_v216 customFn[NUM_CFN]) + TARANIS_FIELD(char anaNames[NUM_STICKS+NUM_POTS+NUM_SLIDERS][LEN_ANA_NAME]) + N_TARANIS_FIELD(CustomFunctionData_v216 customFn[MAX_SPECIAL_FUNCTIONS]) TARANIS_PCBX9E_FIELD(uint8_t bluetoothEnable) TARANIS_PCBX9E_FIELD(char bluetoothName[LEN_BLUETOOTH_NAME]) @@ -789,7 +787,7 @@ void ConvertRadioData_216_to_217(RadioData & settings) void ConvertSpecialFunctions_217_to_218(CustomFunctionData * cf218, CustomFunctionData_v216 * cf216) { - for (int i=0; i= 212 memcpy(newModel.header.bitmap, oldModel.header.bitmap, LEN_BITMAP_NAME); #endif @@ -917,9 +915,9 @@ void ConvertModel_216_to_217(ModelData & model) #if defined(PCBTARANIS) newModel.mixData[i].curve = oldModel.mixData[i].curve; #else - newModel.mixData[i].curveMode = oldModel.mixData[i].curveMode; - newModel.mixData[i].noExpo = oldModel.mixData[i].noExpo; - newModel.mixData[i].curveParam = oldModel.mixData[i].curveParam; + // TODO newModel.mixData[i].curveMode = oldModel.mixData[i].curveMode; + // TODO newModel.mixData[i].noExpo = oldModel.mixData[i].noExpo; + // TODO newModel.mixData[i].curveParam = oldModel.mixData[i].curveParam; #endif newModel.mixData[i].delayUp = oldModel.mixData[i].delayUp; newModel.mixData[i].delayDown = oldModel.mixData[i].delayDown; @@ -929,7 +927,7 @@ void ConvertModel_216_to_217(ModelData & model) newModel.mixData[i].offset = ConvertGVar_216_to_217(oldModel.mixData[i].offset); memcpy(newModel.mixData[i].name, oldModel.mixData[i].name, sizeof(newModel.mixData[i].name)); } - for (int i=0; i UNIT_WATTS) newModel.telemetrySensors[i].unit += 1; diff --git a/radio/src/storage/eeprom_raw.cpp b/radio/src/storage/eeprom_raw.cpp index 7800e763eb..0fcfa034ff 100644 --- a/radio/src/storage/eeprom_raw.cpp +++ b/radio/src/storage/eeprom_raw.cpp @@ -340,7 +340,7 @@ void storageFormat() void eepromWriteWait(EepromWriteState state/* = EEPROM_IDLE*/) { while (eepromWriteState != state) { -#if defined(CPUSTM32) +#if defined(STM32) // Waits a little bit for CS transitions CoTickDelay(1/*2ms*/); #endif @@ -546,7 +546,7 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc) const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name) { - char *buf = reusableBuffer.modelsel.mainname; + char * buf = reusableBuffer.modelsel.mainname; FIL restoreFile; UINT read; diff --git a/radio/src/storage/eeprom_rlc.cpp b/radio/src/storage/eeprom_rlc.cpp index 76008c0875..3c973a1f6c 100644 --- a/radio/src/storage/eeprom_rlc.cpp +++ b/radio/src/storage/eeprom_rlc.cpp @@ -539,7 +539,7 @@ bool RlcFile::copy(uint8_t i_fileDst, uint8_t i_fileSrc) #if defined(SDCARD) const pm_char * eeBackupModel(uint8_t i_fileSrc) { - char *buf = reusableBuffer.modelsel.mainname; + char * buf = reusableBuffer.modelsel.mainname; UINT written; // we must close the logs as we reuse the same FIL structure @@ -622,7 +622,7 @@ const pm_char * eeBackupModel(uint8_t i_fileSrc) const pm_char * eeRestoreModel(uint8_t i_fileDst, char *model_name) { - char *buf = reusableBuffer.modelsel.mainname; + char * buf = reusableBuffer.modelsel.mainname; UINT read; // we must close the logs as we reuse the same FIL structure @@ -975,3 +975,52 @@ void eeDeleteModel(uint8_t idx) memset(&modelHeaders[idx], 0, sizeof(ModelHeader)); } #endif + +#if defined(SDCARD) +void eepromBackup() +{ + char filename[60]; + uint8_t buffer[1024]; + FIL file; + + lcdClear(); + drawProgressBar(STR_WRITING); + + // reset unexpectedShutdown to prevent warning when user restores EEPROM backup + g_eeGeneral.unexpectedShutdown = 0; + storageDirty(EE_GENERAL); + storageCheck(true); + + // create the directory if needed... + const char * error = sdCheckAndCreateDirectory(EEPROMS_PATH); + if (error) { + POPUP_WARNING(error); + return; + } + + // prepare the filename... + char * tmp = strAppend(filename, EEPROMS_PATH "/eeprom"); +#if defined(RTCLOCK) + tmp = strAppendDate(tmp, true); +#endif + strAppend(tmp, EEPROM_EXT); + + // open the file for writing... + f_open(&file, filename, FA_WRITE | FA_CREATE_ALWAYS); + + for (int i=0; i 0 + else if (idx <= SWSRC_LAST_MULTIPOS_SWITCH) { + div_t swinfo = div(idx - SWSRC_FIRST_MULTIPOS_SWITCH, XPOTS_MULTIPOS_COUNT); + getStringWithIndex(s, "S", swinfo.quot*10+swinfo.rem+11); + } +#endif + else if (idx <= SWSRC_LAST_TRIM) { + getStringAtIndex(s, STR_VSWITCHES, idx-SWSRC_FIRST_TRIM+1); + } + else if (idx <= SWSRC_LAST_LOGICAL_SWITCH) { + getStringWithIndex(s, "L", idx-SWSRC_FIRST_LOGICAL_SWITCH+1); + } + else if (idx <= SWSRC_ONE) { + getStringAtIndex(s, STR_VSWITCHES, idx-SWSRC_ON+2+(SWSRC_LAST_TRIM-SWSRC_FIRST_TRIM)); + } + else if (idx <= SWSRC_LAST_FLIGHT_MODE) { + getStringWithIndex(s, STR_FP, idx-SWSRC_FIRST_FLIGHT_MODE); + } + else if (idx == SWSRC_TELEMETRY_STREAMING) { + strcpy(s, "Tele"); + } + else { + zchar2str(s, g_model.telemetrySensors[idx-SWSRC_FIRST_SENSOR].label, TELEM_LABEL_LEN); + } + + return dest; +} + +char * getSourceString(char * dest, mixsrc_t idx) +{ + if (idx == MIXSRC_NONE) { + return getStringAtIndex(dest, STR_VSRCRAW, 0); + } + else if (idx <= MIXSRC_LAST_INPUT) { + idx -= MIXSRC_FIRST_INPUT; + *dest++ = '\314'; + if (ZEXIST(g_model.inputNames[idx])) { + zchar2str(dest, g_model.inputNames[idx], LEN_INPUT_NAME); + dest[LEN_INPUT_NAME] = '\0'; + } + else { + strAppendUnsigned(dest, idx, 2); + } + } +#if defined(LUA_INPUTS) + else if (idx <= MIXSRC_LAST_LUA) { +#if defined(LUA_MODEL_SCRIPTS) + div_t qr = div(idx-MIXSRC_FIRST_LUA, MAX_SCRIPT_OUTPUTS); + if (qr.quot < MAX_SCRIPTS && qr.rem < scriptInputsOutputs[qr.quot].outputsCount) { + *dest++ = '\322'; + // *dest++ = '1'+qr.quot; + strcpy(dest, scriptInputsOutputs[qr.quot].outputs[qr.rem].name); + } +#else + strcpy(dest, "N/A"); +#endif + } +#endif + else if (idx <= MIXSRC_LAST_POT) { + idx -= MIXSRC_Rud; + if (ZEXIST(g_eeGeneral.anaNames[idx])) { + zchar2str(dest, g_eeGeneral.anaNames[idx], LEN_ANA_NAME); + dest[LEN_ANA_NAME] = '\0'; + } + else { + getStringAtIndex(dest, STR_VSRCRAW, idx + 1); + } + } + else if (idx <= MIXSRC_LAST_TRIM) { + idx -= MIXSRC_Rud; + getStringAtIndex(dest, STR_VSRCRAW, idx + 1); + } + else if (idx <= MIXSRC_LAST_SWITCH) { + idx -= MIXSRC_FIRST_SWITCH; + if (ZEXIST(g_eeGeneral.switchNames[idx])) { + zchar2str(dest, g_eeGeneral.switchNames[idx], LEN_SWITCH_NAME); + dest[LEN_SWITCH_NAME] = '\0'; + } + else { + getStringAtIndex(dest, STR_VSRCRAW, idx + MIXSRC_FIRST_SWITCH - MIXSRC_Rud + 1); + } + } + else if (idx <= MIXSRC_LAST_LOGICAL_SWITCH) { + getSwitchString(dest, SWSRC_SW1 + idx - MIXSRC_SW1); + } + else if (idx <= MIXSRC_LAST_TRAINER) { + getStringWithIndex(dest, STR_PPM_TRAINER, idx - MIXSRC_FIRST_TRAINER + 1); + } + else if (idx <= MIXSRC_LAST_CH) { + getStringWithIndex(dest, STR_CH, idx - MIXSRC_CH1 + 1); + } + else if (idx <= MIXSRC_LAST_GVAR) { + getStringWithIndex(dest, STR_GV, idx - MIXSRC_GVAR1 + 1); + } + else if (idx < MIXSRC_FIRST_TELEM) { + getStringAtIndex(dest, STR_VSRCRAW, idx-MIXSRC_Rud+1-MAX_LOGICAL_SWITCHES-MAX_TRAINER_CHANNELS-MAX_OUTPUT_CHANNELS-MAX_GVARS); + } + else { + idx -= MIXSRC_FIRST_TELEM; + div_t qr = div(idx, 3); + dest[0] = '\321'; + int pos = 1 + zchar2str(&dest[1], g_model.telemetrySensors[qr.quot].label, sizeof(g_model.telemetrySensors[qr.quot].label)); + if (qr.rem) dest[pos++] = (qr.rem==2 ? '+' : '-'); + dest[pos] = '\0'; + } + + return dest; +} +#endif + char * strAppendUnsigned(char * dest, uint32_t value, uint8_t digits, uint8_t radix) { if (digits == 0) { diff --git a/radio/src/strhelpers.h b/radio/src/strhelpers.h index 48803bbceb..0d3c7ae6a5 100644 --- a/radio/src/strhelpers.h +++ b/radio/src/strhelpers.h @@ -18,9 +18,22 @@ * GNU General Public License for more details. */ +#ifndef _STRHELPERS_H_ +#define _STRHELPERS_H_ + char * strAppend(char * dest, const char * source, int len=0); char * strAppendUnsigned(char * dest, uint32_t value, uint8_t digits=0, uint8_t radix=10); char * strAppendSigned(char * dest, int32_t value, uint8_t digits=0, uint8_t radix=10); char * strSetCursor(char * dest, int position); char * strAppendDate(char * str, bool time=false); char * strAppendFilename(char * dest, const char * filename, const int size); + +#if defined(CPUARM) && !defined(BOOT) +char * getStringAtIndex(char * dest, const char * s, int idx); +char * getStringWithIndex(char * dest, const char * s, int idx); +char * getCurveString(char * dest, int idx); +char * getSwitchString(char * dest, swsrc_t idx); +char * getSourceString(char * dest, mixsrc_t idx); +#endif + +#endif // _STRHELPERS_H_ diff --git a/radio/src/switches.cpp b/radio/src/switches.cpp index 728d2bc71b..c903a808b9 100644 --- a/radio/src/switches.cpp +++ b/radio/src/switches.cpp @@ -53,7 +53,7 @@ PACK(typedef struct { }) LogicalSwitchContext; PACK(typedef struct { - LogicalSwitchContext lsw[NUM_LOGICAL_SWITCH]; + LogicalSwitchContext lsw[MAX_LOGICAL_SWITCHES]; }) LogicalSwitchesFlightModeContext; LogicalSwitchesFlightModeContext lswFm[MAX_FLIGHT_MODES]; @@ -61,7 +61,7 @@ LogicalSwitchesFlightModeContext lswFm[MAX_FLIGHT_MODES]; #else -int16_t lsLastValue[NUM_LOGICAL_SWITCH]; +int16_t lsLastValue[MAX_LOGICAL_SWITCHES]; #define LS_LAST_VALUE(fm, idx) lsLastValue[idx] volatile GETSWITCH_RECURSIVE_TYPE s_last_switch_used = 0; @@ -86,17 +86,10 @@ div_t switchInfo(int switchPosition) return infos[switchPosition-SWSRC_FIRST_SWITCH]; } -uint32_t check2PosSwitchPosition(EnumKeys sw) +uint32_t check2PosSwitchPosition(uint8_t sw) { - uint32_t result; - uint32_t index; - - if (switchState(sw)) - index = sw - SW_SA0; - else - index = sw - SW_SA0 + 1; - - result = ((uint32_t)1 << index); + uint32_t index = (switchState(sw) ? sw : sw + 1); + uint32_t result = ((uint32_t)1 << index); if (!(switchesPos & result)) { PLAY_SWITCH_MOVED(index); @@ -105,32 +98,32 @@ uint32_t check2PosSwitchPosition(EnumKeys sw) return result; } -uint32_t check3PosSwitchPosition(int idx, EnumKeys sw, bool startup) +uint32_t check3PosSwitchPosition(int idx, uint8_t sw, bool startup) { uint32_t result; uint32_t index; if (switchState(sw)) { - index = sw - SW_SA0; + index = sw; result = (1 << index); switchesMidposStart[idx] = 0; } - else if (switchState(EnumKeys(sw+2))) { - index = sw - SW_SA0 + 2; + else if (switchState(sw+2)) { + index = sw + 2; result = (1 << index); switchesMidposStart[idx] = 0; } - else if (startup || (switchesPos & (1 << (sw - SW_SA0 + 1))) || g_eeGeneral.switchesDelay==SWITCHES_DELAY_NONE || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > SWITCHES_DELAY())) { - index = sw - SW_SA0 + 1; + else if (startup || (switchesPos & (1 << (sw + 1))) || g_eeGeneral.switchesDelay==SWITCHES_DELAY_NONE || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > SWITCHES_DELAY())) { + index = sw + 1; result = (1 << index); switchesMidposStart[idx] = 0; } else { - index = sw - SW_SA0 + 1; + index = sw + 1; if (!switchesMidposStart[idx]) { switchesMidposStart[idx] = get_tmr10ms(); } - result = (switchesPos & (0x7 << (sw - SW_SA0))); + result = (switchesPos & (0x7 << sw)); } if (!(switchesPos & result)) { @@ -172,17 +165,10 @@ div_t switchInfo(int switchPosition) return div(switchPosition-SWSRC_FIRST_SWITCH, 3); } -uint64_t check2PosSwitchPosition(EnumKeys sw) +uint64_t check2PosSwitchPosition(uint8_t sw) { - uint64_t result; - uint32_t index; - - if (switchState(sw)) - index = sw - SW_SA0; - else - index = sw - SW_SA0 + 2; - - result = ((uint64_t)1 << index); + uint32_t index = (switchState(sw) ? sw : sw + 2); + uint64_t result = ((uint64_t)1 << index); if (!(switchesPos & result)) { PLAY_SWITCH_MOVED(index); @@ -191,29 +177,29 @@ uint64_t check2PosSwitchPosition(EnumKeys sw) return result; } -uint64_t check3PosSwitchPosition(uint8_t idx, EnumKeys sw, bool startup) +uint64_t check3PosSwitchPosition(uint8_t idx, uint8_t sw, bool startup) { uint64_t result; uint32_t index; if (switchState(sw)) { - index = sw - SW_SA0; + index = sw; result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; } - else if (switchState(EnumKeys(sw+2))) { - index = sw - SW_SA0 + 2; + else if (switchState(sw+2)) { + index = sw + 2; result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; } else { - index = sw - SW_SA0 + 1; + index = sw + 1; if (startup || SWITCH_POSITION(index) || g_eeGeneral.switchesDelay==SWITCHES_DELAY_NONE || (switchesMidposStart[idx] && (tmr10ms_t)(get_tmr10ms() - switchesMidposStart[idx]) > SWITCHES_DELAY())) { result = ((MASK_CFN_TYPE)1 << index); switchesMidposStart[idx] = 0; } else { - result = (switchesPos & ((MASK_CFN_TYPE)0x7 << (sw - SW_SA0))); + result = (switchesPos & ((MASK_CFN_TYPE)0x7 << sw)); if (!switchesMidposStart[idx]) { switchesMidposStart[idx] = get_tmr10ms(); } @@ -237,11 +223,14 @@ void getSwitchesPosition(bool startup) CHECK_3POS(1, SW_SB); CHECK_3POS(2, SW_SC); CHECK_3POS(3, SW_SD); +#if !defined(PCBX7D) CHECK_3POS(4, SW_SE); +#endif CHECK_2POS(SW_SF); +#if !defined(PCBX7D) CHECK_3POS(5, SW_SG); +#endif CHECK_2POS(SW_SH); - #if defined(PCBX9E) CHECK_3POS(6, SW_SI); CHECK_3POS(7, SW_SJ); @@ -555,9 +544,9 @@ bool getSwitch(swsrc_t swtch) if (flags & GETSWITCH_MIDPOS_DELAY) result = SWITCH_POSITION(cs_idx-SWSRC_FIRST_SWITCH); else - result = switchState((EnumKeys)(SW_BASE+cs_idx-SWSRC_FIRST_SWITCH)); + result = switchState(cs_idx-SWSRC_FIRST_SWITCH); #else - result = switchState((EnumKeys)(SW_BASE+cs_idx-SWSRC_FIRST_SWITCH)); + result = switchState(cs_idx-SWSRC_FIRST_SWITCH); #endif #if defined(MODULE_ALWAYS_SEND_PULSES) @@ -645,7 +634,7 @@ bool getSwitch(swsrc_t swtch) */ void evalLogicalSwitches(bool isCurrentPhase) { - for (unsigned int idx=0; idx3)) || next==true) result = next ? i : -i; @@ -783,8 +772,8 @@ void checkSwitches() if (g_model.potsWarnMode) { evalFlightModeMixes(e_perout_mode_normal, 0); bad_pots = 0; - for (int i=0; i 1)) { @@ -835,7 +824,7 @@ void checkSwitches() if (++numWarnings < 6) { // LcdFlags attr = ((states & mask) == (switches_states & mask)) ? TEXT_COLOR : ALARM_COLOR; LcdFlags attr = ALARM_COLOR; - putsSwitches(x, y, SWSRC_FIRST_SWITCH+i*3+state-1, attr); + drawSwitch(x, y, SWSRC_FIRST_SWITCH+i*3+state-1, attr); x += SWITCH_WARNING_LIST_INTERVAL; } else if (numWarnings == 6) { @@ -850,7 +839,7 @@ void checkSwitches() if (attr) { if (++numWarnings < 7) { char c = "\300-\301"[(states & mask) >> (i*2)]; - putsMixerSource(x, y, MIXSRC_FIRST_SWITCH+i, attr); + drawSource(x, y, MIXSRC_FIRST_SWITCH+i, attr); lcdDrawChar(lcdNextPos, y, c, attr); x = lcdNextPos + 3; } @@ -867,8 +856,8 @@ void checkSwitches() y = 6*FH-2; x = 60; } - for (int i=0; i0?(i+3):(states&0x3)+1), attr); + drawSwitch(x, 5*FH, (i>0?(i+3):(states&0x3)+1), attr); x += 3*FW+FW/2; } #endif @@ -950,7 +939,7 @@ void logicalSwitchesTimerTick() #if defined(CPUARM) for (uint8_t fm=0; fmfunc == LS_FUNC_TIMER) { int16_t *lastValue = &LS_LAST_VALUE(fm, i); @@ -1064,7 +1053,7 @@ void logicalSwitchesReset() #if defined(CPUARM) for (uint8_t fm=0; fm #include "board.h" -#if !defined(PCBX9E) +#if defined(STM32F2) #include "dwt.h" // the old ST library that we use does not define DWT register for STM32F2xx #endif diff --git a/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt b/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt index b9409d1f32..bc19e329a9 100644 --- a/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt +++ b/radio/src/targets/common/arm/stm32/f2/CMakeLists.txt @@ -4,6 +4,7 @@ set(STM32LIB_DIR ${THIRDPARTY_DIR}/STM32F2xx_StdPeriph_Lib_V1.1.0/Libraries) include_directories(${STM32LIB_DIR}/STM32F2xx_StdPeriph_Driver/inc) include_directories(${STM32LIB_DIR}/CMSIS/Device/ST/STM32F2xx/Include) include_directories(${STM32LIB_DIR}/CMSIS/include) +add_definitions(-DSTM32F2) set(STM32LIB_SRC ${STM32LIB_SRC} CMSIS/Device/ST/STM32F2xx/Source/Templates/gcc_ride7/startup_stm32f2xx.s diff --git a/radio/src/targets/common/avr/board_avr.h b/radio/src/targets/common/avr/board_avr.h index 6d71233e49..e31cddfe88 100644 --- a/radio/src/targets/common/avr/board_avr.h +++ b/radio/src/targets/common/avr/board_avr.h @@ -19,6 +19,9 @@ */ // ADC driver +#define NUM_POTS 3 +#define NUM_SLIDERS 0 +#define NUM_XPOTS 0 enum Analogs { STICK1, STICK2, @@ -45,6 +48,75 @@ void adcPrepareBandgap(); void getADC(); void getADC_bandgap(); +// Keys driver +#define NUM_SWITCHES 7 +enum EnumKeys +{ + KEY_MENU, + KEY_ENTER=KEY_MENU, + KEY_EXIT, + KEY_DOWN, + KEY_UP, + KEY_RIGHT, + KEY_LEFT, + + TRM_BASE, + TRM_LH_DWN = TRM_BASE, + TRM_LH_UP, + TRM_LV_DWN, + TRM_LV_UP, + TRM_RV_DWN, + TRM_RV_UP, + TRM_RH_DWN, + TRM_RH_UP, + TRM_LAST = TRM_RH_UP, + +#if ROTARY_ENCODERS > 0 || defined(ROTARY_ENCODER_NAVIGATION) + BTN_REa, +#endif +#if ROTARY_ENCODERS > 0 + BTN_REb, +#endif + + NUM_KEYS +}; + +enum EnumSwitches +{ + SW_ID0, + SW_ID1, + SW_ID2, + SW_THR, + SW_RUD, + SW_ELE, + SW_AIL, + SW_GEA, + SW_TRN, +}; +#define IS_3POS(sw) ((sw) == 0) +#define IS_TOGGLE(sw) ((sw) == SWSRC_TRN) +uint8_t keyState(uint8_t index); +uint8_t switchState(uint8_t index); + +// LCD driver +#define LCD_W 128 +#define LCD_H 64 +#define LCD_DEPTH 1 +void lcdRefresh(void); +#define lcdRefreshWait() +void lcdSetRefVolt(unsigned char val); +void lcdSetContrast(void); +void lcdInit(void); +#define lcdOff() + +#if defined(LCD_KS108) +void lcdRefreshSide(); +#endif + +#if defined(LCD_ST7920) +uint8_t lcdRefresh_ST7920(uint8_t full); +#endif + // USART driver (static register dispatcher) #define RXD_DDR1 DDRD #define RXD_DDR_PIN1 DDD2 diff --git a/radio/src/targets/gruvin9x/CMakeLists.txt b/radio/src/targets/gruvin9x/CMakeLists.txt index 65f7321d45..7d70504763 100644 --- a/radio/src/targets/gruvin9x/CMakeLists.txt +++ b/radio/src/targets/gruvin9x/CMakeLists.txt @@ -8,5 +8,10 @@ set(TARGET_DIR gruvin9x) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps) add_definitions(-DPCB${PCB} -DCPUM2560 -DROTARY_ENCODERS=2) set(TARGET_SRC ${TARGET_SRC} board.cpp) -set(GUI_SRC ${GUI_SRC} ${9X_GUI_SRC}) +set(GUI_SRC + ${GUI_SRC} + model_inputs_mixes.cpp + radio_diagkeys.cpp + radio_diaganas.cpp + ) set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/9x/lcd_driver.cpp) diff --git a/radio/src/targets/gruvin9x/board.cpp b/radio/src/targets/gruvin9x/board.cpp index c5340bc499..24a457e0ab 100644 --- a/radio/src/targets/gruvin9x/board.cpp +++ b/radio/src/targets/gruvin9x/board.cpp @@ -168,14 +168,16 @@ uint8_t keyDown() return ((~PINL) & 0x3F) || ROTENC_DOWN(); } -bool switchState(EnumKeys enuk) +uint8_t keyState(uint8_t index) { - uint8_t result = 0 ; + return keys[index].state(); +} - if (enuk < (int)DIM(keys)) - return keys[enuk].state() ? 1 : 0; - - switch(enuk){ +uint8_t switchState(uint8_t index) +{ + uint8_t result; + + switch (index) { case SW_ELE: result = PINC & (1<> 3; for (int i=1; i<7; i++) { - keys[enuk].input(in & (1< storage/datacopy.cpp + COMMAND python ${RADIO_DIRECTORY}/util/generate_datacopy.py datastructs.h -DPCBHORUS -DCPUARM -DCOLORLCD -DCPUARM -DBACKUP > storage/datacopy.cpp DEPENDS ${RADIO_DIRECTORY}/src/datastructs.h ${RADIO_DIRECTORY}/util/generate_datacopy.py ) diff --git a/radio/src/targets/horus/board.cpp b/radio/src/targets/horus/board.cpp index 426b9142a0..dfb94ae256 100644 --- a/radio/src/targets/horus/board.cpp +++ b/radio/src/targets/horus/board.cpp @@ -172,7 +172,7 @@ void boardInit() void boardOff() { - BACKLIGHT_OFF(); + BACKLIGHT_DISABLE(); while (pwrPressed()) { wdt_reset(); diff --git a/radio/src/targets/horus/board.h b/radio/src/targets/horus/board.h index e5e514bb58..008a1dc67a 100644 --- a/radio/src/targets/horus/board.h +++ b/radio/src/targets/horus/board.h @@ -77,7 +77,7 @@ extern "C" { extern uint16_t sessionTimer; #define SLAVE_MODE() (g_model.trainerMode == TRAINER_MODE_SLAVE) -#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_GPIO_DETECT, TRAINER_GPIO_PIN_DETECT) == Bit_RESET) +#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) // Board driver void boardInit(void); @@ -118,6 +118,7 @@ uint32_t sdMounted(void); #define SD_IS_HC() (0) #define SD_GET_SPEED() (0) #define sdInit() +#define sdMount() #define sdDone() #define SD_CARD_PRESENT() true #endif @@ -168,7 +169,82 @@ void init_trainer_capture(void); void stop_trainer_capture(void); // Keys driver +#define NUM_SWITCHES 8 +enum EnumKeys +{ + KEY_PGUP, + KEY_PGDN, + KEY_ENTER, + KEY_MODEL, + KEY_UP = KEY_MODEL, + KEY_EXIT, + KEY_DOWN = KEY_EXIT, + KEY_TELEM, + KEY_RIGHT = KEY_TELEM, + KEY_RADIO, + KEY_LEFT = KEY_RADIO, + + TRM_BASE, + TRM_LH_DWN = TRM_BASE, + TRM_LH_UP, + TRM_LV_DWN, + TRM_LV_UP, + TRM_RV_DWN, + TRM_RV_UP, + TRM_RH_DWN, + TRM_RH_UP, + TRM_LS_DWN, + TRM_LS_UP, + TRM_RS_DWN, + TRM_RS_UP, + TRM_LAST = TRM_RS_UP, + + NUM_KEYS +}; + +enum EnumSwitches +{ + SW_SA, + SW_SB, + SW_SC, + SW_SD, + SW_SE, + SW_SF, + SW_SG, + SW_SH +}; +#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) + +enum EnumSwitchesPositions +{ + SW_SA0, + SW_SA1, + SW_SA2, + SW_SB0, + SW_SB1, + SW_SB2, + SW_SC0, + SW_SC1, + SW_SC2, + SW_SD0, + SW_SD1, + SW_SD2, + SW_SE0, + SW_SE1, + SW_SE2, + SW_SF0, + SW_SF1, + SW_SF2, + SW_SG0, + SW_SG1, + SW_SG2, + SW_SH0, + SW_SH1, + SW_SH2, +}; void keysInit(void); +uint8_t keyState(uint8_t index); +uint32_t switchState(uint8_t index); uint32_t readKeys(void); uint32_t readTrims(void); #define TRIMS_PRESSED() (readTrims()) @@ -200,15 +276,19 @@ void watchdogInit(unsigned int duration); #define WAS_RESET_BY_WATCHDOG_OR_SOFTWARE() (RCC->CSR & (RCC_CSR_WDGRSTF | RCC_CSR_WWDGRSTF | RCC_CSR_SFTRSTF)) // ADC driver +#define NUM_POTS 3 +#define NUM_SLIDERS 4 +#define NUM_XPOTS 3 enum Analogs { STICK1, STICK2, STICK3, STICK4, - POT1, + POT_FIRST, + POT1 = POT_FIRST, POT2, POT3, - POT_LAST=POT3, + POT_LAST = POT3, SLIDER1, SLIDER2, SLIDER3, @@ -218,6 +298,8 @@ enum Analogs { MOUSE2, NUMBER_ANALOG }; +#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) +#define IS_SLIDER(x) ((x)>=SLIDER1 && (x)<=SLIDER4) extern uint16_t adcValues[NUMBER_ANALOG]; void adcInit(void); void adcRead(void); @@ -245,6 +327,9 @@ void ledRed(void); void ledBlue(void); // LCD driver +#define LCD_W 480 +#define LCD_H 272 +#define LCD_DEPTH 16 void lcdInit(void); void lcdRefresh(void); void DMAFillRect(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t color); @@ -253,12 +338,19 @@ void DMACopyAlphaBitmap(uint16_t * dest, uint16_t destw, uint16_t x, uint16_t y, void DMABitmapConvert(uint16_t * dest, const uint8_t * src, uint16_t w, uint16_t h, uint32_t format); void lcdStoreBackupBuffer(void); int lcdRestoreBackupBuffer(void); -void LCD_ControlLight(uint16_t dutyCycle); +void lcdSetContrast(); +#define lcdOff(...) +#define lcdSetRefVolt(...) +#define lcdRefreshWait(...) // Backlight driver -#define setBacklight(xx) LCD_ControlLight(xx) -#define backlightEnable() setBacklight(UNEXPECTED_SHUTDOWN() ? 100 : 100-g_eeGeneral.backlightBright) -#define backlightDisable() setBacklight(g_eeGeneral.blOffBright) +#if defined(SIMU) +#define backlightEnable(...) +#else +void backlightEnable(uint8_t dutyCycle); +#endif +#define BACKLIGHT_ENABLE() backlightEnable(UNEXPECTED_SHUTDOWN() ? 100 : 100-g_eeGeneral.backlightBright) +#define BACKLIGHT_DISABLE() backlightEnable(UNEXPECTED_SHUTDOWN() ? 100 : g_eeGeneral.blOffBright) #define isBacklightEnable() true // USB driver diff --git a/radio/src/targets/horus/delays.c b/radio/src/targets/horus/delays.c deleted file mode 100644 index 895e5f6eb7..0000000000 --- a/radio/src/targets/horus/delays.c +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -#include -#include "board.h" - -#define SYSTEM_TICKS_1US ((CFG_CPU_FREQ + 500000) / 1000000) // number of system ticks in 1us -#define SYSTEM_TICKS_01US ((CFG_CPU_FREQ + 5000000) / 10000000) // number of system ticks in 0.1us (rounding needed for sys frequencies that are not multiple of 10MHz) - -void delaysInit(void) -{ - CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; - DWT->CYCCNT = 0; - DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; -} - -void delay_01us(uint16_t nb) -{ - volatile uint32_t dwtStart = DWT->CYCCNT; - volatile uint32_t dwtTotal = (SYSTEM_TICKS_01US * nb) - 10; - while((DWT->CYCCNT - dwtStart) < dwtTotal); -} - -void delay_us(uint16_t nb) -{ - volatile uint32_t dwtStart = DWT->CYCCNT; - volatile uint32_t dwtTotal = (SYSTEM_TICKS_1US * nb) - 10; - while((DWT->CYCCNT - dwtStart) < dwtTotal); -} - -void delay_ms(uint32_t ms) -{ - while(ms--) { - delay_us(1000); - } -} diff --git a/radio/src/targets/horus/hal.h b/radio/src/targets/horus/hal.h index f1df068a3a..a984aa83df 100644 --- a/radio/src/targets/horus/hal.h +++ b/radio/src/targets/horus/hal.h @@ -312,12 +312,12 @@ #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_DMA1) #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM3 #define TRAINER_GPIO GPIOC -#define TRAINER_GPIO_PIN_IN GPIO_Pin_6 // PC.06 -#define TRAINER_GPIO_PinSource_IN GPIO_PinSource6 -#define TRAINER_GPIO_PIN_OUT GPIO_Pin_7 // PC.07 -#define TRAINER_GPIO_PinSource_OUT GPIO_PinSource7 -#define TRAINER_GPIO_DETECT GPIOB -#define TRAINER_GPIO_PIN_DETECT GPIO_Pin_4 // PB.04 +#define TRAINER_IN_GPIO_PIN GPIO_Pin_6 // PC.06 +#define TRAINER_IN_GPIO_PinSource GPIO_PinSource6 +#define TRAINER_OUT_GPIO_PIN GPIO_Pin_7 // PC.07 +#define TRAINER_OUT_GPIO_PinSource GPIO_PinSource7 +#define TRAINER_DETECT_GPIO GPIOB +#define TRAINER_DETECT_GPIO_PIN GPIO_Pin_4 // PB.04 #define TRAINER_TIMER TIM3 #define TRAINER_TIMER_IRQn TIM3_IRQn #define TRAINER_TIMER_IRQHandler TIM3_IRQHandler diff --git a/radio/src/targets/horus/keys_driver.cpp b/radio/src/targets/horus/keys_driver.cpp index 8a1c32c02e..1603e7e19b 100644 --- a/radio/src/targets/horus/keys_driver.cpp +++ b/radio/src/targets/horus/keys_driver.cpp @@ -115,10 +115,10 @@ void readKeysAndTrims() { register uint32_t i; - uint8_t enuk = 0; + uint8_t index = 0; uint32_t in = readKeys(); for (i = 0; i < TRM_BASE; i++) { - keys[enuk++].input(in & (1 << i)); + keys[index++].input(in & (1 << i)); } static rotenc_t rePreviousValue; @@ -145,7 +145,7 @@ void readKeysAndTrims() in = readTrims(); for (i = 1; i < 4096; i <<= 1) { - keys[enuk++].input(in & i); + keys[index++].input(in & i); } } @@ -181,13 +181,16 @@ void readKeysAndTrims() break #if !defined(BOOT) -bool switchState(EnumKeys enuk) +uint8_t keyState(uint8_t index) +{ + return keys[index].state(); +} + +uint32_t switchState(uint8_t index) { register uint32_t xxx = 0; - - if (enuk < (int) DIM(keys)) return keys[enuk].state() ? 1 : 0; - - switch ((uint8_t) enuk) { + + switch (index) { ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); @@ -200,7 +203,7 @@ bool switchState(EnumKeys enuk) break; } - // TRACE("switch %d => %d", enuk, xxx); + // TRACE("switch %d => %d", index, xxx); return xxx; } #endif diff --git a/radio/src/targets/horus/lcd_driver.cpp b/radio/src/targets/horus/lcd_driver.cpp index ec9fc30114..afc6f8bddc 100644 --- a/radio/src/targets/horus/lcd_driver.cpp +++ b/radio/src/targets/horus/lcd_driver.cpp @@ -318,9 +318,9 @@ void LCD_LayerInit() LTDC_DitherCmd(ENABLE); } -void LCD_ControlLight(uint16_t dutyCycle) +void backlightEnable(uint8_t dutyCycle) { - static uint16_t existingDutyCycle; + static uint8_t existingDutyCycle; if (dutyCycle == existingDutyCycle || dutyCycle < 5) { return; @@ -374,11 +374,12 @@ void LCD_Init(void) LCD_Init_LTDC(); - //config backlight + // TODO split backlight from LCD + // Config backlight LCD_Backlight_Config(); - //Max Value - LCD_ControlLight(100); + // Max Value + backlightEnable(100); } BitmapBuffer lcdBuffer1(BMP_RGB565, LCD_W, LCD_H, (uint16_t *)LCD_FIRST_FRAME_BUFFER); diff --git a/radio/src/targets/horus/led_driver.cpp b/radio/src/targets/horus/led_driver.cpp index 4ae8f1ebd3..c398805f3d 100644 --- a/radio/src/targets/horus/led_driver.cpp +++ b/radio/src/targets/horus/led_driver.cpp @@ -18,7 +18,7 @@ * GNU General Public License for more details. */ -#include "board.h" +#include "opentx.h" void ledOn() { diff --git a/radio/src/targets/horus/trainer_driver.cpp b/radio/src/targets/horus/trainer_driver.cpp index eb92c79028..66058a58da 100644 --- a/radio/src/targets/horus/trainer_driver.cpp +++ b/radio/src/targets/horus/trainer_driver.cpp @@ -24,10 +24,10 @@ void trainerSendNextFrame(); void init_trainer_ppm() { - GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_GPIO_PinSource_OUT, TRAINER_GPIO_AF); + GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_OUT_GPIO_PinSource, TRAINER_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_OUT; + GPIO_InitStructure.GPIO_Pin = TRAINER_OUT_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -69,13 +69,13 @@ void init_trainer_capture() { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_IN; + GPIO_InitStructure.GPIO_Pin = TRAINER_IN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(TRAINER_GPIO, &GPIO_InitStructure); - GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_GPIO_PinSource_IN, TRAINER_GPIO_AF); + GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_IN_GPIO_PinSource, TRAINER_GPIO_AF); TRAINER_TIMER->ARR = 0xFFFF; TRAINER_TIMER->PSC = TRAINER_TIMER_FREQ / 2000000 - 1; // 0.5uS diff --git a/radio/src/targets/mega2560/CMakeLists.txt b/radio/src/targets/mega2560/CMakeLists.txt index a2569c4da9..682f07379b 100644 --- a/radio/src/targets/mega2560/CMakeLists.txt +++ b/radio/src/targets/mega2560/CMakeLists.txt @@ -10,7 +10,12 @@ set(TARGET_DIR mega2560) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps) add_definitions(-DPCB${PCB} -DCPUM2560 -DROTARY_ENCODERS=2) set(TARGET_SRC ${TARGET_SRC} board.cpp) -set(GUI_SRC ${GUI_SRC} ${9X_GUI_SRC}) +set(GUI_SRC + ${GUI_SRC} + model_inputs_mixes.cpp + radio_diagkeys.cpp + radio_diaganas.cpp + ) set(FIRMWARE_SRC ${FIRMWARE_SRC} targets/9x/lcd_driver.cpp) if(PWRMANAGE) add_definitions(-DPWRMANAGE) diff --git a/radio/src/targets/mega2560/board.cpp b/radio/src/targets/mega2560/board.cpp index 743cbf6113..1c67b24bed 100644 --- a/radio/src/targets/mega2560/board.cpp +++ b/radio/src/targets/mega2560/board.cpp @@ -94,14 +94,16 @@ uint8_t keyDown() return ((~PINL) & 0x3F) || ROTENC_DOWN(); } -bool switchState(EnumKeys enuk) +uint8_t keyState(uint8_t index) { - uint8_t result = 0 ; + return keys[index].state(); +} - if (enuk < (int)DIM(keys)) - return keys[enuk].state() ? 1 : 0; - - switch(enuk){ +uint8_t switchState(uint8_t index) +{ + uint8_t result = 0; + + switch (index) { case SW_ELE: result = !(PINL & (1<> 3; for (int i=1; i<7; i++) { - keys[enuk].input(in & (1<id == id) { @@ -215,7 +215,7 @@ uint8_t OpenTxSimulator::getSensorInstance(uint16_t id, uint8_t defaultValue) uint16_t OpenTxSimulator::getSensorRatio(uint16_t id) { #if defined(TELEMETRY_FRSKY_SPORT) - for (int i = 0; iid == id) { diff --git a/radio/src/targets/simu/simpgmspace.cpp b/radio/src/targets/simu/simpgmspace.cpp index 70843ae4fc..e907eabf3a 100644 --- a/radio/src/targets/simu/simpgmspace.cpp +++ b/radio/src/targets/simu/simpgmspace.cpp @@ -17,6 +17,7 @@ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ + #include "opentx.h" #include #include @@ -52,7 +53,7 @@ pthread_t main_thread_pid; uint8_t main_thread_running = 0; char * main_thread_error = NULL; -#if defined(CPUSTM32) +#if defined(STM32) uint32_t Peri1_frequency, Peri2_frequency; GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; TIM_TypeDef tim1, tim2, tim3, tim4, tim5, tim6, tim7, tim8, tim9, tim10; @@ -120,7 +121,7 @@ uint16_t getTmr2MHz() void simuInit() { -#if defined(CPUSTM32) +#if defined(STM32) RCC->CSR = 0; #endif @@ -169,7 +170,8 @@ void simuInit() void simuSetKey(uint8_t key, bool state) { - // TRACE("simuSetKey(%d, %d)", key, state); + // if (state) TRACE("simuSetKey(%d, %d)", key, state); + switch (key) { #if !defined(PCBHORUS) KEY_CASE(KEY_MENU, KEYS_GPIO_REG_MENU, KEYS_GPIO_PIN_MENU) @@ -230,6 +232,7 @@ void simuSetTrim(uint8_t trim, bool state) void simuSetSwitch(uint8_t swtch, int8_t state) { // TRACE("simuSetSwitch(%d, %d)", swtch, state); + switch (swtch) { #if defined(PCBFLAMENCO) // SWITCH_3_CASE(0, SWITCHES_GPIO_REG_A_L, SWITCHES_GPIO_REG_A_H, SWITCHES_GPIO_PIN_A_L, SWITCHES_GPIO_PIN_A_H) @@ -243,11 +246,15 @@ void simuSetSwitch(uint8_t swtch, int8_t state) SWITCH_3_CASE(1, SWITCHES_GPIO_REG_B_L, SWITCHES_GPIO_REG_B_H, SWITCHES_GPIO_PIN_B_L, SWITCHES_GPIO_PIN_B_H) SWITCH_3_CASE(2, SWITCHES_GPIO_REG_C_L, SWITCHES_GPIO_REG_C_H, SWITCHES_GPIO_PIN_C_L, SWITCHES_GPIO_PIN_C_H) SWITCH_3_CASE(3, SWITCHES_GPIO_REG_D_L, SWITCHES_GPIO_REG_D_H, SWITCHES_GPIO_PIN_D_L, SWITCHES_GPIO_PIN_D_H) +#if !defined(PCBX7D) SWITCH_3_CASE(4, SWITCHES_GPIO_REG_E_L, SWITCHES_GPIO_REG_E_H, SWITCHES_GPIO_PIN_E_L, SWITCHES_GPIO_PIN_E_H) +#endif SWITCH_CASE(5, SWITCHES_GPIO_REG_F, SWITCHES_GPIO_PIN_F) +#if !defined(PCBX7D) SWITCH_3_CASE(6, SWITCHES_GPIO_REG_G_L, SWITCHES_GPIO_REG_G_H, SWITCHES_GPIO_PIN_G_L, SWITCHES_GPIO_PIN_G_H) +#endif SWITCH_CASE(7, SWITCHES_GPIO_REG_H, SWITCHES_GPIO_PIN_H) - #if defined(PCBX9E) +#if defined(PCBX9E) SWITCH_3_CASE(8, SWITCHES_GPIO_REG_I_L, SWITCHES_GPIO_REG_I_H, SWITCHES_GPIO_PIN_I_L, SWITCHES_GPIO_PIN_I_H) SWITCH_3_CASE(9, SWITCHES_GPIO_REG_J_L, SWITCHES_GPIO_REG_J_H, SWITCHES_GPIO_PIN_J_L, SWITCHES_GPIO_PIN_J_H) SWITCH_3_CASE(10, SWITCHES_GPIO_REG_K_L, SWITCHES_GPIO_REG_K_H, SWITCHES_GPIO_PIN_K_L, SWITCHES_GPIO_PIN_K_H) @@ -258,7 +265,7 @@ void simuSetSwitch(uint8_t swtch, int8_t state) SWITCH_3_CASE(15, SWITCHES_GPIO_REG_P_L, SWITCHES_GPIO_REG_P_H, SWITCHES_GPIO_PIN_P_L, SWITCHES_GPIO_PIN_P_H) SWITCH_3_CASE(16, SWITCHES_GPIO_REG_Q_L, SWITCHES_GPIO_REG_Q_H, SWITCHES_GPIO_PIN_Q_L, SWITCHES_GPIO_PIN_Q_H) SWITCH_3_CASE(17, SWITCHES_GPIO_REG_R_L, SWITCHES_GPIO_REG_R_H, SWITCHES_GPIO_PIN_R_L, SWITCHES_GPIO_PIN_R_H) - #endif +#endif #elif defined(PCBSKY9X) SWITCH_CASE(0, PIOC->PIO_PDSR, 1<<20) SWITCH_CASE(1, PIOA->PIO_PDSR, 1<<15) @@ -1315,7 +1322,7 @@ uint32_t pwrCheck() { return true; } void pwrOff() { } #endif -#if defined(CPUSTM32) +#if defined(STM32) void pwrInit() { } int usbPlugged() { return false; } void USART_DeInit(USART_TypeDef* ) { } @@ -1376,21 +1383,7 @@ void unlockFlash() { } void lockFlash() { } void writeFlash(uint32_t *address, uint32_t *buffer) { SIMU_SLEEP(100); } uint32_t isBootloaderStart(const void *block) { return 1; } -#if defined(PCBX9DP) || defined(PCBX9E) -void turnBacklightOn(uint8_t level, uint8_t color) -{ - TIM4->CCR4 = (100-level)*color; - TIM4->CCR2 = (100-level)*(100-color); -} - -void turnBacklightOff(void) -{ - TIM4->CCR4 = 0; - TIM4->CCR2 = 0; -} -#endif - -#endif // #if defined(PCBTARANIS) +#endif // defined(PCBTARANIS) #if defined(PCBFLAMENCO) void i2cWriteTW8823(unsigned char, unsigned char) { } diff --git a/radio/src/targets/simu/simpgmspace.h b/radio/src/targets/simu/simpgmspace.h index 07ee28a8aa..b5350132ec 100644 --- a/radio/src/targets/simu/simpgmspace.h +++ b/radio/src/targets/simu/simpgmspace.h @@ -86,7 +86,7 @@ typedef const uint8_t pm_uint8_t; typedef const int16_t pm_int16_t; typedef const int8_t pm_int8_t; -#if defined(CPUSTM32) +#if defined(STM32) extern GPIO_TypeDef gpioa, gpiob, gpioc, gpiod, gpioe, gpiof, gpiog, gpioh, gpioi, gpioj; extern TIM_TypeDef tim1, tim2, tim3, tim4, tim5, tim6, tim7, tim8, tim9, tim10; extern USART_TypeDef Usart0, Usart1, Usart2, Usart3, Usart4; @@ -349,6 +349,7 @@ extern uint32_t Master_frequency; #define NVIC_EnableIRQ(x) #define NVIC_DisableIRQ(x) #define NVIC_SetPriority(...) +#define NVIC_SystemReset() exit(0) #define __disable_irq() #define __enable_irq() #endif @@ -442,7 +443,7 @@ OS_TID CoCreateTask(FUNCPtr task, void *argv, uint32_t parameter, void * stk, ui #define UART3_Stop(...) #define USART_GetITStatus(...) 0 -#if defined(CPUSTM32) +#if defined(STM32) inline void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct) { } #define TIM_DeInit(...) #define TIM_SetCompare2(...) @@ -484,9 +485,7 @@ extern char simuSdDirectory[1024]; #define sdPoll10ms() #define sd_card_ready() (true) #if !defined(SIMU_DISKIO) - #define sdMounted() (true) + #define sdMounted() (true) #endif -inline void ledOff() { } - #endif // _SIMPGMSPACE_H_ diff --git a/radio/src/targets/sky9x/CMakeLists.txt b/radio/src/targets/sky9x/CMakeLists.txt index a99d8bb8c8..a1dd8d645b 100644 --- a/radio/src/targets/sky9x/CMakeLists.txt +++ b/radio/src/targets/sky9x/CMakeLists.txt @@ -31,6 +31,7 @@ else() set(LINKER_SCRIPT targets/sky9x/sam3s4c_flash.ld) endif() endif() + set(MCU cortex-m3) set(SDCARD YES) set(HAPTIC YES) @@ -38,11 +39,26 @@ set(EEPROM EEPROM_RAW) set(GUI_DIR 128x64) set(TARGET_DIR sky9x) set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps) + add_definitions(-DPCBSKY9X -DPPM_PIN_SERIAL) add_definitions(-DAUDIO -DVOICE -DRTCLOCK -DVARIO) add_definitions(-DEEPROM_VARIANT=0) -set(GUI_SRC ${GUI_SRC} ${9X_GUI_SRC} radio_hardware.cpp view_telemetry.cpp view_text.cpp view_about.cpp) + +set(GUI_SRC + ${GUI_SRC} + model_inputs.cpp + model_mixes.cpp + model_display.cpp + radio_diagkeys.cpp + radio_diaganas.cpp + radio_hardware.cpp + view_telemetry.cpp + view_text.cpp + view_about.cpp + ) + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} core_cm3.c board_lowlevel.c crt.c vectors_sam3s.c) + set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} lcd_driver.cpp pwr_driver.cpp usb/device/core/USBD_UDP.c usb/device/core/USBDDriver.c usb/device/massstorage/MSDDriver.c usb/device/massstorage/MSDDStateMachine.c usb/device/massstorage/MSDLun.c @@ -51,11 +67,11 @@ set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} lcd_driver.cpp pwr_driver.cpp usb/common/core/USBGetDescriptorRequest.c usb/common/core/USBSetAddressRequest.c usb/common/core/USBSetConfigurationRequest.c usb/common/core/USBConfigurationDescriptor.c usb/common/core/USBGenericDescriptor.c MEDSdcard.c ) + set(TARGET_SRC ${TARGET_SRC} board.cpp telemetry_driver.cpp - serial2_driver.cpp adc_driver.cpp eeprom_driver.cpp pulses_driver.cpp @@ -66,5 +82,7 @@ set(TARGET_SRC sdcard_driver.cpp massstorage.cpp ) + +set(SERIAL2_DRIVER serial2_driver.cpp) set(SRC ${SRC} debug.cpp) set(FIRMWARE_SRC ${FIRMWARE_SRC} loadboot.cpp) diff --git a/radio/src/targets/sky9x/board.h b/radio/src/targets/sky9x/board.h index 4e3d820f1b..e5f0ba2341 100644 --- a/radio/src/targets/sky9x/board.h +++ b/radio/src/targets/sky9x/board.h @@ -35,7 +35,54 @@ extern uint16_t ResetReason; void boardInit(void); #define boardOff() pwrOff() -// Keys +// Keys driver +#define NUM_SWITCHES 7 +enum EnumKeys +{ + KEY_MENU, + KEY_ENTER=KEY_MENU, + KEY_EXIT, + KEY_DOWN, + KEY_UP, + KEY_RIGHT, + KEY_LEFT, + + TRM_BASE, + TRM_LH_DWN = TRM_BASE, + TRM_LH_UP, + TRM_LV_DWN, + TRM_LV_UP, + TRM_RV_DWN, + TRM_RV_UP, + TRM_RH_DWN, + TRM_RH_UP, + TRM_LAST = TRM_RH_UP, + +#if ROTARY_ENCODERS > 0 || defined(ROTARY_ENCODER_NAVIGATION) + BTN_REa, +#endif +#if ROTARY_ENCODERS > 0 + BTN_REb, +#endif + + NUM_KEYS +}; + +enum EnumSwitches +{ + SW_ID0, + SW_ID1, + SW_ID2, + SW_THR, + SW_RUD, + SW_ELE, + SW_AIL, + SW_GEA, + SW_TRN, +}; +#define IS_3POS(sw) ((sw) == 0) +#define IS_TOGGLE(sw) ((sw) == SWSRC_TRN) + #if defined(REVA) #define KEYS_GPIO_REG_MENU PIOB->PIO_PDSR #define KEYS_GPIO_REG_EXIT PIOA->PIO_PDSR @@ -113,6 +160,17 @@ void boardInit(void); #define TRIMS_GPIO_PIN_RHR 0x00000200 #endif +// LCD driver +#define LCD_W 128 +#define LCD_H 64 +#define LCD_DEPTH 1 +void lcdInit(void); +void lcdRefresh(void); +#define lcdRefreshWait() +void lcdSetRefVolt(uint8_t val); +void lcdSetContrast(void); + +// USB driver void usbMassStorage(); #define PIN_ENABLE 0x001 @@ -170,8 +228,10 @@ void init_trainer_capture(); void writeFlash(uint32_t * address, uint32_t * buffer); // Keys driver -extern uint32_t readKeys(); -extern uint32_t readTrims(); +uint8_t keyState(uint8_t index); +uint32_t switchState(uint8_t index); +uint32_t readKeys(void); +uint32_t readTrims(void); #define TRIMS_PRESSED() readTrims() #define KEYS_PRESSED() readKeys() @@ -206,7 +266,7 @@ extern "C" { #endif // WDT driver -#if defined(SIMU) +#if defined(WATCHDOG_DISABLED) || defined(SIMU) #define wdt_disable() #define wdt_enable(x) #define wdt_reset() @@ -217,18 +277,23 @@ extern "C" { #endif // Backlight driver -#define setBacklight(xx) (PWM->PWM_CH_NUM[0].PWM_CDTYUPD = xx) #define backlightEnable() (PWM->PWM_CH_NUM[0].PWM_CDTY = g_eeGeneral.backlightBright) #define backlightDisable() (PWM->PWM_CH_NUM[0].PWM_CDTY = 100) #define isBacklightEnable() (PWM->PWM_CH_NUM[0].PWM_CDTY != 100) +#define BACKLIGHT_ENABLE() backlightEnable() +#define BACKLIGHT_DISABLE() backlightDisable() // ADC driver +#define NUM_POTS 3 +#define NUM_SLIDERS 0 +#define NUM_XPOTS 0 enum Analogs { STICK1, STICK2, STICK3, STICK4, - POT1, + POT_FIRST, + POT1 = POT_FIRST, POT2, POT3, POT_LAST = POT3, @@ -238,6 +303,8 @@ enum Analogs { #endif NUMBER_ANALOG }; +#define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) +#define IS_SLIDER(x) false void adcInit(); void adcRead(void); uint16_t getAnalogValue(uint8_t index); diff --git a/radio/src/targets/sky9x/keys_driver.cpp b/radio/src/targets/sky9x/keys_driver.cpp index d75b4d374d..75c04f49b5 100644 --- a/radio/src/targets/sky9x/keys_driver.cpp +++ b/radio/src/targets/sky9x/keys_driver.cpp @@ -113,34 +113,34 @@ void readKeysAndTrims() keys[BTN_REa].input(REA_DOWN()); #endif - uint8_t enuk = KEY_MENU; + uint8_t index = KEY_MENU; uint8_t in = readKeys(); for (i = 1; i < 7; i++) { - keys[enuk].input(in & (1 << i)); - ++enuk; + keys[index].input(in & (1 << i)); + ++index; } in = readTrims(); for (i = 1; i < 256; i <<= 1) { - keys[enuk].input(in & i); - ++enuk; + keys[index].input(in & i); + ++index; } } -bool switchState(EnumKeys enuk) +uint8_t keyState(uint8_t index) { - register uint32_t a; - register uint32_t c; + return keys[index].state(); +} + +uint32_t switchState(uint8_t index) +{ + register uint32_t a = PIOA->PIO_PDSR; + register uint32_t c = PIOC->PIO_PDSR; uint32_t xxx = 0; - if (enuk < (int) DIM(keys)) return keys[enuk].state() ? 1 : 0; - - a = PIOA->PIO_PDSR ; - c = PIOC->PIO_PDSR ; - - switch ((uint8_t) enuk) { + switch (index) { #if defined(REVA) case SW_ELE: xxx = a & 0x00000100; // ELE_DR PA8 diff --git a/radio/src/targets/sky9x/lcd_driver.cpp b/radio/src/targets/sky9x/lcd_driver.cpp index 05d3d705b1..2b4957ce38 100644 --- a/radio/src/targets/sky9x/lcd_driver.cpp +++ b/radio/src/targets/sky9x/lcd_driver.cpp @@ -18,287 +18,287 @@ * GNU General Public License for more details. */ -#include "opentx.h" - -// LCD i/o pins -// LCD_RES PC27 -// LCD_CS1 PC26 -// LCD_E PC12 -// LCD_RnW PC13 -// LCD_A0 PC15 -// LCD_D0 PC0 -// LCD_D1 PC7 -// LCD_D2 PC6 -// LCD_D3 PC5 -// LCD_D4 PC4 -// LCD_D5 PC3 -// LCD_D6 PC2 -// LCD_D7 PC1 - -#define LCD_DATA 0x000000FFL -#if !defined(REVA) -#define LCD_A0 0x00000080L -#else -#define LCD_A0 0x00008000L -#endif -#define LCD_RnW 0x00002000L -#define LCD_E 0x00001000L -#define LCD_CS1 0x04000000L -#define LCD_RES 0x08000000L - -// Lookup table for prototype board -#if defined(REVA) -const uint8_t Lcd_lookup[] = -{ - 0x00,0x01,0x80,0x81,0x40,0x41,0xC0,0xC1,0x20,0x21,0xA0,0xA1,0x60,0x61,0xE0,0xE1, - 0x10,0x11,0x90,0x91,0x50,0x51,0xD0,0xD1,0x30,0x31,0xB0,0xB1,0x70,0x71,0xF0,0xF1, - 0x08,0x09,0x88,0x89,0x48,0x49,0xC8,0xC9,0x28,0x29,0xA8,0xA9,0x68,0x69,0xE8,0xE9, - 0x18,0x19,0x98,0x99,0x58,0x59,0xD8,0xD9,0x38,0x39,0xB8,0xB9,0x78,0x79,0xF8,0xF9, - 0x04,0x05,0x84,0x85,0x44,0x45,0xC4,0xC5,0x24,0x25,0xA4,0xA5,0x64,0x65,0xE4,0xE5, - 0x14,0x15,0x94,0x95,0x54,0x55,0xD4,0xD5,0x34,0x35,0xB4,0xB5,0x74,0x75,0xF4,0xF5, - 0x0C,0x0D,0x8C,0x8D,0x4C,0x4D,0xCC,0xCD,0x2C,0x2D,0xAC,0xAD,0x6C,0x6D,0xEC,0xED, - 0x1C,0x1D,0x9C,0x9D,0x5C,0x5D,0xDC,0xDD,0x3C,0x3D,0xBC,0xBD,0x7C,0x7D,0xFC,0xFD, - 0x02,0x03,0x82,0x83,0x42,0x43,0xC2,0xC3,0x22,0x23,0xA2,0xA3,0x62,0x63,0xE2,0xE3, - 0x12,0x13,0x92,0x93,0x52,0x53,0xD2,0xD3,0x32,0x33,0xB2,0xB3,0x72,0x73,0xF2,0xF3, - 0x0A,0x0B,0x8A,0x8B,0x4A,0x4B,0xCA,0xCB,0x2A,0x2B,0xAA,0xAB,0x6A,0x6B,0xEA,0xEB, - 0x1A,0x1B,0x9A,0x9B,0x5A,0x5B,0xDA,0xDB,0x3A,0x3B,0xBA,0xBB,0x7A,0x7B,0xFA,0xFB, - 0x06,0x07,0x86,0x87,0x46,0x47,0xC6,0xC7,0x26,0x27,0xA6,0xA7,0x66,0x67,0xE6,0xE7, - 0x16,0x17,0x96,0x97,0x56,0x57,0xD6,0xD7,0x36,0x37,0xB6,0xB7,0x76,0x77,0xF6,0xF7, - 0x0E,0x0F,0x8E,0x8F,0x4E,0x4F,0xCE,0xCF,0x2E,0x2F,0xAE,0xAF,0x6E,0x6F,0xEE,0xEF, - 0x1E,0x1F,0x9E,0x9F,0x5E,0x5F,0xDE,0xDF,0x3E,0x3F,0xBE,0xBF,0x7E,0x7F,0xFE,0xFF -}; -#endif - -void lcdSendCtl(uint8_t val) -{ - register Pio *pioptr; - -#if defined(REVA) - pioptr = PIOC; - pioptr->PIO_CODR = LCD_CS1; // Select LCD - pioptr->PIO_CODR = LCD_A0; // Control - pioptr->PIO_CODR = LCD_RnW; // Write - pioptr->PIO_ODSR = Lcd_lookup[val]; -#else - pioptr = PIOC; - #if !defined(REVX) - pioptr->PIO_CODR = LCD_CS1; // Select LCD - #endif - PIOA->PIO_CODR = LCD_A0; - #if !defined(REVX) - pioptr->PIO_CODR = LCD_RnW; // Write - #endif - pioptr->PIO_ODSR = val; -#endif - - pioptr->PIO_SODR = LCD_E; // Start E pulse - // Need a delay here (250nS) - TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) - while ( TC0->TC_CHANNEL[0].TC_CV < 9 ) // Value depends on MCK/2 (used 18MHz) - { - // Wait - } - pioptr->PIO_CODR = LCD_E; // End E pulse -#if defined(REVA) - pioptr->PIO_SODR = LCD_A0; // Data -#else - PIOA->PIO_SODR = LCD_A0; // Data -#endif - -#if !defined(REVX) - pioptr->PIO_SODR = LCD_CS1; // Deselect LCD -#endif -} - -void lcdInit() -{ - register Pio *pioptr; - // /home/thus/txt/datasheets/lcd/KS0713.pdf - // ~/txt/flieger/ST7565RV17.pdf from http://www.glyn.de/content.asp?wdid=132&sid= - - // read the inputs, and lock the LCD lines - lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () - lcdLock = 1; - -#if defined(REVA) - pioptr = PIOC; - pioptr->PIO_PER = 0x0C00B0FFL; // Enable bits 27,26,15,13,12,7-0 - pioptr->PIO_CODR = LCD_E | LCD_RnW | LCD_A0; - pioptr->PIO_SODR = LCD_RES | LCD_CS1; - pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output - pioptr->PIO_OWER = 0x000000FFL; // Allow write to ls 8 bits in ODSR -#else - configure_pins( LCD_A0, PIN_ENABLE | PIN_LOW | PIN_OUTPUT | PIN_PORTA | PIN_NO_PULLUP ); - pioptr = PIOC; -#if defined(REVX) - pioptr->PIO_PER = PIO_PC27 | PIO_PC12 | 0xFF; - pioptr->PIO_CODR = LCD_E; - pioptr->PIO_CODR = LCD_RnW | LCD_CS1; // No longer needed, used elsewhere -#else - pioptr->PIO_PER = PIO_PC27 | PIO_PC26 | PIO_PC13 | PIO_PC12 | 0xFF; - pioptr->PIO_CODR = LCD_E | LCD_RnW | LCD_CS1; -#endif - pioptr->PIO_SODR = LCD_RES; - pioptr->PIO_OER = PIO_PC27 | PIO_PC26 | PIO_PC13 | PIO_PC12 | 0xFF; // Set bits 27,26,13,12,7-0 output - pioptr->PIO_OWER = 0x000000FFL; // Allow write to ls 8 bits in ODSR -#endif - - TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) - pioptr->PIO_CODR = LCD_RES; // Reset LCD - while ( TC0->TC_CHANNEL[0].TC_CV < 500 ) ; // > 10us, Value depends on MCK/2 (used 18MHz) - TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) - pioptr->PIO_SODR = LCD_RES; // Remove LCD reset - while ( TC0->TC_CHANNEL[0].TC_CV < 27000 ) ; // 1500us, Value depends on MCK/2 (used 18MHz) - lcdSendCtl(0xe2); //Initialize the internal functions - lcdSendCtl(0xae); //DON = 0: display OFF - lcdSendCtl(0xa1); //ADC = 1: reverse direction(SEG132->SEG1) - lcdSendCtl(0xA6); //REV = 0: non-reverse display - lcdSendCtl(0xA4); //EON = 0: normal display. non-entire - lcdSendCtl(0xA2); // Select LCD bias=0 - lcdSendCtl(0xC0); //SHL = 0: normal direction (COM1->COM64) - lcdSendCtl(0x2F); //Control power circuit operation VC=VR=VF=1 - lcdSendCtl(0x25); //Select int resistance ratio R2 R1 R0 =5 - lcdSendCtl(0x81); //Set reference voltage Mode - lcdSendCtl(0x22); // 24 SV5 SV4 SV3 SV2 SV1 SV0 = 0x18 - -#if defined(REVX) - // 200mS delay (only if not wdt reset) - if ( ( ( ResetReason & RSTC_SR_RSTTYP ) != (2 << 8) ) && !unexpectedShutdown ) { - for (uint32_t j = 0; j < 100; j += 1 ) { - TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) - while ( TC0->TC_CHANNEL[0].TC_CV < 36000 ) { - // Value depends on MCK/2 (used 18MHz) give 2mS delay - wdt_reset(); // Wait - } - } - } -#endif - - lcdSendCtl(0xAF); // DON = 1: display ON - -#if defined(REVA) - pioptr->PIO_ODR = 0x0000003CL; // Set bits 2, 3, 4, 5 input - pioptr->PIO_PUER = 0x0000003CL; // Set bits 2, 3, 4, 5 with pullups - pioptr->PIO_ODSR = 0; // Drive D0 low -#else - pioptr->PIO_ODR = 0x0000003AL; // Set bits 1, 3, 4, 5 input - pioptr->PIO_PUER = 0x0000003AL; // Set bits 1, 3, 4, 5 with pullups - pioptr->PIO_ODSR = 0; // Drive D0 low -#endif - - lcdLock = 0; -} - -void lcdSetRefVolt(uint8_t val) -{ - register Pio *pioptr; - pioptr = PIOC; - - // read the inputs, and lock the LCD lines - lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () - lcdLock = 1; - - pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output - - lcdSendCtl(0x81); - if ( val == 0 ) - { - val = 0x22; - } - lcdSendCtl(val); - -#if defined(REVA) - pioptr->PIO_ODR = 0x000000FEL; // Set bits 2, 3, 4, 5 input - pioptr->PIO_PUER = 0x000000FEL; // Set bits 2, 3, 4, 5 with pullups -#else - pioptr->PIO_ODR = 0x000000FEL; // Set bits 1, 3, 4, 5 input - pioptr->PIO_PUER = 0x000000FEL; // Set bits 1, 3, 4, 5 with pullups -#endif - - pioptr->PIO_ODSR = 0; // Drive D0 low - lcdLock = 0; -} - -void lcdRefresh() -{ - register Pio *pioptr; - register uint8_t *p = displayBuf; - register uint32_t y; - register uint32_t x; - register uint32_t z; - register uint32_t ebit; -#if defined(REVA) - register uint8_t *lookup; - lookup = (uint8_t *) Lcd_lookup; -#endif - - ebit = LCD_E; - -#if !defined(REVA) - pioptr = PIOA; - pioptr->PIO_PER = 0x00000080; // Enable bit 7 (LCD-A0) - pioptr->PIO_OER = 0x00000080;// Set bit 7 output -#endif - - // read the inputs, and lock the LCD lines - lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () - lcdLock = 1; - - pioptr = PIOC; -#if defined(REVA) - pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output -#else - pioptr->PIO_OER = 0x0C0030FFL; // Set bits 27,26,15,13,12,7-0 output -#endif - for (y = 0; y < 8; y++) { - lcdSendCtl(g_eeGeneral.optrexDisplay ? 0 : 0x04); - lcdSendCtl(0x10); //column addr 0 - lcdSendCtl(y | 0xB0); //page addr y - -#if !defined(REVX) - pioptr->PIO_CODR = LCD_CS1; // Select LCD -#endif - PIOA->PIO_SODR = LCD_A0; // Data -#if !defined(REVX) - pioptr->PIO_CODR = LCD_RnW; // Write -#endif - -#if defined(REVA) - x = lookup[*p]; -#else - x = *p; -#endif - for (z = 0; z < LCD_W; z += 1) { - pioptr->PIO_ODSR = x; - pioptr->PIO_SODR = ebit; // Start E pulse - // Need a delay here (250nS) - p += 1; -#if defined(REVA) - x = lookup[*p]; -#else - x = *p; -#endif -// TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) -// while ( TC0->TC_CHANNEL[0].TC_CV < 3 ) // Value depends on MCK/2 (used 6MHz) -// { -// // Wait -// } - pioptr->PIO_CODR = ebit; // End E pulse - } -#if !defined(REVX) - pioptr->PIO_SODR = LCD_CS1; // Deselect LCD -#endif - } - - pioptr->PIO_ODSR = 0xFF; // Drive lines high -#if defined(REVA) - pioptr->PIO_PUER = 0x000000FEL; // Set bits 2, 3, 4, 5 with pullups - pioptr->PIO_ODR = 0x000000FEL; // Set bits 2, 3, 4, 5 input -#else - pioptr->PIO_PUER = 0x000000FEL; // Set bits 1, 3, 4, 5 with pullups - pioptr->PIO_ODR = 0x000000FEL; // Set bits 1, 3, 4, 5 input -#endif - - pioptr->PIO_ODSR = 0xFE; // Drive D0 low - lcdLock = 0; -} +#include "opentx.h" + +// LCD i/o pins +// LCD_RES PC27 +// LCD_CS1 PC26 +// LCD_E PC12 +// LCD_RnW PC13 +// LCD_A0 PC15 +// LCD_D0 PC0 +// LCD_D1 PC7 +// LCD_D2 PC6 +// LCD_D3 PC5 +// LCD_D4 PC4 +// LCD_D5 PC3 +// LCD_D6 PC2 +// LCD_D7 PC1 + +#define LCD_DATA 0x000000FFL +#if !defined(REVA) +#define LCD_A0 0x00000080L +#else +#define LCD_A0 0x00008000L +#endif +#define LCD_RnW 0x00002000L +#define LCD_E 0x00001000L +#define LCD_CS1 0x04000000L +#define LCD_RES 0x08000000L + +// Lookup table for prototype board +#if defined(REVA) +const uint8_t Lcd_lookup[] = +{ + 0x00,0x01,0x80,0x81,0x40,0x41,0xC0,0xC1,0x20,0x21,0xA0,0xA1,0x60,0x61,0xE0,0xE1, + 0x10,0x11,0x90,0x91,0x50,0x51,0xD0,0xD1,0x30,0x31,0xB0,0xB1,0x70,0x71,0xF0,0xF1, + 0x08,0x09,0x88,0x89,0x48,0x49,0xC8,0xC9,0x28,0x29,0xA8,0xA9,0x68,0x69,0xE8,0xE9, + 0x18,0x19,0x98,0x99,0x58,0x59,0xD8,0xD9,0x38,0x39,0xB8,0xB9,0x78,0x79,0xF8,0xF9, + 0x04,0x05,0x84,0x85,0x44,0x45,0xC4,0xC5,0x24,0x25,0xA4,0xA5,0x64,0x65,0xE4,0xE5, + 0x14,0x15,0x94,0x95,0x54,0x55,0xD4,0xD5,0x34,0x35,0xB4,0xB5,0x74,0x75,0xF4,0xF5, + 0x0C,0x0D,0x8C,0x8D,0x4C,0x4D,0xCC,0xCD,0x2C,0x2D,0xAC,0xAD,0x6C,0x6D,0xEC,0xED, + 0x1C,0x1D,0x9C,0x9D,0x5C,0x5D,0xDC,0xDD,0x3C,0x3D,0xBC,0xBD,0x7C,0x7D,0xFC,0xFD, + 0x02,0x03,0x82,0x83,0x42,0x43,0xC2,0xC3,0x22,0x23,0xA2,0xA3,0x62,0x63,0xE2,0xE3, + 0x12,0x13,0x92,0x93,0x52,0x53,0xD2,0xD3,0x32,0x33,0xB2,0xB3,0x72,0x73,0xF2,0xF3, + 0x0A,0x0B,0x8A,0x8B,0x4A,0x4B,0xCA,0xCB,0x2A,0x2B,0xAA,0xAB,0x6A,0x6B,0xEA,0xEB, + 0x1A,0x1B,0x9A,0x9B,0x5A,0x5B,0xDA,0xDB,0x3A,0x3B,0xBA,0xBB,0x7A,0x7B,0xFA,0xFB, + 0x06,0x07,0x86,0x87,0x46,0x47,0xC6,0xC7,0x26,0x27,0xA6,0xA7,0x66,0x67,0xE6,0xE7, + 0x16,0x17,0x96,0x97,0x56,0x57,0xD6,0xD7,0x36,0x37,0xB6,0xB7,0x76,0x77,0xF6,0xF7, + 0x0E,0x0F,0x8E,0x8F,0x4E,0x4F,0xCE,0xCF,0x2E,0x2F,0xAE,0xAF,0x6E,0x6F,0xEE,0xEF, + 0x1E,0x1F,0x9E,0x9F,0x5E,0x5F,0xDE,0xDF,0x3E,0x3F,0xBE,0xBF,0x7E,0x7F,0xFE,0xFF +}; +#endif + +void lcdSendCtl(uint8_t val) +{ + register Pio *pioptr; + +#if defined(REVA) + pioptr = PIOC; + pioptr->PIO_CODR = LCD_CS1; // Select LCD + pioptr->PIO_CODR = LCD_A0; // Control + pioptr->PIO_CODR = LCD_RnW; // Write + pioptr->PIO_ODSR = Lcd_lookup[val]; +#else + pioptr = PIOC; + #if !defined(REVX) + pioptr->PIO_CODR = LCD_CS1; // Select LCD + #endif + PIOA->PIO_CODR = LCD_A0; + #if !defined(REVX) + pioptr->PIO_CODR = LCD_RnW; // Write + #endif + pioptr->PIO_ODSR = val; +#endif + + pioptr->PIO_SODR = LCD_E; // Start E pulse + // Need a delay here (250nS) + TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) + while ( TC0->TC_CHANNEL[0].TC_CV < 9 ) // Value depends on MCK/2 (used 18MHz) + { + // Wait + } + pioptr->PIO_CODR = LCD_E; // End E pulse +#if defined(REVA) + pioptr->PIO_SODR = LCD_A0; // Data +#else + PIOA->PIO_SODR = LCD_A0; // Data +#endif + +#if !defined(REVX) + pioptr->PIO_SODR = LCD_CS1; // Deselect LCD +#endif +} + +void lcdInit() +{ + register Pio *pioptr; + // /home/thus/txt/datasheets/lcd/KS0713.pdf + // ~/txt/flieger/ST7565RV17.pdf from http://www.glyn.de/content.asp?wdid=132&sid= + + // read the inputs, and lock the LCD lines + lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () + lcdLock = 1; + +#if defined(REVA) + pioptr = PIOC; + pioptr->PIO_PER = 0x0C00B0FFL; // Enable bits 27,26,15,13,12,7-0 + pioptr->PIO_CODR = LCD_E | LCD_RnW | LCD_A0; + pioptr->PIO_SODR = LCD_RES | LCD_CS1; + pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output + pioptr->PIO_OWER = 0x000000FFL; // Allow write to ls 8 bits in ODSR +#else + configure_pins( LCD_A0, PIN_ENABLE | PIN_LOW | PIN_OUTPUT | PIN_PORTA | PIN_NO_PULLUP ); + pioptr = PIOC; +#if defined(REVX) + pioptr->PIO_PER = PIO_PC27 | PIO_PC12 | 0xFF; + pioptr->PIO_CODR = LCD_E; + pioptr->PIO_CODR = LCD_RnW | LCD_CS1; // No longer needed, used elsewhere +#else + pioptr->PIO_PER = PIO_PC27 | PIO_PC26 | PIO_PC13 | PIO_PC12 | 0xFF; + pioptr->PIO_CODR = LCD_E | LCD_RnW | LCD_CS1; +#endif + pioptr->PIO_SODR = LCD_RES; + pioptr->PIO_OER = PIO_PC27 | PIO_PC26 | PIO_PC13 | PIO_PC12 | 0xFF; // Set bits 27,26,13,12,7-0 output + pioptr->PIO_OWER = 0x000000FFL; // Allow write to ls 8 bits in ODSR +#endif + + TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) + pioptr->PIO_CODR = LCD_RES; // Reset LCD + while ( TC0->TC_CHANNEL[0].TC_CV < 500 ) ; // > 10us, Value depends on MCK/2 (used 18MHz) + TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) + pioptr->PIO_SODR = LCD_RES; // Remove LCD reset + while ( TC0->TC_CHANNEL[0].TC_CV < 27000 ) ; // 1500us, Value depends on MCK/2 (used 18MHz) + lcdSendCtl(0xe2); //Initialize the internal functions + lcdSendCtl(0xae); //DON = 0: display OFF + lcdSendCtl(0xa1); //ADC = 1: reverse direction(SEG132->SEG1) + lcdSendCtl(0xA6); //REV = 0: non-reverse display + lcdSendCtl(0xA4); //EON = 0: normal display. non-entire + lcdSendCtl(0xA2); // Select LCD bias=0 + lcdSendCtl(0xC0); //SHL = 0: normal direction (COM1->COM64) + lcdSendCtl(0x2F); //Control power circuit operation VC=VR=VF=1 + lcdSendCtl(0x25); //Select int resistance ratio R2 R1 R0 =5 + lcdSendCtl(0x81); //Set reference voltage Mode + lcdSendCtl(0x22); // 24 SV5 SV4 SV3 SV2 SV1 SV0 = 0x18 + +#if defined(REVX) + // 200mS delay (only if not wdt reset) + if ( ( ( ResetReason & RSTC_SR_RSTTYP ) != (2 << 8) ) && !unexpectedShutdown ) { + for (uint32_t j = 0; j < 100; j += 1 ) { + TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) + while ( TC0->TC_CHANNEL[0].TC_CV < 36000 ) { + // Value depends on MCK/2 (used 18MHz) give 2mS delay + wdt_reset(); // Wait + } + } + } +#endif + + lcdSendCtl(0xAF); // DON = 1: display ON + +#if defined(REVA) + pioptr->PIO_ODR = 0x0000003CL; // Set bits 2, 3, 4, 5 input + pioptr->PIO_PUER = 0x0000003CL; // Set bits 2, 3, 4, 5 with pullups + pioptr->PIO_ODSR = 0; // Drive D0 low +#else + pioptr->PIO_ODR = 0x0000003AL; // Set bits 1, 3, 4, 5 input + pioptr->PIO_PUER = 0x0000003AL; // Set bits 1, 3, 4, 5 with pullups + pioptr->PIO_ODSR = 0; // Drive D0 low +#endif + + lcdLock = 0; +} + +void lcdSetRefVolt(uint8_t val) +{ + register Pio *pioptr; + pioptr = PIOC; + + // read the inputs, and lock the LCD lines + lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () + lcdLock = 1; + + pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output + + lcdSendCtl(0x81); + if ( val == 0 ) + { + val = 0x22; + } + lcdSendCtl(val); + +#if defined(REVA) + pioptr->PIO_ODR = 0x000000FEL; // Set bits 2, 3, 4, 5 input + pioptr->PIO_PUER = 0x000000FEL; // Set bits 2, 3, 4, 5 with pullups +#else + pioptr->PIO_ODR = 0x000000FEL; // Set bits 1, 3, 4, 5 input + pioptr->PIO_PUER = 0x000000FEL; // Set bits 1, 3, 4, 5 with pullups +#endif + + pioptr->PIO_ODSR = 0; // Drive D0 low + lcdLock = 0; +} + +void lcdRefresh() +{ + register Pio *pioptr; + register uint8_t *p = displayBuf; + register uint32_t y; + register uint32_t x; + register uint32_t z; + register uint32_t ebit; +#if defined(REVA) + register uint8_t *lookup; + lookup = (uint8_t *) Lcd_lookup; +#endif + + ebit = LCD_E; + +#if !defined(REVA) + pioptr = PIOA; + pioptr->PIO_PER = 0x00000080; // Enable bit 7 (LCD-A0) + pioptr->PIO_OER = 0x00000080;// Set bit 7 output +#endif + + // read the inputs, and lock the LCD lines + lcdInputs = PIOC->PIO_PDSR; // 6 LEFT, 5 RIGHT, 4 DOWN, 3 UP () + lcdLock = 1; + + pioptr = PIOC; +#if defined(REVA) + pioptr->PIO_OER = 0x0C00B0FFL; // Set bits 27,26,15,13,12,7-0 output +#else + pioptr->PIO_OER = 0x0C0030FFL; // Set bits 27,26,15,13,12,7-0 output +#endif + for (y = 0; y < 8; y++) { + lcdSendCtl(g_eeGeneral.optrexDisplay ? 0 : 0x04); + lcdSendCtl(0x10); //column addr 0 + lcdSendCtl(y | 0xB0); //page addr y + +#if !defined(REVX) + pioptr->PIO_CODR = LCD_CS1; // Select LCD +#endif + PIOA->PIO_SODR = LCD_A0; // Data +#if !defined(REVX) + pioptr->PIO_CODR = LCD_RnW; // Write +#endif + +#if defined(REVA) + x = lookup[*p]; +#else + x = *p; +#endif + for (z = 0; z < LCD_W; z += 1) { + pioptr->PIO_ODSR = x; + pioptr->PIO_SODR = ebit; // Start E pulse + // Need a delay here (250nS) + p += 1; +#if defined(REVA) + x = lookup[*p]; +#else + x = *p; +#endif +// TC0->TC_CHANNEL[0].TC_CCR = 5; // Enable clock and trigger it (may only need trigger) +// while ( TC0->TC_CHANNEL[0].TC_CV < 3 ) // Value depends on MCK/2 (used 6MHz) +// { +// // Wait +// } + pioptr->PIO_CODR = ebit; // End E pulse + } +#if !defined(REVX) + pioptr->PIO_SODR = LCD_CS1; // Deselect LCD +#endif + } + + pioptr->PIO_ODSR = 0xFF; // Drive lines high +#if defined(REVA) + pioptr->PIO_PUER = 0x000000FEL; // Set bits 2, 3, 4, 5 with pullups + pioptr->PIO_ODR = 0x000000FEL; // Set bits 2, 3, 4, 5 input +#else + pioptr->PIO_PUER = 0x000000FEL; // Set bits 1, 3, 4, 5 with pullups + pioptr->PIO_ODR = 0x000000FEL; // Set bits 1, 3, 4, 5 input +#endif + + pioptr->PIO_ODSR = 0xFE; // Drive D0 low + lcdLock = 0; +} diff --git a/radio/src/targets/taranis/CMakeLists.txt b/radio/src/targets/taranis/CMakeLists.txt index 976b9841c4..8be3b75ddb 100644 --- a/radio/src/targets/taranis/CMakeLists.txt +++ b/radio/src/targets/taranis/CMakeLists.txt @@ -17,12 +17,13 @@ if(PCB STREQUAL X9E) bluetooth_driver.cpp startup_stm32f40_41xxx.s ) + set(SERIAL2_DRIVER serial2_driver.cpp) if(STICKS STREQUAL HORUS) add_definitions(-DHORUS_STICKS) endif() set(GUI_DIR 212x64) set(GUI_SRC ${GUI_SRC} bmp.cpp) - set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} taranis_bitmaps) + set(BITMAPS_TARGET taranis_bitmaps) set(LCD_DRIVER lcd_driver_spi.cpp) elseif(PCB STREQUAL X9D+) set(CPU_TYPE STM32F2) @@ -34,41 +35,42 @@ elseif(PCB STREQUAL X9D+) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) set(GUI_SRC ${GUI_SRC} bmp.cpp) - set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} taranis_bitmaps) + set(BITMAPS_TARGET taranis_bitmaps) set(LCD_DRIVER lcd_driver_spi.cpp) + set(SERIAL2_DRIVER serial2_driver.cpp) elseif(PCB STREQUAL X9D) set(CPU_TYPE STM32F2) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) set(HAPTIC NO) set(LUA_EXPORT lua_export_taranis) set(FLAVOUR x9d) + add_definitions(-DPCBX9D) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 212x64) set(GUI_SRC ${GUI_SRC} bmp.cpp) - set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} taranis_bitmaps) + set(BITMAPS_TARGET taranis_bitmaps) set(LCD_DRIVER lcd_driver_aspi.cpp) + set(SERIAL2_DRIVER serial2_driver.cpp) elseif(PCB STREQUAL X7D) set(CPU_TYPE STM32F2) set(LINKER_SCRIPT targets/taranis/stm32f2_flash.ld) - set(HAPTIC NO) + set(HAPTIC YES) set(LUA_EXPORT lua_export_taranis) set(FLAVOUR x7d) add_definitions(-DPCBX7D) add_definitions(-DEEPROM_VARIANT=0) set(GUI_DIR 128x64) - set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} 9x_bitmaps) + set(BITMAPS_TARGET 9x_bitmaps) set(LCD_DRIVER lcd_driver_spi.cpp) endif() set(HSE_VALUE 12000000) set(SDCARD YES) set(EEPROM EEPROM_RLC) -set(VIRTUAL_INPUTS YES) set(TARGET_DIR taranis) add_definitions(-DPCBTARANIS -DPPM_PIN_TIMER) add_definitions(-DAUDIO -DVOICE -DRTCLOCK) -add_definitions(-DLUAINPUTS -DXCURVES -DVARIO) set(GUI_SRC ${GUI_SRC} model_inputs.cpp @@ -84,9 +86,15 @@ set(GUI_SRC ${GUI_SRC} ../screenshot.cpp ) +if(PCB STREQUAL X7D) + set(LED_DRIVER led_driver.cpp) +endif() + set(TARGET_SRC ${TARGET_SRC} board.cpp + ${LED_DRIVER} + backlight_driver.cpp extmodule_driver.cpp ../common/arm/stm32/rtc_driver.cpp ) @@ -99,10 +107,8 @@ set(FIRMWARE_SRC set(FIRMWARE_TARGET_SRC ${FIRMWARE_TARGET_SRC} ${LCD_DRIVER} - backlight_driver.cpp - delays.c i2c_driver.cpp - pwr_driver.c + pwr_driver.cpp flash_driver.cpp ) @@ -118,3 +124,4 @@ if(MIXERS_MONITOR) add_definitions(-DMIXERS_MONITOR) endif() +set(FIRMWARE_DEPENDENCIES ${FIRMWARE_DEPENDENCIES} ${BITMAPS_TARGET}) diff --git a/radio/src/targets/taranis/adc_driver.cpp b/radio/src/targets/taranis/adc_driver.cpp index 1fa5013027..5ca413ba29 100644 --- a/radio/src/targets/taranis/adc_driver.cpp +++ b/radio/src/targets/taranis/adc_driver.cpp @@ -30,6 +30,8 @@ const int8_t ana_direction[NUMBER_ANALOG] = {1,1,-1,-1, -1,-1,-1,1, -1,1,1,1, -1}; #elif defined(PCBX9DP) const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1,-1, -1,1, 1}; +#elif defined(PCBX7D) + const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,1, 1}; #elif defined(REV4a) const int8_t ana_direction[NUMBER_ANALOG] = {1,-1,1,-1, -1,-1,0, -1,1, 1}; #else @@ -173,7 +175,7 @@ void adcStop() #if !defined(SIMU) uint16_t getAnalogValue(uint8_t index) { - if (IS_POT(index) && !IS_POT_AVAILABLE(index)) { + if (IS_POT(index) && !IS_POT_OR_SLIDER_AVAILABLE(index)) { // Use fixed analog value for non-existing and/or non-connected pots. // Non-connected analog inputs will slightly follow the adjacent connected analog inputs, // which produces ghost readings on these inputs. diff --git a/radio/src/targets/taranis/backlight_driver.cpp b/radio/src/targets/taranis/backlight_driver.cpp index 4aabbdf56a..02e75e7ee1 100644 --- a/radio/src/targets/taranis/backlight_driver.cpp +++ b/radio/src/targets/taranis/backlight_driver.cpp @@ -32,27 +32,32 @@ void backlightInit() GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure); GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource_1, BACKLIGHT_GPIO_AF_1); GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource_2, BACKLIGHT_GPIO_AF_1); - BACKLIGHT_TIMER->ARR = 100 ; - BACKLIGHT_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 50000 - 1; // 20us * 100 = 2ms => 500Hz - BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM - BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E ; - BACKLIGHT_TIMER->CCR2 = 0 ; - BACKLIGHT_TIMER->CCR1 = 100 ; - BACKLIGHT_TIMER->EGR = 0 ; - BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN ; // Counter enable + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 50000 - 1; // 20us * 100 = 2ms => 500Hz + BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; // PWM + BACKLIGHT_TIMER->CCER = TIM_CCER_CC1E | TIM_CCER_CC2E; + BACKLIGHT_TIMER->CCR2 = 0; + BACKLIGHT_TIMER->CCR1 = 100; + BACKLIGHT_TIMER->EGR = 0; + BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable } -void turnBacklightOn(uint8_t level, uint8_t color) +void backlightEnable(uint8_t level, uint8_t color) { BACKLIGHT_TIMER->CCR1 = ((100-level)*(20-color))/20; BACKLIGHT_TIMER->CCR2 = ((100-level)*color)/20; } -void turnBacklightOff(void) +void backlightDisable() { BACKLIGHT_TIMER->CCR1 = 0; BACKLIGHT_TIMER->CCR2 = 0; } + +uint8_t isBacklightEnable() +{ + return (BACKLIGHT_TIMER->CCR1 != 0 || BACKLIGHT_TIMER->CCR2 != 0); +} #elif defined(PCBX9DP) void backlightInit() { @@ -65,45 +70,99 @@ void backlightInit() GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure); GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource_1, BACKLIGHT_GPIO_AF_1); GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource_2, BACKLIGHT_GPIO_AF_1); - BACKLIGHT_TIMER->ARR = 100 ; - BACKLIGHT_TIMER->PSC = (PERI1_FREQUENCY * TIMER_MULT_APB1) / 50000 - 1; // 20us * 100 = 2ms => 500Hz - BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2 ; // PWM - BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2 ; // PWM - BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E ; - BACKLIGHT_TIMER->CCR2 = 0 ; - BACKLIGHT_TIMER->CCR4 = 100 ; - BACKLIGHT_TIMER->EGR = 0 ; - BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN ; // Counter enable + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 50000 - 1; // 20us * 100 = 2ms => 500Hz + BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; // PWM + BACKLIGHT_TIMER->CCMR2 = TIM_CCMR2_OC4M_1 | TIM_CCMR2_OC4M_2; // PWM + BACKLIGHT_TIMER->CCER = TIM_CCER_CC4E | TIM_CCER_CC2E; + BACKLIGHT_TIMER->CCR2 = 0; + BACKLIGHT_TIMER->CCR4 = 100; + BACKLIGHT_TIMER->EGR = 0; + BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable } -void turnBacklightOn(uint8_t level, uint8_t color) +void backlightEnable(uint8_t level, uint8_t color) { BACKLIGHT_TIMER->CCR4 = ((100-level)*(20-color))/20; BACKLIGHT_TIMER->CCR2 = ((100-level)*color)/20; } -void turnBacklightOff(void) +void backlightDisable() { BACKLIGHT_TIMER->CCR4 = 0; BACKLIGHT_TIMER->CCR2 = 0; } -#else + +uint8_t isBacklightEnable() +{ + return (BACKLIGHT_TIMER->CCR4 != 0 || BACKLIGHT_TIMER->CCR2 != 0); +} +#elif defined(PCBX7D) void backlightInit() { GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = BACKLIGHT_GPIO_PIN_1; + GPIO_InitStructure.GPIO_Pin = BACKLIGHT_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure); - GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource_1, BACKLIGHT_GPIO_AF_1); - BACKLIGHT_TIMER->ARR = 100 ; - BACKLIGHT_TIMER->PSC = (PERI2_FREQUENCY * TIMER_MULT_APB2) / 50000 - 1; // 20us * 100 = 2ms => 500Hz - BACKLIGHT_TIMER->CCMR1 = 0x60 ; // PWM - BACKLIGHT_TIMER->CCER = 1 ; + GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource, BACKLIGHT_GPIO_AF); + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 50000 - 1; // 20us * 100 = 2ms => 500Hz + BACKLIGHT_TIMER->CCMR1 = TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2M_2; // PWM + BACKLIGHT_TIMER->CCER = TIM_CCER_CC2E; + BACKLIGHT_TIMER->CCR2 = 0; + BACKLIGHT_TIMER->EGR = 0; + BACKLIGHT_TIMER->CR1 = TIM_CR1_CEN; // Counter enable +} + +void backlightEnable(uint8_t level) +{ + BACKLIGHT_TIMER->CCR2 = 100 - level; +} + +void backlightDisable() +{ + BACKLIGHT_TIMER->CCR2 = 0; +} + +uint8_t isBacklightEnable() +{ + return BACKLIGHT_TIMER->CCR2 != 0; +} +#else +void backlightInit() +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = BACKLIGHT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; + GPIO_Init(BACKLIGHT_GPIO, &GPIO_InitStructure); + GPIO_PinAFConfig(BACKLIGHT_GPIO, BACKLIGHT_GPIO_PinSource, BACKLIGHT_GPIO_AF); + BACKLIGHT_TIMER->ARR = 100; + BACKLIGHT_TIMER->PSC = BACKLIGHT_TIMER_FREQ / 50000 - 1; // 20us * 100 = 2ms => 500Hz + BACKLIGHT_TIMER->CCMR1 = 0x60; // PWM + BACKLIGHT_TIMER->CCER = 1; BACKLIGHT_TIMER->CCR1 = 80; - BACKLIGHT_TIMER->EGR = 0 ; - BACKLIGHT_TIMER->CR1 = 1 ; + BACKLIGHT_TIMER->EGR = 0; + BACKLIGHT_TIMER->CR1 = 1; +} + +void backlightEnable(uint8_t level) +{ + BACKLIGHT_TIMER->CCR1 = 100 - level; +} + +void backlightDisable() +{ + BACKLIGHT_TIMER->CCR1 = 0; +} + +uint8_t isBacklightEnable() +{ + return BACKLIGHT_TIMER->CCR1 != 0; } #endif diff --git a/radio/src/targets/taranis/board.cpp b/radio/src/targets/taranis/board.cpp index 8488b9ce85..09b1a13e17 100644 --- a/radio/src/targets/taranis/board.cpp +++ b/radio/src/targets/taranis/board.cpp @@ -98,7 +98,8 @@ void interrupt5ms() per10ms(); } -#if defined(PCBX9E) +#if defined(PCBX9E) || defined(PCBX7D) + // TODO define ROTARY_ENCODER checkRotaryEncoder(); #endif } @@ -137,10 +138,15 @@ void boardInit() pwrInit(); #endif +#if defined(PCBX7D) + ledInit(); + ledGreen(); +#endif + keysInit(); adcInit(); delaysInit(); - lcdInit(); // delaysInit() must be called before + lcdInit(); // delaysInit() must be called before audioInit(); init2MhzTimer(); init5msTimer(); @@ -148,6 +154,8 @@ void boardInit() i2cInit(); usbInit(); + modulesInit(); + #if defined(HAPTIC) hapticInit(); #endif @@ -179,7 +187,7 @@ void boardInit() } else if (duration >= PWR_PRESS_DURATION_MAX) { drawSleepBitmap(); - turnBacklightOff(); + backlightDisable(); } else { if (pwr_on != 1) { @@ -209,12 +217,17 @@ void boardInit() void boardOff() { - BACKLIGHT_OFF(); +#if defined(PCBX7D) + ledOff(); +#endif + + BACKLIGHT_DISABLE(); + #if defined(PCBX9E) toplcdOff(); #endif -#if defined(PCBX9E) +#if defined(PCBX9E) || defined(PCBX7D) while (pwrPressed()) { wdt_reset(); } @@ -267,7 +280,7 @@ void usbJoystickUpdate(void) USBD_HID_SendReport (&USB_OTG_dev, HID_Buffer, HID_IN_PACKET ); } -#endif //#if defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU) +#endif // defined(USB_JOYSTICK) && defined(PCBTARANIS) && !defined(SIMU) uint8_t currentTrainerMode = 0xff; @@ -289,8 +302,10 @@ void checkTrainerSettings() case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: stop_sbus_on_heartbeat_capture() ; break; +#if defined(SERIAL2) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: serial2Stop(); +#endif } currentTrainerMode = requiredTrainerMode; @@ -304,12 +319,14 @@ void checkTrainerSettings() case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: init_sbus_on_heartbeat_capture() ; break; +#if defined(SERIAL2) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: if (g_eeGeneral.serial2Mode == UART_MODE_SBUS_TRAINER) { serial2SbusInit(); break; } // no break +#endif default: // master is default init_trainer_capture(); diff --git a/radio/src/targets/taranis/board.h b/radio/src/targets/taranis/board.h index 50e5a6bee4..38a7f0ac62 100644 --- a/radio/src/targets/taranis/board.h +++ b/radio/src/targets/taranis/board.h @@ -100,7 +100,7 @@ extern uint16_t sessionTimer; #if defined(PCBX9E) #define TRAINER_CONNECTED() (true) #else -#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_GPIO_DETECT, TRAINER_GPIO_PIN_DETECT) == Bit_RESET) +#define TRAINER_CONNECTED() (GPIO_ReadInputDataBit(TRAINER_DETECT_GPIO, TRAINER_DETECT_GPIO_PIN) == Bit_RESET) #endif // Board driver @@ -158,6 +158,7 @@ uint32_t isFirmwareStart(const void * buffer); uint32_t isBootloaderStart(const void * buffer); // Pulses driver +void modulesInit(void); #define INTERNAL_MODULE_ON() GPIO_SetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) #define INTERNAL_MODULE_OFF() GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN) #define EXTERNAL_MODULE_ON() GPIO_SetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN) @@ -187,13 +188,133 @@ void stop_sbus_on_heartbeat_capture(void); int sbusGetByte(uint8_t * byte); // Keys driver +enum EnumKeys +{ + KEY_MENU, + KEY_EXIT, + KEY_ENTER, + KEY_PAGE, + KEY_PLUS, + KEY_MINUS, + + TRM_BASE, + TRM_LH_DWN = TRM_BASE, + TRM_LH_UP, + TRM_LV_DWN, + TRM_LV_UP, + TRM_RV_DWN, + TRM_RV_UP, + TRM_RH_DWN, + TRM_RH_UP, + TRM_LAST = TRM_RH_UP, + + NUM_KEYS +}; + +#if defined(PCBX9E) && !defined(SIMU) + #define KEY_UP KEY_MINUS + #define KEY_DOWN KEY_PLUS + #define KEY_RIGHT KEY_PLUS + #define KEY_LEFT KEY_MINUS +#else + #define KEY_UP KEY_PLUS + #define KEY_DOWN KEY_MINUS + #define KEY_RIGHT KEY_MINUS + #define KEY_LEFT KEY_PLUS +#endif + +enum EnumSwitches +{ + SW_SA, + SW_SB, + SW_SC, + SW_SD, + SW_SE, + SW_SF, + SW_SG, + SW_SH +}; +#define IS_3POS(x) ((x) != SW_SF && (x) != SW_SH) + +enum EnumSwitchesPositions +{ + SW_SA0, + SW_SA1, + SW_SA2, + SW_SB0, + SW_SB1, + SW_SB2, + SW_SC0, + SW_SC1, + SW_SC2, + SW_SD0, + SW_SD1, + SW_SD2, +#if !defined(PCBX7D) + SW_SE0, + SW_SE1, + SW_SE2, +#endif + SW_SF0, + SW_SF1, + SW_SF2, +#if !defined(PCBX7D) + SW_SG0, + SW_SG1, + SW_SG2, +#endif + SW_SH0, + SW_SH1, + SW_SH2, +#if defined(PCBX9E) + SW_SI0, + SW_SI1, + SW_SI2, + SW_SJ0, + SW_SJ1, + SW_SJ2, + SW_SK0, + SW_SK1, + SW_SK2, + SW_SL0, + SW_SL1, + SW_SL2, + SW_SM0, + SW_SM1, + SW_SM2, + SW_SN0, + SW_SN1, + SW_SN2, + SW_SO0, + SW_SO1, + SW_SO2, + SW_SP0, + SW_SP1, + SW_SP2, + SW_SQ0, + SW_SQ1, + SW_SQ2, + SW_SR0, + SW_SR1, + SW_SR2, +#endif +}; +#if defined(PCBX7D) + #define NUM_SWITCHES 6 +#elif defined(PCBX9E) + #define NUM_SWITCHES 18 // yes, it's a lot! +#else + #define NUM_SWITCHES 8 +#endif void keysInit(void); +uint8_t keyState(uint8_t index); +uint32_t switchState(uint8_t index); uint32_t readKeys(void); uint32_t readTrims(void); #define TRIMS_PRESSED() (readTrims()) #define KEYS_PRESSED() (readKeys()) -#if defined(PCBX9E) +#if defined(PCBX9E) || defined(PCBX7D) // Rotary Encoder driver extern int32_t rotencValue; void rotencInit(void); @@ -222,24 +343,37 @@ enum Analogs { STICK2, STICK3, STICK4, - POT1, + POT_FIRST, + POT1 = POT_FIRST, POT2, +#if defined(PCBX7D) + POT_LAST = POT2, +#elif defined(PCBX9E) POT3, - #if defined(PCBX9E) - POT4, - POT_LAST = POT4, - #else - POT_LAST = POT3, - #endif + POT4, + POT_LAST = POT4, SLIDER1, SLIDER2, - #if defined(PCBX9E) - SLIDER3, - SLIDER4, - #endif + SLIDER3, + SLIDER4, +#else + POT3, + POT_LAST = POT3, + SLIDER1, + SLIDER2, +#endif TX_VOLTAGE, NUMBER_ANALOG }; +#define NUM_POTS (POT_LAST-POT_FIRST+1) +#define NUM_SLIDERS (TX_VOLTAGE-POT_FIRST-NUM_POTS) +#define NUM_XPOTS NUM_POTS +#if defined(PCBX9D) + #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT2) // POT3 is only defined in software +#else + #define IS_POT(x) ((x)>=POT_FIRST && (x)<=POT_LAST) +#endif +#define IS_SLIDER(x) ((x)>POT_LAST && (x)CCR4 != 0) || (BACKLIGHT_TIMER->CCR2 != 0)) + void backlightEnable(uint8_t level, uint8_t color); + #define BACKLIGHT_ENABLE() backlightEnable(g_eeGeneral.backlightBright, g_eeGeneral.backlightColor) #else - #define setBacklight(xx) BACKLIGHT_TIMER->CCR1 = 100-xx - #define backlightEnable() BACKLIGHT_TIMER->CCR1 = 100-g_eeGeneral.backlightBright - #define backlightDisable() BACKLIGHT_TIMER->CCR1 = 0 - #define isBacklightEnable() (BACKLIGHT_TIMER->CCR1 != 0) + void backlightEnable(uint8_t level); + #define BACKLIGHT_ENABLE() backlightEnable(g_eeGeneral.backlightBright) #endif // USB driver @@ -334,12 +465,15 @@ void hapticOff(void); // Second serial port driver #define DEBUG_BAUDRATE 115200 +#if !defined(PCBX7D) +#define SERIAL2 extern uint8_t serial2Mode; void serial2Init(unsigned int mode, unsigned int protocol); void serial2Putc(char c); #define serial2TelemetryInit(protocol) serial2Init(UART_MODE_TELEMETRY, protocol) void serial2SbusInit(void); void serial2Stop(void); +#endif // BT driver #define BLUETOOTH_DEFAULT_BAUDRATE 115200 @@ -351,11 +485,41 @@ void bluetoothWriteString(const char * str); int bluetoothRead(void * buffer, int len); void bluetoothWakeup(void); +// LED driver +void ledInit(void); +void ledOff(void); +void ledRed(void); +void ledGreen(void); +void ledBlue(void); + // LCD driver +#if defined(PCBX7D) +#define LCD_W 128 +#define LCD_H 64 +#define LCD_DEPTH 1 +#else +#define LCD_W 212 +#define LCD_H 64 +#define LCD_DEPTH 4 +#endif void lcdInit(void); void lcdInitFinish(void); void lcdOff(void); +// TODO lcdRefreshWait() stub in simpgmspace and remove LCD_DUAL_BUFFER +#if (defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7D)) && !defined(LCD_DUAL_BUFFER) && !defined(SIMU) +void lcdRefreshWait(); +#else +#define lcdRefreshWait() +#endif +#if defined(PCBX9D) || defined(SIMU) || !defined(__cplusplus) +void lcdRefresh(void); +#else +void lcdRefresh(bool wait=true); // TODO uint8_t wait to simplify this +#endif +void lcdSetRefVolt(unsigned char val); +void lcdSetContrast(void); + // Top LCD driver #if defined(PCBX9E) void toplcdInit(void); diff --git a/radio/src/targets/taranis/bootloader/CMakeLists.txt b/radio/src/targets/taranis/bootloader/CMakeLists.txt index 2f9dced44b..32f0945ee5 100644 --- a/radio/src/targets/taranis/bootloader/CMakeLists.txt +++ b/radio/src/targets/taranis/bootloader/CMakeLists.txt @@ -28,8 +28,8 @@ endif() set(BOOTLOADER_SRC ${BOOTLOADER_SRC} - ../../../gui/212x64/lcd.cpp - ../../../gui/212x64/fonts.cpp + ../../../gui/${GUI_DIR}/lcd.cpp + ../../../gui/${GUI_DIR}/fonts.cpp ../../../keys.cpp ../../../strhelpers.cpp ../../../${STM32USB_DIR}/STM32_USB_OTG_Driver/src/usb_core.c @@ -52,11 +52,11 @@ set(BOOTLOADER_SRC ../diskio.cpp ../../common/arm/stm32/usbd_usr.cpp ../../common/arm/stm32/usbd_storage_msd.cpp - ../delays.c + ../../common/arm/stm32/delays.cpp ../../common/arm/stm32/usbd_desc.c ../../common/arm/stm32/usb_bsp.c ../../common/arm/stm32/usb_driver.c - ../pwr_driver.c + ../pwr_driver.cpp init.c boot.cpp ) @@ -67,7 +67,7 @@ add_definitions(-DBOOT -DUSB_MASS_STORAGE) set(CMAKE_EXE_LINKER_FLAGS "-mcpu=${MCU} -mthumb -nostartfiles -lm -T${RADIO_SRC_DIRECTORY}/targets/taranis/stm32_ramboot.ld -Wl,-Map=bootloader.map,--cref,--no-warn-mismatch,--gc-sections") add_executable(bootloader ${BOOTLOADER_SRC}) -add_dependencies(bootloader taranis_fonts firmware_translations) +add_dependencies(bootloader ${BITMAPS_TARGET} firmware_translations) add_custom_command( TARGET bootloader POST_BUILD diff --git a/radio/src/targets/taranis/bootloader/boot.cpp b/radio/src/targets/taranis/bootloader/boot.cpp index a0f7fe31f5..f43d0dbf15 100644 --- a/radio/src/targets/taranis/bootloader/boot.cpp +++ b/radio/src/targets/taranis/bootloader/boot.cpp @@ -1,60 +1,29 @@ -/**************************************************************************** - * Copyright (c) 2014 by Michael Blandford. All rights reserved. +/* + * Copyright (C) OpenTX * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * 3. Neither the name of the author nor the names of its contributors may - * be used to endorse or promote products derived from this software - * without specific prior written permission. + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, - * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF - * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF - * SUCH DAMAGE. + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. * - **************************************************************************** - * Other Authors: - * - Andre Bernet - * - Bertrand Songis - * - Bryan J. Rentoul (Gruvin) - * - Cameron Weeks - * - Erez Raviv - * - Jean-Pierre Parisy - * - Karl Szmutny - * - Michal Hlavinka - * - Pat Mackenzie - * - Philip Moss - * - Rob Thomson - * - Romolo Manfredini - * - Thomas Husterer - * - ****************************************************************************/ - -/*---------------------------------------------------------------------------- - * Headers - *----------------------------------------------------------------------------*/ + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ #include #include #include -#include "../../../gui/212x64/lcd.h" #include "board.h" +#include "lcd.h" #include "storage/eeprom_rlc.h" #include "pwr.h" #include "keys.h" @@ -164,12 +133,12 @@ void interrupt10ms(void) { Tenms |= 1; // 10 mS has passed - uint8_t enuk = KEY_MENU; + uint8_t index = KEY_MENU; uint8_t in = readKeys(); for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { uint8_t value = (in & i); - keys[enuk].input(value); - ++enuk; + keys[index].input(value); + ++index; } #if defined(PCBX9E) @@ -399,7 +368,7 @@ int main() #endif pwrInit(); - delaysInit(); //needed for lcdInit() + delaysInit(); // needed for lcdInit() lcdInit(); backlightInit(); @@ -672,7 +641,7 @@ int main() } if (state != ST_FLASHING && state != ST_USB) { -#if defined(PCBX9E) +#if defined(PCBX9E) || defined(PCBX7D) if (pwrPressed()) { #else if (pwrCheck() == e_power_off) { diff --git a/radio/src/targets/taranis/hal.h b/radio/src/targets/taranis/hal.h index d0f9fbdfe2..d849e8366f 100644 --- a/radio/src/targets/taranis/hal.h +++ b/radio/src/targets/taranis/hal.h @@ -22,21 +22,28 @@ #define _HAL_H_ // Keys -#define KEYS_GPIO_REG_MENU GPIOD->IDR -#define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 -#define KEYS_GPIO_REG_EXIT GPIOD->IDR -#define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 -#define KEYS_GPIO_REG_PAGE GPIOD->IDR -#define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 +#if defined(PCBX7D) + #define KEYS_GPIO_REG_PAGE GPIOD->IDR + #define KEYS_GPIO_PIN_PAGE GPIO_Pin_2 // PD.02 + #define KEYS_GPIO_REG_MENU GPIOD->IDR + #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD->IDR + #define KEYS_GPIO_PIN_EXIT GPIO_Pin_3 // PD.03 +#else + #define KEYS_GPIO_REG_MENU GPIOD->IDR + #define KEYS_GPIO_PIN_MENU GPIO_Pin_7 // PD.07 + #define KEYS_GPIO_REG_EXIT GPIOD->IDR + #define KEYS_GPIO_PIN_EXIT GPIO_Pin_2 // PD.02 + #define KEYS_GPIO_REG_PAGE GPIOD->IDR + #define KEYS_GPIO_PIN_PAGE GPIO_Pin_3 // PD.03 +#endif + #if defined(PCBX9E) - #if defined(SIMU) - #define KEYS_GPIO_REG_PLUS GPIOE->IDR - #define KEYS_GPIO_PIN_PLUS GPIO_Pin_5 // This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys - #define KEYS_GPIO_REG_MINUS GPIOE->IDR - #define KEYS_GPIO_PIN_MINUS GPIO_Pin_6 // This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys - #endif #define KEYS_GPIO_REG_ENTER GPIOF->IDR #define KEYS_GPIO_PIN_ENTER GPIO_Pin_0 // PF.00 +#elif defined(PCBX7D) + #define KEYS_GPIO_REG_ENTER GPIOE->IDR + #define KEYS_GPIO_PIN_ENTER GPIO_Pin_10 // PE.10 #else #define KEYS_GPIO_REG_PLUS GPIOE->IDR #define KEYS_GPIO_PIN_PLUS GPIO_Pin_10 // PE.10 @@ -47,9 +54,23 @@ #endif // Rotary Encoder -#define ENC_GPIO GPIOD -#define ENC_GPIO_PIN_A GPIO_Pin_12 // PD.12 -#define ENC_GPIO_PIN_B GPIO_Pin_13 // PD.13 +#if defined(PCBX9E) + #define ENC_GPIO GPIOD + #define ENC_GPIO_PIN_A GPIO_Pin_12 // PD.12 + #define ENC_GPIO_PIN_B GPIO_Pin_13 // PD.13 +#elif defined(PCBX7D) + #define ENC_GPIO GPIOE + #define ENC_GPIO_PIN_A GPIO_Pin_9 // PE.09 + #define ENC_GPIO_PIN_B GPIO_Pin_11 // PE.11 +#endif + +// This is for SIMU: reuse rotary encoder pins to map UP and DOWN keyboard keys +#if defined(SIMU) && (defined(PCBX9E) || defined(PCBX7D)) + #define KEYS_GPIO_REG_PLUS ENC_GPIO->IDR + #define KEYS_GPIO_PIN_PLUS ENC_GPIO_PIN_A + #define KEYS_GPIO_REG_MINUS ENC_GPIO->IDR + #define KEYS_GPIO_PIN_MINUS ENC_GPIO_PIN_B +#endif // Trims #if defined(PCBX9E) @@ -94,6 +115,11 @@ #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_10 // PD.10 #define SWITCHES_GPIO_REG_A_L GPIOD->IDR #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_14 // PD.14 +#elif defined(PCBX7D) + #define SWITCHES_GPIO_REG_A_H GPIOD->IDR + #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_11 // PD.11 + #define SWITCHES_GPIO_REG_A_L GPIOE->IDR + #define SWITCHES_GPIO_PIN_A_L GPIO_Pin_0 // PE.00 #else #define SWITCHES_GPIO_REG_A_H GPIOB->IDR #define SWITCHES_GPIO_PIN_A_H GPIO_Pin_5 // PB.05 @@ -118,6 +144,11 @@ #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_13 // PF.13 #define SWITCHES_GPIO_REG_C_L GPIOF->IDR #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_14 // PF.14 +#elif defined(PCBX7D) + #define SWITCHES_GPIO_REG_C_H GPIOD->IDR + #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_14 // PD.14 + #define SWITCHES_GPIO_REG_C_L GPIOD->IDR + #define SWITCHES_GPIO_PIN_C_L GPIO_Pin_15 // PD.15 #else #define SWITCHES_GPIO_REG_C_H GPIOE->IDR #define SWITCHES_GPIO_PIN_C_H GPIO_Pin_15 // PE.15 @@ -130,7 +161,7 @@ #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_1 // PE.01 #define SWITCHES_GPIO_REG_D_L GPIOE->IDR #define SWITCHES_GPIO_PIN_D_L GPIO_Pin_2 // PE.02 -#elif defined(PCBX9DP) +#elif defined(PCBX9DP) || defined(PCBX7D) #define SWITCHES_GPIO_REG_D_H GPIOE->IDR #define SWITCHES_GPIO_PIN_D_H GPIO_Pin_7 // PE.07 #define SWITCHES_GPIO_REG_D_L GPIOE->IDR @@ -147,7 +178,7 @@ #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_7 // PE.07 #define SWITCHES_GPIO_REG_E_L GPIOE->IDR #define SWITCHES_GPIO_PIN_E_L GPIO_Pin_13 // PE.13 -#else +#elif !defined(PCBX7D) #define SWITCHES_GPIO_REG_E_H GPIOB->IDR #define SWITCHES_GPIO_PIN_E_H GPIO_Pin_3 // PB.03 #define SWITCHES_GPIO_REG_E_L GPIOB->IDR @@ -167,7 +198,7 @@ #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_3 // PF.03 #define SWITCHES_GPIO_REG_G_L GPIOF->IDR #define SWITCHES_GPIO_PIN_G_L GPIO_Pin_4 // PF.04 -#else +#elif !defined(PCBX7D) #define SWITCHES_GPIO_REG_G_H GPIOE->IDR #define SWITCHES_GPIO_PIN_G_H GPIO_Pin_9 // PE.09 #define SWITCHES_GPIO_REG_G_L GPIOE->IDR @@ -177,9 +208,11 @@ #if defined(PCBX9E) #define SWITCHES_GPIO_REG_H GPIOF->IDR #define SWITCHES_GPIO_PIN_H GPIO_Pin_1 // PF.01 -#elif defined(PCBX9DP) - #define SWITCHES_GPIO_REG_H GPIOD->IDR - #define SWITCHES_GPIO_PIN_H GPIO_Pin_14 // PD.14 +#elif defined(PCBX7D) + #define SWITCHES_GPIO_REG_H GPIOE->IDR + #define SWITCHES_GPIO_PIN_H GPIO_Pin_15 // PE.15 + // #define SWITCHES_GPIO_REG_H_L GPIOA->IDR + // #define SWITCHES_GPIO_PIN_H_L GPIO_Pin_5 // PA.05 #else #define SWITCHES_GPIO_REG_H GPIOE->IDR #define SWITCHES_GPIO_PIN_H GPIO_Pin_13 // PE.13 @@ -244,6 +277,11 @@ #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR) #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_PAGE | SWITCHES_GPIO_PIN_H) #define KEYS_GPIOE_PINS (KEYS_GPIO_PIN_PLUS | KEYS_GPIO_PIN_ENTER | KEYS_GPIO_PIN_MINUS | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_C_H | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_G_H | SWITCHES_GPIO_PIN_G_L) +#elif defined(PCBX7D) + #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) + #define KEYS_GPIOC_PINS (TRIMS_GPIO_PIN_RVD | TRIMS_GPIO_PIN_RVU | TRIMS_GPIO_PIN_RHL | TRIMS_GPIO_PIN_RHR) + #define KEYS_GPIOD_PINS (KEYS_GPIO_PIN_MENU | KEYS_GPIO_PIN_EXIT | KEYS_GPIO_PIN_PAGE | SWITCHES_GPIO_PIN_A_H | SWITCHES_GPIO_PIN_C_L | SWITCHES_GPIO_PIN_C_H) + #define KEYS_GPIOE_PINS (ENC_GPIO_PIN_A | ENC_GPIO_PIN_B | KEYS_GPIO_PIN_ENTER | TRIMS_GPIO_PIN_LHR | TRIMS_GPIO_PIN_LHL | TRIMS_GPIO_PIN_LVD | TRIMS_GPIO_PIN_LVU | SWITCHES_GPIO_PIN_A_L | SWITCHES_GPIO_PIN_B_H | SWITCHES_GPIO_PIN_B_L | SWITCHES_GPIO_PIN_D_H | SWITCHES_GPIO_PIN_D_L | SWITCHES_GPIO_PIN_F | SWITCHES_GPIO_PIN_H) #else #define KEYS_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC|RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE) #define KEYS_GPIOA_PINS (SWITCHES_GPIO_PIN_C_L) @@ -316,6 +354,19 @@ #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 #define ADC_CHANNEL_BATT ADC_Channel_10 +#elif defined(PCBX7D) + #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 + #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 + #define ADC_GPIO_PIN_BATT GPIO_Pin_0 // PC.00 + #define ADC_GPIOA_PINS (ADC_GPIO_PIN_STICK_RV | ADC_GPIO_PIN_STICK_RH | ADC_GPIO_PIN_STICK_LH | ADC_GPIO_PIN_STICK_LV | ADC_GPIO_PIN_POT1) + #define ADC_GPIOB_PINS ADC_GPIO_PIN_POT2 + #define ADC_GPIOC_PINS ADC_GPIO_PIN_BATT + #define ADC_CHANNEL_POT1 ADC_Channel_6 + #define ADC_CHANNEL_POT2 ADC_Channel_8 + #define ADC_CHANNEL_POT3 ADC_Channel_9 + #define ADC_CHANNEL_SLIDER1 ADC_Channel_14 + #define ADC_CHANNEL_SLIDER2 ADC_Channel_15 + #define ADC_CHANNEL_BATT ADC_Channel_10 #else #define ADC_GPIO_PIN_POT1 GPIO_Pin_6 // PA.06 #define ADC_GPIO_PIN_POT2 GPIO_Pin_0 // PB.00 @@ -333,16 +384,27 @@ #define ADC_CHANNEL_BATT ADC_Channel_10 #endif -// Power_OFF Delay and LED -#define PWR_RCC_AHB1Periph RCC_AHB1Periph_GPIOD +// PWR and LED driver +#define PWR_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD) +#if defined(PCBX9E) || defined(PCBX7D) +#define PWR_PRESS_BUTTON +#endif #define PWR_GPIO GPIOD #define PWR_SWITCH_GPIO_PIN GPIO_Pin_1 // PD.01 #define PWR_ON_GPIO_PIN GPIO_Pin_0 // PD.00 +#if defined(PCBX7D) +#define LED_GREEN_GPIO GPIOC +#define LED_GREEN_GPIO_PIN GPIO_Pin_4 // PC.04 +#define LED_RED_GPIO GPIOC +#define LED_RED_GPIO_PIN GPIO_Pin_5 // PC.05 +#define LED_BLUE_GPIO GPIOB +#define LED_BLUE_GPIO_PIN GPIO_Pin_1 // PB.01 +#endif // Internal Module #define INTMODULE_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA2) #define INTMODULE_RCC_APB2Periph RCC_APB2Periph_TIM1 -#if defined(PCBX9E) || defined(PCBX9DP) +#if defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7D) #define INTMODULE_PWR_GPIO GPIOC #define INTMODULE_PWR_GPIO_PIN GPIO_Pin_6 // PC.06 #else @@ -386,12 +448,12 @@ #define TRAINER_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC) #define TRAINER_RCC_APB1Periph RCC_APB1Periph_TIM3 #define TRAINER_GPIO GPIOC -#define TRAINER_GPIO_PIN_IN GPIO_Pin_8 // PC.08 -#define TRAINER_GPIO_PinSource_IN GPIO_PinSource8 -#define TRAINER_GPIO_PIN_OUT GPIO_Pin_9 // PC.09 -#define TRAINER_GPIO_PinSource_OUT GPIO_PinSource9 -#define TRAINER_GPIO_DETECT GPIOA -#define TRAINER_GPIO_PIN_DETECT GPIO_Pin_8 // PA.08 +#define TRAINER_IN_GPIO_PIN GPIO_Pin_8 // PC.08 +#define TRAINER_IN_GPIO_PinSource GPIO_PinSource8 +#define TRAINER_OUT_GPIO_PIN GPIO_Pin_9 // PC.09 +#define TRAINER_OUT_GPIO_PinSource GPIO_PinSource9 +#define TRAINER_DETECT_GPIO GPIOA +#define TRAINER_DETECT_GPIO_PIN GPIO_Pin_8 // PA.08 #define TRAINER_TIMER TIM3 #define TRAINER_TIMER_IRQn TIM3_IRQn #define TRAINER_GPIO_AF GPIO_AF_TIM3 @@ -406,6 +468,10 @@ #define TRAINER_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) // Serial Port +#if defined(PCBX7D) +#define SERIAL_RCC_AHB1Periph 0 +#define SERIAL_RCC_APB1Periph 0 +#else #define SERIAL_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_DMA1) #define SERIAL_RCC_APB1Periph RCC_APB1Periph_USART3 #define SERIAL_GPIO GPIOB @@ -419,6 +485,7 @@ #define SERIAL_USART_IRQn USART3_IRQn #define SERIAL_DMA_Stream_RX DMA1_Stream1 #define SERIAL_DMA_Channel_RX DMA_Channel_4 +#endif // Telemetry #define TELEMETRY_RCC_AHB1Periph (RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) @@ -469,6 +536,7 @@ #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOE #define BACKLIGHT_RCC_APB1Periph 0 #define BACKLIGHT_RCC_APB2Periph RCC_APB2Periph_TIM9 + #define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #define BACKLIGHT_TIMER TIM9 #define BACKLIGHT_GPIO GPIOE #define BACKLIGHT_GPIO_PIN_1 GPIO_Pin_6 // PE.06 @@ -481,6 +549,7 @@ #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD #define BACKLIGHT_RCC_APB1Periph RCC_APB1Periph_TIM4 #define BACKLIGHT_RCC_APB2Periph 0 + #define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) #define BACKLIGHT_TIMER TIM4 #define BACKLIGHT_GPIO GPIOD #define BACKLIGHT_GPIO_PIN_1 GPIO_Pin_15 // PD.15 @@ -489,18 +558,29 @@ #define BACKLIGHT_GPIO_PinSource_2 GPIO_PinSource13 #define BACKLIGHT_GPIO_AF_1 GPIO_AF_TIM4 #define BACKLIGHT_GPIO_AF_2 GPIO_AF_TIM4 +#elif defined(PCBX7D) + #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOD + #define BACKLIGHT_RCC_APB1Periph RCC_APB1Periph_TIM4 + #define BACKLIGHT_RCC_APB2Periph 0 + #define BACKLIGHT_TIMER_FREQ (PERI1_FREQUENCY * TIMER_MULT_APB1) + #define BACKLIGHT_TIMER TIM4 + #define BACKLIGHT_GPIO GPIOD + #define BACKLIGHT_GPIO_PIN GPIO_Pin_13 // PD.13 + #define BACKLIGHT_GPIO_PinSource GPIO_PinSource13 + #define BACKLIGHT_GPIO_AF GPIO_AF_TIM4 #else #define BACKLIGHT_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define BACKLIGHT_RCC_APB1Periph 0 #define BACKLIGHT_RCC_APB2Periph RCC_APB2Periph_TIM10 + #define BACKLIGHT_TIMER_FREQ (PERI2_FREQUENCY * TIMER_MULT_APB2) #define BACKLIGHT_TIMER TIM10 #define BACKLIGHT_GPIO GPIOB - #define BACKLIGHT_GPIO_PIN_1 GPIO_Pin_8 // PB.08 - #define BACKLIGHT_GPIO_PinSource_1 GPIO_PinSource8 - #define BACKLIGHT_GPIO_AF_1 GPIO_AF_TIM10 + #define BACKLIGHT_GPIO_PIN GPIO_Pin_8 // PB.08 + #define BACKLIGHT_GPIO_PinSource GPIO_PinSource8 + #define BACKLIGHT_GPIO_AF GPIO_AF_TIM10 #endif -// LCD +// LCD driver #if defined(PCBX9E) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 @@ -522,7 +602,7 @@ #define LCD_DMA_FLAG_INT DMA_HIFCR_CTCIF7 #define LCD_SPI SPI3 #define LCD_GPIO_AF GPIO_AF_SPI3 -#elif defined(PCBX9DP) +#elif defined(PCBX9DP) || defined(PCBX7D) #define LCD_RCC_AHB1Periph (RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOD | RCC_AHB1Periph_DMA1) #define LCD_RCC_APB1Periph RCC_APB1Periph_SPI3 #define LCD_SPI_GPIO GPIOC @@ -617,12 +697,12 @@ #define AUDIO_DMA DMA1 // Haptic -#if defined(PCBX9E) || defined(PCBX9DP) +#if defined(PCBX9E) || defined(PCBX9DP) || defined(PCBX7D) #define HAPTIC_RCC_AHB1Periph RCC_AHB1Periph_GPIOB #define HAPTIC_RCC_APB2Periph RCC_APB2Periph_TIM10 #define HAPTIC_GPIO_PinSource GPIO_PinSource8 #define HAPTIC_GPIO GPIOB - #define HAPTIC_GPIO_PIN GPIO_Pin_8 + #define HAPTIC_GPIO_PIN GPIO_Pin_8 // PB.08 #define HAPTIC_GPIO_AF GPIO_AF_TIM10 #define HAPTIC_TIMER TIM10 #else @@ -643,7 +723,7 @@ #define TOPLCD_GPIO_PIN_BL GPIO_Pin_2 #endif -// Bluetooth on X9E +// Bluetooth #if defined(PCBX9E) #define BT_USART USART6 #define BT_GPIO_AF GPIO_AF_USART6 @@ -660,6 +740,22 @@ #define BT_GPIO_PIN_BCTS GPIO_Pin_6 // PG.06 #define BT_GPIO_PinSource_TX GPIO_PinSource14 #define BT_GPIO_PinSource_RX GPIO_PinSource9 +#elif defined(PCBX7D) + #define BT_RCC_AHB1Periph (RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_DMA1) + #define BT_RCC_APB1Periph RCC_APB1Periph_USART3 + #define BT_GPIO_EN GPIOE + #define BT_GPIO_PIN_EN GPIO_Pin_12 // PE.12 + #define BT_GPIO GPIOB + #define BT_GPIO_PIN_TX GPIO_Pin_10 // PB.10 + #define BT_GPIO_PIN_RX GPIO_Pin_11 // PB.11 + #define BT_GPIO_PinSource_TX GPIO_PinSource10 + #define BT_GPIO_PinSource_RX GPIO_PinSource11 + #define BT_GPIO_AF GPIO_AF_USART3 + #define BT_USART USART3 + #define BT_USART_IRQHandler USART3_IRQHandler + #define BT_USART_IRQn USART3_IRQn + #define BT_DMA_Stream_RX DMA1_Stream1 + #define BT_DMA_Channel_RX DMA_Channel_4 #endif // 5ms Interrupt diff --git a/radio/src/targets/taranis/keys_driver.cpp b/radio/src/targets/taranis/keys_driver.cpp index d0447d52db..e48bc9a333 100644 --- a/radio/src/targets/taranis/keys_driver.cpp +++ b/radio/src/targets/taranis/keys_driver.cpp @@ -33,14 +33,14 @@ uint32_t readKeys() if (~KEYS_GPIO_REG_EXIT & KEYS_GPIO_PIN_EXIT) result |= 1 << KEY_EXIT; -#if !defined(PCBX9E) || defined(SIMU) +#if (!defined(PCBX9E) && !defined(PCBX7D)) || defined(SIMU) if (~KEYS_GPIO_REG_PLUS & KEYS_GPIO_PIN_PLUS) result |= 1 << KEY_PLUS; if (~KEYS_GPIO_REG_MINUS & KEYS_GPIO_PIN_MINUS) result |= 1 << KEY_MINUS; #endif - // TRACE("readKeys(): result=0x%02x", result); + // if (result != 0) TRACE("readKeys(): result=0x%02x", result); return result; } @@ -81,42 +81,43 @@ uint8_t keyDown() return readKeys(); } -#if defined(PCBX9E) +#if defined(PCBX9E) || defined(PCBX7D) uint32_t Rotary_position; rotenc_t rotencValue; void checkRotaryEncoder() { - register uint32_t dummy ; + register uint32_t dummy = ENC_GPIO->IDR; // Read Rotary encoder - dummy = ENC_GPIO->IDR; // Read Rotary encoder - dummy >>= 12; // quick & dirty! - dummy &= 0x03; - if ( dummy != ( Rotary_position & 0x03 ) ) - { - if ( ( Rotary_position & 0x01 ) ^ ( ( dummy & 0x02) >> 1 ) ) - { - --rotencValue; - } - else - { - ++rotencValue; - } - Rotary_position &= ~0x03 ; - Rotary_position |= dummy ; - } + // TODO quick & dirty! +#if defined(PCBX9E) + dummy >>= 12; + dummy &= 0x03; +#else + dummy = ((dummy >> 11) & 0x01) + ((dummy >> 8) & 0x02); +#endif + if (dummy != (Rotary_position & 0x03)) { + if ((Rotary_position & 0x01) ^ ((dummy & 0x02) >> 1)) { + --rotencValue; + } + else { + ++rotencValue; + } + Rotary_position &= ~0x03 ; + Rotary_position |= dummy ; + } } #endif /* TODO common to ARM */ void readKeysAndTrims() { - uint8_t enuk = 0; + uint8_t index = 0; uint32_t in = readKeys(); for (uint8_t i = 1; i != uint8_t(1 << TRM_BASE); i <<= 1) { - keys[enuk++].input(in & i); + keys[index++].input(in & i); } -#if defined(PCBX9E) && !defined(SIMU) +#if (defined(PCBX9E) || defined(PCBX7D)) && !defined(SIMU) #define X9E_RE_TIMEOUT 5 static rotenc_t rePreviousValue; rotenc_t reNewValue = (rotencValue / 2); @@ -148,12 +149,11 @@ void readKeysAndTrims() putEvent(EVT_KEY_BREAK(lastkey)); lastkey = 0; } - #endif in = readTrims(); for (uint8_t i = 1; i != uint8_t(1 << 8); i <<= 1) { - keys[enuk++].input(in & i); + keys[index++].input(in & i); } } @@ -186,7 +186,7 @@ void readKeysAndTrims() #define ADD_3POS_CASE(x, i) \ case SW_S ## x ## 0: \ xxx = (SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ + if (IS_CONFIG_3POS(i)) { \ xxx = xxx && (~SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ } \ break; \ @@ -195,28 +195,36 @@ void readKeysAndTrims() break; \ case SW_S ## x ## 2: \ xxx = (~SWITCHES_GPIO_REG_ ## x ## _H & SWITCHES_GPIO_PIN_ ## x ## _H); \ - if (IS_3POS(i)) { \ + if (IS_CONFIG_3POS(i)) { \ xxx = xxx && (SWITCHES_GPIO_REG_ ## x ## _L & SWITCHES_GPIO_PIN_ ## x ## _L); \ } \ break #endif #if !defined(BOOT) -bool switchState(EnumKeys enuk) +uint8_t keyState(uint8_t index) +{ + return keys[index].state(); +} + +uint32_t switchState(uint8_t index) { register uint32_t xxx = 0; - - if (enuk < (int) DIM(keys)) return keys[enuk].state() ? 1 : 0; - - switch ((uint8_t) enuk) { + + switch (index) { ADD_3POS_CASE(A, 0); ADD_3POS_CASE(B, 1); ADD_3POS_CASE(C, 2); ADD_3POS_CASE(D, 3); +#if defined(PCBX7D) + ADD_2POS_CASE(F); + ADD_2POS_CASE(H); +#else ADD_3POS_CASE(E, 4); ADD_2POS_CASE(F); ADD_3POS_CASE(G, 6); ADD_2POS_CASE(H); +#endif #if defined(PCBX9E) ADD_3POS_CASE(I, 8); ADD_3POS_CASE(J, 9); @@ -234,7 +242,7 @@ bool switchState(EnumKeys enuk) break; } - // TRACE("switch %d => %d", enuk, xxx); + // TRACE("switch %d => %d", index, xxx); return xxx; } #endif diff --git a/radio/src/targets/taranis/lcd_driver_spi.cpp b/radio/src/targets/taranis/lcd_driver_spi.cpp index 1a85f923b0..5724f0dc4e 100644 --- a/radio/src/targets/taranis/lcd_driver_spi.cpp +++ b/radio/src/targets/taranis/lcd_driver_spi.cpp @@ -20,9 +20,9 @@ #include "opentx.h" -#define CONTRAST_OFS 160 +#define CONTRAST_OFS 160 #define RESET_WAIT_DELAY_MS 300 // Wait time after LCD reset before first command -#define WAIT_FOR_DMA_END() { while(lcd_busy) {}; } +#define WAIT_FOR_DMA_END() do { } while (lcd_busy) #define LCD_NCS_HIGH() LCD_NCS_GPIO->BSRRL = LCD_NCS_GPIO_PIN #define LCD_NCS_LOW() LCD_NCS_GPIO->BSRRH = LCD_NCS_GPIO_PIN @@ -36,16 +36,16 @@ bool lcdInitFinished = false; void lcdInitFinish(); -void lcdWriteCommand(uint8_t Command_Byte) +void lcdWriteCommand(uint8_t byte) { LCD_A0_LOW(); LCD_NCS_LOW(); - while ( ( SPI3->SR & SPI_SR_TXE ) == 0 ) { + while ((SPI3->SR & SPI_SR_TXE) == 0) { // Wait } - (void)SPI3->DR; // Clear receive - SPI3->DR = Command_Byte; - while ( ( SPI3->SR & SPI_SR_RXNE ) == 0 ) { + (void)SPI3->DR; // Clear receive + LCD_SPI->DR = byte; + while ((SPI3->SR & SPI_SR_RXNE) == 0) { // Wait } LCD_NCS_HIGH(); @@ -89,13 +89,33 @@ void lcdHardwareInit() LCD_DMA->HIFCR = LCD_DMA_FLAGS; // Write ones to clear bits LDC_DMA_Stream->CR = DMA_SxCR_PL_0 | DMA_SxCR_MINC | DMA_SxCR_DIR_0; LDC_DMA_Stream->PAR = (uint32_t)&LCD_SPI->DR; +#if defined(PCBX7D) + LDC_DMA_Stream->NDTR = LCD_W; +#else LDC_DMA_Stream->M0AR = (uint32_t)displayBuf; - LDC_DMA_Stream->FCR = 0x05; // DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; LDC_DMA_Stream->NDTR = LCD_W*LCD_H/8*4; +#endif + LDC_DMA_Stream->FCR = 0x05; // DMA_SxFCR_DMDIS | DMA_SxFCR_FTH_0; NVIC_EnableIRQ(LCD_DMA_Stream_IRQn); } +#if defined(PCBX7D) +void lcdStart() +{ + lcdWriteCommand(0xe2); // (14) Soft reset + lcdWriteCommand(0xa0); // Set seg direct + lcdWriteCommand(0xc8); // Set com direct + lcdWriteCommand(0xf8); // Set booster + lcdWriteCommand(0x00); // 5x + lcdWriteCommand(0xa3); // Set bias=1/6 + lcdWriteCommand(0x22); // Set internal rb/ra=5.0 + lcdWriteCommand(0x2f); // All built-in power circuits on + lcdWriteCommand(0x81); // Set contrast + lcdWriteCommand(0x36); // Set Vop + lcdWriteCommand(0xa6); // Set display mode +} +#else void lcdStart() { lcdWriteCommand(0x2F); // Internal pump control @@ -139,11 +159,12 @@ void lcdWriteAddress(uint8_t x, uint8_t y) lcdWriteCommand((y&0x0F) | 0x60); // Set Row Address LSB RA [3:0] lcdWriteCommand(((y>>4) & 0x0F) | 0x70); // Set Row Address MSB RA [7:4] } +#endif volatile bool lcd_busy; #if !defined(LCD_DUAL_BUFFER) -void lcdRefreshWait() +void lcdRefreshWait() { WAIT_FOR_DMA_END(); } @@ -155,6 +176,29 @@ void lcdRefresh(bool wait) lcdInitFinish(); } +#if defined(PCBX7D) + uint8_t * p = displayBuf; + for (uint8_t y=0; y < 8; y++, p+=LCD_W) { + lcdWriteCommand(0x10); // Column addr 0 + lcdWriteCommand(0xB0 | y); // Page addr y + lcdWriteCommand(0x00); + + LCD_NCS_LOW(); + LCD_A0_HIGH(); + + lcd_busy = true; + LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA + LCD_DMA->HIFCR = LCD_DMA_FLAGS; // Write ones to clear bits + LDC_DMA_Stream->M0AR = (uint32_t)p; + LDC_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts + LCD_SPI->CR2 |= SPI_CR2_TXDMAEN; + + WAIT_FOR_DMA_END(); + + LCD_NCS_HIGH(); + LCD_A0_HIGH(); + } +#else // Wait if previous DMA transfer still active WAIT_FOR_DMA_END(); lcd_busy = true; @@ -175,6 +219,7 @@ void lcdRefresh(bool wait) LDC_DMA_Stream->CR |= DMA_SxCR_EN | DMA_SxCR_TCIE; // Enable DMA & TC interrupts LCD_SPI->CR2 |= SPI_CR2_TXDMAEN; +#endif } extern "C" void LCD_DMA_Stream_IRQHandler() @@ -186,8 +231,8 @@ extern "C" void LCD_DMA_Stream_IRQHandler() LCD_SPI->CR2 &= ~SPI_CR2_TXDMAEN; LDC_DMA_Stream->CR &= ~DMA_SxCR_EN; // Disable DMA - while ( LCD_SPI->SR & SPI_SR_BSY ) { - /* Wait for SPI to finish sending data + while (LCD_SPI->SR & SPI_SR_BSY) { + /* Wait for SPI to finish sending data The DMA TX End interrupt comes two bytes before the end of SPI transmission, therefore we have to wait here. */ @@ -204,18 +249,22 @@ void lcdOff() { WAIT_FOR_DMA_END(); - /* + /* LCD Sleep mode is also good for draining capacitors and enables us to re-init LCD without any delay */ - lcdWriteCommand(0xAE); //LCD sleep - delay_ms(3); //wait for caps to drain + lcdWriteCommand(0xAE); // LCD sleep + delay_ms(3); // Wait for caps to drain } void lcdReset() { LCD_RST_LOW(); - delay_ms(1); // only 3 us needed according to data-sheet, we use 1 ms +#if defined(PCBX7D) + delay_ms(150); +#else + delay_ms(1); // Only 3 us needed according to data-sheet, we use 1 ms +#endif LCD_RST_HIGH(); } @@ -236,7 +285,7 @@ void lcdInit() } /* - Finishes LCD initialization. It is called auto-magically when first LCD command is + Finishes LCD initialization. It is called auto-magically when first LCD command is issued by the other parts of the code. */ void lcdInitFinish() @@ -244,19 +293,19 @@ void lcdInitFinish() lcdInitFinished = true; /* - LCD needs longer time to initialize in low temperatures. The data-sheet - mentions a time of at least 150 ms. The delay of 1300 ms was obtained + LCD needs longer time to initialize in low temperatures. The data-sheet + mentions a time of at least 150 ms. The delay of 1300 ms was obtained experimentally. It was tested down to -10 deg Celsius. - The longer initialization time seems to only be needed for regular Taranis, + The longer initialization time seems to only be needed for regular Taranis, the Taranis Plus (9XE) has been tested to work without any problems at -18 deg Celsius. Therefore the delay for T+ is lower. If radio is reset by watchdog or boot-loader the wait is skipped, but the LCD - is initialized in any case. + is initialized in any case. - This initialization is needed in case the user moved power switch to OFF and - then immediately to ON position, because lcdOff() was called. In any case the LCD + This initialization is needed in case the user moved power switch to OFF and + then immediately to ON position, because lcdOff() was called. In any case the LCD initialization (without reset) is also recommended by the data sheet. */ @@ -279,8 +328,10 @@ void lcdSetRefVolt(uint8_t val) lcdInitFinish(); } +#if !defined(PCBX7D) WAIT_FOR_DMA_END(); lcdWriteCommand(0x81); // Set Vop lcdWriteCommand(val+CONTRAST_OFS); // 0-255 +#endif } diff --git a/radio/src/targets/taranis/led_driver.cpp b/radio/src/targets/taranis/led_driver.cpp new file mode 100644 index 0000000000..2b5c2707be --- /dev/null +++ b/radio/src/targets/taranis/led_driver.cpp @@ -0,0 +1,63 @@ +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +#include "opentx.h" + +void ledInit() +{ + GPIO_InitTypeDef GPIO_InitStructure; + GPIO_InitStructure.GPIO_Pin = LED_GREEN_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; + GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; + GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; + GPIO_Init(LED_GREEN_GPIO, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = LED_RED_GPIO_PIN; + GPIO_Init(LED_RED_GPIO, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = LED_BLUE_GPIO_PIN; + GPIO_Init(LED_BLUE_GPIO, &GPIO_InitStructure); +} + +void ledOff() +{ + GPIO_ResetBits(LED_RED_GPIO, LED_RED_GPIO_PIN); + GPIO_ResetBits(LED_BLUE_GPIO, LED_BLUE_GPIO_PIN); + GPIO_ResetBits(LED_GREEN_GPIO, LED_GREEN_GPIO_PIN); +} + +void ledRed() +{ + ledOff(); + GPIO_SetBits(LED_RED_GPIO, LED_RED_GPIO_PIN); +} + +void ledGreen() +{ + ledOff(); + GPIO_SetBits(LED_GREEN_GPIO, LED_GREEN_GPIO_PIN); +} + +void ledBlue() +{ + ledOff(); + GPIO_SetBits(LED_BLUE_GPIO, LED_BLUE_GPIO_PIN); +} diff --git a/radio/src/targets/taranis/pulses_driver.cpp b/radio/src/targets/taranis/pulses_driver.cpp index f7d59456f7..2303a890cd 100644 --- a/radio/src/targets/taranis/pulses_driver.cpp +++ b/radio/src/targets/taranis/pulses_driver.cpp @@ -39,6 +39,25 @@ void extmoduleCrossfireStart(void); void intmoduleSendNextFrame(); +void modulesInit() +{ + GPIO_InitTypeDef GPIO_InitStructure; + + GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); + + GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); + GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; + GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); + + GPIO_InitStructure.GPIO_Pin = TRAINER_DETECT_GPIO_PIN; + GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; + GPIO_Init(TRAINER_DETECT_GPIO, &GPIO_InitStructure); +} + void init_pxx(uint32_t port) { if (port == INTERNAL_MODULE) diff --git a/radio/src/targets/taranis/pwr_driver.c b/radio/src/targets/taranis/pwr_driver.cpp similarity index 73% rename from radio/src/targets/taranis/pwr_driver.c rename to radio/src/targets/taranis/pwr_driver.cpp index b40f2a08ea..1f173dda74 100644 --- a/radio/src/targets/taranis/pwr_driver.c +++ b/radio/src/targets/taranis/pwr_driver.cpp @@ -38,21 +38,6 @@ void pwrInit() GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; GPIO_Init(PWR_GPIO, &GPIO_InitStructure); - // TODO not here - GPIO_ResetBits(INTMODULE_PWR_GPIO, INTMODULE_PWR_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = INTMODULE_PWR_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_Init(INTMODULE_PWR_GPIO, &GPIO_InitStructure); - - GPIO_ResetBits(EXTMODULE_PWR_GPIO, EXTMODULE_PWR_GPIO_PIN); - GPIO_InitStructure.GPIO_Pin = EXTMODULE_PWR_GPIO_PIN; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; - GPIO_Init(EXTMODULE_PWR_GPIO, &GPIO_InitStructure); - - GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_DETECT; - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; - GPIO_Init(TRAINER_GPIO_DETECT, &GPIO_InitStructure); - pwrOn(); } @@ -66,12 +51,12 @@ void pwrOff() GPIO_ResetBits(PWR_GPIO, PWR_ON_GPIO_PIN); // disable interrupts - __disable_irq(); + __disable_irq(); - while(1) { + while (1) { wdt_reset(); -#if defined(PCBX9E) - // 9E needs watchdog reset because CPU is still running while +#if defined(PWR_PRESS_BUTTON) + // X9E/X7D needs watchdog reset because CPU is still running while // the power key is held pressed by the user. // The power key should be released by now, but we must make sure if (!pwrPressed()) { @@ -90,7 +75,7 @@ void pwrOff() // this function must not return! } -#if defined(PCBX9E) +#if defined(PWR_PRESS_BUTTON) uint32_t pwrPressed() { return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) == Bit_RESET; @@ -100,9 +85,6 @@ uint32_t pwroffPressed() { return GPIO_ReadInputDataBit(PWR_GPIO, PWR_SWITCH_GPIO_PIN) != Bit_RESET; } -#endif - -#if !defined(PCBX9E) uint32_t pwrCheck() { if (!pwroffPressed()) diff --git a/radio/src/targets/taranis/telemetry_driver.cpp b/radio/src/targets/taranis/telemetry_driver.cpp index 7d36cf213c..4f3035094d 100644 --- a/radio/src/targets/taranis/telemetry_driver.cpp +++ b/radio/src/targets/taranis/telemetry_driver.cpp @@ -171,6 +171,7 @@ extern "C" void TELEMETRY_USART_IRQHandler(void) // TODO we should have telemetry in an higher layer, functions above should move to a sport_driver.cpp int telemetryGetByte(uint8_t * byte) { +#if defined(SERIAL2) if (telemetryProtocol == PROTOCOL_FRSKY_D_SECONDARY) { if (serial2Mode == UART_MODE_TELEMETRY) return serial2RxFifo.pop(*byte); @@ -180,4 +181,7 @@ int telemetryGetByte(uint8_t * byte) else { return telemetryFifo.pop(*byte); } +#else + return telemetryFifo.pop(*byte); +#endif } diff --git a/radio/src/targets/taranis/trainer_driver.cpp b/radio/src/targets/taranis/trainer_driver.cpp index c26ca17620..28bbeb32f1 100644 --- a/radio/src/targets/taranis/trainer_driver.cpp +++ b/radio/src/targets/taranis/trainer_driver.cpp @@ -26,10 +26,10 @@ void trainerSendNextFrame(); void init_trainer_ppm() { - GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_GPIO_PinSource_OUT, TRAINER_GPIO_AF); + GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_OUT_GPIO_PinSource, TRAINER_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_OUT; + GPIO_InitStructure.GPIO_Pin = TRAINER_OUT_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; @@ -66,10 +66,10 @@ void stop_trainer_ppm() void init_trainer_capture() { - GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_GPIO_PinSource_IN, TRAINER_GPIO_AF); + GPIO_PinAFConfig(TRAINER_GPIO, TRAINER_IN_GPIO_PinSource, TRAINER_GPIO_AF); GPIO_InitTypeDef GPIO_InitStructure; - GPIO_InitStructure.GPIO_Pin = TRAINER_GPIO_PIN_IN; + GPIO_InitStructure.GPIO_Pin = TRAINER_IN_GPIO_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; @@ -261,8 +261,10 @@ int sbusGetByte(uint8_t * byte) switch (currentTrainerMode) { case TRAINER_MODE_MASTER_SBUS_EXTERNAL_MODULE: return heartbeatFifo.pop(*byte); +#if defined(SERIAL2) case TRAINER_MODE_MASTER_BATTERY_COMPARTMENT: return serial2RxFifo.pop(*byte); +#endif default: return false; } diff --git a/radio/src/tasks_arm.cpp b/radio/src/tasks_arm.cpp index 698175946a..c9b995ca62 100644 --- a/radio/src/tasks_arm.cpp +++ b/radio/src/tasks_arm.cpp @@ -79,7 +79,7 @@ void stackPaint() #endif } -#if defined(CPUSTM32) && !defined(SIMU) +#if defined(STM32) && !defined(SIMU) uint16_t stackSize() { return ((unsigned char *)&_estack - (unsigned char *)&_main_stack_start) / 4; diff --git a/radio/src/telemetry/frsky.cpp b/radio/src/telemetry/frsky.cpp index 4d72aa0f4d..c9b12d7457 100644 --- a/radio/src/telemetry/frsky.cpp +++ b/radio/src/telemetry/frsky.cpp @@ -57,7 +57,7 @@ NOINLINE void processFrskyTelemetryData(uint8_t data) btPushByte(data); #endif -#if defined(PCBTARANIS) +#if defined(SERIAL2) if (g_eeGeneral.serial2Mode == UART_MODE_TELEMETRY_MIRROR) { serial2Putc(data); } diff --git a/radio/src/telemetry/frsky_sport.cpp b/radio/src/telemetry/frsky_sport.cpp index 5ae2daa63d..f55a2723e0 100644 --- a/radio/src/telemetry/frsky_sport.cpp +++ b/radio/src/telemetry/frsky_sport.cpp @@ -229,7 +229,7 @@ void processSportPacket(uint8_t * packet) uint16_t id = *((uint16_t *)(packet+2)); uint32_t data = SPORT_DATA_S32(packet); -#if defined(CPUSTM32) && !defined(SIMU) +#if defined(STM32) && !defined(SIMU) if (sportUpdateState != SPORT_IDLE) { processSportUpdatePacket(packet); // Uses different chksum return; @@ -388,7 +388,7 @@ void frskySportSetDefault(int index, uint16_t id, uint8_t subId, uint8_t instanc storageDirty(EE_MODEL); } -#if defined(CPUSTM32) +#if defined(STM32) bool sportWaitState(SportUpdateState state, int timeout) { #if defined(SIMU) diff --git a/radio/src/telemetry/jeti.cpp b/radio/src/telemetry/jeti.cpp index 2187268264..22294d25bf 100644 --- a/radio/src/telemetry/jeti.cpp +++ b/radio/src/telemetry/jeti.cpp @@ -28,10 +28,10 @@ void telemetryInterrupt10ms() { if (jetiReady) { jetiKeys = JETI_KEY_NOCHANGE; - if (switchState((EnumKeys)(KEY_UP))) jetiKeys &= JETI_KEY_UP; - if (switchState((EnumKeys)(KEY_DOWN))) jetiKeys &= JETI_KEY_DOWN; - if (switchState((EnumKeys)(KEY_LEFT))) jetiKeys &= JETI_KEY_LEFT; - if (switchState((EnumKeys)(KEY_RIGHT))) jetiKeys &= JETI_KEY_RIGHT; + if (switchState(KEY_UP)) jetiKeys &= JETI_KEY_UP; + if (switchState(KEY_DOWN)) jetiKeys &= JETI_KEY_DOWN; + if (switchState(KEY_LEFT)) jetiKeys &= JETI_KEY_LEFT; + if (switchState(KEY_RIGHT)) jetiKeys &= JETI_KEY_RIGHT; jetiReady = 0; // invalidate buffer @@ -192,7 +192,7 @@ void JETI_put_stop (void) void menuViewTelemetryJeti(uint8_t event) { - lcdDrawTelemetryTopBar(); + drawTelemetryTopBar(); for (uint8_t i=0; i<16; i++) { lcdDrawChar((i+2)*FW, 3*FH, jetiRxBuffer[i], BSS); diff --git a/radio/src/telemetry/nmea.cpp b/radio/src/telemetry/nmea.cpp index 81184904f2..75a0f91dfb 100644 --- a/radio/src/telemetry/nmea.cpp +++ b/radio/src/telemetry/nmea.cpp @@ -460,7 +460,7 @@ void menuViewTelemetryNMEA1(uint8_t event) if ((show_timer == 1) && rbuf[0][0]) { // show the Timer when data have been received lcd_puts ( 2*FW, 4*FH, PSTR("Timer")); // display "Timer" - putsTimer ( 5*FW, 5*FH, (gpstime-gpstimer), DBLSIZE, DBLSIZE); // display difference as mm:ss + drawTimer ( 5*FW, 5*FH, (gpstime-gpstimer), DBLSIZE, DBLSIZE); // display difference as mm:ss } else { diff --git a/radio/src/telemetry/telemetry.cpp b/radio/src/telemetry/telemetry.cpp index 3031b2ee8b..addf22f0b7 100644 --- a/radio/src/telemetry/telemetry.cpp +++ b/radio/src/telemetry/telemetry.cpp @@ -56,7 +56,7 @@ lcdint_t applyChannelRatio(source_t channel, lcdint_t val) } #endif -#if defined(CPUSTM32) +#if defined(STM32) #define IS_TELEMETRY_INTERNAL_MODULE (g_model.moduleData[INTERNAL_MODULE].rfProtocol != RF_PROTO_OFF) #else #define IS_TELEMETRY_INTERNAL_MODULE (false) @@ -96,7 +96,7 @@ void telemetryWakeup() } #endif -#if defined(CPUSTM32) +#if defined(STM32) uint8_t data; if (!telemetryFifo.isEmpty()) { LOG_TELEMETRY_WRITE_START(); @@ -132,7 +132,7 @@ void telemetryWakeup() #endif #if defined(CPUARM) - for (int i=0; i TELEMETRY_VALUE_OLD_THRESHOLD) { @@ -226,7 +226,7 @@ void telemetryInterrupt10ms() if (TELEMETRY_STREAMING()) { if (!TELEMETRY_OPENXSENSOR()) { #if defined(CPUARM) - for (int i=0; i=0; index--) { + for (int index=MAX_TELEMETRY_SENSORS-1; index>=0; index--) { TelemetrySensor & telemetrySensor = g_model.telemetrySensors[index]; if (telemetrySensor.isAvailable()) { return index; @@ -467,7 +467,7 @@ void setTelemetryValue(TelemetryProtocol protocol, uint16_t id, uint8_t subId, u { bool available = false; - for (int index=0; indexweight=110; md->mltpx=MLTPX_ADD; md->delayUp = 6; md->delayDown = 6; md->speedUp = 8; md->speedDown = 8; + md=setDest(MAX_OUTPUT_CHANNELS-1, MIXSRC_SW1, true); md->weight=110; md->mltpx=MLTPX_ADD; md->delayUp = 6; md->delayDown = 6; md->speedUp = 8; md->speedDown = 8; setLogicalSwitch(1, LS_FUNC_VNEG, MIXSRC_LAST_CH, 0); break; diff --git a/radio/src/templates.h b/radio/src/templates.h index ebc64e7ce1..1e5a334751 100644 --- a/radio/src/templates.h +++ b/radio/src/templates.h @@ -1,23 +1,23 @@ -/* - * Copyright (C) OpenTX - * - * Based on code named - * th9x - http://code.google.com/p/th9x - * er9x - http://code.google.com/p/er9x - * gruvin9x - http://code.google.com/p/gruvin9x - * - * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 2 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - +/* + * Copyright (C) OpenTX + * + * Based on code named + * th9x - http://code.google.com/p/th9x + * er9x - http://code.google.com/p/er9x + * gruvin9x - http://code.google.com/p/gruvin9x + * + * License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + /* * ============================================================ * Templates file @@ -37,12 +37,11 @@ * */ -#ifndef _TEMPLATES_H_ -#define _TEMPLATES_H_ +#ifndef _TEMPLATES_H_ +#define _TEMPLATES_H_ #include - #define STK_RUD 1 #define STK_ELE 2 #define STK_THR 3 @@ -76,6 +75,6 @@ void clearMixes(); void clearCurves(); void applyTemplate(uint8_t idx); -#endif // _TEMPLATES_H_ +#endif // _TEMPLATES_H_ diff --git a/radio/src/tests/crossfire.cpp b/radio/src/tests/crossfire.cpp index 6cf94f8e59..60d88ff86c 100644 --- a/radio/src/tests/crossfire.cpp +++ b/radio/src/tests/crossfire.cpp @@ -24,12 +24,12 @@ uint8_t createCrossfireChannelsFrame(uint8_t * frame, int16_t * pulses); TEST(Crossfire, createCrossfireChannelsFrame) { - int16_t pulsesStart[NUM_TRAINER]; + int16_t pulsesStart[MAX_TRAINER_CHANNELS]; uint8_t crossfire[CROSSFIRE_FRAME_MAXLEN]; memset(crossfire, 0, sizeof(crossfire)); - for (int i=0; i= 212 unsigned int previousDepth = 0xFF; #endif for (int y=0; y= 212 unsigned int idx = (y/2) * LCD_W; #else unsigned int idx = (y/8) * LCD_W; unsigned int mask = (1 << (y%8)); #endif for (int x=0; x= 212 TEST(outdezNAtt, test_unsigned) { lcdClear(); @@ -268,19 +268,19 @@ TEST(Lcd, Dblsize) } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, DrawSwitch) { lcdClear(); - putsSwitches(0, 10, SWSRC_SA0, 0); - putsSwitches(30, 10, SWSRC_SA0, SMLSIZE); - // putsSwitches(60, 10, SWSRC_SA0, MIDSIZE); missing arrows in this font - putsSwitches(90, 10, SWSRC_SA0, DBLSIZE); + drawSwitch(0, 10, SWSRC_SA0, 0); + drawSwitch(30, 10, SWSRC_SA0, SMLSIZE); + // drawSwitch(60, 10, SWSRC_SA0, MIDSIZE); missing arrows in this font + drawSwitch(90, 10, SWSRC_SA0, DBLSIZE); EXPECT_TRUE(checkScreenshot("drawswitch")); } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, BMPWrapping) { lcdClear(); @@ -294,7 +294,7 @@ TEST(Lcd, BMPWrapping) } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawHorizontalLine) { lcdClear(); @@ -307,7 +307,7 @@ TEST(Lcd, lcdDrawHorizontalLine) } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawVerticalLine) { lcdClear(); @@ -347,7 +347,7 @@ public: }; }; -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawBitmapLoadAndDisplay) { lcdClear(); @@ -398,7 +398,7 @@ TEST(Lcd, lcdDrawBitmapLoadAndDisplay) } #endif -#if defined(PCBTARANIS) +#if defined(PCBTARANIS) && LCD_W >= 212 TEST(Lcd, lcdDrawLine) { int start, length, xOffset; diff --git a/radio/src/tests/mixer.cpp b/radio/src/tests/mixer.cpp index be2c501739..8ceef58dd5 100644 --- a/radio/src/tests/mixer.cpp +++ b/radio/src/tests/mixer.cpp @@ -19,12 +19,11 @@ */ #include "gtests.h" -#include "templates.h" #define CHECK_NO_MOVEMENT(channel, value, duration) \ for (int i=1; i<=(duration); i++) { \ evalFlightModeMixes(e_perout_mode_normal, 1); \ - EXPECT_EQ(chans[(channel)], (value)); \ + GTEST_ASSERT_EQ((value), chans[(channel)]); \ } #define CHECK_SLOW_MOVEMENT(channel, sign, duration) \ @@ -32,7 +31,7 @@ for (int i=1; i<=(duration); i++) { \ evalFlightModeMixes(e_perout_mode_normal, 1); \ lastAct = lastAct + (sign) * (1<<19)/500; /* 100 on ARM */ \ - EXPECT_EQ(chans[(channel)], 256 * (lastAct >> 8)); \ + GTEST_ASSERT_EQ(256 * (lastAct >> 8), chans[(channel)]); \ } \ } while (0) @@ -41,7 +40,7 @@ int32_t value = chans[(channel)]; \ for (int i=1; i<=(duration); i++) { \ evalFlightModeMixes(e_perout_mode_normal, 1); \ - EXPECT_EQ(chans[(channel)], value); \ + GTEST_ASSERT_EQ(chans[(channel)], value); \ } \ } while (0) @@ -173,7 +172,7 @@ TEST(Trims, throttleTrimWithZeroWeightOnThrottle) MODEL_RESET(); modelDefault(0); g_model.thrTrim = 1; -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) // the input already exists ExpoData *expo = expoAddress(THR_STICK); #else @@ -252,7 +251,7 @@ TEST(Trims, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) modelDefault(0); g_model.throttleReversed = 1; g_model.thrTrim = 1; -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) // the input already exists ExpoData *expo = expoAddress(THR_STICK); #else @@ -325,7 +324,7 @@ TEST(Trims, invertedThrottlePlusthrottleTrimWithZeroWeightOnThrottle) EXPECT_EQ(channelOutputs[2], 0); } -#if !defined(VIRTUALINPUTS) +#if !defined(VIRTUAL_INPUTS) TEST(Trims, greaterTrimLink) { MODEL_RESET(); @@ -395,7 +394,7 @@ TEST(Trims, InstantTrim) EXPECT_EQ(25, getTrimValue(0, AIL_STICK)); } -#if defined(VIRTUALINPUTS) +#if defined(VIRTUAL_INPUTS) TEST(Trims, InstantTrimNegativeCurve) { MODEL_RESET(); @@ -743,7 +742,11 @@ TEST(Mixer, SlowOnSwitchSource) MIXER_RESET(); g_model.mixData[0].destCh = 0; g_model.mixData[0].mltpx = MLTPX_ADD; - g_model.mixData[0].srcRaw = TR(MIXSRC_THR, MIXSRC_SA); +#if defined(PCBTARANIS) || defined(PCBHORUS) + g_model.mixData[0].srcRaw = MIXSRC_SA; +#else + g_model.mixData[0].srcRaw = MIXSRC_THR; +#endif g_model.mixData[0].weight = 100; g_model.mixData[0].speedUp = SLOW_STEP*5; g_model.mixData[0].speedDown = SLOW_STEP*5; @@ -784,7 +787,11 @@ TEST(Mixer, DelayOnSwitch) g_model.mixData[0].mltpx = MLTPX_ADD; g_model.mixData[0].srcRaw = MIXSRC_MAX; g_model.mixData[0].weight = 100; - g_model.mixData[0].swtch = TR(SWSRC_THR, SWSRC_SA2); +#if defined(PCBTARANIS) + g_model.mixData[0].swtch = SWSRC_SA2; +#else + g_model.mixData[0].swtch = SWSRC_THR; +#endif g_model.mixData[0].delayUp = DELAY_STEP*5; g_model.mixData[0].delayDown = DELAY_STEP*5; @@ -866,7 +873,7 @@ TEST(Mixer, SlowOnSwitchReplace) } #endif -#if !defined(VIRTUALINPUTS) +#if !defined(VIRTUAL_INPUTS) TEST(Mixer, NoTrimOnInactiveMix) { MODEL_RESET(); @@ -919,7 +926,7 @@ TEST(Mixer, SlowOnMultiply) } -#if defined(HELI) && defined(VIRTUALINPUTS) +#if defined(HELI) && defined(VIRTUAL_INPUTS) TEST(Heli, BasicTest) { MODEL_RESET(); @@ -982,7 +989,7 @@ TEST(Heli, Mode2Test) } #endif -#if defined(HELI) && !defined(VIRTUALINPUTS) +#if defined(HELI) && !defined(VIRTUAL_INPUTS) TEST(Heli, SimpleTest) { MODEL_RESET(); diff --git a/radio/src/tests/switches.cpp b/radio/src/tests/switches.cpp index ae629965ff..b0bdca6cbc 100644 --- a/radio/src/tests/switches.cpp +++ b/radio/src/tests/switches.cpp @@ -20,7 +20,7 @@ #include "gtests.h" -#if !defined(VIRTUALINPUTS) +#if !defined(VIRTUAL_INPUTS) TEST(getSwitch, undefCSW) { MODEL_RESET(); @@ -45,8 +45,7 @@ TEST(getSwitch, circularCSW) } #endif -#if defined(VIRTUALINPUTS) - +#if defined(VIRTUAL_INPUTS) void setLogicalSwitch(int index, uint16_t _func, int16_t _v1, int16_t _v2, int16_t _v3 = 0, uint8_t _delay = 0, uint8_t _duration = 0, int8_t _andsw = 0) { g_model.logicalSw[index].func = _func; @@ -57,7 +56,9 @@ void setLogicalSwitch(int index, uint16_t _func, int16_t _v1, int16_t _v2, int16 g_model.logicalSw[index].duration = _duration; g_model.logicalSw[index].andsw = _andsw; } +#endif +#if defined(PCBTARANIS) TEST(getSwitch, OldTypeStickyCSW) { RADIO_RESET(); @@ -89,7 +90,7 @@ TEST(getSwitch, OldTypeStickyCSW) EXPECT_EQ(getSwitch(SWSRC_SW1), false); EXPECT_EQ(getSwitch(SWSRC_SW2), false); } -#endif // #if defined(VIRTUALINPUTS) +#endif TEST(getSwitch, nullSW) { @@ -128,7 +129,7 @@ TEST(getSwitch, recursiveSW) } #endif // #if !defined(CPUARM) -#if defined(VIRTUALINPUTS) +#if defined(PCBTARANIS) TEST(getSwitch, inputWithTrim) { MODEL_RESET(); @@ -149,7 +150,7 @@ TEST(getSwitch, inputWithTrim) } #endif -#if defined(VIRTUALINPUTS) +#if defined(PCBTARANIS) TEST(evalLogicalSwitches, playFile) { SYSTEM_RESET(); @@ -178,7 +179,9 @@ TEST(evalLogicalSwitches, playFile) #undef MODELNAME } +#endif +#if defined(PCBTARANIS) && !defined(PCBX7D) TEST(getSwitch, edgeInstant) { MODEL_RESET(); @@ -186,7 +189,7 @@ TEST(getSwitch, edgeInstant) // LS1 setup: EDGE SFup (0:instant) // LS2 setup: (EDGE SFup (0:instant)) AND SAup setLogicalSwitch(0, LS_FUNC_EDGE, SWSRC_SF2, -129, -1); - setLogicalSwitch(1, LS_FUNC_EDGE, SWSRC_SF2, -129, -1, 0, 0, SWSRC_SA2 ); + setLogicalSwitch(1, LS_FUNC_EDGE, SWSRC_SF2, -129, -1, 0, 0, SWSRC_SA2); simuSetSwitch(0, -1); //SA down simuSetSwitch(5, 0); //SF down @@ -354,5 +357,4 @@ TEST(getSwitch, edgeRelease) EXPECT_EQ(getSwitch(SWSRC_SW2), false); } - -#endif // #if defined(CPUARM) +#endif // defined(PCBTARANIS) diff --git a/radio/src/tests/timers.cpp b/radio/src/tests/timers.cpp index 3856c2b4ad..73124267d3 100644 --- a/radio/src/tests/timers.cpp +++ b/radio/src/tests/timers.cpp @@ -19,8 +19,6 @@ */ #include "gtests.h" -#include "opentx.h" -#include "timers.h" #if !defined(CPUARM) #undef timerSet diff --git a/radio/src/trainer_input.cpp b/radio/src/trainer_input.cpp index bde99a9eae..50b3aa75d5 100644 --- a/radio/src/trainer_input.cpp +++ b/radio/src/trainer_input.cpp @@ -20,7 +20,7 @@ #include "trainer_input.h" -int16_t ppmInput[NUM_TRAINER]; +int16_t ppmInput[MAX_TRAINER_CHANNELS]; uint8_t ppmInputValidityTimer; diff --git a/radio/src/trainer_input.h b/radio/src/trainer_input.h index 0147324454..8a0524c155 100644 --- a/radio/src/trainer_input.h +++ b/radio/src/trainer_input.h @@ -24,7 +24,7 @@ #include "opentx.h" // Trainer input channels -extern int16_t ppmInput[NUM_TRAINER]; +extern int16_t ppmInput[MAX_TRAINER_CHANNELS]; // Timer gets decremented in per10ms() #define PPM_IN_VALID_TIMEOUT 100 // 1s @@ -56,7 +56,7 @@ inline void captureTrainerPulses(uint16_t capture) channelNumber = 1; // triggered } else { - if ((channelNumber > 0) && (channelNumber <= NUM_TRAINER)) { + if ((channelNumber > 0) && (channelNumber <= MAX_TRAINER_CHANNELS)) { if (val>800 && val<2200) { ppmInputValidityTimer = PPM_IN_VALID_TIMEOUT; ppmInput[channelNumber++ - 1] = diff --git a/radio/src/translations.cpp b/radio/src/translations.cpp index 736924425c..4e171c8a3d 100644 --- a/radio/src/translations.cpp +++ b/radio/src/translations.cpp @@ -330,14 +330,14 @@ const pm_char STR_MENUDATEANDTIME[] PROGMEM = TR_MENUDATEANDTIME; const pm_char STR_MENUTRAINER[] PROGMEM = TR_MENUTRAINER; const pm_char STR_MENUSPECIALFUNCS[] PROGMEM = TR_MENUSPECIALFUNCS; const pm_char STR_MENUVERSION[] PROGMEM = TR_MENUVERSION; -const pm_char STR_MENUDIAG[] PROGMEM = TR_MENUDIAG; -const pm_char STR_MENUANA[] PROGMEM = TR_MENUANA; +const pm_char STR_MENU_RADIO_SWITCHES[] PROGMEM = TR_MENU_RADIO_SWITCHES; +const pm_char STR_MENU_RADIO_ANALOGS[] PROGMEM = TR_MENU_RADIO_ANALOGS; const pm_char STR_MENUCALIBRATION[] PROGMEM = TR_MENUCALIBRATION; const pm_char STR_MENUMODELSEL[] PROGMEM = TR_MENUMODELSEL; const pm_char STR_MENUSETUP[] PROGMEM = TR_MENUSETUP; -const pm_char STR_MENUFLIGHTPHASE[] PROGMEM = TR_MENUFLIGHTPHASE; -const pm_char STR_MENUFLIGHTPHASES[] PROGMEM = TR_MENUFLIGHTPHASES; +const pm_char STR_MENUFLIGHTMODE[] PROGMEM = TR_MENUFLIGHTMODE; +const pm_char STR_MENUFLIGHTMODES[] PROGMEM = TR_MENUFLIGHTMODES; #ifdef HELI const pm_char STR_MENUHELISETUP[] PROGMEM = TR_MENUHELISETUP; @@ -559,7 +559,7 @@ const pm_char STR_CONFIRMRESET[] PROGMEM = TR_CONFIRMRESET; const pm_char STR_TOO_MANY_LUA_SCRIPTS[] PROGMEM = TR_TO_MANY_LUA_SCRIPTS; const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR; -#if LCD_W >= 212 +#if defined(CPUARM) const pm_char STR_MODELNAME[] PROGMEM = TR_MODELNAME; const pm_char STR_PHASENAME[] PROGMEM = TR_PHASENAME; const pm_char STR_MIXNAME[] PROGMEM = TR_MIXNAME; @@ -624,7 +624,7 @@ const pm_char STR_MODEL_SELECT[] PROGMEM = TR_MODEL_SELECT; const pm_char STR_REMOVE_SCREEN[] PROGMEM = TR_REMOVE_SCREEN; #endif -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) +#if defined(CPUARM) const pm_char STR_BYTES[] PROGMEM = TR_BYTES; const pm_char STR_ANTENNAPROBLEM[] PROGMEM = TR_ANTENNAPROBLEM; const pm_char STR_MODULE[] PROGMEM = TR_MODULE; diff --git a/radio/src/translations.h b/radio/src/translations.h index e35e449758..c01583f853 100644 --- a/radio/src/translations.h +++ b/radio/src/translations.h @@ -548,13 +548,13 @@ extern const pm_char STR_MENUDATEANDTIME[]; extern const pm_char STR_MENUTRAINER[]; extern const pm_char STR_MENUSPECIALFUNCS[]; extern const pm_char STR_MENUVERSION[]; -extern const pm_char STR_MENUDIAG[]; -extern const pm_char STR_MENUANA[]; +extern const pm_char STR_MENU_RADIO_SWITCHES[]; +extern const pm_char STR_MENU_RADIO_ANALOGS[]; extern const pm_char STR_MENUCALIBRATION[]; extern const pm_char STR_MENUMODELSEL[]; extern const pm_char STR_MENUSETUP[]; -extern const pm_char STR_MENUFLIGHTPHASE[]; -extern const pm_char STR_MENUFLIGHTPHASES[]; +extern const pm_char STR_MENUFLIGHTMODE[]; +extern const pm_char STR_MENUFLIGHTMODES[]; extern const pm_char STR_MENUHELISETUP[]; extern const pm_char STR_MENUINPUTS[]; extern const pm_char STR_MENULIMITS[]; @@ -834,7 +834,7 @@ extern const pm_char STR_BLCOLOR[]; #define LANGUAGE_PACK_DECLARE_DEFAULT(lng, name) #endif -#if LCD_W >= 212 +#if defined(CPUARM) extern const pm_char STR_MODELNAME[]; extern const pm_char STR_PHASENAME[]; extern const pm_char STR_MIXNAME[]; @@ -913,7 +913,7 @@ extern const pm_char STR_BLCOLOR[]; extern const pm_char STR_REMOVE_SCREEN[]; #endif -#if defined(PCBTARANIS) || defined(PCBFLAMENCO) || defined(PCBHORUS) +#if defined(CPUARM) extern const pm_char STR_BYTES[]; extern const pm_char STR_ANTENNAPROBLEM[]; extern const pm_char STR_MODULE[]; diff --git a/radio/src/translations/cz.h.txt b/radio/src/translations/cz.h.txt index 4f745685a8..02cd9f8c8a 100644 --- a/radio/src/translations/cz.h.txt +++ b/radio/src/translations/cz.h.txt @@ -649,7 +649,7 @@ #define TR_PHASENAME "Název" #define TR_MIXNAME "Název" #define TR_INPUTNAME "Název" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "Popis" #else #define TR_EXPONAME "Název" @@ -819,8 +819,8 @@ #define TR_MENUTRAINER "TRENÉR" #define TR_MENUSPECIALFUNCS "GLOBÁLNÍ FUNKCE" #define TR_MENUVERSION "VERZE" -#define TR_MENUDIAG "DIAG" -#define TR_MENUANA "ANALOGY" +#define TR_MENU_RADIO_SWITCHES "DIAG" +#define TR_MENU_RADIO_ANALOGS "ANALOGY" #define TR_MENUCALIBRATION "KALIBRACE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "\006Trimy => Subtrimy" @@ -829,13 +829,13 @@ #endif #define TR_MENUMODELSEL "MODEL" #define TR_MENUSETUP "NASTAVENÍ" -#define TR_MENUFLIGHTPHASE "LETOVÝ REŽIM" -#define TR_MENUFLIGHTPHASES "LETOVÉ REŽIMY" +#define TR_MENUFLIGHTMODE "LETOVÝ REŽIM" +#define TR_MENUFLIGHTMODES "LETOVÉ REŽIMY" #define TR_MENUHELISETUP "HELI" #define TR_MENULIMITS "SERVA" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "VSTUPY" #else #define TR_MENUINPUTS "DR/EXPO" diff --git a/radio/src/translations/de.h.txt b/radio/src/translations/de.h.txt index d65229c601..7a88eed151 100644 --- a/radio/src/translations/de.h.txt +++ b/radio/src/translations/de.h.txt @@ -101,9 +101,9 @@ #define LEN_TARANIS_PROTOCOLS "\004" #define TR_TARANIS_PROTOCOLS "AUS\0""PPM\0""XJT\0""DSM?""CRSF""MULT" -#define LEN_TELEMETRY_PROTOCOLS "\017" -#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " - +#define LEN_TELEMETRY_PROTOCOLS "\017" +#define TR_TELEMETRY_PROTOCOLS "FrSky S.PORT\0 FrSky D\0 FrSky D (cable)Spektrum\0 " + #define LEN_XJT_PROTOCOLS "\004" #define TR_XJT_PROTOCOLS "AUS\0""D16\0""D8\0 ""LR12" @@ -666,7 +666,7 @@ #define TR_PHASENAME "Phase-Name" #define TR_MIXNAME "Mix-Name" #define TR_INPUTNAME "Input-Name" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "Info-Name" #else #define TR_EXPONAME "Info-Name" // Expo Name @@ -707,7 +707,7 @@ #define TR_AILDIRECTION TR("Roll Richtung", "Roll Servo Richtung") #define TR_COLDIRECTION TR("Pitch Richtung", "Pitch Servo Richtung") #define TR_MODE INDENT "Modus" -#define TR_SUBTYPE INDENT "Subtype" +#define TR_SUBTYPE INDENT "Subtype" #define TR_NOFREEEXPO "Expos voll!" #define TR_NOFREEMIXER "Mischer voll!" #define TR_SOURCE INDENT "Quelle" @@ -838,8 +838,8 @@ #define TR_MENUTRAINER TR("LEHRER/SCHÜLER", "LEHRER/SCHÜLER") #define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIONEN" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("Schalt.", "Schalter-Test") -#define TR_MENUANA "Analog-Test" +#define TR_MENU_RADIO_SWITCHES TR("Schalt.", "Schalter-Test") +#define TR_MENU_RADIO_ANALOGS "Analog-Test" #define TR_MENUCALIBRATION TR("KALIB. ANALOG", "KALIBRIERUNG-Analog") #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims => Subtrims" @@ -848,11 +848,11 @@ #endif #define TR_MENUMODELSEL TR("MODELLE", "MODELL WÄHLEN") #define TR_MENUSETUP TR("MODELL-EINSTELLUNG", "MODELL-EINSTELLUNGEN") -#define TR_MENUFLIGHTPHASE "FLUGPHASE" -#define TR_MENUFLIGHTPHASES "FLUGPHASEN" +#define TR_MENUFLIGHTMODE "FLUGPHASE" +#define TR_MENUFLIGHTMODES "FLUGPHASEN" #define TR_MENUHELISETUP TR("HELI TS-Mischer", "HELI TS-Mischer CYC1-3") -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "INPUTS" #define TR_MENULIMITS "SERVOS" //"AUSGABEN" oder "Servos" #else @@ -883,12 +883,12 @@ #define TR_RECEIVER_NUM "Empf Nr." #define TR_RECEIVER "Empf Nr." #endif -#define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") -#define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") -#define TR_MULTI_DSMFRAME TR(INDENT "DSM Frm", INDENT "DSM Rahmenformat") -#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") +#define TR_MULTI_RFTUNE TR(INDENT "RF Freq.", INDENT "RF Freq. Feintuning") +#define TR_MULTI_VIDFREQ TR(INDENT "Vid. Freq.", INDENT "Video Frequenz") +#define TR_MULTI_DSMFRAME TR(INDENT "DSM Frm", INDENT "DSM Rahmenformat") +#define TR_MULTI_OPTION TR(INDENT "Option", INDENT "Optionswert") #define TR_MULTI_AUTOBIND INDENT "Autobind" -#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") +#define TR_MULTI_LOWPOWER TR(INDENT "Low power", INDENT "Low power mode") #define TR_SYNCMENU "Sync [MENU]" #define TR_LIMIT INDENT "Grenzen" #define TR_MINRSSI "Min. RSSI" diff --git a/radio/src/translations/en.h.txt b/radio/src/translations/en.h.txt index a5e8bcfc39..173bb9dde9 100644 --- a/radio/src/translations/en.h.txt +++ b/radio/src/translations/en.h.txt @@ -509,7 +509,11 @@ #define LEN_VSWITCHES "\003" #define LEN_VSRCRAW "\004" -#define TR_STICKS_VSRCRAW TR("Rud\0""Ele\0""Thr\0""Ail\0", "\307Rud""\307Ele""\307Thr""\307Ail") +#if defined(CPUARM) +#define TR_STICKS_VSRCRAW "\307Rud""\307Ele""\307Thr""\307Ail" +#else +#define TR_STICKS_VSRCRAW "Rud\0""Ele\0""Thr\0""Ail\0" +#endif #if defined(PCBHORUS) #define TR_TRIMS_VSRCRAW "\313Rud""\313Ele""\313Thr""\313Ail""\313T5\0""\313T6\0" @@ -526,6 +530,9 @@ #elif defined(PCBX9E) #define TR_POTS_VSRCRAW "\310F1\0""\310F2\0""\310F3\0""\310F4\0""\311S1\0""\311S2\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0""\312SI\0""\312SJ\0""\312SK\0""\312SL\0""\312SM\0""\312SN\0""\312SO\0""\312SP\0""\312SQ\0""\312SR\0" +#elif defined(PCBX7D) + #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0" + #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SF\0""\312SH\0" #elif defined(PCBTARANIS) #define TR_POTS_VSRCRAW "\310S1\0""\310S2\0""\310S3\0""\311LS\0""\311RS\0" #define TR_SW_VSRCRAW "\312SA\0""\312SB\0""\312SC\0""\312SD\0""\312SE\0""\312SF\0""\312SG\0""\312SH\0" @@ -666,12 +673,8 @@ #define TR_MODELNAME "Model name" #define TR_PHASENAME "Mode name" #define TR_MIXNAME "Mix name" -#define TR_INPUTNAME "Input name" -#if defined(VIRTUALINPUTS) - #define TR_EXPONAME "Line name" -#else - #define TR_EXPONAME "Expo name" -#endif +#define TR_INPUTNAME TR("Input", "Input name") +#define TR_EXPONAME TR("Name", "Line name") #define TR_BITMAP "Model image" #define TR_TIMER TR("Timer", "Timer ") #define TR_ELIMITS TR("E.Limits", "Extended limits") @@ -701,8 +704,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Swash Type" #define TR_COLLECTIVE TR("Collective", "Coll. pitch source") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Swash Ring" #define TR_ELEDIRECTION "ELE Direction" #define TR_AILDIRECTION "AIL Direction" @@ -839,8 +842,8 @@ #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("SWITCHES", "SWITCH TEST") -#define TR_MENUANA TR("ANAS", "ANALOG INPUTS") +#define TR_MENU_RADIO_SWITCHES TR("SWITCHES", "SWITCHES TEST") +#define TR_MENU_RADIO_ANALOGS TR("ANALOGS", "ANALOGS TEST") #define TR_MENUCALIBRATION "CALIBRATION" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims >> Subtrims" @@ -849,11 +852,11 @@ #endif #define TR_MENUMODELSEL TR("MODELSEL", "MODEL SELECTION") #define TR_MENUSETUP TR("SETUP", "MODEL SETUP") -#define TR_MENUFLIGHTPHASES "FLIGHT MODES" -#define TR_MENUFLIGHTPHASE "FLIGHT MODE" +#define TR_MENUFLIGHTMODES "FLIGHT MODES" +#define TR_MENUFLIGHTMODE "FLIGHT MODE" #define TR_MENUHELISETUP "HELI SETUP" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "INPUTS" #define TR_MENULIMITS "OUTPUTS" #else @@ -1083,10 +1086,10 @@ #define TR_EEBACKUP "EEPROM backup" #define TR_FACTORYRESET "Factory reset" #else -#define TR_EEBACKUP "\012[ENTER Long]: EEPROM backup" -#define TR_FACTORYRESET "\012[MENU Long]: Factory reset" +#define TR_EEBACKUP TR("\001[ENTER Long]: Backup", "\012[ENTER Long]: EEPROM backup") +#define TR_FACTORYRESET TR("\001[MENU Long]: Fact. reset", "\012[MENU Long]: Factory reset") #endif -#define TR_CONFIRMRESET "Erase ALL models and settings?" +#define TR_CONFIRMRESET TR("Erase ALL", "Erase ALL models and settings?") #define TR_TO_MANY_LUA_SCRIPTS "Too many Lua scripts!" #if defined(TELEMETRY_MAVLINK) diff --git a/radio/src/translations/es.h.txt b/radio/src/translations/es.h.txt index 4417bf35c0..c741c106fe 100644 --- a/radio/src/translations/es.h.txt +++ b/radio/src/translations/es.h.txt @@ -656,8 +656,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Tipo ciclico" #define TR_COLLECTIVE TR("Colectivo", "Fuente Colectivo") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Ciclico" #define TR_ELEDIRECTION TR("ELE Direccion","Largo cyc. direccion") #define TR_AILDIRECTION TR("AIL Direccion","Lateral cyc. direccion") @@ -788,14 +788,14 @@ #define TR_MENUTRAINER "APRENDIZ" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("INTERUPTS", "TEST INTERUP.") -#define TR_MENUANA TR("ANAS", "ENTRADAS ANALOG") +#define TR_MENU_RADIO_SWITCHES TR("INTERUPTS", "TEST INTERUP.") +#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTRADAS ANALOG") #define TR_MENUCALIBRATION "CALIBRACION" #define TR_TRIMS2OFFSETS "\006Trims => Offsets" #define TR_MENUMODELSEL TR("MODELSEL", "SELECCION MODELO") #define TR_MENUSETUP TR("CONF.", "CONF.MODELO") -#define TR_MENUFLIGHTPHASE "MODO VUELO" -#define TR_MENUFLIGHTPHASES "MODOS VUELO" +#define TR_MENUFLIGHTMODE "MODO VUELO" +#define TR_MENUFLIGHTMODES "MODOS VUELO" #define TR_MENUHELISETUP "CONF. HELI" diff --git a/radio/src/translations/fi.h.txt b/radio/src/translations/fi.h.txt index 71e6c8e772..1812e22881 100644 --- a/radio/src/translations/fi.h.txt +++ b/radio/src/translations/fi.h.txt @@ -656,8 +656,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Swash Type" #define TR_COLLECTIVE TR("Collective", "Coll. pitch source") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Swash Ring" #define TR_ELEDIRECTION TR("ELE Direction","Long. cyc. direction") #define TR_AILDIRECTION TR("AIL Direction","Lateral cyc. direction") @@ -788,14 +788,14 @@ #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("SWITCHES","SWITCH TEST") -#define TR_MENUANA TR("ANAS","ANALOG INPUTS") +#define TR_MENU_RADIO_SWITCHES TR("SWITCHES","SWITCH TEST") +#define TR_MENU_RADIO_ANALOGS TR("ANAS","ANALOG INPUTS") #define TR_MENUCALIBRATION "CALIBRATION" #define TR_TRIMS2OFFSETS "\006Trims => Offsets" #define TR_MENUMODELSEL TR("MODELSEL","MODEL SELECTION") #define TR_MENUSETUP TR("SETUP","MODEL SETUP") -#define TR_MENUFLIGHTPHASE "FLIGHT MODE" -#define TR_MENUFLIGHTPHASES "FLIGHT MODES" +#define TR_MENUFLIGHTMODE "FLIGHT MODE" +#define TR_MENUFLIGHTMODES "FLIGHT MODES" #define TR_MENUHELISETUP "HELI SETUP" #if defined(PCBTARANIS) diff --git a/radio/src/translations/fr.h.txt b/radio/src/translations/fr.h.txt index a7ba255acf..437c9f6683 100644 --- a/radio/src/translations/fr.h.txt +++ b/radio/src/translations/fr.h.txt @@ -648,7 +648,7 @@ #define TR_PHASENAME "Nom phase" #define TR_MIXNAME TR("Nom mix.", "Nom du mixeur") #define TR_INPUTNAME "Nom entrée" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "Nom ligne" #else #define TR_EXPONAME "Nom expo" @@ -818,17 +818,17 @@ #define TR_MENUTRAINER "ECOLAGE" #define TR_MENUSPECIALFUNCS "FONCTIONS GLOBALES" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("INTERS", "TEST INTERRUPTEURS") -#define TR_MENUANA TR("ANAS", "ENTREES ANALOGIQUES") +#define TR_MENU_RADIO_SWITCHES TR("INTERS", "TEST INTERRUPTEURS") +#define TR_MENU_RADIO_ANALOGS TR("ANAS", "ENTREES ANALOGIQUES") #define TR_MENUCALIBRATION "CALIBRATION" #define TR_TRIMS2OFFSETS "\005Trims => Subtrims" #define TR_MENUMODELSEL "MODELES" #define TR_MENUSETUP TR("CONF. MODELE", "CONFIGURATION") -#define TR_MENUFLIGHTPHASE "PHASE DE VOL" -#define TR_MENUFLIGHTPHASES "PHASES DE VOL" +#define TR_MENUFLIGHTMODE "PHASE DE VOL" +#define TR_MENUFLIGHTMODES "PHASES DE VOL" #define TR_MENUHELISETUP TR("CONF.HELI", "CONFIGURATION HELICO") -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "ENTREES" #define TR_MENULIMITS "SORTIES" #else diff --git a/radio/src/translations/it.h.txt b/radio/src/translations/it.h.txt index c0c7afec23..91ecf7358d 100644 --- a/radio/src/translations/it.h.txt +++ b/radio/src/translations/it.h.txt @@ -648,7 +648,7 @@ #define TR_PHASENAME "Nome fase" #define TR_MIXNAME "Nome mix" #define TR_INPUTNAME "Nome Ingr." -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "Nome expo" #else #define TR_EXPONAME "Nome Expo" @@ -682,8 +682,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Tipo Ciclico" #define TR_COLLECTIVE TR("Collettivo","Origine Collettivo") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Anello Ciclico" #define TR_ELEDIRECTION TR("Direzione ELE","Direzione Long. cyc.") #define TR_AILDIRECTION TR("Direzione AIL","Direzione Lateral cyc.") @@ -818,8 +818,8 @@ #define TR_MENUTRAINER "MAESTRO/ALLIEVO" #define TR_MENUSPECIALFUNCS "FUNZIONI GLOBALI" #define TR_MENUVERSION "VERSIONE" -#define TR_MENUDIAG "DIAG" -#define TR_MENUANA "ANAS" +#define TR_MENU_RADIO_SWITCHES "DIAG" +#define TR_MENU_RADIO_ANALOGS "ANAS" #define TR_MENUCALIBRATION "CALIBRAZIONE" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trims >> Subtrims" @@ -828,11 +828,11 @@ #endif #define TR_MENUMODELSEL "MODELLI" #define TR_MENUSETUP "CONFIGURA" -#define TR_MENUFLIGHTPHASE "FASE DI VOLO" -#define TR_MENUFLIGHTPHASES "FASI DI VOLO" +#define TR_MENUFLIGHTMODE "FASE DI VOLO" +#define TR_MENUFLIGHTMODES "FASI DI VOLO" #define TR_MENUHELISETUP "CONFIGURA ELI" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "INGRESSI" #define TR_MENULIMITS "USCITE" #else diff --git a/radio/src/translations/nl.h.txt b/radio/src/translations/nl.h.txt index e1b86e3635..fd680c949a 100644 --- a/radio/src/translations/nl.h.txt +++ b/radio/src/translations/nl.h.txt @@ -655,7 +655,7 @@ #define TR_PHASENAME "Modus" #define TR_MIXNAME "Mix Naam" #define TR_INPUTNAME "Input Naam" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "Lijn Naam" #else #define TR_EXPONAME "Expo Naam" @@ -689,8 +689,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Swash Type" #define TR_COLLECTIVE TR("Collective", "Coll. pitch source") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Swash Ring" #define TR_ELEDIRECTION "ELE Direction" #define TR_AILDIRECTION "AIL Direction" @@ -831,8 +831,8 @@ #define TR_MENUTRAINER "LERAAR/LEERLING" #define TR_MENUSPECIALFUNCS "GLOBALE FUNKTIES" #define TR_MENUVERSION "VERSIE" -#define TR_MENUDIAG TR("Schak.", "Schakelaar-Test") -#define TR_MENUANA "Analoog-Test" +#define TR_MENU_RADIO_SWITCHES TR("Schak.", "Schakelaar-Test") +#define TR_MENU_RADIO_ANALOGS "Analoog-Test" #define TR_MENUCALIBRATION TR("CALIB. ANALOOG", "CALIBRERING Sticks+Pots") #if defined(COLORLCD) @@ -842,11 +842,11 @@ #endif #define TR_MENUMODELSEL TR("MODELLEN", "MODEL KIEZEN") #define TR_MENUSETUP TR("MODEL-INSTELLING", "MODEL-INSTELLINGEN") -#define TR_MENUFLIGHTPHASES "VLIEGFASES" -#define TR_MENUFLIGHTPHASE "VLIEGFASE" +#define TR_MENUFLIGHTMODES "VLIEGFASES" +#define TR_MENUFLIGHTMODE "VLIEGFASE" #define TR_MENUHELISETUP "HELI TS-Mixer" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "INPUTS" #define TR_MENULIMITS "OUTPUTS" #else diff --git a/radio/src/translations/pl.h.txt b/radio/src/translations/pl.h.txt index f56c5200a0..1d15027b90 100644 --- a/radio/src/translations/pl.h.txt +++ b/radio/src/translations/pl.h.txt @@ -650,7 +650,7 @@ #define TR_PHASENAME "Nazwa Fazy" #define TR_MIXNAME "Nazwa Mix" #define TR_INPUTNAME "Wpisz Nazw" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_EXPONAME "LiniaNazw" #else #define TR_EXPONAME "Nazwa Exp" @@ -684,8 +684,8 @@ #define OFS_CHECKTRIMS CENTER_OFS+(9*FW) #define TR_SWASHTYPE "Typ tarczy" #define TR_COLLECTIVE TR("Kolektyw", "Źródło Kolektywu") -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Tarcza " #define TR_ELEDIRECTION TR("Ster Wysokośc","Dług. Kierunku cyklu") #define TR_AILDIRECTION TR("Kierunek Lotk","Lateral cyc. direction") @@ -820,8 +820,8 @@ #define TR_MENUTRAINER "TRENER" #define TR_MENUSPECIALFUNCS "FUNKCJE GLOBALNE" #define TR_MENUVERSION "WERSJA" -#define TR_MENUDIAG TR("PRZEŁ","TEST PRZEŁ") -#define TR_MENUANA TR("WE-ANA","WEJŚCIA ANALOG.") +#define TR_MENU_RADIO_SWITCHES TR("PRZEŁ","TEST PRZEŁ") +#define TR_MENU_RADIO_ANALOGS TR("WE-ANA","WEJŚCIA ANALOG.") #define TR_MENUCALIBRATION "KALIBRACJA" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "Trymery >> Subtrimy" @@ -830,11 +830,11 @@ #endif #define TR_MENUMODELSEL TR("WYB.MODEL","WYBÓR MODELU") #define TR_MENUSETUP TR("USTAW","USTAW MODELU") -#define TR_MENUFLIGHTPHASE "FAZA LOTU" -#define TR_MENUFLIGHTPHASES "FAZY LOTU" +#define TR_MENUFLIGHTMODE "FAZA LOTU" +#define TR_MENUFLIGHTMODES "FAZY LOTU" #define TR_MENUHELISETUP "USTAW HELI" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "WEJŚCIA" #define TR_MENULIMITS "WYJŚCIA" #else diff --git a/radio/src/translations/pt.h.txt b/radio/src/translations/pt.h.txt index 7df7c365ad..25b0ec12a2 100644 --- a/radio/src/translations/pt.h.txt +++ b/radio/src/translations/pt.h.txt @@ -651,8 +651,8 @@ #define OFS_CHECKTRIMS (9*FW) #define TR_SWASHTYPE "Ciclico Tipo" #define TR_COLLECTIVE "Coletivo" -#define TR_AILERON "Lateral cyc. source" -#define TR_ELEVATOR "Long. cyc. source" +#define TR_AILERON TR("Lateral cyc.", "Lateral cyc. source") +#define TR_ELEVATOR TR("Long. cyc.", "Long. cyc. source") #define TR_SWASHRING "Anel Coletivo" #define TR_ELEDIRECTION "PFD Sentido" #define TR_AILDIRECTION "AIL Sentido" @@ -783,14 +783,14 @@ #define TR_MENUTRAINER "TRAINER" #define TR_MENUSPECIALFUNCS "GLOBAL FUNCTIONS" #define TR_MENUVERSION "VERSAO" -#define TR_MENUDIAG "DIAGNOST" -#define TR_MENUANA "ANALOGICOS" +#define TR_MENU_RADIO_SWITCHES "DIAGNOST" +#define TR_MENU_RADIO_ANALOGS "ANALOGICOS" #define TR_MENUCALIBRATION "CALIBRAGEM" #define TR_TRIMS2OFFSETS "\006Trims => Offsets" #define TR_MENUMODELSEL "MODELOS" #define TR_MENUSETUP "SETUP" -#define TR_MENUFLIGHTPHASE "MODO DE VOO" -#define TR_MENUFLIGHTPHASES "MODOS DE VOO" +#define TR_MENUFLIGHTMODE "MODO DE VOO" +#define TR_MENUFLIGHTMODES "MODOS DE VOO" #define TR_MENUHELISETUP "HELI SETUP" diff --git a/radio/src/translations/se.h.txt b/radio/src/translations/se.h.txt index de157085f5..6c0c129eb4 100644 --- a/radio/src/translations/se.h.txt +++ b/radio/src/translations/se.h.txt @@ -831,8 +831,8 @@ #define TR_MENUTRAINER "TRAINER (PPM IN)" #define TR_MENUSPECIALFUNCS "GLOBALA FUNKTIONER" #define TR_MENUVERSION "VERSION" -#define TR_MENUDIAG TR("BRYTARE","TEST AV BRYTARE") -#define TR_MENUANA "ANALOGA VÄRDEN" +#define TR_MENU_RADIO_SWITCHES TR("BRYTARE","TEST AV BRYTARE") +#define TR_MENU_RADIO_ANALOGS "ANALOGA VÄRDEN" #define TR_MENUCALIBRATION "KALIBRERING" #if defined(COLORLCD) #define TR_TRIMS2OFFSETS "[Spara Trimvärden]" @@ -841,11 +841,11 @@ #endif #define TR_MENUMODELSEL TR("MODELL","VÄLJ MODELL") #define TR_MENUSETUP TR("VÄRDEN","MODELLINSTÄLLNINGAR") -#define TR_MENUFLIGHTPHASE "FLYGLÄGE" -#define TR_MENUFLIGHTPHASES "FLYGLÄGEN" +#define TR_MENUFLIGHTMODE "FLYGLÄGE" +#define TR_MENUFLIGHTMODES "FLYGLÄGEN" #define TR_MENUHELISETUP "HELIKOPTER" -#if defined(VIRTUALINPUTS) +#if defined(CPUARM) #define TR_MENUINPUTS "INPUT" #define TR_MENULIMITS "SERVON" #else diff --git a/radio/src/vario.cpp b/radio/src/vario.cpp index d0a59f72d4..32f172054d 100644 --- a/radio/src/vario.cpp +++ b/radio/src/vario.cpp @@ -32,7 +32,7 @@ void varioWakeup() int verticalSpeed = 0; if (g_model.frsky.varioSource) { uint8_t item = g_model.frsky.varioSource-1; - if (item < MAX_SENSORS) { + if (item < MAX_TELEMETRY_SENSORS) { verticalSpeed = telemetryItems[item].value * g_model.telemetrySensors[item].getPrecMultiplier(); } } diff --git a/tools/build-companion.sh b/tools/build-companion.sh index 49dd605abf..eb0fc5468f 100755 --- a/tools/build-companion.sh +++ b/tools/build-companion.sh @@ -29,6 +29,9 @@ make -j2 libsimulator cmake ${COMMON_OPTIONS} -DPCB=9XRPRO ${SRCDIR} make -j2 libsimulator +cmake -DALLOW_NIGHTLY_BUILDS=YES -DVERSION_SUFFIX=$3 -DGVARS=NO -DHELI=YES -DPCB=X7D ${SRCDIR} +make -j2 libsimulator + cmake ${STM32_OPTIONS} -DPCB=X9D ${SRCDIR} make -j2 libsimulator diff --git a/tools/commit-tests.sh b/tools/commit-tests.sh index b53c3d5265..b80d35a88b 100755 --- a/tools/commit-tests.sh +++ b/tools/commit-tests.sh @@ -13,38 +13,38 @@ cd build # OpenTX on 9X stock with FrSky telemetry rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTELEMETRY=FRSKY ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=FRSKY ${SRCDIR} make -j2 firmware make -j2 simu make -j2 gtests ; ./gtests # OpenTX on 9X stock with Ardupilot telemetry rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTELEMETRY=ARDUPILOT ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=ARDUPILOT ${SRCDIR} make -j2 firmware # OpenTX on 9X stock with JETI telemetry rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTELEMETRY=JETI ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=9X -DHELI=YES -DTEMPLATES=YES -DTELEMETRY=JETI ${SRCDIR} make -j2 firmware # OpenTX on Mega2560 rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DHELI=YES ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTEMPLATES=YES -DHELI=YES ${SRCDIR} make -j2 firmware make -j2 simu make -j2 gtests ; ./gtests # OpenTX on Mega2560 with Mavlink telemetry rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTELEMETRY=MAVLINK -DHELI=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=MEGA2560 -DTELEMETRY=MAVLINK -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} make -j2 firmware make -j2 simu make -j2 gtests ; ./gtests # OpenTX on gruvin9x board rm -rf * -cmake ${COMMON_OPTIONS} -DPCB=GRUVIN9X -DHELI=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} +cmake ${COMMON_OPTIONS} -DPCB=GRUVIN9X -DHELI=YES -DTEMPLATES=YES -DAUDIO=YES -DVOICE=YES ${SRCDIR} make -j2 firmware make -j2 simu make -j2 gtests ; ./gtests