GrpcPrint/PrintS/Communication/TempCtrlClient.cpp
2024-03-19 17:45:12 +08:00

109 lines
3.4 KiB
C++

#include "TempCtrlClient.h"
#include "Aibus.h"
#include <bitset>
#include "../SystemInfo.h"
//#include "../config/ConfigManager.h"
//#include "../global.h"
TempCtrlClient::TempCtrlClient(CommunicationCfg* pconfig):TcpClient(pconfig)
{
}
TempCtrlClient::~TempCtrlClient()
{
Shutdown();
}
void TempCtrlClient::InitCommand()
{
Command* pCommand = new Aibus(READ_FLOAT_POINT, m_Config->m_Addr, 0x0c, 0, true);
pCommand->m_Fun = &TempCtrlClient::ProcTempInfo;
pCommand->m_Ref = this;
pCommand->isNeedDel = false;
m_CycleCommands.push_back(pCommand);
}
void TempCtrlClient::SetTargeValue(float value)
{
EnterCriticalSection(&m_RtcCS);
float targevalue = value*m_Stat.scale;
Command* pCommand = new Aibus(SET_TARGE_VALUE, 0x1, 0x0, (short)targevalue, false);
pCommand->m_Fun = &TempCtrlClient::ProcSetTemp;
pCommand->m_Ref = this;
m_RTCommands.push(pCommand);
LeaveCriticalSection(&m_RtcCS);
}
void TempCtrlClient::ProcTempInfo(void* pobject, Command* pcommand)
{
if (pobject == NULL)return;
TempCtrlClient* pTc = (TempCtrlClient*)pobject;
unsigned char* rseq = pcommand->m_RespSeq;
short floatPoint = (short)(rseq[7] << 8) + rseq[6];
if (floatPoint >= 128)floatPoint %= 128;
int scale = 1;
for (short i = 0; i < floatPoint; ++i) {
scale *= 10;
}
EnterCriticalSection(&pTc->m_ValueCS);
pTc->m_Stat.scale = scale;
pTc->m_Stat.measuredValue = (float)((short)(rseq[1] << 8) + rseq[0]) / scale;
pTc->m_Stat.settingValue = (float)((short)(rseq[3] << 8) + rseq[2]) / scale;
pTc->m_Stat.outputValue = rseq[4];
bitset<8> bitStatus(rseq[5]);
pTc->m_Stat.alarm.isOverLimit = bitStatus[0];
pTc->m_Stat.alarm.isLowerLimit = bitStatus[1];
pTc->m_Stat.alarm.isActiveAlarm = bitStatus[2];
pTc->m_Stat.alarm.isInactiveAlarm = bitStatus[3];
pTc->m_Stat.alarm.isInputLimit = bitStatus[4];
pTc->m_Stat.alarm.al1 = bitStatus[5];
pTc->m_Stat.alarm.al2 = bitStatus[6];
EnterCriticalSection(&g_SystemInfo->m_InfoCs);
g_SystemInfo->m_PlatformTemp = pTc->m_Stat.measuredValue;
g_SystemInfo->m_PlatformTempSettingValue = pTc->m_Stat.settingValue;
LeaveCriticalSection(&g_SystemInfo->m_InfoCs);
LeaveCriticalSection(&pTc->m_ValueCS);
}
void TempCtrlClient::ProcSetTemp(void* pobject, Command* pcommand)
{
if (pobject == NULL)return;
TempCtrlClient* pTc = (TempCtrlClient*)pobject;
unsigned char* rseq = pcommand->m_RespSeq;
float fvalue = 0;
EnterCriticalSection(&pTc->m_ValueCS);
int scale = (pTc->m_Stat.scale == 0 ? 1 : pTc->m_Stat.scale);
fvalue = (float)((short)(rseq[7] << 8) + rseq[6]) / scale;
pTc->m_Stat.measuredValue = (float)((short)(rseq[1] << 8) + rseq[0]) / scale;
pTc->m_Stat.settingValue = (float)((short)(rseq[3] << 8) + rseq[2]) / scale;
pTc->m_Stat.outputValue = rseq[4];
bitset<8> bitStatus(rseq[5]);
pTc->m_Stat.alarm.isOverLimit = bitStatus[0];
pTc->m_Stat.alarm.isLowerLimit = bitStatus[1];
pTc->m_Stat.alarm.isActiveAlarm = bitStatus[2];
pTc->m_Stat.alarm.isInactiveAlarm = bitStatus[3];
pTc->m_Stat.alarm.isInputLimit = bitStatus[4];
pTc->m_Stat.alarm.al1 = bitStatus[5];
pTc->m_Stat.alarm.al2 = bitStatus[6];
LeaveCriticalSection(&pTc->m_ValueCS);
}
void TempCtrlClient::GetStat(TempStat& stat)
{
EnterCriticalSection(&m_ValueCS);
memcpy_s(&stat.alarm, sizeof(TempAlarm), &m_Stat.alarm, sizeof(TempAlarm));
stat.baseStat = m_BaseStat;
stat.measuredValue = m_Stat.measuredValue;
stat.outputValue = m_Stat.outputValue;
stat.scale = m_Stat.scale;
stat.settingValue = m_Stat.settingValue;
LeaveCriticalSection(&m_ValueCS);
}