/* * 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(); }