NETMF_Autopilot/ValueStorageClass.cs

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