using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net.Sockets; using System.Net; using MotoTRBO_GW; using SafeMobileLib; using System.Collections; using System.Threading; using MotoTRBO_XNL_Cmd; namespace MotoTrbo_GW { class EmergencyThread { private string user4radioCon = "emergency"; private Int32 port; private UdpMulticast udpMulticast; private string trboRadioIP; private String mIP; private Int32 mPort; private RadioConnection rc; private bool ack_needed = false; private System.Threading.Timer timer; public EmergencyThread(RadioConnection rc_var,string trboIP, Int32 emergencyPort, String multicastID, String multicastPort) { port = emergencyPort; trboRadioIP = trboIP; mIP = multicastID; mPort = Int32.Parse(multicastPort); //rc = new RadioConnection(trboIP, port, user4radioCon); rc = rc_var; rc.OnEmergencyEvent += new RadioConnection.EmergencyEvent(radioCon_OnEmergencyEvent); //rc.Start(); //starting timer //timer = new System.Threading.Timer(timerDel, null, new TimeSpan(0, 0, 0), new TimeSpan(0, 0, 10)); } private void timerDel(Object state) { if (ack_needed == true) { SafeMobileLib.Utils.WriteLine("Emergency was not ACK sending ACK again!!!"); rc.SendEmergencyACK(); } } void radioCon_OnEmergencyEvent(int radioId,bool status) { //emergency on if (status) { SafeMobileLib.Utils.WriteLine("Received emergency from radio id: " + radioId); string seqID = "0.0"; string toSend = "#138#" + radioId + "#"; String cmdok = "#" + seqID + toSend; Int32 tmp = cmdok.Length + 1; tmp += tmp.ToString().Length; cmdok = "#" + tmp.ToString() + cmdok; System.Text.Encoding enc = System.Text.Encoding.ASCII; byte[] buf = enc.GetBytes(cmdok); //put on multicast bus SafeMobileLib.Utils.WriteLine("Emergency alarm sent on multicast bus: " + cmdok); udpMulticast.Send(buf, buf.Length); //add timer for ack timer = new System.Threading.Timer(timerDel, null, new TimeSpan(0, 0, 10), new TimeSpan(0, 0, 10)); ack_needed = true; } //emergency off else { SafeMobileLib.Utils.WriteLine("Received emergency ACK for radio id: " + radioId); ack_needed = false; timer = null; } } public void handleConnection() { SafeMobileLib.Utils.WriteLine("Emergency Thread - Initialized on Port " + port); try { udpMulticast = new UdpMulticast(mIP, mPort); SafeMobileLib.Utils.WriteLine("Emergency thread successfully registered to multicast group"); } catch (Exception ex) { SafeMobileLib.Utils.WriteLine("Emergency Thread exception while joining the multicast group: " + ex.ToString()); } while (true) { Thread.Sleep(100); } } public void Disconnect() { /* if (rc != null) { rc.Stop(); rc = null; } */ if (udpMulticast != null) { udpMulticast.StopListen(); udpMulticast = null; } if (timer != null) { timer.Dispose(); timer = null; } rc.OnEmergencyEvent -= new RadioConnection.EmergencyEvent(radioCon_OnEmergencyEvent); } } }