ESP32_ChinaDieselHeater_Con.../Arduino/SenderTrial2/TxManage.cpp
rljonesau 9818b33e47 Automatically detects if another controller exists on the blue wire.
If found, it parrots the settings, but allows on/off commands to be inserted by a user.
If no other controller detected, it falls back and delivers our settings each second.

Currently reports all packets to USB, but will move onto Bluetooth delivery of heater data soon.
2018-09-23 16:31:09 +10:00

128 lines
2.3 KiB
C++

#include <Arduino.h>
#include "TxManage.h"
extern void SerialReport(const char* hdr, const unsigned char* pData, const char* ftr);
CTxManage::CTxManage(int TxEnbPin, USARTClass& serial) :
m_Serial(serial),
m_Frame(CFrame::TxMode)
{
m_bOnReq = false;
m_bOffReq = false;
m_bTxPending = false;
m_bSelf = true;
m_nStartTime = 0;
m_nTxEnbPin = TxEnbPin;
}
void CTxManage::begin()
{
pinMode(m_nTxEnbPin, OUTPUT);
digitalWrite(m_nTxEnbPin, LOW);
}
void
CTxManage::RequestOn()
{
m_bOnReq = true;
}
void
CTxManage::RequestOff()
{
m_bOffReq = true;
}
void
CTxManage::Copy(CFrame& ref)
{
m_Frame = ref;
}
bool
CTxManage::isBusy()
{
return m_nStartTime != 0;
}
void
CTxManage::Send(unsigned long timenow, bool self)
{
if(timenow == 0)
timenow++;
m_nStartTime = timenow;
m_bSelf = self;
m_bTxPending = true;
}
void
CTxManage::Tick(unsigned long timenow)
{
if(m_nStartTime) {
long diff = timenow - m_nStartTime;
if(diff > m_nStartDelay) {
// begin front porch of Tx gating pulse
digitalWrite(m_nTxEnbPin, HIGH);
}
if(m_bTxPending && (diff > (m_nStartDelay + m_nFrontPorch))) {
// begin serial transmission
m_bTxPending = false;
_send();
}
if(diff > (m_nStartDelay + m_nFrameTime)) {
// conclude Tx gating
m_nStartTime = 0;
digitalWrite(m_nTxEnbPin, LOW);
}
}
}
void
CTxManage::_send()
{
if(m_bSelf) {
m_Frame.Data[0] = 0x76; // required for heater to use the max min information
m_Frame.Data[1] = 0x16;
m_Frame.setTemperature_Desired(35);
m_Frame.setTemperature_Actual(22);
m_Frame.Tx.OperatingVoltage = 120;
m_Frame.setPump_Min(16);
m_Frame.setPump_Max(55);
m_Frame.setFan_Min(1680);
m_Frame.setFan_Max(4500);
}
else {
m_Frame.Data[0] = 0x78; // this prevents the controller trying to show bum information, heater uses controller max/min settings
}
if(m_bOnReq) {
m_bOnReq = false;
m_Frame.Tx.Command = 0xa0;
}
else if(m_bOffReq) {
m_bOffReq = false;
m_Frame.Tx.Command = 0x05;
}
else {
m_Frame.Tx.Command = 0x00;
}
m_Frame.setCRC();
// send to heater - using binary
for(int i=0; i<24; i++) {
m_Serial.write(m_Frame.Data[i]); // write native binary values
}
Report();
}
void
CTxManage::Report()
{
SerialReport("Self ", m_Frame.Data, " ");
}