diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml b/Correlator/UserControlPage/AuditionUserControl.xaml index af6bf8d..2a4fdee 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml +++ b/Correlator/UserControlPage/AuditionUserControl.xaml @@ -131,10 +131,11 @@ @@ -179,11 +180,11 @@ diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml b/Correlator/UserControlPage/AuditionUserControl.xaml index af6bf8d..2a4fdee 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml +++ b/Correlator/UserControlPage/AuditionUserControl.xaml @@ -131,10 +131,11 @@ @@ -179,11 +180,11 @@ diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml.cs b/Correlator/UserControlPage/AuditionUserControl.xaml.cs index a7c8c78..c8552ac 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml.cs +++ b/Correlator/UserControlPage/AuditionUserControl.xaml.cs @@ -1,7 +1,12 @@ -using System.Windows; +using System.Threading; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; +using Correlator.SensorHubTag; +using Correlator.Util; +using HandyControl.Controls; +using MessageBox = HandyControl.Controls.MessageBox; namespace Correlator.UserControlPage { @@ -79,5 +84,84 @@ BottomHorizontalLineGrid.Children.Add(shorterScale); } } + + private void SensorACheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorACheckBox.IsChecked == false || SensorACheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + } + else + { + if (SensorBCheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + SensorBCheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev1); + } + } + + private void SensorBCheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorBCheckBox.IsChecked == false || SensorBCheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + } + else + { + if (SensorACheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + SensorACheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev2); + } + } + + private void SendSoundCollectCmd(object devCode) + { + //音频输出 + // PlayWav.Instance.InitWaveOut(); + + //停止状态采集指令的发送 + FlowStatus.CanGetSignal = false; + Thread.Sleep(3000); + SenderClass.SendSoundCollectCmd(SerialPortManager.Instance.SerialPort, devCode as string); + Growl.Success(DevCode.Dev1.Equals(devCode as string) ? "设备1发送听音指令" : "设备2发送听音指令"); + FlowStatus.IsListening = true; + // Thread.Sleep(2000); + + new Thread(ListeningTimer) { IsBackground = true }.Start(); + } + + private void ListeningTimer() + { + while (FlowStatus.IsListening) + { + Thread.Sleep(1000); + if (++FlowStatus.ElapseTime >= 15) + { + MessageBox.Show("接收不到数据,请重启软件", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Information); + break; + } + } + + FlowStatus.ElapseTime = 0; + } } } \ No newline at end of file diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml b/Correlator/UserControlPage/AuditionUserControl.xaml index af6bf8d..2a4fdee 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml +++ b/Correlator/UserControlPage/AuditionUserControl.xaml @@ -131,10 +131,11 @@ @@ -179,11 +180,11 @@ diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml.cs b/Correlator/UserControlPage/AuditionUserControl.xaml.cs index a7c8c78..c8552ac 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml.cs +++ b/Correlator/UserControlPage/AuditionUserControl.xaml.cs @@ -1,7 +1,12 @@ -using System.Windows; +using System.Threading; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; +using Correlator.SensorHubTag; +using Correlator.Util; +using HandyControl.Controls; +using MessageBox = HandyControl.Controls.MessageBox; namespace Correlator.UserControlPage { @@ -79,5 +84,84 @@ BottomHorizontalLineGrid.Children.Add(shorterScale); } } + + private void SensorACheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorACheckBox.IsChecked == false || SensorACheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + } + else + { + if (SensorBCheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + SensorBCheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev1); + } + } + + private void SensorBCheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorBCheckBox.IsChecked == false || SensorBCheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + } + else + { + if (SensorACheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + SensorACheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev2); + } + } + + private void SendSoundCollectCmd(object devCode) + { + //音频输出 + // PlayWav.Instance.InitWaveOut(); + + //停止状态采集指令的发送 + FlowStatus.CanGetSignal = false; + Thread.Sleep(3000); + SenderClass.SendSoundCollectCmd(SerialPortManager.Instance.SerialPort, devCode as string); + Growl.Success(DevCode.Dev1.Equals(devCode as string) ? "设备1发送听音指令" : "设备2发送听音指令"); + FlowStatus.IsListening = true; + // Thread.Sleep(2000); + + new Thread(ListeningTimer) { IsBackground = true }.Start(); + } + + private void ListeningTimer() + { + while (FlowStatus.IsListening) + { + Thread.Sleep(1000); + if (++FlowStatus.ElapseTime >= 15) + { + MessageBox.Show("接收不到数据,请重启软件", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Information); + break; + } + } + + FlowStatus.ElapseTime = 0; + } } } \ No newline at end of file diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index a3e8825..de282b1 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -11,7 +11,7 @@ private WaveFormat _mFormat; //private WaveOutStream m_AudioStream; - + private bool isPlaying; private WaveOutStream _waveOutStream; #region 单例 @@ -26,12 +26,15 @@ #endregion + private int _index; + public void InitWaveOut() { + Stop(); try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerate.txt"); + var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); _mFormat = ws.Format; _waveOutStream = ws; } @@ -43,7 +46,8 @@ if (_waveOutStream == null) return; _waveOutStream.Position = 0; - _mPlayer = new WaveOut(-1, _mFormat, _mFormat.nAvgBytesPerSec, 20, new BufferFillEventHandler(Filler)); + _mPlayer = new WaveOut(-1, _mFormat, _mFormat.nAvgBytesPerSec, 20, Filler); + isPlaying = true; } public void Stop() @@ -78,15 +82,16 @@ public void Listen(byte[] bytesData) { + var totalReceivedBytesNum = 0; var receiveBytesNum = bytesData.Length; if (_waveOutStream == null) return; lock (this) { _waveOutStream.Write(bytesData, 0, receiveBytesNum); + totalReceivedBytesNum += receiveBytesNum; } } - private void Filler(IntPtr data, int size) { var b = new byte[size]; @@ -100,7 +105,7 @@ if (got <= 0) { Thread.Sleep(1000); - // Console.WriteLine("Got bytes: {0}", got); + //Console.WriteLine("Got bytes: {0}", got); } if (got < toget) @@ -110,14 +115,13 @@ } else { - for (var i = 0; i < b.Length; i++) + for (int i = 0; i < b.Length; i++) b[i] = 0; } Marshal.Copy(b, 0, data, size); } - private void Dispose() { if (_mPlayer == null) return; diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml b/Correlator/UserControlPage/AuditionUserControl.xaml index af6bf8d..2a4fdee 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml +++ b/Correlator/UserControlPage/AuditionUserControl.xaml @@ -131,10 +131,11 @@ @@ -179,11 +180,11 @@ diff --git a/Correlator/UserControlPage/AuditionUserControl.xaml.cs b/Correlator/UserControlPage/AuditionUserControl.xaml.cs index a7c8c78..c8552ac 100644 --- a/Correlator/UserControlPage/AuditionUserControl.xaml.cs +++ b/Correlator/UserControlPage/AuditionUserControl.xaml.cs @@ -1,7 +1,12 @@ -using System.Windows; +using System.Threading; +using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Shapes; +using Correlator.SensorHubTag; +using Correlator.Util; +using HandyControl.Controls; +using MessageBox = HandyControl.Controls.MessageBox; namespace Correlator.UserControlPage { @@ -79,5 +84,84 @@ BottomHorizontalLineGrid.Children.Add(shorterScale); } } + + private void SensorACheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorACheckBox.IsChecked == false || SensorACheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + } + else + { + if (SensorBCheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + SensorBCheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev1); + } + } + + private void SensorBCheckBox_OnClick(object sender, RoutedEventArgs e) + { + if (!SerialPortManager.Instance.PortIsReady()) + { + MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); + return; + } + + if (SensorBCheckBox.IsChecked == false || SensorBCheckBox.IsChecked == null) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); + } + else + { + if (SensorACheckBox.IsChecked == true) + { + SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); + SensorACheckBox.IsChecked = false; + } + + new Thread(SendSoundCollectCmd) { IsBackground = true }.Start(DevCode.Dev2); + } + } + + private void SendSoundCollectCmd(object devCode) + { + //音频输出 + // PlayWav.Instance.InitWaveOut(); + + //停止状态采集指令的发送 + FlowStatus.CanGetSignal = false; + Thread.Sleep(3000); + SenderClass.SendSoundCollectCmd(SerialPortManager.Instance.SerialPort, devCode as string); + Growl.Success(DevCode.Dev1.Equals(devCode as string) ? "设备1发送听音指令" : "设备2发送听音指令"); + FlowStatus.IsListening = true; + // Thread.Sleep(2000); + + new Thread(ListeningTimer) { IsBackground = true }.Start(); + } + + private void ListeningTimer() + { + while (FlowStatus.IsListening) + { + Thread.Sleep(1000); + if (++FlowStatus.ElapseTime >= 15) + { + MessageBox.Show("接收不到数据,请重启软件", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Information); + break; + } + } + + FlowStatus.ElapseTime = 0; + } } } \ No newline at end of file diff --git a/Correlator/Util/PlayWav.cs b/Correlator/Util/PlayWav.cs index a3e8825..de282b1 100644 --- a/Correlator/Util/PlayWav.cs +++ b/Correlator/Util/PlayWav.cs @@ -11,7 +11,7 @@ private WaveFormat _mFormat; //private WaveOutStream m_AudioStream; - + private bool isPlaying; private WaveOutStream _waveOutStream; #region 单例 @@ -26,12 +26,15 @@ #endregion + private int _index; + public void InitWaveOut() { + Stop(); try { //必须填入文件名,否则ws无法实例化 - var ws = new WaveOutStream("AutoGenerate.txt"); + var ws = new WaveOutStream("AutoGenerateCache." + _index++ + ".txt"); _mFormat = ws.Format; _waveOutStream = ws; } @@ -43,7 +46,8 @@ if (_waveOutStream == null) return; _waveOutStream.Position = 0; - _mPlayer = new WaveOut(-1, _mFormat, _mFormat.nAvgBytesPerSec, 20, new BufferFillEventHandler(Filler)); + _mPlayer = new WaveOut(-1, _mFormat, _mFormat.nAvgBytesPerSec, 20, Filler); + isPlaying = true; } public void Stop() @@ -78,15 +82,16 @@ public void Listen(byte[] bytesData) { + var totalReceivedBytesNum = 0; var receiveBytesNum = bytesData.Length; if (_waveOutStream == null) return; lock (this) { _waveOutStream.Write(bytesData, 0, receiveBytesNum); + totalReceivedBytesNum += receiveBytesNum; } } - private void Filler(IntPtr data, int size) { var b = new byte[size]; @@ -100,7 +105,7 @@ if (got <= 0) { Thread.Sleep(1000); - // Console.WriteLine("Got bytes: {0}", got); + //Console.WriteLine("Got bytes: {0}", got); } if (got < toget) @@ -110,14 +115,13 @@ } else { - for (var i = 0; i < b.Length; i++) + for (int i = 0; i < b.Length; i++) b[i] = 0; } Marshal.Copy(b, 0, data, size); } - private void Dispose() { if (_mPlayer == null) return; diff --git a/Correlator/ViewModel/AuditionViewModel.cs b/Correlator/ViewModel/AuditionViewModel.cs index 1ea67f4..250a696 100644 --- a/Correlator/ViewModel/AuditionViewModel.cs +++ b/Correlator/ViewModel/AuditionViewModel.cs @@ -2,24 +2,19 @@ using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; -using System.Windows; using System.Windows.Threading; -using Correlator.SensorHubTag; using Correlator.Util; using GalaSoft.MvvmLight; using GalaSoft.MvvmLight.Command; using GalaSoft.MvvmLight.Messaging; using LiveCharts; using LiveCharts.Defaults; -using MessageBox = HandyControl.Controls.MessageBox; namespace Correlator.ViewModel { public class AuditionViewModel : ViewModelBase { public RelayCommand GoBackCommand { get; set; } - public RelayCommand SensorACheckCommand { get; set; } - public RelayCommand SensorBCheckCommand { get; set; } public RelayCommand MuteCommand { get; set; } public IChartValues ColumnValues { get; set; } = new ChartValues(); @@ -68,18 +63,6 @@ } } - private bool _sensorAIsChecked; - - public bool SensorAIsChecked - { - get => _sensorAIsChecked; - set - { - _sensorAIsChecked = value; - RaisePropertyChanged(() => SensorAIsChecked); - } - } - /// /// 传感器B按钮 /// @@ -95,18 +78,6 @@ } } - private bool _sensorBIsChecked; - - public bool SensorBIsChecked - { - get => _sensorBIsChecked; - set - { - _sensorBIsChecked = value; - RaisePropertyChanged(() => SensorBIsChecked); - } - } - private bool _muteIsChecked = true; public bool MuteIsChecked @@ -141,62 +112,6 @@ public AuditionViewModel() { GoBackCommand = new RelayCommand(() => { Messenger.Default.Send("", MessengerToken.RemoveAudition); }); - SensorACheckCommand = new RelayCommand(() => - { - if (!SerialPortManager.Instance.PortIsReady()) - { - MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); - SensorAIsChecked = false; - return; - } - - if (_sensorAIsChecked) - { - if (_sensorBIsChecked) - { - LogWithConsole.WriteLine("停止B,采集A", "AuditionViewModel"); - //如果红色传感器工作中,那么就停止蓝色传感器 - SensorBIsChecked = false; - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); - } - - //下发手机音频指令,保存音频文件 - new Task(() => SaveAuditionFileTask(DevCode.Dev1)).Start(); - } - else - { - LogWithConsole.WriteLine("停止A", "AuditionViewModel"); - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); - } - }); - SensorBCheckCommand = new RelayCommand(() => - { - if (!SerialPortManager.Instance.PortIsReady()) - { - MessageBox.Show("串口状态异常,无法操作", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); - SensorBIsChecked = false; - return; - } - - if (_sensorBIsChecked) - { - if (_sensorAIsChecked) - { - LogWithConsole.WriteLine("停止A,采集B", "AuditionViewModel"); - //如果蓝色传感器工作中,那么就停止红色传感器 - SensorAIsChecked = false; - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); - } - - //下发手机音频指令,保存音频文件 - new Task(() => SaveAuditionFileTask(DevCode.Dev2)).Start(); - } - else - { - LogWithConsole.WriteLine("停止B", "AuditionViewModel"); - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); - } - }); //静音 MuteCommand = new RelayCommand(() => { @@ -242,50 +157,6 @@ _statusTimer.Start(); } - private void SaveAuditionFileTask(string devCode) - { - var wavInstance = PlayWav.Instance; - wavInstance.Stop(); - wavInstance.InitWaveOut(); - - FlowStatus.CanGetSignal = false; //停止状态采集指令的发送 - Thread.Sleep(3000); - SenderClass.SendSoundCollectCmd(SerialPortManager.Instance.SerialPort, devCode); - Thread.Sleep(2000); - FlowStatus.IsListening = true; - //计时,记录超过多长时间没有收到听音数据 - new Task(() => - { - while (FlowStatus.IsListening) - { - Thread.Sleep(1500); - if (++FlowStatus.ElapseTime >= 10) - { - MessageBox.Show("接收不到数据,请重启软件", "温馨提示", MessageBoxButton.OK, MessageBoxImage.Error); - if (_sensorAIsChecked) - { - LogWithConsole.WriteLine("停止A,采集B", "AuditionViewModel"); - //如果蓝色传感器工作中,那么就停止红色传感器 - SensorAIsChecked = false; - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev1); - } - - if (_sensorBIsChecked) - { - LogWithConsole.WriteLine("停止B,采集A", "AuditionViewModel"); - //如果红色传感器工作中,那么就停止蓝色传感器 - SensorBIsChecked = false; - SenderClass.SendSoundStopCmd(SerialPortManager.Instance.SerialPort, DevCode.Dev2); - } - - break; - } - } - - FlowStatus.ElapseTime = 0; - }).Start(); - } - private void RandomTempValue() { var random = new Random();