SafeDispatch/Safedispatch_4_0/maptab/Radio/RadioTab.cs

5703 lines
257 KiB
C#
Raw Permalink Normal View History

2024-02-22 16:43:59 +00:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Telerik.WinControls;
using Telerik.WinControls.UI;
using System.Threading;
using Telerik.WinControls.Data;
using System.Runtime.InteropServices;
using SafeMobileLib;
using System.Collections;
using System.IO;
using NAudio.CoreAudioApi;
using Dispatcher.maptab.UIClasses;
using System.Globalization;
using NAudio.Wave;
using System.Diagnostics;
namespace Safedispatch_4_0.Radio
{
public partial class RadioTab : UserControl
{
private MainForm2 parent;
private BindingList<Recording> recordingsList = new BindingList<Recording>();
private List<Subscriber> subscribersList = new List<Subscriber>();
public TcpClass tcpAudio;
private Size normalSizeAudioSettings;
private Size normalSizeChannelSettings;
private DBrecordingsManager db;
public SMdb_access smdbObj = null;
public MainForm2 mainparent;
public volatile Boolean RecivedData = false;
private Hashtable AllCallHT = new Hashtable();
private Hashtable rgwHTByName = new Hashtable();
private Dictionary<string, bool> PriorityEmergency = new Dictionary<string, bool>();
DBgatewaysManager DBgw;
private DBcallPatchManager dbpatch = new DBcallPatchManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB);
private Telerik.WinControls.UI.RadDesktopAlert RemoteMonitorDesktopAlert;
List<Patch> dbPatches;
private SafeMobileLib.Recording toAddRecording = null;
[DllImport("winmm.dll")]
public static extern int waveOutGetVolume(IntPtr hwo, out uint dwVolume);
[DllImport("winmm.dll")]
public static extern int waveOutSetVolume(IntPtr hwo, uint dwVolume);
List<User> dispatchers = new List<User>();
List<RadioGateway> radiogateways = new List<RadioGateway>();
List<string> patchList = new List<string>();
Dictionary<string, List<string>> patchDictionary = new Dictionary<string, List<string>>();
List<String> runningPatches = new List<string>();
public static int voicemanager_sampleRate = 8000;
public static int voicemanager_bufferMilliseconds = 32;
public static int voicemanager_bitDepth = 16;
public RadioTab(MainForm2 parent)
{
InitializeComponent();
mainparent = parent;
pbPTT.BackColor = Color.Transparent;
pbPTT.Parent = pbSpectrum;
pbPTT.Location = new Point(8, 8);
this.parent = parent;
panelInterConnect.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None;
panelInterConnect.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed;
panelAudioSettings.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None;
panelAudioSettings.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed;
panelChannelSettings.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None;
panelChannelSettings.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed;
panelCallHistory.ControlsContainer.PanelContainer.BorderStyle = BorderStyle.None;
panelCallHistory.ControlsContainer.PanelElement.Border.Visibility = ElementVisibility.Collapsed;
panelSettings.Collapse();
#region THEMING
/*
btPrintReport.ButtonElement.ButtonFillElement.BackColor = MainForm2.ButtonColor;
labelReportName.ForeColor = MainForm2.LabelColor;
rgbReport.GroupBoxElement.Header.Border.TopColor = MainForm2.ButtonColor;
rgbReport.GroupBoxElement.Header.Border.TopShadowColor = MainForm2.ButtonColor;
rgbReport.GroupBoxElement.Header.TextPrimitive.ForeColor = MainForm2.ButtonColor;*/
pbPlayTestSound.Image = themePlay_Image;
pb24H.Image = theme24H_Image;
btRecordingsList_EnabledChanged(btRecordingsList, null);
if (MainForm2.radioType == RADIOTYPE.REPEATER_TRBO)
{
// flag that recordings layout should be for repeater
RecordingGridCellElement.REPEATER_LAYOUT = true;
radPanel3.Visible = false;
radPanel5.Visible = false;
rcbBubble.Visible = false;
panelCallHistory.Invalidate();
panelCallHistory.Refresh();
panelCallHistory.Location = new Point(0, 0);
radPanel6.Location = new Point(radPanel6.Location.X, 0);
radPanel4.Size = this.Size;
radPanel4.Dock = DockStyle.Fill;
radPanel4.BringToFront();
panelCallHistory.Size = this.Size;
panelCallHistory.Dock = DockStyle.Fill;
}
#endregion
// create the toolTip that will be displayed when the user sets a pattern
// over the hint pictureBox
toolTipHelp = new ToolTip();
toolTipHelp.ToolTipTitle = "Live";
toolTipHelp.AutoPopDelay = 0;
toolTipHelp.InitialDelay = 0;
toolTipHelp.ReshowDelay = 0;
toolTipHelp.IsBalloon = false;
toolTipHelp.ShowAlways = true;
//load all the gateways for our user
LoadAllGateways();
//init all multicast listener
StartVoiceMulticast(MainForm2.radioType);
#region RECORDINGS LIST
db = new DBrecordingsManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB);
RecordingGridColumn ctc = new RecordingGridColumn("recording");
ctc.AllowResize = true;
ctc.AllowGroup = true;
ctc.Name = "recording";
ctc.FieldName = "recording";
ctc.HeaderText = "recording";
ctc.AutoSizeMode = BestFitColumnMode.AllCells;
ctc.HeaderTextAlignment = ContentAlignment.MiddleLeft;
ctc.SortOrder = RadSortOrder.Ascending;
this.gridRecordings.TableElement.RowHeight = 59;
this.gridRecordings.Columns.Add(ctc);
this.gridRecordings.Columns.Move(ctc.Index, 0);
this.gridRecordings.GridViewElement.DrawBorder = false;
this.gridRecordings.GridViewElement.GroupPanelElement.DrawBorder = false;
rdpStartTime.Value = DateTime.Now.Date;
rdpEndTime.Value = DateTime.Now.Date.AddDays(1);
// set time grouping
pbFilter_Click(pbFilterTime, null);
#endregion
#region SUBSCRIBERS LIST
listViewSubscribers.ItemSize = new Size(180, 140);
listViewSubscribers.ItemSpacing = 5;
listViewSubscribers.AllowArbitraryItemHeight = false;
listViewSubscribers.AllowArbitraryItemWidth = false;
listViewSubscribers.AllowColumnReorder = false;
listViewSubscribers.AllowEdit = false;
listViewSubscribers.AllowRemove = false;
listViewSubscribers.EnableFiltering = true;
// Populate_subscriber_list();
//listSubscribers.DataSource = subscribersList;
//listSubscribers.DisplayMember = "DispatcherName";
//listSubscribers.EnableCustomGrouping = true;
listViewSubscribers.EnableGrouping = true;
listViewSubscribers.ShowGroups = true;
ListViewDataItemGroup docGroup = new ListViewDataItemGroup("Offline");
ListViewDataItemGroup diskGroup = new ListViewDataItemGroup("Online");
listViewSubscribers.Groups.Add(docGroup);
listViewSubscribers.Groups.Add(diskGroup);
/*
foreach(ListViewDataItem item in listSubscribers.Items)
{
if ((item.DataBoundItem as Subscriber).Offline)
item.Group = docGroup;
else
item.Group = diskGroup;
}*/
// ORDER OF THE GROUPS STARTING WITH ALL AND ENDING WITH SUBSCRIBERS
ListSortDirection sortDirection = String.Compare("Online", "Offline") <= 0 ? ListSortDirection.Descending : ListSortDirection.Ascending;
GroupDescriptor groupByValue = new GroupDescriptor(new SortDescriptor[] { new SortDescriptor("SubscriberTypeRegion", sortDirection) });
listViewSubscribers.GroupDescriptors.Add(groupByValue);
//foreach(ListViewDataItemGroup group in listSubscribers.Groups)
{
}
#endregion
#region FAVORITES LIST
listFavorites.ItemSize = new Size(180, 140);
listFavorites.ItemSpacing = 5;
listFavorites.AllowArbitraryItemHeight = false;
listFavorites.AllowArbitraryItemWidth = false;
listFavorites.AllowColumnReorder = false;
listFavorites.AllowEdit = false;
listFavorites.AllowRemove = false;
listFavorites.EnableFiltering = true;
((IconListViewElement)this.listFavorites.ListViewElement.ViewElement).Orientation = Orientation.Horizontal;
//listFavorites.DataSource = subscribersList;
//listSubscribers.DisplayMember = "DispatcherName";
//listSubscribers.EnableCustomGrouping = true;
listFavorites.EnableGrouping = false;
listFavorites.ShowGroups = false;
FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true);
listFavorites.FilterDescriptors.Clear();
listFavorites.FilterDescriptors.Add(valueFilter);
#endregion
#region GATEWAY LIST
rlvGatewayStatus.ItemSize = new Size(100, 90);
rlvGatewayStatus.ItemSpacing = 5;
rlvGatewayStatus.AllowArbitraryItemHeight = false;
rlvGatewayStatus.AllowArbitraryItemWidth = false;
rlvGatewayStatus.AllowColumnReorder = false;
rlvGatewayStatus.AllowEdit = false;
rlvGatewayStatus.AllowRemove = false;
((IconListViewElement)this.rlvGatewayStatus.ListViewElement.ViewElement).Orientation = Orientation.Horizontal;
rlvGatewayStatus.EnableGrouping = false;
rlvGatewayStatus.ShowGroups = false;
#endregion
#region InitComunication
try
{
smdbObj = new SMdb_access();
ArrayList tmpSound = smdbObj.GetSoundCards(0);
if (tmpSound.Count > 0)
{
selectedOUTDeviceName = tmpSound[0].ToString();
selectedINDeviceName = tmpSound[1].ToString();
//if (tmpSound.Count > 2)
// MainForm2.KeyforPTTall = tmpSound[2].ToString();
//else
// MainForm2.KeyforPTTall = "";
}
else
{
selectedOUTDeviceName = "";
selectedINDeviceName = "";
}
}
catch (Exception ex)
{
SM.Debug("Unable to load sound settings." + ex.ToString());
}
// create the TCP for Audio voice received from mbus
InitListToPlay();
//iniVoiceComponents();
InitAudioInputDevices();
InitAudioOutputDevices();
StartnVoice();
/*udp4Voice2 = new UdpMulticast(voiceMulticastIP2, Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port));
udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv);
udp4Voice2.StartListen();*/
//MainForm2.tcpforClose = tcp;
//MainForm2.tcpAudioforClose = tcpAudio;
MainForm2.VoiceTabStarted = true;
CheckMessage.RunWorkerAsync();
#endregion
SetLanguages();
listBoxRadioGateways.DataSource = MainForm2.myGatewaylist;
listBoxRadioGateways.DisplayMember = "DisplayedMemeber";
DBgw.gelAllGatewaysAndRadioGatewaysHT(ref MainForm2.radioGwHT);
rgwHTByName = DBgw.gelAllGatewaysAndRadioGatewaysHTByName();
timer1.Start();
List<RadioGateway> rgw = MainForm2.myGatewaylist.ToList();
rgw.Add(new RadioGateway() { Gw_id = 0, Id = 0, Name = MainForm2.returnLNGString("Unassigned") });
rcbddGateways.DataSource = rgw; //MainForm2.myGatewaylist;
rcbddGateways.DisplayMember = "Name";
rcddlRecordingsGateways.DataSource = rgw; //MainForm2.myGatewaylist;
rcddlRecordingsGateways.DisplayMember = "Name";
#region Sip
AttachEventHandlers();
parent.SipClassInitialized += SipClassInititializedInMainForm;
#endregion
this.parent.OnRadioGatewayStatusChanged += parent_OnRadioGatewayStatusChanged;
this.parent.OnCallStatusHangChanged += parent_OnCallStatusHangChanged;
panelCallHistory.Visible = pbFilterTime.Visible = pbFilterType.Visible = pbFilterUser.Visible = pbFilterDirection.Visible = MainForm2.recordingsDecide;
}
#region Sip Class Event Handlers
private void SipClassInititializedInMainForm(object sender, EventArgs e)
{
AttachEventHandlers();
}
private void AttachEventHandlers()
{
parent.AddDialogCreatedEventHandler(SipDialogCreated);
if (MainForm2.recordingsDecide)
{
parent.AddVoiceReceivedEventHandler(SipVoiceReceived_Recordings);
}
else
parent.AddVoiceReceivedEventHandler(SipVoiceReceived);
parent.AddDialogClosedEventHandler(SipDialogClosed);
parent.AddHangtimeEventHandler(SipHangtime);
parent.AddErrorOnCreatingDialogEventHandler(SipErrorOnCreatingDialog);
parent.AddSdCannotSendVoiceEventArgs(SdCannotSendSipVoice);
parent.AddSdCanSendSipVoiceEventHandler(SdCanSendSipVoice);
parent.AddSdReceivesSipCallInintEventHandler(SdReceivesSipCallInit);
}
private void SipDialogCreated(object sender, Dispatcher.Sip.SipDialogCreatedEventArgs e)
{
// Just show a message
string dialogType = e.GroupId.HasValue ? "Group dialog with " + e.GroupId.Value : "Private dialog";
Utils.WriteLine($"{dialogType} created; {e.SipIdWhoSentInvite} sent the invite to {e.SipIdWhoReceivedInvite}");
}
private void SipVoiceReceived(object sender, Dispatcher.Sip.SipVoiceReceivedEventArgs e)
{
// put the voice on audio output
if (buffWaveProvider != null)
{
string audioSourceSipID = e.GroupId != null ? e.GroupId : e.CallSourceId.ToString();
int audioSourceSipID_int = int.Parse(audioSourceSipID);
int audioSourceRadioID = parent.ContactLinxFromSipID(audioSourceSipID_int)?.Id ?? audioSourceSipID_int;
if (MainForm2.PriorityIP == audioSourceRadioID.ToString())
{
try
{
buffWaveProvider.AddSamples(e.Buffer, 0, e.Buffer.Length);
}
catch(Exception ex)
{
Utils.WriteLine(ex.Message, ConsoleColor.Red);
}
}
}
}
private void SipVoiceReceived_Recordings(object sender, Dispatcher.Sip.SipVoiceReceivedEventArgs e)
{
SipVoiceReceived(null, e);
// There is a licence for recordings
// I will also put the voice on mBus
parent.UdpMultForGwRecording.Send(e.Buffer, e.Buffer.Length);
}
private void SipDialogClosed(object sender, Dispatcher.Sip.SipDialogClosedEventArgs e)
{
string callType = e.GroupId == null ? "Private sip dialog" : "Group sip dialog";
Utils.WriteLine($"{callType} with {e.SipIdInDialogWith} was closed by {e.SipIdWhoClosed}");
if (PTTinprogres // SD sends voice
&& (e.SipIdWhoClosed == e.SipIdInDialogWith) // and SD receives Bye from a unit
&& (e.SipIdWhoClosed == selected_Subscriber.SipID) // and the unit that sends bye is the one that SD has called (in selectedSubscriber?)
)
{
// I received deKey from Linx
killPTT = true;
PTTinprogres = false;
pttIsPressed = false;
RecivedData = MainForm2.PriorityIP != "";
Thread.Sleep(60);
pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00;
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt;
spectrumCount = 0;
this.Invoke((Action)(() => {
ManageSafeDispatchRingingSound(false);
}));
}
else
{
// Here I will Simulate call end
SimulateCallEnded(
parent.ContactLinxFromSipID(e.SipIdInDialogWith)?.Id.ToString() ?? e.SipIdInDialogWith.ToString(),
e.GroupId != null ? parent.ContactLinxFromSipID(int.Parse(e.GroupId))?.Id.ToString() ?? e.GroupId : MainForm2.userIDX.ToString(),
e.GroupId != null ? SafeMobileLib.CallType.GROUPCALL : SafeMobileLib.CallType.PRIVATECALL,
parent.ContactLinxFromSipID(e.SipIdInDialogWith)?.Type ?? ContactType.UNIT);
}
}
private void SipHangtime(object sender, Dispatcher.Sip.SdReceivedCallStatusEventArgs e)
{
string sourceCallRadioId = parent.ContactLinxFromSipID(e.SourceCallSipId)?.Id.ToString() ?? e.SourceCallSipId.ToString();
string targetCallId = e.GroupCall ?
parent.ContactLinxFromSipID(e.GroupSipId.Value)?.Id.ToString() ?? e.GroupSipId.Value.ToString()
: MainForm2.userIDX.ToString();
// Here I will Simulate hangtime
if (MainForm2.recordingsDecide)
{
// Send 125 with 2
int groupCallType = e.GroupCall ? 103 : 102;
// send 125 on mbus
// I changed the length of the command by adding a last "parameter": #0#
// Sd will not process this longer command, only AppServer will do it for recordings
string toSend = $"#0.0#125#{parent.SipGWIDandRadioID}.{sourceCallRadioId}#2#{groupCallType}#{targetCallId}#0#";
parent.Send_UDP_cmd_sent_withOutID(toSend);
}
SimulateHangtime(
sourceCallRadioId,
targetCallId,
e.GroupCall ? SafeMobileLib.CallType.GROUPCALL : SafeMobileLib.CallType.PRIVATECALL,
parent.ContactLinxFromSipID(e.SourceCallSipId)?.Type ?? ContactType.UNIT);
}
private void SipErrorOnCreatingDialog(object sender, SipComponent.ErrorEventArgs e)
{
// Show error
Utils.WriteLine($"Error on Invite from {e.FromID} to {e.ToID}; Reason: {e.Reason}", ConsoleColor.Red);
}
private void SdReceivesSipCallInit(object sender, Dispatcher.Sip.SdReceivedCallStatusEventArgs e)
{
string sourceCallRadioId = parent.ContactLinxFromSipID(e.SourceCallSipId)?.Id.ToString() ?? e.SourceCallSipId.ToString();
string targetCallId = e.GroupCall ?
parent.ContactLinxFromSipID(e.GroupSipId.Value)?.Id.ToString() ?? e.GroupSipId.Value.ToString()
: MainForm2.userIDX.ToString();
if (MainForm2.recordingsDecide)
{
int groupCallType = e.GroupCall ? 103 : 102;
// send 125 on mbus
string toSend = $"#0.0#125#{parent.SipGWIDandRadioID}.{sourceCallRadioId}#1#{groupCallType}#{targetCallId}#0#";
parent.Send_UDP_cmd_sent_withOutID(toSend);
}
SimulateCallInitiated(
sourceCallRadioId,
targetCallId,
e.GroupCall ?
SafeMobileLib.CallType.GROUPCALL
: SafeMobileLib.CallType.PRIVATECALL,
parent.ContactLinxFromSipID(e.SourceCallSipId)?.Type ?? ContactType.UNIT);
}
private void SdCanSendSipVoice(object sender, Dispatcher.Sip.SdCanSendVoiceEventArgs e)
{
// Stop the ringing
this.Invoke((Action)(() => { ManageSafeDispatchRingingSound(true); }));
// SafeDispatch can now send voice
SDcanSendVoice(e.TargetSipId, e.GroupCall);
}
private void SdCannotSendSipVoice(object sender, Dispatcher.Sip.SdCannotSendVoiceEventArgs e)
{
// Show console info
Utils.WriteLine($"Cannot send ptt to {e.TargetSipId} because {e.Reason}", ConsoleColor.DarkRed);
// Stop the ringing
this.Invoke((Action)(() => { ManageSafeDispatchRingingSound(false); }));
// Check if the failed attempt was private or group call
ContactType linxType = parent.ContactLinxFromSipID(e.TargetSipId)?.Type ?? ContactType.UNIT;
if (linxType == ContactType.GROUP)
{
// Do here what I do when receiving 123 with 2;
Handle123Command(this.IdVOL = 2);
// Show event on System log
// If target sip id is 16777215, then it's an all call
int mBusCmd = e.TargetSipId == 16777215 ? 121 : 123;
// #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID#
string cmd = "";
Utils.Convert_text_For_multicast(
2024-06-07 13:20:57 +00:00
$"#1234#{mBusCmd}#{parent.SipGWIDandRadioID.Split(".".ToCharArray())[0]}.{parent.SipGWIDandRadioID.Split(".".ToCharArray())[1]}#2#{MainForm2.userIDX}#",
2024-02-22 16:43:59 +00:00
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
else
{
// Do here what I do when receiving 122 with 2;
Handle122Command(this.IdVOL = 2);
// trigger event for the map
parent.RaiseOnCallStatusChangedEvent(
parent.ContactLinxFromSipID(e.TargetSipId)?.Name ?? "",
false,
false);
// Show event on System log
// #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID#
string cmd = "";
Utils.Convert_text_For_multicast(
2024-06-07 13:20:57 +00:00
$"#1234#122#{parent.SipGWIDandRadioID.Split(".".ToCharArray())[0]}.{parent.SipGWIDandRadioID.Split(".".ToCharArray())[1]}#2#{MainForm2.userIDX}#",
2024-02-22 16:43:59 +00:00
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
}
#endregion
#region Private methods for Sip
private void SDcanSendVoice(int targetSipID, bool groupCall)
{
string cmd = "";
if (groupCall)
{
// SD can send voice for sip group call
// If group id is 16777215, then it's an all call
int mbusCmd = targetSipID == 16777215 ? 121 : 123;
if (!MainForm2.recordingsDecide)
{
// Do here what I do when receiving 123 with 1;
Handle123Command(this.IdVOL = 1);
// Show event on System log
// #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID#
Utils.Convert_text_For_multicast(
2024-06-07 13:20:57 +00:00
$"#1234#{mbusCmd}#{parent.SipGWIDandRadioID.Split(".".ToCharArray())[0]}.{parent.SipGWIDandRadioID.Split(".".ToCharArray())[1]}#1#{MainForm2.userIDX}#",
2024-02-22 16:43:59 +00:00
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
else
{
// Send 123 with 1 on Mbus, so that AppServer will record
string seqId = parent.GetCallRequestForSip(targetSipID);
if (seqId != null)
{
2024-06-07 13:20:57 +00:00
cmd = $"#{seqId}#{mbusCmd}#{parent.SipGWIDandRadioID.Split(".".ToCharArray())[0]}.{parent.SipGWIDandRadioID.Split(".".ToCharArray())[1]}#1#{MainForm2.userIDX}#";
2024-02-22 16:43:59 +00:00
parent.Send_UDP_cmd_sent_withOutID(cmd);
}
}
}
else
{
// SD can send voice for sip private call
if (!MainForm2.recordingsDecide)
{
// Do here what I do when receiving 122 with 1;
Handle122Command(this.IdVOL = 1);
// Trigger event for the map
parent.RaiseOnCallStatusChangedEvent(
parent.ContactLinxFromSipID(targetSipID)?.Name, true, false);
// Show event on System log
// #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID#
Utils.Convert_text_For_multicast(
2024-06-07 13:20:57 +00:00
$"#1234#122#{parent.SipGWIDandRadioID.Split(".".ToCharArray())[0]}.{parent.SipGWIDandRadioID.Split(".".ToCharArray())[1]}#1#{MainForm2.userIDX}#",
2024-02-22 16:43:59 +00:00
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
else
{
// Send 122 with 1 on Mbus, so that AppServer will record
string seqId = parent.GetCallRequestForSip(targetSipID);
if (seqId != null)
{
cmd = $"#{seqId}#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#1#{MainForm2.userIDX}#";
parent.Send_UDP_cmd_sent_withOutID(cmd);
}
}
}
}
private void SimulateCallInitiated(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType callType, ContactType sourceType)
{
2024-06-07 13:20:57 +00:00
string[] tmpArr = parent.SipGWIDandRadioID.Split(".".ToCharArray());
string gwID = tmpArr[0];
string radioGwID = tmpArr[1];
2024-02-22 16:43:59 +00:00
parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 1, (int)callType, int.Parse(targetCallSipID), true);
// Add info in system tab
//#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId#
string cmd = "";
Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#1#{(int)callType}#{targetCallSipID}#", out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd, sourceType); }));
// Show call window
this.Invoke((Action)(() =>
{
Handle125Command(gwID, radioGwID,
callStatusVOL = 1,
callTypeVOL = (int)callType,
grpIDVOL = callType == SafeMobileLib.CallType.PRIVATECALL ? MainForm2.userIDX : int.Parse(targetCallSipID),
int.Parse(sourceCallSipID),
sourceType);
}));
}
private void SimulateHangtime(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType typeOfCall, ContactType sourceCallType)
{
2024-06-07 13:20:57 +00:00
string[] tmpArr = parent.SipGWIDandRadioID.Split(".".ToCharArray());
string gwID = tmpArr[0];
string radioGwID = tmpArr[1];
2024-02-22 16:43:59 +00:00
parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 2, (int)typeOfCall, int.Parse(targetCallSipID), true);
// Show info in System Tab
// Add info in system tab
//#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId#
string cmd = "";
Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#2#{(int)typeOfCall}#{targetCallSipID}#", out cmd);
this.Invoke((Action)(() => {
Handle125Command(gwID, radioGwID, callStatusVOL = 2, callTypeVOL = (int)typeOfCall, grpIDVOL = MainForm2.userIDX, int.Parse(sourceCallSipID));
parent.AddDataToSystemGrid(false, cmd, sourceCallType);
}));
}
private void SimulateCallEnded(string sourceCallSipID, string targetCallSipID, SafeMobileLib.CallType typeOfCall, ContactType sourceCallType)
{
2024-06-07 13:20:57 +00:00
string[] tmpArr = parent.SipGWIDandRadioID.Split(".".ToCharArray());
string gwID = tmpArr[0];
string radioGwID = tmpArr[1];
2024-02-22 16:43:59 +00:00
parent.Handle125Command(gwID, radioGwID, sourceCallSipID, 3, (int)typeOfCall, int.Parse(targetCallSipID), true);
// Show info in System Tab
// Add info in system tab
//#0.0#125#gatewayId.gatewayRadioId.sourceRadioId#callStatus# callType#targetId#
string cmd = "";
Utils.Convert_text_For_multicast($"#0.0#125#{gwID}.{radioGwID}.{sourceCallSipID}#3#{(int)typeOfCall}#{targetCallSipID}#", out cmd);
this.Invoke((Action)(() => {
Handle125Command(gwID, radioGwID,
callStatusVOL = 3,
callTypeVOL = (int)typeOfCall,
grpIDVOL = (typeOfCall == SafeMobileLib.CallType.PRIVATECALL ? MainForm2.userIDX : int.Parse(targetCallSipID)),
int.Parse(sourceCallSipID));
parent.AddDataToSystemGrid(false, cmd, sourceCallType);
}));
}
internal void UpdateSipStatus(bool status)
{
this.Invoke((MethodInvoker)delegate ()
{
try
{
lbSipStatus.Text = (status ? MainForm2.returnLNGString("sipConnected") : MainForm2.returnLNGString("sipNotConnected")) + $"[{MainForm2.userSipId}]";
lbSipStatus.ForeColor = status ? Color.Green : Color.Red;
}
catch(Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); }
});
}
private void CloseSipCall(string callerName)
{
// Dekey for linx call
if (MainForm2.vehicleHT.ContainsKey(callerName))
{
// id is from an unit.
// Close the call
parent.StopPtt(((Vehicle)MainForm2.vehicleHT[callerName]).sipID.ToString());
}
else if (MainForm2.userIDHash.ContainsKey(callerName))
{
// id is from a dispatcher.
// get the sip id.
User dispatcher = MainForm2.UsersList.FirstOrDefault((user) => { return user.UserName == callerName; });
if (dispatcher != null)
parent.StopPtt(dispatcher.SipID.ToString());
}
}
#endregion
private void SetLanguages()
{
radLabel1.Text = MainForm2.returnLNGString("call");
rlPushToTalk.Text = MainForm2.returnLNGString("PushtoTalk");
panelCallHistory.Text = MainForm2.returnLNGString("callHistory");
tbSearch.NullText = MainForm2.returnLNGString("search");
rcpFavoritesPanel.HeaderText = MainForm2.returnLNGString("favSubscribers");
rcbCallType.NullText = rcbUnit.NullText = MainForm2.returnLNGString("displayall");
radLabel10.Text = MainForm2.returnLNGString("calltype");
radLabel11.Text = MainForm2.returnLNGString("htableVehiclesListColumns1");
rlRecordingsFrom.Text = MainForm2.returnLNGString("recordingsFrom");
rlRecordingsUntil.Text = MainForm2.returnLNGString("recordingsUntil");
btRecordingsList.Text = MainForm2.returnLNGString("exportRecordingsList");
rcbBubble.Text = MainForm2.returnLNGString("displayBubble");
panelAudioSettings.Text = MainForm2.returnLNGString("audioSett");
rlMicrophone.Text = MainForm2.returnLNGString("microphone");
rlSpeakers.Text = MainForm2.returnLNGString("speakers");
rbApplyAudioConfiguration.Text = MainForm2.returnLNGString("ApplyConfig");
panelChannelSettings.HeaderText = MainForm2.returnLNGString("RadioChannelSettings");
radLabel7.Text = MainForm2.returnLNGString("radio");
radLabel5.Text = MainForm2.returnLNGString("zonex");
radLabel6.Text = MainForm2.returnLNGString("chanel");
panelInterConnect.HeaderText = MainForm2.returnLNGString("InterConnectedSubscribers");
panelCallHistory.HeaderText = MainForm2.returnLNGString("callHistory");
panelSettings.HeaderText = MainForm2.returnLNGString("sett");
panelAudioSettings.HeaderText = MainForm2.returnLNGString("audioSett");
lbGatewayStatus.Text = MainForm2.returnLNGString("gwStatus");
rddFieldFilter.Items.Add(MainForm2.returnLNGString("htableVehiclesListColumns1"));
rddFieldFilter.Items.Add(MainForm2.returnLNGString("imei"));
rddFieldFilter.SelectedIndex = 0;
rcbddGateways.NullText = MainForm2.returnLNGString("displayAllGateways");
rcddlRecordingsGateways.NullText = MainForm2.returnLNGString("displayAllGateways");
lblPatch.Text = MainForm2.returnLNGString("callPatching");
rlVolumeIndicator.Text = rlVolumeIndicator2.Text = MainForm2.returnLNGString("volumeIndicator");
rlMicrophone.Text = MainForm2.returnLNGString("microphone");
rlSpeakers.Text = MainForm2.returnLNGString("speakers");
rlVoiceStatus.Text = MainForm2.returnLNGString("voiceStatusPerGw");
gvPatch.Columns[0].HeaderText = MainForm2.returnLNGString("type");
gvPatch.Columns[1].HeaderText = MainForm2.returnLNGString("incomingFrom");
gvPatch.Columns[2].HeaderText = MainForm2.returnLNGString("redirectTo");
}
/// <summary>
/// Get the volume for the default audio device
/// </summary>
private void UpdateVolume()
{
/*
// By the default set the volume to 0
uint CurrVol = 0;
// At this point, CurrVol gets assigned the volume
waveOutGetVolume(IntPtr.Zero, out CurrVol);
// Calculate the volume
ushort CalcVol = (ushort)(CurrVol & 0x0000ffff);
// Get the volume on a scale of 1 to 10 (to fit the trackbar)
rtbSpeakersVolume.Value = CalcVol / (ushort.MaxValue / 10);*/
}
private List<Subscriber> Populate_subscriber_list()
{
try
{
subscribersList.Clear();
#region SUBSCRIBERS
foreach (String obj in MainForm2.vehicleHT.Keys)
{
if (((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID.Equals("-1.-1"))
((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID = "0.0";
RadioGateway rg = MainForm2.myGatewaylist.Find(d => ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID.Equals(d.Gw_id + "." + d.Id));
if (obj.Equals("655"))
;
//((Vehicle)MainForm2.vehicleHT[obj]).CheckPositionInSystem();
subscribersList.Add(new Subscriber()
{
DispatcherName = obj,
SubscriberType = SubscriberType.SUBSCRIBER,
SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.SUBSCRIBER.ToString()),
ImageKey = "i_classic_bus_02",
HasRemoteMonitor = (MainForm2.radioType == RADIOTYPE.MOTO ? true : false),
HasTextMessage = true,
Sc_id = ((Vehicle)MainForm2.vehicleHT[obj]).sc_id,
Imei = ((Vehicle)MainForm2.vehicleHT[obj]).IMEI,
IconFilePath = MainForm2.GetMapPathForUnit(obj),
//Gw_and_radioID = Valid_GwID_and_RadioID,
Gw_and_radioID = (rg?.Name == null ? "0.0" : ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID),
GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned"),
IP = String.Format("224.10.{0}", ((Vehicle)MainForm2.vehicleHT[obj]).GwandRadioID),
//IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
Favorite = ((Vehicle)MainForm2.vehicleHT[obj]).is_favorite,
IsEmergency = ((Vehicle)MainForm2.vehicleHT[obj]).is_emergency,
canMakeSipCalls = ((Vehicle)MainForm2.vehicleHT[obj]).canMakeSipCalls,
SipID = ((Vehicle)MainForm2.vehicleHT[obj]).sipID
});
}
subscribersList.Sort((x, y) => x.DispatcherName.CompareTo(y.DispatcherName));
#endregion
#region GROUP
//Group g = null;
foreach (var g in MainForm2.GroupCPSIDOnlyHashWithoutCategory)
{
//g = (Group)MainForm2.GroupCPSIDOnlyHashWithoutCategory[i];
string hashKey = "isFav" + "_" + SubscriberType.GROUP.ToString() + "_"
+ g.Value.Id.ToString() + g.Value.Gw_and_radioID;
bool isFav = MainForm2.HashVal.ContainsKey(hashKey) ? Boolean.Parse(MainForm2.HashVal[hashKey] + "") : false;
try
{
RadioGateway rg = MainForm2.myGatewaylist.Find(d => g.Value.Gw_and_radioID.Equals(d.Gw_id + "." + d.Id));
// skip groups that are assignet to other radio gateways
if (rg == null)
continue;
subscribersList.Add(new Subscriber()
{
DispatcherName = g.Value.Name,
SubscriberType = SubscriberType.GROUP,
SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.GROUP.ToString()),
HasRemoteMonitor = false,
HasTextMessage = (MainForm2.radioType == RADIOTYPE.MOTO ? true : false),
ImageKey = "i_group",
IconFilePath = "i_group",
Imei = g.Value.Id.ToString(),
GatewayName = rg?.Name??"",
//Gw_and_radioID = Valid_GwID_and_RadioID,
Gw_and_radioID = g.Value.Gw_and_radioID,
IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
Favorite = isFav,
canMakeSipCalls = g.Value.Type == (int)GatewayType.Broadband || MainForm2.radioType == RADIOTYPE.EXCERA,
SipID = g.Value.SipID,
Id = g.Value.Id
});
}
catch (Exception ex)
{
Utils.WriteLine("Unable to create Group: " + ex.ToString(), ConsoleColor.Red);
}
}
#endregion
#region DISPATCHER
//Dispatcher to dispatcher call needs to be added before uncomenting
//foreach (var user in MainForm2.UsersList.OrderBy(d => d.UserName))
//{
// if (user.Id != MainForm2.userIDX)
// {
// string hashKey3 = "isFav" + "_" + SubscriberType.DISPATCHER.ToString() + "_"
// + user.Id.ToString() + "_" + user.UserName;
// bool isFav3 = MainForm2.HashVal.ContainsKey(hashKey3) ? Boolean.Parse(MainForm2.HashVal[hashKey3] + "") : false;
// subscribersList.Add(new Subscriber()
// {
// DispatcherName = user.UserName,
// SubscriberType = SubscriberType.DISPATCHER,
// SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.DISPATCHER.ToString()),
// HasRemoteMonitor = false,
// HasTextMessage = false,
// Gw_and_radioID = "0.0",
// GatewayName = MainForm2.returnLNGString("Unassigned"),
// ImageKey = "i_dispatch",
// IconFilePath = "i_dispatch",
// IP = String.Format("224.20.{0}.1", MainForm2.userIDX.ToString()),
// Imei = user.Id.ToString(),
// Favorite = isFav3,
// canMakeSipCalls = false
// });
// }
//}
#endregion
#region ALL CALL
if (MainForm2.radioType == RADIOTYPE.MOTO)
{
foreach (RadioGateway radgw in MainForm2.myGatewaylist.OrderBy(d => d.Name))
{
string hashKey2 = "isFav" + "_" + SubscriberType.ALL.ToString() + "_" + "16777215" + "_" +
radgw.Name;
bool isFav2 = MainForm2.HashVal.ContainsKey(hashKey2) ? Boolean.Parse(MainForm2.HashVal[hashKey2] + "") : false;
subscribersList.Add(new Subscriber()
{
DispatcherName = radgw.Name,
SubscriberType = SubscriberType.ALL,
SubscriberTypeRegion = MainForm2.returnLNGString(SubscriberType.ALL.ToString()),
HasRemoteMonitor = false,
HasTextMessage = false,
Imei = "16777215",
SipID = 16777215,
ImageKey = "i_all_call",
IconFilePath = "i_all_call",
GatewayName = radgw.Name,
//Gw_and_radioID = Valid_GwID_and_RadioID,
Gw_and_radioID = (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString()),
//IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
IP = String.Format("224.10.{0}", (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString())),
Favorite = isFav2,
canMakeSipCalls = radgw.Type == (int)GatewayType.Broadband || MainForm2.radioType == RADIOTYPE.EXCERA
});
if (!AllCallHT.ContainsKey(radgw.Name))
AllCallHT.Add(radgw.Name, (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString()));
}
}
#endregion
//subscribersList = subscribersList.OrderBy(d => d.DispatcherName).ToList();
listViewSubscribers.DataSource = subscribersList;
listFavorites.DataSource = null;
listFavorites.DataSource = subscribersList;
if (this.listViewSubscribers.Items.Count > 0)
{
ListViewDataItem item = null;
foreach(ListViewDataItemGroup g in listViewSubscribers.Groups)
{
if (g.Text.StartsWith(SubscriberType.ALL.ToString()))
{
item = g.Items[0];
break;
}
}
if(item!= null)
{
selected_Subscriber = (Subscriber)item.DataBoundItem;
listViewSubscribers.Select(new ListViewDataItem[] { item });
listViewSubscribers.ListViewElement.ViewElement.Scroller.ScrollToItem(item);
Update_call_selected();
}
}
}
catch (Exception ex)
{
Utils.WriteLine("Error on Populate subscriber list:" + ex.ToString(), ConsoleColor.Red);
}
return subscribersList;
}
public String Valid_GwID_and_RadioID = "";
public static string responseGW = "";
public static volatile string PersonalIP = "";
public String Valid_GwID = "0";
private void Populate_recording_list()
{
try
{
List<SafeMobileLib.Recording> recList = new List<SafeMobileLib.Recording>();
ArrayList param = new ArrayList();
// 0 typesd 0 =gateway 1 = dispather
// 1 gw_id
// 2 radiogw_id //sc_id from the field in case o dispatcher
// 3 subscriber_id // user_id of dispatcher
// User type
param.Add(1);
// User type gateway ID 0
param.Add(Convert.ToInt32(Valid_GwID));
// User type radio gateway ID 0
param.Add(0);
// User type my user id
param.Add(MainForm2.userIDX);
foreach (RadioGateway obj in MainForm2.myGatewaylist)
{
param.Add(0);
param.Add((Int32)obj.Gw_id);//1
param.Add((Int32)obj.Id);//8
param.Add(0); // i don't limit to specify subscriber
}
string from = "", to = "";
recList = db.GetAllRecordingsForDispatcherAndAssignGateway(param, 0, Int32.MaxValue, MainForm2.userIDX);
int i = 0;
foreach (SafeMobileLib.Recording obj in recList)
{
if (i++ == 0)
{
toAddRecording = obj;
toAddRecording.startDateTime = DateTime.Now;
toAddRecording.endDateTime = DateTime.Now.AddSeconds(7);
}
//obj.calltype
//obj.startTime and obj.endTime
//obj.startDateTime
//obj.id for PLAY
//obj.hddLocation for info
//obj.typeSD and obj.subID and obj.Group_ID
CallDirection calldir = CallDirection.INCOMING;
if (obj.calltype < 4) calldir = CallDirection.OUTGOING;
if (obj.calltype == 3)
{
calldir = obj.dispatcher_id == MainForm2.userIDX ? CallDirection.OUTGOING : CallDirection.INCOMING;
}
CallType callty = CallType.REMOTE_MONITORING;
String Name = "";
CheckRecording(obj, out callty, out Name, out from, out to);
RadioGateway rg = MainForm2.myGatewaylist.Find(d => (obj.gwID + "." + obj.radioGWID).Equals(d.Gw_id + "." + d.Id));
// do not display recordings from radio gateways that are not assigned anymore or where deleted
if (rg == null)
continue;
recordingsList.Add(new Recording()
{
callDirection = calldir,
callType = callty,
dateUnix70 = obj.startTime,
duration = (int)(obj.endTime - obj.startTime),
username = Name,
To = to,
From = from,
File_Name = obj.hddLocation,
RecID = obj.id,
Gw_and_radioID = (rg?.Name == null ? "0.0" : obj.gwID + "." + obj.radioGWID),
GatewayName = rg?.Name??"N/A [deleted]"
});
}
Thread.Sleep(100);
gridRecordings.DataSource = recordingsList;
// set the time to be first recordings time and today
rdpStartTime.Value = recordingsList.Count > 0 ? recordingsList[recordingsList.Count - 1].DateStart : DateTime.Now.Date;
rdpEndTime.Value = DateTime.Now.Date.AddDays(1);
DisplayEmptyMessageOnRecordingsGrid();
}
catch (Exception ex)
{
Utils.WriteLine("Error on populate recordings:" + ex.ToString(), ConsoleColor.Red);
}
}
private List<Gateway> listgw = new List<Gateway>();
private void LoadAllGateways()
{
try
{
DBgw = new DBgatewaysManager(MainForm2.ServerDBip, MainForm2.Schema, MainForm2.UserDB, MainForm2.PassDB, MainForm2.PortDB);
listgw = DBgw.getAllGateways();
foreach (Gateway rad in listgw)
{
List<RadioGateway> listRadgw = DBgw.gelAllRadioGateways_forUser(rad.Id, MainForm2.userIDX);
foreach (RadioGateway radgw in listRadgw)
{
if (radgw.Gw_voice == 1)
{
//MainForm2.myGatewaylist.Add(radgw);
Valid_GwID_and_RadioID = (String)(rad.Id.ToString() + "." + radgw.Id);
Valid_GwID = rad.Id.ToString();
}
}
}
}
catch (Exception ex)
{
Utils.WriteLine("Error on load gateway: " + ex.ToString(), ConsoleColor.Red);
}
}
public void StartVoiceMulticast(RADIOTYPE radioType)
{
//UdpMulticast udp4Voice2;
Gatewaymulticast gatewaymulticast;
if (radioType != RADIOTYPE.EXCERA)
{
// for Excera, the dispatcher should not lister for voice from gateways
foreach (RadioGateway radgw in MainForm2.myGatewaylist)
{
Valid_GwID_and_RadioID = (String)(radgw.Gw_id.ToString() + "." + radgw.Id.ToString());
//udp4Voice2 = new UdpMulticast(String.Format("224.10.{0}", Valid_GwID_and_RadioID), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port));
//udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv);
//udp4Voice2.StartListen();
gatewaymulticast = new Gatewaymulticast(String.Format("224.10.{0}", Valid_GwID_and_RadioID), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port), this);
Console.WriteLine("Listen to:" + String.Format("224.10.{0}", Valid_GwID_and_RadioID));
//List_of_multicast_voice.Add(udp4Voice2);
}
}
foreach (Int32 obj in MainForm2.userIDHash.Keys)
{
if (obj != MainForm2.userIDX)
{
//udp4Voice2 = new UdpMulticast(String.Format("224.20.{0}.1", obj.ToString()), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port));
//udp4Voice2.OnNewDataRecv += new UdpMulticast.newData4Send(udp4Voice2_OnNewDataRecv);
//udp4Voice2.StartListen();
gatewaymulticast = new Gatewaymulticast(String.Format("224.20.{0}.1", obj.ToString()), Convert.ToInt32(MainForm2.cfg.V_MSG_BUS_port), this);
Console.WriteLine("Listen to:" + String.Format("224.20.{0}.1", obj.ToString()));
//List_of_multicast_voice.Add(udp4Voice2);
}
}
}
/// <summary>
/// Add the new recording row to the recordings grid
/// </summary>
/// <param name="obj">New recording object</param>
public void Addrow(SafeMobileLib.Recording obj)
{
try
{
CallDirection calldir = CallDirection.INCOMING;
if (obj.calltype < 4) calldir = CallDirection.OUTGOING;
CallType callty = CallType.REMOTE_MONITORING;
if(obj.calltype == 3)
{
calldir = obj.dispatcher_id == MainForm2.userIDX ? CallDirection.OUTGOING : CallDirection.INCOMING;
}
String Name = "", to = "", from = "";
CheckRecording(obj, out callty, out Name, out from, out to);
//gridRecordings.BeginUpdate();
this.Invoke((MethodInvoker)delegate ()
{
RadioGateway rg = MainForm2.myGatewaylist.Find(d => (obj.gwID + "." + obj.radioGWID).Equals(d.Gw_id + "." + d.Id));
// add the new row to the list
//Utils.WriteLine("Add recording: " + obj.gwID, ConsoleColor.Red);
recordingsList.Insert(0, new Recording()
{
callDirection = calldir,
callType = callty,
dateUnix70 = obj.startTime,
duration = (int)(obj.endTime - obj.startTime),
username = Name,
File_Name = obj.hddLocation,
RecID = obj.id,
Gw_and_radioID = (rg?.Name == null ? "0.0" : obj.gwID + "." + obj.radioGWID),
GatewayName = rg?.Name ?? "",
To = to,
From = from
});
});
//gridRecordings.EndUpdate();
}
catch (Exception ex)
{
SM.Debug("Error on populate grid" + ex.ToString());
}
}
private void CheckRecording(SafeMobileLib.Recording obj, out CallType callType, out string nameOfTheRecording, out string userWhoCalled,
out string userWhoWasCalled)
{
callType = CallType.REMOTE_MONITORING;
nameOfTheRecording = userWhoWasCalled = userWhoCalled = "";
switch (obj.calltype)
{
case 0:
callType = CallType.PRIVATE_CALL;
userWhoCalled = MainForm2.userLog;
if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString()))
{
userWhoWasCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()];
}
else
{
userWhoWasCalled = obj.subs_imei.ToString();
}
break;
case 4:
callType = CallType.PRIVATE_CALL;
userWhoWasCalled = MainForm2.userLog;
if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString()))
{
userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()];
}
else
{
userWhoCalled = obj.subs_imei.ToString();
}
break;
case 1:
callType = CallType.GROUP_CALL;
userWhoCalled = MainForm2.userLog;
string key = obj.group_cpsId + "." + obj.radioGWID;
if (MainForm2.GroupsAndRadioGW.ContainsKey(key))
userWhoWasCalled = ((Group)MainForm2.GroupsAndRadioGW[key]).Name;
else
userWhoWasCalled = obj.group_cpsId.ToString();
break;
case 5:
callType = CallType.GROUP_CALL;
if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString()))
userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()];
else
userWhoCalled = obj.subs_imei.ToString();
//"recordings/Tetra102(102)_DO_GROUP_CALL_ID_457_02_Jul_19_13_16_20.wav"
string key1 = obj.group_cpsId + "." + obj.radioGWID;
string GroupIDFromPath="";
string[] GroupIDFromSplit;
if (MainForm2.GroupsAndRadioGW.ContainsKey(key1))
userWhoWasCalled = ((Group)MainForm2.GroupsAndRadioGW[key1]).Name;
else
{
if (obj.group_cpsId == null)
{
GroupIDFromPath = obj.hddLocation;
2024-06-07 13:20:57 +00:00
GroupIDFromSplit = GroupIDFromPath.Split("_".ToCharArray());
2024-02-22 16:43:59 +00:00
userWhoWasCalled = GroupIDFromSplit[5];
}
else
userWhoWasCalled = obj.group_cpsId.ToString();
}
break;
case 2:
callType = CallType.ALL_CALL;
userWhoCalled = MainForm2.userLog;
userWhoWasCalled = "All Call";
break;
case 6:
callType = CallType.ALL_CALL;
userWhoWasCalled = "All Call";
if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString()))
userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()];
else
userWhoCalled = obj.subs_imei.ToString();
break;
case 7:
callType = CallType.REMOTE_MONITORING;
userWhoWasCalled = MainForm2.userLog;
if (MainForm2.VehIMEIHash.ContainsKey(obj.subs_imei.ToString()))
userWhoCalled = (String)MainForm2.VehIMEIHash[obj.subs_imei.ToString()];
else
userWhoCalled = "Radio_ID " + obj.subs_imei;
break;
case 3:
callType = CallType.DISPATCHER_CALL;
//userWhoCalled = MainForm2.userLog;
userWhoCalled = MainForm2.userIDHash[obj.dispatcher_id] != null ? (string)MainForm2.userIDHash[obj.dispatcher_id] : "UserID" + obj.dispatcher_id;
if (MainForm2.userIDHash.ContainsKey(obj.radioGWID))
userWhoWasCalled = (String)MainForm2.userIDHash[obj.radioGWID];
else
userWhoWasCalled = "UserID" + obj.radioGWID;
break;
}
nameOfTheRecording = userWhoCalled + " -> " + userWhoWasCalled;
}
private void radTrackBar1_LabelFormatting(object sender, Telerik.WinControls.UI.LabelFormattingEventArgs e)
{
try
{
if (e.LabelElement == null)
return;
if (e.LabelElement.Text == null)
e.LabelElement.Text = "";
//make the top labels display the days
if (e.LabelElement.Text.Equals("0") && !e.LabelElement.Text.Equals("100"))
{
e.LabelElement.Text = MainForm2.returnLNGString("Low");
}
if (e.LabelElement.Text.Equals("100") && !e.LabelElement.Text.Equals("0"))
{
e.LabelElement.Text = MainForm2.returnLNGString("High");
}
else if (!e.LabelElement.Text.Equals(MainForm2.returnLNGString("Low")) && !e.LabelElement.Text.Equals(MainForm2.returnLNGString("High")))
{
e.LabelElement.Text = "";
}
}
catch(Exception ex)
{
Utils.WriteLine("Error when setting volume trackbar labels" + ex.ToString());
}
}
private void tbSearch_TextChanged(object sender, EventArgs e)
{
if (tbSearch.Text.Length == 0)
{
pbSearch.Image = Dispatcher.Properties.Resources.i_search;
pbSearch.Cursor = Cursors.Default;
}
else
{
pbSearch.Image = Dispatcher.Properties.Resources.i_delete;
pbSearch.Cursor = Cursors.Hand;
}
FilterDescriptor valueFilter = null;
listViewSubscribers.BeginUpdate();
listViewSubscribers.FilterDescriptors.Remove("DispatcherName");
listViewSubscribers.FilterDescriptors.Remove("Imei");
valueFilter = rddFieldFilter.SelectedIndex == 0 ?
new FilterDescriptor("DispatcherName", FilterOperator.Contains, tbSearch.Text)
: new FilterDescriptor("Imei", FilterOperator.Contains, tbSearch.Text);
listViewSubscribers.FilterDescriptors.Add(valueFilter);
/*
listSubscribers.FilterDescriptors.Remove("DispatcherName");
FilterDescriptor valueFilter = new FilterDescriptor("DispatcherName", FilterOperator.Contains, tbSearch.Text);
/*
while (listSubscribers.FilterDescriptors.Count > 0)
listSubscribers.FilterDescriptors.RemoveAt(0);
*/
/*listSubscribers.FilterDescriptors.Add(valueFilter);*/
listViewSubscribers.EndUpdate();
if (this.listViewSubscribers.Items.Count == 1)
{
selected_Subscriber = (Subscriber)listViewSubscribers.Items[0].DataBoundItem;
listViewSubscribers.SelectedIndex = 0;
Update_call_selected();
}
}
private void pbSearch_Click(object sender, EventArgs e)
{
if (tbSearch.Text.Length > 0)
tbSearch.Text = "";
}
private void panel_Collapsed(object sender, EventArgs e)
{
if ((RadCollapsiblePanelElement)sender == panelAudioSettings.CollapsiblePanelElement)
{
panelChannelSettings.Location =
new Point(panelChannelSettings.Location.X,
panelChannelSettings.Location.Y - normalSizeAudioSettings.Height + 33);
panelInterConnect.Location =
new Point(panelInterConnect.Location.X,
panelInterConnect.Location.Y - normalSizeAudioSettings.Height + 33);
dividerChannelSettings.Location = new Point(dividerChannelSettings.Location.X,
dividerChannelSettings.Location.Y - normalSizeAudioSettings.Height + 33);
dividerInterConnect.Location = new Point(dividerInterConnect.Location.X,
dividerInterConnect.Location.Y - normalSizeAudioSettings.Height + 33);
}
else if ((RadCollapsiblePanelElement)sender == panelChannelSettings.CollapsiblePanelElement)
{
panelInterConnect.Location =
new Point(panelInterConnect.Location.X,
panelInterConnect.Location.Y - normalSizeChannelSettings.Height + 33);
dividerInterConnect.Location = new Point(dividerInterConnect.Location.X,
dividerInterConnect.Location.Y - normalSizeChannelSettings.Height + 33);
}
else if ((RadCollapsiblePanelElement)sender == panelInterConnect.CollapsiblePanelElement)
{
}
}
private void panel_Expanding(object sender, CancelEventArgs e)
{
Console.WriteLine("Size is : " + normalSizeChannelSettings.Height);
if ((RadCollapsiblePanelElement)sender == panelAudioSettings.CollapsiblePanelElement)
{
panelChannelSettings.Location =
new Point(panelChannelSettings.Location.X,
panelChannelSettings.Location.Y + normalSizeAudioSettings.Height - 33);
panelInterConnect.Location =
new Point(panelInterConnect.Location.X,
panelInterConnect.Location.Y + normalSizeAudioSettings.Height - 33);
dividerChannelSettings.Location = new Point(dividerChannelSettings.Location.X,
dividerChannelSettings.Location.Y + normalSizeAudioSettings.Height - 33);
dividerInterConnect.Location = new Point(dividerInterConnect.Location.X,
dividerInterConnect.Location.Y + normalSizeAudioSettings.Height - 33);
}
else if ((RadCollapsiblePanelElement)sender == panelChannelSettings.CollapsiblePanelElement)
{
panelInterConnect.Location =
new Point(panelInterConnect.Location.X,
panelInterConnect.Location.Y + normalSizeChannelSettings.Height - 33);
dividerInterConnect.Location = new Point(dividerInterConnect.Location.X,
dividerInterConnect.Location.Y + normalSizeChannelSettings.Height - 33);
}
else if ((RadCollapsiblePanelElement)sender == panelInterConnect.CollapsiblePanelElement)
{
}
}
private void RadioTab_Load(object sender, EventArgs e)
{
normalSizeAudioSettings = panelAudioSettings.CollapsiblePanelElement.Size;
normalSizeChannelSettings = panelChannelSettings.CollapsiblePanelElement.Size;
//get all recordings
LoadRecordingTimer.Enabled = true;
LoadRecordingTimer.Start();
//subscriber list
LoadSubscriberTimer.Enabled = true;
LoadSubscriberTimer.Start();
// fill the recordings list
Populate_recording_list();
// fill the subscribers list
Populate_subscriber_list();
// fill the units combobox
populateUnits();
// fill the call types
rcbCallType.DataSource = new CallTypeBindingList();
rcbCallType.DisplayMember = "Name";
rcbCallType.ValueMember = "Id";
// get first time the volume level
UpdateVolume();
//request
String Totrans = "#503#";
mainparent.Send_UDP_cmd(Totrans, 0, 0);
//display current datetime on watch
lbCurrentDateTime.Text = DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern);
//SetPTTButtonEnableDisable();
#region grid patching data source
foreach (var user in MainForm2.UsersList)
{
//if (user.UserName != MainForm2.userLog)
dispatchers.Add(user);
}
foreach (var gateway in MainForm2.myGatewaylist.OrderBy(d => d.Name))
{
radiogateways.Add(gateway);
}
List<string> patchType = new List<string>();
if (dispatchers.Count >= 2) patchType.Add("Dispatcher");
if (radiogateways.Count >= 2) patchType.Add("Gateway");
((GridViewComboBoxColumn)gvPatch.Columns["type"]).DataSource = patchType;
//hide patch table if doesn't need it
if (MainForm2.radioType == RADIOTYPE.MOTO)
lblPatch.Visible = gvPatch.Visible = (radiogateways.Count >= 2 || dispatchers.Count >= 2);
else
lblPatch.Visible = gvPatch.Visible = false;
dbPatches = dbpatch.getAllPatches();
gvPatch.DataSource = dbPatches;
//add data into patching dictionary
foreach (var patch in dbPatches)
{
string concat = patch.Type + patch.Incoming + patch.Outgoing;
string key = patch.Type + "." + patch.IncomingId;
//updatePatchStatus(patch.Incoming, true);
updatePatchStatus(patch.Outgoing, true, patch.Type);
if (!patchDictionary.ContainsKey(key))
{
patchDictionary.Add(key, new List<string>());
}
if (patchDictionary.ContainsKey(key))
{
if (!patchDictionary[key].Contains(patch.OutgoingId))
patchDictionary[key].Add(patch.OutgoingId);
}
patchList.Add(concat);
}
#endregion
if (MainForm2.radioType == RADIOTYPE.LINX || MainForm2.radioType == RADIOTYPE.LINXB || MainForm2.radioType == RADIOTYPE.EXCERA)
UpdateSipStatus(MainForm2.sipStatus);
else
lbSipStatus.Text = MainForm2.returnLNGString("gatewayStatus");
//lbSipStatus.Visible = MainForm2.radioType == RADIOTYPE.LINX || MainForm2.radioType == RADIOTYPE.LINXB;
//update224Route(MainForm2.cfg.LocalIP);
rcpFavoritesPanel.Collapse();
// hide radio gateway status list and panel because no active gateway assigned to the dispatcher
if (radiogateways.Count == 0)
containerGatewayStatus.Visible = false;
else
{
// set datasource for gateway status list
rlvGatewayStatus.DataSource = radiogateways;
rlvGatewayStatus.DisplayMember = "DisplayedMemeber";
rlvGatewayStatus.EnableFiltering = true;
// add filter to show only voice gateways
rlvGatewayStatus.BeginUpdate();
rlvGatewayStatus.FilterDescriptors.Add(new FilterDescriptor("Gw_voice", FilterOperator.IsGreaterThan, 0));
rlvGatewayStatus.EndUpdate();
}
}
private void update224Route(string interfaceIP)
{
Process p = new Process();
p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = $"/c route change 224.0.0.0 mask 240.0.0.0 {interfaceIP}";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.Start();
string output = p.StandardOutput.ReadToEnd();
}
/// <summary>
/// Update the Radio Status list from the Settings tab. The status can be online or offline
///
/// </summary>
/// <param name="gwandradioGW"></param>
/// <param name="status"></param>
void parent_OnRadioGatewayStatusChanged(string gwandradioGW, bool status)
{
foreach (RadListDataItem tmp in listBoxRadioGateways.Items)
{
if (((RadioGateway)tmp.Value).Gw_id.ToString() + "." + ((RadioGateway)tmp.Value).Id.ToString() == gwandradioGW)
{
// update the gateway status to offline or idle when the radio gateway status changes
OnRadioGatewayStateChanged((RadioGateway)MainForm2.radioGwHT[gwandradioGW], status ? RadioState.IDLE : RadioState.OFFLINE);
tmp.Image = status == true ? global::Dispatcher.Properties.Resources.green_status : global::Dispatcher.Properties.Resources.grey_status;
((RadioGateway)MainForm2.radioGwHT[gwandradioGW]).Alive = status;
break;
}
}
this.Invoke((MethodInvoker)delegate
{
if(!pttIsPressed)
SetPTTButtonEnableDisable();
});
}
void parent_OnCallStatusHangChanged(string unitname, bool inCall, Boolean fromField, string GwPlusRadio)
{
//Thread.Sleep(250);
if (MainForm2.radioGwHT.ContainsKey(GwPlusRadio))
{
RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[GwPlusRadio];
Utils.WriteLine($"Radiogateway {GwPlusRadio} - {radioGw.Name} Patch status is {radioGw.InPatch}", ConsoleColor.Yellow);
if (radioGw.InPatch)
return;
}
ManageSafeDispatchRingingSound(inCall);
}
/// <summary>
/// Stops the ringing sound when call is established.
/// <para>If not in call, plays busy sound and display error on ptt button</para>
/// <para>Must be called ON THE UI THREAD</para>
/// </summary>
/// <param name="callEstablished">true if in call, otherwise false</param>
private void ManageSafeDispatchRingingSound(bool callEstablished)
{
MainForm2.soundPlayer.Stop();
if (!callEstablished)
{
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
MainForm2.soundPlayer.Stream = Dispatcher.Properties.Resources.phone_busy;
MainForm2.soundPlayer.Play();
}
}
private ArrayList vehicleListNames = new ArrayList();
public BindingList<DropListItem> UnitGroupItems = new BindingList<DropListItem>();
/// <summary>
/// Populate the drop down list with all the units
/// </summary>
private void populateUnits()
{
// add the datasource for the vehicles ComboBox
rcbUnit.DataSource = null;
List<String> unitsName = (subscribersList.Select(x => x.DispatcherName).ToList<String>());
// add dispatcher to the list
unitsName.Add(MainForm2.userLog);
unitsName.Sort();
rcbUnit.DataSource = unitsName;
//cbVehName.DataSource = vehicleListNames;
//cbVehName.DisplayMember = "Name";
if (rcbUnit.Items.Count > 1)
rcbUnit.SelectedIndex = 0;
}
/// <summary>
/// Get the image which needs to be set for a unit/group picture box/ list
/// according to the type of the SafeDispatch
/// </summary>
/// <param name="radioType">Type of the SafeDispatch system [this is equal with the theme]</param>
/// <param name="iconType">String containing the </param>
/// <param name="isEnabled">Specify if the icon should be in enabled or disabled state</param>
/// <returns>The image which fulfills the constrains</returns>
private Image GetIconForCombobox(RADIOTYPE radioType, String iconType, bool isEnabled)
{
if (iconType.Equals("unit"))
{
switch (MainForm2.radioType)
{
case RADIOTYPE.ATLAS:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled : Dispatcher.Properties.Resources.icon_cb_unit_disabled);
case RADIOTYPE.HARRIS:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled_ha : Dispatcher.Properties.Resources.icon_cb_unit_disabled);
default:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_unit_enabled : Dispatcher.Properties.Resources.icon_cb_unit_disabled);
}
}
else if (iconType.Equals("group"))
{
switch (MainForm2.radioType)
{
case RADIOTYPE.ATLAS:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled);
case RADIOTYPE.HARRIS:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled_ha : Dispatcher.Properties.Resources.icon_cb_group_disabled);
default:
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled);
}
}
return (isEnabled ? Dispatcher.Properties.Resources.icon_cb_group_enabled : Dispatcher.Properties.Resources.icon_cb_group_disabled);
}
private void rcbCallType_ItemDataBound(object sender, ListItemDataBoundEventArgs args)
{
var test = args.NewItem.DataBoundItem as CallType_Drop;
if (test == null)
{
return;
}
args.NewItem.Image = test.Image;
}
#region PTT
internal volatile bool pttIsPressed = false;
volatile bool killPTT = false;
int spectrumCount = 0;
internal void pbPTT_MouseDown(object sender, MouseEventArgs e)
{
if (selected_Subscriber == null)
return;
//if (listViewSubscribers.SelectedItem == null && listViewSubscribers.Items.Count > 0)
// //listViewSubscribers.Items[0].Selected = true;
// listViewSubscribers.SelectedItem = listViewSubscribers.Items[0];
//selected_Subscriber = listViewSubscribers.SelectedItem.DataBoundItem as Subscriber;
selected_Subscriber = selected_Subscriber_PTT;
if (selected_Subscriber.SubscriberType == SubscriberType.SUBSCRIBER)
{
if (selected_Subscriber.DispatcherName != "")
{
((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem();
selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID;
}
}
else if (selected_Subscriber.SubscriberType == SubscriberType.ALL)
{
Valid_GwID_and_RadioID = AllCallHT[selected_Subscriber.DispatcherName].ToString();
}
else if (selected_Subscriber.SubscriberType == SubscriberType.GROUP)
{
Valid_GwID_and_RadioID = selected_Subscriber.Gw_and_radioID;
}
sendPTT(selected_Subscriber);
}
private void sendRemoteMOnitor(Subscriber sel_subs)
{
// pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_over;
String Totrans = "";
if (sel_subs.SubscriberType == SubscriberType.SUBSCRIBER)
{
Totrans = "#161#" + sel_subs.Gw_and_radioID + "." + sel_subs.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 15000, 161));
}
}
private void sendDekey(string linxSipID = null)
{
if (linxSipID != null)
{
int sipID;
if (int.TryParse(linxSipID, out sipID))
{
// close sip call
parent.StopPtt(sipID.ToString());
}
}
else
{
// Send deDekey to radio GW
String Totrans = String.Format("#160#{0}#", responseGW);
mainparent.Send_UDP_cmd(Totrans, 0, 0);
}
}
private void sendCallStop(String Imei)
{
//String Totrans = String.Format("#220#{0}.{1}#", Valid_GwID_and_RadioID, Imei);
String Totrans = String.Format("#220#{0}.{1}#{2}#", responseGW, Imei, MainForm2.userIDX);
mainparent.Send_UDP_cmd(Totrans, 0, 0);
}
public void updateGwAndRagioGatewayForSubscriber(String radioID, String gwId, String radioGwId)
{
//Utils.WriteLine("updateGwAndRagioGatewayForSubscriber " + radioID, ConsoleColor.DarkMagenta);
listViewSubscribers.BeginUpdate();
listViewSubscribers.FilterDescriptors.Remove("GatewayName");
foreach (Object item in subscribersList)
{
Subscriber sub = item as Subscriber;
if (sub == null)
continue;
if (sub.Imei.Equals(radioID))
{
// do not update the dispatcher gateway
if (sub.SubscriberType == SubscriberType.DISPATCHER)
continue;
RadioGateway rg = MainForm2.myGatewaylist.Find(d => (gwId + "." + radioGwId).Equals(d.Gw_id + "." + d.Id));
// update the value of the subscriber in the grid
if (sub.SubscriberType == SubscriberType.SUBSCRIBER)
{
sub.Gw_and_radioID = (rg?.Name == null ? "0.0" : gwId + "." + radioGwId);
sub.GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned");
//Utils.WriteLine("Moved unit " + sub.DispatcherName + " to " + sub.Gw_and_radioID);
sub.NrOfUpdates++;
}
}
}
listViewSubscribers.EndUpdate();
listFavorites.FilterDescriptors.Remove("GatewayName");
listFavorites.BeginUpdate();
foreach (ListViewDataItem item in listFavorites.Items)
{
Subscriber sub = item.DataBoundItem as Subscriber;
if (sub == null)
continue;
if (sub.Imei.Equals(radioID))
{
// do not update the dispatcher gateway
if (sub.SubscriberType == SubscriberType.DISPATCHER)
continue;
RadioGateway rg = MainForm2.myGatewaylist.Find(d => (gwId + "." + radioGwId).Equals(d.Gw_id + "." + d.Id));
// update the value of the subscriber in the grid
if (sub.SubscriberType == SubscriberType.SUBSCRIBER)
{
// update the value of the subscriber in the grid
sub.Gw_and_radioID = (rg?.Name == null ? "0.0" : gwId + "." + radioGwId);
sub.GatewayName = rg?.Name ?? MainForm2.returnLNGString("Unassigned");
sub.NrOfUpdates++;
Utils.WriteLine("Moved unit " + sub.DispatcherName + " to " + sub.Gw_and_radioID);
}
}
}
listFavorites.EndUpdate();
rcbddGateways_ItemCheckedChanged(rcbddGateways, null);
}
public void sendPTT(Subscriber sub, bool selectSubscriberInListView = false)
{
if (PTTinprogres)
{
// PTT already in progress. Just return
return;
}
#region BUG: Voice call fails in various situations
//1. if proces111or112or113FALSE is true means that a mobile radio has a call in progress and if we make a call in this situation
//the call will be intrerupted by it's timer
if (proces111or112or113FALSE)
{
ManageSafeDispatchRingingSound(false);
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
return;
}
#endregion
SubscriberType subType = sub.SubscriberType;
// get the radio gateway
if (subType == SubscriberType.GROUP || subType == SubscriberType.SUBSCRIBER)
{
if (sub.Gw_and_radioID != null)
{
string gwAndRadioGw = sub.Gw_and_radioID;
if (MainForm2.radioGwHT.ContainsKey(gwAndRadioGw))
{
RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[gwAndRadioGw];
// Check the radio gateway type
switch (radioGw.Type)
{
case (int)GatewayType.Tier2Radio:
// if gateway is off or already in ptt, do not send ptt
if (!radioGw.Alive || radioGw.InPTT)
{
Utils.WriteLine("PTT is not in progress anymore: " + radioGw.InPTT + " | " + radioGw.Alive);
ManageSafeDispatchRingingSound(false);
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
PTTinprogres = false;
return;
}
break;
case (int)GatewayType.Broadband:
case (int)GatewayType.Tier3Radio:
// Play calling sound for Simoco and android
MainForm2.soundPlayer.Stream = Dispatcher.Properties.Resources.phone_calling;
MainForm2.soundPlayer.Play();
break;
}
}
}
}
killPTT = false;
selected_Subscriber = sub;
if (selected_Subscriber.DispatcherName != "")
{
if (subType == SubscriberType.SUBSCRIBER)
{
((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem();
selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID;
}
}
if (subType != SubscriberType.DISPATCHER)
selected_Subscriber.Gw_and_radioID = Valid_GwID_and_RadioID;
try
{
String gwId = "0";
String radioGwId = "0";
gwId = Valid_GwID_and_RadioID.Split(new char[] { '.' })[0];
radioGwId = Valid_GwID_and_RadioID.Split(new char[] { '.' })[1];
updateGwAndRagioGatewayForSubscriber(selected_Subscriber.Imei, gwId, radioGwId);
}
catch(Exception ex)
{
Utils.WriteLine("Error on updating the gateway for current selected unit: " + ex.ToString(), ConsoleColor.Red);
}
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_over;
if (selectSubscriberInListView)
{
ListViewDataItem lDataItem = listViewSubscribers.Items.FirstOrDefault((item) =>
{
Subscriber s = item.DataBoundItem as Subscriber;
if (s != null)
{
if (s.Imei == sub.Imei && s.SubscriberType == subType && s.Gw_and_radioID == sub.Gw_and_radioID)
return true;
else return false;
}
else
return false;
});
if (lDataItem != null)
listViewSubscribers.SelectedItem = lDataItem;
}
bool sendCallInitOnMbus = true;
if (selected_Subscriber.canMakeSipCalls)
{
try
{
Utils.WriteLine("SIP ID TO SEND PTT = " + selected_Subscriber.SipID, ConsoleColor.Magenta);
parent.SendCallRequest(selected_Subscriber.SipID.ToString(), selected_Subscriber.SubscriberType == SubscriberType.GROUP ||
selected_Subscriber.SubscriberType == SubscriberType.ALL);
if (!MainForm2.recordingsDecide)
{
// No licence for recordings
// I will not send call init commands on mBus
// I will send them only when there is licence for recordings,
// so that the AppServer will start registering
sendCallInitOnMbus = false;
// Show data in system tab
// init private call - 102
// #seqID#102#gatewayId.gatewayRadioId.remoteRadioId#voiceBroadcastAddress#
// init group call - 103
// #seqID#103#gatewayId.gatewayRadioId.remoteRadioId#voiceBroadcastAddress#
string cmd = "";
MessageBusCmds initCallCmd = MessageBusCmds.InitPrivateCall;
switch (subType)
{
case SubscriberType.GROUP:
initCallCmd = MessageBusCmds.InitGroupCall;
break;
case SubscriberType.ALL:
initCallCmd = MessageBusCmds.InitAllCall;
break;
}
Utils.Convert_text_For_multicast(
$"#1234#{(int)initCallCmd}#{selected_Subscriber.Gw_and_radioID}.{selected_Subscriber.Imei}#224.20.{MainForm2.userIDX}.1#",
out cmd);
parent.AddDataToSystemGrid(true, cmd);
}
}
catch (Exception ex)
{
// Threat this as call rejected by gateway
if (subType == SubscriberType.GROUP)
{
Handle123Command(this.IdVOL = 2);
// Show event on System log
// #seqID#123#gatewayId.gatewayRadioId#result#dispatcherID#
string cmd = "";
Utils.Convert_text_For_multicast(
$"#1234#123#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#",
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
else
{
Handle122Command(this.IdVOL = 2);
// Trigger event for the map
parent.RaiseOnCallStatusChangedEvent(
selected_Subscriber.DispatcherName, false, false);
// Show event on System log
// #seqID#122#gatewayId.gatewayRadioId#result#dispatcherID#
string cmd = "";
Utils.Convert_text_For_multicast(
$"#1234#122#{parent.SipGWIDandRadioID.Split('.')[0]}.{parent.SipGWIDandRadioID.Split('.')[1]}#2#{MainForm2.userIDX}#",
out cmd);
this.Invoke((Action)(() => { parent.AddDataToSystemGrid(false, cmd); }));
}
Utils.WriteLine(ex.Message, ConsoleColor.Red);
}
}
if (sendCallInitOnMbus)
{
String Totrans = "";
string seqId = "";
if (selected_Subscriber != null)
{
switch (subType)
{
case SubscriberType.ALL:
Totrans = String.Format("#101#{0}#{1}#", selected_Subscriber.Gw_and_radioID, "224.20." + MainForm2.userIDX + ".1#0");
WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 101));
break;
case SubscriberType.SUBSCRIBER:
Totrans = "#102#" + /*selected_Subscriber.Gw_and_radioID*/ Valid_GwID_and_RadioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 102));
break;
case SubscriberType.GROUP:
Totrans = "#103#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 103));
break;
case SubscriberType.DISPATCHER:
Totrans = String.Format("#201#{0}#{1}#", selected_Subscriber.Imei, "224.20." + MainForm2.userIDX + ".1#0");
WatchList.Add(seqId = mainparent.Send_UDP_cmd(Totrans, 10000, 201));
break;
}
#if EXCERA
parent.AddCallRequestForSip(selected_Subscriber.SipID, seqId);
#endif
}
}
}
private void ConfirmPTT_and_Start_Voice()
{
pttIsPressed = true;
try
{
Thread p = new Thread(delegate ()
{
while (pttIsPressed)
{
if (killPTT)
{
Utils.WriteLine("KILL PTTT");
pttIsPressed = false;
//RecivedData = false;
//pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00;
//pbPTT.Image = Dispatcher.Properties.Resources.r_ptt;
//spectrumCount = 0;
break;
}
//this.Invoke((MethodInvoker)delegate ()
//{
if (pbSpectrum != null)
{
switch (spectrumCount++ % 13)
{
case 1: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_01; break;
case 2: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_02; break;
case 3: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_03; break;
case 4: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_04; break;
case 5: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_05; break;
case 6: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_06; break;
case 7: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_07; break;
case 8: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_08; break;
case 9: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_09; break;
case 10: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_10; break;
case 11: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_11; break;
case 12: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_12; break;
//default: pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_01; break;
}
}
//});
Thread.Sleep(50);
}
});
p.Start();
}
catch (Exception ex)
{
Utils.WriteLine("Error on ConfirmPTT_and_Start_Voice:" + ex.ToString());
}
}
internal void pbPTT_MouseUp(object sender, MouseEventArgs e)
{
Utils.WriteLine("PTT MOUSE UP", ConsoleColor.Green);
if (selected_Subscriber == null)
return;
StopPTT(selected_Subscriber);
}
private void pbPTT_MouseLeave(object sender, EventArgs e)
{
Utils.WriteLine("PTT MOUSE LEAVE", ConsoleColor.Green);
if (PTTinprogres)
{
if (selected_Subscriber == null)
return;
StopPTT(selected_Subscriber);
}
}
public void StopPTT(Subscriber subs)
{
Utils.WriteLine("STOP PTT");
bool sendMbusCommand = true;
if (!PTTinprogres)
sendMbusCommand = false; // PTT is not in progress. No need to do anything
else
killPTT = true; // PTT is in progress, so the animation should be stop
PTTinprogres = false;
MainForm2.soundPlayer.Stop();
selected_Subscriber = subs;
pttIsPressed = false;
//RecivedData = false;
RecivedData = MainForm2.PriorityIP != "";
Thread.Sleep(60);
pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00;
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt;
spectrumCount = 0;
if (selected_Subscriber.canMakeSipCalls)
{
string sipID = selected_Subscriber.SipID.ToString();
parent.StopPtt(sipID);
sendMbusCommand = MainForm2.recordingsDecide;
}
if (sendMbusCommand)
{
String Totrans = "";
switch (selected_Subscriber.SubscriberType)
{
case SubscriberType.ALL:
Totrans = String.Format("#111#{0}#{1}#", selected_Subscriber.Gw_and_radioID, "224.20." + MainForm2.userIDX + ".1#0");
WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 111));
break;
case SubscriberType.SUBSCRIBER:
Totrans = "#112#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112));
if (MainForm2.radioType != RADIOTYPE.EXCERA)
WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112));
else
mainparent.Send_UDP_cmd(Totrans, 3000, 112);
break;
case SubscriberType.GROUP:
Totrans = "#113#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113));
if (MainForm2.radioType != RADIOTYPE.EXCERA)
WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113));
else
mainparent.Send_UDP_cmd(Totrans, 3000, 113);
break;
case SubscriberType.DISPATCHER:
Totrans = String.Format("#211#{0}#{1}#", selected_Subscriber.Imei, "224.20." + MainForm2.userIDX + ".1#0");//selected_Subscriber.IP
WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 211));
break;
}
}
}
private void pictureBox1_Click(object sender, EventArgs e)
{
//CallsForm cf = new CallsForm();
//cf.Show();
}
#endregion
private void pictureBox2_Click(object sender, EventArgs e)
{
if (listViewSubscribers.ViewType == ListViewType.DetailsView)
listViewSubscribers.ViewType = ListViewType.IconsView;
else
listViewSubscribers.ViewType = ListViewType.DetailsView;
}
private void pbFilter_Click(object sender, EventArgs e)
{
pbFilterTime.Image = Dispatcher.Properties.Resources.filter_time_grey;
pbFilterType.Image = Dispatcher.Properties.Resources.filter_type_grey;
pbFilterUser.Image = Dispatcher.Properties.Resources.filter_user_grey;
pbFilterDirection.Image = Dispatcher.Properties.Resources.filter_direction_grey;
pbFilterTime.Tag = "disabled";
pbFilterType.Tag = "disabled";
pbFilterUser.Tag = "disabled";
pbFilterDirection.Tag = "disabled";
string filterName = "DateStart";
ListSortDirection sortDirection = ListSortDirection.Ascending;
if ((PictureBox)sender == pbFilterTime)
{
pbFilterTime.Image = Dispatcher.Properties.Resources.filter_time_black;
pbFilterTime.Tag = "enabled";
filterName = "DateStart";
// default sort direction for date start is descending
sortDirection = ListSortDirection.Descending;
}
else if ((PictureBox)sender == pbFilterType)
{
pbFilterType.Image = Dispatcher.Properties.Resources.filter_type_black;
pbFilterType.Tag = "enabled";
filterName = "callType";
}
else if ((PictureBox)sender == pbFilterUser)
{
pbFilterUser.Image = Dispatcher.Properties.Resources.filter_user_black;
pbFilterUser.Tag = "enabled";
filterName = "Initial";
}
else if ((PictureBox)sender == pbFilterDirection)
{
pbFilterDirection.Image = Dispatcher.Properties.Resources.filter_direction_black;
pbFilterDirection.Tag = "enabled";
filterName = "callDirection";
}
if (gridRecordings.GroupDescriptors.Count > 0 &&
gridRecordings.GroupDescriptors[0].Expression.Contains(filterName))
{
GroupDescriptor gd = gridRecordings.GroupDescriptors[0];
sortDirection = gd.Expression.Contains("ASC") ? ListSortDirection.Descending : ListSortDirection.Ascending;
}
// clear previous filters and add the new one
gridRecordings.GroupDescriptors.Clear();
GroupDescriptor groupDescriptor = new GroupDescriptor(new SortDescriptor[] { new SortDescriptor(filterName, sortDirection) });
gridRecordings.GroupDescriptors.Add(groupDescriptor);
}
#region PLAY procedure
private MemoryStream RecorderStream1 = null;
private RawSourceWaveStream recordingWaveStream = null;
private WaveOut recordingWaveOut = null;
private void UnableToPlay_Tick(object sender, EventArgs e)
{
try
{
if (MainForm2.PlayingFile)
BackToPlay();
UnableToPlay.Stop();
UnableToPlay.Enabled = false;
}
catch (Exception ex)
{
SM.Debug("UnableToPlay_Tick:" + ex.ToString());
}
}
private void StopPlayTimer_Tick(object sender, EventArgs e)
{
try
{
if (MainForm2.PlayingFile)
BackToPlay();
StopPlayTimer.Stop();
StopPlayTimer.Enabled = false;
}
catch (Exception ex)
{
SM.Debug("Ex:" + ex.ToString());
}
}
public void BackToPlay()
{
try
{
MainForm2.PlayingFile = false;
}
catch (Exception ex)
{
SM.Debug("Unable to get back volume" + ex.ToString());
}
}
public void PlayFile(Int64 IdToPlay, Int32 TimerInterval)
{
if (TimerInterval == 0)
{
parent.DisplayToast("Unable to play recording", "The desired recording was not found. Probably it was deleted.");
return;
}
try
{
MainForm2.PlayingFile = true;
MainForm2.PlayingFileCount = 0;
UnableToPlay.Enabled = true;
UnableToPlay.Start();
StopPlayTimer.Interval = TimerInterval;
StopPlayTimer.Enabled = true;
StopPlayTimer.Start();
bool start = tcpAudio.Start(MainForm2.cfg.REC_IP, Convert.ToInt32(MainForm2.cfg.REC_audio_port));
RecorderStream1 = new MemoryStream();
Int64 id = (Int64)IdToPlay;
byte[] temp = BitConverter.GetBytes(id);
byte[] buff = new byte[temp.Length + 1];
buff[0] = 1;
int i = 1;
foreach (byte b in temp)
{
buff[i] = b;
i++;
}
tcpAudio.Send(buff);
}
catch (Exception ex)
{
SM.Debug("PlayFile:" + ex.ToString());
}
}
private void InitListToPlay()
{
try
{
tcpAudio = new TcpClass();
tcpAudio.OnMessageRecv += new TcpClass.MessageRecv(tcpAudio_OnMessageRecv);
tcpAudio.OnConnectionEnded += new TcpClass.ConnectionEnded(tcpAudio_OnConnectionEnded);
}
catch (Exception ex)
{
SM.Debug("InitListToPlay:" + ex.ToString());
}
}
void tcpAudio_OnMessageRecv(byte[] data, int recv)
{
try
{
RecorderStream1.Write(data, 0, recv);
MainForm2.PlayingFileCount++;
if (MainForm2.PlayingFileCount == 2)
{
UnableToPlay.Stop();
UnableToPlay.Enabled = false;
}
}
catch (Exception ex)
{
SM.Debug("tcpAudio_OnMessageRecv:" + ex.ToString());
}
}
void tcpAudio_OnConnectionEnded()
{
try
{
recordingWaveStream = new RawSourceWaveStream(new MemoryStream(RecorderStream1.ToArray()), waveInClass.WaveFormat);
recordingWaveOut.Init(recordingWaveStream);
recordingWaveOut.Play();
}
catch (Exception ex)
{
SM.Debug("Conection ended error:" + ex.ToString());
}
}
#endregion
#region voiceINIT
//public volatile NewAudio nVOice;
public volatile WaveIn waveInClass = null;
private volatile BufferedWaveProvider buffWaveProvider = null;
public volatile WaveOut waveOutClass = null;
public int selectedOUTDevice;
public string selectedOUTDeviceName = " ";
public int selectedINDevice;
public string selectedINDeviceName = " ";
public ArrayList soundINDevices = new ArrayList();
public ArrayList soundOUTDevices = new ArrayList();
EventHandler<WaveInEventArgs> waveInClassHandlerForDataAvailable = null;
public void StartnVoice()
{
try
{
if (waveOutClass != null)
{
waveOutClass.Dispose();
waveOutClass = null;
}
if (waveInClass != null)
{
waveInClass.DataAvailable -= waveInClassHandlerForDataAvailable;
waveInClass.Dispose();
waveInClass = null;
}
//selectedINDevice = selectedOUTDevice = 0;
if ((selectedINDevice != -1) && (selectedOUTDevice != -1))
{
try
{
/*nVOice = new NewAudio(selectedINDevice, selectedOUTDevice);
nVOice.OnVoiceRecv += new NewAudio.VoiceRecv(nVOice_OnNewDataRecv);
MainForm2.nVoiceforClose = nVOice;*/
Utils.WriteLine("Device IN:" + selectedINDevice + " Device OUT:" + selectedOUTDevice, ConsoleColor.Magenta);
waveInClass = new WaveIn();
waveInClass.DeviceNumber = selectedINDevice;
waveInClass.BufferMilliseconds = voicemanager_bufferMilliseconds;
waveInClassHandlerForDataAvailable = waveInClass_DataAvailable;
#if LINX || LINXB || EXCERA
if (MainForm2.recordingsDecide)
{
waveInClassHandlerForDataAvailable = waveInClass_DataAvailable_Recordings;
}
#endif
waveInClass.DataAvailable += waveInClassHandlerForDataAvailable;
int sampleRate = voicemanager_sampleRate;
int channels = 1;
waveInClass.WaveFormat = new NAudio.Wave.WaveFormat(sampleRate, voicemanager_bitDepth, channels);
waveInClass.StartRecording();
buffWaveProvider = new BufferedWaveProvider(waveInClass.WaveFormat);
waveOutClass = new WaveOut();
waveOutClass.DeviceNumber = selectedOUTDevice;
waveOutClass.Init(buffWaveProvider);
waveOutClass.Play();
recordingWaveOut = new WaveOut();
recordingWaveOut.DeviceNumber = selectedOUTDevice;
//MainForm2.waveInClassforClose = waveInClass;
//MainForm2.waveOutClassforClose = waveOutClass;
Utils.WriteLine("Init new WAVE module", ConsoleColor.Magenta);
}
catch (Exception ex)
{
SM.Debug("Error to start voice for ALL call" + ex.ToString());
}
}
}
catch (Exception ex)
{
SM.Debug("StartnVoice:" + ex.ToString());
}
}
void waveInClass_DataAvailable(object sender, WaveInEventArgs e)
{
try
{
if (PTTinprogres)
{
if (selected_Subscriber.canMakeSipCalls)
{
parent.SendSipVoice(selected_Subscriber.SipID.ToString(), e.Buffer, e.BytesRecorded, SipComponent.AudioFormat.PCM);
}
else
{
Utils.WriteLine($"Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} ");
MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded);
}
}
}
catch (Exception ex)
{
SM.Debug("nVOice_OnNewDataRecv:" + ex.ToString());
}
}
void waveInClass_DataAvailable_Recordings(object sender, WaveInEventArgs e)
{
try
{
if (PTTinprogres)
{
if (selected_Subscriber.canMakeSipCalls)
{
parent.SendSipVoice(selected_Subscriber.SipID.ToString(), e.Buffer, e.BytesRecorded, SipComponent.AudioFormat.PCM);
// Send also voice on mBus so that AppServer will record
Utils.WriteLine($"[Rec] Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} ");
MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded);
}
else
{
Utils.WriteLine($"[Rec] Sending {e.BytesRecorded} voice bytes on multicast address {MainForm2.udp4Voice.mcastGroup} ");
MainForm2.udp4Voice.Send(e.Buffer, e.BytesRecorded);
}
}
}
catch (Exception ex)
{
SM.Debug("nVOice_OnNewDataRecv:" + ex.ToString());
}
}
private void InputSoundList_Click(object sender, EventArgs e)
{
InitAudioInputDevices();
}
private void OutputSoundList_Click(object sender, EventArgs e)
{
InitAudioOutputDevices();
}
private void InitAudioInputDevices()
{
selectedINDevice = -1;
try
{
InputSoundList.Items.Clear();
int nrOfWaveInDevices = WaveIn.DeviceCount;
for (int j = 0; j < nrOfWaveInDevices; j++)
{
WaveInCapabilities deviceInvo = WaveIn.GetCapabilities(j);
sDevice dev;
dev.index = j;
dev.name = deviceInvo.ProductName.Trim();
soundINDevices.Add(dev);
InputSoundList.Items.Add(dev.name);
}
if (soundINDevices.Count > 0)
{
if (selectedINDevice < soundINDevices.Count)
{
bool found = false;
foreach (sDevice dev in soundINDevices)
{
if (dev.name == selectedINDeviceName)
{
found = true;
selectedINDevice = dev.index;
//InputSoundList.Text = dev.name;
InputSoundList.SelectedIndex = dev.index;
}
}
if (!found)
{
selectedINDevice = 0;
}
}
else
{
selectedINDevice = 0;
}
}
InputSoundList.SelectedIndex = selectedINDevice;
}
catch (Exception ex)
{
SM.Debug("ERROR in voice ini : " + ex.ToString());
}
}
private void InitAudioOutputDevices()
{
selectedOUTDevice = -1;
try
{
OutputSoundList.Items.Clear();
int nrOfWaveOUTDevices = WaveOut.DeviceCount;
for (int j = 0; j < nrOfWaveOUTDevices; j++)
{
WaveOutCapabilities deviceInvo = WaveOut.GetCapabilities(j);
sDevice dev;
dev.index = j;
dev.name = deviceInvo.ProductName.Trim();
soundOUTDevices.Add(dev);
OutputSoundList.Items.Add(dev.name);
}
if (soundOUTDevices.Count > 0)
{
if (selectedOUTDevice < soundOUTDevices.Count)
{
bool found = false;
foreach (sDevice dev in soundOUTDevices)
{
if (dev.name == selectedOUTDeviceName)
{
found = true;
selectedOUTDevice = dev.index;
//InputSoundList.Text = dev.name;
OutputSoundList.SelectedIndex = dev.index;
}
}
if (!found)
{
selectedOUTDevice = 0;
}
}
else
{
selectedOUTDevice = 0;
}
}
OutputSoundList.SelectedIndex = selectedOUTDevice;
}
catch (Exception ex)
{
SM.Debug("ERROR in voice ini : " + ex.ToString());
}
}
private void iniVoiceComponents()
{
selectedOUTDevice = -1;
selectedINDevice = -1;
try
{
InputSoundList.Items.Clear();
OutputSoundList.Items.Clear();
int nrOfWaveOUTDevices = WaveOut.DeviceCount;
for (int j = 0; j < nrOfWaveOUTDevices; j++)
{
WaveOutCapabilities deviceInvo = WaveOut.GetCapabilities(j);
sDevice dev;
dev.index = j;
dev.name = deviceInvo.ProductName.Trim();
soundOUTDevices.Add(dev);
OutputSoundList.Items.Add(dev.name);
}
if (soundOUTDevices.Count > 0)
{
if (selectedOUTDevice < soundOUTDevices.Count)
{
bool found = false;
foreach (sDevice dev in soundOUTDevices)
{
if (dev.name == selectedOUTDeviceName)
{
found = true;
selectedOUTDevice = dev.index;
//InputSoundList.Text = dev.name;
OutputSoundList.SelectedIndex = dev.index;
}
}
if (!found)
{
selectedOUTDevice = 0;
}
}
else
{
selectedOUTDevice = 0;
}
}
int nrOfWaveInDevices = WaveIn.DeviceCount;
for (int j = 0; j < nrOfWaveInDevices; j++)
{
WaveInCapabilities deviceInvo = WaveIn.GetCapabilities(j);
sDevice dev;
dev.index = j;
dev.name = deviceInvo.ProductName.Trim();
soundINDevices.Add(dev);
InputSoundList.Items.Add(dev.name);
}
if (soundINDevices.Count > 0)
{
if (selectedINDevice < soundINDevices.Count)
{
bool found = false;
foreach (sDevice dev in soundINDevices)
{
if (dev.name == selectedINDeviceName)
{
found = true;
selectedINDevice = dev.index;
//InputSoundList.Text = dev.name;
InputSoundList.SelectedIndex = dev.index;
}
}
if (!found)
{
selectedINDevice = 0;
}
}
else
{
selectedINDevice = 0;
}
}
// selectedOUTDevice = selectedINDevice = 0;
OutputSoundList.SelectedIndex = selectedOUTDevice;
InputSoundList.SelectedIndex = selectedINDevice;
}
catch (Exception ex)
{
SM.Debug("ERROR in voice ini : " + ex.ToString());
}
}
#endregion
~RadioTab()
{
//if(tcp!=null)tcp.Stop();
if (tcpAudio != null) tcpAudio.Stop();
}
private void listRecordings_MouseClick(object sender, MouseEventArgs e)
{
Console.WriteLine("INTO CLICK LIST");
PlayFile(3949747661, 7);
//PlayFile(((Recording)listRecordings.SelectedItem).RecID, ((Recording)listRecordings.SelectedItem).duration);
}
public Subscriber selected_Subscriber = null;
/// <summary>
/// Not used? Should be deleted?
/// </summary>
public Subscriber selected_Subscriber_PTT = null;
/// <summary>
/// Not used? Should be deleted?
/// </summary>
//private Subscriber field_subscriber_making_the_call = null;
private void listSubscribers_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.listViewSubscribers.SelectedItems.Count == 0)
{
selected_Subscriber = selected_Subscriber_PTT = null;
return;
}
listFavorites.SelectedIndex = -1;
listFavorites.Update();
selected_Subscriber = selected_Subscriber_PTT = (Subscriber)listViewSubscribers.SelectedItems[0].DataBoundItem;
SetPTTButtonEnableDisable();
Update_call_selected();
}
private void SetPTTButtonEnableDisable()
{
if (selected_Subscriber != null && selected_Subscriber.SubscriberType != SubscriberType.DISPATCHER && !selected_Subscriber.canMakeSipCalls)
{
try
{
if (MainForm2.vehicleHT.ContainsKey(selected_Subscriber.DispatcherName))
{
((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).CheckPositionInSystem();
selected_Subscriber.Gw_and_radioID = ((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).GwandRadioID;
}
RadioGateway radioGw = (RadioGateway)MainForm2.radioGwHT[selected_Subscriber.Gw_and_radioID];
pbPTT.Enabled = radioGw.Alive;
pbPTT.Image = pbPTT.Enabled ? Dispatcher.Properties.Resources.r_ptt : Dispatcher.Properties.Resources.r_ptt_incoming;
}
catch
{
pbPTT.Enabled = false;
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_incoming;
}
}
else
{
pbPTT.Enabled = true;
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt;
}
if(selected_Subscriber.canMakeSipCalls)
{
pbPTT.Enabled = MainForm2.sipStatus;
pbPTT.Image = MainForm2.sipStatus ? Dispatcher.Properties.Resources.r_ptt : Dispatcher.Properties.Resources.r_ptt_incoming;
}
}
private void listFavorites_SelectedIndexChanged(object sender, EventArgs e)
{
if (this.listFavorites.SelectedItems.Count == 0)
{
selected_Subscriber = selected_Subscriber_PTT = null;
return;
}
listViewSubscribers.SelectedIndex = -1;
listViewSubscribers.Update();
selected_Subscriber = selected_Subscriber_PTT = (Subscriber)listFavorites.SelectedItems[0].DataBoundItem;
SetPTTButtonEnableDisable();
Update_call_selected();
}
private void listFavorites_ItemMouseClick(object sender, ListViewItemEventArgs e)
{
// Daca e doar un element in lista, vreau ca la click sa se apleleze procedura de selectie
if (listFavorites.Items.Count == 1)
listFavorites_SelectedIndexChanged(listFavorites, null);
}
private void Update_call_selected()
{
switch (selected_Subscriber.SubscriberType)
{
case SubscriberType.SUBSCRIBER:
lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forPrivatecallto"), selected_Subscriber.DispatcherName);
break;
case SubscriberType.GROUP:
lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forGroupcallto"), selected_Subscriber.DispatcherName);
break;
case SubscriberType.ALL:
lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forAllcall"), selected_Subscriber.DispatcherName);
break;
case SubscriberType.DISPATCHER:
lbPTT_to_unit.Text = String.Format(MainForm2.returnLNGString("forDispatchercallto"), selected_Subscriber.DispatcherName);
break;
}
}
#region Recive Data From MessageBus
private void CheckMessage_DoWork(object sender, DoWorkEventArgs e)
{
try
{
BackgroundWorker worker = sender as BackgroundWorker;
e.Result = Computation(worker, e);
}
catch (Exception ex)
{
SM.Debug("Erorr start checkMessage:" + ex.ToString());
}
}
public volatile Int32 dataIntVOL = 0;
public volatile Int32 typeVOL = 0;
public volatile Int32 IdVOL = 0;
private volatile Boolean PTTinprogres = false;
public volatile Boolean ResponsePTT = false;
private volatile string GatewayAndRadioID = "";
public volatile Int32 callStatusVOL = 0;
public volatile Int32 callTypeVOL = 0;
public volatile Int32 grpIDVOL = 0;
private volatile Boolean Startrecevied = false;
private Dictionary<long, bool> startReceivedDict = new Dictionary<long, bool>();
//private CallsForm uniqueCallForm = null;
private Dictionary<string, CallsForm> callFormContainer = new Dictionary<string, CallsForm>();
public volatile Alarms voltmpx = null;
//public volatile System.Threading.Timer tclose125 = null;
private void Come_back_to_normal_PTT_state(object state)
{
try
{
if (this.InvokeRequired)
{
this.Invoke((Action)(() => { pbPTT.Image = Dispatcher.Properties.Resources.r_ptt; }));
}
else
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt;
}
catch (Exception ex)
{
SM.Debug("Ex101:" + ex.ToString());
}
}
private void CheckMessage_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
try
{
dataIntVOL = e.ProgressPercentage;
typeVOL = dataIntVOL % 1000;
IdVOL = dataIntVOL / 1000;
switch (typeVOL)
{
case 100:
/* if (IdVOL == 1)
{
TurnON();
isON = true; //intreb gaby cum da canalele
}
else
{
TurnOFF();
isON = false;
lbStatus.Text = radiooffline;
lbStatus.Update();
}*/
break;
case 999: //exitra timpu si opresc statia
/* rbAllCall.Enabled = true;
rbGroupCall.Enabled = true;
rbPrivateCall.Enabled = true;
rbAllCall.IsChecked = true;
TurnOFF();
PTTclicked = false;
lbStatus.Text = radiooffline;
lbStatus.Update*/
break;
case 998:
/* lbStatus.Text = btRem.Text + " " + MainForm2.returnLNGString("error");
btRem.Enabled = true;
EnableChALL();
PTT_enable();
PTTclicked = false;
parent.GeneralPTTclick = false;*/
break;
case 207:
/* if (IdVOL == 1)
{
chanelFree = false;
DisableALL();
}
else
{
chanelFree = true;
EnableALL();
}*/
break;
case 124:
/* SM.Debug("proccess 124 for IP:" + myIP);
TurnON();
ImgStat.Image = global::Dispatcher.Properties.Resources.green_status;
isON = true;
FirstChanle00 = false;
DisplayChChanel(IdVOL);
PTTinprogres = false; */
break;
case 115:
PTTinprogres = false;
Utils.WriteLine($"Received 115 commnad");
//confirmare mesajului de OFF
break;
case 116:
PTTinprogres = false;
Utils.WriteLine($"Received 116 commnad");
break;
case 117:
PTTinprogres = false;
Utils.WriteLine($"Received 117 commnad");
break;
case 121:
if (IdVOL == 1)
{
Utils.WriteLine($"RadioTab Handle121Command {IdVOL}", ConsoleColor.Cyan);
PTTinprogres = true;
ConfirmPTT_and_Start_Voice();
}
else
{
//set other status for button on response is wrong Talk with ADY
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
PTTinprogres = false;
}
ResponsePTT = true;
break;
case 10:
String reason = "unknown";
switch ((RADIO_STATUS)IdVOL)
{
case RADIO_STATUS.ALLcall_INIT:
reason = "All call";
break;
case RADIO_STATUS.ALLcall_INPROGRES:
reason = "All call";
break;
case RADIO_STATUS.CallEvent:
reason = "CallEvent";
break;
case RADIO_STATUS.ChannelQuery:
reason = "ChQuery";
break;
case RADIO_STATUS.DKEY:
reason = "Dkey";
break;
case RADIO_STATUS.EnableDisable:
reason = "En./Dis.";
break;
case RADIO_STATUS.FREE:
reason = "Free";
break;
case RADIO_STATUS.GroupCall_INIT:
reason = "GroupCall";
break;
case RADIO_STATUS.GroupCall_INPROGRES:
reason = "GroupCall";
break;
case RADIO_STATUS.HangTime:
reason = "HangTime";
break;
case RADIO_STATUS.OFF:
reason = "OFF";
break;
case RADIO_STATUS.PrivateCall_INIT:
reason = "Priv. Call";
break;
case RADIO_STATUS.PrivateCall_INPROGRES:
reason = "Priv. Call";
break;
case RADIO_STATUS.RemoteMonitor:
reason = "RM";
break;
case RADIO_STATUS.RemoteMonitor_INPROGRES:
reason = "RM";
break;
}
break;
case 122:
Handle122Command(IdVOL);
break;
case 221:
if (IdVOL == 1)
{
PTTinprogres = true;
RecivedData = true;
ConfirmPTT_and_Start_Voice();
}
else
{
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
PTTinprogres = false;
//RecivedData = false;
//receive data false ideea e ca daca aveam doua calluri simultan si unul se inchidea, daca pe celalalt il puneam pe principal nu mai venea voce
//pentru ca exista un singur receive data
RecivedData = MainForm2.PriorityIP != "";
}
break;
case 211:
PTTinprogres = false;
//RecivedData = false;
RecivedData = MainForm2.PriorityIP != "";
//uniqueCallForm.Close();
//uniqueCallForm = null;
if (callFormContainer.ContainsKey(PersonalIP) && callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
#region call patching
if (patchDictionary.ContainsKey("Dispatcher." + IdVOL))
EndCallPatch("Dispatcher", "Dispatcher." + IdVOL, IdVOL.ToString());
#endregion
}
break;
case 201:
string idtmp = "";
if (MainForm2.userIDHash[IdVOL] != null)
{
idtmp = (string)MainForm2.userIDHash[IdVOL];
if ((idtmp != null) && (idtmp != ""))
{
if (idtmp.Length > 17)
{
idtmp = idtmp.Remove(17);
idtmp += "...";
}
}
else idtmp = IdVOL.ToString();
}
else idtmp = IdVOL.ToString();
if (MainForm2.userIDHash[IdVOL] != null)
{
string id2 = (string)MainForm2.userIDHash[IdVOL];
//field_subscriber_making_the_call = new Subscriber()
//{
// DispatcherName = id2,
// SubscriberType = SubscriberType.DISPATCHER,
// ImageKey = "i_classic_bus_02",
// IconFilePath = MainForm2.GetIconPathForUnit(id2),
// IP = String.Format("224.20.{0}.1", IdVOL),
// Imei = IdVOL.ToString(),
// Favorite = false
//};
}
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
//}
if (!callFormContainer.ContainsKey(PersonalIP))
{
callFormContainer.Add(PersonalIP, null);
}
else
{
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
}
}
if (rcbBubble.Checked)
{
//uniqueCallForm = new CallsForm(IdVOL, idtmp, 0, 201, 4);
//uniqueCallForm.OnHeadset_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2)
GetAvailablePosition();
callFormContainer[PersonalIP] = new CallsForm(IdVOL, idtmp, 0, 201, 4, PersonalIP);
callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"),
GetRadioGatewayForSubscriber(IdVOL)?.Name);
callFormContainer[PersonalIP].GatewayName = GetRadioGatewayForSubscriber(IdVOL)?.Name;
callFormContainer[PersonalIP].SetMute(MainForm2.PriorityIP == "");
if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = PersonalIP;
callFormContainer[PersonalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
// user wants to mute the sound from this user
if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP)
callFormContainer[MainForm2.PriorityIP].SetMute(false);
if (MainForm2.PriorityIP != e2.IP)
MainForm2.PriorityIP = e2.IP;
else
MainForm2.PriorityIP = "";
};
callFormContainer[PersonalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef)
{
// on form closing event
if (((CallsForm)s)._IP == MainForm2.PriorityIP)
{
MainForm2.PriorityIP = "";
}
};
//uniqueCallForm.OnPlay_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2)
callFormContainer[PersonalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey) sendDekey();
else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call) sendCallStop(e2.IMEI);
else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT))
{
String Ip = e2.IP;
if (e2.SubsType != SubscriberType.DISPATCHER)
Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID);
Subscriber tmpsub = new Subscriber
{
DispatcherName = e2.CallerName,
SubscriberType = e2.SubsType,
Sc_id = 0,
Imei = e2.IMEI,
Gw_and_radioID = Valid_GwID_and_RadioID,
IP = Ip,
Favorite = false,
canMakeSipCalls = !e2.IP.Contains("224.")
};
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true);
else StopPTT(tmpsub);
}
};
//uniqueCallForm.Show();
callFormContainer[PersonalIP].Show();
}
RecivedData = true;
#region call patching
//if (patchDictionary.ContainsKey("Dispatcher." + IdVOL))
// StartCallPatch("Dispatcher", "Dispatcher." + IdVOL, IdVOL.ToString());
#endregion
break;
case 162:
if (IdVOL == 1)
{
string id = "";// just protect to manual dial
if (MainForm2.VehIMEIHash[selected_Subscriber.Imei] != null)
{
id = (string)MainForm2.VehIMEIHash[selected_Subscriber.Imei];
if ((id != null) && (id != ""))
{
if (id.Length > 17)
{
id = id.Remove(17);
id += "...";
}
}
else id = selected_Subscriber.Imei;
}
else
id = selected_Subscriber.Imei;
//if (MainForm2.VehIMEIHash[selected_Subscriber.Imei] != null)
//{
// id = (string)MainForm2.VehIMEIHash[selected_Subscriber.Imei];
// //((Vehicle)MainForm2.vehicleHT[name]).CheckPositionInSystem();
// field_subscriber_making_the_call = new Subscriber()
// {
// DispatcherName = id,
// SubscriberType = SubscriberType.SUBSCRIBER,
// ImageKey = "i_classic_bus_02",
// IconFilePath = MainForm2.GetIconPathForUnit(id),
// Sc_id = ((Vehicle)MainForm2.vehicleHT[id]).sc_id,
// Imei = ((Vehicle)MainForm2.vehicleHT[id]).IMEI,
// Gw_and_radioID = Valid_GwID_and_RadioID,
// IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
// Favorite = false
// };
//}
//else
//{
// field_subscriber_making_the_call = new Subscriber()
// {
// DispatcherName = selected_Subscriber.Imei,
// SubscriberType = SubscriberType.SUBSCRIBER,
// ImageKey = "i_classic_bus_02",
// IconFilePath = MainForm2.GetIconPathForUnit(selected_Subscriber.Imei),
// Sc_id = 0,
// Imei = selected_Subscriber.Imei,
// Gw_and_radioID = Valid_GwID_and_RadioID,
// IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
// Favorite = false
// };
//}
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
//}
if (!callFormContainer.ContainsKey(PersonalIP))
{
callFormContainer.Add(PersonalIP, null);
}
else
{
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
}
}
if (rcbBubble.Checked)
{
//uniqueCallForm = new CallsForm(Convert.ToInt64(selected_Subscriber.Imei), id, grpIDVOL, 162, callStatusVOL);
//uniqueCallForm.OnHeadset_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2)
GetAvailablePosition();
callFormContainer[PersonalIP] = new CallsForm(Convert.ToInt64(selected_Subscriber.Imei), id, grpIDVOL, 162, callStatusVOL, PersonalIP);
callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"),
GetRadioGatewayForSubscriber(IdVOL)?.Name);
callFormContainer[PersonalIP].GatewayName = GetRadioGatewayForSubscriber(IdVOL)?.Name;
callFormContainer[PersonalIP].SetMute(MainForm2.PriorityIP == "");
if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = PersonalIP;
callFormContainer[PersonalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
// user wants to mute the sound from this user
if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP)
callFormContainer[MainForm2.PriorityIP].SetMute(false);
if (MainForm2.PriorityIP != e2.IP)
MainForm2.PriorityIP = e2.IP;
else
MainForm2.PriorityIP = "";
};
callFormContainer[PersonalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef)
{
// on form closing event
if (((CallsForm)s)._IP == MainForm2.PriorityIP)
{
MainForm2.PriorityIP = "";
}
};
//uniqueCallForm.OnPlay_Click += delegate(object s, CallsForm.ToggleClickEventArgs e2)
callFormContainer[PersonalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey) sendDekey();
else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call) sendCallStop(e2.IMEI);
else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT))
{
String Ip = e2.IP;
if (e2.SubsType != SubscriberType.DISPATCHER)
Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID);
Subscriber tmpsub = new Subscriber
{
DispatcherName = e2.CallerName,
SubscriberType = e2.SubsType,
Sc_id = 0,
Imei = e2.IMEI,
Gw_and_radioID = Valid_GwID_and_RadioID,
IP = Ip,
Favorite = false,
canMakeSipCalls = !e2.IP.Contains("224.")
};
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true);
else StopPTT(tmpsub);
}
};
//uniqueCallForm.Show();
callFormContainer[PersonalIP].Show();
}
}
else if (IdVOL == 2)
{
//SMSAlert
RemoteMonitorDesktopAlert.FixedSize = new System.Drawing.Size(329, 120);
RemoteMonitorDesktopAlert.ContentImage = global::Dispatcher.Properties.Resources.remmonitor24x20;
String html_message = "<span><size=11><color=blue>" + MainForm2.returnLNGString("rem") + ": " + selected_Subscriber.DispatcherName + " </span>";
RemoteMonitorDesktopAlert.ContentText = "<html>" + html_message + "</html>"; // mesajul din interior editat cu html
String title = MainForm2.returnLNGString("remfail");
RemoteMonitorDesktopAlert.CaptionText = title;
//SMSDesktopAlert.ContentText = (e.UserState as String);
RemoteMonitorDesktopAlert.Show();
}
break;
case 172:
//RecivedData = false;
RecivedData = MainForm2.PriorityIP != "";
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
//}
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
}
break;
case 222:
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
//}
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
}
break;
case 123:
/*
if (IdVOL == 1)
{
PTTinprogres = true;
ConfirmPTT_and_Start_Voice();
}
else
{
// ADY if we put other image for call rejected
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
PTTinprogres = false;
PTTclicked = false;
}
ResponsePTT = true;
*/
Handle123Command(IdVOL);
break;
case 125:
callStatusVOL = (e.UserState as transfer125).callStatus;
callTypeVOL = (e.UserState as transfer125).callType;
grpIDVOL = (e.UserState as transfer125).grpID;
String gwID = (e.UserState as transfer125).gwID;
String radioGwID = (e.UserState as transfer125).radioGwID;
Int64 IdVOLx = (e.UserState as transfer125).intvalID;
Handle125Command(gwID, radioGwID, callStatusVOL, callTypeVOL, grpIDVOL, IdVOLx);
break;
}
}
catch (Exception ex)
{
SM.Debug("Error processmessage on radio:" + ex.ToString());
}
}
private void Handle122Command(int result)
{
Utils.WriteLine($"RadioTab Handle122Command {result}", ConsoleColor.Cyan);
if (result == 1)
{
PTTinprogres = true;
ConfirmPTT_and_Start_Voice();
try
{
if (MainForm2.vehicleHT.Contains(selected_Subscriber.DispatcherName))
((Vehicle)MainForm2.vehicleHT[selected_Subscriber.DispatcherName]).EventLists.Add(new Alarms(rep_type.CALLSEND, DateTime.Now, "", ""));
//FirstTimePriv = DateTime.Now;
}
catch (Exception ex)
{
SM.Debug("Erorr adding 122:" + ex.ToString());
}
}
else
{
// ADY if we put other image for call rejected
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1500, System.Threading.Timeout.Infinite);
PTTinprogres = false;
}
ResponsePTT = true;
}
private void Handle123Command(int result)
{
Utils.WriteLine($"RadioTab Handle123Command {result}", ConsoleColor.Cyan);
if (result == 1)
{
PTTinprogres = true;
ConfirmPTT_and_Start_Voice();
}
else
{
// ADY if we put other image for call rejected
pbPTT.Image = Dispatcher.Properties.Resources.r_ptt_end;
System.Threading.Timer t1 = new System.Threading.Timer(Come_back_to_normal_PTT_state, null, 1000, System.Threading.Timeout.Infinite);
PTTinprogres = false;
}
ResponsePTT = true;
}
private RadioGateway GetRadioGatewayForSubscriber(Int64 radioID)
{
RadioGateway result = null;
if (MainForm2.VehIMEIHash[radioID.ToString()] != null)
{
if (MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]] != null)
{
((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]]).CheckPositionInSystem();
GatewayAndRadioID = ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[radioID.ToString()]]).GwandRadioID;
if (MainForm2.radioGwHT[GatewayAndRadioID] != null)
{
result = ((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]);
}
}
}
return result;
}
public void OnRadioGatewayStateChanged(RadioGateway gateway, RadioState state)
{
if (this.InvokeRequired)
{
this.Invoke((MethodInvoker)delegate
{
OnRadioGatewayStateChanged(gateway, state);
});
}
else
{
rlvGatewayStatus.BeginUpdate();
RadioGateway rg = radiogateways.Find(d => d.Name.Equals(gateway.Name));
if(rg != null)
rg.State1 = state;
rlvGatewayStatus.EndUpdate();
}
}
private static readonly object lockerIP = new object();
/// <summary>
/// Handles 125 command in RadioTab
/// </summary>
/// <param name="callStatus">The State of the call: 1 - Initiated, 2 - HangTime, 3 - Ended</param>
/// <param name="callType">The type of the call: 101 - All Call, 102 - Private Call, 103 - Group Call, 104 - Emergency Call </param>
/// <param name="targetID">The ID of the field or group which received the call</param>
/// <param name="sourceRadioID">The ID of the radio which initiated the call</param>
private void Handle125Command(String gwId, String radioGWId, int callStatus, int callType, int targetID, long sourceRadioID, ContactType sourceType = ContactType.UNIT)
{
//Utils.WriteLine($"Received CallStatus Update : {callStatus} | {callType} | {targetID} | {sourceRadioID} || {sourceType}", ConsoleColor.Yellow);
RadioGateway rg = null;
if (MainForm2.radioGwHT.ContainsKey(gwId+"." + radioGWId))
rg = ((RadioGateway)MainForm2.radioGwHT[gwId + "." + radioGWId]);
if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null)
{
if (MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]] != null)
{
((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).CheckPositionInSystem();
GatewayAndRadioID = ((Vehicle)MainForm2.vehicleHT[MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).GwandRadioID;
if (MainForm2.radioGwHT[GatewayAndRadioID] != null)
{
if (((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]).Type == (int)GatewayType.Broadband || ((RadioGateway)MainForm2.radioGwHT[GatewayAndRadioID]).Type == (int)GatewayType.Tier3Radio)
{
if (callTypeVOL == 102 && MainForm2.userIDX != grpIDVOL)
{
return;
}
}
}
}
}
// Call initiated
if (!startReceivedDict.ContainsKey(sourceRadioID))
startReceivedDict.Add(sourceRadioID, false);
if (callStatusVOL == 1)
{
try
{
//if (!Startrecevied)
if (startReceivedDict[sourceRadioID] == false)
{
try
{
Console.ForegroundColor = ConsoleColor.Red;
Console.WriteLine("CallStat:" + callStatusVOL + " calltype:" + callTypeVOL + " grpID:" + grpIDVOL);
Console.ResetColor();
string id = "";
if (sourceType == ContactType.UNIT)
{
if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) // Check if source radio id is a unit
{
id = (string)MainForm2.VehIMEIHash[sourceRadioID.ToString()];
if ((id != null) && (id != ""))
{
if (id.Length > 17)
{
id = id.Remove(17);
id += "...";
}
}
else id = sourceRadioID.ToString();
}
else id = sourceRadioID.ToString();
}
else if (sourceType == ContactType.USER)
{
if (MainForm2.userIDHash.ContainsKey((int)sourceRadioID)) // check if source radio id is a dispatcher (for sip group calls)
{
id = MainForm2.userIDHash[(int)sourceRadioID].ToString();
}
else id = sourceRadioID.ToString();
}
else
id = sourceRadioID.ToString();
/*lbIDValue.Text = id;
lbStatus.Text = id;
if (callTypeVOL == 101) lbChanel.Text = rbAllCall.Text;
else if (callTypeVOL == 103) lbChanel.Text = rbGroupCall.Text + " (" + grpIDVOL + ")";
else if (callTypeVOL == 102) lbChanel.Text = rbPrivateCall.Text;
if (callTypeVOL == 101) rbAllCall.IsChecked = true;
else if (callTypeVOL == 103) { rbGroupCall.IsChecked = true; tbGroupCallId.Text = grpIDVOL.ToString(); }
else if (callTypeVOL == 102) { rbPrivateCall.IsChecked = true; tbPrivateCallId.Text = IdVOLx.ToString(); }
else rbAllCall.IsChecked = true; // add new for bug858
rbAllCall.Enabled = false;
rbGroupCall.Enabled = false;
rbPrivateCall.Enabled = false;*/
//field_subscriber_making_the_call = new Subscriber();
//if (MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null)
//{
// id = (string)MainForm2.VehIMEIHash[sourceRadioID.ToString()];
// field_subscriber_making_the_call = new Subscriber()
// {
// DispatcherName = id,
// SubscriberType = SubscriberType.SUBSCRIBER,
// ImageKey = "i_classic_bus_02",
// Sc_id = ((Vehicle)MainForm2.vehicleHT[id]).sc_id,
// Imei = ((Vehicle)MainForm2.vehicleHT[id]).IMEI,
// IconFilePath = MainForm2.GetIconPathForUnit(id),
// Gw_and_radioID = Valid_GwID_and_RadioID,
// IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
// Favorite = false
// };
//}
//else
//{
// field_subscriber_making_the_call = new Subscriber()
// {
// DispatcherName = sourceRadioID.ToString(),
// SubscriberType = SubscriberType.SUBSCRIBER,
// ImageKey = "i_classic_bus_02",
// Sc_id = 0,
// IconFilePath = MainForm2.GetIconPathForUnit(sourceRadioID.ToString()),
// Imei = sourceRadioID.ToString(),
// Gw_and_radioID = Valid_GwID_and_RadioID,
// IP = String.Format("224.10.{0}", Valid_GwID_and_RadioID),
// Favorite = false
// };
//}
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
//}
if (!callFormContainer.ContainsKey(PersonalIP))
{
callFormContainer.Add(PersonalIP, null);
}
else
{
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
}
}
if (rcbBubble.Checked)
{
//uniqueCallForm = new CallsForm(sourceRadioID, id, grpIDVOL, callTypeVOL, callStatusVOL);
//uniqueCallForm.OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
GetAvailablePosition();
//check if radio is in emergency and isn't another emergency call in progress
if (MainForm2.vehicleHT.ContainsKey(id))
{
if (((Vehicle)MainForm2.vehicleHT[id]).is_emergency && PriorityEmergency.Count == 0)
{
if (MainForm2.PriorityIP != "")
callFormContainer[MainForm2.PriorityIP].SetMute(false);
MainForm2.PriorityIP = "";
PriorityEmergency.Add(id, true);
}
}
string personalIP = PersonalIP;
callFormContainer[personalIP] = new CallsForm(sourceRadioID, id, grpIDVOL, callTypeVOL, callStatusVOL, personalIP);
callFormContainer[PersonalIP].Title = String.Format("SafeMobile - " + MainForm2.returnLNGString("callOnGateway"),
rg?.Name);
callFormContainer[PersonalIP].GatewayName = rg?.Name;
callFormContainer[personalIP].SetMute(MainForm2.PriorityIP == "");
if (MainForm2.vehicleHT.ContainsKey(id))
{
if (((Vehicle)MainForm2.vehicleHT[id]).is_emergency)
{
callFormContainer[personalIP].SetEmergencyColorBackground();
}
}
if (MainForm2.PriorityIP == "") MainForm2.PriorityIP = personalIP;
// Check if is sip call
bool isSipCall = false;
int sipID;
if (int.TryParse(personalIP, out sipID))
{
isSipCall = true;
}
callFormContainer[personalIP].OnHeadset_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
// user wants to mute the sound from this user
if (MainForm2.PriorityIP != "" && MainForm2.PriorityIP != e2.IP)
callFormContainer[MainForm2.PriorityIP].SetMute(false);
if (MainForm2.PriorityIP != e2.IP)
MainForm2.PriorityIP = e2.IP;
else
MainForm2.PriorityIP = "";
PriorityEmergency = new Dictionary<string, bool>();
};
callFormContainer[personalIP].OnForm_Closing += delegate (object s, FormClosingEventArgs ef)
{
// on form closing event
if (((CallsForm)s)._IP == MainForm2.PriorityIP)
{
MainForm2.PriorityIP = "";
}
if (PriorityEmergency.Count > 0)
{
if (PriorityEmergency.ContainsKey(((CallsForm)s).name))
PriorityEmergency = new Dictionary<string, bool>();
}
};
//uniqueCallForm.OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
callFormContainer[personalIP].OnPlay_Click += delegate (object s, CallsForm.ToggleClickEventArgs e2)
{
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Dekey)
{
// Check if is sip call
if (isSipCall)
{
// Dekey for linx call
CloseSipCall(id);
}
else
sendDekey();
}
else if (e2.Type_of_message == CallsForm.Cmd_type_callForm.End_call)
{
if (isSipCall)
{
// Make dekey
CloseSipCall(id);
}
else
sendCallStop(e2.IMEI);
}
else if ((e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) || (e2.Type_of_message == CallsForm.Cmd_type_callForm.Stop_PTT))
{
Valid_GwID_and_RadioID = responseGW;
String Ip = e2.IP;
if (e2.SubsType != SubscriberType.DISPATCHER)
Ip = String.Format("224.10.{0}", Valid_GwID_and_RadioID);
Subscriber tmpsub = new Subscriber
{
DispatcherName = e2.CallerName,
SubscriberType = e2.SubsType,
Sc_id = 0,
Imei = e2.IMEI,
Gw_and_radioID = Valid_GwID_and_RadioID,
IP = Ip,
Favorite = false,
canMakeSipCalls = !e2.IP.Contains("224."),
SipID = e2.SubsType == SubscriberType.SUBSCRIBER ? ((Vehicle)MainForm2.vehicleHT[id]).sipID :
(
MainForm2.GroupCPSIDOnlyHashWithoutCategory.ContainsKey(e2.IMEI + Valid_GwID_and_RadioID) ?
MainForm2.GroupCPSIDOnlyHashWithoutCategory[e2.IMEI + Valid_GwID_and_RadioID].SipID :
-1
)
};
if (e2.Type_of_message == CallsForm.Cmd_type_callForm.Start_PTT) sendPTT(tmpsub, true);
else StopPTT(tmpsub);
}
};
//uniqueCallForm.Show();
callFormContainer[personalIP].Show();
}
RecivedData = true;
voltmpx = null;
if ((MainForm2.VehIMEIHash[sourceRadioID.ToString()] != null) && (((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]) != null))
{
foreach (Alarms obj in ((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists)
if (obj.type == rep_type.CALLRECIVE) voltmpx = obj;
if ((voltmpx != null) && (voltmpx.descript == ""))
((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists.Remove(voltmpx);
((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[sourceRadioID.ToString()]]).EventLists.Add(new Alarms(rep_type.CALLRECIVE, DateTime.Now, "", ""));
}
}
catch (Exception ex)
{
SM.Debug("Erorr adding 125:" + ex.ToString());
}
}
}
catch (Exception ex)
{
SM.Debug("Error on 125 with status 1 (begin call):" + ex.ToString());
}
//Startrecevied = true;
startReceivedDict[sourceRadioID] = true;
if (patchDictionary.ContainsKey("Gateway." + responseGW))
StartCallPatch("Gateway", "Gateway." + responseGW, responseGW);
}
else
{
try
{
//if (Startrecevied)
if (startReceivedDict[sourceRadioID] == true)
{
}
}
catch (Exception ex)
{
SM.Debug("Error on 125 with status 2 or 3 (end call or hang time):" + ex.ToString());
}
//Startrecevied = false;
startReceivedDict[sourceRadioID] = false;
if (callStatusVOL == 2)
{
//RecivedData = false;
RecivedData = MainForm2.PriorityIP != "";
//if (uniqueCallForm != null)
// uniqueCallForm.UpdateCallStatus(callStatusVOL);
if (callFormContainer.ContainsKey(PersonalIP))
{
if (callFormContainer[PersonalIP] != null)
callFormContainer[PersonalIP].UpdateCallStatus(callStatusVOL);
}
}
else if (callStatusVOL == 3)
{
RecivedData = false;
RecivedData = MainForm2.PriorityIP != "";
//if (uniqueCallForm != null)
//{
// uniqueCallForm.Close();
// uniqueCallForm = null;
// field_subscriber_making_the_call = null;
//}
if (callFormContainer.ContainsKey(PersonalIP))
{
if (callFormContainer[PersonalIP] != null)
{
if (callFormContainer[PersonalIP].RequestForClosing())
callFormContainer[PersonalIP] = null;
//RearrangeCallForm();
//field_subscriber_making_the_call = null;
}
}
if (patchDictionary.ContainsKey("Gateway." + responseGW))
{
if (runningPatches.Contains(responseGW))
EndCallPatch("Gateway", "Gateway." + responseGW, responseGW);
}
}
// if (tclose125 != null)
// tclose125.Dispose();
}
}
public volatile ArrayList WatchList = new ArrayList();
public volatile ArrayList ClearList = new ArrayList();
private volatile Boolean proces124 = false;
private volatile Boolean proces125 = false;
private volatile Boolean proces111or112or113 = false;
private volatile Boolean proces111or112or113FALSE = false;
private volatile Boolean proces121or122or123 = false;
private volatile Boolean proces101or102or103 = false;
private volatile Boolean procesReport = true;
private volatile Int32 Idproces = 0;
private volatile Int32 Limitsend = 0;
private volatile Int32 X = 0;
private volatile String volSTR = "";
public volatile transfer125 tmptransVOL = null;
long Computation(BackgroundWorker worker, DoWorkEventArgs e)
{
while (MainForm2.isRunning)
{
try
{
proces124 = false;
proces125 = false;
proces111or112or113 = false; proces111or112or113FALSE = false;
proces121or122or123 = false;
proces101or102or103 = false;
Idproces = 0;
lock (this)
{
X = 0;
while (X < WatchList.Count)
{
//SM.Debug("in comands " + myIP);
volSTR = (String)WatchList[X];
if (mainparent.Listcmd[volSTR] == null)
ClearList.Add(volSTR);
else
{
if (!((TimerAndResp)mainparent.Listcmd[volSTR]).wait)
{
if (((TimerAndResp)mainparent.Listcmd[volSTR]).Respose)
{
Int32 tmp = (Int32)((TimerAndResp)mainparent.Listcmd[volSTR]).intval * 1000 + ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID;
if (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 125)
{
tmp = 0 * 1000 + ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID;
tmptransVOL = new transfer125(((TimerAndResp)mainparent.Listcmd[volSTR]).callStatus, ((TimerAndResp)mainparent.Listcmd[volSTR]).callType, ((TimerAndResp)mainparent.Listcmd[volSTR]).GrpID, ((TimerAndResp)mainparent.Listcmd[volSTR]).intval);
tmptransVOL.gwID = ((TimerAndResp)mainparent.Listcmd[volSTR]).gwID;
tmptransVOL.radioGwID = ((TimerAndResp)mainparent.Listcmd[volSTR]).radioGwID;
proces125 = true;
}
//displayStat
if (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 124) { proces124 = true; Limitsend = 0; }
if ((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 120) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 124)) { proces121or122or123 = true; Limitsend = 0; }
procesReport = true;
if ((tmp > 2114) && (tmp < 2118))
{
if (tmp == 2115) Idproces = 111;
else if (tmp == 2116) Idproces = 112;
else Idproces = 113;
Limitsend++;
proces111or112or113FALSE = true;
procesReport = false;
}
if (procesReport)
{
if (!proces125)
worker.ReportProgress(tmp);
else
worker.ReportProgress(tmp, tmptransVOL);
}
}
else
{
if (((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 110) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 114)) || (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 104) || (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID == 161))
{
proces111or112or113 = true;
Idproces = ((TimerAndResp)mainparent.Listcmd[volSTR]).typeID;
}
if (((((TimerAndResp)mainparent.Listcmd[volSTR]).typeID > 100) && (((TimerAndResp)mainparent.Listcmd[volSTR]).typeID < 104)))
{
proces101or102or103 = true;
//Idproces = ((TimerAndResp)mainparent.Listcmd[obj]).typeID;
}
}
mainparent.Listcmd.Remove(volSTR);
ClearList.Add(volSTR);
/* if ((FirstChanle00) && !proces124)
{
worker.ReportProgress(1999);//sc_id =1 (fake) si comanda 999
isON = false;
FirstChanle00 = false;
}*/
}
}
X++;
}
}
foreach (String obj in ClearList)
WatchList.Remove(obj);
ClearList.Clear();
// ciudat remove 104 pentru care a venit 124
String tmpIdtoRemove = "";
if (proces124)
{
foreach (String obj in WatchList)
if (((TimerAndResp)mainparent.Listcmd[obj]).typeID == 104)
{
tmpIdtoRemove = obj;
break;
}
if (tmpIdtoRemove != "") WatchList.Remove(tmpIdtoRemove);
}
//SM.Debug("Value for proces121or122or123:" + proces121or122or123 + " and OUTBEFORE:"+OUTBEFORE);
//if ((proces121or122or123) && (OUTBEFORE)) callStopProcedure(true);
if (proces101or102or103) worker.ReportProgress(1115);
if (proces111or112or113 || proces111or112or113FALSE)
{
if (Limitsend < 6)
{
if (Idproces == 111)
{
if (proces111or112or113) ;//Stop_PTT(String.Format("224.20.{0}.1", MainForm2.userIDX));
else
{
WatchList.Add(mainparent.Send_delay(String.Format("#111#{0}#{1}#", selected_Subscriber.Gw_and_radioID, selected_Subscriber.IP), 3000, 111, 3000));
}
}
else if (Idproces == 112)
{
//prevent resending private excera doesn't have gateway
//if (MainForm2.radioType == RADIOTYPE.EXCERA)
// return 0;
String Totrans = "#112#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
if (proces111or112or113) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 112));
else WatchList.Add(mainparent.Send_delay(Totrans, 3000, 112, 3000));
}
else if (Idproces == 113)
{
//prevent resending private excera doesn't have gateway
//if (MainForm2.radioType == RADIOTYPE.EXCERA)
// return 0;
String Totrans = "#113#" + selected_Subscriber.Gw_and_radioID + "." + selected_Subscriber.Imei + "#" + "224.20." + MainForm2.userIDX + ".1" + "#";
if (proces111or112or113) WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 113));
else WatchList.Add(mainparent.Send_delay(Totrans, 3000, 113, 3000));
}
else if (Idproces == 161)
{
worker.ReportProgress(1998);//sc_id =1 (fake) si comanda 999
}
Limitsend++;
}
else //station come back to normal state
{
worker.ReportProgress(1999);//sc_id =1 (fake) si comanda 999
}
}
}
catch (Exception ex)
{
SM.Debug("Error on radio list" + ex.ToString());
}
Thread.Sleep(10);
if (MainForm2.ClosingApp)
{
SM.Debug("ComputMess Voice: CancellationPending in Radio: ");
e.Cancel = true;
return 1;
}
}
return 0;
}
#endregion
#region STYLE UI ELEMENTS
private void listSubscribers_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e)
{
if (e.VisualItem is IconListViewVisualItem)
{
//Utils.WriteLine("listSubscribers_VisualItemCreating");
e.VisualItem = new SubscriberVisualListItem();
((SubscriberVisualListItem)e.VisualItem).OnFavorite_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee)
{
Utils.WriteLine("Fav is " + ee.subscriber.DispatcherName + " | " + ee.isActive);
if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER)
{
// update isFavorite Value
if (MainForm2.VehIMEIHash.ContainsKey(ee.subscriber.Sc_id + ""))
(((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[ee.subscriber.Sc_id + ""]])).is_favorite = ee.isActive;
// add to hash the new value for isFavorite
VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.Sc_id + "", ee.isActive + "");
}
else
{
// add to hash the new value for isFavorite
//am pus variabila add pentru cazul in care am doua grupuri pe doua gatewayuri diferite cu acelasi imei
string add = ee.subscriber.SubscriberType == SubscriberType.GROUP ? ee.subscriber.Gw_and_radioID : "_" + ee.subscriber.DispatcherName;
VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.SubscriberType.ToString() + "_"
+ ee.subscriber.Imei + add + "", ee.isActive + "");
}
ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber);
if (item != null)
{
listViewSubscribers.BeginUpdate();
Subscriber sub = (item.DataBoundItem as Subscriber);
sub.Favorite = ee.isActive;
sub.NrOfUpdates++;
listViewSubscribers.EndUpdate();
}
//listFavorites.DataSource = subscribersList;
FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true);
listFavorites.FilterDescriptors.Remove("Favorite");
listFavorites.FilterDescriptors.Add(valueFilter);
};
((SubscriberVisualListItem)e.VisualItem).OnTextSend_Req += delegate (object s, SubscriberVisualListItem.TextSendEventArgs ee)
{
//Utils.WriteLine("Text is " + ee.subscriber.DispatcherName + " | " + ee.text);
//String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#";
//String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#" +
// MainForm2.userIDX + "#";
////((MainForm2)(this.Parent)).Send_UDP_cmd(Totrans, 0, 0);
//mainparent.Send_UDP_cmd(Totrans, 0, 0);
//mainparent.DisplayToast(MainForm2.returnLNGString("txtMsgTo") + " " + ee.subscriber.DispatcherName, string.Format(MainForm2.returnLNGString("msgHTML"), ee.text));
if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER)
parent.SendSmsOnMBus(ee.text, ee.subscriber.Sc_id, (int)DateTime.Now.ToUniversalTime().DateTo70Format());
else if (ee.subscriber.SubscriberType == SubscriberType.GROUP)
{
//Group grp = ((Group)MainForm2.TalkGroups[0]);
parent.SendSMSGroup(ee.text, ee.subscriber.Id, 0, ee.subscriber.DispatcherName);
}
};
((SubscriberVisualListItem)e.VisualItem).OnRemote_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee)
{
//Utils.WriteLine("Remote is " + ee.subscriber.DispatcherName + " | " + ee.isActive);
sendRemoteMOnitor(ee.subscriber);
mainparent.DisplayToast(MainForm2.returnLNGString("Remotemonitorfor") + " " + ee.subscriber.DispatcherName, MainForm2.returnLNGString("remoteMonitorHTML"));
};
}
}
private void listSubscribers_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e)
{
// write the gateway name to the topRight element
if (e.VisualItem is SubscriberVisualListItem && e.VisualItem.Data.DataBoundItem is Subscriber)
(e.VisualItem as SubscriberVisualListItem).topRightElement.Text = (e.VisualItem.Data.DataBoundItem as Subscriber).GatewayName;
//Utils.WriteLine("listSubscribers_VisualItemFormatting");
if (e.VisualItem.Selected)
{
e.VisualItem.DrawFill = true;
e.VisualItem.BackColor = MainForm2.GridSelectedRow;
e.VisualItem.NumberOfColors = 1;
}
else
e.VisualItem.DrawFill = false;
GroupDescriptor descriptor = null;
if ((descriptor = listViewSubscribers.GroupDescriptors[0]) != null)
{
if (descriptor.Expression.Contains("Online"))
{
BaseListViewGroupVisualItem groupItem = e.VisualItem as BaseListViewGroupVisualItem;
if (groupItem != null)
{
groupItem.Font = new Font("Segoe UI", 10f, FontStyle.Bold);
groupItem.ForeColor = Color.Black;
groupItem.Text = (groupItem.Data.Text.ToLower().Equals("true") ? "Online" : "Offline")
+ " [" + ((ListViewDataItemGroup)groupItem.Data).Items.Count + "]";
}
}
else if (descriptor.Expression.Contains("SubscriberTypeRegion"))
{
BaseListViewGroupVisualItem groupItem = e.VisualItem as BaseListViewGroupVisualItem;
if (groupItem != null)
{
groupItem.Font = new Font("Segoe UI", 10f, FontStyle.Bold);
groupItem.ForeColor = Color.Black;
groupItem.Text = (groupItem.Data.Text)
+ " [" + ((ListViewDataItemGroup)groupItem.Data).Items.Count + "]";
}
}
}
}
private void listFavorites_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e)
{
if (e.VisualItem is IconListViewVisualItem)
{
e.VisualItem = new SubscriberVisualListItem();
((SubscriberVisualListItem)e.VisualItem).OnFavorite_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee)
{
Utils.WriteLine("Fav is " + ee.subscriber.DispatcherName + " | " + ee.isActive);
if (ee.subscriber.SubscriberType == SubscriberType.SUBSCRIBER)
{
if (MainForm2.VehIMEIHash.ContainsKey(ee.subscriber.Imei + ""))
{
(((Vehicle)MainForm2.vehicleHT[(String)MainForm2.VehIMEIHash[ee.subscriber.Imei + ""]])).is_favorite = ee.isActive;
}
// add to hash the new value for isFavorite
VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.Sc_id + "", ee.isActive + "");
//????///VisualSettings.InsertUpdateHTforVisualItems("onMap", ee.subscriber.Sc_id + "", ee.isActive + "");
}
else
{
// add to hash the new value for isFavorite
//am pus variabila add pentru cazul in care am doua grupuri pe doua gatewayuri diferite cu acelasi imei
string add = ee.subscriber.SubscriberType == SubscriberType.GROUP ? ee.subscriber.Gw_and_radioID : "_" + ee.subscriber.DispatcherName;
VisualSettings.InsertUpdateHTforVisualItems("isFav", ee.subscriber.SubscriberType.ToString() + "_"
+ ee.subscriber.Imei + add + "", ee.isActive + "");
}
/*
ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber);
if (item != null)
{
Subscriber sub = (item.DataBoundItem as Subscriber);
sub.Favorite = ee.isActive;
sub.NrOfUpdates = sub.NrOfUpdates + 1;
}
*/
ListViewDataItem item = listViewSubscribers.Items.FirstOrDefault(d => d.DataBoundItem == ee.subscriber);
if (item != null)
{
listViewSubscribers.BeginUpdate();
Subscriber sub = (item.DataBoundItem as Subscriber);
sub.Favorite = ee.isActive;
sub.NrOfUpdates++;
listViewSubscribers.EndUpdate();
}
//listFavorites.DataSource = subscribersList;
FilterDescriptor valueFilter = new FilterDescriptor("Favorite", FilterOperator.IsEqualTo, (Boolean)true);
listFavorites.FilterDescriptors.Clear();
listFavorites.FilterDescriptors.Add(valueFilter);
};
((SubscriberVisualListItem)e.VisualItem).OnTextSend_Req += delegate (object s, SubscriberVisualListItem.TextSendEventArgs ee)
{
//Utils.WriteLine("Text is " + ee.subscriber.DispatcherName + " | " + ee.text);
//String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#";
//String Totrans = "#142#" + ee.subscriber.Gw_and_radioID + "." + ee.subscriber.Imei + "#" + ee.text + "#" + (int)DBmanager.DateTo70Format(DateTime.Now.ToUniversalTime()) + "#" +
// MainForm2.userIDX + "#";
////((MainForm2)(this.Parent)).Send_UDP_cmd(Totrans, 0, 0);
//mainparent.Send_UDP_cmd(Totrans, 0, 0);
//mainparent.DisplayToast(MainForm2.returnLNGString("txtMsgTo") + ee.subscriber.DispatcherName, string.Format(MainForm2.returnLNGString("msgHTML"), ee.text));
mainparent.SendSmsOnMBus(ee.text, ee.subscriber.Sc_id, (int)DateTime.Now.ToUniversalTime().DateTo70Format());
};
((SubscriberVisualListItem)e.VisualItem).OnRemote_Click += delegate (object s, SubscriberVisualListItem.ToggleClickEventArgs ee)
{
// Utils.WriteLine("Remote is " + ee.subscriber.DispatcherName + " | " + ee.isActive);
sendRemoteMOnitor(ee.subscriber);
mainparent.DisplayToast(MainForm2.returnLNGString("Remotemonitorfor") + " " + ee.subscriber.DispatcherName, MainForm2.returnLNGString("remoteMonitorHTML"));
};
}
}
private void listFavorites_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e)
{
// write the gateway name to the topRight element
if (e.VisualItem is SubscriberVisualListItem && e.VisualItem.Data.DataBoundItem is Subscriber)
(e.VisualItem as SubscriberVisualListItem).topRightElement.Text = (e.VisualItem.Data.DataBoundItem as Subscriber).GatewayName;
if (e.VisualItem.Selected)
{
e.VisualItem.DrawFill = true;
e.VisualItem.BackColor = MainForm2.GridSelectedRow;
e.VisualItem.NumberOfColors = 1;
}
else
e.VisualItem.DrawFill = false;
}
private void rlvGatewayStatus_VisualItemCreating(object sender, ListViewVisualItemCreatingEventArgs e)
{
if (e.VisualItem is IconListViewVisualItem)
{
e.VisualItem = new RadioGatewayStatusVisualItem();
}
}
private void rlvGatewayStatus_VisualItemFormatting(object sender, ListViewVisualItemEventArgs e)
{
if (e.VisualItem.Selected)
{
e.VisualItem.DrawFill = false;
e.VisualItem.BackColor = MainForm2.GridSelectedRow;
e.VisualItem.NumberOfColors = 1;
}
else
e.VisualItem.DrawFill = false;
}
#endregion
/// <summary>
/// Change fore color and background color for the export button when its state changes
/// </summary>
private void btRecordingsList_EnabledChanged(object sender, EventArgs e)
{
if (btRecordingsList.Enabled)
{
btRecordingsList.ButtonElement.ButtonFillElement.BackColor = Color.White;
btRecordingsList.ButtonElement.TextElement.ForeColor = MainForm2.ButtonColor;
}
else
{
btRecordingsList.ButtonElement.ButtonFillElement.BackColor = Color.WhiteSmoke;
btRecordingsList.ButtonElement.TextElement.ForeColor = Color.Gray;
}
}
/// <summary>
/// Handles the picture box click for simulating a checkbox and to
/// enable/disable other panels
/// </summary>
private Image themeUnit_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.filter_user_black, MainForm2.ButtonColor);
private Image themeCallType_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.filter_type_black, MainForm2.ButtonColor);
private Image theme24H_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.h_24h, MainForm2.ButtonColor);
private Image themePlay_Image = Utils.ChangeColor(Dispatcher.Properties.Resources.r_play, MainForm2.ButtonColor);
private void pbEnableDisable_Click(object sender, EventArgs e)
{
if ((PictureBox)sender == pbUnit)
{
if (pbUnit.Tag.Equals("disabled"))
{
pbUnit.Tag = "enabled";
pbUnit.Image = themeUnit_Image;
rcbUnit.Enabled = true;
ckUnit.Checked = true;
}
else
{
pbUnit.Tag = "disabled";
pbUnit.Image = Dispatcher.Properties.Resources.filter_user_grey;
rcbUnit.Enabled = false;
ckUnit.Checked = false;
}
// force the remove of the filters
rcbUnit_ItemCheckedChanged(rcbCallType, null);
}
else if ((PictureBox)sender == pbCallType)
{
if (pbCallType.Tag.Equals("disabled"))
{
pbCallType.Tag = "enabled";
pbCallType.Image = themeCallType_Image;
rcbCallType.Enabled = true;
ckCallType.Checked = true;
}
else
{
pbCallType.Tag = "disabled";
pbCallType.Image = Dispatcher.Properties.Resources.filter_type_grey;
rcbCallType.Enabled = false;
ckCallType.Checked = false;
}
// force the remove of the filters
rcbCallType_ItemCheckedChanged(rcbCallType, null);
}
else if ((PictureBox)sender == pb24H)
{
if (pb24H.Tag.Equals("enabled"))
{
pb24H.Tag = "disabled";
rdpEndTime.Enabled = true;
rdpStartTime.Enabled = true;
pb24H.Image = global::Dispatcher.Properties.Resources.h_24h_w;
}
else if (pb24H.Tag.Equals("disabled"))
{
pb24H.Tag = "enabled";
rdpEndTime.Enabled = false;
rdpStartTime.Enabled = false;
pb24H.Image = theme24H_Image;
}
// filter the grid for 24 hours or not
TimeFilter(pb24H.Tag.Equals("enabled"));
}
}
/// <summary>
/// filter recordings based on the selected units
/// </summary>
private void rcbUnit_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
{
// clear all units filters
gridRecordings.FilterDescriptors.Remove("From");
gridRecordings.FilterDescriptors.Remove("To");
// do not add filter if the filter is not active
if (!rcbUnit.Enabled)
{
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
return;
}
// add filters only if selected unit
if (rcbUnit.CheckedItems.Count > 0)
{
// Create a composite file descriptor with OR logic
List<String> selectedItems = new List<string>();
// for each selected unit add a custom filedescriptor
foreach (RadListDataItem item in rcbUnit.CheckedItems)
{
selectedItems.Add(item.Text.ToString());
}
// add filter
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
for (int i = 0; i < selectedItems.Count; i++)
{
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("From", FilterOperator.Contains, selectedItems[i]));
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("To", FilterOperator.Contains, selectedItems[i]));
}
statusDescriptor.LogicalOperator = FilterLogicalOperator.Or;
this.gridRecordings.FilterDescriptors.Add(statusDescriptor);
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
}
}
/// <summary>
/// filter recordings based on the selected call types
/// </summary>
private void rcbCallType_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
{
try
{
// clear all call types filters
gridRecordings.FilterDescriptors.Remove("CallTypeDirectionFilter");
// do not add filters if the picture box is inactive
if (!rcbCallType.Enabled)
{
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
return;
}
// add filters only if selected call type
if (rcbCallType.CheckedItems.Count > 0)
{
// Create a composite file descriptor with OR logic
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
statusDescriptor.LogicalOperator = FilterLogicalOperator.Or;
String[] types = new String[rcbCallType.CheckedItems.Count];
int i = 0;
// for each selected unit add a custom filedescriptor
foreach (RadListDataItem item in rcbCallType.CheckedItems)
{
types[i++] = item.Text;
//statusDescriptor.FilterDescriptors.Add();
}
// add filter
this.gridRecordings.FilterDescriptors.Add(new FilterDescriptor("CallTypeDirectionFilter", FilterOperator.IsContainedIn, types));
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
}
}
catch (Exception ex)
{
Utils.WriteLine("rcbCallType_ItemCheckedChanged : " + ex.ToString(),
ConsoleColor.Red);
}
}
private void btRecordingsList_Click(object sender, EventArgs e)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "Docx|*.docx";
sfd.Title = "Save all filtered recordings";
string dateTime = DateTime.Now.ToString();
dateTime = dateTime.Replace("/", "_");
dateTime = dateTime.Replace("\\", "_");
dateTime = dateTime.Replace(" ", "_");
dateTime = dateTime.Replace(":", ".");
sfd.FileName = String.Format(@"" + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile")
+ "_recordings_{0}.docx", dateTime);
DialogResult dr = sfd.ShowDialog();
// If the file name is not an empty string open it for saving.
if (dr == System.Windows.Forms.DialogResult.OK
|| dr == System.Windows.Forms.DialogResult.Yes)
{
// We will need a file name for our output file (change to suit your machine):
string fileNameTemplate = sfd.FileName + (sfd.FileName.EndsWith(".docx") ? "" : ".docx"); //@"Invoice_{0}-{1:MM_dd_yy_HH.mm.ss}.docx";
// Let's save the file with a meaningful name, including the applicant name and the letter date:
//System.IO.Directory.CreateDirectory("exports");
//string outputFileName = string.Format("exports/" + fileNameTemplate, cbCabinetWork.Text, DateTime.Now);
// Grab a reference to the desired template
var doc = Novacode.DocX.Load(@"resource\templates\export_recordings.docx");
doc.ReplaceText("%DATA%", String.Format("{0}", DateTime.Now.ToString()));
doc.ReplaceText("%COMPANY%", "Generated using " + (MainForm2.radioType == RADIOTYPE.SIMOCO ? "Simoco" : MainForm2.radioType == RADIOTYPE.EXCERA ? "Excera" : "SafeMobile")
+ " Dispatch");
#region Works
// get the empty template row
Novacode.Row emptyRow = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1];
FontFamily centuryGothic = null;
try
{
centuryGothic = new FontFamily("Century Gothic");
}
catch (Exception ex)
{
Utils.WriteLine(ex.ToString(), ConsoleColor.Red);
}
FontFamily font = new FontFamily("Arial");
if (centuryGothic != null)
font = centuryGothic;
int counter = 1;
//Utils.WriteLine(gridRecordings.ChildRows.Count + "");
foreach (GridViewRowInfo groupRow in gridRecordings.ChildRows)
{
if (groupRow.ChildRows.Count > 0)
{
foreach (GridViewRowInfo gridRow in groupRow.ChildRows)
{
Recording rec = gridRow.DataBoundItem as Recording;
// skip group headers and others UI elements withoug databound items
if (rec == null)
continue;
// add a new empty row and then edit it
doc.Tables[0].InsertRow(emptyRow);
// get the new inserted row which is empty
Novacode.Row row = doc.Tables[0].Rows[doc.Tables[0].RowCount - 1];
int column = 0;
row.Cells[column++].Paragraphs[0].Append(counter++ + "").FontSize(9).Font(font);
using (MemoryStream ms = new MemoryStream())
{
//write image to the memory stream
Utils.ScaleImage(rec.callTypeImage, 48, 48).Save(ms, System.Drawing.Imaging.ImageFormat.Png);
// go to the begining of the picture
ms.Seek(0, SeekOrigin.Begin);
Novacode.Image img = doc.AddImage(ms); // Create image.
Novacode.Picture pic1 = img.CreatePicture(); // Create picture.
row.Cells[column++].Paragraphs[0].AppendPicture(pic1);
}
row.Cells[column++].Paragraphs[0].Append(rec.username).FontSize(9).Font(font);
row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(0, 0, 255));
row.Cells[column - 1].Paragraphs[0].Bold();
row.Cells[column++].Paragraphs[0].Append(rec.From).FontSize(9).Font(font);
row.Cells[column++].Paragraphs[0].Append(rec.To).FontSize(9).Font(font);
row.Cells[column++].Paragraphs[0].Append(rec.DateTimeStart.ToString("dd.MM.yyyy HH:mm:ss")).FontSize(8).Font(font);
row.Cells[column++].Paragraphs[0].Append(rec.duration + " sec").FontSize(9).Font(font);
row.Cells[column - 1].Paragraphs[0].Color(Color.FromArgb(66, 66, 66));
}
}
}
// remove first row after the header because is an empty one
doc.Tables[0].RemoveRow(1);
#endregion
// Save as New filename:
doc.SaveAs(sfd.FileName);
// Open in word:
//Process.Start("WINWORD.EXE", "\"" + outputFileName + "\"");
mainparent.DisplayToast(MainForm2.returnLNGString("recExpSucces"),
string.Format(MainForm2.returnLNGString("RadioExportHTML"), fileNameTemplate, sfd.FileName));
}
}
private void LoadRecordingTimer_Tick(object sender, EventArgs e)
{
LoadRecordingTimer.Stop();
LoadRecordingTimer.Enabled = false;
}
private void LoadSubscriberTimer_Tick(object sender, EventArgs e)
{
LoadSubscriberTimer.Stop();
LoadSubscriberTimer.Enabled = false;
//listViewSubscribers.DataSource = null;
//Populate_subscriber_list();
//listSubscribers.DataSource = subscribersList;
}
private void listFavorites_SelectedItemChanged(object sender, EventArgs e)
{
}
#region AUDIO SETTINGS MIC & HEADSET
private NAudio.Wave.WaveIn waveIn = null;
private NAudio.Wave.WaveOut waveOut = null;
private Stream stream = Dispatcher.Properties.Resources.air;
private Boolean isPlaying = false;
private static MMDeviceEnumerator enumer = new MMDeviceEnumerator();
private MMDevice headsetDevice = null;
/// <summary>
/// Save the new REc Sound card into the Database
/// </summary>
private void InputSoundList_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
{
try
{
if (waveIn != null)
{
waveIn.StopRecording();
waveIn = null;
}
}
catch (NAudio.MmException ex)
{
Utils.WriteLine("InputSoundList_SelectedIndexChanged 1 Exception: " + ex.ToString(), ConsoleColor.Red);
}
try
{
waveIn = new NAudio.Wave.WaveIn();
waveIn.DeviceNumber = e.Position;
waveIn.DataAvailable += waveIn_DataAvailable;
int sampleRate = voicemanager_sampleRate; // 8 kHz
int channels = 1; // mono
waveIn.WaveFormat = new NAudio.Wave.WaveFormat(sampleRate, channels);
waveIn.StartRecording();
}
catch (NAudio.MmException ex)
{
Utils.WriteLine("InputSoundList_SelectedIndexChanged 2 Exception: " + ex.ToString(), ConsoleColor.Red);
}
}
/// <summary>
/// Evalute the sound received from the input device
/// </summary>
void waveIn_DataAvailable(object sender, NAudio.Wave.WaveInEventArgs e)
{
int count = 0;
float min = 0, max = 0;
for (int index = 0; index < e.BytesRecorded; index += 2)
{
short sample = (short)((e.Buffer[index + 1] << 8) |
e.Buffer[index + 0]);
float sample32 = sample / 32768f;
// initialize the min and max
if (index == 0)
{
min = sample32;
max = sample32;
}
if (max < sample32)
max = sample32;
if (min > sample32)
min = sample32;
float m = Math.Max(max, Math.Abs(min));
//if (count++ % 10 == 0)
// Console.WriteLine(m + " | " + Math.Log10(m));
//Console.WriteLine("Val: " + Math.Max(max, Math.Abs(min)) * 20);
if (count % 100 == 0)
{
if (m < 0.003)
m = 0.001f;
//rtbMicrophoneVolume.Value = (float)((Math.Log10(m) + 3) * 33);
rtbMicrophoneVolume.Value = (int)(Math.Max(max, Math.Abs(min)) * 100);
}
}
}
/// <summary>
/// Detach from previous mic that was listened in order to check it's levels
/// </summary>
private void InputSoundList_SelectedIndexChanging(object sender, Telerik.WinControls.UI.Data.PositionChangingCancelEventArgs e)
{
if (waveIn != null)
waveIn.DataAvailable -= waveIn_DataAvailable;
}
/// <summary>
/// I don't have where to call this
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if (waveIn != null)
{
waveIn.StopRecording();
waveIn = null;
}
}
/// <summary>
/// Save the new Play Sound card into the Database
/// </summary>
private void OutputSoundList_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e)
{
}
/// <summary>
/// Event listener for when the audio volume changes
/// </summary>
/// <param name="data"></param>
void AudioEndpointVolume_OnVolumeNotification(AudioVolumeNotificationData data)
{
try
{
// This shows data.MasterVolume, you can do whatever you want here
Utils.WriteLine("Volume level is : " + data.MasterVolume * 100f, ConsoleColor.Red);
//rtbSpeakersVolume.Value = data.MasterVolume * 100f;
}
catch (Exception e)
{
Utils.WriteLine("AudioEndpointVolume_OnVolumeNotification: " + e.ToString(), ConsoleColor.Red);
}
}
/// <summary>
/// Reset audio stream when the playback has finished
/// </summary>
void waveOut_PlaybackStopped(object sender, EventArgs e)
{
//Utils.WriteLine("Done playing");
stream.Position = 0;
pbPlayTestSound.Image = themePlay_Image;
isPlaying = false;
}
/// <summary>
/// Detach from previous sound output device in order to attach to another
/// </summary>
private void OutputSoundList_SelectedIndexChanging(object sender, Telerik.WinControls.UI.Data.PositionChangingCancelEventArgs e)
{
// close previous sounds
if (waveOut != null)
{
pbPlayTestSound.Image = themePlay_Image;
isPlaying = false;
waveOut.PlaybackStopped -= waveOut_PlaybackStopped;
waveOut.Pause();
waveOut.Stop();
waveOut = null;
stream.Position = 0;
}
//if (OutputSoundList.SelectedItem != null && OutputSoundList.SelectedItem.DataBoundItem != null)
//{
// KeyValuePair<Int16, Tuple<String, MMDevice>> dataBound =
// (KeyValuePair<Int16, Tuple<String, MMDevice>>)OutputSoundList.SelectedItem.DataBoundItem;
// OutputSoundList.Text = dataBound.Value.Item2.FriendlyName + " - " + dataBound.Value.Item2.DeviceFriendlyName;
//}
}
/// <summary>
/// Format the text which will be displayed inside the heasphone dropdown list
/// </summary>
private void OutputSoundList_VisualListItemFormatting(object sender, VisualItemFormattingEventArgs args)
{
//KeyValuePair<Int16, Tuple<String, MMDevice>> dataBound =
// (KeyValuePair<Int16, Tuple<String, MMDevice>>)args.VisualItem.Data.DataBoundItem;
//args.VisualItem.Text = dataBound.Value.Item2.FriendlyName + " - " + dataBound.Value.Item2.DeviceFriendlyName;
//args.VisualItem.Text = ((RadDropDownList)sender).SelectedItem.Text;
}
/// <summary>
/// Save the new audio configuration into the database and
/// reset it into radio tab
/// </summary>
private void rbApplyAudioConfiguration_Click(object sender, EventArgs e)
{
//KeyValuePair<Int16, Tuple<String, MMDevice>> dataBound =
// (KeyValuePair<Int16, Tuple<String, MMDevice>>)OutputSoundList.SelectedItem.DataBoundItem;
//smdbObj.SaveSoundCardinDB(0, dataBound.Value.Item1, InputSoundList.Text, "");
smdbObj.SaveSoundCardinDB(0, OutputSoundList.Text, InputSoundList.Text, "");
// set the new index values
selectedINDevice = InputSoundList.SelectedIndex;
//selectedOUTDevice = ((KeyValuePair<Int16, Tuple<String, MMDevice>>)OutputSoundList.SelectedItem.DataBoundItem).Key;
selectedOUTDevice = OutputSoundList.SelectedIndex;
StartnVoice();
mainparent.DisplayToast(MainForm2.returnLNGString("Audiosettingschangedsuccessfully"),
string.Format(MainForm2.returnLNGString("newAudioCfg"), InputSoundList.Text, OutputSoundList.Text));
}
/// <summary>
/// Play a sound on the selected configuration in order to test the current
/// selected audio device
/// </summary>
private void pbPlayTestSound_Click(object sender, EventArgs e)
{
try
{
if (!isPlaying)
{
pbPlayTestSound.Image = Dispatcher.Properties.Resources.r_play_blue;
// load the stream
NAudio.Wave.WaveFileReader waveReader = new NAudio.Wave.WaveFileReader(stream);
// create a new output device based on the selected device
waveOut = new NAudio.Wave.WaveOut();
//KeyValuePair<Int16, Tuple<String, MMDevice>> dataBound =
// (KeyValuePair<Int16, Tuple<String, MMDevice>>)OutputSoundList.SelectedItem.DataBoundItem;
//Utils.WriteLine("Playing on " + dataBound.Key + " device");
//waveOut.DeviceNumber = dataBound.Key;
Utils.WriteLine("Playing on " + OutputSoundList.SelectedItem.Text + " device");
waveOut.DeviceNumber = OutputSoundList.SelectedIndex;
// initialize the output device
waveOut.Init(waveReader);
// detech when the play had finished to reset the stream to 0
waveOut.PlaybackStopped += waveOut_PlaybackStopped;
// flag that playing
isPlaying = true;
// play sound
waveOut.Play();
}
}
catch (Exception ex)
{
Utils.WriteLine("Can't play sound : " + ex.ToString());
}
}
#endregion
#region STYLE GRID RECORDINGS
/// <summary>
/// Set the event listener for the play click
/// </summary>
private void gridRecordings_CellFormatting(object sender, Telerik.WinControls.UI.CellFormattingEventArgs e)
{
GridCellElement cellElement = e.CellElement;
GridViewDataColumn columnInfo = e.CellElement.ColumnInfo as GridViewDataColumn;
// do not draw border
cellElement.DrawBorder = false;
// do not highlight the cell on which was clicked
if (e.CellElement.IsCurrent)
e.CellElement.IsCurrent = false;
// set padding and force the content adding
if (cellElement is RecordingGridCellElement && columnInfo.Name == "recording")
{
cellElement.Padding = new Padding(0, 0, 0, 0);
//cellElement.SetContent();
// add click listener only if not added before
if ((cellElement.Tag != null && !cellElement.Tag.Equals("done")) || cellElement.Tag == null)
{
((RecordingGridCellElement)cellElement).OnPlay_Click += delegate (object s, RecordingGridCellElement.ToggleClickEventArgs ee)
{
// Utils.WriteLine("Fav is " + ee.recording.username + " | " + ee.isActive);
PlayFile(ee.recording.RecID, ee.recording.duration);
};
}
cellElement.Tag = "done";
}
}
/// <summary>
/// Prevent the opening of the context menu
/// </summary>
private void gridRecordings_ContextMenuOpening(object sender, ContextMenuOpeningEventArgs e)
{
e.Cancel = true;
}
/// <summary>
/// Set the type of data which will be displayed inside the grid
/// </summary>
private void gridRecordings_CreateCell(object sender, GridViewCreateCellEventArgs e)
{
// format live column
if (e.Row is GridDataRowElement)
{
// increase row height
//e.Row.RowInfo.Height = 53;
if (e.Column.Name.Equals("recording"))
{
e.CellType = typeof(RecordingGridColumn);
e.CellElement = new RecordingGridCellElement(e.Column, e.Row);
}
if (e.Column is GridViewIndentColumn)
{
e.Column.IsVisible = false;
/*
e.Column.MaxWidth = 7;
e.Column.MinWidth = 7;
e.Column.Width = 7;*/
//e.CellElement.Visibility = ElementVisibility.Hidden;
}
}
}
private void gridRecordings_CustomGrouping(object sender, GridViewCustomGroupingEventArgs e)
{
}
private void gridRecordings_GroupSummaryEvaluate(object sender, GroupSummaryEvaluationEventArgs e)
{
if (e.SummaryItem == null || e.Value == null)
return;
try
{
if (e.SummaryItem.Name.Equals("DateStart"))
{
if (((DateTime)e.Value).Year == DateTime.Now.Year)
e.FormatString = ((DateTime)e.Value).ToString("dd.MMMM");
else
e.FormatString = ((DateTime)e.Value).ToString("dd.MMMM.yyyy");
}
else if (e.SummaryItem.Name.Equals("callType"))
{
e.FormatString = e.Value.ToString().Replace('_', ' ');
}
else if (e.SummaryItem.Name.Equals("Initial"))
{
e.FormatString = e.Value.ToString().ToUpper();
}
else if (e.SummaryItem.Name.Equals("callDirection"))
{
e.FormatString = e.Value.ToString();
}
}
catch (Exception ex)
{
Utils.WriteLine("gridRecordings_GroupSummaryEvaluate: " + ex.ToString(), ConsoleColor.Red);
}
}
#endregion
#region FILTERS
/// <summary>
/// Intercept date time change in order to filter the recordings grid
/// </summary>
private void TimeFilter_ValueChanged(object sender, EventArgs e)
{
TimeFilter(false);
}
/// <summary>
/// Filter recordings grid for displaying the last 24 hours
/// or the selected interval from the date time
/// </summary>
/// <param name="is24Hours">Boolean telling if the last 24 hours
/// are needed</param>
private void TimeFilter(bool is24Hours)
{
// clear all units filters
gridRecordings.FilterDescriptors.Remove("DateTimeStart");
gridRecordings.FilterDescriptors.Remove("DateTimeEnd");
// Create a composite file descriptor with AND logic
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
statusDescriptor.LogicalOperator = FilterLogicalOperator.And;
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("DateTimeStart", FilterOperator.IsGreaterThan,
pb24H.Tag.Equals("enabled") ? (DateTime.Now).AddDays(-1) : rdpStartTime.Value));
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("DateTimeEnd", FilterOperator.IsLessThan,
pb24H.Tag.Equals("enabled") ? DateTime.Now : rdpEndTime.Value));
// add filter
this.gridRecordings.FilterDescriptors.Add(statusDescriptor);
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
}
/// <summary>
/// Format the rows to display alternate colors
/// </summary>
private void gridRecordings_RowFormatting(object sender, RowFormattingEventArgs e)
{
e.RowElement.DrawFill = true;
e.RowElement.NumberOfColors = 1;
if (e.RowElement.IsSelected)
e.RowElement.BackColor = MainForm2.GridSelectedRow;
else
e.RowElement.BackColor = (e.RowElement.RowInfo.Index % 2 == 0 ? Color.White : MainForm2.GridAlternateRow);
}
/// <summary>
/// Invalidate selected row in order for the play button to be placed
/// on the grid
/// </summary>
private void gridRecordings_CurrentRowChanged(object sender, CurrentRowChangedEventArgs e)
{
if (e.CurrentRow == null)
return;
e.CurrentRow.InvalidateRow();
}
/// <summary>
/// Scroll to first row after the filtering is done
/// </summary>
private void gridRecordings_FilterChanged(object sender, GridViewCollectionChangedEventArgs e)
{
if (gridRecordings.Rows.Count > 0)
{
gridRecordings.Rows[0].IsSelected = true;
gridRecordings.Rows[0].IsCurrent = true;
gridRecordings.CurrentRow = gridRecordings.Rows[0];
gridRecordings.TableElement.ScrollToRow(gridRecordings.CurrentRow);
}
}
/// <summary>
/// Display the tooltip when the mouse enters over the
/// picture box
/// </summary>
private void pbFilter_MouseEnter(object sender, EventArgs e)
{
PictureBox pbSender = (PictureBox)sender;
String toolTipTitle = "";
String toolTipText = "";
if (pbSender == pbFilterTime)
{
toolTipTitle = MainForm2.returnLNGString("Recordingtimegrouping");
toolTipText = MainForm2.returnLNGString("RecordingtimegroupingDET");
}
else if (pbSender == pbFilterDirection)
{
toolTipTitle = MainForm2.returnLNGString("Recordingdirectiongrouping");
toolTipText = MainForm2.returnLNGString("RecordingdirectiongroupingDET");
}
else if (pbSender == pbFilterType)
{
toolTipTitle = MainForm2.returnLNGString("Recordingcalltypegrouping");
toolTipText = MainForm2.returnLNGString("RecordingcalltypegroupingDET");
}
else if (pbSender == pbFilterUser)
{
toolTipTitle = MainForm2.returnLNGString("Recordinguserinitialsgrouping");
toolTipText = MainForm2.returnLNGString("RecordinguserinitialsgroupingDET");
}
else if (pbSender == pb24H)
{
toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbytime");
toolTipText = MainForm2.returnLNGString("FilterrecordingsbytimeDET");
}
else if (pbSender == pbCallType)
{
toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbycalltype");
toolTipText = MainForm2.returnLNGString("FilterrecordingsbycalltypeDET");
}
else if (pbSender == pbUnit)
{
toolTipTitle = MainForm2.returnLNGString("Filterrecordingsbyuser");
toolTipText = MainForm2.returnLNGString("FilterrecordingsbyuserDET");
}
toolTipHelp.ToolTipTitle = toolTipTitle + ": " + (pbSender.Tag.Equals("enabled") ? MainForm2.returnLNGString("active") : MainForm2.returnLNGString("inactive"));
toolTipHelp.Show(
String.Format(toolTipText), pbSender, 150000);
}
/// <summary>
/// Hide the tooltip when the mouse exits the picture box
/// </summary>
private void pbFilter_MouseLeave(object sender, EventArgs e)
{
toolTipHelp.Hide((PictureBox)sender);
}
/// <summary>
/// Display a message inside the recordings grid based on its state
/// If the list of recordings has no visible row, but has rows, a message
/// telling that the current configuration of filters has no recordings
/// </summary>
private void DisplayEmptyMessageOnRecordingsGrid()
{
// display a message for when the table elements are empty
if (gridRecordings.ChildRows.Count > 0)
gridRecordings.TableElement.Text = "";
// recordings exists but outside the filters
else if (gridRecordings.ChildRows.Count == 0 && gridRecordings.Rows.Count > 0)
{
gridRecordings.TableElement.Text = MainForm2.returnLNGString("norecordstoshow");
}
// no recordings at all
else
gridRecordings.TableElement.Text = MainForm2.returnLNGString("listOfRecordings");
}
#endregion
private void listBoxRadioGateways_ItemDataBound(object sender, ListItemDataBoundEventArgs args)
{
RadioGateway view = (RadioGateway)args.NewItem.DataBoundItem;
args.NewItem.Text = "<html>" +
"<b>" + view.Name + "</b>" +
"<br>" + "<i>" +
" " + view.TypeDesc + "</i>";
args.NewItem.Image = global::Dispatcher.Properties.Resources.red_status;
}
private void listBoxRadioGateways_CreatingVisualListItem(object sender, CreatingVisualListItemEventArgs args)
{
RadListVisualItem visualItem = new RadListVisualItem();
visualItem.Padding = new Padding(5, 5, 0, 5);
args.VisualItem = visualItem;
}
private void timer1_Tick(object sender, EventArgs e)
{
lbCurrentDateTime.Text = DateTime.Now.ToString(CultureInfo.CurrentCulture.DateTimeFormat.ShortTimePattern);
}
private void RearrangeCallForm()
{
//CallsForm.position = 0;
//foreach (KeyValuePair<string, CallsForm> callForm in callFormContainer)
//{
// if (callForm.Value != null)
// {
// callForm.Value.Location = new Point(Screen.PrimaryScreen.Bounds.X + 93, //should be (0,0)
// Screen.PrimaryScreen.Bounds.Y + CallsForm.position);
// callForm.Value.TopMost = true;
// callForm.Value.StartPosition = FormStartPosition.Manual;
// CallsForm.position += 93;
// }
//}
}
private void GetAvailablePosition()
{
List<string> positionList = new List<string>();
int deviation = 310; // 304 latimea butonului de ptt deci 310 sa nu il imbarlige
CallsForm.positionX = 0;
CallsForm.positionY = 0;
foreach (KeyValuePair<string, CallsForm> callForm in callFormContainer)
{
if (callForm.Value != null)
{
positionList.Add(string.Format("({0},{1})", callForm.Value.Location.Y, callForm.Value.Location.X));
}
}
for (int j = 0; j <= this.Width / 350; j++)
{
for (int i = 0; i <= this.Height / 94; i++)
{
int pointY = i * 94;
int pointX = j * 350 + deviation;
string point = string.Format("({0},{1})", pointY, pointX);
if (!positionList.Contains(point))
{
CallsForm.positionY = pointY;
CallsForm.positionX = pointX;
return;
}
}
}
}
private class Gatewaymulticast
{
private string gatewayIp = "";
private UdpMulticast udp4Voice2;
private RadioTab parent;
public Gatewaymulticast(string GatewayIp, int voicePort, RadioTab parent)
{
gatewayIp = GatewayIp;
this.parent = parent;
udp4Voice2 = new UdpMulticast(gatewayIp, voicePort);
udp4Voice2.OnNewDataRecv += Udp4Voice2_OnNewDataRecv;
udp4Voice2.StartListen(MainForm2.cfg.LocalIP);
}
private void Udp4Voice2_OnNewDataRecv(byte[] data, int dataLen)
{
try
{
//Console.WriteLine("Recived AudioData RecivedData:" + RecivedData + " dataLen:" + dataLen);
if ((parent.RecivedData) && (dataLen > 30))//&& (VoiceON)
{
//int activeCount = ShapeNew.receiving_hash.Count;
//if (MainForm2.PriorityIP.Length == 0) MainForm2.PriorityIP = gatewayIp;
if (MainForm2.PriorityIP.CompareTo(gatewayIp) == 0)
{
if (parent.buffWaveProvider != null)
parent.buffWaveProvider.AddSamples(data, 0, dataLen);
//nVOice.PlaySound(data, dataLen);
}
}
}
catch (Exception ex)
{
SM.Debug("Error on put data: " + ex.ToString());
}
}
}
#region call patching
private void gvPatch_ValueChanged(object sender, EventArgs e)
{
if (((GridVirtualizedCellElement)(((RadDropDownListEditor)sender).OwnerElement)).Data.HeaderText != "Type")
return;
if (((RadDropDownListEditor)sender).Value.ToString() == "Dispatcher")
{
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = dispatchers;
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "UserName";
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = dispatchers;
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "UserName";
}
if (((RadDropDownListEditor)sender).Value.ToString() == "Gateway")
{
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = radiogateways;
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "Name";
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = radiogateways;
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "Name";
}
}
private void gvPatch_CurrentRowChanged(object sender, CurrentRowChangedEventArgs e)
{
try
{
if (gvPatch == null)
return;
if (gvPatch.CurrentRow.Cells["type"].Value == null)
return;
if (gvPatch.CurrentRow.Cells["type"].Value.ToString() == "Dispatcher")
{
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = dispatchers;
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "UserName";
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = dispatchers;
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "UserName";
}
if (gvPatch.CurrentRow.Cells["type"].Value.ToString() == "Gateway")
{
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DataSource = radiogateways;
((GridViewComboBoxColumn)gvPatch.Columns["incoming"]).DisplayMember = "Name";
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DataSource = radiogateways;
((GridViewComboBoxColumn)gvPatch.Columns["outgoing"]).DisplayMember = "Name";
}
}
catch(Exception ex) { Utils.WriteLine(ex.ToString(), ConsoleColor.Red); }
}
private void gvPatch_UserAddingRow(object sender, GridViewRowCancelEventArgs e)
{
try
{
if ((gvPatch.CurrentRow.Cells["incoming"]).Value == null || (gvPatch.CurrentRow.Cells["outgoing"]).Value == null)
{
e.Rows[0].ErrorText = MainForm2.returnLNGString("incOutNotNull");
e.Cancel = true;
return;
}
//check if incoming = outgoing or if this row is already added
string type = (gvPatch.CurrentRow.Cells["type"]).Value.ToString();
string incoming = (gvPatch.CurrentRow.Cells["incoming"]).Value.ToString();
string outgoing = (gvPatch.CurrentRow.Cells["outgoing"]).Value.ToString();
string incomingId = "";
string outgoingId = "";
int tip = 0;
if (type == "Dispatcher")
{
incomingId = dispatchers.First(s => s.UserName == incoming).Id.ToString();
outgoingId = dispatchers.First(s => s.UserName == outgoing).Id.ToString();
tip = 0;
}
else if (type == "Gateway")
{
RadioGateway incomingGW = radiogateways.First(s => s.Name == incoming);
RadioGateway outgoingGW = radiogateways.First(s => s.Name == outgoing);
incomingId = incomingGW.Gw_id + "." + incomingGW.Id;
outgoingId = outgoingGW.Gw_id + "." + outgoingGW.Id;
tip = 1;
}
else
{
e.Cancel = true;
return;
}
string concat = type + incoming + outgoing;
if (incoming == outgoing)
{
e.Rows[0].ErrorText = MainForm2.returnLNGString("incOutEqError");
e.Cancel = true;
return;
}
if (patchList.Contains(concat))
{
e.Rows[0].ErrorText = MainForm2.returnLNGString("callPatchAlready");
e.Cancel = true;
return;
}
string key = type + "." + incomingId;
if (!patchDictionary.ContainsKey(key))
{
patchDictionary.Add(key, new List<string>());
}
if (patchDictionary.ContainsKey(key))
{
if (!patchDictionary[key].Contains(outgoingId))
patchDictionary[key].Add(outgoingId);
}
//updatePatchStatus(incoming, true);
updatePatchStatus(outgoing, true, type);
patchList.Add(concat);
//send data to message bus
string Totrans = "#510#" + tip + "#" + incomingId + "#" + incoming + "#" + outgoingId + "#" + outgoing + "#" + MainForm2.userIDX;
parent.Send_UDP_cmd(Totrans, 0, 0);
e.Rows[0].ErrorText = string.Empty;
}
catch(Exception ex)
{
e.Rows[0].ErrorText = ex.Message.ToString();
e.Cancel = true;
}
}
private void gvPatch_UserDeletingRow(object sender, GridViewRowCancelEventArgs e)
{
try
{
string type = (gvPatch.CurrentRow.Cells["type"]).Value.ToString();
string incoming = (gvPatch.CurrentRow.Cells["incoming"]).Value.ToString();
string outgoing = (gvPatch.CurrentRow.Cells["outgoing"]).Value.ToString();
string incomingId = "";
string outgoingId = "";
int tip = 0;
if (type == "Dispatcher")
{
incomingId = dispatchers.First(s => s.UserName == incoming).Id.ToString();
outgoingId = dispatchers.First(s => s.UserName == outgoing).Id.ToString();
tip = 0;
}
if (type == "Gateway")
{
RadioGateway incomingGW = radiogateways.First(s => s.Name == incoming);
RadioGateway outgoingGW = radiogateways.First(s => s.Name == outgoing);
incomingId = incomingGW.Gw_id + "." + incomingGW.Id;
outgoingId = outgoingGW.Gw_id + "." + outgoingGW.Id;
tip = 1;
}
string concat = type + incoming + outgoing;
string key = type + "." + incomingId;
//updatePatchStatus(incoming, false);
updatePatchStatus(outgoing, false, type);
if (patchList.Contains(concat))
patchList.Remove(concat);
if (patchDictionary.ContainsKey(key))
{
if (patchDictionary[key].Contains(outgoingId))
patchDictionary[key].Remove(outgoingId);
if (patchDictionary[key].Count == 0)
patchDictionary.Remove(key);
//send data to message bus
string Totrans = "#511#" + tip + "#" + incomingId + "#" + incoming + "#" + outgoingId + "#" + outgoing + "#" + MainForm2.userIDX;
parent.Send_UDP_cmd(Totrans, 0, 0);
}
}
catch(Exception ex)
{
Utils.WriteLine("Error on deleting call patch from gridview", ConsoleColor.Red);
}
}
internal void StartCallPatch(string type, string key, string from)
{
Utils.WriteLine("Start call patch", ConsoleColor.Green);
runningPatches.Add(from);
pttIsPressed = false;
if (!patchDictionary.ContainsKey(key))
return;
string Totrans = string.Empty;
foreach (string patch in patchDictionary[key])
{
if (type == "Dispatcher")
{
Totrans = String.Format("#201#{0}#{1}#", patch, "224.20." + from + ".1#1");
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 10000, 201));
mainparent.Send_UDP_cmd(Totrans, 10000, 201, from);
}
if (type == "Gateway")
{
Totrans = String.Format("#101#{0}#{1}#", patch, "224.10." + from + "#1");
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 10000, 101));
mainparent.Send_UDP_cmd(Totrans, 10000, 101);
//if (MainForm2.radioGwHT.ContainsKey(patch))
//{
// ((RadioGateway)MainForm2.radioGwHT[patch]).InPatch = true;
// Utils.WriteLine($"Start call patch on {patch} - {((RadioGateway)MainForm2.radioGwHT[patch]).Name}", ConsoleColor.Green);
//}
//if (MainForm2.radioGwHT.ContainsKey(from))
//{
// ((RadioGateway)MainForm2.radioGwHT[from]).InPatch = true;
// Utils.WriteLine($"Start call patch on {from} - {((RadioGateway)MainForm2.radioGwHT[from]).Name}", ConsoleColor.Green);
//}
}
}
}
private void updatePatchStatus(string patch, bool value, string type)
{
if (type == "Dispatcher") //0 -> dispatcher, 1 -> gateway
return;
if (type == "0")
return;
if (!rgwHTByName.ContainsKey(patch))
return;
string key = ((RadioGateway)rgwHTByName[patch]).Gw_id + "." + ((RadioGateway)rgwHTByName[patch]).Id;
if (MainForm2.radioGwHT.ContainsKey(key))
{
((RadioGateway)MainForm2.radioGwHT[key]).InPatch = value;
}
}
private void EndCallPatch(string type, string key, string from)
{
Utils.WriteLine("End call patch", ConsoleColor.Green);
pttIsPressed = false;
runningPatches.RemoveAll(x => x == from);
if (!patchDictionary.ContainsKey(key))
return;
string Totrans = string.Empty;
foreach (string patch in patchDictionary[key])
{
if (type == "Dispatcher")
{
Totrans = String.Format("#211#{0}#{1}#", patch, "224.20." + from + ".1#1");//selected_Subscriber.IP
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 211));
mainparent.Send_UDP_cmd(Totrans, 3000, 211, from);
}
if (type == "Gateway")
{
Totrans = String.Format("#111#{0}#{1}#", patch, "224.10." + from + "#1");
//WatchList.Add(mainparent.Send_UDP_cmd(Totrans, 3000, 111));
mainparent.Send_UDP_cmd(Totrans, 3000, 111);
//if (MainForm2.radioGwHT.ContainsKey(patch))
//{
// ((RadioGateway)MainForm2.radioGwHT[patch]).InPatch = false;
// Utils.WriteLine($"Stop call patch on {patch} - {((RadioGateway)MainForm2.radioGwHT[patch]).Name}", ConsoleColor.Red);
//}
//if (MainForm2.radioGwHT.ContainsKey(from))
//{
// ((RadioGateway)MainForm2.radioGwHT[from]).InPatch = false;
// Utils.WriteLine($"Stop call patch on {from} - {((RadioGateway)MainForm2.radioGwHT[from]).Name}", ConsoleColor.Red);
//}
}
}
this.Invoke((MethodInvoker)delegate
{
pbSpectrum.Image = Dispatcher.Properties.Resources.r_radial_spectrum_00;
});
}
internal void UpdateCallPatchGridViewInfo(int type, Patch patch)
{
string tip, concat, key;
tip = patch.Type == "0" ? "Dispatcher" : "Gateway";
concat = tip + patch.Incoming + patch.Outgoing;
key = tip + "." + patch.IncomingId;
this.Invoke((Action)(() => {
switch (type)
{
case 510:
if (!patchDictionary.ContainsKey(key))
{
patchDictionary.Add(key, new List<string>());
}
if (patchDictionary.ContainsKey(key))
{
if (!patchDictionary[key].Contains(patch.OutgoingId))
patchDictionary[key].Add(patch.OutgoingId);
}
//updatePatchStatus(patch.Incoming, true);
updatePatchStatus(patch.Outgoing, true, patch.Type);
patchList.Add(concat);
dbPatches.Add(patch);
gvPatch.Rows.Add(tip, patch.Incoming, patch.Outgoing);
break;
case 511:
patchList.Remove(concat);
if (patchDictionary.ContainsKey(key))
{
if (patchDictionary[key].Contains(patch.OutgoingId))
patchDictionary[key].Remove(patch.OutgoingId);
if (patchDictionary[key].Count == 0)
patchDictionary.Remove(key);
//updatePatchStatus(patch.Incoming, false);
updatePatchStatus(patch.Outgoing, false, patch.Type);
}
foreach (var row in gvPatch.Rows)
{
if ((row.Cells["incoming"]).Value.ToString() == patch.Incoming && (row.Cells["outgoing"]).Value.ToString() == patch.Outgoing)
{
gvPatch.Rows.Remove(row);
return;
}
}
break;
}
}));
}
#endregion
/// <summary>
/// Intercept when the selected gateway is changed in order to filter the list subscribers and list favorites
/// </summary>
private void rcbddGateways_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
{
//Utils.WriteLine("rcbddGateways_ItemCheckedChanged", ConsoleColor.DarkCyan);
// clear all statuses filters
listViewSubscribers.FilterDescriptors.Remove("GatewayName");
// add filters only if selected event types
if (rcbddGateways.CheckedItems.Count > 0)
{
// Create a composite file descriptor with OR logic
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
statusDescriptor.LogicalOperator = FilterLogicalOperator.Or;
// for each selected status add a custom filedescroptor
foreach (RadCheckedListDataItem item in rcbddGateways.CheckedItems)
{
RadioGateway radioGw = item.DataBoundItem as RadioGateway;
if (radioGw == null)
continue;
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("GatewayName", FilterOperator.IsEqualTo, radioGw.Name)); //radioGw.Gw_id + "." + radioGw.Id));
}
// add filter
this.listViewSubscribers.FilterDescriptors.Add(statusDescriptor);
}
// clear all statuses filters
listFavorites.FilterDescriptors.Remove("GatewayName");
// add filters only if selected event types
if (rcbddGateways.CheckedItems.Count > 0)
{
// Create a composite file descriptor with OR logic
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
statusDescriptor.LogicalOperator = FilterLogicalOperator.Or;
// for each selected status add a custom filedescroptor
foreach (RadCheckedListDataItem item in rcbddGateways.CheckedItems)
{
RadioGateway radioGw = item.DataBoundItem as RadioGateway;
if (radioGw == null)
continue;
statusDescriptor.FilterDescriptors.Add(new FilterDescriptor("GatewayName", FilterOperator.IsEqualTo, radioGw.Name)); //radioGw.Gw_id + "." + radioGw.Id));
}
// add filter
this.listFavorites.FilterDescriptors.Add(statusDescriptor);
}
}
private void rcddlRecordingsGateways_ItemCheckedChanged(object sender, RadCheckedListDataItemEventArgs e)
{
try
{
// clear all call types filters
gridRecordings.FilterDescriptors.Remove("Gw_and_radioID");
// add filters only if selected call type
if (rcddlRecordingsGateways.CheckedItems.Count > 0)
{
// Create a composite file descriptor with OR logic
CompositeFilterDescriptor statusDescriptor = new CompositeFilterDescriptor();
statusDescriptor.LogicalOperator = FilterLogicalOperator.Or;
String[] types = new String[rcddlRecordingsGateways.CheckedItems.Count];
int i = 0;
// for each selected unit add a custom filedescriptor
foreach (RadListDataItem item in rcddlRecordingsGateways.CheckedItems)
{
RadioGateway radioGw = item.DataBoundItem as RadioGateway;
types[i++] = radioGw.Gw_id + "." + radioGw.Id;
//statusDescriptor.FilterDescriptors.Add();
}
// add filter
this.gridRecordings.FilterDescriptors.Add(new FilterDescriptor("Gw_and_radioID", FilterOperator.IsContainedIn, types));
// display/hide the empty message
DisplayEmptyMessageOnRecordingsGrid();
}
}
catch (Exception ex)
{
Utils.WriteLine("rcddlRecordingsGateways_ItemCheckedChanged : " + ex.ToString(),
ConsoleColor.Red);
}
}
}
}