接着上一篇《半导体:Gem/Secs基本协议库的开发(2)》继续,模拟工具延到下一篇,别催!
//hsmsmessageheader.h
/****************************************
* HsmsMessageHeader
****************************************/
#ifndef HSMSMESSAGEHEADER_H
#define HSMSMESSAGEHEADER_H
#include "JcHsms.h"
class JCHSMS_EXPORT HsmsMessageHeader
{
public:
HsmsMessageHeader(); // originate
HsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,
uint8_t ptype, uint8_t stype, uint32_t systembytes);
HsmsMessageHeader(QByteArray source); // interpret
QByteArray toByteArray();
QByteArray toByteArray(uint16_t sessionID,uint8_t stream,uint8_t function,
uint8_t ptype,uint8_t stype,uint32_t systembytes);
uint16_t GetSessionID();
uint8_t Getstream();
uint8_t Getfunction();
uint8_t GetpType();
uint8_t GetsType();
uint32_t GetSystemBytes();
MessageType GetMessageType();
static uint16_t GetSessionID(const QByteArray& source);
static uint8_t Getstream(const QByteArray& source);
static uint8_t Getfunction(const QByteArray& source);
static uint8_t GetpType(const QByteArray& source);
static uint8_t GetsType(const QByteArray& source);
static uint32_t GetSystemBytes(const QByteArray& source);
static MessageType GetMessageType(const QByteArray& source);
void SetSessionID(uint16_t id);
void SetStreamFunction(uint8_t stream, uint8_t function);
void SetWBit(WBit bit);
void SetPSType(uint8_t ptype, uint8_t stype);
void SetSystemBytes(uint32_t systemByte);
uint32_t uniqueSystemBytes();
public:
static uint32_t m_systembytes; /// 4 bytes SystemBytes.
static uint32_t SystemBytes_counter;
private:
QByteArray m_source; /// 10 bytes.fixed.
uint16_t m_sessionID; /// 2 bytes
uint8_t m_stream; /// 1 byte stream
uint8_t m_function; /// 1 byte function
uint8_t m_stype; /// 1 byte stype
uint8_t m_ptype; /// 1 byte ptype
};
#endif // HSMSMESSAGEHEADER_H
// hsmsmessageheader.cpp
/******************************************************************************
* HsmsMessageHeader
******************************************************************************/
#include "hsmsmessageheader.h"
uint32_t HsmsMessageHeader::m_systembytes = 0;
uint32_t HsmsMessageHeader::SystemBytes_counter = 0;
/*!
* \brief The HsmsMessageHeader struct
* 10 bytes message header
* segment ==>|session id | stream | function | pType | SType | system bytes |
* |hDev |lDev |------------------------------------| source num | transaction num |
* bytes ==>| 2 | 1 | 1 | 1 | 1 | 4 |
*/
HsmsMessageHeader::HsmsMessageHeader()
{
m_source.resize(10);
}
HsmsMessageHeader::HsmsMessageHeader(QByteArray source)
{
assert(m_source.length() != HSMS_MESSAGEHEADER_LEN);
m_source.resize(10);
m_source = source;
m_sessionID = GetSessionID(source);
m_stream = Getstream(source);
m_function = Getfunction(source);
m_stype = GetsType(source);
m_ptype = GetpType(source);
m_systembytes = GetSystemBytes(source);
}
HsmsMessageHeader::HsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,
uint8_t ptype, uint8_t stype, uint32_t systembytes)
{
m_sessionID = sessionID;
m_stream = stream;
m_function = function;
m_stype = stype;
m_ptype = ptype;
m_systembytes = systembytes;
m_source.resize(10);
toByteArray();
}
QByteArray HsmsMessageHeader::toByteArray()
{
SetSessionID(m_sessionID);
SetStreamFunction(m_stream,m_function);
SetPSType(m_ptype,m_stype);
SetSystemBytes(m_systembytes);
return m_source;
}
QByteArray HsmsMessageHeader::toByteArray(uint16_t sessionID, uint8_t stream,
uint8_t function, uint8_t ptype,
uint8_t stype , uint32_t systembytes)
{
SetSessionID(sessionID);
SetStreamFunction(stream,function);
SetPSType(ptype,stype);
SetSystemBytes(systembytes);
return m_source;
}
uint16_t HsmsMessageHeader::GetSessionID()
{
return m_sessionID;
}
uint8_t HsmsMessageHeader::Getstream()
{
return m_stream;
}
uint8_t HsmsMessageHeader::Getfunction()
{
return m_function;
}
uint8_t HsmsMessageHeader::GetpType()
{
return m_ptype;
}
uint8_t HsmsMessageHeader::GetsType()
{
return m_stype;
}
uint32_t HsmsMessageHeader::GetSystemBytes()
{
return m_systembytes;
}
MessageType HsmsMessageHeader::GetMessageType()
{
if(m_source.size() < 10)
{
return ErrorMessageType;
}
if( GetpType() != 0)
{
return ErrorMessageType;
}
if( Getstream() & ( !GetsType() ) )
{
return DataMessage;
}
if( GetsType() >= 0 && GetsType() < 10)
{
return static_cast<MessageType>(GetsType());
}
else
{
return ErrorMessageType;
}
}
uint16_t HsmsMessageHeader::GetSessionID(const QByteArray &source)
{
uint16_t id = static_cast<uint16_t>(source.at(0));
id = (id << 8) + static_cast<uint16_t>(source.at(1));
return id;
}
uint8_t HsmsMessageHeader::Getstream(const QByteArray &source)
{
return static_cast<uint8_t>(source.at(2) & 0b01111111);
}
uint8_t HsmsMessageHeader::Getfunction(const QByteArray &source)
{
return static_cast<uint8_t>(source.at(3));
}
uint8_t HsmsMessageHeader::GetpType(const QByteArray &source)
{
return static_cast<uint8_t>(source.at(4));
}
uint8_t HsmsMessageHeader::GetsType(const QByteArray &source)
{
return static_cast<uint8_t>(source.at(5));
}
uint32_t HsmsMessageHeader::GetSystemBytes(const QByteArray &source)
{
uint32_t lenA[4] = {
0};
uint32_t len = 0;
lenA[0] = static_cast<uint32_t>(source.at(6));
lenA[1] = static_cast<uint32_t>(source.at(7));
lenA[2] = static_cast<uint32_t>(source.at(8));
lenA[3] = static_cast<uint32_t>(source.at(9));
#if ENDIAN == LITTLE_ENDIAN
for(int i = 0; i < 4;i++) len += (lenA[i] << ((3-i)*8 ));
#else
for(int i = 0; i < 4;i++) len += (lenA[i] << (i*8 ));
#endif
return len;
}
MessageType HsmsMessageHeader::GetMessageType(const QByteArray &source)
{
if(source.size() < 10)
{
return ErrorMessageType;
}
if( GetpType(source) != 0)
{
return ErrorMessageType;
}
if( Getstream(source) & ( !GetsType(source) ) )
{
return DataMessage;
}
if( GetsType(source) >= 0 && GetsType(source) < 10)
{
return static_cast<MessageType>(GetsType(source));
}
else
{
return ErrorMessageType;
}
}
void HsmsMessageHeader::SetSessionID(uint16_t id)
{
#if ENDIAN == LITTLE_ENDIAN
m_source[0] = static_cast<char>( (id >> 8) & 0xff); //header byte 0
m_source[1] = static_cast<char>( (id >> 0) & 0xff); //header byte 1
#else
m_source[1] = static_cast<char>( (id >> 8) & 0xff); //header byte 1
m_source[0] = static_cast<char>( (id >> 0) & 0xff); //header byte 0
#endif
m_sessionID = id;
}
void HsmsMessageHeader::SetStreamFunction(uint8_t stream, uint8_t function)
{
m_source[2] = static_cast<char>(stream); //header byte 2
m_source[3] = static_cast<char>(function); //header byte 3
m_stream = stream;
m_function = function;
}
void HsmsMessageHeader::SetWBit(WBit bit)
{
uint8_t f = Getfunction();
uint8_t s = Getstream();
if(bit == NeedReply){
s = s | 0b10000000;
}
else{
s = s & 0b01111111;
}
SetStreamFunction(s, f);
}
void HsmsMessageHeader::SetPSType(uint8_t ptype, uint8_t stype)
{
m_source[4] = static_cast<char>(ptype); //header byte 4
m_source[5] = static_cast<char>(stype); //header byte 5
m_ptype = ptype;
m_stype = stype;
}
void HsmsMessageHeader::SetSystemBytes(uint32_t systemByte)
{
m_source[6] = static_cast<uchar>( (systemByte >> 24) & 0xff); //header byte 6
m_source[7] = static_cast<uchar>( (systemByte >> 16) & 0xff); //header byte 7
m_source[8] = static_cast<uchar>( (systemByte >> 8 ) & 0xff); //header byte 8
m_source[9] = static_cast<uchar>( (systemByte >> 0 ) & 0xff); //header byte 9
m_systembytes = systemByte;
}
uint32_t HsmsMessageHeader::uniqueSystemBytes()
{
SystemBytes_counter ++;
uint32_t timeDate = QDateTime::currentDateTime().toTime_t(); // 获取当前时间,将当前时间转为时间戳
m_systembytes = timeDate<<4;
m_systembytes += SystemBytes_counter%16;
return m_systembytes;
}
// secs2item.h
/****************************************
* Secs2Item
****************************************
* ItemHeader | Item Body |
* format_lenbytes | Len | context |
* format|len bytes| Len | context |
****************************************/
#ifndef SECS2ITEM_H
#define SECS2ITEM_H
#include "JcHsms_global.h"
class JCHSMS_EXPORT Secs2Item
{
public:
Secs2Item() {
}
Secs2Item(QString name);
Secs2Item(ItemFormatCode format,QVariant val);
Secs2Item(QByteArray source); // interpret
QByteArray toByteArray() const;
int format() const;
bool isEmpty() const;
static int format(const QByteArray &array);
static bool isValidFormat(ItemFormatCode format);
static int itemHeaderSize(const QByteArray &array);
static int bytes(const QByteArray& array);
const int bytes() const;
QByteArray itemHeader() const;
QByteArray itemBody() const;
QByteArray itemDataAll() const;
int buildItemHeader();
void AddBinary(const QByteArray& x);
void AddASCII(QString str);
void AddASCII(const char* str,int len);
void AddJIS8(const char * str); // unicode
void AddBoolean(const bool x);
void AddBoolean(const bool x[], int N);
void AddInt8(const int8_t x);
void AddInt8(const int8_t x[], int N);
void AddInt8