Esempio n. 1
0
        public bool SetDataref(DataRef dataref)
        {
            Connect();

            logger.Debug(string.Format("Setting dataref {0} to value {1}", dataref.Name, dataref.Value));

            int retryCount = 2;

            while (retryCount > 0)
            {
                retryCount -= 1;
                switch (setDataRef(dataref))
                {
                case 0:     /* success */
                    return(true);

                case 1:     /* error */
                    return(false);

                case 2:     /* pipe broken */
                    string logMsg = string.Format("Pipe broken - reconnecting and retrying (atttempt {0} of 2)", 2 - retryCount);
                    logger.Warn(logMsg);
                    Connect(true);
                    break;
                }
            }

            return(false);
        }
Esempio n. 2
0
        private static void GetDataRef(dynamic vaProxy)
        {
            string datarefName = vaProxy.GetText("~datarefName");
            string targetVar   = vaProxy.GetText("~targetVar");

            if (targetVar == null || targetVar.Length == 0)
            {
                targetVar = "~~datarefValue";
            }

            DataRef dr = link.GetDataref(datarefName);

            if (dr != null)
            {
                logger.Info("Got dataref: " + dr.ToString());

                if ((dr.DataType & DataRef.Type.Int) != 0)
                {
                    vaProxy.SetInt(targetVar, dr.IntVal);
                }
                else if ((dr.DataType & DataRef.Type.Float) != 0)
                {
                    decimal?d = (decimal)dr.FloatVal;
                    vaProxy.SetDecimal(targetVar, d);
                }
                else if ((dr.DataType & DataRef.Type.Double) != 0)
                {
                    decimal?d = (decimal)dr.DoubleVal;
                    vaProxy.SetDecimal(targetVar, d);
                }
                else if ((dr.DataType & DataRef.Type.IntArray) != 0)
                {
                    throw new ArgumentException("Array datarefs are not yet supported");
                }
                else if ((dr.DataType & DataRef.Type.FloatArray) != 0)
                {
                    throw new ArgumentException("Array datarefs are not yet supported");
                }
                else if ((dr.DataType & DataRef.Type.Data) != 0)
                {
                    vaProxy.SetText(targetVar, string.Join("", dr.Data.Split(',')));
                }
                else
                {
                    throw new ArgumentException("Unknown dataref type: " + dr.DataType);
                }
            }
            else
            {
                logger.Warn("Failed to get dataref: " + datarefName);
            }
        }
Esempio n. 3
0
 private int setDataRef(DataRef dataref)
 {
     try
     {
         logger.Debug("Setting dataref...");
         pipeWriter.Write("set:" + dataref);
         string reply = pipeReader.ReadLine();
         logger.Debug("SetDataRef result: " + reply);
         return(reply == "{ok}" ? 0 : 1);
     }
     catch (IOException)
     {
         return(2);
     }
 }
Esempio n. 4
0
        public DataRef FromObject(string datarefName, int datarefType, object value)
        {
            DataRef r = new DataRef();

            r.Name = datarefName;

            switch (datarefType)
            {
            case 1:
                r.DataType = DataRef.Type.Int;
                r.IntVal   = (int)value;
                break;

            case 2:
                r.DataType = DataRef.Type.Float;
                decimal df = (decimal)value;
                r.FloatVal = (float)df;
                break;

            case 4:
                r.DataType = DataRef.Type.Double;
                decimal dd = (decimal)value;
                r.DoubleVal = (double)dd;
                break;

            case 8:
                r.DataType   = DataRef.Type.FloatArray;
                r.FloatArray = (float[])value;
                break;

            case 16:
                r.DataType = DataRef.Type.IntArray;
                r.IntArray = (int[])value;
                break;

            case 32:
                r.DataType = DataRef.Type.Data;
                r.Data     = (string)value;
                break;

            default:
                logger.Error("Unknown dataref type: " + datarefType);
                return(null);
            }

            return(r);
        }
Esempio n. 5
0
        public DataRef FromString(string expectedDataref, string retrievedDataref)
        {
            logger.Trace("Requested to build dataref " + expectedDataref + " from " + retrievedDataref);
            char[]   delims = { ':' };
            string[] parts  = retrievedDataref.Split(delims, 3);
            if (parts.Length != 3)
            {
                logger.Error("Expected 3 parts to dataref message, but got " + parts.Length);
                return(null);
            }
            string retrievedDatarefName = parts[0];
            int    datarefType          = int.Parse(parts[1]);
            string datarefValue         = parts[2];

            if (retrievedDatarefName != expectedDataref)
            {
                logger.Error("Dataref name mismatch: " + retrievedDataref + " vs " + expectedDataref);
                return(null);
            }

            try
            {
                DataRef r = new DataRef();
                r.Name     = expectedDataref;
                r.DataType = (DataRef.Type)datarefType;
                if ((r.DataType & DataRef.Type.Int) != 0)
                {
                    r.IntVal = int.Parse(datarefValue);
                }
                else if ((r.DataType & DataRef.Type.Float) != 0)
                {
                    r.FloatVal = float.Parse(datarefValue);
                }
                else if ((r.DataType & DataRef.Type.Double) != 0)
                {
                    r.DoubleVal = double.Parse(datarefValue);
                }
                else if ((r.DataType & DataRef.Type.IntArray) != 0)
                {
                    r.FloatArray = datarefValue
                                   .Split(',')
                                   .Select(f => float.Parse(f))
                                   .ToArray();
                }
                else if ((r.DataType & DataRef.Type.FloatArray) != 0)
                {
                    r.IntArray = datarefValue
                                 .Split(',')
                                 .Select(i => int.Parse(i))
                                 .ToArray();
                }
                else if ((r.DataType & DataRef.Type.Data) != 0)
                {
                    r.Data = datarefValue;
                }
                else
                {
                    logger.Error("r.DataType does not match any type: " + r.DataType);
                    return(null);
                }

                logger.Trace("Built dataref: " + r.ToString());
                return(r);
            }
            catch (Exception ex)
            {
                logger.Error(ex.Message);
                return(null);
            }
        }