using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using SafeMobileLib; using System.Diagnostics; using System.Threading; using System.Collections; using AutoUpdaterDotNET; namespace MotoRepeater { public partial class SafeNetForm : Form { private MotoRepeater_GW gateway; public string LocalIPaddress = ""; // database connection to get the config parameters and the units private DBhandle DB; private Thread ThreadUIRefresh; public SafeNetForm() { InitializeComponent(); // set the form result this.DialogResult = System.Windows.Forms.DialogResult.Cancel; // check Credentials Utils.WriteLine("SAFENET", ConsoleColor.Red); // Load the Database configuration LoadConfig(); /* if (MotoRepeater_GW.cfg.GWCODE == 0) { LoginForm lf = new LoginForm(); lf.ShowDialog(); DialogResult dr = lf.DialogResult; if (lf.DialogResult == System.Windows.Forms.DialogResult.OK) { // nothing to do here, all went fine } else { Load += (s, e) => Close(); MotoRepeater_GW.isRunning = false; return; } }*/ // write the username and then move the label to be at the same right corner location int rightCorner = lbUsername.Location.X + lbUsername.Size.Width; lbUsername.Text = MotoRepeater_GW.cfg.USERNAME.ToUpper(); lbUsername.Location = new Point(rightCorner - lbUsername.Size.Width, lbUsername.Location.Y); lbPeerStatus.Text = "peer id " + MotoRepeater_GW.cfg.PEER_ID + " status"; pbButton_Click(pbOverview, null); Utils.WriteLine("Safenet MotoRepeater Gateway. SafeMobile 2015"); Utils.WriteLine(""); Version v = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; Utils.WriteLine(lbVersion.Text = ("Version: " + v.ToString())); this.Text += " " + v.ToString(); lbStatus.Text = "No connection. Please press connect."; lbStatus.Text = "Registrating"; /* this.WindowState = FormWindowState.Minimized; this.Visible = false; Repeater_Notify_Icon.Visible = true; Repeater_Notify_Icon.ShowBalloonTip(500); */ } private void SafeNetForm_Load(object sender, EventArgs e) { if (MotoRepeater_GW.cfg.AUTOUPDATE) AutoUpdater.Start("http://portal.safemobile.com/upload/safenet/updates/safenet_repeater_gateway.xml"); } private void SafeNetForm_FormClosing(object sender, FormClosingEventArgs e) { if (gateway != null) gateway.Stop(); } private void Repeater_Notify_Icon_DoubleClick(object sender, EventArgs e) { this.Visible = true; this.WindowState = FormWindowState.Normal; Repeater_Notify_Icon.Visible = false; } private void MainForm_Resize(object sender, EventArgs e) { if (this.WindowState == FormWindowState.Minimized) { this.Visible = false; Repeater_Notify_Icon.Visible = true; } } private void ContinueConstructor() { Utils.WriteLine("######################## Gateway Code " + MotoRepeater_GW.cfg.GWCODE + " | ID: " + MotoRepeater_GW.cfg.GWID , ConsoleColor.Red); //lbStatus.Text = "Gateway registered. Please press Connect."; lbStatus.Text = "Offline"; gateway = new MotoRepeater_GW(); gateway.PropertyChanged += new PropertyChangedEventHandler(gateway_PropertyChanged); gateway.OnEventToDisplayOnUI += new MotoRepeater_GW.EventToDisplayOnUIDEl(UpdateLabelEvent); gateway.OnGPSInsertedBlocked += Gateway_OnGPSInsertedBlocked; gateway.Start(); if (MotoRepeater_GW.cfg.SLOT1_VOICE || MotoRepeater_GW.cfg.SLOT2_VOICE) gateway.StartLinkEstablishment(); try { Utils.WriteEventLog("Safemobile", "Moto repGateway Gateway ON", EventLogEntryType.Information, 2152); } catch (Exception ex) { Utils.WriteLine("Unable to write log event : " + ex.ToString(), ConsoleColor.Red); } } private void Gateway_OnGPSInsertedBlocked() { RestartApp(); } delegate void PropertyChangedCallback(REP_STATUS register); void gateway_PropertyChanged(object sender, PropertyChangedEventArgs e) { if (MotoRepeater_GW.isRunning) { Utils.WriteLine("### GATEWAY RADIO STATUS IS " + ((MotoRepeater_GW)sender).registered); //SM.Debug("New value for radio status:" + ); PropertyChangedCallback d = new PropertyChangedCallback(RegStatusChanged); try { this.Invoke(d, new object[] { ((MotoRepeater_GW)sender).registered }); } catch (Exception ex) { } } } private void RegStatusChanged(REP_STATUS rStatus) { if (rStatus == REP_STATUS.started) { lbStatus.Text = "DDMS Online"; } else if (rStatus == REP_STATUS.ddmsUP) { lbStatus.Text = "DDMS Online"; UpdateLabelEvent("DDMS is now connected"); } else if (rStatus == REP_STATUS.ddmsDOWN) { lbStatus.Text = "DDMS is down"; UpdateLabelEvent("DDMS is now disconnected"); } else lbStatus.Text = "Offline"; } /// /// Load the configuration parameters for the DataBase /// /// A confirmation that the configurations were successfully loaded, or a negativ /// response in case something went wrong private bool LoadConfig() { bool ret = false; try { MotoRepeater_GW.cfg = new Config(); MotoRepeater_GW.cfg.OnConfigFileWasBroken += delegate() { MessageBox.Show("Something was wrong with your configuration file. " + System.Environment.NewLine + "Now you're running a default configuration. Please reconfigure it or contact " + "support@safemobil.com. " + System.Environment.NewLine + System.Environment.NewLine + "Thank you!", "Reconfiguration needed", MessageBoxButtons.OK, MessageBoxIcon.Exclamation); //System.Environment.Exit(0); }; MotoRepeater_GW.cfg.LoadConfig(MotoRepeater_GW.appType); ret = true; } catch (Exception ex) { Utils.WriteLine("Unable to parse Config File: " + ex.ToString(), ConsoleColor.Red); } return ret; } private void LoadSettings_GUI() { numericARSPort.Value = MotoRepeater_GW.cfg.ARS_PORT; numericDDMSPort.Value = MotoRepeater_GW.cfg.DDMS_PORT; numericLocationPort.Value = MotoRepeater_GW.cfg.GPS_PORT; numericPeerId.Value = MotoRepeater_GW.cfg.PEER_ID; numericRepeaterPort.Value = MotoRepeater_GW.cfg.MASTER_PORT; numericTelemetryPort.Value = MotoRepeater_GW.cfg.TELEMETRY_PORT; numericTextPort.Value = MotoRepeater_GW.cfg.SMS_PORT; tbDDMSIP.Text = MotoRepeater_GW.cfg.DDMS_IP; tbRepeaterIP.Text = MotoRepeater_GW.cfg.MASTER_IP; lbSystemType.Text = Config.GetSystemTypeFromConfig(Config.GetSystemTypeForConfig(MotoRepeater_GW.cfg.SYSTEM_TYPE)); tbAuthKey.Text = MotoRepeater_GW.cfg.AUTHENTICATION_KEY; } /// /// Update the label from the UI in which all events are stored /// /// The message which needs to be written into the label private void UpdateLabelEvent(String message) { try { this.Invoke((MethodInvoker)delegate { tbEvent.BackColor = Color.FromArgb(34, 34, 34); // remove a line /* if (Regex.Matches(labelEvent.Text, Environment.NewLine).Count >= labelEventMaxLines) labelEvent.Text = labelEvent.Text.Substring(labelEvent.Text.IndexOf(Environment.NewLine) + 1); */ // add message at which the date is added tbEvent.AppendText(String.Format("{0:HH:mm:ss} - {1}", DateTime.Now, message) + Environment.NewLine); }); } catch (Exception ex) { Utils.WriteLine("Invoke error" + ex.ToString(), ConsoleColor.Red); } } #region UI private void pbSystemType_Click(object sender, EventArgs e) { cbSystemType.DroppedDown = !cbSystemType.DroppedDown; } private void pbSystemType_MouseEnter(object sender, EventArgs e) { lbSystemType.BackColor = Color.FromArgb(17, 61, 66); pbSystemType.Image = MotoRepeater.Properties.Resources.comboBox_over; } private void pbSystemType_MouseLeave(object sender, EventArgs e) { lbSystemType.BackColor = Color.FromArgb(32, 49, 51); pbSystemType.Image = MotoRepeater.Properties.Resources.comboBox; } private void cbSystemType_SelectedIndexChanged(object sender, EventArgs e) { lbSystemType.Text = cbSystemType.Text; } #region NUMERIC UP DOWN private void pbNumeric_MouseEnter(object sender, EventArgs e) { if (((PictureBox)sender).Tag.Equals("up")) ((PictureBox)sender).Image = MotoRepeater.Properties.Resources.up_over; else if (((PictureBox)sender).Tag.Equals("down")) ((PictureBox)sender).Image = MotoRepeater.Properties.Resources.down_over; } private void pbNumeric_MouseLeave(object sender, EventArgs e) { if (((PictureBox)sender).Tag.Equals("up")) ((PictureBox)sender).Image = MotoRepeater.Properties.Resources.up; else if (((PictureBox)sender).Tag.Equals("down")) ((PictureBox)sender).Image = MotoRepeater.Properties.Resources.down; } private void pbPeerID_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbPeerIDUp) { if (numericPeerId.Value < 16777215) numericPeerId.Value = (numericPeerId.Value) + 1; } else if ((PictureBox)sender == pbPeerIDDown) { if (numericPeerId.Value > 1) numericPeerId.Value = (numericPeerId.Value) - 1; } } private void pbRepeaterPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbRepeaterPortUp) { if (numericRepeaterPort.Value < 16777215) numericRepeaterPort.Value = (numericRepeaterPort.Value) + 1; } else if ((PictureBox)sender == pbRepeaterPortDown) { if (numericRepeaterPort.Value > 1) numericRepeaterPort.Value = (numericRepeaterPort.Value) - 1; } } private void pbDDMSPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbDDMSPortUp) { if (numericDDMSPort.Value < 65000) numericDDMSPort.Value = (numericDDMSPort.Value) + 1; } else if ((PictureBox)sender == pbDDMSPortDown) { if (numericDDMSPort.Value > 1) numericDDMSPort.Value = (numericDDMSPort.Value) - 1; } } private void pbLocationPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbLocationPortUp) { if (numericLocationPort.Value < 65000) numericLocationPort.Value = (numericLocationPort.Value) + 1; } else if ((PictureBox)sender == pbLocationPortDown) { if (numericLocationPort.Value > 1) numericLocationPort.Value = (numericLocationPort.Value) - 1; } } private void pbARSPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbARSPortUp) { if (numericARSPort.Value < 65000) numericARSPort.Value = (numericARSPort.Value) + 1; } else if ((PictureBox)sender == pbARSPortDown) { if (numericARSPort.Value > 1) numericARSPort.Value = (numericARSPort.Value) - 1; } } private void pbTextPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbTextPortUp) { if (numericTextPort.Value < 65000) numericTextPort.Value = (numericTextPort.Value) + 1; } else if ((PictureBox)sender == pbTextPortDown) { if (numericTextPort.Value > 1) numericTextPort.Value = (numericTextPort.Value) - 1; } } private void pbTelemetryPort_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbTelemetryPortUp) { if (numericTelemetryPort.Value < 65000) numericTelemetryPort.Value = (numericTelemetryPort.Value) + 1; } else if ((PictureBox)sender == pbTelemetryPortDown) { if (numericTelemetryPort.Value > 1) numericTelemetryPort.Value = (numericTelemetryPort.Value) - 1; } } #endregion #region BUTTONS LEFT-RIGHT private void pbButton_MouseLeave(object sender, EventArgs e) { if (((PictureBox)sender).Tag.Equals("selected")) ((PictureBox)sender).Image = ((PictureBox)sender == pbSettings) ? MotoRepeater.Properties.Resources.bt_settings3 : MotoRepeater.Properties.Resources.bt_overview3; else if (((PictureBox)sender).Tag.Equals("unselected")) ((PictureBox)sender).Image = ((PictureBox)sender == pbSettings) ? MotoRepeater.Properties.Resources.bt_settings2 : MotoRepeater.Properties.Resources.bt_overview2; } private void pbButton_MouseEnter(object sender, EventArgs e) { if (((PictureBox)sender).Tag.Equals("selected")) ((PictureBox)sender).Image = ((PictureBox)sender == pbSettings) ? MotoRepeater.Properties.Resources.bt_settings3 : MotoRepeater.Properties.Resources.bt_overview3; else if (((PictureBox)sender).Tag.Equals("unselected")) ((PictureBox)sender).Image = ((PictureBox)sender == pbSettings) ? MotoRepeater.Properties.Resources.bt_settings : MotoRepeater.Properties.Resources.bt_overview; } private void pbButton_Click(object sender, EventArgs e) { if ((PictureBox)sender == pbSettings) { pbSettings.Tag = "selected"; pbSettings.Image = MotoRepeater.Properties.Resources.bt_settings; pbOverview.Tag = "unselected"; pbOverview.Image = MotoRepeater.Properties.Resources.bt_overview2; panelOverview.Visible = false; panelSettings.Visible = true; } else if ((PictureBox)sender == pbOverview) { pbOverview.Tag = "selected"; pbOverview.Image = MotoRepeater.Properties.Resources.bt_overview; pbSettings.Tag = "unselected"; pbSettings.Image = MotoRepeater.Properties.Resources.bt_settings2; panelOverview.Visible = true; panelSettings.Visible = false; } } #endregion /// /// Change the username label and picture box image and color /// /// Label or PictureBox which generated the event /// Event arguments private void controlUsername_MouseEnter(object sender, EventArgs e) { pbUsername.Image = MotoRepeater.Properties.Resources.login_user_over; lbUsername.ForeColor = Color.DarkTurquoise; } /// /// Change the username label and picture box image and color /// /// Label or PictureBox which generated the event /// Event arguments private void controlUsername_MouseLeave(object sender, EventArgs e) { pbUsername.Image = MotoRepeater.Properties.Resources.login_user; lbUsername.ForeColor = Color.LightGray; } /// /// Show or hide the settings menu and bind the UI elements to the config file values /// /// Username label or Username Picture Box which generated the event /// Event arguments private void controlUsernameClick(object sender, EventArgs e) { cbMenuKeepSigned.Checked = MotoRepeater_GW.cfg.SIGNEDIN; // clear all gateway codes from the comboBox and fill with the new ones cbMenuGatewayCodes.Items.Clear(); List gateways = DB.GetRepeaterGatewayIDForCredentials(MotoRepeater_GW.cfg.USERNAME, MotoRepeater_GW.cfg.PASSWORD); foreach (SafenetGatewayIdent gw in gateways) { cbMenuGatewayCodes.Items.Add(gw.Code + ""); } cbMenuGatewayCodes.Text = MotoRepeater_GW.cfg.GWCODE+""; panelUsernameSettings.Visible = !panelUsernameSettings.Visible; } /// /// Close the Main form and then show the Login form once again. In the same time, /// the configuration will be reseted to initial blank values /// /// Logout Button which generated the event /// Event arguments private void btMenuLogout_Click(object sender, EventArgs e) { // clear credentials and gateway values from the loaded configuration MotoRepeater_GW.cfg.USERNAME = ""; MotoRepeater_GW.cfg.PASSWORD = ""; MotoRepeater_GW.cfg.GWCODE = 0; MotoRepeater_GW.cfg.GWID = 0; MotoRepeater_GW.cfg.SIGNEDIN = false; // reset credentials and gateway code from the config file Config.UpdateConfigParameter("CREDENTIALS", "USER", ""); Config.UpdateConfigParameter("CREDENTIALS", "PASSWORD", ""); Config.UpdateConfigParameter("CREDENTIALS", "SIGNEDIN", "false"); Config.UpdateConfigParameter("GATEWAY", "CODE", "0"); // flag that the logout was made this.DialogResult = System.Windows.Forms.DialogResult.OK; // close the database connection DB.StopDB(); // close this form in order for the threads to close this.Close(); } /// /// Save the changes made in the menu (eg. gateway code, keep signed in) /// The changes are saved in the cfg file only and will be applied after /// the user will restart the gateway /// /// Save Button which generated the event /// Event arguments private void btMenuSave_Click(object sender, EventArgs e) { // change if the user is remembered or not Config.UpdateConfigParameter("CREDENTIALS", "SIGNEDIN", cbMenuKeepSigned.Checked ? "true" : "false"); Config.UpdateConfigParameter("GATEWAY", "CODE", cbMenuGatewayCodes.Text); // hide username settings panel panelUsernameSettings.Visible = false; // show restart app message MessageBox.Show("You must restart your application for the changes to take effect.", "Save completed"); } #endregion private void SafeNetForm_Shown(object sender, EventArgs e) { // the login frame was canceled close the application if (!MotoRepeater_GW.isRunning) return; // this piese of code will be run after the login is finished DB = new DBhandle(MotoRepeater_GW.cfg.DB_SERVER, MotoRepeater_GW.cfg.DB_DATABASE, MotoRepeater_GW.cfg.DB_USERNAME, MotoRepeater_GW.cfg.DB_PASSWORD); DB.StartDB(); RepeaterConfig repeaterConfig = DB.GetRepeaterGatewayConfiguration(MotoRepeater_GW.cfg.GWCODE); //repeaterConfig.RepeaterIP = "10.120.1.196"; if (repeaterConfig != null) { MotoRepeater_GW.cfg.UpdateRepeaterConfig(repeaterConfig); } else { MessageBox.Show("No configuration for this repeater gateway defined into Database. Please go into Safenet Admin and define one."); return; } // start a thread to get all the units new Thread(delegate() { // load the units from the database DB.LoadUnitInfo(MotoRepeater_GW.cfg.GWCODE); // remove all units in order for the location thread to not find them as new interval units SN_Queues.NewIntervalQueue.Clear(); //DB.StopDB(); }).Start(); // Continue with the Constructor ContinueConstructor(); // update values for settings LoadSettings_GUI(); // enable all services pictureBoxArs.Image = MotoRepeater.Properties.Resources.ars_icon; pictureBoxPosition.Image = MotoRepeater.Properties.Resources.gps_icon; pictureBoxSMS.Image = MotoRepeater.Properties.Resources.sms_icon; pictureBoxDatabase.Image = MotoRepeater.Properties.Resources.database_icon; ThreadUIRefresh = new Thread(delegate() { int count = 0; while (MotoRepeater_GW.isRunning) { if (count++ % 2 == 0) { try { this.Invoke((MethodInvoker)delegate() { lbUnits.Text = SafeMobileLib.SN_Queues.ht_SUInfo.Count + " units assigned" + Environment.NewLine + "to gateway " + MotoRepeater_GW.cfg.GWCODE; lbSMS.Text = MotoRepeater_GW.smsStatistic.incoming + " received" + Environment.NewLine + MotoRepeater_GW.smsStatistic.outgoing + " (re)sent"; lbGPS.Text = MotoRepeater_GW.gpsStatistic.incoming + " positions" + Environment.NewLine + MotoRepeater_GW.pollStatistic.incoming + " poll responses"; }); count = 0; } catch (Exception) { } } Thread.Sleep(500); } } ); ThreadUIRefresh.Start(); } /// /// Restart the application and close other notify icons /// public void RestartApp() { CloseNotifyIcon(); MotoRepeater_GW.isRunning = false; Thread p = new Thread(new ThreadStart(delegate () { //oldProcess.WaitForExit(8000); Process.Start(System.Reflection.Assembly.GetExecutingAssembly().Location, String.Join(" ", Program.commandLineArgs)); CloseApp(); })); p.Start(); } private void CloseApp() { Process oldProcess = Process.GetCurrentProcess(); oldProcess.Kill(); Application.Exit(); } /// /// Hide the notify icon method. This will cause the right bottom icon to be hide /// private void CloseNotifyIcon() { if (Repeater_Notify_Icon != null) { Repeater_Notify_Icon.Visible = false; Repeater_Notify_Icon.Icon = null; Repeater_Notify_Icon.Dispose(); } } } }