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

ParadigmaData.h

Committer:
leihen
Date:
2013-06-27
Revision:
2:27334bd6dc28
Parent:
1:9c48326ad8c9

File content as of revision 2:27334bd6dc28:

#ifndef __PARADIGMA_DATA_H__
#define __PARADIGMA_DATA_H__

#include "ParadigmaBase.h"
#include "ParadigmaTemperature.h"
#include "ParadigmaDateTime.h"

#include <string>
using namespace std;

namespace Paradigma
{

/** 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_CallbackData1;
    FunctionPointer         m_CallbackData2;

    MonDta1_t               m_Data1;
    MonDta2_t               m_Data2;

    ParadigmaBlockHeader_t  m_Header;
    ParadigmaDatasetType_t  m_activeDataBlock;
    int                     m_actualPos;
    char                    m_checksum;

    void                    invalidateHeader();
    void                    callBack1()  {
        m_CallbackData1.call();
    }
    void                    callBack2()  {
        m_CallbackData2.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 attach1( void (*fct)(void) )    {
        m_CallbackData1.attach(fct);
    }
    void attach2( void (*fct)(void) )   {
        m_CallbackData2.attach(fct);
    }
    
    template<typename T>
    void attach1(T* p, void (T::*mptr)(void)) {
        m_CallbackData1.attach(p, mptr);
    }
    template<typename T>
    void attach2(T* p, void (T::*mptr)(void)) {
        m_CallbackData2.attach(p, mptr);
    }
    
    MonDta1_t *  getData1()      { return &m_Data1; }
    MonDta2_t *  getData2()      { return &m_Data2; }
};
}
#endif