示例#1
0
 override public void setBoolean(int byteadr, int bitadr, Boolean state)
 {
     if (connected)
     {
         try
         {
             if (state)
             {
                 ps.Poke("%ix" + byteadr + "." + bitadr, "1", 60000);
                 //Console.WriteLine("Write Bool: %ix"+ byteadr+"."+bitadr+" state="+state);
             }
             else
             {
                 ps.Poke("%ix" + byteadr + "." + bitadr, "0", 60000);
                 //Console.WriteLine("Write Bool: %ix" + byteadr + "." + bitadr+" state="+state);
             }
         }
         catch (Exception e)
         {
             Console.WriteLine("Write Bool:e=" + e);
             //return false;
         }
     }
     //return true;
 }
示例#2
0
 public void Test_Poke_Before_Connect()
 {
     using var server = new TestServer(ServiceName);
     server.Register();
     using var client = new DdeClient(ServiceName, TopicName);
     Assert.Throws<InvalidOperationException>(() => client.Poke(ItemName, Encoding.ASCII.GetBytes(TestData), 1, Timeout));
 }
示例#3
0
 public void Test_Poke_After_Dispose()
 {
     using var server = new TestServer(ServiceName);
     server.Register();
     using var client = new DdeClient(ServiceName, TopicName);
     client.Connect();
     client.Dispose();
     Assert.Throws<ObjectDisposedException>(() => client.Poke(ItemName, Encoding.ASCII.GetBytes(TestData), 1, Timeout));
 }
示例#4
0
 public void Test_Poke()
 {
     using var server = new TestServer(ServiceName);
     server.Register();
     using var client = new DdeClient(ServiceName, TopicName);
     client.Connect();
     client.Poke(ItemName, Encoding.ASCII.GetBytes(TestData), 1, Timeout);
     Assert.AreEqual(TestData, Encoding.ASCII.GetString(server.GetData(TopicName, ItemName, 1)));
 }
示例#5
0
 public void Test_Poke_Before_Connect()
 {
     using (TestServer server = new TestServer(ServiceName))
     {
         server.Register();
         using (DdeClient client = new DdeClient(ServiceName, TopicName))
         {
             client.Poke(ItemName, Encoding.ASCII.GetBytes(TestData), 1, Timeout);
         }
     }
 }
示例#6
0
        public static void Main(string[] args)
        {
            // Wait for the user to press ENTER before proceding.
            Console.WriteLine("The Server sample must be running before the client can connect.");
            Console.WriteLine("Press ENTER to continue...");
            Console.ReadLine();
            try
            {
                // Create a client that connects to 'myapp|mytopic'.
                using (DdeClient client = new DdeClient("myapp", "mytopic"))
                {
                    // Subscribe to the Disconnected event.  This event will notify the application when a conversation has been terminated.
                    client.Disconnected += OnDisconnected;

                    // Connect to the server.  It must be running or an exception will be thrown.
                    client.Connect();

                    // Synchronous Execute Operation
                    client.Execute("mycommand", 60000);

                    // Synchronous Poke Operation
                    client.Poke("myitem", DateTime.Now.ToString(), 60000);

                    // Syncronous Request Operation
                    Console.WriteLine("Request: " + client.Request("myitem", 60000));

                    // Asynchronous Execute Operation
                    client.BeginExecute("mycommand", OnExecuteComplete, client);

                    // Asynchronous Poke Operation
                    client.BeginPoke("myitem", Encoding.ASCII.GetBytes(DateTime.Now.ToString() + "\0"), 1, OnPokeComplete, client);

                    // Asynchronous Request Operation
                    client.BeginRequest("myitem", 1, OnRequestComplete, client);

                    // Advise Loop
                    client.StartAdvise("myitem", 1, true, 60000);
                    client.Advise += OnAdvise;

                    // Wait for the user to press ENTER before proceding.
                    Console.WriteLine("Press ENTER to quit...");
                    Console.ReadLine();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                Console.WriteLine("Press ENTER to quit...");
                Console.ReadLine();
            }
        }
示例#7
0
        override public void setBoolean(int byteadr, int bitadr, Boolean state)
        {
            if (connected)
            {
                // Mapping
                if (state)
                {
                    if (byteadr == 4 && bitadr == 2)
                    {
                        outValue |= 1;
                    }
                    if (byteadr == 4 && bitadr == 3)
                    {
                        outValue |= 2;
                    }
                    if (byteadr == 4 && bitadr == 4)
                    {
                        outValue |= 4;
                    }
                    if (byteadr == 4 && bitadr == 5)
                    {
                        outValue |= 8;
                    }
                    if (byteadr == 5 && bitadr == 0)
                    {
                        outValue |= 16;
                    }
                    if (byteadr == 5 && bitadr == 1)
                    {
                        outValue |= 32;
                    }
                    if (byteadr == 5 && bitadr == 2)
                    {
                        outValue |= 64;
                    }
                }
                else
                {
                    if (byteadr == 4 && bitadr == 2)
                    {
                        outValue &= ~1;
                    }
                    if (byteadr == 4 && bitadr == 3)
                    {
                        outValue &= ~2;
                    }
                    if (byteadr == 4 && bitadr == 4)
                    {
                        outValue &= ~4;
                    }
                    if (byteadr == 4 && bitadr == 5)
                    {
                        outValue &= ~8;
                    }
                    if (byteadr == 5 && bitadr == 0)
                    {
                        outValue &= ~16;
                    }
                    if (byteadr == 5 && bitadr == 1)
                    {
                        outValue &= ~32;
                    }
                    if (byteadr == 5 && bitadr == 2)
                    {
                        outValue &= ~64;
                    }
                }


                try
                {
                    ps.Poke(inMarke, outValue.ToString(), 60000);
                }
                catch (Exception e)
                {
                    Console.WriteLine("Write Bool:e=" + e);
                    //return false;
                }
            }
            //return true;
        }
示例#8
0
        private static void T_Elapsed(object sender, ElapsedEventArgs e)
        {
            Hashtable fieldInputs;

            //Get a local copy of the field inputs
            lock (FieldInputsLock)
            {
                fieldInputs = _FieldInputs;
            }

            //Update inputs
            foreach (var pump in Pumps)
            {
                pump.UpdateInputs(fieldInputs);
            }

            //Run the pump logic
            foreach (var pump in Pumps)
            {
                pump.Run();
            }

            foreach (var flowMeter in FlowMeters)
            {
                flowMeter.Run(Pumps);
            }


            Hashtable fieldOutputs = new Hashtable();

            //Update outputs
            foreach (var pump in Pumps)
            {
                pump.UpdateOutputs(out Hashtable outputs);

                foreach (DictionaryEntry o in outputs)
                {
                    if (!fieldOutputs.ContainsKey(o.Key))
                    {
                        fieldOutputs.Add(o.Key, o.Value);
                    }
                }
            }

            foreach (var flowMeter in FlowMeters)
            {
                flowMeter.UpdateOutputs(out Hashtable outputs);

                foreach (DictionaryEntry o in outputs)
                {
                    if (!fieldOutputs.ContainsKey(o.Key))
                    {
                        fieldOutputs.Add(o.Key, o.Value);
                    }
                }
            }


            if (c != null && c.IsConnected)
            {
                foreach (DictionaryEntry o in fieldOutputs)
                {
                    if (o.Key != null && o.Value != null)
                    {
                        Console.WriteLine("Poke: " + o.Key.ToString() + ": " + o.Value.ToString());
                        string res = o.Value.ToString() == "True" ? "1" : "0";
                        c.Poke(o.Key.ToString(), res, 1000);
                    }
                }
            }
        }
示例#9
0
        public async Task <object> GetInvoker(IDictionary <string, object> input)
        {
            var services  = (IDictionary <string, object>)input["services"];
            var callbacks = (IDictionary <string, object>)input["callbacks"];

            var clients = new List <DdeClient>();

            foreach (string service in services.Keys)
            {
                var topics = (IDictionary <string, object>)services[service];
                foreach (string topic in topics.Keys)
                {
                    DdeClient client = new DdeClient(service, topic);
                    clients.Add(client);
                }
            }

            var onDisconnected = (Func <object, Task <object> >)callbacks["OnDisconnected"];

            foreach (DdeClient client in clients)
            {
                client.Disconnected += async(object sender, DdeDisconnectedEventArgs args) =>
                {
                    var obj = new Dictionary <string, object>();
                    obj["service"]           = client.Service;
                    obj["topic"]             = client.Topic;
                    obj["isDisposed"]        = args.IsServerInitiated;
                    obj["isServerInitiated"] = args.IsServerInitiated;
                    await Task.Run(async() => await onDisconnected(obj));
                };
            }

            var onAdvise = (Func <object, Task <object> >)callbacks["OnAdvise"];

            foreach (DdeClient client in clients)
            {
                client.Advise += async(object sender, DdeAdviseEventArgs args) =>
                {
                    var obj = new Dictionary <string, object>();
                    obj["service"] = client.Service;
                    obj["topic"]   = client.Topic;
                    obj["item"]    = args.Item;
                    obj["text"]    = Encoding.Default.GetString(args.Data).Trim('\0', ' ').ToString();
                    await Task.Run(async() => await onAdvise(obj));
                };
            }

            return((Func <object, Task <object> >)(async(i) =>
            {
                var opts = (IDictionary <string, object>)i;
                var method = (string)opts["method"];
                var command = opts.ContainsKey("command") ? (string)opts["command"] : null;
                var data = opts.ContainsKey("data") ? (string)opts["data"] : null;
                var format = opts.ContainsKey("format") ? (int)opts["format"] : 1;
                var timeout = opts.ContainsKey("timeout") ? (int)opts["timeout"] : 10000;
                var hot = opts.ContainsKey("hot") ? (bool)opts["hot"] : true;
                var callback = opts.ContainsKey("callback")
                    ? (Func <object, Task <object> >)opts["callback"] : (o) => null;

                var results = new List <IDictionary <string, object> >();

/*
 *                              string item = null;
 *                              if (opts.ContainsKey("item"))
 *                              {
 *                                      item = (string)opts["item"];
 *                              }
 *
 *              if (clients.Count == 1 && item != null) // a single client and only one 'item' is supplied.
 *              {
 *                  var client = clients.First();
 *                                      ((IDictionary<string, object>)services[client.Service])[client.Topic] = new[] { item };
 *
 *                  byte[] result = null;
 *
 *                  switch (method)
 *                  {
 *                      case "Request":
 *                          result = client.Request(item, format, timeout);
 *                          return Encoding.Default.GetString(result);
 *                      case "BeginExecute":
 *                          await Task.Run(() =>
 *                          {
 *                              var tcs = new TaskCompletionSource<bool>();
 *                              AsyncCallback cb = (ar) => { tcs.SetResult(true); };
 *                              client.BeginExecute(command, cb, client);
 *                              var r = tcs.Task.Result;
 *                          });
 *                          break;
 *                      case "BeginPoke":
 *                          await Task.Run(() =>
 *                          {
 *                              var tcs = new TaskCompletionSource<bool>();
 *                              AsyncCallback cb = (ar) => { tcs.SetResult(true); };
 *                              var bytes = Encoding.Default.GetBytes((string)opts["data"] + "\0");
 *                              client.BeginPoke(item, bytes, format, cb, client);
 *                              var r = tcs.Task.Result;
 *                          });
 *                          break;
 *                      case "BeginRequest":
 *                          await Task.Run(() =>
 *                          {
 *                              var tcs = new TaskCompletionSource<byte[]>();
 *                              AsyncCallback cb = (ar) =>
 *                              {
 *                                  tcs.SetResult(client.EndRequest(ar));
 *                              };
 *                              client.BeginRequest(item, format, cb, client);
 *                              result = tcs.Task.Result;
 *                          });
 *                          return Encoding.Default.GetString(result);
 *                      case "BeginStartAdvise":
 *                          await Task.Run(() =>
 *                          {
 *                              var tcs = new TaskCompletionSource<bool>();
 *                              AsyncCallback cb = (ar) => { tcs.SetResult(true); };
 *                              client.BeginStartAdvise(item, format, hot, cb, client);
 *                              var r = tcs.Task.Result;
 *                          });
 *                          break;
 *                      case "BeginStopAdvise":
 *                          await Task.Run(() =>
 *                          {
 *                              var tcs = new TaskCompletionSource<bool>();
 *                              AsyncCallback cb = (ar) => { tcs.SetResult(true); };
 *                              client.BeginStopAdvise(item, cb, client);
 *                              var r = tcs.Task.Result;
 *                          });
 *                          break;
 *                      case "Service":
 *                          return client.Service;
 *                      case "Topic":
 *                          return client.Topic;
 *                      case "Handle":
 *                          return client.Handle;
 *                      case "IsConnected":
 *                          return client.IsConnected;
 *                      case "IsPaused":
 *                          return client.IsPaused;
 *                  }
 *              } */

                if (clients.Count != 0)
                {
                    switch (method)
                    {
                    case "Connect":
                        clients.ForEach((c) => c.Connect());
                        break;

                    case "Disconnect":
                        clients.ForEach((c) => c.Disconnect());
                        break;

                    case "Pause":
                        clients.ForEach((c) => c.Pause());
                        break;

                    case "Resume":
                        clients.ForEach((c) => c.Resume());
                        break;

                    case "Execute":
                        clients.ForEach((c) => c.Execute(command, timeout));
                        break;

                    case "Poke":
                        foreach (DdeClient client in clients)
                        {
                            var topics = (IDictionary <string, object>)services[client.Service];
                            var items = (object[])topics[client.Topic];
                            foreach (string item_ in items)
                            {
                                client.Poke(item_, data, timeout);
                            }
                        }
                        break;

                    case "Request":
                        foreach (DdeClient client in clients)
                        {
                            var topics = (IDictionary <string, object>)services[client.Service];
                            // var items = (object[])topics[client.Topic];
                            var items = (object[])opts["item"];
                            foreach (string item_ in items)
                            {
                                var result = client.Request(item_, format, timeout);
                                var obj = new Dictionary <string, object>();
                                obj["service"] = client.Service;
                                obj["topic"] = client.Topic;
                                obj["item"] = item_;
                                obj["result"] = Encoding.Default.GetString(result).Trim('\0', ' ').ToString();
                                results.Add(obj);
                            }
                        }
                        return results.ToArray();

                    case "StartAdvise":
                        foreach (DdeClient client in clients)
                        {
                            var topics = (IDictionary <string, object>)services[client.Service];
                            var items = (object[])topics[client.Topic];
                            foreach (string item_ in items)
                            {
                                client.StartAdvise(item_, format, hot, timeout);
                            }
                        }
                        break;

                    case "StopAdvise":
                        foreach (DdeClient client in clients)
                        {
                            var topics = (IDictionary <string, object>)services[client.Service];
                            var items = (object[])topics[client.Topic];
                            foreach (string item_ in items)
                            {
                                client.StopAdvise(item_, timeout);
                            }
                        }
                        break;

                    case "Dispose":
                        clients.ForEach((c) => c.Dispose());
                        break;

                    case "Service":
                        return clients.Select((c) => c.Service).ToArray();

                    case "Topic":
                        return clients.Select((c) => c.Topic).Distinct().ToArray();

                    case "Handle":
                        return clients.Select((c) => c.Handle).ToArray();

                    case "IsConnected":
                        return clients.All((c) => c.IsConnected);

                    case "IsPaused":
                        return clients.All((c) => c.IsPaused);
                    }
                }

                return null;
            }));
        }