void SendMessage::RequestResendMessage(unsigned char expectedPayloadId) { previousResendMessage[0] = 0x01; previousResendMessage[1] = BaseMessageSize + 1; previousResendMessage[2] = 0xE0; previousResendMessage[BaseMessageSize - 1] = expectedPayloadId; previousResendMessage[BaseMessageSize] = CalculateCheckSum(previousResendMessage); cout << "About To Resend Message" << hex << (int) expectedPayloadId << endl; SerialPort::Send(previousResendMessage); }
uint32_t XmlFrameUtil::CheckFrameSum(const char* fr_data) { if(!fr_data){ return 0; } //长度标识 uint32_t xml_len = FetchUint32Value(fr_data, 1); //计算校验和 uint32_t check_sum = CalculateCheckSum(fr_data, 1 + 4 + xml_len); return check_sum; }
const char* XmlFrameUtil::Xml2DataFrame(QDomDocument* doc, EEncodeType encode, EProtocolType protocol) { //确定协议标识符 uint8_t type = 0xff; switch (protocol) { case eProtocol_udp: type = 0x70; break; case eProtocol_tcp: type = 0x7f; break; default: break; } if(type == 0xff){ return nullptr; } //数据格式转换 QString src_xml_msg = doc->toString(); string tmp_xml = src_xml_msg.toStdString(); QString dst_xml_msg = ConvertDataFormat(tmp_xml.c_str(), tmp_xml.length(), encode); if(dst_xml_msg.isEmpty()){ return nullptr; } //计算数据帧长度 int xml_len = dst_xml_msg.size(); int fr_len = 1 + 4 + xml_len + 4; char* fr_data = new char[fr_len]; memset(fr_data, 0, fr_len); //设置消息长度 _msg_len = fr_len; //设置协议标识 fr_data[0] = type; //设置消息长度 FillUint32Value(fr_data, xml_len, 1); //设置消息体 memcpy(fr_data + 1 + 4, dst_xml_msg.toStdString().c_str(), xml_len); //设置校验和 uint32_t check_sum = CalculateCheckSum(fr_data, 1 + 4 + xml_len); FillUint32Value(fr_data + fr_len - 4, check_sum, 0); return fr_data; }
bool XmlFrameUtil::VerifyCheckSum(const char* fr_data) { if(!fr_data){ return false; } //长度标识 uint32_t xml_len = FetchUint32Value(fr_data, 1); if(xml_len > 100000){ return false; } //校验标识 uint32_t check_sum = FetchUint32Value(fr_data, 1 + 4 + xml_len); //计算校验和 uint32_t check_ret = CalculateCheckSum(fr_data, 1 + 4 + xml_len); _msg_len = 1 + 4 + xml_len + 4; return check_sum == check_ret; }
const unsigned char* SendMessage::CreateMessageString() { unsigned char* concatenatedMessage; switch (payloadId) { case(0xA2): concatenatedMessage = SendMessage::previousA2Message; break; case(0xB1): case(0xB3): concatenatedMessage = SendMessage::previousB1B3Message; break; case(0xE0): concatenatedMessage = SendMessage::previousResendMessage; break; default: throw runtime_error("Asked for invalid message"); } concatenatedMessage[0] = destination; concatenatedMessage[1] = messageSize; concatenatedMessage[2] = payloadId; if (messageSize > BaseMessageSize) { cout << "MessageSize: " << (int) messageSize << endl; cout << "BaseMessageSize: " << (int) BaseMessageSize << endl; for (int i = BaseMessageSize; i < messageSize; ++i) { int concatIndex = i - 1; int zeroedIndex = i - BaseMessageSize; concatenatedMessage[concatIndex] = payload[zeroedIndex]; } } unsigned char back = messageSize - 1; unsigned char sum = CalculateCheckSum(); concatenatedMessage[(int) back] = sum; return concatenatedMessage; }
void CheckHelpFile(char* helpfile) { FILE* fptr; int i; unsigned sum, csum; HelpFile[0] = '\0'; if ((sum = CalculateCheckSum(helpfile)) == 0) return; if ((fptr = fopen(helpfile, "rb")) == NULL) return; fseek(fptr, -2, SEEK_END); for (i = 0; i < sizeof(unsigned); i++) if ((*(((char*)(&csum))+i)=fgetc(fptr)) == EOF) { fclose(fptr); return; } fclose(fptr); { char buffer[50]; sprintf(buffer, "csum: %d", csum); LogPrint(buffer); sprintf(buffer, "sum: %d", sum); LogPrint(buffer); } if (csum == sum) strcpy(HelpFile, helpfile); else { LogPrint("Invalid check sum"); } }
/***************************************************************************** * BOOL BinaryHandlePacket(void) *****************************************************************************/ BOOL BinaryHandlePacket(void) { BYTE *packet; BYTE *payload; COMM_PKT_HDR *hdr; BYTE ack_nack; BOOL result = FALSE; if(COMM_PKT_RxPacketAvailable() == FALSE) return result; packet = COMM_PKT_GetRxPacket(); if(COMM_PKT_IsPacketValid(packet) == FALSE) return result; hdr = (COMM_PKT_HDR *)packet; payload = packet + sizeof(COMM_PKT_HDR); ack_nack = COMM_PKT_ACK; switch(hdr->cmd) { case COMM_PKT_ECHO: break; case COMM_PKT_MAX_PAYLOAD_SIZE: *((WORD *)payload) = COMM_PKT_RX_MAX_SIZE; hdr->length = 2; break; case COMM_PKT_MEMORY_ERASE: ChipErase(); break; case COMM_PKT_MEMORY_WRITE: { COMM_PKT_MEMORY_PAYLOAD *memPayload = (COMM_PKT_MEMORY_PAYLOAD *)payload; if(!WriteMemory(memPayload->addr, (BYTE *)&memPayload->data, hdr->length - 4)) ack_nack = COMM_PKT_NACK; hdr->length = 4; } break; case COMM_PKT_MEMORY_READ: { COMM_PKT_MEMORY_PAYLOAD *memPayload = (COMM_PKT_MEMORY_PAYLOAD *)payload; hdr->length = *((WORD *)(payload + 4)); ReadArray(memPayload->addr, (BYTE *)&memPayload->data, hdr->length); hdr->length += 4; } break; case COMM_PKT_MEMORY_VERIFY: { COMM_PKT_VERIFY_PAYLOAD *verifyPayload = (COMM_PKT_VERIFY_PAYLOAD *)payload; *((DWORD *)payload) = CalculateCheckSum(verifyPayload->addr, payload, verifyPayload->range); hdr->length = 4; } break; case COMM_PKT_MEMORY_DONE: result = TRUE; break; default: ack_nack = COMM_PKT_NACK; break; } COMM_PKT_SendReply( FLASH_PROGRAMMER_COMMUNICATION_MEDIUM, hdr->cmd, ack_nack, payload, hdr->length); return result; }
void RequestResendMessage::Send(unsigned char expectedPayloadId) { payloadId[0] = expectedPayloadId; checkSum = CalculateCheckSum(); Send(); }
int CreateHelpFile(char* listfile, char* helpfile) { FILE *ifptr, *ofptr; int filecount, i; unsigned csum; ifptr = fopen(listfile, "rb"); if (!ifptr) { printf("Listfile cannot be opened."); return 1; } ofptr = fopen(helpfile, "wb"); if (!ofptr) { fclose(ifptr); printf("Unable to open destination help file."); return 1; } filecount = CountFiles(ifptr); if (filecount == 0) return 0; if ((filecount < 0) || (InitialiseHeader(ofptr, filecount)) || (MoveTextFiles(ifptr, ofptr))) { printf("Error processing listfile.\n"); fclose(ifptr); fclose(ofptr); return 1; } fclose(ifptr); fclose(ofptr); csum = CalculateCheckSum(helpfile); #ifdef VERBOSE printf("Checksum = %X\n", csum); #endif ofptr = fopen(helpfile, "ab"); if (!ofptr) { fclose(ifptr); printf("Unable to open destination help file."); return 1; } fseek(ofptr, 0, SEEK_END); for (i = 0; i < sizeof(unsigned); i++) fputc(*(((char*)(&csum))+i), ofptr); fclose(ofptr); return 0; }