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; } } }
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; } } }