Monitor for central heating system (e.g. 2zones+hw) Supports up to 15 temp probes (DS18B20/DS18S20) 3 valve monitors Gas pulse meter recording Use stand-alone or with nodeEnergyServer See http://robdobson.com/2015/09/central-heating-monitor
Dependencies: EthernetInterfacePlusHostname NTPClient Onewire RdWebServer SDFileSystem-RTOS mbed-rtos mbed-src
Diff: GasUseCounter.cpp
- Revision:
- 5:5bccf48799d4
- Child:
- 19:0367cb46d003
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/GasUseCounter.cpp Tue Feb 17 21:33:39 2015 +0000 @@ -0,0 +1,71 @@ +#include "GasUseCounter.h" + +// Callback from web server to handle getting current gas count +char* GasUseCounter::getGasUseCallback(char* cmdStr, char* argStr) +{ + sprintf(_gasCountStr, "{\"gasUseCount\":\"%d\"}", GetCount()); + return _gasCountStr; +} + +// Init +void GasUseCounter::Init() +{ + GetGasCountFromSD(); +} + +// Service function +bool GasUseCounter::Service() +{ + // Check for an edge + bool edgeDetected = _pulseDetector->Service(); + if (edgeDetected) + { + // Check if we need to store in non-volatile storage + if (GetCount() >= _lastWrittenGasCount + MAX_PULSES_BEFORE_STORE_NV) + { + WriteGasCountToSD(); + _lastWrittenGasCount = GetCount(); + } + + // Show count + _pc.printf("Count %d Rate(ms) %d\r\n", _pulseDetector->GetPulseCount(), _pulseDetector->GetPulseRateMs()); + } + return edgeDetected; +} + +// Get the current usage count from SD card +void GasUseCounter::GetGasCountFromSD() +{ + FILE* fp = fopen(_gasUseFilename, "r"); + if (fp == NULL) + { + _pc.printf ("Read Gas ... Filename %s not found\r\n", _gasUseFilename); + } + else + { + int curCount = 0; + int retVal = fscanf(fp, "%d", &curCount); + fclose(fp); + if (retVal == 1) + _pc.printf ("Read from SD last gas count = %d\r\n", curCount); + else + _pc.printf ("Failed to read gas count from SD card\r\n"); + _lastWrittenGasCount = curCount; + _pulseDetector->SetPulseCount(curCount); + } +} + +void GasUseCounter::WriteGasCountToSD() +{ + FILE* fp = fopen(_gasUseFilename, "w"); + if (fp == NULL) + { + _pc.printf ("WriteGas ... Filename %s not found\r\n", _gasUseFilename); + } + else + { + fprintf(fp, "%d", GetCount()); + _pc.printf ("Written to SD last gas count = %d\r\n", GetCount()); + fclose(fp); + } +}