#pragma once
#include "ISourcePort.hpp"
#include <sstream>
namespace libobsensor {
namespace protocol {
#define HP_REQUEST_MAGIC 0x4d47
#define HP_RESPONSE_MAGIC 0x4252
#define HP_REQ_HEADER_SIZE sizeof(ReqHeader)
#define HP_RESP_HEADER_SIZE sizeof(RespHeader)
#define HP_NOT_READY_RETRIES 2
enum HpOpCodes {
OPCODE_GET_PROPERTY = 1,
OPCODE_SET_PROPERTY = 2,
OPCODE_GET_STRUCTURE_DATA = 3,
OPCODE_SET_STRUCTURE_DATA = 4,
OPCODE_HEARTBEAT_AND_STATE = 5,
OPCODE_INIT_READ_RAW_DATA = 17,
OPCODE_READ_RAW_DATA = 18,
OPCODE_FINISH_READ_RAW_DATA = 19,
OPCODE_GET_COMMAND_VERSION_V1_1 = 26, OPCODE_GET_STRUCTURE_DATA_V1_1 = 27, OPCODE_SET_STRUCTURE_DATA_V1_1 = 28,
OPCODE_INIT_READ_STRUCT_DATA_LIST_V1_1 = 29, OPCODE_READ_STRUCT_DATA_LIST_V1_1 = 30, OPCODE_FINISH_READ_STRUCT_DATA_LIST_V1_1 = 31, OPCODE_INIT_WRITE_STRUCT_DATA_LIST_V1_1 = 32, OPCODE_WRITE_STRUCT_DATA_LIST_V1_1 = 33, OPCODE_FINISH_WRITE_STRUCT_DATA_LIST_V1_1 = 34, OPCODE_GET_PROTOCOL_VERSION = 0xfe, };
enum HpStatusCode {
HP_STATUS_OK = 0,
HP_STATUS_NO_DEVICE_FOUND,
HP_STATUS_CONTROL_TRANSFER_FAILED, HP_STATUS_DATA_TRANSFER_BUSY,
HP_STATUS_REQUEST_DATA_SIZE_ERROR,
HP_STATUS_DEVICE_RESPONSE_BAD_MAGIC,
HP_STATUS_DEVICE_RESPONSE_WRONG_ID,
HP_STATUS_DEVICE_RESPONSE_WRONG_OPCODE,
HP_STATUS_DEVICE_RESPONSE_WRONG_DATA_SIZE,
HP_STATUS_DEVICE_RESPONSE_ERROR, HP_STATUS_DEVICE_RESPONSE_WARNING, HP_STATUS_DEVICE_RESPONSE_ERROR_UNKNOWN, HP_STATUS_DEVICE_RESPONSE_DATA_SIZE_ERROR, HP_STATUS_DEVICE_RESPONSE_CMD_VERSION_UNMATCHED,
HP_STATUS_UNKNOWN_ERROR = 0xffff,
};
enum HpRespErrorCode {
HP_RESP_OK = 0,
HP_RESP_ERROR_INVALID_REQUEST = 0x0001,
HP_RESP_ERROR_UNSUPPORTED_REQUEST = 0x0002,
HP_RESP_ERROR_DEVICE_BUSY = 0x0003,
HP_RESP_ERROR_ACCESS_FORBIDDEN = 0x0004,
HP_RESP_WARNING_REPETITIVE_REQUEST = 0x8000,
HP_RESP_ERROR_UNKNOWN = 0xffff,
};
struct HpStatus {
HpStatusCode statusCode = HP_STATUS_OK;
HpRespErrorCode respErrorCode = HP_RESP_OK;
std::string msg;
};
inline std::ostream &operator<<(std::ostream &os, const HpStatus &s) {
return (os << "HpStatusCode: " << s.statusCode << ", respErrorCode: " << s.respErrorCode << ", msg: " << s.msg);
}
#pragma pack(push, 1)
typedef struct {
uint16_t magic;
uint16_t sizeInHalfWords; uint16_t opcode;
uint16_t requestId;
} ReqHeader;
typedef struct {
uint16_t magic;
uint16_t sizeInHalfWords; uint16_t opcode;
uint16_t requestId; uint16_t errorCode;
} RespHeader;
typedef struct {
ReqHeader header;
uint32_t propertyId;
} GetPropertyReq;
typedef struct {
int32_t cur; int32_t max;
int32_t min;
int32_t def;
int32_t step;
} PropertyData;
typedef struct {
RespHeader header;
PropertyData data;
} GetPropertyResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
int32_t value; } SetPropertyReq;
typedef struct {
RespHeader header;
} SetPropertyResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
} GetStructureDataReq;
typedef struct {
RespHeader header;
uint8_t data[1];
} GetStructureDataResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
uint8_t data[1];
} SetStructureDataReq;
typedef struct {
RespHeader header;
} SetStructureDataResp;
typedef struct {
ReqHeader header;
uint8_t data[1];
} GetCmdVerDataResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
uint16_t cmdVer;
uint8_t data[1];
} SetStructureDataReqV1_1;
typedef struct {
RespHeader header;
} SetStructureDataRespV1_1;
typedef struct {
ReqHeader header;
uint32_t propertyId;
} GetStructureDataReqV1_1;
typedef struct {
RespHeader header;
uint16_t cmdVer;
uint8_t data[1];
} GetStructureDataRespV1_1;
typedef struct {
ReqHeader header;
uint32_t propertyId;
} StartGetStructureDataListReq;
typedef struct {
RespHeader header;
uint16_t cmdVer;
uint32_t dataSize;
} StartGetStructureDataListResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
uint32_t offset;
uint32_t size;
} GetStructureDataListReq;
typedef struct {
RespHeader header;
uint16_t cmdVer;
uint32_t dataSize;
} GetStructureDataListResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
} FinishGetStructureDataListReq;
typedef struct {
RespHeader header;
} FinishGetStructureDataListResp;
typedef struct {
ReqHeader header;
uint32_t propertyId;
uint32_t offset;
uint32_t size;
} ReadRawDataReq;
typedef struct {
RespHeader header;
uint8_t data[1];
} ReadRawDataResp;
typedef struct {
RespHeader header;
uint32_t dataSize;
} GetRawDataLengthResp;
typedef struct {
ReqHeader header;
} HeartbeatAndStateReq;
typedef struct {
RespHeader header;
uint64_t state;
char message[1];
} HeartbeatAndStateResp;
#pragma pack(pop)
GetPropertyReq *initGetPropertyReq(uint8_t *dataBuf, uint32_t propertyId);
SetPropertyReq *initSetPropertyReq(uint8_t *dataBuf, uint32_t propertyId, uint32_t value);
GetStructureDataReq *initGetStructureDataReq(uint8_t *dataBuf, uint32_t propertyId);
SetStructureDataReq *initSetStructureDataReq(uint8_t *dataBuf, uint32_t propertyId, const uint8_t *data, uint16_t dataSize);
GetPropertyReq *initGetCmdVersionReq(uint8_t *dataBuf, uint32_t propertyId);
GetStructureDataReqV1_1 *initGetStructureDataReqV1_1(uint8_t *dataBuf, uint32_t propertyId);
SetStructureDataReqV1_1 *initSetStructureDataReqV1_1(uint8_t *dataBuf, uint32_t propertyId, uint16_t cmdVer, const uint8_t *data, uint16_t dataSize);
StartGetStructureDataListReq *initStartGetStructureDataListReq(uint8_t *dataBuf, uint32_t propertyId);
GetStructureDataListReq *initGetStructureDataListReq(uint8_t *dataBuf, uint32_t propertyId, uint32_t offset, uint32_t dataSize);
FinishGetStructureDataListReq *initFinishGetStructureDataListReq(uint8_t *dataBuf, uint32_t propertyId);
GetPropertyReq *initGetRawDataLengthReq(uint8_t *dataBuf, uint32_t propertyId, uint32_t cmd);
ReadRawDataReq *initReadRawDataReq(uint8_t *dataBuf, uint32_t propertyId, uint32_t offset, uint32_t size);
HeartbeatAndStateReq *initHeartbeatAndStateReq(uint8_t *dataBuf);
GetPropertyResp *parseGetPropertyResp(uint8_t *dataBuf, uint16_t dataSize);
SetPropertyResp *parseSetPropertyResp(uint8_t *dataBuf, uint16_t dataSize);
GetStructureDataResp *parseGetStructureDataResp(uint8_t *dataBuf, uint16_t dataSize);
int16_t getStructureDataSize(const GetStructureDataResp *resp);
GetStructureDataRespV1_1 *parseGetStructureDataRespV1_1(uint8_t *dataBuf, uint16_t dataSize);
SetStructureDataRespV1_1 *parseSetStructureDataRespV1_1(uint8_t *dataBuf, uint16_t dataSize);
int16_t getStructureDataSizeV1_1(const GetStructureDataRespV1_1 *resp);
SetStructureDataResp *parseSetStructureDataResp(uint8_t *dataBuf, uint16_t dataSize);
GetCmdVerDataResp *parseGetCmdVerDataResp(uint8_t *dataBuf, uint16_t dataSize);
GetRawDataLengthResp *parseGetRawDataLengthResp(uint8_t *dataBuf, uint16_t dataSize);
ReadRawDataResp *parseReadRawDataResp(uint8_t *dataBuf, uint16_t dataSize);
StartGetStructureDataListResp *parseStartStructureDataListResp(uint8_t *dataBuf, uint16_t dataSize);
HeartbeatAndStateResp *parseHeartbeatAndStateResp(uint8_t *dataBuf, uint16_t dataSize);
HpStatus execute(const std::shared_ptr<IVendorDataPort> &dataPort, uint8_t *reqData, uint16_t reqDataSize, uint8_t *respData, uint16_t *respDataSize);
bool checkStatus(HpStatus stat, bool throwException = true);
} }