[X9D] More work on navigation

[RotEnc] Pressing [EXIT] inside a menu returns in page selection mode
[stock] More flash saving
This commit is contained in:
bsongis
2012-11-15 17:49:31 +00:00
parent 6150cac0f5
commit bef5ee525d
4 changed files with 111 additions and 46 deletions
+57 -15
View File
@@ -191,17 +191,40 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max)
return checkIncDec(event,i_val,i_min,i_max,EE_GENERAL);
}
bool check_simple(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow)
bool check_simple(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow)
{
return check(event, curr, menuTab, menuTabSize, 0, 0, maxrow);
}
bool check_submenu_simple(uint8_t event, uint8_t maxrow)
bool check_submenu_simple(check_event_t event, uint8_t maxrow)
{
return check_simple(event, 0, 0, 0, maxrow);
}
#if defined(ROTARY_ENCODERS)
#if defined(PCBX9D)
void check_rotary_encoder(uint8_t & event)
{
if (event==EVT_KEY_REPT(KEY_LEFT) || event==EVT_KEY_BREAK(KEY_LEFT)) {
scrollRE = -1;
}
else if (event==EVT_KEY_REPT(KEY_RIGHT) || event==EVT_KEY_FIRST(KEY_RIGHT)) {
scrollRE = 1;
}
else {
scrollRE = 0;
}
if (s_editMode > 0) {
p1valdiff = -scrollRE;
scrollRE = 0;
}
// TODO remove later...
uint8_t key = event & EVT_KEY_MASK;
if (key==KEY_LEFT || key==KEY_RIGHT)
event = 0;
}
#elif defined(ROTARY_ENCODERS)
void check_rotary_encoder()
{
// check rotary encoder 1 if changed -> cursor down/up
@@ -245,24 +268,32 @@ void title(const pm_char * s)
#define INC(val,max) if(val<max) {val++;} else {val=0;}
#define DEC(val,max) if(val>0 ) {val--;} else {val=max;}
bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, maxrow_t maxrow)
#if defined(PCBX9D)
#define RE_NAV_ENTER (KEY_ENTER)
#define RE_NAV_ENABLE true
#else
#define RE_NAV_ENTER (BTN_REa+g_eeGeneral.reNavigation-1)
#define RE_NAV_ENABLE g_eeGeneral.reNavigation
#endif
bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *horTab, uint8_t horTabMax, maxrow_t maxrow)
{
maxrow_t l_posVert = m_posVert;
uint8_t l_posHorz = m_posHorz;
int8_t maxcol = MAXCOL(l_posVert);
uint8_t maxcol = MAXCOL(l_posVert);
#if defined(ROTARY_ENCODERS)
if (!(s_warning || s_menu_count))
check_rotary_encoder();
if (l_posVert < 0 && (event==EVT_KEY_FIRST(BTN_REa) || event==EVT_KEY_FIRST(BTN_REb) || event==EVT_KEY_FIRST(KEY_MENU))) {
CHECK_ROTARY_ENCODER(event);
if (l_posVert < 0 && (event==EVT_KEY_FIRST(RE_NAV_ENTER) || event==EVT_KEY_FIRST(KEY_MENU))) {
popMenu();
killEvents(event);
return false;
}
if (g_eeGeneral.reNavigation && event == EVT_KEY_BREAK(BTN_REa+g_eeGeneral.reNavigation-1)) {
if (RE_NAV_ENABLE && event==EVT_KEY_BREAK(RE_NAV_ENTER)) {
if (s_editMode > 0 && (maxcol & ZCHAR)) {
if (l_posHorz < (uint8_t)maxcol-ZCHAR) {
if (l_posHorz < maxcol-ZCHAR) {
l_posHorz++;
}
else {
@@ -340,7 +371,7 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
}
#if defined(ROTARY_ENCODERS)
if (g_eeGeneral.reNavigation && s_editMode < 0)
if (RE_NAV_ENABLE && s_editMode < 0)
attr = INVERS|BLINK;
#endif
}
@@ -381,10 +412,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
if (maxcol & ZCHAR) maxcol = 0;
if (++l_posHorz > maxcol) {
if (l_posVert < maxrow) {
++l_posVert;
do {
++l_posVert;
} while(MAXCOL(l_posVert) == (uint8_t)-1);
maxcol = MAXCOL(l_posVert);
if (maxcol & ZCHAR) maxcol = 0;
if (maxcol < 0) l_posVert++;
l_posHorz = 0;
}
else {
@@ -396,7 +428,10 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
else {
++scrollRE;
if (l_posHorz-- == 0) {
if (l_posVert-- <= 0) {
do {
--l_posVert;
} while(MAXCOL(l_posVert) == (uint8_t)-1);
if (l_posVert <= (menuTab ? 0 : -1)) {
l_posVert = menuTab ? 0 : -1;
l_posHorz = 0;
scrollRE = 0;
@@ -404,7 +439,6 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
else {
maxcol = MAXCOL(l_posVert);
if (maxcol & ZCHAR) maxcol = 0;
if (maxcol < 0) { --l_posVert; maxcol = MAXCOL(l_posVert); if (maxcol & ZCHAR) maxcol = 0; }
l_posHorz = maxcol;
}
}
@@ -443,6 +477,11 @@ bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTa
popMenu();
break;
case EVT_KEY_BREAK(KEY_EXIT):
#if defined(ROTARY_ENCODERS)
if (s_editMode==0)
s_editMode = -1;
else
#endif
if (s_editMode>0) {
s_editMode = 0;
break;
@@ -539,6 +578,8 @@ void chainMenu(MenuFuncP newMenu)
void pushMenu(MenuFuncP newMenu)
{
killEvents(KEY_ENTER);
if (g_menuStackPtr == 0) {
if (newMenu == menuGeneralSetup)
g_menuPos[0] = 1;
@@ -595,8 +636,9 @@ void displayWarning(uint8_t event)
case EVT_KEY_FIRST(BTN_REb):
if (!navigationRotaryEncoder(event))
break;
// no break
#endif
case EVT_KEY_FIRST(KEY_MENU):
case EVT_KEY_FIRST(KEY_ENTER):
if (s_warning_type == WARNING_TYPE_ASTERISK)
break;
s_warning_result = true;
+14 -4
View File
@@ -136,8 +136,12 @@ int8_t checkIncDecGen(uint8_t event, int8_t i_val, int8_t i_min, int8_t i_max);
#define CHECK_INCDEC_GENVAR(event, var, min, max) \
var = checkIncDecGen(event,var,min,max)
#if defined(ROTARY_ENCODERS)
#if defined(PCBX9D)
void check_rotary_encoder(uint8_t & event);
#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder(event)
#elif defined(ROTARY_ENCODERS)
void check_rotary_encoder();
#define CHECK_ROTARY_ENCODER(event) check_rotary_encoder()
#endif
// Menus related stuff ...
@@ -152,9 +156,15 @@ void check_rotary_encoder();
extern maxrow_t m_posVert;
extern uint8_t m_posHorz;
bool check(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *subTab, uint8_t subTabMax, maxrow_t maxrow);
bool check_simple(uint8_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow);
bool check_submenu_simple(uint8_t event, uint8_t maxrow);
#if defined(PCBX9D)
typedef uint8_t & check_event_t;
#else
typedef uint8_t check_event_t;
#endif
bool check(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, const pm_uint8_t *subTab, uint8_t subTabMax, maxrow_t maxrow);
bool check_simple(check_event_t event, uint8_t curr, const MenuFuncP *menuTab, uint8_t menuTabSize, maxrow_t maxrow);
bool check_submenu_simple(check_event_t event, uint8_t maxrow);
typedef void (*MenuFuncP_PROGMEM)(uint8_t event);
+29 -20
View File
@@ -379,7 +379,6 @@ void menuModelSelect(uint8_t event)
s_copySrcRow = -1;
}
break;
#if !defined(PCBX9D)
case EVT_KEY_FIRST(KEY_LEFT):
case EVT_KEY_FIRST(KEY_RIGHT):
if (sub == g_eeGeneral.currModel) {
@@ -388,6 +387,7 @@ void menuModelSelect(uint8_t event)
}
AUDIO_WARNING2();
break;
#if !defined(PCBX9D)
case EVT_KEY_FIRST(KEY_UP):
case EVT_KEY_FIRST(KEY_DOWN):
if (s_copyMode) {
@@ -555,9 +555,13 @@ void editName(uint8_t x, uint8_t y, char *name, uint8_t size, uint8_t event, boo
case EVT_KEY_LONG(BTN_REb):
if (!navigationRotaryEncoder(event))
break;
// no break
#if defined(PCBX9D)
case EVT_KEY_LONG(KEY_ENTER):
#endif
if (v==0) {
s_editMode = 0;
killEvents(BTN_REa);
killEvents(event);
break;
}
// no break
@@ -1103,13 +1107,15 @@ void menuModelPhasesAll(uint8_t event)
break;
// no break
#endif
case EVT_KEY_FIRST(KEY_MENU):
case EVT_KEY_FIRST(KEY_ENTER):
if (sub == MAX_PHASES) {
s_editMode = 0;
trimsCheckTimer = 200; // 2 seconds
}
// no break
#if !defined(PCBX9D)
case EVT_KEY_FIRST(KEY_RIGHT):
#endif
if (sub >= 0 && sub < MAX_PHASES) {
s_currIdx = sub;
pushMenu(menuModelPhaseOne);
@@ -1313,7 +1319,6 @@ void menuModelCurveOne(uint8_t event)
switch(event) {
case EVT_ENTRY:
s_editMode = 1;
killEvents(KEY_MENU);
break;
#if defined(ROTARY_ENCODERS)
case EVT_KEY_BREAK(BTN_REa):
@@ -2184,7 +2189,11 @@ enum LimitsItems {
void menuModelLimits(uint8_t event)
{
#if defined(PCBSKY9X)
MENU(STR_MENULIMITS, menuTabModel, e_Limits, 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, 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});
#else
MENU(STR_MENULIMITS, menuTabModel, e_Limits, 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});
#endif
uint8_t sub = m_posVert - 1;
@@ -2365,8 +2374,10 @@ void menuModelCurvesAll(uint8_t event)
break;
// no break
#endif
#if !defined(PCBX9D)
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_MENU):
#endif
case EVT_KEY_FIRST(KEY_ENTER):
if (CURVE_SELECTED()) {
s_curveChan = sub;
pushMenu(menuModelCurveOne);
@@ -2415,6 +2426,7 @@ enum CustomSwitchFields {
void menuModelCustomSwitchOne(uint8_t event)
{
TITLE(STR_MENUCUSTOMSWITCH);
CustomSwData * cs = cswaddress(s_currIdx);
uint8_t sw = DSW_SW1+s_currIdx;
putsSwitches(14*FW, 0, sw, (getSwitch(sw, 0) ? BOLD : 0));
@@ -2533,8 +2545,10 @@ void menuModelCustomSwitches(uint8_t event)
break;
// no break
#endif
#if !defined(PCBX9D)
case EVT_KEY_FIRST(KEY_RIGHT):
case EVT_KEY_FIRST(KEY_MENU):
#endif
case EVT_KEY_FIRST(KEY_ENTER):
if (sub >= 0) {
s_currIdx = sub;
pushMenu(menuModelCustomSwitchOne);
@@ -3230,23 +3244,18 @@ void menuModelTemplates(uint8_t event)
uint8_t sub = m_posVert - 1;
if (s_warning_result) {
if (sub<TMPL_COUNT)
if (sub < TMPL_COUNT) {
if (s_warning_result) {
s_warning_result = 0;
applyTemplate(sub);
s_warning_result = 0;
AUDIO_WARNING2();
}
switch(event)
{
case EVT_KEY_FIRST(KEY_MENU):
if (sub!=255) {
s_warning = STR_VTEMPLATES+1 + (sub * LEN2_VTEMPLATES);
s_warning_type = WARNING_TYPE_CONFIRM;
}
AUDIO_WARNING2();
}
if (event==EVT_KEY_FIRST(KEY_ENTER)) {
s_warning = STR_VTEMPLATES+1 + (sub * LEN2_VTEMPLATES);
s_warning_type = WARNING_TYPE_CONFIRM;
killEvents(event);
s_editMode = 0;
break;
}
}
uint8_t y = 1*FH;
+11 -7
View File
@@ -588,22 +588,26 @@ PACK(typedef struct t_SwashRingData { // Swash Ring data
#define ROTARY_ENCODER_MAX 1024
#if defined(PCBSKY9X)
#if defined(PCBX9D)
#define NUM_ROTARY_ENCODERS_EXTRA 0
#define NUM_ROTARY_ENCODERS 1
#define NUM_ROTARY_ENCODERS 0
#define ROTARY_ENCODER_ARRAY_EXTRA
#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1];
#elif defined(PCBGRUVIN9X)
#if defined(EXTRA_ROTARY_ENCODERS)
#elif defined(PCBSKY9X)
#define NUM_ROTARY_ENCODERS_EXTRA 0
#define NUM_ROTARY_ENCODERS 1
#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[1];
#define ROTARY_ENCODER_ARRAY_EXTRA
#elif defined(PCBGRUVIN9X) && defined(EXTRA_ROTARY_ENCODERS)
#define NUM_ROTARY_ENCODERS_EXTRA 2
#define NUM_ROTARY_ENCODERS (2+NUM_ROTARY_ENCODERS_EXTRA)
#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2];
#define ROTARY_ENCODER_ARRAY_EXTRA int16_t rotaryEncodersExtra[MAX_PHASES][NUM_ROTARY_ENCODERS_EXTRA];
#else //EXTRA_ROTARY_ENCODERS
#elif defined(PCBGRUVIN9X) && !defined(EXTRA_ROTARY_ENCODERS)
#define NUM_ROTARY_ENCODERS_EXTRA 0
#define NUM_ROTARY_ENCODERS 2
#define ROTARY_ENCODER_ARRAY_EXTRA
#endif //EXTRA_ROTARY_ENCODERS
#define ROTARY_ENCODER_ARRAY int16_t rotaryEncoders[2];
#define ROTARY_ENCODER_ARRAY_EXTRA
#else
#define NUM_ROTARY_ENCODERS_EXTRA 0
#define NUM_ROTARY_ENCODERS 0