Files
MyOwnEtherCATDevice/Utils/EEPROM_generator/src/file_io.js
2024-11-20 11:18:13 +01:00

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);
}
}