Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: EthernetInterfacePlusHostname NTPClient Onewire RdWebServer SDFileSystem-RTOS mbed-rtos mbed-src
GasUseCounter.cpp@22:14b4060dd027, 2015-10-16 (annotated)
- Committer:
- Bobty
- Date:
- Fri Oct 16 08:42:13 2015 +0000
- Revision:
- 22:14b4060dd027
- Parent:
- 20:7933076df5af
Re-enabled web folder view on server
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Bobty | 19:0367cb46d003 | 1 | // Gas usage based on pulses from a gas meter |
| Bobty | 19:0367cb46d003 | 2 | // Rob Dobson 2015 |
| Bobty | 19:0367cb46d003 | 3 | |
| Bobty | 5:5bccf48799d4 | 4 | #include "GasUseCounter.h" |
| Bobty | 5:5bccf48799d4 | 5 | |
| Bobty | 5:5bccf48799d4 | 6 | // Callback from web server to handle getting current gas count |
| Bobty | 5:5bccf48799d4 | 7 | char* GasUseCounter::getGasUseCallback(char* cmdStr, char* argStr) |
| Bobty | 5:5bccf48799d4 | 8 | { |
| Bobty | 5:5bccf48799d4 | 9 | sprintf(_gasCountStr, "{\"gasUseCount\":\"%d\"}", GetCount()); |
| Bobty | 5:5bccf48799d4 | 10 | return _gasCountStr; |
| Bobty | 5:5bccf48799d4 | 11 | } |
| Bobty | 5:5bccf48799d4 | 12 | |
| Bobty | 5:5bccf48799d4 | 13 | // Init |
| Bobty | 5:5bccf48799d4 | 14 | void GasUseCounter::Init() |
| Bobty | 5:5bccf48799d4 | 15 | { |
| Bobty | 5:5bccf48799d4 | 16 | GetGasCountFromSD(); |
| Bobty | 5:5bccf48799d4 | 17 | } |
| Bobty | 5:5bccf48799d4 | 18 | |
| Bobty | 5:5bccf48799d4 | 19 | // Service function |
| Bobty | 5:5bccf48799d4 | 20 | bool GasUseCounter::Service() |
| Bobty | 5:5bccf48799d4 | 21 | { |
| Bobty | 5:5bccf48799d4 | 22 | // Check for an edge |
| Bobty | 5:5bccf48799d4 | 23 | bool edgeDetected = _pulseDetector->Service(); |
| Bobty | 5:5bccf48799d4 | 24 | if (edgeDetected) |
| Bobty | 5:5bccf48799d4 | 25 | { |
| Bobty | 5:5bccf48799d4 | 26 | // Check if we need to store in non-volatile storage |
| Bobty | 5:5bccf48799d4 | 27 | if (GetCount() >= _lastWrittenGasCount + MAX_PULSES_BEFORE_STORE_NV) |
| Bobty | 5:5bccf48799d4 | 28 | { |
| Bobty | 5:5bccf48799d4 | 29 | WriteGasCountToSD(); |
| Bobty | 5:5bccf48799d4 | 30 | _lastWrittenGasCount = GetCount(); |
| Bobty | 5:5bccf48799d4 | 31 | } |
| Bobty | 5:5bccf48799d4 | 32 | |
| Bobty | 5:5bccf48799d4 | 33 | // Show count |
| Bobty | 20:7933076df5af | 34 | _logger.LogDebug("GasCount %d Rate(ms) %d", _pulseDetector->GetPulseCount(), _pulseDetector->GetPulseRateMs()); |
| Bobty | 5:5bccf48799d4 | 35 | } |
| Bobty | 5:5bccf48799d4 | 36 | return edgeDetected; |
| Bobty | 5:5bccf48799d4 | 37 | } |
| Bobty | 5:5bccf48799d4 | 38 | |
| Bobty | 5:5bccf48799d4 | 39 | // Get the current usage count from SD card |
| Bobty | 5:5bccf48799d4 | 40 | void GasUseCounter::GetGasCountFromSD() |
| Bobty | 5:5bccf48799d4 | 41 | { |
| Bobty | 19:0367cb46d003 | 42 | int count0 = 0; |
| Bobty | 19:0367cb46d003 | 43 | int count1 = 0; |
| Bobty | 19:0367cb46d003 | 44 | for (int i = 0; i < 2; i++) |
| Bobty | 5:5bccf48799d4 | 45 | { |
| Bobty | 19:0367cb46d003 | 46 | const char* fname = _gasUseFilename1; |
| Bobty | 19:0367cb46d003 | 47 | if (i == 1) |
| Bobty | 19:0367cb46d003 | 48 | fname = _gasUseFilename2; |
| Bobty | 20:7933076df5af | 49 | |
| Bobty | 20:7933076df5af | 50 | // Obtain lock to access sd card |
| Bobty | 20:7933076df5af | 51 | _sdCardMutex.lock(); |
| Bobty | 20:7933076df5af | 52 | |
| Bobty | 19:0367cb46d003 | 53 | FILE* fp = fopen(fname, "r"); |
| Bobty | 19:0367cb46d003 | 54 | if (fp == NULL) |
| Bobty | 19:0367cb46d003 | 55 | { |
| Bobty | 20:7933076df5af | 56 | // Release lock on sd card |
| Bobty | 20:7933076df5af | 57 | _sdCardMutex.unlock(); |
| Bobty | 20:7933076df5af | 58 | |
| Bobty | 20:7933076df5af | 59 | _logger.LogDebug("GasCount Read Filename %s not found", fname); |
| Bobty | 19:0367cb46d003 | 60 | } |
| Bobty | 5:5bccf48799d4 | 61 | else |
| Bobty | 19:0367cb46d003 | 62 | { |
| Bobty | 19:0367cb46d003 | 63 | int curCount = 0; |
| Bobty | 19:0367cb46d003 | 64 | int retVal = fscanf(fp, "%d", &curCount); |
| Bobty | 19:0367cb46d003 | 65 | fclose(fp); |
| Bobty | 20:7933076df5af | 66 | |
| Bobty | 20:7933076df5af | 67 | // Release lock on sd card |
| Bobty | 20:7933076df5af | 68 | _sdCardMutex.unlock(); |
| Bobty | 20:7933076df5af | 69 | |
| Bobty | 20:7933076df5af | 70 | // Handle result |
| Bobty | 19:0367cb46d003 | 71 | if (retVal == 1) |
| Bobty | 20:7933076df5af | 72 | _logger.LogDebug("GasCount read from file %s gas count = %d", fname, curCount); |
| Bobty | 19:0367cb46d003 | 73 | else |
| Bobty | 20:7933076df5af | 74 | _logger.LogDebug("GasCount Failed to read gas count from file %s", fname); |
| Bobty | 19:0367cb46d003 | 75 | if (i == 0) |
| Bobty | 19:0367cb46d003 | 76 | count0 = curCount; |
| Bobty | 19:0367cb46d003 | 77 | else |
| Bobty | 19:0367cb46d003 | 78 | count1 = curCount; |
| Bobty | 19:0367cb46d003 | 79 | } |
| Bobty | 5:5bccf48799d4 | 80 | } |
| Bobty | 19:0367cb46d003 | 81 | // Find the highest count |
| Bobty | 19:0367cb46d003 | 82 | int maxCount = count0; |
| Bobty | 19:0367cb46d003 | 83 | if (count1 > count0) |
| Bobty | 19:0367cb46d003 | 84 | maxCount = count1; |
| Bobty | 19:0367cb46d003 | 85 | _lastWrittenGasCount = maxCount; |
| Bobty | 19:0367cb46d003 | 86 | _pulseDetector->SetPulseCount(maxCount); |
| Bobty | 20:7933076df5af | 87 | _logger.LogDebug("GasCount set to %d", maxCount); |
| Bobty | 5:5bccf48799d4 | 88 | } |
| Bobty | 5:5bccf48799d4 | 89 | |
| Bobty | 5:5bccf48799d4 | 90 | void GasUseCounter::WriteGasCountToSD() |
| Bobty | 5:5bccf48799d4 | 91 | { |
| Bobty | 19:0367cb46d003 | 92 | for (int i = 0; i < 2; i++) |
| Bobty | 5:5bccf48799d4 | 93 | { |
| Bobty | 19:0367cb46d003 | 94 | const char* fname = _gasUseFilename1; |
| Bobty | 19:0367cb46d003 | 95 | if (i == 1) |
| Bobty | 19:0367cb46d003 | 96 | fname = _gasUseFilename2; |
| Bobty | 20:7933076df5af | 97 | |
| Bobty | 20:7933076df5af | 98 | // Obtain lock to access sd card |
| Bobty | 20:7933076df5af | 99 | _sdCardMutex.lock(); |
| Bobty | 20:7933076df5af | 100 | |
| Bobty | 19:0367cb46d003 | 101 | FILE* fp = fopen(fname, "w"); |
| Bobty | 19:0367cb46d003 | 102 | if (fp == NULL) |
| Bobty | 19:0367cb46d003 | 103 | { |
| Bobty | 20:7933076df5af | 104 | _logger.LogDebug("GasCount write failed filename %s not found", fname); |
| Bobty | 19:0367cb46d003 | 105 | } |
| Bobty | 19:0367cb46d003 | 106 | else |
| Bobty | 19:0367cb46d003 | 107 | { |
| Bobty | 19:0367cb46d003 | 108 | fprintf(fp, "%d", GetCount()); |
| Bobty | 20:7933076df5af | 109 | _logger.LogDebug("GasCount written to %s gas count = %d", fname, GetCount()); |
| Bobty | 19:0367cb46d003 | 110 | fclose(fp); |
| Bobty | 19:0367cb46d003 | 111 | } |
| Bobty | 20:7933076df5af | 112 | |
| Bobty | 20:7933076df5af | 113 | // Release lock on sd card |
| Bobty | 20:7933076df5af | 114 | _sdCardMutex.unlock(); |
| Bobty | 20:7933076df5af | 115 | |
| Bobty | 5:5bccf48799d4 | 116 | } |
| Bobty | 5:5bccf48799d4 | 117 | } |