Merge pull request #2162 from opentx/kilrah/765_source_popup

Source category selection popup (Fix #765)
This commit is contained in:
Bertrand Songis
2015-03-24 16:43:55 +01:00
18 changed files with 263 additions and 19 deletions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 331 B

After

Width:  |  Height:  |  Size: 15 KiB

+11
View File
@@ -347,3 +347,14 @@ bool modelHasNotes()
return isFileAvailable(filename);
}
int getFirstAvailableSource(int min, int max, bool (*func)(int))
{
int retval = MIXSRC_NONE;
for (int i = min; i <= max; i++) {
if ((*func)(i)) {
retval = i;
break;
}
}
return retval;
}
+3 -1
View File
@@ -202,6 +202,7 @@ bool isSwitchAvailableInCustomFunctions(int swtch);
bool isSwitchAvailableInMixes(int swtch);
bool isSwitchAvailableInTimers(int swtch);
bool isModuleAvailable(int module);
int getFirstAvailableSource(int min, int max, bool (*func)(int));
#define AUTOSWITCH_ENTER_LONG() (attr && event==EVT_KEY_LONG(KEY_ENTER))
#define CHECK_INCDEC_SWITCH(event, var, min, max, flags, available) \
var = checkIncDec(event, var, min, max, (flags)|INCDEC_SWITCH, available)
@@ -326,7 +327,8 @@ extern uint8_t s_warning_info_flags;
#define NAVIGATION_MENUS
#define MENU_ADD_ITEM(s) s_menu[s_menu_count++] = s
#define MENU_MAX_LINES 6
#define MENU_MAX_LINES 11
#define MENU_MAX_DISPLAY_LINES 6
#define MENU_ADD_SD_ITEM(s) MENU_ADD_ITEM(s)
#define MENU_LINE_LENGTH (LEN_MODEL_NAME+12)
extern const char *s_menu[MENU_MAX_LINES];
+86
View File
@@ -42,6 +42,7 @@ horzpos_t m_posHorz;
int8_t s_editMode;
uint8_t s_noHi;
uint8_t calibrationState;
int s_source = MIXSRC_NONE;
#if defined(AUTOSWITCH)
int8_t checkIncDecMovedSwitch(int8_t val)
@@ -70,6 +71,42 @@ 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)
void onLongEnterPress(const char *result)
{
if (result == STR_MENU_INPUTS)
s_source = getFirstAvailableSource(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable)+1;
#if defined(LUA_MODEL_SCRIPTS)
else if (result == STR_MENU_LUA)
s_source = getFirstAvailableSource(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable);
#endif
else if (result == STR_MENU_STICKS)
s_source = MIXSRC_FIRST_STICK;
else if (result == STR_MENU_POTS)
s_source = MIXSRC_FIRST_POT;
else if (result == STR_MENU_MAX)
s_source = MIXSRC_MAX;
else if (result == STR_MENU_HELI)
s_source = MIXSRC_FIRST_HELI;
else if (result == STR_MENU_TRIMS)
s_source = MIXSRC_FIRST_TRIM;
else if (result == STR_MENU_SWITCHES)
s_source = MIXSRC_FIRST_SWITCH;
else if (result == STR_MENU_TRAINER)
s_source = MIXSRC_FIRST_TRAINER;
else if (result == STR_MENU_CHANNELS)
s_source = getFirstAvailableSource(MIXSRC_FIRST_CH, MIXSRC_LAST_CH, isSourceAvailable);
else if (result == STR_MENU_TELEMETRY) {
for (int i = 0; i < TELEM_VALUES_MAX; i++) {
TelemetrySensor * sensor = & g_model.telemetrySensors[i];
if (sensor->isAvailable()) {
s_source = MIXSRC_FIRST_TELEM + 3*i;
break;
}
}
}
}
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;
@@ -207,6 +244,54 @@ int checkIncDec(unsigned int event, int val, int i_min, int i_max, unsigned int
else {
checkIncDec_Ret = 0;
}
if (i_flags & INCDEC_SOURCE) {
if (event == EVT_KEY_LONG(KEY_ENTER)) {
killEvents(event);
s_source = MIXSRC_NONE;
if (i_min <= MIXSRC_FIRST_INPUT && i_max >= MIXSRC_FIRST_INPUT) {
if (getFirstAvailableSource(MIXSRC_FIRST_INPUT, MIXSRC_LAST_INPUT, isInputAvailable) != MIXSRC_NONE)
MENU_ADD_ITEM(STR_MENU_INPUTS);
}
#if defined(LUA_MODEL_SCRIPTS)
if (i_min <= MIXSRC_FIRST_LUA && i_max >= MIXSRC_FIRST_LUA) {
if (getFirstAvailableSource(MIXSRC_FIRST_LUA, MIXSRC_LAST_LUA, isSourceAvailable) != MIXSRC_NONE)
MENU_ADD_ITEM(STR_MENU_LUA);
}
#endif
if (i_min <= MIXSRC_FIRST_STICK && i_max >= MIXSRC_FIRST_STICK) MENU_ADD_ITEM(STR_MENU_STICKS);
if (i_min <= MIXSRC_FIRST_POT && i_max >= MIXSRC_FIRST_POT) MENU_ADD_ITEM(STR_MENU_POTS);
if (i_min <= MIXSRC_MAX && i_max >= MIXSRC_MAX) MENU_ADD_ITEM(STR_MENU_MAX);
#if defined(HELI)
if (i_min <= MIXSRC_FIRST_HELI && i_max >= MIXSRC_FIRST_HELI) MENU_ADD_ITEM(STR_MENU_HELI);
#endif
if (i_min <= MIXSRC_FIRST_TRIM && i_max >= MIXSRC_FIRST_TRIM) MENU_ADD_ITEM(STR_MENU_TRIMS);
if (i_min <= MIXSRC_FIRST_SWITCH && i_max >= MIXSRC_FIRST_SWITCH) MENU_ADD_ITEM(STR_MENU_SWITCHES);
if (i_min <= MIXSRC_FIRST_TRAINER && i_max >= MIXSRC_FIRST_TRAINER) MENU_ADD_ITEM(STR_MENU_TRAINER);
if (i_min <= MIXSRC_FIRST_CH && i_max >= MIXSRC_FIRST_CH) MENU_ADD_ITEM(STR_MENU_CHANNELS);
if (i_min <= MIXSRC_FIRST_TELEM && i_max >= MIXSRC_FIRST_TELEM) {
bool available = false;
for (int i = 0; i < TELEM_VALUES_MAX; i++) {
TelemetrySensor * sensor = & g_model.telemetrySensors[i];
if (sensor->isAvailable()) {
available = true;
break;
}
}
if (available)
MENU_ADD_ITEM(STR_MENU_TELEMETRY);
}
menuHandler = onLongEnterPress;
}
if (s_source != MIXSRC_NONE) {
newval = s_source;
if (s_source != MIXSRC_MAX)
s_editMode = 1;
s_source = MIXSRC_NONE;
}
}
return newval;
}
@@ -229,6 +314,7 @@ void onLongMenuPress(const char *result)
}
}
tmr10ms_t menuEntryTime;
void check(const char *name, check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, vertpos_t rowcount, uint8_t flags)
+7 -7
View File
@@ -127,18 +127,18 @@ const char * displayMenu(uint8_t event)
{
const char * result = NULL;
uint8_t display_count = min(s_menu_count, (uint16_t)MENU_MAX_LINES);
uint8_t display_count = min(s_menu_count, (uint16_t)MENU_MAX_DISPLAY_LINES);
uint8_t y = (display_count >= 5 ? MENU_Y - FH - 1 : MENU_Y);
drawFilledRect(MENU_X, y, MENU_W, display_count * (FH+1) + 2, SOLID, ERASE);
lcd_rect(MENU_X, y, MENU_W, display_count * (FH+1) + 2);
for (uint8_t i=0; i<display_count; i++) {
lcd_putsAtt(MENU_X+6, i*(FH+1) + y + 2, s_menu[i], s_menu_flags);
lcd_putsAtt(MENU_X+6, i*(FH+1) + y + 2, s_menu[i+s_menu_offset], s_menu_flags);
if (i == s_menu_item) drawFilledRect(MENU_X+1, i*(FH+1) + y + 1, MENU_W-2, 9);
}
if (s_menu_count > display_count) {
displayScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_LINES * (FH+1), s_menu_offset, s_menu_count, MENU_MAX_LINES);
displayScrollbar(MENU_X+MENU_W-1, y+1, MENU_MAX_DISPLAY_LINES * (FH+1), s_menu_offset, s_menu_count, display_count);
}
switch(event) {
@@ -152,9 +152,9 @@ const char * displayMenu(uint8_t event)
result = STR_UPDATE_LIST;
}
else {
s_menu_item = display_count - 1;
if (s_menu_count > MENU_MAX_LINES) {
s_menu_offset = s_menu_count - display_count;
s_menu_item = min(display_count, (uint8_t)MENU_MAX_DISPLAY_LINES)-1;
if (s_menu_count > MENU_MAX_DISPLAY_LINES) {
s_menu_offset = s_menu_count - MENU_MAX_DISPLAY_LINES;
result = STR_UPDATE_LIST;
}
}
@@ -179,7 +179,7 @@ const char * displayMenu(uint8_t event)
break;
CASE_EVT_ROTARY_BREAK
case EVT_KEY_BREAK(KEY_ENTER):
result = s_menu[s_menu_item];
result = s_menu[s_menu_item+s_menu_offset];
// no break
case EVT_KEY_BREAK(KEY_EXIT):
s_menu_count = 0;
+14 -11
View File
@@ -1766,10 +1766,11 @@ enum MixSources {
MIXSRC_LAST_LUA = MIXSRC_FIRST_LUA+(MAX_SCRIPTS*MAX_SCRIPT_OUTPUTS)-1,
#endif
MIXSRC_Rud, LUA_EXPORT("rud", "Rudder")
MIXSRC_Ele, LUA_EXPORT("ele", "Elevator")
MIXSRC_Thr, LUA_EXPORT("thr", "Throttle")
MIXSRC_Ail, LUA_EXPORT("ail", "Aileron")
MIXSRC_FIRST_STICK,
MIXSRC_Rud = MIXSRC_FIRST_STICK, LUA_EXPORT("rud", "Rudder")
MIXSRC_Ele, LUA_EXPORT("ele", "Elevator")
MIXSRC_Thr, LUA_EXPORT("thr", "Throttle")
MIXSRC_Ail, LUA_EXPORT("ail", "Aileron")
MIXSRC_FIRST_POT,
#if defined(PCBTARANIS)
@@ -1812,14 +1813,16 @@ enum MixSources {
MIXSRC_MAX,
MIXSRC_CYC1, LUA_EXPORT("cyc1", "Cyclic 1")
MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2")
MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3")
MIXSRC_FIRST_HELI,
MIXSRC_CYC1 = MIXSRC_FIRST_HELI, LUA_EXPORT("cyc1", "Cyclic 1")
MIXSRC_CYC2, LUA_EXPORT("cyc2", "Cyclic 2")
MIXSRC_CYC3, LUA_EXPORT("cyc3", "Cyclic 3")
MIXSRC_TrimRud, LUA_EXPORT("trim-rud", "Rudder trim")
MIXSRC_TrimEle, LUA_EXPORT("trim-ele", "Elevator trim")
MIXSRC_TrimThr, LUA_EXPORT("trim-thr", "Throttle trim")
MIXSRC_TrimAil, LUA_EXPORT("trim-ail", "Aileron trim")
MIXSRC_FIRST_TRIM,
MIXSRC_TrimRud = MIXSRC_FIRST_TRIM, LUA_EXPORT("trim-rud", "Rudder trim")
MIXSRC_TrimEle, LUA_EXPORT("trim-ele", "Elevator trim")
MIXSRC_TrimThr, LUA_EXPORT("trim-thr", "Throttle trim")
MIXSRC_TrimAil, LUA_EXPORT("trim-ail", "Aileron trim")
MIXSRC_FIRST_SWITCH,
+11
View File
@@ -588,6 +588,17 @@ const pm_char STR_BLCOLOR[] PROGMEM = TR_BLCOLOR;
const pm_char STR_SCRIPT[] PROGMEM = TR_SCRIPT;
const pm_char STR_INPUTS[] PROGMEM = TR_INPUTS;
const pm_char STR_OUTPUTS[] PROGMEM = TR_OUTPUTS;
const pm_char STR_MENU_INPUTS[] PROGMEM = TR_MENU_INPUTS;
const pm_char STR_MENU_LUA[] PROGMEM = TR_MENU_LUA;
const pm_char STR_MENU_STICKS[] PROGMEM = TR_MENU_STICKS;
const pm_char STR_MENU_POTS[] PROGMEM = TR_MENU_POTS;
const pm_char STR_MENU_MAX[] PROGMEM = TR_MENU_MAX;
const pm_char STR_MENU_HELI[] PROGMEM = TR_MENU_HELI;
const pm_char STR_MENU_TRIMS[] PROGMEM = TR_MENU_TRIMS;
const pm_char STR_MENU_SWITCHES[] PROGMEM = TR_MENU_SWITCHES;
const pm_char STR_MENU_TRAINER[] PROGMEM = TR_MENU_TRAINER;
const pm_char STR_MENU_CHANNELS[] PROGMEM = TR_MENU_CHANNELS;
const pm_char STR_MENU_TELEMETRY[] PROGMEM = TR_MENU_TELEMETRY;
#endif
#if MENUS_LOCK == 1
+11
View File
@@ -798,6 +798,17 @@ extern const pm_char STR_BLCOLOR[];
extern const pm_char STR_SCRIPT[];
extern const pm_char STR_INPUTS[];
extern const pm_char STR_OUTPUTS[];
extern const pm_char STR_MENU_INPUTS[];
extern const pm_char STR_MENU_LUA[];
extern const pm_char STR_MENU_STICKS[];
extern const pm_char STR_MENU_POTS[];
extern const pm_char STR_MENU_MAX[];
extern const pm_char STR_MENU_HELI[];
extern const pm_char STR_MENU_TRIMS[];
extern const pm_char STR_MENU_SWITCHES[];
extern const pm_char STR_MENU_TRAINER[];
extern const pm_char STR_MENU_CHANNELS[];
extern const pm_char STR_MENU_TELEMETRY[];
#endif
#if MENUS_LOCK == 1
+12
View File
@@ -1065,6 +1065,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1064,6 +1064,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1064,6 +1064,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1000,6 +1000,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\318Channels"
#define TR_MENU_TELEMETRY "\319Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1000,6 +1000,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1060,6 +1060,18 @@
#define TR_FILTER "Filtrage"
#define TR_TELEMETRYFULL "Plus de capteurs libres!"
#define TR_MENU_INPUTS "\314Entrées"
#define TR_MENU_LUA "\322Scripts Lua"
#define TR_MENU_STICKS "\307Manches"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclique"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Inters"
#define TR_MENU_TRAINER "\317Ecolage"
#define TR_MENU_CHANNELS "\320Canaux"
#define TR_MENU_TELEMETRY "\321Télémesure"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1000,6 +1000,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -998,6 +998,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1000,6 +1000,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"
+12
View File
@@ -1000,6 +1000,18 @@
#define TR_FILTER "Filter"
#define TR_TELEMETRYFULL "All telemetry slots full!"
#define TR_MENU_INPUTS "\314Inputs"
#define TR_MENU_LUA "\322Lua scripts"
#define TR_MENU_STICKS "\307Sticks"
#define TR_MENU_POTS "\310Pots"
#define TR_MENU_MAX "\315MAX"
#define TR_MENU_HELI "\316Cyclic"
#define TR_MENU_TRIMS "\313Trims"
#define TR_MENU_SWITCHES "\312Switches"
#define TR_MENU_TRAINER "\317Trainer"
#define TR_MENU_CHANNELS "\320Channels"
#define TR_MENU_TELEMETRY "\321Telemetry"
#define ZSTR_RSSI "RSSI"
#define ZSTR_SWR "SWR"
#define ZSTR_A1 "A1"