半导体:Gem/Secs基本协议库的开发(3)

2023-12-15 21:36

本文主要是介绍半导体:Gem/Secs基本协议库的开发(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

接着上一篇《半导体:Gem/Secs基本协议库的开发(2)》继续,模拟工具延到下一篇,别催!

【codes】

//hsmsmessageheader.h
/*****************************************         HsmsMessageHeader****************************************/#ifndef HSMSMESSAGEHEADER_H
#define HSMSMESSAGEHEADER_H#include "JcHsms.h"class JCHSMS_EXPORT HsmsMessageHeader
{
public:HsmsMessageHeader();  // originateHsmsMessageHeader(uint16_t sessionID, uint8_t stream, uint8_t function,uint8_t ptype, uint8_t stype,  uint32_t systembytes);HsmsMessageHeader(QByteArray source); // interpretQByteArray 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 bytesuint8_t m_stream;               /// 1 byte streamuint8_t m_function;             /// 1 byte functionuint8_t m_stype;                /// 1 byte stypeuint8_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_ENDIANfor(int i = 0; i < 4;i++) len += (lenA[i] << ((3-i)*8 ));
#elsefor(int i = 0; i < 4;i++)  len += (lenA[i] << (i*8 ));
#endifreturn 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_ENDIANm_source[0] = static_cast<char>( (id >> 8) & 0xff); //header byte 0m_source[1] = static_cast<char>( (id >> 0) & 0xff); //header byte 1
#elsem_source[1] = static_cast<char>( (id >> 8) & 0xff); //header byte 1m_source[0] = static_cast<char>( (id >> 0) & 0xff); //header byte 0
#endifm_sessionID = id;
}void HsmsMessageHeader::SetStreamFunction(uint8_t stream, uint8_t function)
{m_source[2] = static_cast<char>(stream);   //header byte 2m_source[3] = static_cast<char>(function); //header byte 3m_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 4m_source[5] = static_cast<char>(stype);  //header byte 5m_ptype = ptype;m_stype = stype;
}void HsmsMessageHeader::SetSystemBytes(uint32_t systemByte)
{m_source[6] = static_cast<uchar>( (systemByte >> 24) & 0xff); //header byte 6m_source[7] = static_cast<uchar>( (systemByte >> 16) & 0xff); //header byte 7m_source[8] = static_cast<uchar>( (systemByte >> 8 ) & 0xff); //header byte 8m_source[9] = static_cast<uchar>( (systemByte >> 0 ) & 0xff); //header byte 9m_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); // interpretQByteArray 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); // unicodevoid 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

这篇关于半导体:Gem/Secs基本协议库的开发(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/497971

相关文章

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java 枚举的基本使用方法及实际使用场景

《Java枚举的基本使用方法及实际使用场景》枚举是Java中一种特殊的类,用于定义一组固定的常量,枚举类型提供了更好的类型安全性和可读性,适用于需要定义一组有限且固定的值的场景,本文给大家介绍Jav... 目录一、什么是枚举?二、枚举的基本使用方法定义枚举三、实际使用场景代替常量状态机四、更多用法1.实现接

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1