#pragma once #include #include "deviceBase.h" #include "Crc.h" using namespace std; // 煤气驱鸟炮 #define EXPEL_DATA_HEAD (0xFE) // 数据头 #define EXPEL_HEART_BEAT (0x01) // 心跳 #define EXPEL_GENERAL_ACK (0X02) // 通用应答 #define EXPEL_SYS_STATE (0x14) // 获取设备信息 #define EXPEL_SYS_STATE_ACK (0X15) // 获取设备信息应答 #define EXPEL_POWER_OUTPUT_CTRL (0X16) // 电源输出控制 <-: 通用应答 #define EXPEL_POWER_OUTPUT_ON (0x01) // 电源开启 #define EXPEL_POWER_OUTPUT_OFF (0x00) // 电源关闭 #define EXPEL_BOMB_CTRL (0X17) // 煤气炮控制 <-: 通用应答 #define EXPEL_BOMB_ON (0X01) // 煤气炮开炮 #define EXPEL_GET_BOMB_STATE (0X18) // 获取开炮结果 #define EXPEL_GET_BOMB_STATE_ACK (0X19) // 煤气炮开炮应答 <-:通用应答(因为状态为阶段状态,过时会丢失状态。需确认应答收到,未收到应带会重传3次 typedef struct{ int deviceId; uint8_t msgId; uint8_t data; }GasControl; class deviceGas:public deviceBase { private: unsigned short voltage; short current; short pressure; uint8_t power_out_state; public: deviceGas():deviceBase() { } ~deviceGas(){} void setVoltage(unsigned short Voltage){ voltage = Voltage; } void setCurent(short Current){ current = Current; } void setPressure(short Pressure){ pressure = Pressure; } void setPowerOutState(uint8_t PowerOutState){ power_out_state = PowerOutState; } unsigned short getVoltage(){ return voltage; } short getCurent(){ return current; } short getPressure(){ return pressure; } uint8_t getPowerOutState(){ return power_out_state; } void serialization(){} static void serialization(const GasControl gasControl, char* data){ data[0] = EXPEL_DATA_HEAD; data[1] = 0x01; data[2] = 0x01; data[3] = 0xAC; data[4] = (char)gasControl.deviceId; data[5] = gasControl.msgId; data[6] = gasControl.data; int16_t checksum = Crc::crc_calculate((uint8_t *)(data + 1), data[1] + 4 + 1); data[7] = (char)(checksum&0x00ff); data[8] = (char)(checksum >> 8); data[9] = 0x0D; data[10] = 0x0A; } bool deserialization(){ return true; } bool deserialization(const uint8_t *data, int len, int &msg_id){ if(data[0] != EXPEL_DATA_HEAD) return false; int16_t checksum = Crc::crc_calculate((uint8_t *)(data + 1), data[1] + 4 + 1); if(data[len - 2] != (uint8_t)(checksum&0x00ff) || data[len - 1] != (uint8_t)(checksum >> 8)){ return false; } setDeviceId(data[4]); msg_id = data[5]; if(msg_id == EXPEL_SYS_STATE_ACK){ // 获取系统状态 voltage = data[6] + (data[7]*255); current = data[8] + (data[9]*255); pressure = data[10] + (data[11]*255); power_out_state = data[12]; } return true; } };