Skip to content

Commit bb389c2

Browse files
committed
experimental jsonAPI
1 parent 66a8827 commit bb389c2

File tree

4 files changed

+136
-2
lines changed

4 files changed

+136
-2
lines changed

examples/LCDs/PCF8574/PCF8574/PCF8574.ino

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ class altPrompt:public prompt {
109109
public:
110110
altPrompt(constMEM promptShadow& p):prompt(p) {}
111111
Used printTo(navRoot &root,bool sel,menuOut& out, idx_t idx,idx_t len,idx_t) override {
112-
return out.printRaw("special prompt!",len);;
112+
return out.printRaw("special prompt!",len);
113113
}
114114
};
115115

@@ -209,5 +209,6 @@ void setup() {
209209
void loop() {
210210
nav.poll();
211211
digitalWrite(LEDPIN, ledCtrl);
212+
test=(millis()/1000)%101;
212213
delay(100);//simulate a delay as if other tasks are running
213214
}

library.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name=ArduinoMenu library
2-
version=4.5.0
2+
version=4.5.1
33
author=Rui Azevedo, [email protected]
44
maintainer=neu-rah, [email protected]
55
sentence=Generic menu/interactivity system

src/menuIO/jsonFmt.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#ifdef MENU_FMT_WRAPS
2+
#include "../menu.h"
3+
#include "jsonFmt.h"
4+
5+
namespace Menu {
6+
void jsonOptions(menuOut& o,navNode &nav,menuNode& node,idx_t idx) {
7+
o<<"\"options\":[";
8+
for(idx_t n=0;n<node.sz();n++)
9+
o<<(n?",":"")<<"\""<<node[n]<<"\"";
10+
o<<"]";
11+
}
12+
};
13+
#endif

src/menuIO/jsonFmt.h

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/* -*- C++ -*- */
2+
3+
#ifndef RSITE_ARDUINO_MENU_JSONFMT
4+
#define RSITE_ARDUINO_MENU_JSONFMT
5+
6+
#ifdef MENU_FMT_WRAPS
7+
#include "../menu.h"
8+
#include "../items.h"
9+
#include "esp8266Out.h"
10+
11+
namespace Menu {
12+
13+
void jsonOptions(menuOut& o,navNode &nav,menuNode& node,idx_t idx);
14+
15+
//wraps a webserver output and writes xml to it
16+
template<class T>
17+
class jsonFmt:public T {
18+
public:
19+
using T::T;
20+
result fmt(bool start,prompt& target,menuOut::fmtParts part,navNode &nav,idx_t idx=-1) {
21+
switch(part) {
22+
case menuOut::fmtPanel:
23+
if (start) *this<<"{";
24+
else T::operator<<("}");
25+
break;
26+
case menuOut::fmtTitle:
27+
if (start) T::operator<<("\"title\":");
28+
else T::operator<<(",");
29+
break;
30+
case menuOut::fmtBody:
31+
if (start) {
32+
*this<<"\"sel\":\""<<nav.sel<<"\",";
33+
*this<<"\"items\": [";
34+
} else T::operator<<("],"); break;
35+
case menuOut::fmtUnit:
36+
*this<<(start?"\"unit\":":",");
37+
break;
38+
case menuOut::fmtOp:
39+
if (start) {
40+
*this<<"{"
41+
<<"\"op\":"
42+
<<"\"idx\":\""<<idx<<"\","
43+
<<"\"enabled\":"<<target.enabled<<"\",";
44+
} else T::operator<<("}");
45+
break;
46+
case menuOut::fmtToggle:
47+
if (start) {
48+
*this<<"\"tog\":[";
49+
jsonOptions(*this,nav,*(menuNode*)&target,idx);
50+
*this<<"],\"value\":";
51+
} else *this<<",";
52+
break;
53+
case menuOut::fmtPrompt:
54+
if (start) {
55+
*this<<"\"tog\":";
56+
jsonOptions(*this,nav,*(menuNode*)&target,idx);
57+
*this<<",\"value\":";
58+
} else {
59+
*this<<",";
60+
*this<<"\"name\":"<<target.typeName();
61+
*this<<",";
62+
*this<<"\"";
63+
};
64+
break;
65+
case menuOut::fmtSelect:
66+
if (start) {
67+
*this<<"\"select\":";
68+
jsonOptions(*this,nav,*(menuNode*)&target,idx);
69+
} else *this<<",";
70+
break;
71+
case menuOut::fmtChoose:
72+
if (start) {
73+
*this<<"\"choose\":";
74+
jsonOptions(*this,nav,*(menuNode*)&target,idx);
75+
} else *this<<",";
76+
break;
77+
break;
78+
case menuOut::fmtField:
79+
if (start) {
80+
*this<<"\"field\":{\"high\":\"";
81+
target.printHigh(*this);
82+
*this<<"\",\"low\":\"";
83+
target.printLow(*this);
84+
*this<<"\",\"step\":\"";
85+
target.printStep(*this);
86+
*this<<"\",\"tune\":\"";
87+
target.printTune(*this);
88+
*this<<"\"}";
89+
} else *this<<",";
90+
break;
91+
case menuOut::fmtTextField:
92+
if (start) *this<<"\"value\":";
93+
else *this<<",";
94+
break;
95+
case menuOut::fmtIdx:
96+
if (start) *this<<"\"idx\":";
97+
else *this<<",";
98+
break;
99+
case menuOut::fmtCursor:
100+
if (start) *this<<"\"cursor\":";
101+
else *this<<",";
102+
break;
103+
case menuOut::fmtOpBody:
104+
if (start) *this<<"\"body\":";
105+
else *this<<",";
106+
break;
107+
case menuOut::fmtPreview:
108+
if (start) *this<<"\"preview\":";
109+
else *this<<",";
110+
break;
111+
default:break;
112+
}
113+
return proceed;
114+
}
115+
result fmtStart(prompt& target,menuOut::fmtParts part,navNode &nav,idx_t idx=-1) override {return fmt(true,target,part,nav,idx);}
116+
result fmtEnd(prompt& target,menuOut::fmtParts part,navNode &nav,idx_t idx=-1) override {return fmt(false,target,part,nav,idx);}
117+
};
118+
}//namespace
119+
#endif
120+
#endif

0 commit comments

Comments
 (0)