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.h	Sat Jun 22 10:59:05 2013 +0000
@@ -0,0 +1,211 @@
+#ifndef __PARADIGMA_DATA_H__
+#define __PARADIGMA_DATA_H__
+
+#include "mbed.h"
+#include "ParadigmaBase.h"
+#include "ParadigmaTemperature.h"
+#include "ParadigmaDateTime.h"
+
+#include <string>
+using namespace std;
+
+/** ParadigmaBlockType_t enumerates valid values for the block type. The block type is always the first 
+  * data byte in a response from paradigma. There are currently two known values.
+  */
+typedef __packed enum {
+    ParadigmaVariables = 0xFC,
+    ParadigmaParameters = 0xFD,
+} ParadigmaBlockType_t;
+
+/** ParadigmaMessageID_t specifies the content of the transmitted object. Currently only one valid value
+  * is known which indicates a valuid variable or parameter block is being transmitted */
+typedef __packed enum {
+    ParadigmaMessage = 0x0C,
+} ParadigmaMessageID_t;
+
+/** ParadigmaDatasetType_t specifies which type of information is contained in the datablock. Currently 
+  * known values are : Dataset1 and Dataset2 for Variables, and Parameters for different settings which
+  * can be changed and queried by the user.
+  */
+typedef __packed enum {
+    ParadigmaMonitorDataset1 = 0x01,
+    ParadigmaMonitorDataset2 = 0x02,
+    ParadigmaParameterset = 0x03,
+    ParadigmaUnknown1 = 0x14,
+    Invalid = 0xFF
+} ParadigmaDatasetType_t;
+
+typedef char ParadigmaParameterAddress_t[3];
+
+const ParadigmaParameterAddress_t ParadigmaAdresses[] = {
+    {0x00, 0x02, 0x2A},      //  Heizkreis 1
+    {0x01, 0x88, 0x2A},      //  Heizkreis 2
+    {0x03, 0x0E, 0x09},      //  Warmwasser
+    {0x03, 0xF7, 0x0F},      //  Anlagendaten Kessel/Puffer und Zirkulation
+    {0x03, 0xE6, 0x12},      //  Wartung Telefonnummer
+    {0x03, 0x17, 0x70},      //  Warmwasserprogramm 1
+    {0x03, 0x87, 0x70},      //  Warmwasserprogramm 2
+    {0x04, 0x06, 0x70},      //  Zirkulationszeitprogramm 1
+    {0x04, 0x76, 0x70},      //  Zirkulationszeitprogramm 2
+    {0x00, 0x2C, 0x70},      //  Heizzeitprogramm 1 HK1
+    {0x00, 0x9C, 0x70},      //    Heizzeitprogramm 2 HK1
+    {0x01, 0x0C, 0x70},     // Heizzeitprogramm 3 HK1
+    {0x01, 0xB2, 0x70},     // Heizzeitprogramm 1 HK2
+    {0x02, 0x22, 0x70},     //  Heizzeitprogramm 2 HK2
+    {0x02, 0x92, 0x70},     //  Heizzeitprogramm 3 HK2
+    {0x05, 0x08, 0x03}      //  Anlagendaten Kessel/Puffer 2
+};
+
+/** ParadigmaBlockHeader_t represents the header of any sent block by paradigma. */
+typedef __packed struct {
+    ParadigmaBlockType_t        block_type;         // 0xFC for normal observable variables, 0xFD for parameter blocks
+    unsigned char               block_length;
+    ParadigmaMessageID_t        message_id;         // always 0x0C
+    ParadigmaDatasetType_t      dataset_type;  
+} ParadigmaBlockHeader_t;
+
+typedef __packed struct {
+    ParadigmaDateTime           DateTime;
+    ParadigmaTemperature        Aussentemp;             //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        Warmwassertemp;         //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        Kesselvorlauf;          //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        Kesselruecklauf;        //  (in 0,1 Grad Schritten)
+    
+    ParadigmaTemperature        RaumtemperaturHK1;      //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        RaumtemperaturHK2;      //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        VorlauftemperaturHK1;   //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        VorlauftemperaturHK2;   //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        RuecklauftemperaturHK1; //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        RuecklauftemperaturHK2; //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        PuffertemperaturOben;   //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        PuffertemperaturUnten;  //  (in 0,1 Grad Schritten)
+    ParadigmaTemperature        Zirkulationstemperatur; //  (in 0,1 Grad Schritten)
+
+    byte                        Checksumme;
+} MonDta1_t;
+
+typedef __packed struct {
+    ParadigmaTemperature        RaumsollHK1;
+    ParadigmaTemperature        RaumsollHK2;
+    ParadigmaTemperature        VorlaufsollHK1;
+    ParadigmaTemperature        VorlaufsollHK2;
+    ParadigmaTemperature        Warmwassersolltemp;
+    ParadigmaTemperature        Puffersolltemp;
+    __packed struct {
+        word    PHK1:1;
+        word    PHK2:1;
+        word    PK:1;
+        word    Mischer1Auf:1;
+        word    Mischer1Zu:1;
+        word    Mischer2Auf:1;
+        word    Mischer2Zu:1;
+        word    ULV:1;
+        word    PZ:1;
+        word    B1:1;
+        word    Taster:1;
+        word    LONModul:1;
+        word    OTModul:1;
+        word    reserver:3;
+    }           ZustandAusgaenge;
+    ParadigmaDword              BetriebsstundenKessel;
+    ParadigmaDword              AnzahlKesselstarts;
+    ParadigmaWord               StoercodeKessel;
+    byte                        StoercodeFuehler;
+    byte                        BetriebsartHK1;
+    byte                        NiveauHK1;
+    byte                        BetriebsartHK2;
+    byte                        NiveauHK2;
+    byte                        LeistungPHK1;
+    byte                        LeistungPHK2;
+    byte                        LeistungPK;
+    
+    byte                        Checksumme;        
+} MonDta2_t;
+
+
+/** Class ParadigmaMonitorData encapsulates the data representation and parsing of the
+  * data blocks that are being sent by the paradigma heater. The class also provides
+  * a stream type functionality to detect and parse the data from a stream of chars.
+  */
+class ParadigmaMonitorData
+{
+        FunctionPointer         m_Callback;
+        
+        MonDta1_t               m_Data1;
+        MonDta2_t               m_Data2;
+        
+        char                    m_Buffer[50];
+        ParadigmaBlockHeader_t  m_Header;
+        ParadigmaDatasetType_t  m_activeDataBlock;
+        int                     m_actualPos;
+        char                    m_checksum;
+        
+        void                    invalidateHeader();
+        void                    callBack()  { m_Callback.call(); }
+        word                    swapWord(word d) { return ((d&0xFF)<<8) | ((d>>8)&0xFF); }
+        ulong                   swapDWord(ulong d) { return ((d>>24)&0xFF) | ((d>>8)&0x0000FF00) | ((d<<8)&0x00FF0000) | ((d<<24)&0xFF000000); }
+    public:
+        /** Public constructor. Will initialize all internal data and variables. */
+        ParadigmaMonitorData(): m_checksum(0)  {  memset(&m_Data1, 0, sizeof(m_Data1)); memset(&m_Data2, 0, sizeof(m_Data2)); invalidateHeader(); }
+        /** Access function to get the transmitted date time object.
+          * @returns : the date and time objects of the transmitted data.
+          */
+        ParadigmaDateTime getDateTime()                     { return m_Data1.DateTime; }
+        /** Access function to the Outside air temperature (AUSSENTEMP).
+          * @returns : the outside air temperature.
+          */
+        ParadigmaTemperature getAussentemp()                { return m_Data1.Aussentemp; }
+        /** Access function to the warm water temperature (WARMWASSERTEMP).
+          * @returns : the warm water temperature.
+          */
+        ParadigmaTemperature getWarmwassertemp()            { return m_Data1.Warmwassertemp; }
+        /** Access function to the 'kessel vorlauf' temperature.
+          * @returns : the temperature of the 'kessel vorlauf'.
+          */
+        ParadigmaTemperature getKesselvorlauf()             { return m_Data1.Kesselvorlauf; }
+        /** Access function to the 'kessel ruecklauf' temperature.
+          * @returns : the temperature of the 'kessel ruecklauf'.
+          */
+        ParadigmaTemperature getKesselruecklauf()           { return m_Data1.Kesselruecklauf; }
+        /** Access function to the room temperature of heating circuit 1.
+          * @returns : the room temperature of heating circuit 1.
+          */
+        ParadigmaTemperature getRaumtemperaturHK1()         { return m_Data1.RaumtemperaturHK1; }
+        /** Access function to the room temperature of heating circuit 2.
+          * @returns : the room temperature of heating circuit 2.
+          */
+        ParadigmaTemperature getRaumtemperaturHK2()         { return m_Data1.RaumtemperaturHK2; }
+        ParadigmaTemperature getVorlauftemperaturHK1()      { return m_Data1.VorlauftemperaturHK1; }
+        ParadigmaTemperature getVorlauftemperaturHK2()      { return m_Data1.VorlauftemperaturHK2; }
+        ParadigmaTemperature getRuecklauftemperaturHK1()    { return m_Data1.RuecklauftemperaturHK1; }
+        ParadigmaTemperature getRuecklauftemperaturHK2()    { return m_Data1.RuecklauftemperaturHK2; }
+        ParadigmaTemperature getPuffertemperaturOben()      { return m_Data1.PuffertemperaturOben; }
+        ParadigmaTemperature getPuffertemperaturUnten()     { return m_Data1.PuffertemperaturUnten; }
+        ParadigmaTemperature getZirkulationstemperatur()    { return m_Data1.Zirkulationstemperatur; }
+        
+        ParadigmaTemperature getRaumsollHK1()               { return m_Data2.RaumsollHK1;}
+        ParadigmaTemperature getRaumsollHK2()               { return m_Data2.RaumsollHK2;}
+        ParadigmaTemperature getVorlaufsollHK1()            { return m_Data2.VorlaufsollHK1;}
+        ParadigmaTemperature getVorlaufsollHK2()            { return m_Data2.VorlaufsollHK2;}
+        ParadigmaTemperature getWarmwassersolltemp()        { return m_Data2.Warmwassersolltemp;}
+        ParadigmaTemperature getPuffersolltemp()            { return m_Data2.Puffersolltemp;}
+        
+        /** Function will let the user select the temperature to be returned.
+          * @param sel : Will specify which temperature value to return.
+          * @returns : the temperature object as selected by param sel.
+          */
+        ParadigmaTemperature getTemperature(ParadigmaTemperatureSelector_t sel);
+        
+        ulong               getBetriebsstundenKessel()      { return (ulong)m_Data2.BetriebsstundenKessel; }
+        ulong               getAnzahlKesselstarts()         { return (ulong)m_Data2.AnzahlKesselstarts; }
+        word                getStoercodeKessel()            { return (word)m_Data2.StoercodeKessel; }
+        byte                getStoercodeFuehler()           { return (byte)m_Data2.StoercodeFuehler; }
+        
+        
+        ParadigmaMonitorData& operator<<( char c );
+        ParadigmaMonitorData& operator<<( char Buffer[] );
+        
+        void attach( void (*fct)(void) )    { m_Callback.attach(fct);}
+};
+
+#endif
\ No newline at end of file