Ejemplo n.º 1
0
        void Run()
        {
            // Preallocate messages (not thread-safe)
            var header = new Header();
            var getVariablesMessage     = new GetVariablesMessage();
            var setVariableValueMessage = new SetVariableValueMessage();
            var getCommandsMessage      = new GetCommandsMessage();
            var executeCommandMessage   = new ExecuteCommandMessage();

            for (; ;)
            {
                try {
                    ReadHeader(header);

                    DebugPrint("Received header: " + header.ToString());

                    switch (header.Operation)
                    {
                    case ControlOp.GetVariables:
                        ReadMessage(getVariablesMessage);
                        ProcessMessage(getVariablesMessage);
                        break;

                    case ControlOp.SetVariableValue:
                        ReadMessage(setVariableValueMessage);
                        ProcessMessage(setVariableValueMessage);
                        break;

                    case ControlOp.GetCommands:
                        ReadMessage(getCommandsMessage);
                        ProcessMessage(getCommandsMessage);
                        break;

                    case ControlOp.ExecuteCommand:
                        ReadMessage(executeCommandMessage);
                        ProcessMessage(executeCommandMessage);
                        break;

                    default:
                        // Unrecognized operation
                        UnknownMessage unknownMessage = new UnknownMessage();
                        ReadMessage(unknownMessage);
                        break;
                    }
                }
                catch (Exception ex) {
                    DebugPrint("!! " + ex + "\n");
                    throw;
                }
            }
        }
Ejemplo n.º 2
0
        public async Task RunAsync(CancellationToken cancellationToken)
        {
            await GetVariablesAsync();
            await GetCommandsAsync();

            var header = new Header();

            while (!cancellationToken.IsCancellationRequested)
            {
                await ReadHeaderAsync(header);

                Debug.WriteLine("Got header: " + header.ToString());

                switch ((ControlOp)header.Operation)
                {
                case ControlOp.Variable:
                {
                    var m = new VariableMessage();
                    await ReadMessageAsync(m);

                    var v = variables.FirstOrDefault(x => x.Id == m.Id);
                    if (v == null)
                    {
                        var cv = new ClientVariable {
                            Client      = this,
                            Id          = m.Id,
                            Name        = m.Name,
                            IsWriteable = m.IsWriteable,
                        };
                        cv.SetValue(m.Value);
                        v = cv;
                        Schedule(() => variables.Add(v));
                    }
                }
                break;

                case ControlOp.VariableValue:
                {
                    var m = new VariableValueMessage();
                    await ReadMessageAsync(m);

                    var cv = variables.FirstOrDefault(x => x.Id == m.Id) as ClientVariable;
                    if (cv != null)
                    {
                        var newVal = m.Value;
                        Schedule(() => cv.SetValue(newVal));
                    }
                    else
                    {
                        await GetVariablesAsync();
                    }
                }
                break;

                case ControlOp.Command:
                {
                    var m = new CommandMessage();
                    await ReadMessageAsync(m);

                    var c = commands.FirstOrDefault(x => x.Id == m.Id);
                    if (c == null)
                    {
                        var cc = new Command {
                            Id   = m.Id,
                            Name = m.Name,
                        };
                        c = cc;
                        Schedule(() => commands.Add(c));
                    }
                }
                break;

                default:
                {
                    var m = new UnknownMessage();
                    await ReadMessageAsync(m);

                    Debug.WriteLine("Ignoring message: " + m.ToString());
                }
                break;
                }
            }
        }