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

ParadigmaData.cpp

Committer:
leihen
Date:
2013-06-22
Revision:
0:4873b21e0bca
Child:
1:9c48326ad8c9

File content as of revision 0:4873b21e0bca:

#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;
}