1
0
mirror of https://github.com/DCC-EX/CommandStation-EX.git synced 2024-11-30 03:26:13 +01:00

More PROGMEM tuning

This commit is contained in:
Asbelos 2020-06-13 15:53:46 +01:00
parent 8538aa1624
commit 506f9e4353
8 changed files with 32 additions and 26 deletions

View File

@ -2,8 +2,8 @@
#define Config_h #define Config_h
const int WIFI_PORT = 99; // OR set to zero for no wifi const int WIFI_PORT = 99; // OR set to zero for no wifi
const char WIFI_SSID[] = "BTHub5-M6PT"; // your network SSID (name) const char WIFI_SSID[] PROGMEM = "BTHub5-M6PT"; // your network SSID (name)
const char WIFI_PASS[] = "49de8d4862"; // your network password const char WIFI_PASS[] PROGMEM = "49de8d4862"; // your network password
const long WIFI_BAUD_RATE=115200; const long WIFI_BAUD_RATE=115200;
const long SERIAL_BAUD_RATE=115200; const long SERIAL_BAUD_RATE=115200;

View File

@ -9,7 +9,7 @@
#include "EEStore.h" #include "EEStore.h"
#include "DIAG.h" #include "DIAG.h"
const char VERSION[]="99.666"; const char VERSION[] PROGMEM ="99.666";
int DCCEXParser::stashP[MAX_PARAMS]; int DCCEXParser::stashP[MAX_PARAMS];
bool DCCEXParser::stashBusy; bool DCCEXParser::stashBusy;
@ -178,7 +178,7 @@ void DCCEXParser::parse(Print & stream, const char *com) {
case 's': // <s> case 's': // <s>
StringFormatter::send(stream,F("<p%d>"),DCCWaveform::mainTrack.getPowerMode()==POWERMODE::ON ); StringFormatter::send(stream,F("<p%d>"),DCCWaveform::mainTrack.getPowerMode()==POWERMODE::ON );
StringFormatter::send(stream,F("<iDCC-Asbelos BASE STATION FOR ARDUINO / %s: V-%s %s/%s>"), BOARD_NAME, VERSION, __DATE__, __TIME__ ); StringFormatter::send(stream,F("<iDCC-Asbelos BASE STATION FOR ARDUINO / %S: V-%S %s/%s>"), BOARD_NAME, VERSION, __DATE__, __TIME__ );
// TODO Send stats of speed reminders table // TODO Send stats of speed reminders table
// TODO send status of turnouts etc etc // TODO send status of turnouts etc etc
return; return;

View File

@ -31,5 +31,5 @@ struct DCCEXParser
}; };
#define BOARD_NAME "not yet configured" #define BOARD_NAME F("not yet configured")
#endif #endif

View File

@ -87,7 +87,7 @@ void DCCWaveform::checkPowerOverload() {
if (lastCurrent < POWER_SAMPLE_MAX) delay = POWER_SAMPLE_ON_WAIT; if (lastCurrent < POWER_SAMPLE_MAX) delay = POWER_SAMPLE_ON_WAIT;
else { else {
setPowerMode(POWERMODE::OVERLOAD); setPowerMode(POWERMODE::OVERLOAD);
DIAG(F("\n*** %s TRACK POWER OVERLOAD current=%d max=%d ***\n"), isMainTrack ? "MAIN" : "PROG", lastCurrent, POWER_SAMPLE_MAX); DIAG(F("\n*** %S TRACK POWER OVERLOAD current=%d max=%d ***\n"), isMainTrack ? F("MAIN") : F("PROG"), lastCurrent, POWER_SAMPLE_MAX);
delay = POWER_SAMPLE_OVERLOAD_WAIT; delay = POWER_SAMPLE_OVERLOAD_WAIT;
} }
break; break;

View File

@ -139,7 +139,7 @@ void Sensor::show(Print & stream){
void Sensor::status(Print & stream){ void Sensor::status(Print & stream){
for(Sensor * tt=firstSensor;tt!=NULL;tt=tt->nextSensor){ for(Sensor * tt=firstSensor;tt!=NULL;tt=tt->nextSensor){
StringFormatter::send(stream,F("<%s %d>"), tt->active?"Q":"q", tt->data.snum); StringFormatter::send(stream,F("<%c %d>"), tt->active?'Q':'q', tt->data.snum);
} }
} }

View File

@ -29,6 +29,7 @@ void StringFormatter::send(Print & stream,const __FlashStringHelper* format, va_
case '%': stream.print('%'); break; case '%': stream.print('%'); break;
case 'c': stream.print((char) va_arg(args, int)); break; case 'c': stream.print((char) va_arg(args, int)); break;
case 's': stream.print(va_arg(args, char*)); break; case 's': stream.print(va_arg(args, char*)); break;
case 'S': stream.print((const __FlashStringHelper*)va_arg(args, char*)); break;
case 'd': stream.print(va_arg(args, int), DEC); break; case 'd': stream.print(va_arg(args, int), DEC); break;
case 'b': stream.print(va_arg(args, int), BIN); break; case 'b': stream.print(va_arg(args, int), BIN); break;
case 'o': stream.print(va_arg(args, int), OCT); break; case 'o': stream.print(va_arg(args, int), OCT); break;

View File

@ -4,8 +4,10 @@
#include "StringFormatter.h" #include "StringFormatter.h"
const char READY_SEARCH[]="\r\nready\r\n"; const char PROGMEM READY_SEARCH[] ="\r\nready\r\n";
const char OK_SEARCH[]="\r\nOK\r\n"; const char PROGMEM OK_SEARCH[] ="\r\nOK\r\n";
const char PROGMEM END_DETAIL_SEARCH[] ="@ 1000";
const char PROGMEM PROMPT_SEARCH[] =">";
bool WifiInterface::connected=false; bool WifiInterface::connected=false;
DCCEXParser WifiInterface::parser; DCCEXParser WifiInterface::parser;
@ -19,7 +21,7 @@ void WifiInterface::setup() {
DIAG(F("\n++++++ Wifi Setup In Progress ++++++++\n")); DIAG(F("\n++++++ Wifi Setup In Progress ++++++++\n"));
connected=setup2(); connected=setup2();
// TODO calloc the buffer and streamer and parser etc // TODO calloc the buffer and streamer and parser etc
DIAG(F("\n++++++ Wifi Setup %s ++++++++\n"), connected?"OK":"FAILED"); DIAG(F("\n++++++ Wifi Setup %S ++++++++\n"), connected?F("OK"):F("FAILED"));
} }
bool WifiInterface::setup2() bool WifiInterface::setup2()
@ -29,38 +31,39 @@ bool WifiInterface::setup2()
delay(1000); delay(1000);
StringFormatter::send(Serial1,F("AT+RST\r\n")); // reset module StringFormatter::send(Serial1,F("AT+RST\r\n")); // reset module
if (!checkForOK(10000,READY_SEARCH)) return false; checkForOK(5000,END_DETAIL_SEARCH,true); // Show startup but ignore unreadable upto ready
if (!checkForOK(5000,READY_SEARCH,false)) return false;
StringFormatter::send(Serial1,F("AT+CWMODE=1\r\n")); // configure as access point StringFormatter::send(Serial1,F("AT+CWMODE=1\r\n")); // configure as access point
if (!checkForOK(10000,OK_SEARCH)) return false; if (!checkForOK(10000,OK_SEARCH,true)) return false;
StringFormatter::send(Serial1,F("AT+CWJAP=\"%s\",\"%s\"\r\n"),WIFI_SSID,WIFI_PASS); StringFormatter::send(Serial1,F("AT+CWJAP=\"%S\",\"%S\"\r\n"),WIFI_SSID,WIFI_PASS);
if (!checkForOK(20000,OK_SEARCH)) return false; if (!checkForOK(20000,OK_SEARCH,true)) return false;
StringFormatter::send(Serial1,F("AT+CIFSR\r\n")); // get ip address //192.168.4.1 StringFormatter::send(Serial1,F("AT+CIFSR\r\n")); // get ip address //192.168.4.1
if (!checkForOK(10000,OK_SEARCH)) return false; if (!checkForOK(10000,OK_SEARCH,true)) return false;
StringFormatter::send(Serial1,F("AT+CIPMUX=1\r\n")); // configure for multiple connections StringFormatter::send(Serial1,F("AT+CIPMUX=1\r\n")); // configure for multiple connections
if (!checkForOK(10000,OK_SEARCH)) return false; if (!checkForOK(10000,OK_SEARCH,true)) return false;
StringFormatter::send(Serial1,F("AT+CIPSERVER=1,%d\r\n"),WIFI_PORT); // turn on server on port 80 StringFormatter::send(Serial1,F("AT+CIPSERVER=1,%d\r\n"),WIFI_PORT); // turn on server on port 80
if (!checkForOK(10000,OK_SEARCH)) return false; if (!checkForOK(10000,OK_SEARCH,true)) return false;
return true; return true;
} }
bool WifiInterface::checkForOK( const int timeout,char * search) { bool WifiInterface::checkForOK( const int timeout, const char * waitfor, bool echo) {
long int time = millis()+timeout; long int time = millis()+timeout;
byte locator=0; char *locator=waitfor;
DIAG(F("\nWifi setup Check:"),search); DIAG(F("\nWifi setup Check: %S\n"),waitfor);
while( time > millis()) { while( time > millis()) {
while(Serial1.available()) { while(Serial1.available()) {
int ch=Serial1.read(); int ch=Serial1.read();
Serial.write(ch); if (echo) Serial.write(ch);
if (ch!=search[locator]) locator=0; if (ch!=pgm_read_byte_near(locator)) locator=waitfor;
if (ch==search[locator]){ if (ch==pgm_read_byte_near(locator)) {
locator++; locator++;
if (!search[locator]) { if (!pgm_read_byte_near(locator)) {
DIAG(F("\nOK after %dms\n"),millis()-time+timeout); DIAG(F("\nOK after %dms\n"),millis()-time+timeout);
return true; return true;
} }
@ -127,7 +130,7 @@ void WifiInterface::loop() {
if (streamer.available()) { // there is a reply to send if (streamer.available()) { // there is a reply to send
StringFormatter::send(Serial1,F("AT+CIPSEND=%d,%d\r\n"),connectionId,streamer.available()); StringFormatter::send(Serial1,F("AT+CIPSEND=%d,%d\r\n"),connectionId,streamer.available());
streamer.write('\0'); streamer.write('\0');
if (checkForOK(1000,">")) Serial1.print((char *) buffer); if (checkForOK(1000,PROMPT_SEARCH,true)) Serial1.print((char *) buffer);
} }
loopstate=0; // go back to looking for +IPD loopstate=0; // go back to looking for +IPD
} }

View File

@ -3,6 +3,8 @@
#define WifiInterface_h #define WifiInterface_h
#include "DCCEXParser.h" #include "DCCEXParser.h"
#include "MemStream.h" #include "MemStream.h"
#include <Arduino.h>
#include <avr/pgmspace.h>
class WifiInterface { class WifiInterface {
@ -13,7 +15,7 @@ class WifiInterface {
private: private:
static DCCEXParser parser; static DCCEXParser parser;
static bool setup2(); static bool setup2();
static bool checkForOK(const int timeout, char * search); static bool checkForOK( const int timeout, const char* waitfor, bool echo);
static bool connected; static bool connected;
static byte loopstate; static byte loopstate;
static int datalength; static int datalength;