mirror of
https://github.com/DCC-EX/CommandStation-EX.git
synced 2024-11-22 23:56:13 +01:00
UNTESTED Reduce #ifdef hell on wifi
This fix to the structure of the Wifi code alows for a better link optimisation and so it is no longer necessary for the wifi code or header to read values from the config.h file. Compilation shows that >11Kb of code is eliminated by the linker if the setup and loop are not called. ~including the interface does not really change anything
This commit is contained in:
parent
411a6b1130
commit
162c7e6e11
|
@ -19,7 +19,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "WifiInterface.h" /* config.h and defines.h included here */
|
#include "WifiInterface.h" /* config.h and defines.h included here */
|
||||||
#ifdef WIFI_ON /* from config.h and defines.h */
|
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
#include "DIAG.h"
|
#include "DIAG.h"
|
||||||
#include "StringFormatter.h"
|
#include "StringFormatter.h"
|
||||||
|
@ -41,7 +40,7 @@ unsigned long WifiInterface::loopTimeoutStart = 0;
|
||||||
int WifiInterface::datalength = 0;
|
int WifiInterface::datalength = 0;
|
||||||
int WifiInterface::connectionId;
|
int WifiInterface::connectionId;
|
||||||
byte WifiInterface::buffer[MAX_WIFI_BUFFER+1];
|
byte WifiInterface::buffer[MAX_WIFI_BUFFER+1];
|
||||||
MemStream WifiInterface::streamer(buffer, MAX_WIFI_BUFFER);
|
MemStream * WifiInterface::streamer;
|
||||||
Stream * WifiInterface::wifiStream = NULL;
|
Stream * WifiInterface::wifiStream = NULL;
|
||||||
HTTP_CALLBACK WifiInterface::httpCallback = 0;
|
HTTP_CALLBACK WifiInterface::httpCallback = 0;
|
||||||
|
|
||||||
|
@ -60,7 +59,7 @@ bool WifiInterface::setup(Stream & setupStream, const __FlashStringHelper* SSid
|
||||||
StringFormatter::send(wifiStream, F("ATE0\r\n")); // turn off the echo
|
StringFormatter::send(wifiStream, F("ATE0\r\n")); // turn off the echo
|
||||||
checkForOK(200, OK_SEARCH, true);
|
checkForOK(200, OK_SEARCH, true);
|
||||||
}
|
}
|
||||||
|
streamer=new MemStream(buffer, MAX_WIFI_BUFFER);
|
||||||
DIAG(F("\n++ Wifi Setup %S ++\n"), connected ? F("OK") : F("FAILED"));
|
DIAG(F("\n++ Wifi Setup %S ++\n"), connected ? F("OK") : F("FAILED"));
|
||||||
return connected;
|
return connected;
|
||||||
}
|
}
|
||||||
|
@ -300,15 +299,15 @@ void WifiInterface::loop() {
|
||||||
case 6: // reading for length
|
case 6: // reading for length
|
||||||
if (ch == ':') loopstate = (datalength == 0) ? 99 : 7; // 99 is getout without reading next char
|
if (ch == ':') loopstate = (datalength == 0) ? 99 : 7; // 99 is getout without reading next char
|
||||||
else datalength = datalength * 10 + (ch - '0');
|
else datalength = datalength * 10 + (ch - '0');
|
||||||
streamer.flush(); // basically sets write point at start of buffer
|
streamer->flush(); // basically sets write point at start of buffer
|
||||||
break;
|
break;
|
||||||
case 7: // reading data
|
case 7: // reading data
|
||||||
streamer.write(ch); // NOTE: The MemStream will throw away bytes that do not fit in the buffer.
|
streamer->write(ch); // NOTE: The MemStream will throw away bytes that do not fit in the buffer.
|
||||||
// This protects against buffer overflows even with things as innocent
|
// This protects against buffer overflows even with things as innocent
|
||||||
// as a browser which send massive, irrlevent HTTP headers.
|
// as a browser which send massive, irrlevent HTTP headers.
|
||||||
datalength--;
|
datalength--;
|
||||||
if (datalength == 0) {
|
if (datalength == 0) {
|
||||||
buffer[streamer.available()]='\0'; // mark end of buffer, so it can be used as a string later
|
buffer[streamer->available()]='\0'; // mark end of buffer, so it can be used as a string later
|
||||||
loopstate = 99;
|
loopstate = 99;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -351,8 +350,8 @@ void WifiInterface::loop() {
|
||||||
loopstate = 1;
|
loopstate = 1;
|
||||||
}
|
}
|
||||||
if (ch == 'K') { // assume its in SEND OK
|
if (ch == 'K') { // assume its in SEND OK
|
||||||
if (Diag::WIFI) DIAG(F("\n\n Wifi BUSY RETRYING.. AT+CIPSEND=%d,%d\r\n"), connectionId, streamer.available());
|
if (Diag::WIFI) DIAG(F("\n\n Wifi BUSY RETRYING.. AT+CIPSEND=%d,%d\r\n"), connectionId, streamer->available());
|
||||||
StringFormatter::send(wifiStream, F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer.available());
|
StringFormatter::send(wifiStream, F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer->available());
|
||||||
loopTimeoutStart = millis();
|
loopTimeoutStart = millis();
|
||||||
loopstate = 10; // non-blocking loop waits for > before sending
|
loopstate = 10; // non-blocking loop waits for > before sending
|
||||||
break;
|
break;
|
||||||
|
@ -365,7 +364,7 @@ void WifiInterface::loop() {
|
||||||
// AT this point we have read an incoming message into the buffer
|
// AT this point we have read an incoming message into the buffer
|
||||||
|
|
||||||
if (Diag::WIFI) DIAG(F("\n%l Wifi(%d)<-[%e]\n"), millis(),connectionId, buffer);
|
if (Diag::WIFI) DIAG(F("\n%l Wifi(%d)<-[%e]\n"), millis(),connectionId, buffer);
|
||||||
streamer.setBufferContentPosition(0, 0); // reset write position to start of buffer
|
streamer->setBufferContentPosition(0, 0); // reset write position to start of buffer
|
||||||
// SIDE EFFECT WARNING:::
|
// SIDE EFFECT WARNING:::
|
||||||
// We know that parser will read the entire buffer before starting to write to it.
|
// We know that parser will read the entire buffer before starting to write to it.
|
||||||
// Otherwise we would have to copy the buffer elsewhere and RAM is in short supply.
|
// Otherwise we would have to copy the buffer elsewhere and RAM is in short supply.
|
||||||
|
@ -374,18 +373,18 @@ void WifiInterface::loop() {
|
||||||
|
|
||||||
// Intercept HTTP requests
|
// Intercept HTTP requests
|
||||||
if (isHTTP()) {
|
if (isHTTP()) {
|
||||||
if (httpCallback) httpCallback(&streamer, buffer);
|
if (httpCallback) httpCallback(streamer, buffer);
|
||||||
else {
|
else {
|
||||||
StringFormatter::send(streamer, F("HTTP/1.1 404 Not Found\nContent-Type: text/html\nConnnection: close\n\n"));
|
StringFormatter::send(streamer, F("HTTP/1.1 404 Not Found\nContent-Type: text/html\nConnnection: close\n\n"));
|
||||||
StringFormatter::send(streamer, F("<html><body>This is <b>not</b> a web server.<br/></body></html>"));
|
StringFormatter::send(streamer, F("<html><body>This is <b>not</b> a web server.<br/></body></html>"));
|
||||||
}
|
}
|
||||||
closeAfter = true;
|
closeAfter = true;
|
||||||
}
|
}
|
||||||
else if (buffer[0] == '<') parser.parse(&streamer, buffer, true); // tell JMRI parser that ACKS are blocking because we can't handle the async
|
else if (buffer[0] == '<') parser.parse(streamer, buffer, true); // tell JMRI parser that ACKS are blocking because we can't handle the async
|
||||||
|
|
||||||
else WiThrottle::getThrottle(connectionId)->parse(streamer, buffer);
|
else WiThrottle::getThrottle(connectionId)->parse(*streamer, buffer);
|
||||||
|
|
||||||
if (streamer.available() == 0) {
|
if (streamer->available() == 0) {
|
||||||
// No reply
|
// No reply
|
||||||
if (closeAfter) {
|
if (closeAfter) {
|
||||||
if (Diag::WIFI) DIAG(F("AT+CIPCLOSE=%d\r\n"), connectionId);
|
if (Diag::WIFI) DIAG(F("AT+CIPCLOSE=%d\r\n"), connectionId);
|
||||||
|
@ -395,11 +394,10 @@ void WifiInterface::loop() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// prepare to send reply
|
// prepare to send reply
|
||||||
buffer[streamer.available()]='\0'; // mark end of buffer, so it can be used as a string later
|
buffer[streamer->available()]='\0'; // mark end of buffer, so it can be used as a string later
|
||||||
if (Diag::WIFI) DIAG(F("%l WiFi(%d)->[%e] l(%d)\n"), millis(), connectionId, buffer, streamer.available());
|
if (Diag::WIFI) DIAG(F("%l WiFi(%d)->[%e] l(%d)\n"), millis(), connectionId, buffer, streamer->available());
|
||||||
if (Diag::WIFI) DIAG(F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer.available());
|
if (Diag::WIFI) DIAG(F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer->available());
|
||||||
StringFormatter::send(wifiStream, F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer.available());
|
StringFormatter::send(wifiStream, F("AT+CIPSEND=%d,%d\r\n"), connectionId, streamer->available());
|
||||||
loopTimeoutStart = millis();
|
loopTimeoutStart = millis();
|
||||||
loopstate = 10; // non-blocking loop waits for > before sending
|
loopstate = 10; // non-blocking loop waits for > before sending
|
||||||
}
|
}
|
||||||
#endif // WIFI_ON
|
|
||||||
|
|
|
@ -19,12 +19,8 @@
|
||||||
*/
|
*/
|
||||||
#ifndef WifiInterface_h
|
#ifndef WifiInterface_h
|
||||||
#define WifiInterface_h
|
#define WifiInterface_h
|
||||||
#include "config.h"
|
|
||||||
#include "defines.h"
|
|
||||||
#ifdef WIFI_ON
|
|
||||||
#include "DCCEXParser.h"
|
#include "DCCEXParser.h"
|
||||||
#include "MemStream.h"
|
#include "MemStream.h"
|
||||||
|
|
||||||
#include <Arduino.h>
|
#include <Arduino.h>
|
||||||
#include <avr/pgmspace.h>
|
#include <avr/pgmspace.h>
|
||||||
|
|
||||||
|
@ -56,7 +52,6 @@ private:
|
||||||
static unsigned long loopTimeoutStart;
|
static unsigned long loopTimeoutStart;
|
||||||
static const byte MAX_WIFI_BUFFER = 250;
|
static const byte MAX_WIFI_BUFFER = 250;
|
||||||
static byte buffer[MAX_WIFI_BUFFER + 1];
|
static byte buffer[MAX_WIFI_BUFFER + 1];
|
||||||
static MemStream streamer;
|
static MemStream * streamer;
|
||||||
};
|
};
|
||||||
#endif // WIFI_ON
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user