Skip to content

Commit 12eb5b0

Browse files
committed
implementing json format
some fixes
1 parent e6d17b9 commit 12eb5b0

File tree

7 files changed

+106
-57
lines changed

7 files changed

+106
-57
lines changed

src/items.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,10 +174,16 @@ Used textField::printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len
174174
bool editing=this==root.navFocus;
175175
trace(MENU_DEBUG_OUT<<"editing:"<<editing<<" len:"<<len;)
176176
idx_t l=navTarget::printTo(root,sel,out,idx,len,panelNr);
177+
#ifdef MENU_FMT_WRAPS
178+
out.fmtStart(*this,menuOut::fmtEditCursor,root.node(),idx);
179+
#endif
177180
if (l<len) {
178181
out.write(editing?":":" ");
179182
l++;
180183
}
184+
#ifdef MENU_FMT_WRAPS
185+
out.fmtEnd(*this,menuOut::fmtEditCursor,root.node(),idx);
186+
#endif
181187
// idx_t c=l;
182188
//idx_t top=out.tops[root.level];
183189
#ifdef MENU_FMT_WRAPS

src/menuIO/esp8266Out.h

Lines changed: 39 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -49,33 +49,62 @@
4949
//template<typename T> esp8266Out& operator<<(T t)=0;
5050
};
5151

52+
class esp8266BufferedOut:public esp8266Out {
53+
public:
54+
String response;
55+
using esp8266Out::esp8266Out;
56+
template<typename T> inline esp8266BufferedOut& operator<<(T t) {response<<t;return *this;}
57+
size_t write(uint8_t ch) override {response+=(char)ch;return 1;}
58+
};
59+
5260
menuOut& operator<<(menuOut&o,classes c);
5361
template<typename T> inline String& operator<<(String& o,T t) {return o.operator+=(t);}
5462

55-
class esp8266_WebServerOut:public esp8266Out {
63+
class esp8266_WebServerOut:public esp8266BufferedOut {
5664
public:
57-
String response;
5865
ESP8266WebServer &server;
5966
//using esp8266Out::esp8266Out;
6067
esp8266_WebServerOut(
6168
ESP8266WebServer &srv,
6269
/*const colorDef<esp8266Out::webColor> (&c)[nColors],*/
6370
idx_t* t,
6471
panelsList& p
65-
):esp8266Out(t,p),server(srv) {}
72+
):esp8266BufferedOut(t,p),server(srv) {}
6673
size_t write(uint8_t ch) override {response<<(char)ch;return 1;}
67-
template<typename T> inline esp8266_WebServerOut& operator<<(T t) {response<<t;return *this;}
74+
// template<typename T> inline esp8266_WebServerOut& operator<<(T t) {response<<t;return *this;}
6875
};
6976

70-
class esp8266_WebSocketOut:public esp8266Out {
77+
class esp8266_WebServerStreamOut:public esp8266Out {
7178
public:
72-
String response;
73-
WebSocketsServer &webSocket;
74-
esp8266_WebSocketOut(WebSocketsServer &socket,idx_t* tops,panelsList& panels)
75-
:webSocket(socket),esp8266Out(tops,panels,(menuOut::styles)(minimalRedraw|expandEnums)) {}
76-
size_t write(uint8_t ch) override {response<<(char)ch;return 1;}
79+
ESP8266WebServer &server;
80+
inline esp8266_WebServerStreamOut(
81+
ESP8266WebServer &srv,
82+
idx_t* t,
83+
panelsList& p
84+
):esp8266Out(t,p),server(srv) {}
85+
inline size_t write(uint8_t ch) override {
86+
char c[2]={ch,0};
87+
server.sendContent(c);
88+
return 1;
89+
}
90+
template<typename T> inline esp8266_WebServerStreamOut& operator<<(T t) {
91+
server.sendContent(String()+t);
92+
return *this;
93+
}
7794
};
7895

96+
// class esp8266_WebSocketOut:public esp8266BufferedOut {
97+
// public:
98+
// //client num... well we only serve a client at a time, so its safe to put t here
99+
// // of course this kind of code is not thead safe...but we dont have theads anyway
100+
// uint8_t num;
101+
// String response;
102+
// WebSocketsServer &webSocket;
103+
// esp8266_WebSocketOut(WebSocketsServer &socket,idx_t* tops,panelsList& panels)
104+
// :webSocket(socket),esp8266BufferedOut(tops,panels,(menuOut::styles)(minimalRedraw|expandEnums)) {}
105+
// size_t write(uint8_t ch) override {response<<(char)ch;return 1;}
106+
// };
107+
79108
//template<typename T> inline esp8266_WebServerOut& operator<<(esp8266_WebServerOut&o , T t) {return o.operator<<(t);}
80109
//template<typename T> inline esp8266_WiFiClientOut& operator<<(esp8266_WiFiClientOut&o , T t) {return o.operator<<(t);}
81110
//template<typename T> inline esp8266Out& operator<<(esp8266Out&o , T t) {return o.operator<<(t);}

src/menuIO/jsonFmt.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@
2222
case menuOut::fmtChoose: return "fmtChoose";
2323
case menuOut::fmtUnit: return "fmtUnit";
2424
case menuOut::fmtTextField: return "fmtTextField";
25+
case menuOut::fmtCursorOpen: return "fmtCursorOpen";
26+
case menuOut::fmtCursorClose: return "fmtCursorClose";
27+
case menuOut::fmtValue: return "fmtVluea";
2528
default: return "???";
2629
}
2730
}
@@ -31,7 +34,7 @@
3134
#endif
3235
int cursorCtrl=0;
3336
void jsonOptions(menuOut& o,navNode &nav,menuNode& node,idx_t idx) {
34-
o<<"\",options\":[";
37+
o<<",\"options\":[";
3538
// o<<node.sz();
3639
for(idx_t n=0;n<node.sz();n++)
3740
o<<(n?",":"")<<"\""<<node[n]<<"\"";

src/menuIO/jsonFmt.h

Lines changed: 33 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,53 +33,62 @@
3333
break;
3434
case menuOut::fmtTitle:
3535
if (start) T::operator<<("\"title\":{");
36-
else T::operator<<("},\n");
36+
else T::operator<<("}\n");
3737
break;
3838
case menuOut::fmtBody:
3939
if (start) {
40-
*this<<"\"sel\":\""<<nav.sel<<"\",";
41-
*this<<"\"items\":[\n";
42-
} else T::operator<<("\n]\n"); break;
40+
*this<<",\"sel\":\""<<nav.sel<<"\"";
41+
*this<<",\"items\":[\n";
42+
} else T::operator<<("\n]\n");
43+
break;
4344
case menuOut::fmtUnit:
44-
*this<<(start?"\"unit\":\"":"\"");
45+
*this<<(start?",\"unit\":\"":"\"");
4546
break;
4647
case menuOut::fmtOp:
4748
if (start) {
4849
if (idx>0) *this<<",\n";
49-
else "\n";
50-
*this<<"{\"idx\":\""<<idx<<"\","
51-
<<"\"enabled\":\""<<target.enabled<<"\",";
50+
*this<<"{\"idx\":\""<<idx<<"\""
51+
<<",\"enabled\":\""<<target.enabled<<"\"";
5252
} else *this<<("}");
5353
break;
5454
case menuOut::fmtToggle:
5555
if (start) {
5656
*this<<",\"value\":\"";
5757
} else {
58-
*this<<"\",";
58+
*this<<"\"";
5959
jsonOptions(*this,nav,*(menuNode*)&target,idx);
6060
// *this<<",";
6161
}
6262
break;
6363
case menuOut::fmtPrompt:
6464
if (start) {
65+
if (idx>=0) *this<<",";
6566
*this<<"\"prompt\":\"";
6667
} else {
6768
*this<<"\"";
6869
if (target.has(_asPad))
6970
*this<<",\"pad\":[";
7071
};
7172
break;
73+
case menuOut::fmtValue:
74+
if (start) *this<<",\"value\":\"";
75+
else *this<<"\"";
76+
break;
7277
case menuOut::fmtSelect:
7378
if (start) {
74-
*this<<",\"type\":\"select\"";
79+
*this<<",\"select\":\"";
80+
} else {
81+
*this<<"\"";
7582
jsonOptions(*this,nav,*(menuNode*)&target,idx);
76-
} else *this<<"";
83+
}
7784
break;
7885
case menuOut::fmtChoose:
7986
if (start) {
80-
*this<<"\"choose\":";
87+
*this<<",\"choose\":\"";
88+
} else {
89+
*this<<"\"";
8190
jsonOptions(*this,nav,*(menuNode*)&target,idx);
82-
} else *this<<",";
91+
}
8392
break;
8493
break;
8594
case menuOut::fmtField:
@@ -95,24 +104,27 @@
95104
*this<<"\",\"tune\":\"";
96105
target.printTune(*this);
97106
*this<<"\"}";
98-
*this<<",";
99107
}
100108
break;
109+
case menuOut::fmtEditCursor:
110+
if (start) *this<<",\"editCursor\":\"";
111+
else *this<<"\"";
112+
break;
101113
case menuOut::fmtTextField:
102114
if (start) *this<<",\"text\":\"";
103-
else *this<<"\"\n";
115+
else *this<<"\"";
104116
break;
105117
case menuOut::fmtIdx:
106118
// if (start) *this<<"\"idx\":";
107119
// else *this<<",";
108120
break;
109121
case menuOut::fmtCursor:
110-
if (start) *this<<"\"cursor\":\"";
111-
else *this<<"\",";
122+
if (start) *this<<",\"cursor\":\"";
123+
else *this<<"\"";
112124
break;
113125
case menuOut::fmtCursorOpen:
114-
if (start) *this<<"\"selStart\":\"";
115-
else *this<<"\",";
126+
if (start) *this<<",\"selStart\":\"";
127+
else *this<<"\"";
116128
break;
117129
case menuOut::fmtCursorClose:
118130
if (start) *this<<",\"selEnd\":\"";
@@ -128,8 +140,8 @@
128140
}
129141
break;
130142
case menuOut::fmtPreview:
131-
if (start) *this<<"\"preview\":";
132-
else *this<<",\n";
143+
if (start) *this<<",\"preview\":\"";
144+
else *this<<"\"\n";
133145
break;
134146
default:break;
135147
}

src/menuIO/xmlFmt.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,10 @@
126126
*this<<"\"><![CDATA[";
127127
} else *this<<"]]></fld>";
128128
break;
129+
case menuOut::fmtEditCursor:
130+
if (start) *this<<"<ec><![CDATA[";
131+
else *this<<"]]></ec>";
132+
break;
129133
case menuOut::fmtTextField:
130134
if (start) *this<<"<fv><![CDATA[";
131135
else *this<<"]]></fv>";

src/menuIo.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,8 @@
6464
fmtPanel,fmtTitle,fmtBody,fmtOp,
6565
fmtIdx,fmtCursor,fmtOpBody,fmtPreview,
6666
fmtPrompt,fmtField,fmtToggle,fmtSelect,
67-
fmtChoose,fmtUnit,fmtTextField,fmtCursorOpen,fmtCursorClose
67+
fmtChoose,fmtUnit,fmtTextField,fmtCursorOpen,
68+
fmtCursorClose,fmtValue,fmtEditCursor
6869
};
6970
menuNode* drawn=NULL;
7071
bool pageScroll=false;

test.json

Lines changed: 18 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,21 @@
11
{
22
"output":"",
3-
"menu":{
4-
"title":{"prompt":"Zeit/Datum einstellen"},
5-
"sel":"0","items":[
6-
{"idx":"0","enabled":"1","cursor":">","prompt":"",
7-
"pad":[
8-
{"idx":"0","enabled":"1","cursor":" ","prompt":"" ,"field":"1","range":{"low":"1","high":"31","step":"1","tune":"0"},"unit":"/"},
9-
{"idx":"1","enabled":"1","cursor":" ","prompt":"" ,"field":"1","range":{"low":"1","high":"12","step":"1","tune":"0"},"unit":"/"},
10-
{"idx":"2","enabled":"1","cursor":" ","prompt":"" ,"field":"2000","range":{"low":"2000","high":"2100","step":"10","tune":"1"},"unit":""}
11-
]
12-
},
13-
{"idx":"1","enabled":"1","cursor":" ","prompt":"",
14-
"pad":[
15-
{"idx":"0","enabled":"1","cursor":" ","prompt":"" ,"field":"0","range":{"low":"0","high":"23","step":"1","tune":"0"},"unit":":"},
16-
{"idx":"1","enabled":"1","cursor":" ","prompt":"" ,"field":"6","range":{"low":"0","high":"59","step":"10","tune":"1"},"unit":":"},
17-
{"idx":"2","enabled":"1","cursor":" ","prompt":"" ,"field":"33","range":{"low":"0","high":"59","step":"10","tune":"1"},"unit":""}
18-
]
19-
},
20-
{"idx":"2","enabled":"1","cursor":" ","prompt":"GMT" ,"field":"-1","range":{"low":"-11","high":"12","step":"1","tune":"0"},"unit":""},
21-
{"idx":"3","enabled":"1","cursor":" ","prompt":"Sommerzeit:""tog":["options":[2]],"value":An,},
22-
{"idx":"4","enabled":"1","cursor":" ","prompt":"benutze NTP"},
23-
{"idx":"5","enabled":"1","cursor":" ","prompt":"Speichern"},
24-
{"idx":"6","enabled":"1","cursor":" ","prompt":"Zurück"}
25-
]
26-
}
3+
"menu":{"title":{"prompt":"Einstellungen"},
4+
,"sel":"0","items":[
5+
{"idx":"0","enabled":"1","selStart":">""prompt":"Standby" ,"field":"5","range":{"low":"2","high":"5","step":"1","tune":"0"},"unit":"min."},
6+
{"idx":"1","enabled":"1","selStart":" ""prompt":"Key" ,"text":"QUYxMkJH"
7+
},
8+
{"idx":"2","enabled":"1","selStart":" ""prompt":"Mondlicht" ,"type":"select"",options":["Aus","#1","#2","#3","#4","#5","#6"]#4},
9+
{"idx":"3","enabled":"1","selStart":" ""prompt":"max" ,"field":"1","range":{"low":"0","high":"100","step":"10","tune":"1"},"unit":"%"},
10+
{"idx":"4","enabled":"1","selStart":" ""prompt":"Wolken:","value":"Aus",options":["Aus","An"]},
11+
{"idx":"5","enabled":"1","selStart":" ""prompt":"max" ,"field":"50","range":{"low":"0","high":"100","step":"10","tune":"1"},"unit":"%"},
12+
{"idx":"6","enabled":"1","selStart":" ""prompt":"Gewitter:","value":"Aus",options":["Aus","An"]},
13+
{"idx":"7","enabled":"1","selStart":" ""prompt":"max" ,"field":"50","range":{"low":"0","high":"100","step":"10","tune":"1"},"unit":"%"},
14+
{"idx":"8","enabled":"1","selStart":" ""prompt":"Wi-Fi"},
15+
{"idx":"9","enabled":"1","selStart":" ""prompt":"Sprache" ,"type":"select"",options":["DE","EN","PT"]DE},
16+
{"idx":"10","enabled":"1","selStart":" ""prompt":"Aktualisieren..."},
17+
{"idx":"11","enabled":"1","selStart":" ""prompt":"Speichern"},
18+
{"idx":"12","enabled":"1","selStart":" ""prompt":"Zurück"}
19+
]
20+
}
2721
}

0 commit comments

Comments
 (0)