ThermometerPro/meterBusClientFrames.cpp

191 lines
3.7 KiB
C++
Raw Permalink Normal View History

/*
* meterBusClientFrames.cpp
*
* Created on: 09.03.2014
* Author: wn
*/
#include "meterBusClient.h"
2014-05-04 20:56:03 +02:00
void MeterBusClient::aSB(unsigned char v) {
m_sendBuffer[m_sendBufferLen] = v;
m_sendBufferLen++;
}
void MeterBusClient::aSB(unsigned int v) {
// 16 bit
union {
unsigned int i;
unsigned char c[2];
} u;
u.i = v;
m_sendBuffer[m_sendBufferLen] = u.c[0];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[1];
m_sendBufferLen++;
}
void MeterBusClient::aSB(unsigned long v) {
// 32 bit
union{
unsigned long l;
unsigned char c[4];
} u;
u.l = v;
m_sendBuffer[m_sendBufferLen] = u.c[0];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[1];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[2];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[3];
m_sendBufferLen++;
}
void MeterBusClient::aSB(float v) {
// 32 bit
union{
float f;
unsigned char c[4];
} u;
u.f = v;
m_sendBuffer[m_sendBufferLen] = u.c[0];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[1];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[2];
m_sendBufferLen++;
m_sendBuffer[m_sendBufferLen] = u.c[3];
m_sendBufferLen++;
2014-04-02 22:50:17 +02:00
}
unsigned char MeterBusClient::calcSendChecksum() {
unsigned char checksum = 0;
2014-05-04 20:56:03 +02:00
for (unsigned int i = 4; i < m_sendBufferLen; i++) {
checksum += m_sendBuffer[i];
2014-04-02 22:50:17 +02:00
}
return checksum;
}
2014-05-04 20:56:03 +02:00
void MeterBusClient::calcAndSetFrameLength() {
unsigned char frameLength = m_sendBufferLen - 6;
m_sendBuffer[1] = frameLength;
m_sendBuffer[2] = frameLength;
}
void MeterBusClient::SND_NKE() {
2014-05-04 20:56:03 +02:00
m_sendBufferLen = 0;
aSB((unsigned char)0xE5);
}
void MeterBusClient::REQ_UD2() {
2014-05-04 20:56:03 +02:00
m_sendBufferLen = 0;
// frame header
aSB((unsigned char)0x68);
aSB((unsigned char)0x00);
aSB((unsigned char)0x00);
aSB((unsigned char)0x68);
// C
aSB((unsigned char)0x08);
// A
2014-04-02 22:50:17 +02:00
aSB(getAddress());
2014-05-04 20:56:03 +02:00
// CI
aSB((unsigned char)0x72);
// Header
aSB((unsigned long)0); // Ident
aSB((unsigned int)0); // Manu.
aSB((unsigned char)1); // Version
aSB((unsigned char)0); // Medium: other
aSB(getAccessCnt()); // Access
aSB(getStatus()); // Status
aSB((unsigned int)0); // Signatur
// Uptime
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x24);
aSB(m_uptime->getSeconds());
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x25);
aSB(m_uptime->getMinutes());
// DIF
aSB((unsigned char)0x01);
// VIF
aSB((unsigned char)0x26);
aSB(m_uptime->getHours());
// DIF
aSB((unsigned char)0x02);
// VIF
aSB((unsigned char)0x27);
aSB((unsigned int)m_uptime->getDays());
// Temperatur 1
// DIF
aSB((unsigned char)0x05);
// VIF
aSB((unsigned char)0x67);
// value
aSB(m_thermometer->getTemperature(0));
// Temperatur 2
// DIF
aSB((unsigned char)0x05);
// VIF
aSB((unsigned char)0x67);
// value
aSB(m_thermometer->getTemperature(1));
// Temperatur 3
// DIF
aSB((unsigned char)0x05);
// VIF
aSB((unsigned char)0x67);
// value
aSB(m_thermometer->getTemperature(2));
// Temperatur 4
// DIF
aSB((unsigned char)0x05);
// VIF
aSB((unsigned char)0x67);
// value
aSB(m_thermometer->getTemperature(3));
// Structured Manufacturer Data
// DIF
aSB((unsigned char)0x0f);
aSB(m_frameCnt);
aSB(m_myFrameCnt);
aSB(m_invalidFrameCnt);
aSB(m_invalidChecksum);
aSB(m_collisionCnt);
aSB(m_thermometer->getCalibrateFactor(0));
aSB(m_thermometer->getCalibrateFactor(1));
aSB(m_thermometer->getCalibrateFactor(2));
aSB(m_thermometer->getCalibrateFactor(3));
aSB(m_thermometer->getAlpha());
aSB(m_thermometer->getPeriodMeasure());
2014-04-02 22:50:17 +02:00
aSB(calcSendChecksum());
2014-05-04 20:56:03 +02:00
aSB((unsigned char)0x16);
calcAndSetFrameLength();
}