#pragma once #include namespace iflytop { namespace zcr { #pragma pack(push, 1) typedef struct { uint8_t packetType; uint16_t cmdid; uint8_t moduleId; uint8_t index; uint8_t datalen; uint8_t data[]; /* int8_t checksum;*/ } zcr_cmd_header_t; #pragma pack(pop) typedef enum { kptv2_cmd = 0xA0, kptv2_ack = 0xA1, kptv2_error_ack = 0xA2, kptv2_event = 0xA3, } zcan_cmd_packet_type_t; static inline bool zcr_cmd_checkpacket(const zcr_cmd_header_t* header, int len) { if (len < sizeof(zcr_cmd_header_t)) { return false; } if ((header->datalen + sizeof(zcr_cmd_header_t) + 1) != len) { return false; } uint8_t* rawpacket = (uint8_t*)header; uint8_t checksum = 0; for (int i = 0; i < len - 1; i++) { checksum += rawpacket[i]; } if (checksum != rawpacket[len - 1]) { return false; } return true; } } // namespace zcr } // namespace iflytop