mirror of
https://github.com/iNavFlight/inav-configurator.git
synced 2025-07-17 13:25:22 +03:00
new ihex parser
This commit is contained in:
parent
e2cfa50262
commit
7bde2a159e
1 changed files with 34 additions and 58 deletions
|
@ -12,60 +12,51 @@ function read_hex_file(data) {
|
||||||
var hexfile_valid = true; // if any of the crc checks failed, this variable flips to false
|
var hexfile_valid = true; // if any of the crc checks failed, this variable flips to false
|
||||||
|
|
||||||
var result = {
|
var result = {
|
||||||
data: [],
|
data: [],
|
||||||
end_of_file: false,
|
end_of_file: false,
|
||||||
extended_linear_address: [],
|
bytes_total: 0,
|
||||||
start_linear_address: 0,
|
start_linear_address: 0
|
||||||
bytes: 0
|
|
||||||
};
|
};
|
||||||
|
|
||||||
var next_address_pos = 0;
|
var extended_linear_address = 0;
|
||||||
|
var next_address = 0;
|
||||||
|
|
||||||
for (var i = 0; i < data.length; i++) {
|
for (var i = 0; i < data.length && hexfile_valid; i++) {
|
||||||
var byte_count = parseInt(data[i].substr(1, 2), 16); // each byte is represnted by two chars
|
// each byte is represnted by two chars
|
||||||
var address = data[i].substr(3, 4);
|
var byte_count = parseInt(data[i].substr(1, 2), 16);
|
||||||
var record_type = parseInt(data[i].substr(7, 2), 16); // also converting from hex to decimal
|
var address = parseInt(data[i].substr(3, 4), 16);
|
||||||
var content = data[i].substr(9, byte_count * 2);
|
var record_type = parseInt(data[i].substr(7, 2), 16);
|
||||||
var checksum = parseInt(data[i].substr(9 + byte_count * 2, 2), 16); // also converting from hex to decimal (this is a 2's complement value)
|
var content = data[i].substr(9, byte_count * 2); // still in string format
|
||||||
|
var checksum = parseInt(data[i].substr(9 + byte_count * 2, 2), 16); // (this is a 2's complement value)
|
||||||
|
|
||||||
switch (record_type) {
|
switch (record_type) {
|
||||||
case 0x00: // data record
|
case 0x00: // data record
|
||||||
// fix "holes" if there are any
|
if (address != next_address || next_address == 0) {
|
||||||
if (parseInt(address, 16) != next_address_pos) {
|
result.data.push({'address': extended_linear_address + address, 'bytes': 0, 'data': []});
|
||||||
var difference = parseInt(address, 16) - (next_address_pos);
|
|
||||||
|
|
||||||
// fill in the difference
|
|
||||||
for (var x = 0; x < difference; x++) {
|
|
||||||
result.data.push(0xFF);
|
|
||||||
result.bytes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log('HEX_PARSER - Address hole detected, expected: ' + next_address_pos + ', received: ' + parseInt(address, 16) + ', filling: ' + difference + ' bytes');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// update for next comparison
|
// store address for next comparison
|
||||||
next_address_pos = parseInt(address, 16) + byte_count;
|
next_address = address + byte_count;
|
||||||
|
|
||||||
// process data
|
// process data
|
||||||
var crc = byte_count + parseInt(address.substr(0, 2), 16) + parseInt(address.substr(2, 2), 16) + record_type;
|
var crc = byte_count + parseInt(data[i].substr(3, 2), 16) + parseInt(data[i].substr(5, 2), 16) + record_type;
|
||||||
for (var needle = 0; needle < byte_count * 2; needle += 2) {
|
for (var needle = 0; needle < byte_count * 2; needle += 2) { // * 2 because of 2 hex chars per 1 byte
|
||||||
var num = parseInt(content.substr(needle, 2), 16); // get one byte in hex and convert it to decimal
|
var num = parseInt(content.substr(needle, 2), 16); // get one byte in hex and convert it to decimal
|
||||||
result.data.push(num);
|
var data_block = result.data.length - 1;
|
||||||
|
|
||||||
|
result.data[data_block].data.push(num);
|
||||||
|
result.data[data_block].bytes++;
|
||||||
|
|
||||||
crc += num;
|
crc += num;
|
||||||
result.bytes++;
|
result.bytes_total++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// change crc to 2's complement (same as checksum)
|
// change crc to 2's complement
|
||||||
crc = ~crc + 1;
|
crc = (~crc + 1) & 0xFF;
|
||||||
crc &= 0xFF;
|
|
||||||
|
|
||||||
// verify
|
// verify
|
||||||
if (crc != checksum) {
|
if (crc != checksum) {
|
||||||
hexfile_valid = false;
|
hexfile_valid = false;
|
||||||
|
|
||||||
// break out of the for loop as crc is wrong anyway, we dont need to process any more data
|
|
||||||
i = data.length;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 0x01: // end of file record
|
case 0x01: // end of file record
|
||||||
|
@ -79,30 +70,15 @@ function read_hex_file(data) {
|
||||||
break;
|
break;
|
||||||
case 0x03: // start segment address record
|
case 0x03: // start segment address record
|
||||||
// not implemented
|
// not implemented
|
||||||
console.log('start segment address record found - NOT IMPLEMENTED !!!');
|
if (parseInt(content, 16) != 0) { // ignore if segment is 0
|
||||||
break;
|
console.log('start segment address record found - NOT IMPLEMENTED !!!');
|
||||||
case 0x04: // extended linear address record
|
|
||||||
var extended_linear_address = (parseInt(content.substr(0, 2), 16) << 24) | parseInt(content.substr(2, 2), 16) << 16;
|
|
||||||
result.extended_linear_address.push(extended_linear_address);
|
|
||||||
|
|
||||||
if (next_address_pos != 0) { // dont execute the first time
|
|
||||||
extended_linear_address -= 0x08000000;
|
|
||||||
var difference = extended_linear_address - next_address_pos;
|
|
||||||
|
|
||||||
// fill in the difference
|
|
||||||
for (var x = 0; x < difference; x++) {
|
|
||||||
result.data.push(0xFF);
|
|
||||||
result.bytes++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (difference > 0) console.log('HEX_PARSER - Address hole detected (changing linear address), expected: ' + next_address_pos + ', received: ' + extended_linear_address + ', filling: ' + difference + ' bytes');
|
|
||||||
|
|
||||||
// reset some variables
|
|
||||||
next_address_pos = 0;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case 0x04: // extended linear address record
|
||||||
|
extended_linear_address = (parseInt(content.substr(0, 2), 16) << 24) | parseInt(content.substr(2, 2), 16) << 16;
|
||||||
|
break;
|
||||||
case 0x05: // start linear address record
|
case 0x05: // start linear address record
|
||||||
result.start_linear_address = (parseInt(content.substr(0, 2), 16) << 24) | (parseInt(content.substr(2, 2), 16) << 16) | (parseInt(content.substr(4, 2), 16) << 8) | parseInt(content.substr(6, 2), 16);
|
result.start_linear_address = parseInt(content, 16)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue