mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-23 16:16:13 +01:00
3f06fb08df
* First pass at wifi inbound FSA * Fixup detector loop * Remove asyncBanned Unused, uninitialized * Move wifi setup loop out of .ino Wifi auto detect Serial 1,2,3 * Correct capitalization * Uno compiles clean * Command distributor Moved command execution routing out of Wifi code for future use by Ethernet interface. Co-authored-by: Fred <fndecker@gmail.com>
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
|