CaSharpServer.CARecord.GetDouble C# (CSharp) Метод

GetDouble() публичный Метод

public GetDouble ( string key ) : double
key string
Результат double
        public double GetDouble(string key)
        {
            object val = this[key];
            if (val == null)
                return 0;
            if (val is double)
                return (double)((double)val);
            else if (val is int)
                return (double)((int)val);
            else if (val is float)
                return (double)((float)val);
            else if (val is short)
                return (double)((short)val);
            else if (val is long)
                return (double)((long)val);
            else if (val is string)
                return double.Parse((string)val, CultureInfo.InvariantCulture);
            throw new Exception("Doesn't support convertion from type " + val.GetType().FullName);
        }

Usage Example

Пример #1
0
        /// <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);
                    }
                }
            }
        }