Example #1
0
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);
}
Example #2
0
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;
}
Example #3
0
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;
}
Example #4
0
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;
}
Example #5
0
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;
}
Example #6
0
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");
     }
}
Example #7
0
/*****************************************************************************
 * 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();
}
Example #9
0
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;
}