You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
9.5 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#pragma once
#include <string>
#include "data/Data.h"
/*
* 数据帧格式定义,工厂模式实现
*/
#define FRAME_DIRECT_REQ (0x00) // 请求
#define FRAME_DIRECT_RSP (0x01) // 响应
#define FRAME_CMD_START (0x00)
#define FRAME_CMD_SET_TIME (0x01) // 设置时间
#define FRAME_CMD_GET_TIME (0x02) // 获取时间
#define FRAME_CMD_SET_SERIAL_NUMBER (0x03) // 设置出厂编号
#define FRAME_CMD_GET_SERIAL_NUMBER (0x04) // 获取出厂编号
#define FRAME_CMD_SET_DEVICE_NAME (0x05) // 设置设备名称
#define FRAME_CMD_GET_DEVICE_NAME (0x06) // 获取设备名称
#define FRAME_CMD_SET_DEVICE_NUMBER (0x07) // 设置设备编号
#define FRAME_CMD_GET_DEVICE_NUMBER (0x08) // 获取设备编号
#define FRAME_CMD_SET_LOCK_STATUS (0x09) // 设置锁定状态
#define FRAME_CMD_SET_PASSWORD (0x0A) // 设置密码
#define FRAME_CMD_SET_USAGE_COUNT (0x0B) // 设置使用次数
#define FRAME_CMD_GET_RECORD (0x0C) // 获取文件记录
#define FRAME_CMD_CLS_RECORD (0x0D) // 清除文件记录
#define FRAME_CMD_SET_PARAM_FALLBACK (0x0E) // 设置回退参数
#define FRAME_CMD_SET_OPERATOR (0x0F) // 设置操作人名
#define FRAME_CMD_GET_OPERATOR (0x10) // 获取操作人名
#define FRAME_CMD_SET_PARAM_TORQUE (0x11) // 设置扭矩模式参数
#define FRAME_CMD_SET_PARAM_BOLT (0x12) // 设置螺栓模式参数
#define FRAME_CMD_SET_PARAM_ANGLE (0x13) // 设置角度模式参数
#define FRAME_CMD_SET_PARAM_GEAR (0x14) // 设置挡位预设参数
#define FRAME_CMD_SET_PARAM_SENSOR (0x15) // 设置传感器参数
#define FRAME_CMD_MAX (0x16)
#define FRAME_TYPE(DIRECT, CMD) (((unsigned char)(DIRECT) << 7 & 0x80) | ((unsigned char)(CMD) & 0x7F))
#define FRAME_TYPE_SET_TIME_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_TIME)
#define FRAME_TYPE_SET_TIME_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_TIME)
#define FRAME_TYPE_GET_TIME_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_GET_TIME)
#define FRAME_TYPE_GET_TIME_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_GET_TIME)
#define FRAME_TYPE_SET_SERIAL_NUMBER_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_SERIAL_NUMBER)
#define FRAME_TYPE_SET_SERIAL_NUMBER_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_SERIAL_NUMBER)
#define FRAME_TYPE_GET_SERIAL_NUMBER_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_GET_SERIAL_NUMBER)
#define FRAME_TYPE_GET_SERIAL_NUMBER_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_GET_SERIAL_NUMBER)
#define FRAME_TYPE_SET_DEVICE_NAME_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_DEVICE_NAME)
#define FRAME_TYPE_SET_DEVICE_NAME_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_DEVICE_NAME)
#define FRAME_TYPE_GET_DEVICE_NAME_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_GET_DEVICE_NAME)
#define FRAME_TYPE_GET_DEVICE_NAME_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_GET_DEVICE_NAME)
#define FRAME_TYPE_SET_DEVICE_NUMBER_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_DEVICE_NUMBER)
#define FRAME_TYPE_SET_DEVICE_NUMBER_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_DEVICE_NUMBER)
#define FRAME_TYPE_GET_DEVICE_NUMBER_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_GET_DEVICE_NUMBER)
#define FRAME_TYPE_GET_DEVICE_NUMBER_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_GET_DEVICE_NUMBER)
#define FRAME_TYPE_SET_LOCK_STATUS_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_LOCK_STATUS)
#define FRAME_TYPE_SET_LOCK_STATUS_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_LOCK_STATUS)
#define FRAME_TYPE_SET_PASSWORD_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PASSWORD)
#define FRAME_TYPE_SET_PASSWORD_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PASSWORD)
#define FRAME_TYPE_SET_USAGE_COUNT_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_USAGE_COUNT)
#define FRAME_TYPE_SET_USAGE_COUNT_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_USAGE_COUNT)
#define FRAME_TYPE_GET_RECORD_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_GET_RECORD)
#define FRAME_TYPE_GET_RECORD_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_GET_RECORD)
#define FRAME_TYPE_CLS_RECORD_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_CLS_RECORD)
#define FRAME_TYPE_CLS_RECORD_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_CLS_RECORD)
#define FRAME_TYPE_SET_PARAM_FALLBACK_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_FALLBACK)
#define FRAME_TYPE_SET_PARAM_FALLBACK_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_FALLBACK)
#define FRAME_TYPE_SET_OPERATOR_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_OPERATOR)
#define FRAME_TYPE_SET_OPERATOR_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_OPERATOR)
#define FRAME_TYPE_SET_PARAM_TORQUE_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_TORQUE)
#define FRAME_TYPE_SET_PARAM_TORQUE_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_TORQUE)
#define FRAME_TYPE_SET_PARAM_BOLT_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_BOLT)
#define FRAME_TYPE_SET_PARAM_BOLT_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_BOLT)
#define FRAME_TYPE_SET_PARAM_ANGLE_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_ANGLE)
#define FRAME_TYPE_SET_PARAM_ANGLE_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_ANGLE)
#define FRAME_TYPE_SET_PARAM_GEAR_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_GEAR)
#define FRAME_TYPE_SET_PARAM_GEAR_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_GEAR)
#define FRAME_TYPE_SET_PARAM_SENSOR_REQ FRAME_TYPE(FRAME_DIRECT_REQ, FRAME_CMD_SET_PARAM_SENSOR)
#define FRAME_TYPE_SET_PARAM_SENSOR_RSP FRAME_TYPE(FRAME_DIRECT_RSP, FRAME_CMD_SET_PARAM_SENSOR)
const unsigned short FRAME_HEAD = 0x5AA5;
const unsigned short MAX_DATA_LEN = 10240;
static bool isCmdValid(unsigned char cmd) { return cmd > FRAME_CMD_START && cmd < FRAME_CMD_MAX; }
static std::string getCmdName(int cmd) {
std::string cmdName;
switch(cmd)
{
case FRAME_CMD_SET_TIME : cmdName = "设置时间"; break;
case FRAME_CMD_GET_TIME : cmdName = "获取时间"; break;
case FRAME_CMD_SET_SERIAL_NUMBER : cmdName = "设置出厂编号"; break;
case FRAME_CMD_GET_SERIAL_NUMBER : cmdName = "获取出厂编号"; break;
case FRAME_CMD_SET_DEVICE_NAME : cmdName = "设置设备名称"; break;
case FRAME_CMD_GET_DEVICE_NAME : cmdName = "获取设备名称"; break;
case FRAME_CMD_SET_DEVICE_NUMBER : cmdName = "设置设备编号"; break;
case FRAME_CMD_GET_DEVICE_NUMBER : cmdName = "获取设备编号"; break;
case FRAME_CMD_SET_LOCK_STATUS : cmdName = "设置锁定状态"; break;
case FRAME_CMD_SET_PASSWORD : cmdName = "设置密码"; break;
case FRAME_CMD_SET_USAGE_COUNT : cmdName = "设置使用次数"; break;
case FRAME_CMD_GET_RECORD : cmdName = "获取文件记录"; break;
case FRAME_CMD_CLS_RECORD : cmdName = "清除文件记录"; break;
case FRAME_CMD_SET_PARAM_FALLBACK:cmdName = "设置回退参数"; break;
case FRAME_CMD_SET_OPERATOR : cmdName = "设置操作人名"; break;
case FRAME_CMD_GET_OPERATOR : cmdName = "获取操作人名"; break;
case FRAME_CMD_SET_PARAM_TORQUE : cmdName = "设置扭矩模式参数"; break;
case FRAME_CMD_SET_PARAM_BOLT : cmdName = "设置螺栓模式参数"; break;
case FRAME_CMD_SET_PARAM_ANGLE : cmdName = "设置角度模式参数"; break;
case FRAME_CMD_SET_PARAM_GEAR : cmdName = "设置挡位预设参数"; break;
case FRAME_CMD_SET_PARAM_SENSOR : cmdName = "设置传感器参数"; break;
default : cmdName = "未知的命令"; break;
}
return cmdName;
}
class Frame
{
public:
Frame();
Frame(int cmd, int direct);
virtual ~Frame();
void updateDataType();
void updateLen();
void setHead(unsigned short head) { m_head = head; }
void setAddr(unsigned short addr) { m_addr = addr; }
void setCmd(unsigned char cmd) { m_cmd = cmd; }
void setLen(unsigned short len) { m_len = len; }
void setCrc(unsigned short crc) { m_crc = crc; }
//void setHasData(bool hasData) { m_hasData = hasData; }
void setDataType(int dataType) { m_dataType = dataType; }
void setData(Data *data);
void setDirect(int direct) { m_direct = direct; }
unsigned short getHead() { return m_head; }
unsigned short getAddr() { return m_addr; }
unsigned char getCmd() { return m_cmd; }
unsigned short getLen() { return m_len; }
unsigned short getCrc() { return m_crc; }
Data *getData() { return m_data; }
//bool getHasData() { return m_hasData; }
int getDataType() { return m_dataType; }
int getDirect() { return m_direct; }
// 帧整体转换为字符串
std::string toStr();
// 帧整体转换为Byte字符串 -- 格式固定,所以在基类中实现
std::string toByteStr();
// 帧整体转换为十六进制字符串 -- 格式固定,所以在基类中实现
std::string toHexStr();
// 从Byte字符串解析
bool fromByteStr(std::string str);
private:
void createData();
void destroyData();
private:
unsigned short m_head; // 协议头
unsigned short m_addr; // 地址
unsigned char m_cmd; // 命令
unsigned short m_len; // 长度
unsigned short m_crc;
// 数据区各不相同,在具体的类中实现
//bool m_hasData; // 是否存在数据
int m_dataType; // 数据区类型
Data *m_data; // 数据
int m_direct; // 数据发送方向0下发PC->开发板1上发开发板->PC
};