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