90 lines
2.7 KiB
JavaScript
90 lines
2.7 KiB
JavaScript
/**
|
|
* SOES EEPROM generator
|
|
* Files input and output
|
|
|
|
* This tool serves as:
|
|
- EtherCAT Slave Information XML + EEPROM binary generator
|
|
- SOES code generator
|
|
|
|
* Victor Sluiter 2013-2018
|
|
* Kuba Buda 2020-2021
|
|
*/
|
|
'use strict'
|
|
|
|
// ####################### File operations ####################### //
|
|
|
|
/** save file in local filesystem, by downloading from browser */
|
|
function downloadFile(content, fileName, contentType) {
|
|
var a = document.createElement("a");
|
|
var file = new Blob([content], {type: contentType});
|
|
a.href = URL.createObjectURL(file);
|
|
a.download = fileName;
|
|
a.click();
|
|
// a element will be garbage collected, no need to cleanup
|
|
}
|
|
|
|
/** reads saved project from file user opened */
|
|
function readFile(e) {
|
|
var file = e.target.files[0];
|
|
if (!file) return;
|
|
var reader = new FileReader();
|
|
reader.onload = function(e) {
|
|
onRestoreComplete(e.target.result);
|
|
}
|
|
reader.readAsText(file);
|
|
}
|
|
|
|
/** takes bytes array, returns Intel Hex as string */
|
|
function toIntelHex(record) {
|
|
var hex = "";
|
|
const bytes_per_rule = 32;
|
|
const rulesTotalCount = record.length/bytes_per_rule;
|
|
|
|
for (var rulenumber = 0 ; rulenumber < (rulesTotalCount); rulenumber++)
|
|
{
|
|
const sliceStart = rulenumber*bytes_per_rule;
|
|
const sliceEnd = bytes_per_rule + (rulenumber * bytes_per_rule);
|
|
const recordSlice = record.slice(sliceStart, sliceEnd);
|
|
hex += CreateiHexRule(bytes_per_rule, rulenumber, recordSlice);
|
|
}
|
|
//end of file marker
|
|
hex += ':00000001FF';
|
|
return hex.toUpperCase();
|
|
|
|
function CreateiHexRule(bytes_per_rule, rulenumber, record)
|
|
{
|
|
var record_type_datarecord = '00';
|
|
var rule = ':'+ bytes_per_rule.toString(16).slice(-2) + generate_hex_address(rulenumber*bytes_per_rule) + record_type_datarecord;
|
|
for(var byteposition = 0; byteposition < bytes_per_rule ; byteposition++)
|
|
{
|
|
var byte = record[byteposition].toString(16).slice(-2); // convert to hexadecimal, crop to last 2 digits
|
|
if(byte.length < 2)
|
|
byte = '0' + byte; //minimal field width = 2 characters.
|
|
rule += byte;
|
|
}
|
|
var checksum = 0;
|
|
for(var rule_pos = 0 ; rule_pos < (rule.length-1)/2 ; rule_pos++)
|
|
{
|
|
var byte = parseInt(rule.slice(1+(2*rule_pos), 3+(2*rule_pos)),16);
|
|
checksum += byte;
|
|
}
|
|
checksum %= 0x100; //leave last byte
|
|
checksum = 0x100-checksum; //two's complement
|
|
rule += checksum.toString(16).slice(-2) + '\n';
|
|
return rule;
|
|
}
|
|
/** takex number, returns its hexadecimal value padded/trimmed to 4 digits */
|
|
function generate_hex_address(number)
|
|
{
|
|
//convert to hexadecimal string
|
|
var output = number.toString(16);
|
|
//take care that 4 characters are present
|
|
while(output.length<4)
|
|
{
|
|
output ='0' + output;
|
|
}
|
|
//return 4 characters, prevents overflow
|
|
return output.slice(-4);
|
|
}
|
|
}
|