|
@@ -0,0 +1,260 @@
|
|
|
+#include <DeviceGasV1.hpp>
|
|
|
+
|
|
|
+namespace gsd
|
|
|
+{
|
|
|
+ #define DATA_HEAD (0x40) // 数据头
|
|
|
+ //控制设备类型
|
|
|
+ // device_TYPE
|
|
|
+ #define DEVICE_TYPE_ID (0x05) // 煤气炮
|
|
|
+
|
|
|
+ // 命令类型
|
|
|
+ // msgId
|
|
|
+ #define MSG_ID_COMMAND (0x08) //命令
|
|
|
+ #define MSG_ID_INQUIRE (0x04) //查询
|
|
|
+ #define MSG_ID_DEPLOY (0x03) //配置
|
|
|
+ #define MSG_ID_COMMAND_ACK (0X09) //命令应答
|
|
|
+ #define MSG_ID_INQUIRE_ACK (0X0A) //查询应答
|
|
|
+ #define MSG_ID_DEPLOY_ACK (0x0b) //配置应答
|
|
|
+
|
|
|
+ //data
|
|
|
+ #define DATA_FIRE (0x55)//开启
|
|
|
+ #define DATA_STOP (0xAA)//停止
|
|
|
+ #define DATA_INQUIRE (0xAB)//查询监控数据
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 序列化
|
|
|
+ * @param {ControlerMsg} gasV1Control
|
|
|
+ * @param {char} *data
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ void DeviceGasV1::serialization(const ControlerMsg gasControl,char *data){
|
|
|
+ data[0] = DATA_HEAD;
|
|
|
+ data[1] = 0x23;
|
|
|
+ data[2] = 0x24;
|
|
|
+ data[3] = DEVICE_TYPE_ID;
|
|
|
+ data[4] = gasControl.deviceId;
|
|
|
+ data[5] = gasControl.msgId;
|
|
|
+ data[6] = gasControl.data;
|
|
|
+ if(gasControl.msgId == MSG_ID_COMMAND){
|
|
|
+ data[7] = 0xb3;
|
|
|
+ data[8] = 0xff;
|
|
|
+ }else if(gasControl.msgId == MSG_ID_INQUIRE){
|
|
|
+ data[7] = 0xAA;
|
|
|
+ data[8] = 0xAA;
|
|
|
+ }
|
|
|
+ data[9] = LRC_check((unsigned char *)data, 9);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 反序列化
|
|
|
+ * @param {uint8_t} *data
|
|
|
+ * @param {int} len
|
|
|
+ * @param {int} &msg_id
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ bool DeviceGasV1::deserialization(const uint8_t *data, int len, int &msg_id){
|
|
|
+ if(data[0] != DATA_HEAD && data[1] != 0x23 && data[2] != 0x24 && data[3] != DEVICE_TYPE_ID) return false;
|
|
|
+ if(DeviceGasV1::LRC_check((unsigned char *)data, len - 1) != data[len - 1]) return false;
|
|
|
+ setDeviceId(std::to_string(data[4]));
|
|
|
+ if(data[5] == 0x00){
|
|
|
+ msg_id = data[6];
|
|
|
+ switch (msg_id)
|
|
|
+ {
|
|
|
+ // 命令应答
|
|
|
+ case MSG_ID_COMMAND_ACK:
|
|
|
+ break;
|
|
|
+ // 查询应答
|
|
|
+ case MSG_ID_INQUIRE_ACK:
|
|
|
+ this->voltage = (float)data[8] + (float)(data[9]/100);
|
|
|
+ this->pressure = (float)data[10] + (float)(data[11]/100);
|
|
|
+ this->state = data[12];
|
|
|
+ break;
|
|
|
+ // 配置应答
|
|
|
+ case MSG_ID_DEPLOY_ACK:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 消费数据
|
|
|
+ * @param {uint8_t} *data
|
|
|
+ * @param {int} len
|
|
|
+ * @param {int} &msg_id
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ bool DeviceGasV1::Consumer(uint8_t *data, int len, int &msg_id)
|
|
|
+ {
|
|
|
+ bool ReceiveSuccessful = false;
|
|
|
+ for (int i = 0; i < len; i++)
|
|
|
+ {
|
|
|
+ switch(_comm.step){
|
|
|
+ case STEP_HEAD:
|
|
|
+ if(data[i] == DATA_HEAD){
|
|
|
+ _comm.data[0] = DATA_HEAD;
|
|
|
+ _comm.step = STEP_1;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STEP_1:
|
|
|
+ if(data[i] == 0x23){
|
|
|
+ _comm.data[1] = data[i];
|
|
|
+ _comm.step = STEP_2;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STEP_2:
|
|
|
+ if(data[i] == 0x24){
|
|
|
+ _comm.data[2] = data[i];
|
|
|
+ _comm.step = STEP_TYPE;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case STEP_TYPE:
|
|
|
+ _comm.data[3] = data[i];
|
|
|
+ _comm.step = STEP_ADDR;
|
|
|
+ break;
|
|
|
+ case STEP_ADDR:
|
|
|
+ _comm.data[4] = data[i];
|
|
|
+ _comm.step = STEP_COM;
|
|
|
+ break;
|
|
|
+ case STEP_COM:
|
|
|
+ _comm.data[5] = data[i];
|
|
|
+ _comm.step = STEP_ACK;
|
|
|
+ break;
|
|
|
+ case STEP_ACK:
|
|
|
+ _comm.data[6] = data[i];
|
|
|
+ _comm.step = STEP_STA;
|
|
|
+ break;
|
|
|
+ case STEP_STA:
|
|
|
+ _comm.data[7] = data[i];
|
|
|
+ _comm.step = STEP_DATA;
|
|
|
+ _comm.dataCount = 8;
|
|
|
+ break;
|
|
|
+ case STEP_DATA:
|
|
|
+ _comm.data[_comm.dataCount++] = data[i];
|
|
|
+ if(_comm.dataCount == 40){
|
|
|
+ ReceiveSuccessful = true;
|
|
|
+ _comm.step = STEP_HEAD;
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ _comm.step = STEP_HEAD;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(!ReceiveSuccessful) return false;
|
|
|
+ return deserialization(_comm.data, _comm.dataCount, msg_id);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 打开
|
|
|
+ * @param {int} deivceId
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ int8_t DeviceGasV1::Open(std::string DeviceId, uint8_t* data, int& length){
|
|
|
+ ControlerMsg gasControl;
|
|
|
+ gasControl.deviceId = atoi(DeviceId.c_str());
|
|
|
+ gasControl.msgId = 0x00;
|
|
|
+ gasControl.data = 0x00;
|
|
|
+ length = 11;
|
|
|
+ serialization(gasControl, (char *)data);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 关闭
|
|
|
+ * @param {int} deivceId
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ int8_t DeviceGasV1::Close(std::string DeviceId, uint8_t* data, int& length){
|
|
|
+ ControlerMsg gasControl;
|
|
|
+ gasControl.deviceId = atoi(DeviceId.c_str());
|
|
|
+ gasControl.msgId = MSG_ID_COMMAND;
|
|
|
+ gasControl.data = DATA_STOP;
|
|
|
+ length = 11;
|
|
|
+ serialization(gasControl, (char *)data);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 开炮
|
|
|
+ * @param {int} deivceId
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ int8_t DeviceGasV1::Fire(std::string DeviceId, uint8_t* data, int& length){
|
|
|
+ ControlerMsg gasControl;
|
|
|
+ gasControl.deviceId = atoi(DeviceId.c_str());
|
|
|
+ gasControl.msgId = MSG_ID_COMMAND;
|
|
|
+ gasControl.data = DATA_FIRE;
|
|
|
+ length = 11;
|
|
|
+ serialization(gasControl, (char *)data);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 状态
|
|
|
+ * @param {int} deivceId
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ int8_t DeviceGasV1::Status(std::string DeviceId, uint8_t* data, int& length){
|
|
|
+ ControlerMsg gasControl;
|
|
|
+ gasControl.deviceId = atoi(DeviceId.c_str());
|
|
|
+ gasControl.msgId = MSG_ID_INQUIRE;
|
|
|
+ gasControl.data = DATA_INQUIRE;
|
|
|
+ length = 11;
|
|
|
+ serialization(gasControl, (char *)data);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 判定msg是否为status
|
|
|
+ * @param {int} &msg_id
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ bool DeviceGasV1::getStatusMsg(int &msg_id){
|
|
|
+ if(msg_id != MSG_ID_INQUIRE_ACK) return false;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: 构建设备信息
|
|
|
+ * @param {SendDevice&} sendDevice
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ void DeviceGasV1::BuildDeviceInfo(SendDevice& sendDevice){
|
|
|
+ sendDevice.deviceId = atoi(this->getDeviceId().c_str());
|
|
|
+ sendDevice.commandCode = "1";
|
|
|
+ sendDevice.status = 1;
|
|
|
+ sendDevice.workStatus = 1;
|
|
|
+ sendDevice.powerStatus = 1;
|
|
|
+ sendDevice.batteryStatus = 1;
|
|
|
+ sendDevice.num = 0;
|
|
|
+ sendDevice.oxyPressure = 0;
|
|
|
+ sendDevice.gasPressure = 0;
|
|
|
+ sendDevice.remark = "";
|
|
|
+ sendDevice.attr1 = std::to_string(this->voltage); // 电压
|
|
|
+ sendDevice.attr2 = std::to_string(this->pressure); // 声压
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * @description: LRC_check
|
|
|
+ * @param {unsigned char} *pSendBuf
|
|
|
+ * @param {unsigned char} num
|
|
|
+ * @return {*}
|
|
|
+ */
|
|
|
+ unsigned char DeviceGasV1::LRC_check(unsigned char *pSendBuf,unsigned char num)
|
|
|
+ {
|
|
|
+ char bylrc = 0,i = 0;
|
|
|
+
|
|
|
+ for(i = 0; i < num; i++)
|
|
|
+ {
|
|
|
+ bylrc += pSendBuf[i];
|
|
|
+ }
|
|
|
+ bylrc = ~bylrc;
|
|
|
+ bylrc++;
|
|
|
+
|
|
|
+ return bylrc;
|
|
|
+ }
|
|
|
+} // namespace gsd
|