bool IMI::MessageParser::Check(const TMsg *msg, IMIDWORD size) { // minimal size of comm message if (size < IMICOMM_MSG_HEADER_SIZE + IMICOMM_CRC_LEN) return false; // check signature if(msg->syncChar1 != IMICOMM_SYNC_CHAR1 || msg->syncChar2 != IMICOMM_SYNC_CHAR2) return false; // check size if(msg->payloadSize != size - IMICOMM_MSG_HEADER_SIZE - IMICOMM_CRC_LEN) return false; // check CRC IMIWORD crc1 = CRC16Checksum(((const IMIBYTE *)msg) + IMICOMM_SYNC_LEN, IMICOMM_MSG_HEADER_SIZE + msg->payloadSize - IMICOMM_SYNC_LEN); IMIWORD crc2 = (IMIWORD)(((const IMIBYTE *)msg)[size - 1]) | ((IMIWORD)(((const IMIBYTE *)msg)[size - 2]) << 8); return crc1 == crc2; }
/** * @brief Prepares and sends the message to a device * * @param d Device handle * @param errBufSize The size of the buffer for error string * @param errBuf The buffer for error string * @param msgID ID of the message to send * @param payload Payload buffer to use for the message * @param payloadSize The size of the payload buffer * @param parameter1 1st parameter for to put in the message * @param parameter2 2nd parameter for to put in the message * @param parameter3 3rd parameter for to put in the message * * @return Operation status */ bool CDevIMI::Send(PDeviceDescriptor_t d, unsigned errBufSize, TCHAR errBuf[], IMIBYTE msgID, const void *payload /* =0 */, IMIWORD payloadSize /* =0 */, IMIBYTE parameter1 /* =0 */, IMIWORD parameter2 /* =0 */, IMIWORD parameter3 /* =0 */) { if(payloadSize > COMM_MAX_PAYLOAD_SIZE) return false; TMsg msg; memset(&msg, 0, sizeof(msg)); msg.syncChar1 = IMICOMM_SYNC_CHAR1; msg.syncChar2 = IMICOMM_SYNC_CHAR2; msg.sn = _serialNumber; msg.msgID = msgID; msg.parameter1 = parameter1; msg.parameter2 = parameter2; msg.parameter3 = parameter3; msg.payloadSize = payloadSize; memcpy(msg.payload, payload, payloadSize); IMIWORD crc = CRC16Checksum(((IMIBYTE*)&msg) + 2, payloadSize + IMICOMM_MSG_HEADER_SIZE - 2); msg.payload[payloadSize] = (IMIBYTE)(crc >> 8); msg.payload[payloadSize + 1] = (IMIBYTE)crc; return Send(d, errBufSize, errBuf, msg); }
bool IMI::Send(Port &port, IMIBYTE msgID, const void *payload, IMIWORD payloadSize, IMIBYTE parameter1, IMIWORD parameter2, IMIWORD parameter3) { if (payloadSize > COMM_MAX_PAYLOAD_SIZE) return false; TMsg msg; memset(&msg, 0, sizeof(msg)); msg.syncChar1 = IMICOMM_SYNC_CHAR1; msg.syncChar2 = IMICOMM_SYNC_CHAR2; msg.sn = _serialNumber; msg.msgID = msgID; msg.parameter1 = parameter1; msg.parameter2 = parameter2; msg.parameter3 = parameter3; msg.payloadSize = payloadSize; memcpy(msg.payload, payload, payloadSize); IMIWORD crc = CRC16Checksum(((IMIBYTE*)&msg) + 2, payloadSize + IMICOMM_MSG_HEADER_SIZE - 2); msg.payload[payloadSize] = (IMIBYTE)(crc >> 8); msg.payload[payloadSize + 1] = (IMIBYTE)crc; return Send(port, msg); }