#include "stdafx.h" #include "DIOSBoardProtocolHelper.h" using namespace DIOS::Dev::Detail::MachineryECOM; DIOSBoardProtocolHelper *DIOSBoardProtocolHelper::m_instance = nullptr; DIOSBoardProtocolHelper::DIOSBoardProtocolHelper() :m_FrameID(0) { } DIOSBoardProtocolHelper::~DIOSBoardProtocolHelper() { } DIOSBoardProtocolHelper *DIOSBoardProtocolHelper::Instance() { if (m_instance == nullptr) { m_instance = new DIOSBoardProtocolHelper(); } return m_instance; } int DIOSBoardProtocolHelper::NextFrameID() { m_FrameID = (m_FrameID + 1) % 0xFE; return m_FrameID; } bool DIOSBoardProtocolHelper::MakeCommandPacket(FUNCTIONID Id, unsigned char *pDataBuff, unsigned int DataLen, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[20] = { 0 }; //crc校验位 //帧尾1 //帧尾2 unsigned char szTail[4] = { 0xff, PACKET_TAIL1, PACKET_TAIL2 ,0x00}; szCMD[0] = PACKET_HEAD1; //帧头1 szCMD[1] = PACKET_HEAD2; //帧头2 szCMD[2] = 5 + DataLen; //数据总长度 szCMD[3] = NextFrameID(); //数据帧ID,可与返回指令匹配 szCMD[4] = (unsigned char)OP_SET; //指令码 szCMD[5] = Id.CharPart; //func id sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail((char*)pDataBuff, DataLen); //数据数组 sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeMultiCommandPacket(FUNCTIONID Id, const char *pszContext, unsigned int PacketLen, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[20] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5 + min(200, PacketLen); szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_WRITE; szCMD[5] = Id.CharPart; sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail(pszContext, min(200, PacketLen)); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeData485WritePacket(const char *pszContext, unsigned int PacketLen, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[MAX_PATH] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5 + min(200, PacketLen); szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_WRITE;//指令码 szCMD[5] = RS232_ID_1;//接口ID sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail(pszContext, min(200, PacketLen)); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeCanWritePacket(CAN_ID id, CAN_PARAM ¶ms, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[MAX_PATH] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; auto packetLen = (unsigned char)(2 + 1 + params.candata.length()); unsigned char canHead[4] = {0}; canHead[0] = (unsigned char)((params.can_stdid >> 8) & 0xFF); canHead[1] = (unsigned char)(params.can_stdid & 0xFF); canHead[2] = params.can_dlc; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5 + min(200, packetLen); szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_WRITE;//指令码 szCMD[5] = id;//接口ID sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail((char*)canHead,3); sendPacket->AddTail((const char *)params.candata.data(), (unsigned int)params.candata.length()); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeCanSetPacket(CAN_ID id, CAN_ATTRIBUTE attr, CAN_PARAM ¶ms, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(CAN_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case CAN_ATTR_ON_OFF: { context[1] = params.can_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case CAN_ATTR_BAUD_RATE: { context[1] = params.can_baud_rate; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeReadDataPacket(FUNCTIONID Id, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[20] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5; szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_READ; szCMD[5] = Id.CharPart; sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeReadDataExPacket(FUNCTIONID Id, char *pszReq, unsigned int ReqLen, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[20] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5 + ReqLen; szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_READ; szCMD[5] = Id.CharPart; sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail(pszReq, ReqLen); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeReadResultPacket(FUNCTIONID Id, SCFPacket *sendPacket) { if (!sendPacket) { return false; } unsigned char szCMD[20] = { 0 }; unsigned char szTail[4] = { 0xFF, 0x0D, 0x0A, 0x00 }; szCMD[0] = PACKET_HEAD1; szCMD[1] = PACKET_HEAD2; szCMD[2] = 5; szCMD[3] = NextFrameID(); szCMD[4] = (unsigned char)OP_READ; szCMD[5] = Id.CharPart; sendPacket->SetPacket((char*)szCMD, 6); sendPacket->AddTail((char*)szTail, 3); return true; } bool DIOSBoardProtocolHelper::MakeGpioDOSetPacket(GPIO_DO_ID id, GPIO_DO_ATTRIBUTE attr, GPIO_DO_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(GPIO_DO_PARAM) + 4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case DO_ATTR_SET_MODE: { context[1] = param.output_mode; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DO_ATTR_SET_LEVEL: { context[1] = param.active_level; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DO_ATTR_SET_PWM_PARAM_TABLE: { memcpy(&context[1], &(param.peroid.pwmperiod_short), sizeof(unsigned short)); memcpy(&context[3], &(param.effective.pwmperiod_short), sizeof(unsigned short)); memcpy(&context[5], &(param.pwm_step.pwmstep_int), sizeof(int)); dataLen = dataLen + 8; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DO_ATTR_SET_PWM_SEPARATOR: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DO_ATTR_SET_PWM_DELETE: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DO_ATTR_SET_AUTO_UPLOAD: { context[1] = param.autoupload_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeGpioDOWritePacket(GPIO_DO_ID id, GPIO_DO_ATTRIBUTE attr, GPIO_DO_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } FUNCTIONID functionid; functionid.CharPart = (unsigned char)id; char context[2] = { 0 }; context[0] = param.active_level; return DIOSBoardProtocolHelper::Instance()->MakeMultiCommandPacket(functionid, context, 1, sendPacket); } bool DIOSBoardProtocolHelper::MakeGpioDISetPacket(GPIO_DI_ID id, GPIO_DI_ATTRIBUTE attr, GPIO_DI_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(GPIO_DI_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case DI_ATTR_SET_MODE: { context[1] = param.input_mode; dataLen = dataLen + 1; if (param.input_mode == GIM_DIGITAL) { context[2] = param.filter_time; dataLen = dataLen + 1; } ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_LEVEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_COUNT_CLEAR: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_AUTO_UPLOAD: { context[1] = param.autoupload_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH1: { context[1] = param.ch_associate_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH1_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH1_ATTR: { context[1] = param.trigger_level; context[2] = param.associate_ch_action; dataLen = dataLen + 2; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH2: { context[1] = param.ch_associate_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH2_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_ASSOCIATE_CH2_ATTR: { context[1] = param.trigger_level; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case DI_ATTR_SET_DELETE_ENCODER: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeADSetPacket(AD_ID id, AD_ATTRIBUTE attr, AD_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(AD_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case AD_ATTR_ON_OFF: { context[1] = param.ad_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_AUTO_UPLOAD: { context[1] = param.auto_upload_value.auto_upload_value_btye.auto_upload_value_lowbyte; context[2] = param.auto_upload_value.auto_upload_value_btye.auto_upload_value_highbyte; dataLen = dataLen + 2; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_AUTO_UPLOAD_CLEAR_TABLE: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH1: { context[1] = param.associate_ch_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH1_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH2: { context[1] = param.associate_ch_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH2_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH1_TABLE_SET: { context[1] = param.associate_value.associate_value_btye.associate_value_lowbyte; context[2] = param.associate_value.associate_value_btye.associate_value_highbyte; context[3] = param.peroid.pwmperiod_byte.pwmperiod_lowbyte; context[4] = param.peroid.pwmperiod_byte.pwmperiod_highbyte; context[5] = param.effective.pwmperiod_byte.pwmperiod_lowbyte; context[6] = param.effective.pwmperiod_byte.pwmperiod_highbyte; context[7] = param.pwm_step.pwmstep_byte.pwmstep_lowbyte_0; context[8] = param.pwm_step.pwmstep_byte.pwmstep_lowbyte_1; context[9] = param.pwm_step.pwmstep_byte.pwmstep_highbyte_0; context[10] = param.pwm_step.pwmstep_byte.pwmstep_highbyte_1; dataLen = dataLen + 10; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH1_TABLE_DELETE: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH2_TABLE_SET: { context[1] = param.associate_value.associate_value_btye.associate_value_lowbyte; context[2] = param.associate_value.associate_value_btye.associate_value_highbyte; context[3] = param.peroid.pwmperiod_byte.pwmperiod_lowbyte; context[4] = param.peroid.pwmperiod_byte.pwmperiod_highbyte; context[5] = param.effective.pwmperiod_byte.pwmperiod_lowbyte; context[6] = param.effective.pwmperiod_byte.pwmperiod_highbyte; context[7] = param.pwm_step.pwmstep_byte.pwmstep_lowbyte_0; context[8] = param.pwm_step.pwmstep_byte.pwmstep_lowbyte_1; context[9] = param.pwm_step.pwmstep_byte.pwmstep_highbyte_0; context[10] = param.pwm_step.pwmstep_byte.pwmstep_highbyte_1; dataLen = dataLen + 10; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case AD_ATTR_ASSOCIATE_CH2_TABLE_DELETE: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeRS232SetPacket(RS232_ID id, RS232_ATTRIBUTE attr, RS232_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(RS232_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case RS232_ATTR_ON_OFF: { context[1] = param.rs232_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case RS232_ATTR_BAUD_RATE: { context[1] = param.rs232_baud_rate; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case RS232_ATTR_DATA_SET: { context[1] = param.rs232_data_validate; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeSECSetPacket(SEC_ID id, SEC_ATTRIBUTE attr, SEC_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(SEC_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case SEC_ATTR_A_B_AXIS_BIND: { context[1] = param.a_axis_bind_id; context[2] = param.b_axis_bind_id; dataLen = dataLen + 2; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_Z_AXIS_BIND: { context[1] = param.z_axis_bind_id; dataLen = dataLen + 1; if (param.use_ad_assistent > 0) { context[2] = param.z_axis_assistent_ad_id; context[3] = param.low_limit_value.limit_value_btye.limit_value_lowbyte; context[4] = param.low_limit_value.limit_value_btye.limit_value_highbyte; context[5] = param.high_limit_value.limit_value_btye.limit_value_lowbyte; context[6] = param.high_limit_value.limit_value_btye.limit_value_highbyte; dataLen = dataLen + 5; } else { context[2] = 0; context[3] = 0; context[4] = 0; context[5] = 0; context[6] = 0; dataLen = dataLen + 5; } ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_Z_AXIS_BIND_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_DELTE: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_Z_AXIS_CLEAR_NOTIFY: { context[1] = param.z_axis_clear_notify_switch; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH1_SET: { context[1] = param.associate_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH1_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH1_TABLE_SET: { context[1] = param.associate_value.associate_value_byte.associate_value_lowbyte_0; context[2] = param.associate_value.associate_value_byte.associate_value_lowbyte_1; context[3] = param.associate_value.associate_value_byte.associate_value_highbyte_0; context[4] = param.associate_value.associate_value_byte.associate_value_highbyte_1; dataLen = dataLen + 4; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH1_TABLE_CLEAR: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH2_SET: { context[1] = param.associate_id; dataLen = dataLen + 1; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH2_CANCEL: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH2_TABLE_SET: { context[1] = param.associate_value.associate_value_byte.associate_value_lowbyte_0; context[2] = param.associate_value.associate_value_byte.associate_value_lowbyte_1; context[3] = param.associate_value.associate_value_byte.associate_value_highbyte_0; context[4] = param.associate_value.associate_value_byte.associate_value_highbyte_1; dataLen = dataLen + 4; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; case SEC_ATTR_ASSOCIATE_CH2_TABLE_CLEAR: { ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeSCLSetPacket(SCL_ID id, SCL_ATTRIBUTE attr, SCL_PARAM ¶m, SCFPacket *sendPacket) { if (!sendPacket) { return false; } bool ret = false; unsigned int dataLen = 0; unsigned char context[sizeof(SCL_PARAM)+4] = { 0 }; FUNCTIONID functionId; functionId.CharPart = (unsigned char)id; context[0] = (unsigned char)attr; dataLen = dataLen + 1; switch (attr) { case SCL_ATTR_SET: { context[1] = param.a_id; context[2] = param.a_trigger_level; context[3] = param.b_id; context[4] = param.b_trigger_level; context[5] = param.f_id; dataLen = dataLen + 5; ret = MakeCommandPacket(functionId, context, dataLen, sendPacket); } break; default: break; } return ret; } bool DIOSBoardProtocolHelper::MakeExposureWritePacket(EXPOSURE_ID id, char activeLevel, SCFPacket *sendPacket) { if (!sendPacket) { return false; } if (id == EXPOSURE_CTRL_ID) { FUNCTIONID functionid; functionid.CharPart = (unsigned char)id; char context[2] = { 0 }; context[0] = activeLevel; return DIOSBoardProtocolHelper::Instance()->MakeMultiCommandPacket(functionid, context, 1, sendPacket); } return false; }