/// <summary>
/// Function for full change from an Object to Byte.
/// </summary>
/// <typeparam name="dataType">Datatype of the source</typeparam>
/// <param name="src">Src object which shall be transferred</param>
/// <param name="epicsType">Target epics type</param>
/// <param name="record">Record from where the value comes</param>
/// <param name="dataCount">Count of data requested</param>
/// <returns></returns>
internal static byte[] ToByteArray <dataType>(object src, EpicsType epicsType, CARecord record, int dataCount)
{
dataType[] source;
if (src.GetType().IsArray)
{
source = new dataType[dataCount];
int i = 0;
foreach (object element in ((System.Collections.IEnumerable)src))
{
if (i >= source.Length)
{
break;
}
source[i] = (dataType)Convert.ChangeType(element, typeof(dataType));
i++;
}
}
else
{
source = new dataType[] { (dataType)Convert.ChangeType(src, typeof(dataType)) }
};
using (MemoryStream mem = new MemoryStream())
{
using (BinaryWriter writer = new BinaryWriter(mem))
{
switch (epicsType)
{
#region simple Types
case EpicsType.String:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(source[i].ToString(), true));
}
return(mem.ToArray());
case EpicsType.Short:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt16(source[i])));
}
return(mem.ToArray());
case EpicsType.Float:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToSingle(source[i])));
}
return(mem.ToArray());
case EpicsType.Byte:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToByte(source[i])));
}
return(mem.ToArray());
case EpicsType.Int:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt32(source[i])));
}
return(mem.ToArray());
case EpicsType.Double:
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToDouble(source[i])));
}
return(mem.ToArray());
#endregion
#region StatusTypes
case EpicsType.Status_Double:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? -1)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? -1)));
writer.Write(ToByteArray((uint)0)); // Skip 4 bytes
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToDouble(source[i])));
}
return(mem.ToArray());
case EpicsType.Status_Float:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToSingle(source[i])));
}
return(mem.ToArray());
case EpicsType.Status_Int:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt32(source[i])));
}
return(mem.ToArray());
case EpicsType.Status_Byte:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToByte(source[i])));
}
return(mem.ToArray());
case EpicsType.Status_Short:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt16(source[i])));
}
return(mem.ToArray());
case EpicsType.Status_String:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(source[i].ToString(), true));
}
return(mem.ToArray());
#endregion
#region TimeTypes
case EpicsType.Time_Double:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
writer.Write(ToByteArray((UInt32)0)); // Skip 4 bytes
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToDouble(source[i])));
}
return(mem.ToArray());
case EpicsType.Time_Float:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToSingle(source[i])));
}
return(mem.ToArray());
case EpicsType.Time_Int:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt32(source[i])));
}
return(mem.ToArray());
case EpicsType.Time_Short:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
writer.Write(new byte[2]);
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt16(source[i])));
}
return(mem.ToArray());
case EpicsType.Time_String:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(source[i].ToString(), true));
}
return(mem.ToArray());
case EpicsType.Time_Byte:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((DateTime)(record["TIME"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToByte(source[i])));
}
return(mem.ToArray());
#endregion
#region ControlTypes
case EpicsType.Control_Double:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((short)(record["PREC"] ?? 0)));
writer.Write(new byte[] { 0, 0 });
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetDouble("HIGHDISP")));
writer.Write(ToByteArray(record.GetDouble("LOWDISP")));
writer.Write(ToByteArray(record.GetDouble("HIHI")));
writer.Write(ToByteArray(record.GetDouble("HIGH")));
writer.Write(ToByteArray(record.GetDouble("LOW")));
writer.Write(ToByteArray(record.GetDouble("LOLO")));
writer.Write(ToByteArray(record.GetDouble("HOPR")));
writer.Write(ToByteArray(record.GetDouble("LOPR")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToDouble(source[i])));
}
return(mem.ToArray());
case EpicsType.Control_Float:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((short)(record["PREC"] ?? 0)));
writer.Write(new byte[] { 0, 0 });
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetFloat("HIGHDISP")));
writer.Write(ToByteArray(record.GetFloat("LOWDISP")));
writer.Write(ToByteArray(record.GetFloat("HIHI")));
writer.Write(ToByteArray(record.GetFloat("HIGH")));
writer.Write(ToByteArray(record.GetFloat("LOW")));
writer.Write(ToByteArray(record.GetFloat("LOLO")));
writer.Write(ToByteArray(record.GetFloat("HOPR")));
writer.Write(ToByteArray(record.GetFloat("LOPR")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToSingle(source[i])));
}
return(mem.ToArray());
case EpicsType.Control_Int:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
//writer.Write(new byte[] { 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77 });
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetInt("HIGHDISP")));
writer.Write(ToByteArray(record.GetInt("LOWDISP")));
writer.Write(ToByteArray(record.GetInt("HIHI")));
writer.Write(ToByteArray(record.GetInt("HIGH")));
writer.Write(ToByteArray(record.GetInt("LOW")));
writer.Write(ToByteArray(record.GetInt("LOLO")));
writer.Write(ToByteArray(record.GetInt("HOPR")));
writer.Write(ToByteArray(record.GetInt("LOPR")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt32(source[i])));
}
return(mem.ToArray());
case EpicsType.Control_Short:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetShort("HIGHDISP")));
writer.Write(ToByteArray(record.GetShort("LOWDISP")));
writer.Write(ToByteArray(record.GetShort("HIHI")));
writer.Write(ToByteArray(record.GetShort("HIGH")));
writer.Write(ToByteArray(record.GetShort("LOW")));
writer.Write(ToByteArray(record.GetShort("LOLO")));
writer.Write(ToByteArray(record.GetShort("HOPR")));
writer.Write(ToByteArray(record.GetShort("LOPR")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt16(source[i])));
}
return(mem.ToArray());
case EpicsType.Control_Byte:
throw new Exception("NOT IMPLEMENTED");
case EpicsType.Control_String:
writer.Write(ToByteArray((ushort)record["STAT"]));
writer.Write(ToByteArray((ushort)record["SEVR"]));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToString(source[i]), true));
}
return(mem.ToArray());
#endregion
#region GraphicsTypes
case EpicsType.Display_Double:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((short)(record["PREC"] ?? 0)));
writer.Write(new byte[] { 0, 0 });
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetDouble("HIGHDISP")));
writer.Write(ToByteArray(record.GetDouble("LOWDISP")));
writer.Write(ToByteArray(record.GetDouble("HIHI")));
writer.Write(ToByteArray(record.GetDouble("HIGH")));
writer.Write(ToByteArray(record.GetDouble("LOW")));
writer.Write(ToByteArray(record.GetDouble("LOLO")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToDouble(source[i])));
}
return(mem.ToArray());
case EpicsType.Display_Float:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((short)(record["PREC"] ?? 0)));
writer.Write(new byte[] { 0, 0 });
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetFloat("HIGHDISP")));
writer.Write(ToByteArray(record.GetFloat("LOWDISP")));
writer.Write(ToByteArray(record.GetFloat("HIHI")));
writer.Write(ToByteArray(record.GetFloat("HIGH")));
writer.Write(ToByteArray(record.GetFloat("LOW")));
writer.Write(ToByteArray(record.GetFloat("LOLO")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToSingle(source[i])));
}
return(mem.ToArray());
case EpicsType.Display_Int:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetInt("HIGHDISP")));
writer.Write(ToByteArray(record.GetInt("LOWDISP")));
writer.Write(ToByteArray(record.GetInt("HIHI")));
writer.Write(ToByteArray(record.GetInt("HIGH")));
writer.Write(ToByteArray(record.GetInt("LOW")));
writer.Write(ToByteArray(record.GetInt("LOLO")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt32(source[i])));
}
return(mem.ToArray());
case EpicsType.Display_Short:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
writer.Write(ToByteArray((string)(record["EGU"] ?? ""), 8));
writer.Write(ToByteArray(record.GetShort("HIGHDISP")));
writer.Write(ToByteArray(record.GetShort("LOWDISP")));
writer.Write(ToByteArray(record.GetShort("HIHI")));
writer.Write(ToByteArray(record.GetShort("HIGH")));
writer.Write(ToByteArray(record.GetShort("LOW")));
writer.Write(ToByteArray(record.GetShort("LOLO")));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToInt16(source[i])));
}
return(mem.ToArray());
case EpicsType.Display_Byte:
throw new Exception("NOT IMPLEMENTED");
case EpicsType.Display_String:
writer.Write(ToByteArray((ushort)(record["STAT"] ?? 0)));
writer.Write(ToByteArray((ushort)(record["SEVR"] ?? 0)));
for (int i = 0; i < dataCount; i++)
{
writer.Write(ToByteArray(Convert.ToString(source[i]), true));
}
return(mem.ToArray());
#endregion
default:
return(null);
}
}
}
}