59 lines
1.2 KiB
C++
59 lines
1.2 KiB
C++
#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;
|
|
}
|
|
|