Skip to content

Commit d96f5e4

Browse files
committed
Added support for reading the new Async events
Moved Async event code to the OpenEVSE library and added support for the new $AT and $AB events.
1 parent d780f33 commit d96f5e4

File tree

5 files changed

+112
-36
lines changed

5 files changed

+112
-36
lines changed

src/input.cpp

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@
1717

1818
#include "RapiSender.h"
1919

20-
#define OPENEVSE_WIFI_MODE_AP 0
21-
#define OPENEVSE_WIFI_MODE_CLIENT 1
22-
#define OPENEVSE_WIFI_MODE_AP_DEFAULT 2
23-
2420
int espflash = 0;
2521
int espfree = 0;
2622

@@ -371,18 +367,13 @@ handleRapiRead()
371367
Profile_End(handleRapiRead, 10);
372368
}
373369

374-
void on_rapi_event()
370+
void input_setup()
375371
{
376-
DBUGF("Got ASYNC event %s", rapiSender.getToken(0));
377-
378-
if(!strcmp(rapiSender.getToken(0), "$ST"))
372+
OpenEVSE.onState([](uint8_t evse_state, uint8_t pilot_state, uint32_t current_capacity, uint32_t vflags)
379373
{
380-
const char *val = rapiSender.getToken(1);
381-
DBUGVAR(val);
382-
383-
// Update our local state
384-
state = strtol(val, NULL, 16);
385-
DBUGVAR(state);
374+
// Update our global state
375+
DBUGVAR(evse_state);
376+
state = evse_state;
386377

387378
// Send to all clients
388379
String event = F("{\"state\":");
@@ -395,13 +386,10 @@ void on_rapi_event()
395386
event += String(state);
396387
mqtt_publish(event);
397388
}
398-
}
399-
else if(!strcmp(rapiSender.getToken(0), "$WF"))
400-
{
401-
const char *val = rapiSender.getToken(1);
402-
DBUGVAR(val);
389+
});
403390

404-
long wifiMode = strtol(val, NULL, 10);
391+
OpenEVSE.onWiFi([](uint8_t wifiMode)
392+
{
405393
DBUGVAR(wifiMode);
406394
switch(wifiMode)
407395
{
@@ -413,5 +401,5 @@ void on_rapi_event()
413401
net_wifi_turn_off_ap();
414402
break;
415403
}
416-
}
404+
});
417405
}

src/input.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ extern String ohm_hour;
6767
extern void handleRapiRead();
6868
extern void update_rapi_values();
6969
extern void create_rapi_json(String &data);
70-
extern void on_rapi_event();
7170

71+
extern void input_setup();
7272

7373
#endif // _EMONESP_INPUT_H

src/main.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,11 @@ void setup()
9090
DBUGF("After ota_setup: %d", HAL.getFreeHeap());
9191
#endif
9292

93+
input_setup();
94+
9395
lcd_display(F("OpenEVSE WiFI"), 0, 0, 0, LCD_CLEAR_LINE);
9496
lcd_display(currentfirmware, 0, 1, 5 * 1000, LCD_CLEAR_LINE);
9597

96-
rapiSender.setOnEvent(on_rapi_event);
97-
rapiSender.enableSequenceId(0);
98-
9998
start_mem = last_mem = HAL.getFreeHeap();
10099
} // end setup
101100

src/openevse.cpp

Lines changed: 70 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
OpenEVSEClass::OpenEVSEClass() :
1111
_sender(NULL),
1212
_connected(false),
13-
_protocol(OPENEVSE_ENCODE_VERSION(1,0,0))
13+
_protocol(OPENEVSE_ENCODE_VERSION(1,0,0)),
14+
_boot(NULL),
15+
_state(NULL),
16+
_wifi(NULL)
1417
{
1518
}
1619

@@ -19,6 +22,9 @@ void OpenEVSEClass::begin(RapiSender &sender, std::function<void(bool connected)
1922
_connected = false;
2023
_sender = &sender;
2124

25+
_sender->setOnEvent([this]() { onEvent(); });
26+
_sender->enableSequenceId(0);
27+
2228
getVersion([this, callback](int ret, const char *firmware, const char *protocol) {
2329
if (RAPI_RESPONSE_OK == ret) {
2430
int major, minor, patch;
@@ -68,28 +74,23 @@ void OpenEVSEClass::getStatus(std::function<void(int ret, uint8_t evse_state, ui
6874
if(_sender->getTokenCnt() >= tokens_required)
6975
{
7076
const char *val = _sender->getToken(1);
71-
DBUGVAR(val);
7277
uint8_t evse_state = strtol(val, NULL, state_base);
73-
DBUGVAR(evse_state);
78+
7479
val = _sender->getToken(2);
75-
DBUGVAR(val);
7680
uint32_t elapsed = strtol(val, NULL, 10);
77-
DBUGVAR(elapsed);
7881

7982
uint8_t pilot_state = OPENEVSE_STATE_INVALID;
8083
uint32_t vflags = 0;
8184

8285
if(_protocol >= OPENEVSE_OCPP_SUPPORT_PROTOCOL_VERSION) {
83-
val = _sender->getToken(1);
84-
DBUGVAR(val);
86+
val = _sender->getToken(3);
8587
pilot_state = strtol(val, NULL, state_base);
86-
DBUGVAR(pilot_state);
87-
val = _sender->getToken(2);
88-
DBUGVAR(val);
88+
89+
val = _sender->getToken(4);
8990
vflags = strtol(val, NULL, 16);
90-
DBUGVAR(vflags);
9191
}
9292

93+
DBUGF("evse_state = %02x, elapsed = %d, pilot_state = %02x, vflags = %08x", evse_state, elapsed, pilot_state, vflags);
9394
callback(RAPI_RESPONSE_OK, evse_state, elapsed, pilot_state, vflags);
9495
} else {
9596
callback(RAPI_RESPONSE_INVALID_RESPONSE, OPENEVSE_STATE_INVALID, 0, OPENEVSE_STATE_INVALID, 0);
@@ -100,4 +101,62 @@ void OpenEVSEClass::getStatus(std::function<void(int ret, uint8_t evse_state, ui
100101
});
101102
}
102103

104+
void OpenEVSEClass::onEvent()
105+
{
106+
DBUGF("Got ASYNC event %s", _sender->getToken(0));
107+
108+
if(!strcmp(_sender->getToken(0), "$ST"))
109+
{
110+
const char *val = _sender->getToken(1);
111+
DBUGVAR(val);
112+
uint8_t state = strtol(val, NULL, 16);
113+
DBUGVAR(state);
114+
115+
if(_state) {
116+
_state(state, OPENEVSE_STATE_INVALID, 0, 0);
117+
}
118+
}
119+
else if(!strcmp(_sender->getToken(0), "$WF"))
120+
{
121+
const char *val = _sender->getToken(1);
122+
DBUGVAR(val);
123+
124+
uint8_t wifiMode = strtol(val, NULL, 10);
125+
DBUGVAR(wifiMode);
126+
127+
if(_wifi) {
128+
_wifi(wifiMode);
129+
}
130+
}
131+
else if(!strcmp(_sender->getToken(0), "$AT"))
132+
{
133+
const char *val = _sender->getToken(1);
134+
uint8_t evse_state = strtol(val, NULL, 16);
135+
136+
val = _sender->getToken(2);
137+
uint8_t pilot_state = strtol(val, NULL, 16);
138+
139+
val = _sender->getToken(3);
140+
uint32_t current_capacity = strtol(val, NULL, 10);
141+
142+
val = _sender->getToken(4);
143+
uint32_t vflags = strtol(val, NULL, 16);
144+
145+
DBUGF("evse_state = %02x, pilot_state = %02x, current_capacity = %d, vflags = %08x", evse_state, pilot_state, current_capacity, vflags);
146+
147+
if(_state) {
148+
_state(evse_state, pilot_state, current_capacity, vflags);
149+
}
150+
}
151+
else if(!strcmp(_sender->getToken(0), "$AB"))
152+
{
153+
const char *val = _sender->getToken(1);
154+
uint8_t post_code = strtol(val, NULL, 16);
155+
156+
if(_boot) {
157+
_boot(post_code, _sender->getToken(2));
158+
}
159+
}
160+
}
161+
103162
OpenEVSEClass OpenEVSE;

src/openevse.h

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@
2121
#define OPENEVSE_STATE_SLEEPING 254
2222
#define OPENEVSE_STATE_DISABLED 255
2323

24+
#define OPENEVSE_POST_CODE_OK 0
25+
#define OPENEVSE_POST_CODE_NO_EARTH_GROUND 7
26+
#define OPENEVSE_POST_CODE_STUCK_RELAY 8
27+
#define OPENEVSE_POST_CODE_GFI_SELF_TEST_FAILED 9
28+
2429
// J1772EVSEController volatile m_wVFlags bits - not saved to EEPROM
2530
#define OPENEVSE_VFLAG_AUTOSVCLVL_SKIPPED 0x0001 // auto svc level test skipped during post
2631
#define OPENEVSE_VFLAG_HARD_FAULT 0x0002 // in non-autoresettable fault
@@ -40,10 +45,19 @@
4045
#define OPENEVSE_VFLAG_DEFAULT ECVF_SESSION_ENDED
4146
#endif
4247

48+
#define OPENEVSE_WIFI_MODE_AP 0
49+
#define OPENEVSE_WIFI_MODE_CLIENT 1
50+
#define OPENEVSE_WIFI_MODE_AP_DEFAULT 2
51+
4352
#define OPENEVSE_ENCODE_VERSION(a,b,c) (((a)*1000) + ((b)*100) + (c))
4453

4554
#define OPENEVSE_OCPP_SUPPORT_PROTOCOL_VERSION OPENEVSE_ENCODE_VERSION(5,0,0)
4655

56+
57+
typedef std::function<void(uint8_t post_code, const char *firmware)> OpenEVSEBootCallback;
58+
typedef std::function<void(uint8_t evse_state, uint8_t pilot_state, uint32_t current_capacity, uint32_t vflags)> OpenEVSEStateCallback;
59+
typedef std::function<void(uint8_t event)> OpenEVSEWiFiCallback;
60+
4761
class OpenEVSEClass
4862
{
4963
private:
@@ -52,6 +66,12 @@ class OpenEVSEClass
5266
bool _connected;
5367
uint32_t _protocol;
5468

69+
OpenEVSEBootCallback _boot;
70+
OpenEVSEStateCallback _state;
71+
OpenEVSEWiFiCallback _wifi;
72+
73+
void onEvent();
74+
5575
public:
5676
OpenEVSEClass();
5777
~OpenEVSEClass() { }
@@ -64,6 +84,16 @@ class OpenEVSEClass
6484
bool isConnected() {
6585
return _connected;
6686
}
87+
88+
void onBoot(OpenEVSEBootCallback callback) {
89+
_boot = callback;
90+
}
91+
void onState(OpenEVSEStateCallback callback) {
92+
_state = callback;
93+
}
94+
void onWiFi(OpenEVSEWiFiCallback callback) {
95+
_wifi = callback;
96+
}
6797
};
6898

6999
extern OpenEVSEClass OpenEVSE;

0 commit comments

Comments
 (0)