This library allows to parse and work with data sent by the Paradigma pelletti oven.
ParadigmaData.cpp@2:27334bd6dc28, 2013-06-27 (annotated)
- Committer:
- leihen
- Date:
- Thu Jun 27 00:29:33 2013 +0000
- Revision:
- 2:27334bd6dc28
- Parent:
- 1:9c48326ad8c9
Logger working locally
;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
leihen | 1:9c48326ad8c9 | 1 | #include "mbed.h" |
leihen | 0:4873b21e0bca | 2 | #include "ParadigmaData.h" |
leihen | 1:9c48326ad8c9 | 3 | #ifndef DEBUG |
leihen | 0:4873b21e0bca | 4 | #define DEBUG |
leihen | 1:9c48326ad8c9 | 5 | #endif |
leihen | 0:4873b21e0bca | 6 | #include "debug.h" |
leihen | 0:4873b21e0bca | 7 | |
leihen | 1:9c48326ad8c9 | 8 | using namespace Paradigma; |
leihen | 1:9c48326ad8c9 | 9 | static char m_Buffer[50]; |
leihen | 0:4873b21e0bca | 10 | |
leihen | 0:4873b21e0bca | 11 | ParadigmaMonitorData& ParadigmaMonitorData::operator<<(char c) |
leihen | 0:4873b21e0bca | 12 | { |
leihen | 0:4873b21e0bca | 13 | int nLen = 0; |
leihen | 0:4873b21e0bca | 14 | if (m_activeDataBlock != Invalid) { |
leihen | 0:4873b21e0bca | 15 | // The actual data block had been detected already, so write into the data block |
leihen | 0:4873b21e0bca | 16 | m_Buffer[m_actualPos++] = c; |
leihen | 0:4873b21e0bca | 17 | // Build checksum on the fly |
leihen | 0:4873b21e0bca | 18 | m_checksum += c; |
leihen | 0:4873b21e0bca | 19 | // Now check if all bytes have been received already |
leihen | 0:4873b21e0bca | 20 | if (m_activeDataBlock == ParadigmaMonitorDataset1) { |
leihen | 0:4873b21e0bca | 21 | // for datablock 1 |
leihen | 0:4873b21e0bca | 22 | nLen = sizeof(m_Data1); |
leihen | 0:4873b21e0bca | 23 | if (nLen == m_actualPos) { |
leihen | 0:4873b21e0bca | 24 | // all bytes received, so reset counter and check if checksum is matching |
leihen | 0:4873b21e0bca | 25 | if (m_checksum != 0) { |
leihen | 0:4873b21e0bca | 26 | ERR("Data corruption error. Received invalid data ! (checksum is %02x)", m_checksum); |
leihen | 0:4873b21e0bca | 27 | } else { |
leihen | 0:4873b21e0bca | 28 | memcpy(&m_Data1, m_Buffer, nLen); |
leihen | 0:4873b21e0bca | 29 | m_Data1.Aussentemp.adjustEndiness(); |
leihen | 0:4873b21e0bca | 30 | m_Data1.Warmwassertemp.adjustEndiness(); |
leihen | 0:4873b21e0bca | 31 | m_Data1.Kesselvorlauf.adjustEndiness(); |
leihen | 0:4873b21e0bca | 32 | m_Data1.Kesselruecklauf.adjustEndiness(); |
leihen | 0:4873b21e0bca | 33 | m_Data1.RaumtemperaturHK1.adjustEndiness(); |
leihen | 0:4873b21e0bca | 34 | m_Data1.RaumtemperaturHK2.adjustEndiness(); |
leihen | 0:4873b21e0bca | 35 | m_Data1.VorlauftemperaturHK1.adjustEndiness(); |
leihen | 0:4873b21e0bca | 36 | m_Data1.VorlauftemperaturHK2.adjustEndiness(); |
leihen | 0:4873b21e0bca | 37 | m_Data1.RuecklauftemperaturHK1.adjustEndiness(); |
leihen | 0:4873b21e0bca | 38 | m_Data1.RuecklauftemperaturHK2.adjustEndiness(); |
leihen | 0:4873b21e0bca | 39 | m_Data1.PuffertemperaturOben.adjustEndiness(); |
leihen | 0:4873b21e0bca | 40 | m_Data1.PuffertemperaturUnten.adjustEndiness(); |
leihen | 0:4873b21e0bca | 41 | m_Data1.Zirkulationstemperatur.adjustEndiness(); |
leihen | 2:27334bd6dc28 | 42 | INFO("*********************** received new data1 !"); |
leihen | 2:27334bd6dc28 | 43 | callBack1(); |
leihen | 0:4873b21e0bca | 44 | } |
leihen | 0:4873b21e0bca | 45 | invalidateHeader(); |
leihen | 0:4873b21e0bca | 46 | } |
leihen | 0:4873b21e0bca | 47 | } else { |
leihen | 0:4873b21e0bca | 48 | // for datablock 2 |
leihen | 0:4873b21e0bca | 49 | nLen = sizeof(m_Data2); |
leihen | 0:4873b21e0bca | 50 | if (nLen == m_actualPos) { |
leihen | 0:4873b21e0bca | 51 | // all bytes received, so reset counter and check if checksum is matching |
leihen | 0:4873b21e0bca | 52 | if (m_checksum != 0) { |
leihen | 0:4873b21e0bca | 53 | ERR("Data corruption error. Received invalid data ! (checksum is %02x)", m_checksum); |
leihen | 0:4873b21e0bca | 54 | } else { |
leihen | 0:4873b21e0bca | 55 | memcpy(&m_Data2, m_Buffer, nLen); |
leihen | 0:4873b21e0bca | 56 | m_Data2.RaumsollHK1.adjustEndiness(); |
leihen | 0:4873b21e0bca | 57 | m_Data2.RaumsollHK2.adjustEndiness(); |
leihen | 0:4873b21e0bca | 58 | m_Data2.VorlaufsollHK1.adjustEndiness(); |
leihen | 0:4873b21e0bca | 59 | m_Data2.VorlaufsollHK2.adjustEndiness(); |
leihen | 0:4873b21e0bca | 60 | m_Data2.Warmwassersolltemp.adjustEndiness(); |
leihen | 0:4873b21e0bca | 61 | m_Data2.Puffersolltemp.adjustEndiness(); |
leihen | 0:4873b21e0bca | 62 | m_Data2.BetriebsstundenKessel.adjustEndiness(); |
leihen | 0:4873b21e0bca | 63 | m_Data2.AnzahlKesselstarts.adjustEndiness(); |
leihen | 0:4873b21e0bca | 64 | m_Data2.StoercodeKessel.adjustEndiness(); |
leihen | 2:27334bd6dc28 | 65 | INFO("*********************** received new data2 !"); |
leihen | 2:27334bd6dc28 | 66 | callBack2(); |
leihen | 0:4873b21e0bca | 67 | } |
leihen | 0:4873b21e0bca | 68 | invalidateHeader(); |
leihen | 0:4873b21e0bca | 69 | } |
leihen | 0:4873b21e0bca | 70 | } |
leihen | 0:4873b21e0bca | 71 | } else { |
leihen | 0:4873b21e0bca | 72 | // Still trying to detect a valid data block, check to see if a valid address-part is here |
leihen | 0:4873b21e0bca | 73 | switch (m_actualPos) { |
leihen | 0:4873b21e0bca | 74 | case 0 : // block type |
leihen | 0:4873b21e0bca | 75 | if ( (c== ParadigmaParameters) || (c== ParadigmaVariables)) { |
leihen | 0:4873b21e0bca | 76 | m_Header.block_type = (ParadigmaBlockType_t)c; |
leihen | 0:4873b21e0bca | 77 | m_actualPos++; |
leihen | 0:4873b21e0bca | 78 | m_checksum = c; |
leihen | 0:4873b21e0bca | 79 | INFO("Block start !\n"); |
leihen | 0:4873b21e0bca | 80 | } |
leihen | 0:4873b21e0bca | 81 | break; |
leihen | 0:4873b21e0bca | 82 | |
leihen | 0:4873b21e0bca | 83 | case 1 : // length |
leihen | 0:4873b21e0bca | 84 | m_Header.block_length = c; |
leihen | 0:4873b21e0bca | 85 | m_actualPos++; |
leihen | 0:4873b21e0bca | 86 | m_checksum += c; |
leihen | 0:4873b21e0bca | 87 | INFO("Block len !\n"); |
leihen | 0:4873b21e0bca | 88 | break; |
leihen | 0:4873b21e0bca | 89 | |
leihen | 0:4873b21e0bca | 90 | case 2 : // Message ID |
leihen | 0:4873b21e0bca | 91 | if ( c == ParadigmaMessage ) { |
leihen | 0:4873b21e0bca | 92 | m_Header.message_id = (ParadigmaMessageID_t)c; |
leihen | 0:4873b21e0bca | 93 | m_actualPos++; |
leihen | 0:4873b21e0bca | 94 | m_checksum += c; |
leihen | 0:4873b21e0bca | 95 | } else { |
leihen | 0:4873b21e0bca | 96 | invalidateHeader(); |
leihen | 0:4873b21e0bca | 97 | INFO("Rejected due to incorrect Message ID %d\n", c); |
leihen | 0:4873b21e0bca | 98 | } |
leihen | 0:4873b21e0bca | 99 | break; |
leihen | 0:4873b21e0bca | 100 | |
leihen | 0:4873b21e0bca | 101 | case 3 : // |
leihen | 0:4873b21e0bca | 102 | if ( (c == ParadigmaMonitorDataset1) || (c == ParadigmaMonitorDataset2)) { |
leihen | 0:4873b21e0bca | 103 | m_Header.dataset_type = (ParadigmaDatasetType_t)c; |
leihen | 0:4873b21e0bca | 104 | m_actualPos = 0; |
leihen | 0:4873b21e0bca | 105 | m_checksum += c; |
leihen | 0:4873b21e0bca | 106 | m_activeDataBlock = (ParadigmaDatasetType_t)c; |
leihen | 2:27334bd6dc28 | 107 | INFO("Dataset Number %d!\n", c); |
leihen | 0:4873b21e0bca | 108 | } else { |
leihen | 0:4873b21e0bca | 109 | invalidateHeader(); |
leihen | 0:4873b21e0bca | 110 | INFO("Rejected due to incorrect Dataset number %d\n", c); |
leihen | 0:4873b21e0bca | 111 | } |
leihen | 0:4873b21e0bca | 112 | break; |
leihen | 0:4873b21e0bca | 113 | |
leihen | 0:4873b21e0bca | 114 | default: |
leihen | 0:4873b21e0bca | 115 | invalidateHeader(); |
leihen | 0:4873b21e0bca | 116 | break; |
leihen | 0:4873b21e0bca | 117 | } |
leihen | 0:4873b21e0bca | 118 | } |
leihen | 0:4873b21e0bca | 119 | return *this; |
leihen | 0:4873b21e0bca | 120 | } |
leihen | 0:4873b21e0bca | 121 | |
leihen | 0:4873b21e0bca | 122 | /** Function will reset all header and actual position information so that search for valid header |
leihen | 0:4873b21e0bca | 123 | * will be reset and starting from beginning with receival of next character. |
leihen | 0:4873b21e0bca | 124 | * |
leihen | 0:4873b21e0bca | 125 | * Will have to clearup the header itsself and the checksum. Also the actual data block information |
leihen | 0:4873b21e0bca | 126 | * needs to be invalidated. Actual position will also be reset |
leihen | 0:4873b21e0bca | 127 | */ |
leihen | 0:4873b21e0bca | 128 | void ParadigmaMonitorData::invalidateHeader() |
leihen | 0:4873b21e0bca | 129 | { |
leihen | 0:4873b21e0bca | 130 | // Invalidate Header information |
leihen | 2:27334bd6dc28 | 131 | memset(&m_Header, 0, sizeof(m_Header)); |
leihen | 0:4873b21e0bca | 132 | // Set active data block information to invalid |
leihen | 0:4873b21e0bca | 133 | m_activeDataBlock = (ParadigmaDatasetType_t)Invalid; |
leihen | 0:4873b21e0bca | 134 | // Reset actual position with in Buffer so that next char starts from beginning |
leihen | 0:4873b21e0bca | 135 | m_actualPos = 0; |
leihen | 0:4873b21e0bca | 136 | // Reset the checksum, because it will be calculated on the fly. |
leihen | 0:4873b21e0bca | 137 | m_checksum = 0; |
leihen | 0:4873b21e0bca | 138 | } |
leihen | 0:4873b21e0bca | 139 | |
leihen | 0:4873b21e0bca | 140 | /** Function will let user select which temperature to retrieve */ |
leihen | 0:4873b21e0bca | 141 | ParadigmaTemperature ParadigmaMonitorData::getTemperature(ParadigmaTemperatureSelector_t sel) |
leihen | 0:4873b21e0bca | 142 | { |
leihen | 0:4873b21e0bca | 143 | ParadigmaTemperature temp; |
leihen | 0:4873b21e0bca | 144 | switch(sel) { |
leihen | 0:4873b21e0bca | 145 | // Temperatures from Monitor Data 1 |
leihen | 0:4873b21e0bca | 146 | case T_aussen : temp = m_Data1.Aussentemp; break; |
leihen | 0:4873b21e0bca | 147 | case T_warm_wasser : temp = m_Data1.Warmwassertemp; break; |
leihen | 0:4873b21e0bca | 148 | case T_kessel_vorlauf : temp = m_Data1.Kesselvorlauf; break; |
leihen | 0:4873b21e0bca | 149 | case T_kessel_ruecklauf : temp = m_Data1.Kesselruecklauf; break; |
leihen | 0:4873b21e0bca | 150 | case T_HK1_raum : temp = m_Data1.RaumtemperaturHK1; break; |
leihen | 0:4873b21e0bca | 151 | case T_HK2_raum : temp = m_Data1.RaumtemperaturHK2; break; |
leihen | 0:4873b21e0bca | 152 | case T_HK1_vorlauf : temp = m_Data1.VorlauftemperaturHK1; break; |
leihen | 0:4873b21e0bca | 153 | case T_HK2_vorlauf : temp = m_Data1.VorlauftemperaturHK2; break; |
leihen | 0:4873b21e0bca | 154 | case T_HK1_ruecklauf : temp = m_Data1.RuecklauftemperaturHK1; break; |
leihen | 0:4873b21e0bca | 155 | case T_HK2_ruecklauf : temp = m_Data1.RuecklauftemperaturHK2; break; |
leihen | 0:4873b21e0bca | 156 | case T_puffer_oben : temp = m_Data1.PuffertemperaturOben; break; |
leihen | 0:4873b21e0bca | 157 | case T_puffer_unten : temp = m_Data1.PuffertemperaturUnten; break; |
leihen | 0:4873b21e0bca | 158 | case T_zirkulation : temp = m_Data1.Zirkulationstemperatur; break; |
leihen | 0:4873b21e0bca | 159 | |
leihen | 0:4873b21e0bca | 160 | // Temperatures form Monitor Data 2 |
leihen | 0:4873b21e0bca | 161 | case T_HK1_raum_soll : temp = m_Data2.RaumsollHK1; break; |
leihen | 0:4873b21e0bca | 162 | case T_HK2_raum_soll : temp = m_Data2.RaumsollHK2; break; |
leihen | 0:4873b21e0bca | 163 | case T_HK1_vorlauf_soll : temp = m_Data2.VorlaufsollHK1; break; |
leihen | 0:4873b21e0bca | 164 | case T_HK2_vorlauf_soll : temp = m_Data2.VorlaufsollHK2; break; |
leihen | 0:4873b21e0bca | 165 | case T_warm_wasser_soll : temp = m_Data2.Warmwassersolltemp; break; |
leihen | 0:4873b21e0bca | 166 | case T_puffer_soll : temp = m_Data2.Puffersolltemp; break; |
leihen | 0:4873b21e0bca | 167 | |
leihen | 0:4873b21e0bca | 168 | default: // Invalid selecion ! |
leihen | 0:4873b21e0bca | 169 | ERR("**** An unknown selection for the temperature was made !"); |
leihen | 0:4873b21e0bca | 170 | break; |
leihen | 0:4873b21e0bca | 171 | } |
leihen | 0:4873b21e0bca | 172 | |
leihen | 0:4873b21e0bca | 173 | return temp; |
leihen | 0:4873b21e0bca | 174 | } |