private void CatchPresentMessage(object sender, string deviceMessage) { try { var msgs = TCPComm.Utils.SplitIntoMessages(deviceMessage); if (deviceMessage == "") { var con = sender as TCPConnector; con.Dispose(); return; } var msg = BrainMessage.fromString(msgs[0]); if (msg.Token != NetUtils.Token.Token) { //this device is not for our system g_NewErrorFromDevice(null, new Exception($"Bad Token. Expected {NetUtils.Token.Token} found {msg.Token}")); } else if (msg.Order == messageKinds.present) { var con = sender as TCPConnector; con.newRawMessage -= CatchPresentMessage; Limbo.Remove(con); var ZConn = new BrainConnector(con); ZConn.remoteID = int.Parse(msg.Params["myID"].ToString()); ZConn.remoteName = msg.Params["myName"].ToString(); g_newDeviceConnected(this, new ConnectionInfo() { ID = ZConn.remoteID, Name = ZConn.remoteName, Connector = ZConn, Default = msg.Params["Default"]?.ToString(), Solution = msg.Params["Solution"]?.ToString() }); } else if ((msg.Order == messageKinds.deviceClosed)) { // a device was closed before teh present message was sent. We do nothing, the TCPServer layer will remove left overs. return; } else { throw new Exception($"Received a {msg.Order} message from a device that never sent us the Present message"); } } catch (Exception e2) { g_newDebugMessage(this, e2.Message); } }
public BrainConnector(TCPComm.TCPConnector _conn) { connector = _conn; connector.newError += (o1, err) => { g_NewNetworkError(this, err); }; connector.newRawMessage += (o, str) => { if (str == "") { g_DeviceClosed?.Invoke(this, null); connector.Dispose(); return; } var msgs = TCPComm.Utils.SplitIntoMessages(str); foreach (var raw in msgs) { var msg = BrainMessage.fromString(raw); if (msg.Token != NetUtils.Token.Token) { g_WrongToken.Invoke(this, msg); } else { switch (msg.Order) { case messageKinds.heartbeat: break; case messageKinds.present: g_Present?.Invoke(this, msg); break; case messageKinds.update: g_Update(this, msg.Params); break; case messageKinds.deviceClosed: g_DeviceClosed?.Invoke(this, msg); connector.Dispose(); break; case messageKinds.majorErrorInDevice: g_NewErrorFromDevice?.Invoke(this, msg); break; default: throw new Exception($"Unnexpected Order: [{msg.Order}] received from device [{this.remoteName}]"); } } } }; }
public void Send(BrainMessage msg) { Send(msg.Serialize()); }