Skip to content

Commit 1694dbc

Browse files
committed
non-blocking fixes and fields base
finnally activated dormant code aimed to support fields draw much has to be done
1 parent e9d1663 commit 1694dbc

File tree

6 files changed

+69
-31
lines changed

6 files changed

+69
-31
lines changed

menu.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,22 +68,26 @@ void menu::activate(menuOut& p,Stream& c,bool canExit) {
6868
sel=0;
6969
p.top=0;
7070
//c.flush();//reset the encoder
71-
//p.drawn=0;//redraw menu
71+
p.drawn=0;//redraw menu
7272
}
7373
int op=-1;
7474
//do {
75+
//Serial<<"activation printing menu "<<text<<endl;
7576
printMenu(p,canExit);
7677
op=menuKeys(p,c,canExit);
7778
if (op>=0&&op<sz) {
7879
sel=op;
7980
if (data[op]->enabled) {
81+
/*Serial<<"activating option "<<op<<endl;
82+
Serial.flush();
83+
delay(10);*/
8084
data[op]->activate(p,c,true);
8185
//c.flush();//reset the encoder
8286
//p.drawn=0;//redraw menu
8387
}
8488
} else if (op==-1) {//then exit
8589
activeMenu=previousMenu;
86-
//c.flush();//reset the encoder
90+
c.flush();//reset the encoder
8791
//p.drawn=0;//redraw menu
8892
}
8993
//} while(op!=-1);

menu.h

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ for encoders, joysticks, keyboards or touch a stream must be made out of them
2222
#define RSITE_ARDUINOP_MENU_SYSTEM
2323

2424
#include <Stream.h>
25+
#include <HardwareSerial.h>
26+
#include "../utils/streamFlow.h"
2527

2628
class prompt;
2729
class menu;
@@ -98,14 +100,14 @@ for encoders, joysticks, keyboards or touch a stream must be made out of them
98100
menu id (text,sizeof(id##_data)/sizeof(prompt*),id##_data);
99101

100102
#define OP(...) OP_(__COUNTER__,__VA_ARGS__)
101-
#define FIELD_INT(...) FIELD_INT_(__COUNTER__,__VA_ARGS__)
103+
#define FIELD(...) FIELD_(__COUNTER__,__VA_ARGS__)
102104

103105
#define DECL_OP_(cnt,...) prompt op##cnt(__VA_ARGS__);
104-
#define DECL_FIELD_INT_(cnt,...) menuField<int> _menuField_int##cnt(__VA_ARGS__);
106+
#define DECL_FIELD_(cnt,type,...) menuField<type> _menuField##cnt(__VA_ARGS__);
105107
#define DECL_SUBMENU(id)
106108

107109
#define DEF_OP_(cnt,...) &op##cnt
108-
#define DEF_FIELD_INT_(cnt,...) &_menuField_int##cnt
110+
#define DEF_FIELD_(cnt,type,...) &_menuField##cnt
109111
#define DEF_SUBMENU(id) &id
110112

111113

@@ -128,13 +130,15 @@ for encoders, joysticks, keyboards or touch a stream must be made out of them
128130
virtual void setCursor(int x,int y)=0;
129131
virtual void print(char ch)=0;
130132
virtual void print(const char *text)=0;
131-
virtual void println(const char *text)=0;
133+
virtual void println(const char *text="")=0;
132134
virtual void print(int)=0;
133135
virtual void println(int)=0;
134136
virtual void print(double)=0;
135137
virtual void println(double)=0;
136138
virtual void print(prompt &o,bool selected,int idx,int posY,int width)=0;
137-
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width)=0;
139+
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
140+
println("Ok, this is it");
141+
}
138142
virtual void printMenu(menu&,bool drawExit)=0;
139143
};
140144

@@ -169,11 +173,17 @@ for encoders, joysticks, keyboards or touch a stream must be made out of them
169173
const char *text;
170174
promptAction action;
171175
bool enabled;
172-
prompt(const char * text,bool enabled=true):text(text),enabled(enabled) {}
176+
prompt(const char * text):text(text),enabled(true) {}
173177
prompt(const char * text,promptAction action)
174178
:text(text),action(action),enabled(true) {}
175-
virtual size_t printTo(Print& p) {p.print(text);return strlen(text);}
176-
virtual void activate(menuOut& p,Stream&c,bool) {action(*this,p,c);}
179+
virtual size_t printTo(Print& p) {
180+
//Serial<<"printing prompt"<<endl;
181+
p.print(text);return strlen(text);
182+
}
183+
virtual void activate(menuOut& p,Stream&c,bool) {
184+
//Serial<<"activating prompt "<<text<<endl;
185+
action(*this,p,c);
186+
}
177187
};
178188

179189
//a menu or sub-menu
@@ -185,14 +195,19 @@ for encoders, joysticks, keyboards or touch a stream must be made out of them
185195
static char disabledCursor;//to be used when navigating over disabled options
186196
static prompt exitOption;//option to append to menu allowing exit when no escape button/key is available
187197
static menu* activeMenu;
188-
menu* previousMenu;
189198
const int sz;
199+
menu* previousMenu;
190200
int sel;//selection
191201
prompt* const* data PROGMEM;
192202
menu(const char * text,int sz,prompt* const data[]):prompt(text),sz(sz),data(data),sel(0),width(16),previousMenu(NULL) {}
193203

204+
virtual size_t printTo(Print& p) {
205+
Serial<<"printing menu..."<<endl;
206+
}
194207
int menuKeys(menuOut &p,Stream& c,bool drawExit);
195-
inline void printMenu(menuOut& p,bool drawExit) {p.printMenu(*this,drawExit);}
208+
inline void printMenu(menuOut& p,bool drawExit) {
209+
p.printMenu(*this,drawExit);
210+
}
196211

197212
void activate(menuOut& p,Stream& c,bool canExit=false);
198213

menuGFX.h

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ Use graphics screens (adafruit library based) as menu output
5656
virtual void setCursor(int x,int y) {gfx.setCursor(x*resX,y*resY);}
5757
virtual void print(char ch) {gfx.print(ch);}
5858
virtual void print(const char *text) {gfx.print(text);}
59-
virtual void println(const char *text) {gfx.println(text);};
59+
virtual void println(const char *text="") {gfx.println(text);};
6060
virtual void print(int i) {gfx.print(i);};
6161
virtual void println(int i) {gfx.println(i);};
6262
virtual void print(double i) {gfx.print(i);};
@@ -66,11 +66,13 @@ Use graphics screens (adafruit library based) as menu output
6666
gfx.setTextColor(o.enabled?enabledColor:disabledColor);
6767
gfx.setCursor(0,posY*resY);
6868
//gfx.setTextColor(o.enabled?enabledColor:disabledColor,selected?hiliteColor:bgColor);
69-
gfx.print(o.text);
69+
//gfx.print(o.text);
70+
o.printTo(gfx);
71+
println();
7072
}
71-
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
73+
/*virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
7274
println("Ok, this is it");
73-
}
75+
}*/
7476
virtual void printMenu(menu& m,bool drawExit) {
7577
if (drawn!=&m) clear();
7678
if (m.sel-top>=maxY) top=m.sel-maxY+1;//selected option outside device (bottom)

menuLCD.h

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,20 +24,23 @@ Use standard arduino LCD (LiquidCrystal library) as menu output
2424
virtual void setCursor(int x,int y) {lcd.setCursor(x*resX,y*resY);}
2525
virtual void print(char ch) {lcd.print(ch);}
2626
virtual void print(const char *text) {lcd.print(text);}
27-
virtual void println(const char *text) {lcd.print(text);};
27+
virtual void println(const char *text="") {lcd.print(text);};
2828
virtual void print(int i) {lcd.print(i);};
2929
virtual void println(int i) {lcd.println(i);};
3030
virtual void print(double i) {lcd.print(i);};
3131
virtual void println(double i) {lcd.println(i);};
3232
virtual void print(prompt &o,bool selected,int idx,int posY,int width) {
3333
lcd.setCursor(0,posY);
3434
print(selected?(o.enabled?menu::enabledCursor:menu::disabledCursor):' ');
35-
print(o.text);
35+
//print(o.text);
36+
o.printTo(lcd);
37+
println();
3638
}
37-
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
39+
/*virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
3840
println("Ok, this is it");
39-
}
41+
}*/
4042
virtual void printMenu(menu& m,bool drawExit) {
43+
if (drawn==&m) return;
4144
clear();
4245
if (m.sel-top>=maxY) top=m.sel-maxY+1;//selected option outside device (bottom)
4346
else if (m.sel<top) top=m.sel;//selected option outside device (top)
@@ -49,6 +52,7 @@ Use standard arduino LCD (LiquidCrystal library) as menu output
4952
}
5053
if (drawExit&&i-top<maxY)
5154
print(menu::exitOption,m.sel==m.sz,0,i-top,m.width);
55+
drawn=&m;
5256
}
5357
};
5458
#endif RSITE_ARDUINOP_MENU_LCD

menuLCDs.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ as VirtualPins is not yet a standard I implemented this to support existing libr
1717
#include <LCD.h>
1818
#include "menu.h"
1919

20+
typedef void (*functionPtr)();
21+
2022
class menuLCD:public menuOut {
2123
public:
2224
LCD& lcd;
@@ -26,28 +28,32 @@ as VirtualPins is not yet a standard I implemented this to support existing libr
2628
virtual void setCursor(int x,int y) {lcd.setCursor(x*resX,y*resY);}
2729
virtual void print(char ch) {lcd.print(ch);}
2830
virtual void print(const char *text) {lcd.print(text);}
29-
virtual void println(const char *text) {lcd.print(text);};
31+
virtual void println(const char *text="") {lcd.print(text);};
3032
virtual void print(int i) {lcd.print(i);};
3133
virtual void println(int i) {lcd.println(i);};
3234
virtual void print(double i) {lcd.print(i);};
3335
virtual void println(double i) {lcd.println(i);};
3436
virtual void print(prompt &o,bool selected,int idx,int posY,int width) {
3537
lcd.setCursor(0,posY);
3638
print(selected?(o.enabled?menu::enabledCursor:menu::disabledCursor):' ');
37-
print(o.text);
39+
//print(o.text);
40+
o.printTo(lcd);
41+
println();
3842
}
39-
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
43+
/*virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
4044
println("Ok, this is it");
41-
}
45+
}*/
4246
virtual void printMenu(menu& m,bool drawExit) {
4347
if (drawn==&m) return;
44-
Serial.println("menuLCD clear");
48+
//Serial.println("menuLCDs print");
4549
clear();
4650
if (m.sel-top>=maxY) top=m.sel-maxY+1;//selected option outside device (bottom)
4751
else if (m.sel<top) top=m.sel;//selected option outside device (top)
4852
int i=0;for(;i<m.sz;i++) {
4953
if ((i>=top)&&((i-top)<maxY)) {
5054
if(i-top>=maxY) break;
55+
//Serial.print("OP: 0x");
56+
//Serial.println(((long**)m.data[i])[0][0],HEX);
5157
print(*m.data[i],i==m.sel,i+1,i-top,m.width);
5258
}
5359
}

menuPrint.h

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,26 +23,33 @@ menu output to Print device (ex: Serial)
2323
virtual void setCursor(int x,int y) {device.println("");}
2424
virtual void print(char ch) {device.print(ch);}
2525
virtual void print(const char *text) {device.print(text);}
26-
virtual void println(const char *text) {device.println(text);}
26+
virtual void println(const char *text="") {device.println(text);}
2727
virtual void print(int i) {device.print(i);};
2828
virtual void println(int i) {device.println(i);};
2929
virtual void print(double i) {device.print(i);};
3030
virtual void println(double i) {device.println(i);};
3131
virtual void print(prompt &o,bool selected,int idx,int posY,int width) {
3232
//setCursor(0,posY);
33+
//Serial<<"menuPrint prompt "<<o.text<<endl;
3334
print(idx<10?" ":"");
3435
print(idx);
3536
print(selected?(o.enabled?menu::enabledCursor:menu::disabledCursor):' ');
36-
println(o.text);
37+
//println(o.text);
38+
o.printTo(device);
39+
println();
3740
}
38-
virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
41+
/*virtual void print(menuField<int> &o,bool selected,int idx,int posY,int width) {
3942
println("Ok, this is it");
40-
}
43+
}*/
4144
virtual void printMenu(menu& m,bool drawExit) {
45+
if (drawn==&m) return;
46+
//Serial<<"menuPrint printMenu "<<m.sz<<" options of "<<m.text<<endl;
4247
clear();
43-
int i=0;for(;i<m.sz;i++)
44-
print(*m.data[i],i==m.sel,i+1,i-top,m.width);
48+
int i=0;
49+
for(;i<m.sz;i++)
50+
print(*m.data[i],i==m.sel,i+1,i-top,m.width);
4551
if (drawExit) print(menu::exitOption,m.sel==m.sz,0,i-top,m.width);
52+
drawn=&m;
4653
}
4754
};
4855

0 commit comments

Comments
 (0)