59 lines
1.2 KiB
C++
Raw Normal View History

2024-04-18 11:59:51 +08:00
#include "Aibus.h"
Aibus::Aibus(int32_t id, uint8_t addr, uint8_t paramCode, int16_t writeValue,bool isRead)
:m_addr(addr)
,m_readFlag(0x52)
,m_writeFlag(0x43)
,m_paramCode(paramCode)
,m_writeValue(writeValue)
,m_isNeedRead(isRead)
{
m_id=id;
}
Aibus::~Aibus(void)
{
}
int Aibus::GetRequestSequence(uint8_t* bseq)
{
bseq[0]=m_addr+0x80;
bseq[1]=m_addr+0x80;
if(m_isNeedRead){
bseq[2]=m_readFlag;
bseq[3]=m_paramCode;
bseq[4]=0;
bseq[5]=0;
uint16_t sum=m_paramCode*256+m_readFlag+m_addr;
bseq[6]=(uint8_t)sum;
bseq[7]=sum>>8;
}else{
bseq[2]=m_writeFlag;
bseq[3]=m_paramCode;
bseq[4]=(uint8_t)m_writeValue;
bseq[5]=m_writeValue>>8;
uint16_t sum=m_paramCode*256+m_writeFlag+m_writeValue+m_addr;
bseq[6]=(uint8_t)sum;
bseq[7]=sum>>8;
}
return 8;
}
bool Aibus::Verify(uint8_t* rseq,int32_t datalength)
{
if(datalength !=RESPONSE_LENGTH)return false;
int16_t pv=(int16_t)(rseq[1]<<8)+rseq[0];
int16_t sv=(int16_t)(rseq[3]<<8)+rseq[2];
uint8_t mv=rseq[4];
uint8_t statue=rseq[5];
int16_t cv=(int16_t)(rseq[7]<<8)+rseq[6];
uint16_t sum=pv+sv+mv+statue*256+cv+m_addr;
uint8_t lo=(uint8_t)sum;
uint8_t hi=sum>>8;
if(rseq[8]==lo && rseq[9]==hi)return true;
else return false;
}