mirror of
https://github.com/Ralim/IronOS.git
synced 2025-02-26 07:53:55 +00:00
Settings menu works Movement working & TMP calibrated Tip reading sensibily Accuracy seems ok Trimmed down overshoot by biasing integral Saving to flash working, detailed idle Sleep mode Description scrolls Building for DFU working Motion detection update Use manual alg instead, using highpass filter, then sum current change vs rolling average Re-shuffle the pwm code organisation
97 lines
4.2 KiB
C#
97 lines
4.2 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel;
|
|
using System.Data;
|
|
|
|
namespace IntelHex
|
|
{
|
|
public class IntelHex
|
|
{
|
|
public static string encode(byte[] data, UInt32 startingAddress, int bytesPerLine, bool header = true,bool Addbloat=false)
|
|
{
|
|
//We are taking the byte array and encoding it into the wanted hex file contents (aka string of data).
|
|
//First create the starting base address record
|
|
//:020000040800F2
|
|
string Output = "";
|
|
if (header)
|
|
{
|
|
//Set the upper 16 bits of the address space
|
|
Output += getHighAddressSetLine((UInt16)(startingAddress >> 16));
|
|
}
|
|
|
|
//Now loop through all the data that we were given
|
|
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
|
|
{
|
|
//We want to read from data[index] to data[index+bytesPerLine-1]
|
|
UInt32 currentAddress = (UInt32)(startingAddress + index);
|
|
if ((currentAddress >> 16) != (startingAddress >> 16))
|
|
{
|
|
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
|
|
//The address has rolled over the 64K boundry, so write a new high address change line
|
|
}
|
|
//We should now be good for the higher part of the address
|
|
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
|
|
}
|
|
if(Addbloat)
|
|
{
|
|
//Repeat the instructs a stack of times to get around filesize minimums
|
|
for(int x=0;x<3;x++)
|
|
{
|
|
for (UInt32 index = 0; index < data.Length; index = (UInt32)(index + bytesPerLine))
|
|
{
|
|
//We want to read from data[index] to data[index+bytesPerLine-1]
|
|
UInt32 currentAddress = (UInt32)(startingAddress + index);
|
|
if ((currentAddress >> 16) != (startingAddress >> 16))
|
|
{
|
|
Output += getHighAddressSetLine((UInt16)(currentAddress >> 16));
|
|
//The address has rolled over the 64K boundry, so write a new high address change line
|
|
}
|
|
//We should now be good for the higher part of the address
|
|
Output += encodeDataLine((UInt16)(currentAddress & 0xFFFF), data, index, bytesPerLine);
|
|
}
|
|
}
|
|
}
|
|
//We have now written out all the data lines
|
|
Output += ":00000001FF\r\n";//End of file marker
|
|
|
|
return Output;
|
|
}
|
|
private static string encodeDataLine(UInt16 address, byte[] data, UInt32 startindex, int bytes)
|
|
{
|
|
string line = ":";
|
|
line += bytes.ToString("X2");//add the marker of line length
|
|
line += address.ToString("X4");//write the address
|
|
line += "00";//Data line
|
|
//Next copy bytes bytes
|
|
for (int i = 0; i < bytes; i++)
|
|
{
|
|
if ((startindex + i) < data.Length)
|
|
line += data[startindex + i].ToString("X2");
|
|
else
|
|
line += "FF";//pad images out with FF
|
|
}
|
|
line += checksumLine(line);//Adds checksum and EOL
|
|
return line;
|
|
}
|
|
private static string getHighAddressSetLine(UInt16 HighAddress)
|
|
{
|
|
string Output = "";
|
|
Output += ":02000004" + (HighAddress).ToString("X4");
|
|
Output += checksumLine(Output);
|
|
return Output;
|
|
}
|
|
private static string checksumLine(string line)
|
|
{
|
|
//We want to convert the string line to each byte and sum.
|
|
byte sum = 0;
|
|
for (int i = 1; i < line.Length; i += 2)
|
|
{
|
|
byte b = byte.Parse((line.Substring(i, 2)), System.Globalization.NumberStyles.HexNumber);
|
|
sum += b;
|
|
}
|
|
byte checksum = (byte)(((byte)0) - sum);//invert
|
|
return checksum.ToString("X2") + "\r\n";
|
|
}
|
|
}
|
|
}
|