diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index a01d4d1..0a7e32f 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Threading; @@ -30,170 +29,170 @@ _eventAggregator = eventAggregator; _audioService = audioService; Sp.DataReceived += DataReceivedFromSerialPort; + Sp.ErrorReceived += ErrorFromSerialPort; } + /// + /// 串口数据 + /// + /// + /// private void DataReceivedFromSerialPort(object sender, SerialDataReceivedEventArgs args) { - var strResult = ""; - var receiveData = GetRequestInfo(ref strResult); - - if (receiveData != null) + while (Sp.BytesToRead < 4) { - // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receiveData).Replace("-", "")); + return; + } - var deviceIdBytes = new byte[6]; - Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertToString(); + var headerBuff = new byte[2]; + Sp.Read(headerBuff, 0, 2); //读取数据 + if (headerBuff[0] != 0xA3 || headerBuff[1] != 0x20) //符合规范 + { + return; + } - var pduTypeBytes = new byte[2]; - Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); + var lengthBuffer = new byte[2]; + Sp.Read(lengthBuffer, 0, 2); + var length = lengthBuffer.ConvertToInt(); - var tagBytes = new byte[receiveData.Length - 18]; - Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); - var tags = tagBytes.GetTags(); - - //根据数据长度判断数据类型 - switch (receiveData.Length) - { - case 32: //设备状态、电量 - var cellTag = tags.GetCellTag(); - if (cellTag != null) - { - _devStatus.Cell = cellTag.Cell; - } - - var sensorExceptionTag = tags.GetSensorExceptionTag(); - if (sensorExceptionTag != null) - { - _devStatus.Status = sensorExceptionTag.State; - } - - //发送消息更新界面 - if (deviceId.Equals(DevCode.Dev1)) - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - else - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - - break; - case 11293: //数据采集 - if (!RuntimeCache.IsHydrophone) - { - HandleCorrelatorData(deviceId, tags); - } - - break; - case 30: - if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) - { - Application.Current.Dispatcher.Invoke(delegate - { - //显示点名弹窗 - if (!RuntimeCache.IsShowing) - { - //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 - _eventAggregator.GetEvent().Publish(); - RuntimeCache.IsShowing = true; - } - }); - } - - break; - case 22543: - if (receiveData[0] == 0xA3 && receiveData[1] == 0x20) - { - int index = receiveData[15]; - //取出seq,确定收到的是第几包数据 - RuntimeCache.SeqCaches.Add(index); - - var response = BitConverter.ToString(receiveData).Replace("-", ""); - //收集数据 - if (deviceId.Equals(DevCode.Dev1)) - { - //原始数据 - RuntimeCache.RedSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.RedSensorResponseTags.Add(index, tags); - } - else - { - //原始数据 - RuntimeCache.BlueSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.BlueSensorResponseTags.Add(index, tags); - } - } - - break; - case 15024: //听音 - HandleListenData(tags); - break; - default: - Console.WriteLine($@"SerialPortServiceImpl => {receiveData.Length}"); - break; - } + if (length < 12) + { + Sp.DiscardInBuffer(); //长度数据不符合,丢弃 + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); } else { - "SerialPortServiceImpl".WriteLog("接收数据存在问题"); + while (Sp.BytesToRead < length + 2) //数据不够,要等待 + { + Thread.Sleep(20); + } + + var result = new byte[length + 6]; + result[0] = headerBuff[0]; + result[1] = headerBuff[1]; + result[2] = lengthBuffer[0]; + result[3] = lengthBuffer[1]; + Sp.Read(result, 4, result.Length - 4); + + HandleSerialPortBytes(result); } } - private byte[] GetRequestInfo(ref string strResult) + /// + /// 错误数据 + /// + /// + /// + private void ErrorFromSerialPort(object sender, SerialErrorReceivedEventArgs e) { - try - { - while (Sp.BytesToRead < 4) Thread.Sleep(5); - var headerBuff = new byte[2]; - Sp.Read(headerBuff, 0, 2); //读取数据 - if (headerBuff[0] == 0xA3 && headerBuff[1] == 0x20) //符合规范 - { - var lengthBuffer = new byte[2]; - Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertToInt(); + Console.WriteLine(@"ErrorFromSerialPort => 错误数据"); + } - if (length < 12) + /// + /// 处理串口发过来的数据 + /// + /// + private void HandleSerialPortBytes(byte[] receivedData) + { + // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receivedData)); + + var versionByte = new byte[1]; + Array.Copy(receivedData, 1, versionByte, 0, 1); + var value = BitConverter.ToString(versionByte); + //版本分两部分,高半字代表版本的整数部分,低半字代表版本的小数部分,比如:0X20==V2.0 + var high = short.Parse(value) / 10; + var low = short.Parse(value) % 10; + var version = $"{high}.{low}"; + // Console.WriteLine($@"协议版本 => {version}"); + + var deviceIdBytes = new byte[6]; + Array.Copy(receivedData, 4, deviceIdBytes, 0, 6); + var deviceId = BitConverter.ToString(deviceIdBytes).Replace("-", ""); + // Console.WriteLine($@"设备ID => {deviceId}"); + + var tagBytes = new byte[receivedData.Length - 18]; + Array.Copy(receivedData, 16, tagBytes, 0, receivedData.Length - 18); + var tags = tagBytes.GetTags(); + // Console.WriteLine($@"Tag数量 => {tags.Count}"); + + switch (receivedData.Length) + { + case 32: //设备状态、电量 + var cellTag = tags.GetCellTag(); + if (cellTag != null) { - Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); - return null; + _devStatus.Cell = cellTag.Cell; } - while (Sp.BytesToRead < length + 2) Thread.Sleep(20); //数据不够,要等待 - - var result = new byte[length + 6]; - result[0] = headerBuff[0]; - result[1] = headerBuff[1]; - result[2] = lengthBuffer[0]; - result[3] = lengthBuffer[1]; - Sp.Read(result, 4, result.Length - 4); - return result; - } - else - { - Thread.Sleep(10); - var str = Encoding.UTF8.GetString(headerBuff) + Sp.ReadExisting(); - if (str != "" && str.Contains("\r\n")) + var sensorExceptionTag = tags.GetSensorExceptionTag(); + if (sensorExceptionTag != null) { - strResult = str; + _devStatus.Status = sensorExceptionTag.State; + } + + //发送消息更新界面 + if (deviceId.Equals(DevCode.Dev1)) + { + _eventAggregator.GetEvent().Publish(_devStatus); } else { - Sp.DiscardInBuffer(); + _eventAggregator.GetEvent().Publish(_devStatus); } - } - return null; - } - catch (Exception ex) - { - "SerialPortServiceImpl".WriteLog($"错误:{ex.Message}"); - Thread.Sleep(2000); - Process.GetCurrentProcess().Kill(); - return null; + break; + case 11293: //数据采集 + if (!RuntimeCache.IsHydrophone) + { + HandleCorrelatorData(deviceId, tags); + } + + break; + case 30: + if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) + { + Application.Current.Dispatcher.Invoke(delegate + { + //显示点名弹窗 + if (!RuntimeCache.IsShowing) + { + //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 + _eventAggregator.GetEvent().Publish(); + RuntimeCache.IsShowing = true; + } + }); + } + + break; + case 22543: + if (receivedData[0] == 0xA3 && receivedData[1] == 0x20) + { + int index = receivedData[15]; + //取出seq,确定收到的是第几包数据 + RuntimeCache.SeqCaches.Add(index); + + var response = BitConverter.ToString(receivedData).Replace("-", ""); + //收集数据 + if (deviceId.Equals(DevCode.Dev1)) + { + //原始数据 + RuntimeCache.RedSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.RedSensorResponseTags.Add(index, tags); + } + else + { + //原始数据 + RuntimeCache.BlueSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.BlueSensorResponseTags.Add(index, tags); + } + } + + break; + case 15024: //听音 + HandleListenData(tags); + break; } } diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index a01d4d1..0a7e32f 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Threading; @@ -30,170 +29,170 @@ _eventAggregator = eventAggregator; _audioService = audioService; Sp.DataReceived += DataReceivedFromSerialPort; + Sp.ErrorReceived += ErrorFromSerialPort; } + /// + /// 串口数据 + /// + /// + /// private void DataReceivedFromSerialPort(object sender, SerialDataReceivedEventArgs args) { - var strResult = ""; - var receiveData = GetRequestInfo(ref strResult); - - if (receiveData != null) + while (Sp.BytesToRead < 4) { - // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receiveData).Replace("-", "")); + return; + } - var deviceIdBytes = new byte[6]; - Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertToString(); + var headerBuff = new byte[2]; + Sp.Read(headerBuff, 0, 2); //读取数据 + if (headerBuff[0] != 0xA3 || headerBuff[1] != 0x20) //符合规范 + { + return; + } - var pduTypeBytes = new byte[2]; - Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); + var lengthBuffer = new byte[2]; + Sp.Read(lengthBuffer, 0, 2); + var length = lengthBuffer.ConvertToInt(); - var tagBytes = new byte[receiveData.Length - 18]; - Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); - var tags = tagBytes.GetTags(); - - //根据数据长度判断数据类型 - switch (receiveData.Length) - { - case 32: //设备状态、电量 - var cellTag = tags.GetCellTag(); - if (cellTag != null) - { - _devStatus.Cell = cellTag.Cell; - } - - var sensorExceptionTag = tags.GetSensorExceptionTag(); - if (sensorExceptionTag != null) - { - _devStatus.Status = sensorExceptionTag.State; - } - - //发送消息更新界面 - if (deviceId.Equals(DevCode.Dev1)) - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - else - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - - break; - case 11293: //数据采集 - if (!RuntimeCache.IsHydrophone) - { - HandleCorrelatorData(deviceId, tags); - } - - break; - case 30: - if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) - { - Application.Current.Dispatcher.Invoke(delegate - { - //显示点名弹窗 - if (!RuntimeCache.IsShowing) - { - //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 - _eventAggregator.GetEvent().Publish(); - RuntimeCache.IsShowing = true; - } - }); - } - - break; - case 22543: - if (receiveData[0] == 0xA3 && receiveData[1] == 0x20) - { - int index = receiveData[15]; - //取出seq,确定收到的是第几包数据 - RuntimeCache.SeqCaches.Add(index); - - var response = BitConverter.ToString(receiveData).Replace("-", ""); - //收集数据 - if (deviceId.Equals(DevCode.Dev1)) - { - //原始数据 - RuntimeCache.RedSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.RedSensorResponseTags.Add(index, tags); - } - else - { - //原始数据 - RuntimeCache.BlueSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.BlueSensorResponseTags.Add(index, tags); - } - } - - break; - case 15024: //听音 - HandleListenData(tags); - break; - default: - Console.WriteLine($@"SerialPortServiceImpl => {receiveData.Length}"); - break; - } + if (length < 12) + { + Sp.DiscardInBuffer(); //长度数据不符合,丢弃 + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); } else { - "SerialPortServiceImpl".WriteLog("接收数据存在问题"); + while (Sp.BytesToRead < length + 2) //数据不够,要等待 + { + Thread.Sleep(20); + } + + var result = new byte[length + 6]; + result[0] = headerBuff[0]; + result[1] = headerBuff[1]; + result[2] = lengthBuffer[0]; + result[3] = lengthBuffer[1]; + Sp.Read(result, 4, result.Length - 4); + + HandleSerialPortBytes(result); } } - private byte[] GetRequestInfo(ref string strResult) + /// + /// 错误数据 + /// + /// + /// + private void ErrorFromSerialPort(object sender, SerialErrorReceivedEventArgs e) { - try - { - while (Sp.BytesToRead < 4) Thread.Sleep(5); - var headerBuff = new byte[2]; - Sp.Read(headerBuff, 0, 2); //读取数据 - if (headerBuff[0] == 0xA3 && headerBuff[1] == 0x20) //符合规范 - { - var lengthBuffer = new byte[2]; - Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertToInt(); + Console.WriteLine(@"ErrorFromSerialPort => 错误数据"); + } - if (length < 12) + /// + /// 处理串口发过来的数据 + /// + /// + private void HandleSerialPortBytes(byte[] receivedData) + { + // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receivedData)); + + var versionByte = new byte[1]; + Array.Copy(receivedData, 1, versionByte, 0, 1); + var value = BitConverter.ToString(versionByte); + //版本分两部分,高半字代表版本的整数部分,低半字代表版本的小数部分,比如:0X20==V2.0 + var high = short.Parse(value) / 10; + var low = short.Parse(value) % 10; + var version = $"{high}.{low}"; + // Console.WriteLine($@"协议版本 => {version}"); + + var deviceIdBytes = new byte[6]; + Array.Copy(receivedData, 4, deviceIdBytes, 0, 6); + var deviceId = BitConverter.ToString(deviceIdBytes).Replace("-", ""); + // Console.WriteLine($@"设备ID => {deviceId}"); + + var tagBytes = new byte[receivedData.Length - 18]; + Array.Copy(receivedData, 16, tagBytes, 0, receivedData.Length - 18); + var tags = tagBytes.GetTags(); + // Console.WriteLine($@"Tag数量 => {tags.Count}"); + + switch (receivedData.Length) + { + case 32: //设备状态、电量 + var cellTag = tags.GetCellTag(); + if (cellTag != null) { - Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); - return null; + _devStatus.Cell = cellTag.Cell; } - while (Sp.BytesToRead < length + 2) Thread.Sleep(20); //数据不够,要等待 - - var result = new byte[length + 6]; - result[0] = headerBuff[0]; - result[1] = headerBuff[1]; - result[2] = lengthBuffer[0]; - result[3] = lengthBuffer[1]; - Sp.Read(result, 4, result.Length - 4); - return result; - } - else - { - Thread.Sleep(10); - var str = Encoding.UTF8.GetString(headerBuff) + Sp.ReadExisting(); - if (str != "" && str.Contains("\r\n")) + var sensorExceptionTag = tags.GetSensorExceptionTag(); + if (sensorExceptionTag != null) { - strResult = str; + _devStatus.Status = sensorExceptionTag.State; + } + + //发送消息更新界面 + if (deviceId.Equals(DevCode.Dev1)) + { + _eventAggregator.GetEvent().Publish(_devStatus); } else { - Sp.DiscardInBuffer(); + _eventAggregator.GetEvent().Publish(_devStatus); } - } - return null; - } - catch (Exception ex) - { - "SerialPortServiceImpl".WriteLog($"错误:{ex.Message}"); - Thread.Sleep(2000); - Process.GetCurrentProcess().Kill(); - return null; + break; + case 11293: //数据采集 + if (!RuntimeCache.IsHydrophone) + { + HandleCorrelatorData(deviceId, tags); + } + + break; + case 30: + if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) + { + Application.Current.Dispatcher.Invoke(delegate + { + //显示点名弹窗 + if (!RuntimeCache.IsShowing) + { + //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 + _eventAggregator.GetEvent().Publish(); + RuntimeCache.IsShowing = true; + } + }); + } + + break; + case 22543: + if (receivedData[0] == 0xA3 && receivedData[1] == 0x20) + { + int index = receivedData[15]; + //取出seq,确定收到的是第几包数据 + RuntimeCache.SeqCaches.Add(index); + + var response = BitConverter.ToString(receivedData).Replace("-", ""); + //收集数据 + if (deviceId.Equals(DevCode.Dev1)) + { + //原始数据 + RuntimeCache.RedSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.RedSensorResponseTags.Add(index, tags); + } + else + { + //原始数据 + RuntimeCache.BlueSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.BlueSensorResponseTags.Add(index, tags); + } + } + + break; + case 15024: //听音 + HandleListenData(tags); + break; } } diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index b7694e4..3452941 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -284,30 +284,35 @@ /// /// 字节数组转数据Tag集合 /// - /// + /// /// - public static List GetTags(this byte[] strTags) + public static List GetTags(this byte[] tagBytes) { var tags = new List(); try { var i = 0; - while (i < strTags.Length) + var n = 0; + while (i < tagBytes.Length) { - var oid = new byte[4]; - var len = new byte[2]; - Array.Copy(strTags, i, oid, 0, 4); - Array.Copy(strTags, i + 4, len, 0, 2); + n++; + var oidBytes = new byte[4]; + Array.Copy(tagBytes, i, oidBytes, 0, 4); + var oid = oidBytes.ConvertToString(); + + //value域的长度 + var tagValueBytes = new byte[2]; + Array.Copy(tagBytes, i + 4, tagValueBytes, 0, 2); + Array.Reverse(tagValueBytes); + int tagValueLength = BitConverter.ToInt16(tagValueBytes, 0); + Console.WriteLine($@"value域的长度 => {tagValueLength}"); - Array.Reverse(len); - int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertToString(); + var valueBytes = new byte[tagValueLength]; + Array.Copy(tagBytes, i + 6, valueBytes, 0, tagValueLength); + // Console.WriteLine($@"第{n}个Tag => {BitConverter.ToString(valueBytes)}"); - var value = new byte[iLen]; - Array.Copy(strTags, i + 6, value, 0, iLen); - - i = i + 6 + iLen; - var tag = TagFactory.Create(strOid, iLen, value); + i = i + 6 + tagValueLength; + var tag = TagFactory.Create(oid, tagValueLength, valueBytes); tags.Add(tag); } } @@ -546,7 +551,7 @@ configModel.Pipe++; configModel.LocateTimes++; manager.Insert(configModel); - + //清空缓存 RuntimeCache.SoundCaches.Clear(); } diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index a01d4d1..0a7e32f 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Threading; @@ -30,170 +29,170 @@ _eventAggregator = eventAggregator; _audioService = audioService; Sp.DataReceived += DataReceivedFromSerialPort; + Sp.ErrorReceived += ErrorFromSerialPort; } + /// + /// 串口数据 + /// + /// + /// private void DataReceivedFromSerialPort(object sender, SerialDataReceivedEventArgs args) { - var strResult = ""; - var receiveData = GetRequestInfo(ref strResult); - - if (receiveData != null) + while (Sp.BytesToRead < 4) { - // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receiveData).Replace("-", "")); + return; + } - var deviceIdBytes = new byte[6]; - Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertToString(); + var headerBuff = new byte[2]; + Sp.Read(headerBuff, 0, 2); //读取数据 + if (headerBuff[0] != 0xA3 || headerBuff[1] != 0x20) //符合规范 + { + return; + } - var pduTypeBytes = new byte[2]; - Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); + var lengthBuffer = new byte[2]; + Sp.Read(lengthBuffer, 0, 2); + var length = lengthBuffer.ConvertToInt(); - var tagBytes = new byte[receiveData.Length - 18]; - Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); - var tags = tagBytes.GetTags(); - - //根据数据长度判断数据类型 - switch (receiveData.Length) - { - case 32: //设备状态、电量 - var cellTag = tags.GetCellTag(); - if (cellTag != null) - { - _devStatus.Cell = cellTag.Cell; - } - - var sensorExceptionTag = tags.GetSensorExceptionTag(); - if (sensorExceptionTag != null) - { - _devStatus.Status = sensorExceptionTag.State; - } - - //发送消息更新界面 - if (deviceId.Equals(DevCode.Dev1)) - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - else - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - - break; - case 11293: //数据采集 - if (!RuntimeCache.IsHydrophone) - { - HandleCorrelatorData(deviceId, tags); - } - - break; - case 30: - if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) - { - Application.Current.Dispatcher.Invoke(delegate - { - //显示点名弹窗 - if (!RuntimeCache.IsShowing) - { - //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 - _eventAggregator.GetEvent().Publish(); - RuntimeCache.IsShowing = true; - } - }); - } - - break; - case 22543: - if (receiveData[0] == 0xA3 && receiveData[1] == 0x20) - { - int index = receiveData[15]; - //取出seq,确定收到的是第几包数据 - RuntimeCache.SeqCaches.Add(index); - - var response = BitConverter.ToString(receiveData).Replace("-", ""); - //收集数据 - if (deviceId.Equals(DevCode.Dev1)) - { - //原始数据 - RuntimeCache.RedSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.RedSensorResponseTags.Add(index, tags); - } - else - { - //原始数据 - RuntimeCache.BlueSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.BlueSensorResponseTags.Add(index, tags); - } - } - - break; - case 15024: //听音 - HandleListenData(tags); - break; - default: - Console.WriteLine($@"SerialPortServiceImpl => {receiveData.Length}"); - break; - } + if (length < 12) + { + Sp.DiscardInBuffer(); //长度数据不符合,丢弃 + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); } else { - "SerialPortServiceImpl".WriteLog("接收数据存在问题"); + while (Sp.BytesToRead < length + 2) //数据不够,要等待 + { + Thread.Sleep(20); + } + + var result = new byte[length + 6]; + result[0] = headerBuff[0]; + result[1] = headerBuff[1]; + result[2] = lengthBuffer[0]; + result[3] = lengthBuffer[1]; + Sp.Read(result, 4, result.Length - 4); + + HandleSerialPortBytes(result); } } - private byte[] GetRequestInfo(ref string strResult) + /// + /// 错误数据 + /// + /// + /// + private void ErrorFromSerialPort(object sender, SerialErrorReceivedEventArgs e) { - try - { - while (Sp.BytesToRead < 4) Thread.Sleep(5); - var headerBuff = new byte[2]; - Sp.Read(headerBuff, 0, 2); //读取数据 - if (headerBuff[0] == 0xA3 && headerBuff[1] == 0x20) //符合规范 - { - var lengthBuffer = new byte[2]; - Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertToInt(); + Console.WriteLine(@"ErrorFromSerialPort => 错误数据"); + } - if (length < 12) + /// + /// 处理串口发过来的数据 + /// + /// + private void HandleSerialPortBytes(byte[] receivedData) + { + // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receivedData)); + + var versionByte = new byte[1]; + Array.Copy(receivedData, 1, versionByte, 0, 1); + var value = BitConverter.ToString(versionByte); + //版本分两部分,高半字代表版本的整数部分,低半字代表版本的小数部分,比如:0X20==V2.0 + var high = short.Parse(value) / 10; + var low = short.Parse(value) % 10; + var version = $"{high}.{low}"; + // Console.WriteLine($@"协议版本 => {version}"); + + var deviceIdBytes = new byte[6]; + Array.Copy(receivedData, 4, deviceIdBytes, 0, 6); + var deviceId = BitConverter.ToString(deviceIdBytes).Replace("-", ""); + // Console.WriteLine($@"设备ID => {deviceId}"); + + var tagBytes = new byte[receivedData.Length - 18]; + Array.Copy(receivedData, 16, tagBytes, 0, receivedData.Length - 18); + var tags = tagBytes.GetTags(); + // Console.WriteLine($@"Tag数量 => {tags.Count}"); + + switch (receivedData.Length) + { + case 32: //设备状态、电量 + var cellTag = tags.GetCellTag(); + if (cellTag != null) { - Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); - return null; + _devStatus.Cell = cellTag.Cell; } - while (Sp.BytesToRead < length + 2) Thread.Sleep(20); //数据不够,要等待 - - var result = new byte[length + 6]; - result[0] = headerBuff[0]; - result[1] = headerBuff[1]; - result[2] = lengthBuffer[0]; - result[3] = lengthBuffer[1]; - Sp.Read(result, 4, result.Length - 4); - return result; - } - else - { - Thread.Sleep(10); - var str = Encoding.UTF8.GetString(headerBuff) + Sp.ReadExisting(); - if (str != "" && str.Contains("\r\n")) + var sensorExceptionTag = tags.GetSensorExceptionTag(); + if (sensorExceptionTag != null) { - strResult = str; + _devStatus.Status = sensorExceptionTag.State; + } + + //发送消息更新界面 + if (deviceId.Equals(DevCode.Dev1)) + { + _eventAggregator.GetEvent().Publish(_devStatus); } else { - Sp.DiscardInBuffer(); + _eventAggregator.GetEvent().Publish(_devStatus); } - } - return null; - } - catch (Exception ex) - { - "SerialPortServiceImpl".WriteLog($"错误:{ex.Message}"); - Thread.Sleep(2000); - Process.GetCurrentProcess().Kill(); - return null; + break; + case 11293: //数据采集 + if (!RuntimeCache.IsHydrophone) + { + HandleCorrelatorData(deviceId, tags); + } + + break; + case 30: + if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) + { + Application.Current.Dispatcher.Invoke(delegate + { + //显示点名弹窗 + if (!RuntimeCache.IsShowing) + { + //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 + _eventAggregator.GetEvent().Publish(); + RuntimeCache.IsShowing = true; + } + }); + } + + break; + case 22543: + if (receivedData[0] == 0xA3 && receivedData[1] == 0x20) + { + int index = receivedData[15]; + //取出seq,确定收到的是第几包数据 + RuntimeCache.SeqCaches.Add(index); + + var response = BitConverter.ToString(receivedData).Replace("-", ""); + //收集数据 + if (deviceId.Equals(DevCode.Dev1)) + { + //原始数据 + RuntimeCache.RedSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.RedSensorResponseTags.Add(index, tags); + } + else + { + //原始数据 + RuntimeCache.BlueSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.BlueSensorResponseTags.Add(index, tags); + } + } + + break; + case 15024: //听音 + HandleListenData(tags); + break; } } diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index b7694e4..3452941 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -284,30 +284,35 @@ /// /// 字节数组转数据Tag集合 /// - /// + /// /// - public static List GetTags(this byte[] strTags) + public static List GetTags(this byte[] tagBytes) { var tags = new List(); try { var i = 0; - while (i < strTags.Length) + var n = 0; + while (i < tagBytes.Length) { - var oid = new byte[4]; - var len = new byte[2]; - Array.Copy(strTags, i, oid, 0, 4); - Array.Copy(strTags, i + 4, len, 0, 2); + n++; + var oidBytes = new byte[4]; + Array.Copy(tagBytes, i, oidBytes, 0, 4); + var oid = oidBytes.ConvertToString(); + + //value域的长度 + var tagValueBytes = new byte[2]; + Array.Copy(tagBytes, i + 4, tagValueBytes, 0, 2); + Array.Reverse(tagValueBytes); + int tagValueLength = BitConverter.ToInt16(tagValueBytes, 0); + Console.WriteLine($@"value域的长度 => {tagValueLength}"); - Array.Reverse(len); - int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertToString(); + var valueBytes = new byte[tagValueLength]; + Array.Copy(tagBytes, i + 6, valueBytes, 0, tagValueLength); + // Console.WriteLine($@"第{n}个Tag => {BitConverter.ToString(valueBytes)}"); - var value = new byte[iLen]; - Array.Copy(strTags, i + 6, value, 0, iLen); - - i = i + 6 + iLen; - var tag = TagFactory.Create(strOid, iLen, value); + i = i + 6 + tagValueLength; + var tag = TagFactory.Create(oid, tagValueLength, valueBytes); tags.Add(tag); } } @@ -546,7 +551,7 @@ configModel.Pipe++; configModel.LocateTimes++; manager.Insert(configModel); - + //清空缓存 RuntimeCache.SoundCaches.Clear(); } diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index f614c12..5c8b044 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Controls; using System.Windows.Threading; +using Correlator.DataService; using Correlator.Model; using Correlator.Util; using HandyControl.Controls; @@ -21,7 +22,6 @@ public string Title { get; private set; } = string.Empty; public event Action RequestClose; - private List _totalFiles; private List _audioFiles; @@ -108,7 +108,6 @@ #endregion private AudioFile _selectedFile; - private WaveOutEvent _waveOutEvent = new WaveOutEvent(); private AudioFileReader _audioFileReader; private readonly DispatcherTimer _audioTimer = new DispatcherTimer @@ -116,11 +115,11 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService) + public AudioFileViewModel(IAudioService audioService, IDialogService dialogService) { _audioTimer.Tick += delegate { - if (_waveOutEvent.PlaybackState == PlaybackState.Stopped) + if (audioService.Wave.PlaybackState == PlaybackState.Stopped) { _audioTimer.Stop(); AudioState = "未播放"; @@ -144,12 +143,6 @@ _audioFileReader = null; } - if (_waveOutEvent != null) - { - _waveOutEvent.Dispose(); - _waveOutEvent = null; - } - RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); }); @@ -173,8 +166,9 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { + audioService.Wave.Stop(); DisposeResource("已暂停"); } else @@ -186,8 +180,8 @@ Max = (int)_audioFileReader.TotalTime.TotalSeconds; AudioState = $"时长:{_max}s"; - _waveOutEvent.Init(_audioFileReader); - _waveOutEvent.Play(); + audioService.Wave.Init(_audioFileReader); + audioService.Wave.Play(); } catch (FormatException) { @@ -215,7 +209,7 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { dialogService.ShowDialog( "AlertMessageDialog", @@ -233,11 +227,10 @@ File.Delete(_selectedFile.FullPath); //刷新数据 - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - //页码重置 + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); PageIndex = 1; - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) { @@ -247,7 +240,7 @@ PageUpdatedCmd = new DelegateCommand>(args => { - AudioFiles = _totalFiles + AudioFiles = GetTotalAudioFiles() .Skip((args.Info - 1) * RuntimeCache.PerPageItemCount) .Take(RuntimeCache.PerPageItemCount) .ToList(); @@ -256,7 +249,6 @@ private void DisposeResource(string message) { - _waveOutEvent?.Dispose(); _audioFileReader?.Dispose(); _audioTimer?.Stop(); AudioState = message; @@ -273,9 +265,9 @@ public void OnDialogOpened(IDialogParameters parameters) { - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } private static List GetTotalAudioFiles() diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index a01d4d1..0a7e32f 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Threading; @@ -30,170 +29,170 @@ _eventAggregator = eventAggregator; _audioService = audioService; Sp.DataReceived += DataReceivedFromSerialPort; + Sp.ErrorReceived += ErrorFromSerialPort; } + /// + /// 串口数据 + /// + /// + /// private void DataReceivedFromSerialPort(object sender, SerialDataReceivedEventArgs args) { - var strResult = ""; - var receiveData = GetRequestInfo(ref strResult); - - if (receiveData != null) + while (Sp.BytesToRead < 4) { - // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receiveData).Replace("-", "")); + return; + } - var deviceIdBytes = new byte[6]; - Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertToString(); + var headerBuff = new byte[2]; + Sp.Read(headerBuff, 0, 2); //读取数据 + if (headerBuff[0] != 0xA3 || headerBuff[1] != 0x20) //符合规范 + { + return; + } - var pduTypeBytes = new byte[2]; - Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); + var lengthBuffer = new byte[2]; + Sp.Read(lengthBuffer, 0, 2); + var length = lengthBuffer.ConvertToInt(); - var tagBytes = new byte[receiveData.Length - 18]; - Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); - var tags = tagBytes.GetTags(); - - //根据数据长度判断数据类型 - switch (receiveData.Length) - { - case 32: //设备状态、电量 - var cellTag = tags.GetCellTag(); - if (cellTag != null) - { - _devStatus.Cell = cellTag.Cell; - } - - var sensorExceptionTag = tags.GetSensorExceptionTag(); - if (sensorExceptionTag != null) - { - _devStatus.Status = sensorExceptionTag.State; - } - - //发送消息更新界面 - if (deviceId.Equals(DevCode.Dev1)) - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - else - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - - break; - case 11293: //数据采集 - if (!RuntimeCache.IsHydrophone) - { - HandleCorrelatorData(deviceId, tags); - } - - break; - case 30: - if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) - { - Application.Current.Dispatcher.Invoke(delegate - { - //显示点名弹窗 - if (!RuntimeCache.IsShowing) - { - //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 - _eventAggregator.GetEvent().Publish(); - RuntimeCache.IsShowing = true; - } - }); - } - - break; - case 22543: - if (receiveData[0] == 0xA3 && receiveData[1] == 0x20) - { - int index = receiveData[15]; - //取出seq,确定收到的是第几包数据 - RuntimeCache.SeqCaches.Add(index); - - var response = BitConverter.ToString(receiveData).Replace("-", ""); - //收集数据 - if (deviceId.Equals(DevCode.Dev1)) - { - //原始数据 - RuntimeCache.RedSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.RedSensorResponseTags.Add(index, tags); - } - else - { - //原始数据 - RuntimeCache.BlueSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.BlueSensorResponseTags.Add(index, tags); - } - } - - break; - case 15024: //听音 - HandleListenData(tags); - break; - default: - Console.WriteLine($@"SerialPortServiceImpl => {receiveData.Length}"); - break; - } + if (length < 12) + { + Sp.DiscardInBuffer(); //长度数据不符合,丢弃 + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); } else { - "SerialPortServiceImpl".WriteLog("接收数据存在问题"); + while (Sp.BytesToRead < length + 2) //数据不够,要等待 + { + Thread.Sleep(20); + } + + var result = new byte[length + 6]; + result[0] = headerBuff[0]; + result[1] = headerBuff[1]; + result[2] = lengthBuffer[0]; + result[3] = lengthBuffer[1]; + Sp.Read(result, 4, result.Length - 4); + + HandleSerialPortBytes(result); } } - private byte[] GetRequestInfo(ref string strResult) + /// + /// 错误数据 + /// + /// + /// + private void ErrorFromSerialPort(object sender, SerialErrorReceivedEventArgs e) { - try - { - while (Sp.BytesToRead < 4) Thread.Sleep(5); - var headerBuff = new byte[2]; - Sp.Read(headerBuff, 0, 2); //读取数据 - if (headerBuff[0] == 0xA3 && headerBuff[1] == 0x20) //符合规范 - { - var lengthBuffer = new byte[2]; - Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertToInt(); + Console.WriteLine(@"ErrorFromSerialPort => 错误数据"); + } - if (length < 12) + /// + /// 处理串口发过来的数据 + /// + /// + private void HandleSerialPortBytes(byte[] receivedData) + { + // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receivedData)); + + var versionByte = new byte[1]; + Array.Copy(receivedData, 1, versionByte, 0, 1); + var value = BitConverter.ToString(versionByte); + //版本分两部分,高半字代表版本的整数部分,低半字代表版本的小数部分,比如:0X20==V2.0 + var high = short.Parse(value) / 10; + var low = short.Parse(value) % 10; + var version = $"{high}.{low}"; + // Console.WriteLine($@"协议版本 => {version}"); + + var deviceIdBytes = new byte[6]; + Array.Copy(receivedData, 4, deviceIdBytes, 0, 6); + var deviceId = BitConverter.ToString(deviceIdBytes).Replace("-", ""); + // Console.WriteLine($@"设备ID => {deviceId}"); + + var tagBytes = new byte[receivedData.Length - 18]; + Array.Copy(receivedData, 16, tagBytes, 0, receivedData.Length - 18); + var tags = tagBytes.GetTags(); + // Console.WriteLine($@"Tag数量 => {tags.Count}"); + + switch (receivedData.Length) + { + case 32: //设备状态、电量 + var cellTag = tags.GetCellTag(); + if (cellTag != null) { - Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); - return null; + _devStatus.Cell = cellTag.Cell; } - while (Sp.BytesToRead < length + 2) Thread.Sleep(20); //数据不够,要等待 - - var result = new byte[length + 6]; - result[0] = headerBuff[0]; - result[1] = headerBuff[1]; - result[2] = lengthBuffer[0]; - result[3] = lengthBuffer[1]; - Sp.Read(result, 4, result.Length - 4); - return result; - } - else - { - Thread.Sleep(10); - var str = Encoding.UTF8.GetString(headerBuff) + Sp.ReadExisting(); - if (str != "" && str.Contains("\r\n")) + var sensorExceptionTag = tags.GetSensorExceptionTag(); + if (sensorExceptionTag != null) { - strResult = str; + _devStatus.Status = sensorExceptionTag.State; + } + + //发送消息更新界面 + if (deviceId.Equals(DevCode.Dev1)) + { + _eventAggregator.GetEvent().Publish(_devStatus); } else { - Sp.DiscardInBuffer(); + _eventAggregator.GetEvent().Publish(_devStatus); } - } - return null; - } - catch (Exception ex) - { - "SerialPortServiceImpl".WriteLog($"错误:{ex.Message}"); - Thread.Sleep(2000); - Process.GetCurrentProcess().Kill(); - return null; + break; + case 11293: //数据采集 + if (!RuntimeCache.IsHydrophone) + { + HandleCorrelatorData(deviceId, tags); + } + + break; + case 30: + if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) + { + Application.Current.Dispatcher.Invoke(delegate + { + //显示点名弹窗 + if (!RuntimeCache.IsShowing) + { + //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 + _eventAggregator.GetEvent().Publish(); + RuntimeCache.IsShowing = true; + } + }); + } + + break; + case 22543: + if (receivedData[0] == 0xA3 && receivedData[1] == 0x20) + { + int index = receivedData[15]; + //取出seq,确定收到的是第几包数据 + RuntimeCache.SeqCaches.Add(index); + + var response = BitConverter.ToString(receivedData).Replace("-", ""); + //收集数据 + if (deviceId.Equals(DevCode.Dev1)) + { + //原始数据 + RuntimeCache.RedSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.RedSensorResponseTags.Add(index, tags); + } + else + { + //原始数据 + RuntimeCache.BlueSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.BlueSensorResponseTags.Add(index, tags); + } + } + + break; + case 15024: //听音 + HandleListenData(tags); + break; } } diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index b7694e4..3452941 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -284,30 +284,35 @@ /// /// 字节数组转数据Tag集合 /// - /// + /// /// - public static List GetTags(this byte[] strTags) + public static List GetTags(this byte[] tagBytes) { var tags = new List(); try { var i = 0; - while (i < strTags.Length) + var n = 0; + while (i < tagBytes.Length) { - var oid = new byte[4]; - var len = new byte[2]; - Array.Copy(strTags, i, oid, 0, 4); - Array.Copy(strTags, i + 4, len, 0, 2); + n++; + var oidBytes = new byte[4]; + Array.Copy(tagBytes, i, oidBytes, 0, 4); + var oid = oidBytes.ConvertToString(); + + //value域的长度 + var tagValueBytes = new byte[2]; + Array.Copy(tagBytes, i + 4, tagValueBytes, 0, 2); + Array.Reverse(tagValueBytes); + int tagValueLength = BitConverter.ToInt16(tagValueBytes, 0); + Console.WriteLine($@"value域的长度 => {tagValueLength}"); - Array.Reverse(len); - int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertToString(); + var valueBytes = new byte[tagValueLength]; + Array.Copy(tagBytes, i + 6, valueBytes, 0, tagValueLength); + // Console.WriteLine($@"第{n}个Tag => {BitConverter.ToString(valueBytes)}"); - var value = new byte[iLen]; - Array.Copy(strTags, i + 6, value, 0, iLen); - - i = i + 6 + iLen; - var tag = TagFactory.Create(strOid, iLen, value); + i = i + 6 + tagValueLength; + var tag = TagFactory.Create(oid, tagValueLength, valueBytes); tags.Add(tag); } } @@ -546,7 +551,7 @@ configModel.Pipe++; configModel.LocateTimes++; manager.Insert(configModel); - + //清空缓存 RuntimeCache.SoundCaches.Clear(); } diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index f614c12..5c8b044 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Controls; using System.Windows.Threading; +using Correlator.DataService; using Correlator.Model; using Correlator.Util; using HandyControl.Controls; @@ -21,7 +22,6 @@ public string Title { get; private set; } = string.Empty; public event Action RequestClose; - private List _totalFiles; private List _audioFiles; @@ -108,7 +108,6 @@ #endregion private AudioFile _selectedFile; - private WaveOutEvent _waveOutEvent = new WaveOutEvent(); private AudioFileReader _audioFileReader; private readonly DispatcherTimer _audioTimer = new DispatcherTimer @@ -116,11 +115,11 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService) + public AudioFileViewModel(IAudioService audioService, IDialogService dialogService) { _audioTimer.Tick += delegate { - if (_waveOutEvent.PlaybackState == PlaybackState.Stopped) + if (audioService.Wave.PlaybackState == PlaybackState.Stopped) { _audioTimer.Stop(); AudioState = "未播放"; @@ -144,12 +143,6 @@ _audioFileReader = null; } - if (_waveOutEvent != null) - { - _waveOutEvent.Dispose(); - _waveOutEvent = null; - } - RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); }); @@ -173,8 +166,9 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { + audioService.Wave.Stop(); DisposeResource("已暂停"); } else @@ -186,8 +180,8 @@ Max = (int)_audioFileReader.TotalTime.TotalSeconds; AudioState = $"时长:{_max}s"; - _waveOutEvent.Init(_audioFileReader); - _waveOutEvent.Play(); + audioService.Wave.Init(_audioFileReader); + audioService.Wave.Play(); } catch (FormatException) { @@ -215,7 +209,7 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { dialogService.ShowDialog( "AlertMessageDialog", @@ -233,11 +227,10 @@ File.Delete(_selectedFile.FullPath); //刷新数据 - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - //页码重置 + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); PageIndex = 1; - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) { @@ -247,7 +240,7 @@ PageUpdatedCmd = new DelegateCommand>(args => { - AudioFiles = _totalFiles + AudioFiles = GetTotalAudioFiles() .Skip((args.Info - 1) * RuntimeCache.PerPageItemCount) .Take(RuntimeCache.PerPageItemCount) .ToList(); @@ -256,7 +249,6 @@ private void DisposeResource(string message) { - _waveOutEvent?.Dispose(); _audioFileReader?.Dispose(); _audioTimer?.Stop(); AudioState = message; @@ -273,9 +265,9 @@ public void OnDialogOpened(IDialogParameters parameters) { - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } private static List GetTotalAudioFiles() diff --git a/Correlator/ViewModels/MainWindowViewModel.cs b/Correlator/ViewModels/MainWindowViewModel.cs index 91e77ea..dce24b5 100644 --- a/Correlator/ViewModels/MainWindowViewModel.cs +++ b/Correlator/ViewModels/MainWindowViewModel.cs @@ -817,7 +817,7 @@ { File.Delete(file); } - + RuntimeCache.SmallAudioFiles.Clear(); _mainWindow.Close(); } @@ -833,13 +833,13 @@ //查看图片列表 OpenImageFileCommand = new DelegateCommand(delegate { - _dialogService.ShowDialog("PictureFileView", null, delegate { }); + _dialogService.Show("PictureFileView", null, delegate { }); }); //查看音频列表 OpenAudioFileCommand = new DelegateCommand(delegate { - _dialogService.ShowDialog("AudioFileView", null, delegate { }); + _dialogService.Show("AudioFileView", null, delegate { }); }); //打开听音 @@ -879,7 +879,7 @@ return; } - _dialogService.ShowDialog("SoundSpeedDialog", + _dialogService.Show("SoundSpeedDialog", new DialogParameters { { "MaterialName", _materialName } }, delegate { }); }); @@ -889,7 +889,7 @@ { if (RuntimeCache.IsHydrophone) { - _dialogService.ShowDialog("ImportResponseDialog", null, delegate(IDialogResult result) + _dialogService.Show("ImportResponseDialog", null, delegate(IDialogResult result) { if (result.Result == ButtonResult.Cancel) { @@ -914,9 +914,11 @@ PipeLength = configModel.PipeLength; LowFrequency = configModel.MinFrequency; HighFrequency = configModel.MaxFrequency; - + //计算声速 - var soundVelocity = _soundSpeedDataService.GetSoundVelocity(_materialName, Convert.ToInt32(_pipeDiameter)); + var soundVelocity = _soundSpeedDataService.GetSoundVelocity( + _materialName, Convert.ToInt32(_pipeDiameter) + ); SoundSpeed = soundVelocity.ToString(); } diff --git a/Correlator/DataService/SerialPortServiceImpl.cs b/Correlator/DataService/SerialPortServiceImpl.cs index a01d4d1..0a7e32f 100644 --- a/Correlator/DataService/SerialPortServiceImpl.cs +++ b/Correlator/DataService/SerialPortServiceImpl.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO.Ports; using System.Text; using System.Threading; @@ -30,170 +29,170 @@ _eventAggregator = eventAggregator; _audioService = audioService; Sp.DataReceived += DataReceivedFromSerialPort; + Sp.ErrorReceived += ErrorFromSerialPort; } + /// + /// 串口数据 + /// + /// + /// private void DataReceivedFromSerialPort(object sender, SerialDataReceivedEventArgs args) { - var strResult = ""; - var receiveData = GetRequestInfo(ref strResult); - - if (receiveData != null) + while (Sp.BytesToRead < 4) { - // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receiveData).Replace("-", "")); + return; + } - var deviceIdBytes = new byte[6]; - Array.Copy(receiveData, 4, deviceIdBytes, 0, 6); - var deviceId = deviceIdBytes.ConvertToString(); + var headerBuff = new byte[2]; + Sp.Read(headerBuff, 0, 2); //读取数据 + if (headerBuff[0] != 0xA3 || headerBuff[1] != 0x20) //符合规范 + { + return; + } - var pduTypeBytes = new byte[2]; - Array.Copy(receiveData, 13, pduTypeBytes, 0, 2); + var lengthBuffer = new byte[2]; + Sp.Read(lengthBuffer, 0, 2); + var length = lengthBuffer.ConvertToInt(); - var tagBytes = new byte[receiveData.Length - 18]; - Array.Copy(receiveData, 16, tagBytes, 0, receiveData.Length - 18); - var tags = tagBytes.GetTags(); - - //根据数据长度判断数据类型 - switch (receiveData.Length) - { - case 32: //设备状态、电量 - var cellTag = tags.GetCellTag(); - if (cellTag != null) - { - _devStatus.Cell = cellTag.Cell; - } - - var sensorExceptionTag = tags.GetSensorExceptionTag(); - if (sensorExceptionTag != null) - { - _devStatus.Status = sensorExceptionTag.State; - } - - //发送消息更新界面 - if (deviceId.Equals(DevCode.Dev1)) - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - else - { - _eventAggregator.GetEvent().Publish(_devStatus); - } - - break; - case 11293: //数据采集 - if (!RuntimeCache.IsHydrophone) - { - HandleCorrelatorData(deviceId, tags); - } - - break; - case 30: - if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) - { - Application.Current.Dispatcher.Invoke(delegate - { - //显示点名弹窗 - if (!RuntimeCache.IsShowing) - { - //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 - _eventAggregator.GetEvent().Publish(); - RuntimeCache.IsShowing = true; - } - }); - } - - break; - case 22543: - if (receiveData[0] == 0xA3 && receiveData[1] == 0x20) - { - int index = receiveData[15]; - //取出seq,确定收到的是第几包数据 - RuntimeCache.SeqCaches.Add(index); - - var response = BitConverter.ToString(receiveData).Replace("-", ""); - //收集数据 - if (deviceId.Equals(DevCode.Dev1)) - { - //原始数据 - RuntimeCache.RedSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.RedSensorResponseTags.Add(index, tags); - } - else - { - //原始数据 - RuntimeCache.BlueSensorOriginalResp.Add(index, response); - //解析之后的数据 - RuntimeCache.BlueSensorResponseTags.Add(index, tags); - } - } - - break; - case 15024: //听音 - HandleListenData(tags); - break; - default: - Console.WriteLine($@"SerialPortServiceImpl => {receiveData.Length}"); - break; - } + if (length < 12) + { + Sp.DiscardInBuffer(); //长度数据不符合,丢弃 + "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); } else { - "SerialPortServiceImpl".WriteLog("接收数据存在问题"); + while (Sp.BytesToRead < length + 2) //数据不够,要等待 + { + Thread.Sleep(20); + } + + var result = new byte[length + 6]; + result[0] = headerBuff[0]; + result[1] = headerBuff[1]; + result[2] = lengthBuffer[0]; + result[3] = lengthBuffer[1]; + Sp.Read(result, 4, result.Length - 4); + + HandleSerialPortBytes(result); } } - private byte[] GetRequestInfo(ref string strResult) + /// + /// 错误数据 + /// + /// + /// + private void ErrorFromSerialPort(object sender, SerialErrorReceivedEventArgs e) { - try - { - while (Sp.BytesToRead < 4) Thread.Sleep(5); - var headerBuff = new byte[2]; - Sp.Read(headerBuff, 0, 2); //读取数据 - if (headerBuff[0] == 0xA3 && headerBuff[1] == 0x20) //符合规范 - { - var lengthBuffer = new byte[2]; - Sp.Read(lengthBuffer, 0, 2); - var length = lengthBuffer.ConvertToInt(); + Console.WriteLine(@"ErrorFromSerialPort => 错误数据"); + } - if (length < 12) + /// + /// 处理串口发过来的数据 + /// + /// + private void HandleSerialPortBytes(byte[] receivedData) + { + // "SerialPortServiceImpl".WriteLog("接收到的数据:" + BitConverter.ToString(receivedData)); + + var versionByte = new byte[1]; + Array.Copy(receivedData, 1, versionByte, 0, 1); + var value = BitConverter.ToString(versionByte); + //版本分两部分,高半字代表版本的整数部分,低半字代表版本的小数部分,比如:0X20==V2.0 + var high = short.Parse(value) / 10; + var low = short.Parse(value) % 10; + var version = $"{high}.{low}"; + // Console.WriteLine($@"协议版本 => {version}"); + + var deviceIdBytes = new byte[6]; + Array.Copy(receivedData, 4, deviceIdBytes, 0, 6); + var deviceId = BitConverter.ToString(deviceIdBytes).Replace("-", ""); + // Console.WriteLine($@"设备ID => {deviceId}"); + + var tagBytes = new byte[receivedData.Length - 18]; + Array.Copy(receivedData, 16, tagBytes, 0, receivedData.Length - 18); + var tags = tagBytes.GetTags(); + // Console.WriteLine($@"Tag数量 => {tags.Count}"); + + switch (receivedData.Length) + { + case 32: //设备状态、电量 + var cellTag = tags.GetCellTag(); + if (cellTag != null) { - Sp.DiscardInBuffer(); //长度数据不符合,丢弃 - "SerialPortServiceImpl".WriteLog("上传数组长度不够,丢弃数据"); - return null; + _devStatus.Cell = cellTag.Cell; } - while (Sp.BytesToRead < length + 2) Thread.Sleep(20); //数据不够,要等待 - - var result = new byte[length + 6]; - result[0] = headerBuff[0]; - result[1] = headerBuff[1]; - result[2] = lengthBuffer[0]; - result[3] = lengthBuffer[1]; - Sp.Read(result, 4, result.Length - 4); - return result; - } - else - { - Thread.Sleep(10); - var str = Encoding.UTF8.GetString(headerBuff) + Sp.ReadExisting(); - if (str != "" && str.Contains("\r\n")) + var sensorExceptionTag = tags.GetSensorExceptionTag(); + if (sensorExceptionTag != null) { - strResult = str; + _devStatus.Status = sensorExceptionTag.State; + } + + //发送消息更新界面 + if (deviceId.Equals(DevCode.Dev1)) + { + _eventAggregator.GetEvent().Publish(_devStatus); } else { - Sp.DiscardInBuffer(); + _eventAggregator.GetEvent().Publish(_devStatus); } - } - return null; - } - catch (Exception ex) - { - "SerialPortServiceImpl".WriteLog($"错误:{ex.Message}"); - Thread.Sleep(2000); - Process.GetCurrentProcess().Kill(); - return null; + break; + case 11293: //数据采集 + if (!RuntimeCache.IsHydrophone) + { + HandleCorrelatorData(deviceId, tags); + } + + break; + case 30: + if (RuntimeCache.IsHydrophone && RuntimeCache.CanCollectData) + { + Application.Current.Dispatcher.Invoke(delegate + { + //显示点名弹窗 + if (!RuntimeCache.IsShowing) + { + //因为是广播发的数据,所以会收到两条回复,但是只需要显示一次对话框 + _eventAggregator.GetEvent().Publish(); + RuntimeCache.IsShowing = true; + } + }); + } + + break; + case 22543: + if (receivedData[0] == 0xA3 && receivedData[1] == 0x20) + { + int index = receivedData[15]; + //取出seq,确定收到的是第几包数据 + RuntimeCache.SeqCaches.Add(index); + + var response = BitConverter.ToString(receivedData).Replace("-", ""); + //收集数据 + if (deviceId.Equals(DevCode.Dev1)) + { + //原始数据 + RuntimeCache.RedSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.RedSensorResponseTags.Add(index, tags); + } + else + { + //原始数据 + RuntimeCache.BlueSensorOriginalResp.Add(index, response); + //解析之后的数据 + RuntimeCache.BlueSensorResponseTags.Add(index, tags); + } + } + + break; + case 15024: //听音 + HandleListenData(tags); + break; } } diff --git a/Correlator/Util/MethodExtensions.cs b/Correlator/Util/MethodExtensions.cs index b7694e4..3452941 100644 --- a/Correlator/Util/MethodExtensions.cs +++ b/Correlator/Util/MethodExtensions.cs @@ -284,30 +284,35 @@ /// /// 字节数组转数据Tag集合 /// - /// + /// /// - public static List GetTags(this byte[] strTags) + public static List GetTags(this byte[] tagBytes) { var tags = new List(); try { var i = 0; - while (i < strTags.Length) + var n = 0; + while (i < tagBytes.Length) { - var oid = new byte[4]; - var len = new byte[2]; - Array.Copy(strTags, i, oid, 0, 4); - Array.Copy(strTags, i + 4, len, 0, 2); + n++; + var oidBytes = new byte[4]; + Array.Copy(tagBytes, i, oidBytes, 0, 4); + var oid = oidBytes.ConvertToString(); + + //value域的长度 + var tagValueBytes = new byte[2]; + Array.Copy(tagBytes, i + 4, tagValueBytes, 0, 2); + Array.Reverse(tagValueBytes); + int tagValueLength = BitConverter.ToInt16(tagValueBytes, 0); + Console.WriteLine($@"value域的长度 => {tagValueLength}"); - Array.Reverse(len); - int iLen = BitConverter.ToInt16(len, 0); - var strOid = oid.ConvertToString(); + var valueBytes = new byte[tagValueLength]; + Array.Copy(tagBytes, i + 6, valueBytes, 0, tagValueLength); + // Console.WriteLine($@"第{n}个Tag => {BitConverter.ToString(valueBytes)}"); - var value = new byte[iLen]; - Array.Copy(strTags, i + 6, value, 0, iLen); - - i = i + 6 + iLen; - var tag = TagFactory.Create(strOid, iLen, value); + i = i + 6 + tagValueLength; + var tag = TagFactory.Create(oid, tagValueLength, valueBytes); tags.Add(tag); } } @@ -546,7 +551,7 @@ configModel.Pipe++; configModel.LocateTimes++; manager.Insert(configModel); - + //清空缓存 RuntimeCache.SoundCaches.Clear(); } diff --git a/Correlator/ViewModels/AudioFileViewModel.cs b/Correlator/ViewModels/AudioFileViewModel.cs index f614c12..5c8b044 100644 --- a/Correlator/ViewModels/AudioFileViewModel.cs +++ b/Correlator/ViewModels/AudioFileViewModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Windows.Controls; using System.Windows.Threading; +using Correlator.DataService; using Correlator.Model; using Correlator.Util; using HandyControl.Controls; @@ -21,7 +22,6 @@ public string Title { get; private set; } = string.Empty; public event Action RequestClose; - private List _totalFiles; private List _audioFiles; @@ -108,7 +108,6 @@ #endregion private AudioFile _selectedFile; - private WaveOutEvent _waveOutEvent = new WaveOutEvent(); private AudioFileReader _audioFileReader; private readonly DispatcherTimer _audioTimer = new DispatcherTimer @@ -116,11 +115,11 @@ Interval = new TimeSpan(0, 0, 0, 1) }; - public AudioFileViewModel(IDialogService dialogService) + public AudioFileViewModel(IAudioService audioService, IDialogService dialogService) { _audioTimer.Tick += delegate { - if (_waveOutEvent.PlaybackState == PlaybackState.Stopped) + if (audioService.Wave.PlaybackState == PlaybackState.Stopped) { _audioTimer.Stop(); AudioState = "未播放"; @@ -144,12 +143,6 @@ _audioFileReader = null; } - if (_waveOutEvent != null) - { - _waveOutEvent.Dispose(); - _waveOutEvent = null; - } - RequestClose?.Invoke(new DialogResult(ButtonResult.Cancel)); }); @@ -173,8 +166,9 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { + audioService.Wave.Stop(); DisposeResource("已暂停"); } else @@ -186,8 +180,8 @@ Max = (int)_audioFileReader.TotalTime.TotalSeconds; AudioState = $"时长:{_max}s"; - _waveOutEvent.Init(_audioFileReader); - _waveOutEvent.Play(); + audioService.Wave.Init(_audioFileReader); + audioService.Wave.Play(); } catch (FormatException) { @@ -215,7 +209,7 @@ return; } - if (_waveOutEvent.PlaybackState == PlaybackState.Playing) + if (audioService.Wave.PlaybackState == PlaybackState.Playing) { dialogService.ShowDialog( "AlertMessageDialog", @@ -233,11 +227,10 @@ File.Delete(_selectedFile.FullPath); //刷新数据 - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - //页码重置 + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); PageIndex = 1; - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) { @@ -247,7 +240,7 @@ PageUpdatedCmd = new DelegateCommand>(args => { - AudioFiles = _totalFiles + AudioFiles = GetTotalAudioFiles() .Skip((args.Info - 1) * RuntimeCache.PerPageItemCount) .Take(RuntimeCache.PerPageItemCount) .ToList(); @@ -256,7 +249,6 @@ private void DisposeResource(string message) { - _waveOutEvent?.Dispose(); _audioFileReader?.Dispose(); _audioTimer?.Stop(); AudioState = message; @@ -273,9 +265,9 @@ public void OnDialogOpened(IDialogParameters parameters) { - _totalFiles = GetTotalAudioFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - AudioFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + var totalFiles = GetTotalAudioFiles(); + MaxPage = totalFiles.Count.GetPageSize(); + AudioFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } private static List GetTotalAudioFiles() diff --git a/Correlator/ViewModels/MainWindowViewModel.cs b/Correlator/ViewModels/MainWindowViewModel.cs index 91e77ea..dce24b5 100644 --- a/Correlator/ViewModels/MainWindowViewModel.cs +++ b/Correlator/ViewModels/MainWindowViewModel.cs @@ -817,7 +817,7 @@ { File.Delete(file); } - + RuntimeCache.SmallAudioFiles.Clear(); _mainWindow.Close(); } @@ -833,13 +833,13 @@ //查看图片列表 OpenImageFileCommand = new DelegateCommand(delegate { - _dialogService.ShowDialog("PictureFileView", null, delegate { }); + _dialogService.Show("PictureFileView", null, delegate { }); }); //查看音频列表 OpenAudioFileCommand = new DelegateCommand(delegate { - _dialogService.ShowDialog("AudioFileView", null, delegate { }); + _dialogService.Show("AudioFileView", null, delegate { }); }); //打开听音 @@ -879,7 +879,7 @@ return; } - _dialogService.ShowDialog("SoundSpeedDialog", + _dialogService.Show("SoundSpeedDialog", new DialogParameters { { "MaterialName", _materialName } }, delegate { }); }); @@ -889,7 +889,7 @@ { if (RuntimeCache.IsHydrophone) { - _dialogService.ShowDialog("ImportResponseDialog", null, delegate(IDialogResult result) + _dialogService.Show("ImportResponseDialog", null, delegate(IDialogResult result) { if (result.Result == ButtonResult.Cancel) { @@ -914,9 +914,11 @@ PipeLength = configModel.PipeLength; LowFrequency = configModel.MinFrequency; HighFrequency = configModel.MaxFrequency; - + //计算声速 - var soundVelocity = _soundSpeedDataService.GetSoundVelocity(_materialName, Convert.ToInt32(_pipeDiameter)); + var soundVelocity = _soundSpeedDataService.GetSoundVelocity( + _materialName, Convert.ToInt32(_pipeDiameter) + ); SoundSpeed = soundVelocity.ToString(); } diff --git a/Correlator/ViewModels/PictureFileViewModel.cs b/Correlator/ViewModels/PictureFileViewModel.cs index 74f86fd..897753b 100644 --- a/Correlator/ViewModels/PictureFileViewModel.cs +++ b/Correlator/ViewModels/PictureFileViewModel.cs @@ -19,7 +19,6 @@ public string Title { get; private set; } = string.Empty; public event Action RequestClose; - private List _totalFiles; private List _pictureFiles; public List PictureFiles @@ -114,11 +113,10 @@ File.Delete(_selectedFile.FullPath); //刷新数据 - _totalFiles = GetTotalPictureFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - //页码重置 + var totalFiles = GetTotalPictureFiles(); + MaxPage = totalFiles.Count.GetPageSize(); PageIndex = 1; - PictureFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + PictureFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } catch (IOException) { @@ -128,7 +126,7 @@ PageUpdatedCmd = new DelegateCommand>(args => { - PictureFiles = _totalFiles + PictureFiles = GetTotalPictureFiles() .Skip((args.Info - 1) * RuntimeCache.PerPageItemCount) .Take(RuntimeCache.PerPageItemCount) .ToList(); @@ -146,9 +144,9 @@ public void OnDialogOpened(IDialogParameters parameters) { - _totalFiles = GetTotalPictureFiles(); - MaxPage = _totalFiles.Count.GetPageSize(); - PictureFiles = _totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); + var totalFiles = GetTotalPictureFiles(); + MaxPage = totalFiles.Count.GetPageSize(); + PictureFiles = totalFiles.Take(RuntimeCache.PerPageItemCount).ToList(); } private static List GetTotalPictureFiles()