diff --git a/AppInventor/BluetoothHeaterJSON.aia b/AppInventor/BluetoothHeaterJSON.aia new file mode 100644 index 0000000..3350315 Binary files /dev/null and b/AppInventor/BluetoothHeaterJSON.aia differ diff --git a/Arduino/BTCDieselHeater/BTCDateTime.h b/Arduino/BTCDieselHeater/BTCDateTime.h index dfe767a..f601474 100644 --- a/Arduino/BTCDieselHeater/BTCDateTime.h +++ b/Arduino/BTCDieselHeater/BTCDateTime.h @@ -3,8 +3,9 @@ #include "RTClib.h" +const char daysOfTheWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; + class BTCDateTime : public DateTime { - const char daysOfTheWeek[7][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}; const char months[12][4] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; const char monthDays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; public: diff --git a/Arduino/BTCDieselHeater/BTCDieselHeater.ino b/Arduino/BTCDieselHeater/BTCDieselHeater.ino index d5552ef..a2a5017 100644 --- a/Arduino/BTCDieselHeater/BTCDieselHeater.ino +++ b/Arduino/BTCDieselHeater/BTCDieselHeater.ino @@ -133,6 +133,7 @@ void initBlueWireSerial(); bool validateFrame(const CProtocol& frame, const char* name); void checkDisplayUpdate(); void checkDebugCommands(); +void updateJsonBT(); // DS18B20 temperature sensor support OneWire ds(DS18B20_Pin); // on pin 5 (a 4.7K resistor is necessary) @@ -153,7 +154,7 @@ CSmartError SmartError; CKeyPad KeyPad; CScreenManager ScreenManager; TelnetSpy DebugPort; - +CModerator BTModerator; sRxLine PCline; long lastRxTime; // used to observe inter character delays @@ -164,6 +165,7 @@ CProtocolPackage HeaterData; unsigned long moderator; bool bUpdateDisplay = false; bool bHaveWebClient = false; +bool bBTconnected = false; //////////////////////////////////////////////////////////////////////////////////////////////////////// // Bluetooth instantiation @@ -290,6 +292,7 @@ void setup() { DefaultBTCParams.setFan_Min(1680); DefaultBTCParams.setFan_Max(4500); + bBTconnected = false; Bluetooth.begin(); } @@ -326,6 +329,16 @@ void loop() Bluetooth.check(); // check for Bluetooth activity + if(Bluetooth.isConnected()) { + if(!bBTconnected) { + bBTconnected = true; + BTModerator.reset(); + } + } + else { + bBTconnected = false; + } + ////////////////////////////////////////////////////////////////////////////////////// // Blue wire data reception @@ -541,7 +554,7 @@ void loop() if(!hasOEMController) { // only convey this frames to Bluetooth when NOT using an OEM controller! // Bluetooth.sendFrame("[BTC]", TxManage.getFrame(), TERMINATE_BTC_LINE); // BTC => Bluetooth Controller :-) - Bluetooth.send( createJSON("RunState", int(0) ) ); +// Bluetooth.send( createJSON("RunState", 1.50 ) ); } CommState.set(CommStates::HeaterRx2); // then await heater repsonse } @@ -619,6 +632,7 @@ void loop() ScreenManager.reqUpdate(); } CommState.set(CommStates::Idle); + updateJsonBT(); break; } // switch(CommState) @@ -638,82 +652,6 @@ void DebugReportFrame(const char* hdr, const CProtocol& Frame, const char* ftr) } -void interpretCommand(const char* pLine) -{ - unsigned char cVal; - unsigned short sVal; - float fVal; - - if(strlen(pLine) == 0) - return; - - #ifdef DEBUG_BTRX - DebugPort.println(pLine); - #endif - - if(strncmp(pLine, "[CMD]", 5) == 0) { - // incoming command from BT app! - DebugPort.write(" Command decode: "); - - pLine += 5; // skip past "[CMD]" header - if(strncmp(pLine, "ON", 2) == 0) { - TxManage.queueOnRequest(); - DebugPort.println("Heater ON"); - SmartError.reset(); - Bluetooth.setRefTime(); - } - else if(strncmp(pLine, "OFF", 3) == 0) { - TxManage.queueOffRequest(); - DebugPort.println("Heater OFF"); - SmartError.inhibit(); - Bluetooth.setRefTime(); - } - else if(strncmp(pLine, "Pmin", 4) == 0) { - pLine += 4; - fVal = atof(pLine); - NVstore.setPmin(fVal); - DebugPort.print("Pump min = "); DebugPort.println(fVal); - } - else if(strncmp(pLine, "Pmax", 4) == 0) { - pLine += 4; - fVal = atof(pLine); - NVstore.setPmax(fVal); - DebugPort.print("Pump max = "); DebugPort.println(fVal); - } - else if(strncmp(pLine, "Fmin", 4) == 0) { - pLine += 4; - sVal = atoi(pLine); - NVstore.setFmin(sVal); - DebugPort.print("Fan min = "); DebugPort.println(sVal); - } - else if(strncmp(pLine, "Fmax", 4) == 0) { - pLine += 4; - sVal = atoi(pLine); - NVstore.setFmax(sVal); - DebugPort.print("Fan max = "); DebugPort.println(int(sVal)); - } - else if(strncmp(pLine, "save", 4) == 0) { - NVstore.save(); - DebugPort.println("NV save"); - } - else if(strncmp(pLine, "degC", 4) == 0) { - pLine += 4; - cVal = atoi(pLine); - NVstore.setTemperature(cVal); - DebugPort.print("degC = "); DebugPort.println(cVal); - } - else if(strncmp(pLine, "Mode", 4) == 0) { - pLine += 4; - cVal = !NVstore.getThermostatMode(); - NVstore.setThermostatMode(cVal); - DebugPort.print("Mode now "); DebugPort.println(cVal ? "Thermostat" : "Fixed Hz"); - } - else { - DebugPort.print(pLine); DebugPort.println(" ????"); - } - - } -} void initBlueWireSerial() { @@ -785,7 +723,7 @@ void reqTemp(unsigned char newTemp) if(newTemp <= min) newTemp = min; - NVstore.setTemperature(newTemp); + NVstore.setDesiredTemperature(newTemp); ScreenManager.reqUpdate(); } @@ -799,7 +737,7 @@ void reqTempDelta(int delta) int getSetTemp() { - return NVstore.getTemperature(); + return NVstore.getDesiredTemperature(); } void reqThermoToggle() @@ -946,3 +884,18 @@ void checkDebugCommands() } } } + +void updateJsonBT() +{ + char jsonStr[512]; + + if(makeJsonString(BTModerator, jsonStr, 512)) { + Bluetooth.send( jsonStr ); + } +} + + +void resetBTModerator() +{ + BTModerator.reset(); +} diff --git a/Arduino/BTCDieselHeater/BTCWebServer.cpp b/Arduino/BTCDieselHeater/BTCWebServer.cpp index c1e482b..bc33a32 100644 --- a/Arduino/BTCDieselHeater/BTCWebServer.cpp +++ b/Arduino/BTCDieselHeater/BTCWebServer.cpp @@ -36,7 +36,7 @@ WebSocketsServer webSocket = WebSocketsServer(81); bool bRxWebData = false; // flags for OLED animation bool bTxWebData = false; -CModerator Moderator; // check for settings that are not actually changing, avoid sending these +CModerator WebModerator; // check for settings that are not actually changing, avoid sending these const int led = 13; @@ -89,7 +89,7 @@ bool doWebServer(void) { int numClients = webSocket.connectedClients(); if(numClients != prevNumClients) { prevNumClients = numClients; - Moderator.reset(); // force full update of params if number of clients change + WebModerator.reset(); // force full update of params if number of clients change DebugPort.println("Changed number of web clients, resetting history"); } @@ -103,10 +103,10 @@ bool doWebServer(void) { bool bSend = false; // reset should send flag float tidyTemp = int(getActualTemperature() * 10) * 0.1f; // round to 0.1 resolution - bSend |= Moderator.send("CurrentTemp", tidyTemp, root); - bSend |= Moderator.send("DesiredTemp", getHeaterInfo().getTemperature_Desired(), root); - bSend |= Moderator.send("RunState", getHeaterInfo().getRunState(), root); - bSend |= Moderator.send("ErrorState", getHeaterInfo().getErrState(), root ); + bSend |= WebModerator.addJson("CurrentTemp", tidyTemp, root); + bSend |= WebModerator.addJson("DesiredTemp", getHeaterInfo().getTemperature_Desired(), root); + bSend |= WebModerator.addJson("RunState", getHeaterInfo().getRunState(), root); + bSend |= WebModerator.addJson("ErrorState", getHeaterInfo().getErrState(), root ); if(bSend) { @@ -129,7 +129,6 @@ void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length for (int i = 0; i < length && i < 256; i++) { cmd[i] = payload[i]; } -// DebugPort.println(cmd); interpretJsonCommand(cmd); // send to the main heater controller decode routine } } @@ -150,4 +149,7 @@ bool hasWebServerSpoken(bool reset) return retval; } - +void resetWebModerator() +{ + WebModerator.reset(); +} diff --git a/Arduino/BTCDieselHeater/BTC_JSON.cpp b/Arduino/BTCDieselHeater/BTC_JSON.cpp index 331c832..61cf372 100644 --- a/Arduino/BTCDieselHeater/BTC_JSON.cpp +++ b/Arduino/BTCDieselHeater/BTC_JSON.cpp @@ -19,14 +19,20 @@ * */ -#include #include "BTC_JSON.h" #include "DebugPort.h" #include "helpers.h" +#include "NVstorage.h" +#include "BTCDateTime.h" char defaultJSONstr[64]; +void decodeTimerDays(int timerID, const char* str); +void decodeTimerTime(int ID, int stop, const char*); +void decodeTimerRepeat(int ID, int state); + + void interpretJsonCommand(char* pLine) { if(strlen(pLine) == 0) @@ -71,41 +77,132 @@ void interpretJsonCommand(char* pLine) else if(strcmp("Thermostat", it->key) == 0) { setThermostatMode(it->value.as()); } + else if(strcmp("NVsave", it->key) == 0) { + if(it->value.as() == 8861) + saveNV(); + } + else if(strcmp("DateTime", it->key) == 0) { + setDateTime(it->value.as()); + } + else if(strcmp("Date", it->key) == 0) { + setDate(it->value.as()); + } + else if(strcmp("Time", it->key) == 0) { + setTime(it->value.as()); + } + else if(strcmp("PumpPrime", it->key) == 0) { + reqPumpPrime(it->value.as()); + } + else if(strcmp("Refresh", it->key) == 0) { + resetWebModerator(); + resetBTModerator(); + } + else if(strcmp("Timer1Days", it->key) == 0) { + decodeTimerDays(0, it->value.as()); + } + else if(strcmp("Timer1Start", it->key) == 0) { + decodeTimerTime(0, 0, it->value.as()); + } + else if(strcmp("Timer1Stop", it->key) == 0) { + decodeTimerTime(0, 1, it->value.as()); + } + else if(strcmp("Timer1Repeat", it->key) == 0) { + decodeTimerRepeat(0, it->value.as()); + } + else if(strcmp("Timer2Days", it->key) == 0) { + decodeTimerDays(1, it->value.as()); + } + else if(strcmp("Timer2Start", it->key) == 0) { + decodeTimerTime(1, 0, it->value.as()); + } + else if(strcmp("Timer2Stop", it->key) == 0) { + decodeTimerTime(1, 1, it->value.as()); + } + else if(strcmp("Timer2Repeat", it->key) == 0) { + decodeTimerRepeat(1, it->value.as()); + } } } -const char* createJSON(const char* name, float value, char* jsonToSend) + + +bool makeJsonString(CModerator& moderator, char* opStr, int len) { - StaticJsonBuffer<64> jsonBuffer; - JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to + StaticJsonBuffer<512> jsonBuffer; // create a JSON buffer on the stack + JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to - root.set(name, value); - root.printTo(defaultJSONstr); - strcat(defaultJSONstr, "\n"); + bool bSend = false; // reset should send flag - return defaultJSONstr; + float tidyTemp = int(getActualTemperature() * 10) * 0.1f; // round to 0.1 resolution + bSend |= moderator.addJson("TempCurrent", tidyTemp, root); + bSend |= moderator.addJson("TempDesired", getHeaterInfo().getTemperature_Desired(), root); + bSend |= moderator.addJson("TempMin", getHeaterInfo().getTemperature_Min(), root); + bSend |= moderator.addJson("TempMax", getHeaterInfo().getTemperature_Max(), root); + bSend |= moderator.addJson("TempBody", getHeaterInfo().getTemperature_HeatExchg(), root); + bSend |= moderator.addJson("RunState", getHeaterInfo().getRunState(), root); + bSend |= moderator.addJson("ErrorState", getHeaterInfo().getErrState(), root ); + bSend |= moderator.addJson("Thermostat", getHeaterInfo().isThermostat(), root ); + bSend |= moderator.addJson("PumpFixed", getHeaterInfo().getPump_Fixed(), root ); + bSend |= moderator.addJson("PumpMin", getHeaterInfo().getPump_Min(), root ); + bSend |= moderator.addJson("PumpMax", getHeaterInfo().getPump_Max(), root ); + bSend |= moderator.addJson("PumpActual", getHeaterInfo().getPump_Actual(), root ); + bSend |= moderator.addJson("FanMin", getHeaterInfo().getFan_Min(), root ); + bSend |= moderator.addJson("FanMax", getHeaterInfo().getFan_Max(), root ); + bSend |= moderator.addJson("FanRPM", getHeaterInfo().getFan_Actual(), root ); + bSend |= moderator.addJson("FanVoltage", getHeaterInfo().getFan_Voltage(), root ); + bSend |= moderator.addJson("SystemVoltage", getHeaterInfo().getBattVoltage(), root ); + bSend |= moderator.addJson("GlowVoltage", getHeaterInfo().getGlow_Voltage(), root ); + bSend |= moderator.addJson("GlowCurrent", getHeaterInfo().getGlow_Current(), root ); + + if(bSend) { + root.printTo(opStr, len); + } + + return bSend; } -const char* createJSON(const char* name, unsigned char value, char*jsonToSend) + +void decodeTimerDays(int ID, const char* str) { - StaticJsonBuffer<64> jsonBuffer; - JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to - - root.set(name, value); - root.printTo(defaultJSONstr); - strcat(defaultJSONstr, "\n"); - - return defaultJSONstr; + sTimer timer; + NVstore.getTimerInfo(ID, timer); + unsigned char days = 0; + if(strstr(str, "Next")) { + days = 0x80; + } + else { + for(int i=0; i< 7; i++) { + int mask = 0x01 << i; + if(strstr(str, daysOfTheWeek[i])) + days |= mask; + } + } + timer.enabled = days; + NVstore.setTimerInfo(ID, timer); } -const char* createJSON(const char* name, int value, char* jsonToSend) +void decodeTimerTime(int ID, int stop, const char* str) { - StaticJsonBuffer<64> jsonBuffer; - JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to - - root.set(name, value); - root.printTo(defaultJSONstr); - strcat(defaultJSONstr, "\n"); - - return defaultJSONstr; + sTimer timer; + NVstore.getTimerInfo(ID, timer); + int hour, minute; + if(2 == sscanf(str, "%d:%d", &hour, &minute)) { + if(stop) { + timer.stop.hour = hour; + timer.stop.min = minute; + } + else { + timer.start.hour = hour; + timer.start.min = minute; + } + NVstore.setTimerInfo(ID, timer); + } } + +void decodeTimerRepeat(int ID, int state) +{ + sTimer timer; + NVstore.getTimerInfo(ID, timer); + timer.repeat = state; + NVstore.setTimerInfo(ID, timer); +} \ No newline at end of file diff --git a/Arduino/BTCDieselHeater/BTC_JSON.h b/Arduino/BTCDieselHeater/BTC_JSON.h index 5a57592..967dc28 100644 --- a/Arduino/BTCDieselHeater/BTC_JSON.h +++ b/Arduino/BTCDieselHeater/BTC_JSON.h @@ -22,10 +22,24 @@ #ifndef __BTC_JSON_H__ #define __BTC_JSON_H__ -extern char defaultJSONstr[]; +#include +#include "Moderator.h" + +extern char defaultJSONstr[64]; + +bool makeJsonString(CModerator& moderator, char* opStr, int len); + +template +const char* createJSON(const char* name, T value) +{ + StaticJsonBuffer<64> jsonBuffer; + JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to + + root.set(name, value); + root.printTo(defaultJSONstr); + + return defaultJSONstr; +} -const char* createJSON(const char* name, float value, char* jsonToSend = defaultJSONstr); -const char* createJSON(const char* name, unsigned char value, char* jsonToSend = defaultJSONstr); -const char* createJSON(const char* name, int value, char* jsonToSend = defaultJSONstr); #endif diff --git a/Arduino/BTCDieselHeater/BluetoothAbstract.h b/Arduino/BTCDieselHeater/BluetoothAbstract.h index e8984b7..e58f1b3 100644 --- a/Arduino/BTCDieselHeater/BluetoothAbstract.h +++ b/Arduino/BTCDieselHeater/BluetoothAbstract.h @@ -33,6 +33,7 @@ class CBluetoothAbstract { protected: sRxLine _rxLine; CContextTimeStamp _timeStamp; + virtual void foldbackDesiredTemp() {}; public: virtual void begin() {}; virtual void setRefTime() { @@ -46,13 +47,11 @@ public: virtual void check() {}; virtual void collectRxData(char rxVal) { // provide common behviour for bytes received from a bluetooth client - if(isControl(rxVal)) { // "End of Line" - interpretCommand(_rxLine.Line); + _rxLine.append(rxVal); // append new char to our Rx buffer + if(rxVal == '}') { // "End of JSON Line" interpretJsonCommand(_rxLine.Line); _rxLine.clear(); - } - else { - _rxLine.append(rxVal); // append new char to our Rx buffer + foldbackDesiredTemp(); // rapid foldback if desired temp changes } }; virtual bool isConnected() { return false; }; diff --git a/Arduino/BTCDieselHeater/BluetoothHC05.cpp b/Arduino/BTCDieselHeater/BluetoothHC05.cpp index 2e68b44..6cb7f5e 100644 --- a/Arduino/BTCDieselHeater/BluetoothHC05.cpp +++ b/Arduino/BTCDieselHeater/BluetoothHC05.cpp @@ -24,6 +24,7 @@ #include "debugport.h" #include "BluetoothHC05.h" #include "BTCConfig.h" +#include "helpers.h" // Bluetooth access via HC-05 Module, using a UART @@ -150,6 +151,7 @@ CBluetoothHC05::isConnected() void CBluetoothHC05::send(const char* Str) { + DebugPort.print("BT send: "); DebugPort.println(Str); HC05_SerialPort.print(Str); } @@ -207,3 +209,16 @@ CBluetoothHC05::ATCommand(const char* cmd) return false; } +void +CBluetoothHC05::foldbackDesiredTemp() +{ + StaticJsonBuffer<32> jsonBuffer; // create a JSON buffer on the stack + JsonObject& root = jsonBuffer.createObject(); // create object to add JSON commands to + + if(foldbackModerator.addJson("TempDesired", getSetTemp(), root)) { + char opStr[32]; + root.printTo(opStr); + send(opStr); + } +} + diff --git a/Arduino/BTCDieselHeater/BluetoothHC05.h b/Arduino/BTCDieselHeater/BluetoothHC05.h index 255f107..9900cb1 100644 --- a/Arduino/BTCDieselHeater/BluetoothHC05.h +++ b/Arduino/BTCDieselHeater/BluetoothHC05.h @@ -21,6 +21,7 @@ #include "BluetoothAbstract.h" +#include "Moderator.h" // Define the serial port for access to a HC-05 module. // This is generally Serial2, but different platforms use @@ -38,6 +39,7 @@ static HardwareSerial& HC05_SerialPort(Serial2); class CBluetoothHC05 : public CBluetoothAbstract { bool ATCommand(const char* str); int _sensePin, _keyPin; + CModerator foldbackModerator; public: CBluetoothHC05(int keyPin, int sensePin); void begin(); @@ -47,4 +49,5 @@ public: virtual bool isConnected(); protected: virtual void openSerial(int baudrate); + virtual void foldbackDesiredTemp(); }; \ No newline at end of file diff --git a/Arduino/BTCDieselHeater/Clock.cpp b/Arduino/BTCDieselHeater/Clock.cpp index 9c8a2c4..e6a4c4a 100644 --- a/Arduino/BTCDieselHeater/Clock.cpp +++ b/Arduino/BTCDieselHeater/Clock.cpp @@ -121,3 +121,35 @@ CClock::_checkTimer(int timer, const DateTime& now) } } } + +void setDateTime(const char* newTime) +{ + DebugPort.print("setting time to: "); DebugPort.println(newTime); + int month,day,year,hour,minute,second; + if(6 == sscanf(newTime, "%d/%d/%d %d:%d:%d", &day, &month, &year, &hour, &minute, &second)) { + DateTime newDateTime(year, month, day, hour, minute, second); + Clock.set(newDateTime); + } +} + +void setDate(const char* newDate) +{ + DebugPort.print("setting date to: "); DebugPort.println(newDate); + int month,day,year; + if(3 == sscanf(newDate, "%d/%d/%d", &day, &month, &year)) { + DateTime currentDateTime = Clock.get(); + DateTime newDateTime(year, month, day, currentDateTime.hour(), currentDateTime.minute(), currentDateTime.second()); + Clock.set(newDateTime); + } +} + +void setTime(const char* newTime) +{ + DebugPort.print("setting time to: "); DebugPort.println(newTime); + int hour,minute,second; + if(3 == sscanf(newTime, "%d:%d:%d", &hour, &minute, &second)) { + DateTime currentDateTime = Clock.get(); + DateTime newDateTime(currentDateTime.year(), currentDateTime.month(), currentDateTime.day(), hour, minute, second); + Clock.set(newDateTime); + } +} \ No newline at end of file diff --git a/Arduino/BTCDieselHeater/Moderator.h b/Arduino/BTCDieselHeater/Moderator.h index 32ffe77..a04f6fe 100644 --- a/Arduino/BTCDieselHeater/Moderator.h +++ b/Arduino/BTCDieselHeater/Moderator.h @@ -30,7 +30,7 @@ class TModerator { std::map Memory; public: bool shouldSend(const char* name, T value); - bool send(const char* name, T value, JsonObject& root); + bool addJson(const char* name, T value, JsonObject& root); void reset(); }; @@ -50,7 +50,7 @@ bool TModerator::shouldSend(const char* name, T value) } template -bool TModerator::send(const char* name, T value, JsonObject& root) +bool TModerator::addJson(const char* name, T value, JsonObject& root) { bool retval; if( retval = shouldSend(name, value ) ) @@ -58,6 +58,7 @@ bool TModerator::send(const char* name, T value, JsonObject& root) return retval; } + template void TModerator::reset() { @@ -66,20 +67,28 @@ void TModerator::reset() } } - class CModerator { TModerator iModerator; TModerator fModerator; TModerator ucModerator; public: - bool send(const char* name, int value, JsonObject& root) { - return iModerator.send(name, value, root); + bool shouldSend(const char* name, int value) { + return iModerator.shouldSend(name, value); }; - bool send(const char* name, float value, JsonObject& root) { - return fModerator.send(name, value, root); + bool shouldSend(const char* name, float value) { + return fModerator.shouldSend(name, value); }; - bool send(const char* name, unsigned char value, JsonObject& root) { - return ucModerator.send(name, value, root); + bool shouldSend(const char* name, unsigned char value) { + return ucModerator.shouldSend(name, value); + }; + bool addJson(const char* name, int value, JsonObject& root) { + return iModerator.addJson(name, value, root); + }; + bool addJson(const char* name, float value, JsonObject& root) { + return fModerator.addJson(name, value, root); + }; + bool addJson(const char* name, unsigned char value, JsonObject& root) { + return ucModerator.addJson(name, value, root); }; void reset() { iModerator.reset(); diff --git a/Arduino/BTCDieselHeater/NVStorage.cpp b/Arduino/BTCDieselHeater/NVStorage.cpp index bc11bf1..904db43 100644 --- a/Arduino/BTCDieselHeater/NVStorage.cpp +++ b/Arduino/BTCDieselHeater/NVStorage.cpp @@ -97,7 +97,7 @@ CHeaterStorage::getFmax() } unsigned char -CHeaterStorage::getTemperature() +CHeaterStorage::getDesiredTemperature() { return _calValues.Heater.setTemperature; } @@ -135,7 +135,7 @@ CHeaterStorage::setFmax(unsigned short val) } void -CHeaterStorage::setTemperature(unsigned char val) +CHeaterStorage::setDesiredTemperature(unsigned char val) { _calValues.Heater.setTemperature = val; } diff --git a/Arduino/BTCDieselHeater/NVStorage.h b/Arduino/BTCDieselHeater/NVStorage.h index 6b72ff1..be9be09 100644 --- a/Arduino/BTCDieselHeater/NVStorage.h +++ b/Arduino/BTCDieselHeater/NVStorage.h @@ -98,14 +98,14 @@ public: float getPmax(); unsigned short getFmin(); unsigned short getFmax(); - unsigned char getTemperature(); + unsigned char getDesiredTemperature(); unsigned char getThermostatMode(); void setPmin(float); void setPmax(float); void setFmin(unsigned short val); void setFmax(unsigned short val); - void setTemperature(unsigned char val); + void setDesiredTemperature(unsigned char val); void setThermostatMode(unsigned char val); void getTimerInfo(int idx, sTimer& timerInfo); diff --git a/Arduino/BTCDieselHeater/Protocol.cpp b/Arduino/BTCDieselHeater/Protocol.cpp index 57dabec..8a1db63 100644 --- a/Arduino/BTCDieselHeater/Protocol.cpp +++ b/Arduino/BTCDieselHeater/Protocol.cpp @@ -200,28 +200,33 @@ CProtocol::setTemperature_HeatExchg(short degC) // temperature of heat exchanger Heater.HeatExchgTemp_LSB = (degC >> 0) & 0xff; } -short -CProtocol::getFan_Voltage() const // temperature near inlet +float +CProtocol::getFan_Voltage() const // fan voltage { - short retval; - retval = Heater.FanVoltage_MSB; - retval <<= 8; - retval |= Heater.FanVoltage_LSB; - return retval; + if(getRunState()) { // fan volatge sensing goes stupid when main heater relay turns off! + short val; + val = Heater.FanVoltage_MSB; + val <<= 8; + val |= Heater.FanVoltage_LSB; + return float(val) * 0.1; + } + return 0; } void -CProtocol::setFan_Voltage(short voltsx10) // temperature near inlet +CProtocol::setFan_Voltage(float volts) // fan voltage { - Heater.FanVoltage_MSB = (voltsx10 >> 8) & 0xff; - Heater.FanVoltage_LSB = (voltsx10 >> 0) & 0xff; + short val = short(volts * 10); + Heater.FanVoltage_MSB = (val >> 8) & 0xff; + Heater.FanVoltage_LSB = (val >> 0) & 0xff; } void -CProtocol::setVoltage_Supply(short voltsx10) +CProtocol::setVoltage_Supply(float volts) { - Heater.SupplyV_MSB = (voltsx10 >> 8) & 0xff; - Heater.SupplyV_LSB = (voltsx10 >> 0) & 0xff; + short val = short(volts * 10); + Heater.SupplyV_MSB = (val >> 8) & 0xff; + Heater.SupplyV_LSB = (val >> 0) & 0xff; } float diff --git a/Arduino/BTCDieselHeater/Protocol.h b/Arduino/BTCDieselHeater/Protocol.h index 92a695a..a4faa16 100644 --- a/Arduino/BTCDieselHeater/Protocol.h +++ b/Arduino/BTCDieselHeater/Protocol.h @@ -149,7 +149,7 @@ public: // float getVoltage_Supply() const; float getVoltage_SupplyRaw() const; - void setVoltage_Supply(short voltsx10); + void setVoltage_Supply(float volts); // fan set/get short getFan_Actual() const; // Heater side, actual @@ -158,8 +158,8 @@ public: void setFan_Actual(short speed); // Heater side, actual void setFan_Min(short speed); // Controller side, define min fan speed void setFan_Max(short speed); // Controller side, define max fan speed - short getFan_Voltage() const; // fan voltage - void setFan_Voltage(short voltsx10); // fan voltage + float getFan_Voltage() const; // fan voltage + void setFan_Voltage(float volts); // fan voltage // pump set/get void setPump_Min(float Freq) { Controller.MinPumpFreq = (uint8_t)(Freq * 10.f + 0.5f); }; @@ -217,6 +217,8 @@ public: bool isThermostat() const { return Controller.isThermostat(); }; float getTemperature_Desired() const { return float(Controller.getTemperature_Desired()); }; float getTemperature_HeatExchg() const { return float(Heater.getTemperature_HeatExchg()); }; + float getTemperature_Min() const { return float(Controller.getTemperature_Min()); }; + float getTemperature_Max() const { return float(Controller.getTemperature_Max()); }; float getPump_Fixed() const { return Heater.getPump_Fixed(); }; float getPump_Actual() const { return Heater.getPump_Actual(); }; float getPump_Min() const { return Controller.getPump_Min(); }; @@ -224,7 +226,10 @@ public: float getFan_Actual() const { return Heater.getFan_Actual(); }; short getFan_Min() const { return Controller.getFan_Min(); }; short getFan_Max() const { return Controller.getFan_Max(); }; + float getFan_Voltage() const { return Heater.getFan_Voltage(); }; float getGlowPlug_Power() const { return Heater.getGlowPlug_Current() * Heater.getGlowPlug_Voltage(); }; + float getGlow_Voltage() const { return Heater.getGlowPlug_Voltage(); }; + float getGlow_Current() const { return Heater.getGlowPlug_Current(); }; }; diff --git a/Arduino/BTCDieselHeater/Screen7.cpp b/Arduino/BTCDieselHeater/Screen7.cpp index e26c17b..bf64279 100644 --- a/Arduino/BTCDieselHeater/Screen7.cpp +++ b/Arduino/BTCDieselHeater/Screen7.cpp @@ -22,9 +22,9 @@ /////////////////////////////////////////////////////////////////////////// // -// CScreen5 +// CScreen7 // -// This screen allows the fuel mixture endpoints to be adjusted +// This screen allows the timers to be adjusted // /////////////////////////////////////////////////////////////////////////// @@ -58,6 +58,9 @@ CScreen7::show() char str[16]; int xPos, yPos; + if(_rowSel == 0) { + NVstore.getTimerInfo(_instance, _timer); + } sprintf(str, " Timer %d ", _instance + 1); _printInverted(0, 16, str, true); diff --git a/Arduino/BTCDieselHeater/TxManage.cpp b/Arduino/BTCDieselHeater/TxManage.cpp index 42124b7..7ddfd6d 100644 --- a/Arduino/BTCDieselHeater/TxManage.cpp +++ b/Arduino/BTCDieselHeater/TxManage.cpp @@ -118,7 +118,7 @@ CTxManage::PrepareFrame(const CProtocol& basisFrame, bool isBTCmaster) m_TxFrame.setPump_Min(NVstore.getPmin()); m_TxFrame.setPump_Max(NVstore.getPmax()); m_TxFrame.setThermostatMode(NVstore.getThermostatMode()); - m_TxFrame.setTemperature_Desired(NVstore.getTemperature()); + m_TxFrame.setTemperature_Desired(NVstore.getDesiredTemperature()); } else { m_TxFrame.setPassiveMode(); // this prevents the tuning parameters being saved by heater diff --git a/Arduino/BTCDieselHeater/helpers.h b/Arduino/BTCDieselHeater/helpers.h index d5474b4..27358aa 100644 --- a/Arduino/BTCDieselHeater/helpers.h +++ b/Arduino/BTCDieselHeater/helpers.h @@ -20,26 +20,31 @@ * */ -class CProtocolPackage; +#include "Protocol.h" -extern void ToggleOnOff(); -extern void requestOn(); -extern void requestOff(); -extern void reqTempDelta(int delta); -extern void reqTemp(unsigned char newTemp); -extern void reqThermoToggle(); -extern void setThermostatMode(unsigned char); -extern void reqPumpPrime(bool on); +extern void ToggleOnOff(); +extern void requestOn(); +extern void requestOff(); +extern void reqTempDelta(int delta); +extern void reqTemp(unsigned char newTemp); +extern void reqThermoToggle(); +extern void setThermostatMode(unsigned char); +extern void reqPumpPrime(bool on); extern float getActualTemperature(); +extern int getSetTemp(); extern void setPumpMin(float); extern void setPumpMax(float); extern void setFanMin(short); extern void setFanMax(short); +extern void setDateTime(const char* newTime); +extern void setDate(const char* newTime); +extern void setTime(const char* newTime); extern void saveNV(); extern const CProtocolPackage& getHeaterInfo(); -extern void interpretCommand(const char* pLine); extern void interpretJsonCommand(char* pLine); +extern void resetWebModerator(); +extern void resetBTModerator(); #define LOWERLIMIT(A, B) if(A < B) A = B #define UPPERLIMIT(A, B) if(A > B) A = B