MCPcopy Create free account
hub / github.com/LowPowerLab/RFM69 / validateHEXData

Function validateHEXData

RFM69_OTA.cpp:437–469  ·  view source on GitHub ↗

=================================================================================================================== validateHEXData() - returns length of HEX data bytes if everything is valid returns 0 if any validation failed ===================================================================================================================

Source from the content-addressed store, hash-verified

435//returns 0 if any validation failed
436//===================================================================================================================
437uint8_t validateHEXData(void* data, uint8_t length)
438{
439 //assuming 1 byte record length, 2 bytes address, 1 byte record type, N data bytes, 1 CRC byte
440 char* input = (char*)data;
441 if (length <12 || length%2!=0) return 0; //shortest possible intel data HEX record is 12 bytes
442 //Serial.print(F("VAL > ")); Serial.println((char*)input);
443
444 uint8_t checksum=0;
445 //check valid HEX data and CRC
446 for (uint8_t i=0; i<length;i++)
447 {
448 if (!((input[i] >=48 && input[i]<=57) || (input[i] >=65 && input[i]<=70))) //0-9,A-F
449 return 255;
450 if (i%2 && i<length-2) checksum+=BYTEfromHEX(input[i-1], input[i]);
451 }
452 checksum=(checksum^0xFF)+1;
453
454 //TODO : CHECK for address continuity (intel HEX addresses are big endian)
455
456 //Serial.print(F("final CRC:"));Serial.println((uint8_t)checksum, HEX);
457 //Serial.print(F("CRC byte:"));Serial.println(BYTEfromHEX(input[length-2], input[length-1]), HEX);
458
459 //check CHECKSUM byte
460 if (((uint8_t)checksum) != BYTEfromHEX(input[length-2], input[length-1]))
461 return 254;
462
463 uint8_t dataLength = BYTEfromHEX(input[0], input[1]); //length of actual HEX flash data (usually 16bytes)
464 //calculate record length
465 if (length != dataLength*2 + 10) //add headers and checksum bytes (a total of 10 combined)
466 return 253;
467
468 return dataLength; //all validation OK!
469}
470
471
472//===================================================================================================================

Callers 1

HandleSerialHEXDataFunction · 0.85

Calls 1

BYTEfromHEXFunction · 0.85

Tested by

no test coverage detected