165 lines
5.5 KiB
C#
165 lines
5.5 KiB
C#
|
using System;
|
||
|
using System.Runtime.InteropServices;
|
||
|
using GHIElectronics.NETMF.System;
|
||
|
using GHIElectronics.NETMF.Hardware;
|
||
|
|
||
|
namespace PlaneOnBoardSoftware
|
||
|
{
|
||
|
class ValueStorageClass
|
||
|
{
|
||
|
class Serializing
|
||
|
{
|
||
|
private static double Abs(double Number)
|
||
|
{
|
||
|
if (Number > 0)
|
||
|
return Number;
|
||
|
else
|
||
|
return -Number;
|
||
|
}
|
||
|
|
||
|
public static void WriteBool(bool Value, ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
ByteArray[OffSet] = (byte)(Value ? 1 : 0);
|
||
|
OffSet += 1;
|
||
|
}
|
||
|
|
||
|
public static bool ReadBool(ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
OffSet += 1;
|
||
|
return ByteArray[OffSet-1] == 1;
|
||
|
}
|
||
|
|
||
|
public static void WriteByte(byte Number, ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
ByteArray[OffSet] = Number;
|
||
|
OffSet += 1;
|
||
|
}
|
||
|
|
||
|
public static byte ReadByte(ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
OffSet += 1;
|
||
|
return ByteArray[OffSet-1];
|
||
|
}
|
||
|
|
||
|
public static void WriteFloat(float Number, ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
int sigPos = (int)MathEx.Floor(MathEx.Log10(Abs(Number)));
|
||
|
int intNumb = (int)(Number * MathEx.Pow(10, -sigPos + 5));
|
||
|
|
||
|
if (intNumb < 0) intNumb += 0xFFFFFF;
|
||
|
|
||
|
ByteArray[OffSet + 0] = (byte)(sigPos + 128);
|
||
|
ByteArray[OffSet + 1] = (byte)(intNumb >> 16);
|
||
|
ByteArray[OffSet + 2] = (byte)((intNumb >> 8) & 0xFF);
|
||
|
ByteArray[OffSet + 3] = (byte)(intNumb & 0xFF);
|
||
|
|
||
|
OffSet += 4;
|
||
|
}
|
||
|
|
||
|
public static float ReadFloat(ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
int sigPos = ByteArray[OffSet + 0] - 128;
|
||
|
int intNumb = ByteArray[OffSet + 1];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 2];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 3];
|
||
|
|
||
|
if (intNumb > 0x7FFFFF) intNumb -= 0xFFFFFF;
|
||
|
|
||
|
OffSet += 4;
|
||
|
return (float)(intNumb * MathEx.Pow(10, sigPos - 5));
|
||
|
}
|
||
|
|
||
|
public static void WriteDouble(double Number, ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
|
||
|
int sigPos = (int)MathEx.Floor(MathEx.Log10(Abs(Number)));
|
||
|
long intNumb = (long)(Number * MathEx.Pow(10, -sigPos + 14));
|
||
|
|
||
|
if (intNumb < 0) intNumb += 0xFFFFFFFFFFFFFF;
|
||
|
|
||
|
ByteArray[OffSet + 0] = (byte)(sigPos + 128);
|
||
|
ByteArray[OffSet + 7] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 6] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 5] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 4] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 3] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 2] = (byte)(intNumb & 0xFF);
|
||
|
intNumb = (intNumb >> 8);
|
||
|
ByteArray[OffSet + 1] = (byte)(intNumb);
|
||
|
|
||
|
OffSet += 4;
|
||
|
}
|
||
|
|
||
|
public static double ReadDouble(ref byte[] ByteArray, ref int OffSet)
|
||
|
{
|
||
|
long sigPos = ByteArray[OffSet + 0] - 128;
|
||
|
long intNumb = ByteArray[OffSet + 1];
|
||
|
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 2];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 3];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 4];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 5];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 6];
|
||
|
intNumb = (intNumb << 8) + ByteArray[OffSet + 7];
|
||
|
|
||
|
if (intNumb > 0x7FFFFFFFFFFFFF) intNumb -= 0xFFFFFFFFFFFFFF;
|
||
|
|
||
|
OffSet += 4;
|
||
|
return (intNumb * MathEx.Pow(10, sigPos - 14));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
private int StorageSize = 0;
|
||
|
private int OffSet = 0;
|
||
|
private byte[] buffer;
|
||
|
|
||
|
public ValueStorageClass()
|
||
|
{
|
||
|
StorageSize = InternalFlashStorage.Size;
|
||
|
OffSet = 0;
|
||
|
buffer = new byte[StorageSize];
|
||
|
InternalFlashStorage.Read(buffer);
|
||
|
}
|
||
|
|
||
|
public void WriteToFlash()
|
||
|
{
|
||
|
InternalFlashStorage.Write(buffer);
|
||
|
}
|
||
|
|
||
|
public void WriteBool(bool Value)
|
||
|
{
|
||
|
Serializing.WriteBool(Value, ref buffer, ref OffSet);
|
||
|
}
|
||
|
|
||
|
public void WriteFloat(float Value)
|
||
|
{
|
||
|
Serializing.WriteFloat(Value, ref buffer, ref OffSet);
|
||
|
}
|
||
|
|
||
|
public void WriteDouble(double Value)
|
||
|
{
|
||
|
Serializing.WriteDouble(Value, ref buffer, ref OffSet);
|
||
|
}
|
||
|
|
||
|
public bool ReadBool()
|
||
|
{
|
||
|
return Serializing.ReadBool(ref buffer, ref OffSet);
|
||
|
}
|
||
|
|
||
|
public float ReadFloat()
|
||
|
{
|
||
|
return Serializing.ReadFloat(ref buffer, ref OffSet);
|
||
|
}
|
||
|
|
||
|
public double ReadDouble()
|
||
|
{
|
||
|
return Serializing.ReadDouble(ref buffer, ref OffSet);
|
||
|
}
|
||
|
}
|
||
|
}
|