using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Telerik.WinControls; using SafeMobileLib; using System.Threading; using Telerik.WinControls.Primitives; using Telerik.WinControls.UI; using System.Collections; using SharedUI; using System.Diagnostics; namespace CPlus_GW { public partial class MainForm : Telerik.WinControls.UI.RadForm { CPlusGW GW; Thread GatewayThreadobj = null; Thread StatusThreadobj = null; private TallysmanReceiveThread TallysmanReceiveConnection = null; private Thread TallysmanReceiveThreadObj = null; private bool connecting = false; private BindingList eventsList = new BindingList(); public static DBvehiclesManager vehiclesManager; public static List vehicles = new List(); public MainForm() { InitializeComponent(); // set datasource for events rlvEvents.DataSource = null; rlvEvents.DataSource = eventsList; Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; SafeMobileLib.Utils.WriteLine(lbVersion.Text = "Version: " + v.ToString(), ConsoleColor.Cyan); //this.Text += " - v." + v.ToString(); SM.Debug("Starting Connect plus GW ",false ); CPlusGW.TextQueue.PostItem("Starting Connect plus GW "); CPlusGW.TextQueue.PostItem("Version: " + v.ToString()); GW = new CPlusGW(); GUIinitSettings(); StartTallysmanService(); } private void btnSave_Click(object sender, EventArgs e) { if ((tbCntrlIP.Text == "") || (tbARSport.Text == "") || (tbGPSport.Text == "") || (tbSMSport.Text == "") || (tbTallysmanport.Text == "") || (tbGPS_R_port.Text == "") || (tbSMS_R_port.Text == "") || (tbMultiIP.Text == "") || (tbMultiPort.Text == "") || (tbGWid.Text == "") || (tbReportInterval.Text == "") ) { RadMessageBox.Show("Please make sure that all textboxes are compleated with coresponding values.", "Invalid input", MessageBoxButtons.OK, RadMessageIcon.Error); return; } Config.SaveConfig(tbCntrlIP.Text, tbARSport.Text, tbGPSport.Text, tbSMSport.Text, tbTallysmanport.Text, tbGPS_R_port.Text, tbSMS_R_port.Text, tbMultiIP.Text, tbMultiPort.Text, tbGWid.Text, tbReportInterval.Text); RadMessageBox.Show("Configs saved to file.\r\nPlease restart the application for this settings to take place.", "Saved", MessageBoxButtons.OK, RadMessageIcon.Info); } private void GUIinitSettings() { tbGWid.Text = Program.cfg.gatewayID; tbCntrlID.Text = "10000"; tbReportInterval.Text = Program.cfg.report; tbCntrlIP.Text = Program.cfg.ctrlIP; tbARSport.Text = Program.cfg.arsPort.ToString(); tbGPSport.Text = Program.cfg.locPort.ToString(); tbGPS_R_port.Text = Program.cfg.locPort_r.ToString(); tbSMSport.Text = Program.cfg.smsPort.ToString(); tbSMS_R_port.Text = Program.cfg.smsPort_r.ToString(); tbTallysmanport.Text = Program.cfg.tallysmanPort.ToString(); tbMultiIP.Text = Program.cfg.multi_IP; tbMultiPort.Text = Program.cfg.multi_port.ToString(); CPlusGW.TextQueue.PostItem(DateTime.Now.ToString()); CPlusGW.TextQueue.PostItem("Welcome to Safemobile Connect plus Gateway."); CPlusGW.TextQueue.PostItem("Controller status:"+((GW.status)?"Online":"Offline")); } private void btnConnect_Click(object sender, EventArgs e) { try { if (!GW.status && !connecting) { CPlusGW.TextQueue.PostItem("Connecting to " + tbCntrlIP.Text); GatewayThreadobj = new Thread(new ThreadStart(GW.Start)); GatewayThreadobj.IsBackground = true; GatewayThreadobj.Start(); btnConnect.Text = "Disconnect"; //btnConnect.Enabled = false; connecting = true; } else { CPlusGW.TextQueue.PostItem("Disconnecting from " + tbCntrlIP.Text); GW.Stop(); GatewayThreadobj.Abort(); btnConnect.Text = "Connect"; connecting = false; } } catch (Exception ex) { SM.Debug(ex.ToString()); CPlusGW.TextQueue.PostItem("Error connecting/diconnecting from controller."); } } void StartTallysmanService() { bool writeGatewayTallysmanStatus = false; //create thread for receiving Tallysman notifications from the radios TallysmanReceiveConnection = new TallysmanReceiveThread((ushort)Program.cfg.tallysmanPort); #region TALLYSMAN Received Events TallysmanReceiveConnection.OnLocationReceived += delegate (LocationEventArgs e) { SafeMobileLib.Utils.WriteLine("LOCATION RECEIVED ON TALLYSMAN from radio " + e.RadioID, ConsoleColor.DarkGreen); }; TallysmanReceiveConnection.OnTelemetryReceived += delegate (TelemetryReceivedEventArgs e) { SafeMobileLib.Utils.WriteLine("TELEMETRY RECEIVED ON TALLYSMAN from radio " + e.RadioID, ConsoleColor.DarkGreen); }; TallysmanReceiveConnection.OnTallysmanEventReceived += delegate (TallysmanEventArgs e) { SafeMobileLib.Utils.WriteLine("EVENT RECEIVED ON TALLYSMAN from radio " + e.RadioID, ConsoleColor.DarkGreen); }; #endregion TallysmanReceiveThreadObj = new Thread(new ThreadStart(TallysmanReceiveConnection.handleConnection)); TallysmanReceiveThreadObj.IsBackground = true; TallysmanReceiveThreadObj.Start(); } //while(true) - this method is threaded with StatusThreadobj private void CheckNewStatusEntry() { while (StatusThreadobj.IsAlive) { string text = CPlusGW.TextQueue.GetItem(-1); if (text != null && text.Trim().Length > 0) AddEvent(text); } } private void AddEvent(String msg) { this.Invoke((MethodInvoker)delegate () { rlvEvents.BeginEdit(); eventsList.Add($"{DateTime.Now:HH:mm:ss} | {msg}"); // remove first item if more thatn 200 if (eventsList.Count > 200) eventsList.RemoveAt(0); rlvEvents.EndEdit(); }); } #region UPDATE /// /// Check for new version release on SafeMobile Portal /// The check is done by comparing Current Assembly Version with the one /// written in a xml file on the portal. /// private void CheckForUpdate() { App appType = App.GW_CPLUS; AutoUpdate au = new AutoUpdate(appType) { IsDevelop = Program.cfg.isDevelop }; au.OnNewVersionAvailable += delegate (string version) { notifyIcon1.Text = "New version available"; notifyIcon1.ShowBalloonTip(2500, $"{App.GetAppName(appType)} version {version} available", $"Press to download and install the latest version of {App.GetAppName(appType)}.", ToolTipIcon.Info); notifyIcon1.BalloonTipClicked += delegate (object sender, EventArgs e) { if (notifyIcon1.Text.Equals("New version available")) { UpdateForm uf = new UpdateForm(appType, true) { IsDevelop = Program.cfg.isDevelop }; uf.Show(); } }; }; // call method to check for new updated au.CheckUpdate(); } #endregion private void MainForm_Load(object sender, EventArgs e) { vehiclesManager = new DBvehiclesManager(Program.cfg.DB_IP, Program.cfg.DB_schema, Program.cfg.DB_user, Program.cfg.DB_passwd, Program.cfg.DB_port); Boolean hasOnlyIntegerValues = false; vehicles = vehiclesManager.getAllVehicles(out hasOnlyIntegerValues, false); StatusThreadobj = new Thread(new ThreadStart(CheckNewStatusEntry)); StatusThreadobj.IsBackground = true; StatusThreadobj.Start(); ContextMenu contextMenu = new ContextMenu(); contextMenu.MenuItems.Add("Check for updates...", (s, e2) => { UpdateForm uf = new UpdateForm(App.GW_CPLUS, true) { IsDevelop = Program.cfg.isDevelop }; uf.Show(); }); contextMenu.MenuItems.Add("Exit", (s, e2) => CloseApp()); notifyIcon1.ContextMenu = contextMenu; // check for a new version if available if (Program.cfg.autoupdate) CheckForUpdate(); // restore previous value rcbAutoReconnect.Checked = Program.cfg.autoReconnect; rcbAutoReconnect.ToggleStateChanged += rcbAutoReconnect_ToggleStateChanged; // auto reconnect to the controller if this option was selected if (Program.cfg.autoReconnect) btnConnect.PerformClick(); } private void CloseApp() { Process oldProcess = Process.GetCurrentProcess(); oldProcess.Kill(); Application.Exit(); } private void rcbAutoReconnect_ToggleStateChanged(object sender, StateChangedEventArgs args) { Program.cfg.SaveConfigOption("GATEWAY", "autoReconnect", rcbAutoReconnect.Checked ? "true" : "false"); Program.cfg.autoReconnect = rcbAutoReconnect.Checked; } } }