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

Revision:
0:4873b21e0bca
Child:
1:9c48326ad8c9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ParadigmaData.cpp	Sat Jun 22 10:59:05 2013 +0000
@@ -0,0 +1,171 @@
+#include "ParadigmaData.h"
+
+#define DEBUG
+#include "debug.h"
+
+
+
+ParadigmaMonitorData& ParadigmaMonitorData::operator<<(char c)
+{
+    int nLen = 0;
+    if (m_activeDataBlock != Invalid) {
+        //  The actual data block had been detected already, so write into the data block
+        m_Buffer[m_actualPos++] = c;
+        //  Build checksum on the fly
+        m_checksum += c;
+        //  Now check if all bytes have been received already
+        if (m_activeDataBlock == ParadigmaMonitorDataset1) {
+            // for datablock 1
+            nLen = sizeof(m_Data1);
+            if (nLen == m_actualPos) {
+                //   all bytes received, so reset counter and check if checksum is matching
+                if (m_checksum != 0) {
+                    ERR("Data corruption error. Received invalid data ! (checksum is %02x)", m_checksum);
+                } else {
+                    memcpy(&m_Data1, m_Buffer, nLen);
+                    m_Data1.Aussentemp.adjustEndiness();
+                    m_Data1.Warmwassertemp.adjustEndiness();
+                    m_Data1.Kesselvorlauf.adjustEndiness();
+                    m_Data1.Kesselruecklauf.adjustEndiness();
+                    m_Data1.RaumtemperaturHK1.adjustEndiness();
+                    m_Data1.RaumtemperaturHK2.adjustEndiness();
+                    m_Data1.VorlauftemperaturHK1.adjustEndiness();
+                    m_Data1.VorlauftemperaturHK2.adjustEndiness();
+                    m_Data1.RuecklauftemperaturHK1.adjustEndiness();
+                    m_Data1.RuecklauftemperaturHK2.adjustEndiness();
+                    m_Data1.PuffertemperaturOben.adjustEndiness();
+                    m_Data1.PuffertemperaturUnten.adjustEndiness();
+                    m_Data1.Zirkulationstemperatur.adjustEndiness();
+                    INFO("*********************** received new data !");
+                    callBack();
+                }
+                invalidateHeader();
+            }
+        } else {
+            //  for datablock 2
+            nLen = sizeof(m_Data2);
+            if (nLen == m_actualPos) {
+                //   all bytes received, so reset counter and check if checksum is matching
+                if (m_checksum != 0) {
+                    ERR("Data corruption error. Received invalid data ! (checksum is %02x)", m_checksum);
+                } else {
+                    memcpy(&m_Data2, m_Buffer, nLen);
+                    m_Data2.RaumsollHK1.adjustEndiness();
+                    m_Data2.RaumsollHK2.adjustEndiness();
+                    m_Data2.VorlaufsollHK1.adjustEndiness();
+                    m_Data2.VorlaufsollHK2.adjustEndiness();
+                    m_Data2.Warmwassersolltemp.adjustEndiness();
+                    m_Data2.Puffersolltemp.adjustEndiness();
+                    m_Data2.BetriebsstundenKessel.adjustEndiness();
+                    m_Data2.AnzahlKesselstarts.adjustEndiness();
+                    m_Data2.StoercodeKessel.adjustEndiness();
+                    INFO("*********************** received new data !");
+                    callBack();
+                }
+                invalidateHeader();
+            }
+        }
+    } else {
+        //  Still trying to detect a valid data block, check to see if a valid address-part is here
+        switch (m_actualPos) {
+            case 0 :        // block type
+                if ( (c== ParadigmaParameters) || (c== ParadigmaVariables)) {
+                    m_Header.block_type = (ParadigmaBlockType_t)c;
+                    m_actualPos++;
+                    m_checksum = c;
+                    INFO("Block start !\n");
+                }
+                break;
+                
+            case 1 :        //  length
+                m_Header.block_length = c;
+                m_actualPos++;
+                m_checksum += c;
+                    INFO("Block len !\n");
+                break;
+                
+            case 2 :        //  Message ID
+                if ( c == ParadigmaMessage ) {
+                    m_Header.message_id = (ParadigmaMessageID_t)c;
+                    m_actualPos++;
+                    m_checksum += c;
+                } else {
+                    invalidateHeader();
+                    INFO("Rejected due to incorrect Message ID %d\n", c);
+                }
+                break;
+                
+            case 3 :        //
+                if ( (c == ParadigmaMonitorDataset1) || (c == ParadigmaMonitorDataset2)) {
+                    m_Header.dataset_type = (ParadigmaDatasetType_t)c;
+                    m_actualPos = 0;
+                    m_checksum += c;
+                    m_activeDataBlock = (ParadigmaDatasetType_t)c;
+                    INFO("Dataset Number !\n");
+                } else {
+                    invalidateHeader();
+                    INFO("Rejected due to incorrect Dataset number %d\n", c);
+                }
+                break;
+            
+            default:
+                invalidateHeader();
+                break;
+        }
+    }
+    return *this;
+}
+
+/** Function will reset all header and actual position information so that search for valid header
+ *  will be reset and starting from beginning with receival of next character.
+ *
+ *  Will have to clearup the header itsself and the checksum. Also the actual data block information
+ *  needs to be invalidated. Actual position will also be reset
+ */
+void ParadigmaMonitorData::invalidateHeader()
+{
+    //  Invalidate Header information
+    memset(&m_Header, 0, sizeof(m_Header)); 
+    //  Set active data block information to invalid
+    m_activeDataBlock = (ParadigmaDatasetType_t)Invalid; 
+    //  Reset actual position with in Buffer so that next char starts from beginning
+    m_actualPos = 0;
+    //  Reset the checksum, because it will be calculated on the fly.
+    m_checksum = 0;
+}
+
+/** Function will let user select which temperature to retrieve */
+ParadigmaTemperature ParadigmaMonitorData::getTemperature(ParadigmaTemperatureSelector_t sel)
+{
+    ParadigmaTemperature    temp;
+    switch(sel) {
+        //  Temperatures from Monitor Data 1
+        case T_aussen :             temp = m_Data1.Aussentemp; break;
+        case T_warm_wasser :        temp = m_Data1.Warmwassertemp; break;
+        case T_kessel_vorlauf :     temp = m_Data1.Kesselvorlauf; break;
+        case T_kessel_ruecklauf :   temp = m_Data1.Kesselruecklauf; break;
+        case T_HK1_raum :           temp = m_Data1.RaumtemperaturHK1; break;
+        case T_HK2_raum :           temp = m_Data1.RaumtemperaturHK2; break;
+        case T_HK1_vorlauf :        temp = m_Data1.VorlauftemperaturHK1; break;
+        case T_HK2_vorlauf :        temp = m_Data1.VorlauftemperaturHK2; break;
+        case T_HK1_ruecklauf :      temp = m_Data1.RuecklauftemperaturHK1; break;
+        case T_HK2_ruecklauf :      temp = m_Data1.RuecklauftemperaturHK2; break;
+        case T_puffer_oben :        temp = m_Data1.PuffertemperaturOben; break;
+        case T_puffer_unten :       temp = m_Data1.PuffertemperaturUnten; break;
+        case T_zirkulation :        temp = m_Data1.Zirkulationstemperatur; break;
+        
+        //  Temperatures form Monitor Data 2
+        case T_HK1_raum_soll :      temp = m_Data2.RaumsollHK1; break;
+        case T_HK2_raum_soll :      temp = m_Data2.RaumsollHK2; break;
+        case T_HK1_vorlauf_soll :   temp = m_Data2.VorlaufsollHK1; break;
+        case T_HK2_vorlauf_soll :   temp = m_Data2.VorlaufsollHK2; break;
+        case T_warm_wasser_soll :   temp = m_Data2.Warmwassersolltemp; break;
+        case T_puffer_soll :        temp = m_Data2.Puffersolltemp; break;
+        
+        default:    // Invalid selecion !
+            ERR("**** An unknown selection for the temperature was made !");
+            break;
+    }
+    
+    return temp;
+}
\ No newline at end of file