191 lines
3.7 KiB
C++
191 lines
3.7 KiB
C++
/*
|
|
* meterBusClientFrames.cpp
|
|
*
|
|
* Created on: 09.03.2014
|
|
* Author: wn
|
|
*/
|
|
|
|
#include "meterBusClient.h"
|
|
|
|
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++;
|
|
}
|
|
|
|
unsigned char MeterBusClient::calcSendChecksum() {
|
|
unsigned char checksum = 0;
|
|
for (unsigned int i = 4; i < m_sendBufferLen; i++) {
|
|
checksum += m_sendBuffer[i];
|
|
}
|
|
return checksum;
|
|
}
|
|
|
|
void MeterBusClient::calcAndSetFrameLength() {
|
|
unsigned char frameLength = m_sendBufferLen - 6;
|
|
m_sendBuffer[1] = frameLength;
|
|
m_sendBuffer[2] = frameLength;
|
|
}
|
|
|
|
void MeterBusClient::SND_NKE() {
|
|
m_sendBufferLen = 0;
|
|
aSB((unsigned char)0xE5);
|
|
}
|
|
|
|
void MeterBusClient::REQ_UD2() {
|
|
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
|
|
aSB(getAddress());
|
|
|
|
// 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());
|
|
|
|
|
|
aSB(calcSendChecksum());
|
|
aSB((unsigned char)0x16);
|
|
calcAndSetFrameLength();
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|