mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-30 11:36:13 +01:00
73 lines
2.2 KiB
C
73 lines
2.2 KiB
C
|
#ifndef WifiInboundHandler_h
|
||
|
#define WifiInboundHandler_h
|
||
|
|
||
|
#include "MemStream.h"
|
||
|
#include "DCCEXParser.h"
|
||
|
#include "DIAG.h"
|
||
|
|
||
|
class WifiInboundHandler {
|
||
|
public:
|
||
|
static void setup(Stream * ESStream);
|
||
|
static void loop();
|
||
|
|
||
|
private:
|
||
|
|
||
|
static WifiInboundHandler * singleton;
|
||
|
|
||
|
static const byte MAX_CLIENTS=5;
|
||
|
static const byte MAX_WIFI_BUFFER=255;
|
||
|
|
||
|
enum INBOUND_STATE {
|
||
|
INBOUND_BUSY, // keep calling in loop()
|
||
|
INBOUND_IDLE // Nothing happening, outbound may xcall CIPSEND
|
||
|
};
|
||
|
|
||
|
enum LOOP_STATE {
|
||
|
ANYTHING, // ready for +IPD, n CLOSED, n CONNECTED, busy etc...
|
||
|
SKIPTOEND, // skip to newline
|
||
|
|
||
|
// +IPD,client,length:data
|
||
|
IPD, // got +
|
||
|
IPD1, // got +I
|
||
|
IPD2, // got +IP
|
||
|
IPD3, // got +IPD
|
||
|
IPD4_CLIENT, // got +IPD, reading cient id
|
||
|
IPD5, // got +IPD,c
|
||
|
IPD6_LENGTH, // got +IPD,c, reading length
|
||
|
IPD_DATA, // got +IPD,c,ll,: collecting data
|
||
|
|
||
|
GOT_CLIENT_ID, // clientid prefix to CONNECTED / CLOSED
|
||
|
GOT_CLIENT_ID2, // clientid prefix to CONNECTED / CLOSED
|
||
|
GOT_CLIENT_ID3 // clientid prefix to CONNECTED / CLOSED
|
||
|
};
|
||
|
|
||
|
enum CLIENT_STATUS {
|
||
|
UNUSED, // client slot not in use
|
||
|
INBOUND_ARRIVING, // data is arriving
|
||
|
READY_TO_PROCESS, // data has arrived, may call parser now
|
||
|
PROCESSING, // command in progress
|
||
|
REPLY_PENDING, // reply is ready to CIPSEND
|
||
|
CIPSEND_PENDING, // CIPSEND waiting for >
|
||
|
CLOSE_PENDING, // CLOSE received
|
||
|
CLOSE_AFTER_SEND // Send CLOSE after CIPSEND completed
|
||
|
};
|
||
|
|
||
|
WifiInboundHandler(Stream * ESStream);
|
||
|
void loop1();
|
||
|
INBOUND_STATE loop2();
|
||
|
void processCommand(byte clientId);
|
||
|
Stream * wifiStream;
|
||
|
|
||
|
DCCEXParser *parser;
|
||
|
|
||
|
LOOP_STATE loopState=ANYTHING;
|
||
|
int runningClientId; // latest client inbound processing data or CLOSE
|
||
|
int dataLength; // dataLength of +IPD
|
||
|
byte * clientBuffer[MAX_CLIENTS];
|
||
|
MemStream * clientStream[MAX_CLIENTS];
|
||
|
CLIENT_STATUS clientStatus[MAX_CLIENTS];
|
||
|
bool clientCloseAfterReply[MAX_CLIENTS];
|
||
|
int clientPendingCIPSEND=-1;
|
||
|
};
|
||
|
#endif
|