This library allows to parse and work with data sent by the Paradigma pelletti oven.

Committer:
leihen
Date:
Sat Jun 22 10:59:05 2013 +0000
Revision:
0:4873b21e0bca
Child:
1:9c48326ad8c9
Fixes

Who changed what in which revision?

UserRevisionLine numberNew 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 }