using InSituLaboratory.Common;
using InSituLaboratory.Controls;
using InSituLaboratory.Entities;
using InSituLaboratory.Entities.Sensor;
using InSituLaboratory.IService;
using InSituLaboratory.IService.Sensor;
using InSituLaboratory.Models.Sendsor;
using InSituLaboratory.Service;
using InSituLaboratory.Service.Sensor;
using Prism.Commands;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Markup;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace InSituLaboratory.ViewModels.Pages
{
///
/// 局部电源开关控制
///
public class RelayViewModel : ViewModelBase
{
#region Entity
public ClientModel clientModel { get; set; } = new ClientModel();
public SysSensorModel sysSensorModel { get; set; } = new SysSensorModel();
public SysSensorModels sysSensorModels { get; set; } = new SysSensorModels();
public LogModel logModel { get; set; }
public ObservableCollection loglist { get; set; } = new ObservableCollection();
public PaginationModel PaginationModel { get; set; } = new PaginationModel();
public static SocketInfo SocketInfo { get; set; } = new SocketInfo()
{
IP = tools.GetAppSetting("IP"),
Port = Convert.ToInt32(tools.GetAppSetting("Port")),
ConnectionMessage = "连接"
};
#endregion
public DelegateCommand RelayCommand { get; set; }
ILogService _logService;
ISensorService _sensorService;
public RelayViewModel(IRegionManager regionManager, ILogService logService, ISensorService sensorService) : base(regionManager)
{
this.PageTitle = "通信与电源控制";
_logService = logService;
_sensorService = sensorService;
PaginationModel.NavCommand = new DelegateCommand(index =>
{
PaginationModel.PageIndex = int.Parse(index.ToString());
this.Refresh();
});
RelayCommand = new DelegateCommand(DoRelay);
this.Refresh();
}
///
/// 数据刷新
///
public override void Refresh()
{
loglist.Clear();
var Loglist = _logService.GetLogData(SearchKey, PaginationModel.PageSize, PaginationModel.PageIndex, out int totalCount);
var SysSensorlist = _sensorService.GeSysSensor();
///列表清单数据
int index = 0;
foreach (var item in Loglist)
{
index++;
loglist.Add(new LogModel
{
DataIdNum = index + (PaginationModel.PageIndex - 1) * PaginationModel.PageSize,
CreateTime = item.CreateTime,
Remark = item.Remark
});
}
///状态监控
if (SysSensorlist.Count() != 0)
{
var data = _sensorService.GeSysSensor().FirstOrDefault();
sysSensorModel.Id = sysSensorModels.Id = data.Id;
sysSensorModel.CreateTime = sysSensorModels.CreateTime = data.CreateTime;
sysSensorModel.InComputer = sysSensorModels.InComputer = data.InComputer;
sysSensorModel.Light1 = sysSensorModels.Light1 = data.Light1;
sysSensorModel.Light2 = sysSensorModels.Light2 = data.Light2;
sysSensorModel.LightMachine = sysSensorModels.LightMachine = data.LightMachine;
sysSensorModel.ADCP = sysSensorModels.ADCP = data.ADCP;
sysSensorModel.CTD = sysSensorModels.CTD = data.CTD;
sysSensorModel.SP = sysSensorModels.SP = data.SP;
sysSensorModel.CH4 = sysSensorModels.CH4 = data.CH4;
sysSensorModel.CO2 = sysSensorModels.CO2 = data.CO2;
sysSensorModel.NetEquipment = sysSensorModels.NetEquipment = data.NetEquipment;
sysSensorModel.SerialPortServer = sysSensorModels.SerialPortServer = data.SerialPortServer;
sysSensorModel.RamanAnalyzer = sysSensorModels.RamanAnalyzer = data.RamanAnalyzer;
sysSensorModel.ZP = sysSensorModels.ZP = data.ZP;
sysSensorModel.AcousticPositioning = sysSensorModels.AcousticPositioning = data.AcousticPositioning;
sysSensorModel.Camera1 = sysSensorModels.Camera1 = data.Camera1;
sysSensorModel.Camera2 = sysSensorModels.Camera2 = data.Camera2;
sysSensorModel.ElectricSwitch2 = sysSensorModels.ElectricSwitch2 = data.ElectricSwitch2;
}
// 刷新分页组件的页码
PaginationModel.FillPageNumbers(totalCount);
}
///
/// 通信连接
///
///
public override void DoConnection(object o)
{
if (clientModel.IsConnected)
{
clientModel.DisConnect();
SocketInfo.ConnectionMessage = "连接";
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端连接已关闭";
_logService.Insert(logModel);
this.Refresh();
}
else
{
if (clientModel.DoConnect(SocketInfo))
{
//更新下App.config中的配置信息
tools.UpdateAppSettings("IP", SocketInfo.IP);
tools.UpdateAppSettings("Port", SocketInfo.Port.ToString());
SocketInfo.ConnectionMessage = "断开";
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "连接服务端成功";
_logService.Insert(logModel);
this.Refresh();
}
else
{
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "连接服务端失败";
_logService.Insert(logModel);
this.Refresh();
}
}
}
public void DoRelay(object o)
{
string[] msg = o.ToString().Split(',');
int switchNum = msg[1].Equals("True") ? 1 : 0;
string MessageContent = "";
switch (msg[0])
{
//工控机
case "InComputer":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.InComputer = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "工控机已" + sysSensorModel.InComputer;
_logService.Insert(logModel);
if (sysSensorModel.InComputer == "开")
{
Control(0x00, 0x01);
}
else
{
Control(0x00, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//灯1
case "Light1":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.Light1 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "灯1已" + sysSensorModel.Light1;
_logService.Insert(logModel);
if (sysSensorModel.Light1 == "开")
{
Control(0x01, 0x01);
}
else
{
Control(0x01, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//灯2
case "Light2":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.Light2 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "灯2已" + sysSensorModel.Light2;
_logService.Insert(logModel);
if (sysSensorModel.Light2 == "开")
{
Control(0x02, 0x01);
}
else
{
Control(0x02, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//光通讯机
case "LightMachine":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.LightMachine = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "光通讯机已" + sysSensorModel.LightMachine;
_logService.Insert(logModel);
if (sysSensorModel.LightMachine == "开")
{
Control(0x03, 0x01);
}
else
{
Control(0x03, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//ADCP
case "ADCP":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.ADCP = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "ADCP已" + sysSensorModel.ADCP;
_logService.Insert(logModel);
if (sysSensorModel.ADCP == "开")
{
Control(0x04, 0x01);
}
else
{
Control(0x04, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//CTD
case "CTD":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.CTD = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "CTD已" + sysSensorModel.CTD;
_logService.Insert(logModel);
if (sysSensorModel.CTD == "开")
{
Control(0x05, 0x01);
}
else
{
Control(0x05, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//气相色谱仪
case "SP":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.SP = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "气相色谱仪已" + sysSensorModel.SP;
_logService.Insert(logModel);
if (sysSensorModel.SP == "开")
{
Control(0x06, 0x01);
}
else
{
Control(0x06, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//甲烷传感器
case "CH4":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.CH4 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "甲烷传感器已" + sysSensorModel.CH4;
_logService.Insert(logModel);
if (sysSensorModel.CH4 == "开")
{
Control(0x07, 0x01);
}
else
{
Control(0x07, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//二氧化碳同位素分析仪
case "CO2":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.CO2 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "二氧化碳同位素分析仪已" + sysSensorModel.CO2;
_logService.Insert(logModel);
if (sysSensorModel.CO2 == "开")
{
Control(0x08, 0x01);
}
else
{
Control(0x08, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//备用网口设备
case "NetEquipment":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.NetEquipment = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "备用网口设备已" + sysSensorModel.NetEquipment;
_logService.Insert(logModel);
if (sysSensorModel.NetEquipment == "开")
{
Control(0x09, 0x01);
}
else
{
Control(0x09, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//串口服务器
case "SerialPortServer":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.SerialPortServer = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "串口服务器已" + sysSensorModel.SerialPortServer;
_logService.Insert(logModel);
if (sysSensorModel.SerialPortServer == "开")
{
Control(0x0a, 0x01);
}
else
{
Control(0x0a, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//显微拉曼分析仪
case "RamanAnalyzer":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.RamanAnalyzer = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "显微拉曼分析仪已" + sysSensorModel.RamanAnalyzer;
_logService.Insert(logModel);
if (sysSensorModel.RamanAnalyzer == "开")
{
Control(0x0b, 0x01);
}
else
{
Control(0x0b, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//质谱仪
case "ZP":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.ZP = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "质谱仪已" + sysSensorModel.ZP;
_logService.Insert(logModel);
if (sysSensorModel.ZP == "开")
{
Control(0x0c, 0x01);
}
else
{
Control(0x0c, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
// 声学定位
case "AcousticPositioning":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.AcousticPositioning = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "声学定位已" + sysSensorModel.AcousticPositioning;
_logService.Insert(logModel);
if (sysSensorModel.AcousticPositioning == "开")
{
Control(0x0d, 0x01);
}
else
{
Control(0x0d, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//摄像1
case "Camera1":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.Camera1 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "摄像1已" + sysSensorModel.Camera1;
_logService.Insert(logModel);
if (sysSensorModel.Camera1 == "开")
{
Control(0x0e, 0x01);
}
else
{
Control(0x0e, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//摄像2
case "Camera2":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.Camera2 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "摄像2已" + sysSensorModel.Camera2;
_logService.Insert(logModel);
if (sysSensorModel.Camera2 == "开")
{
Control(0x0f, 0x01);
}
else
{
Control(0x0f, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
//电交换机2
case "ElectricSwitch2":
if (SocketInfo.ConnectionMessage == "断开")
{
sysSensorModel.Id = sysSensorModels.Id;
sysSensorModel.ElectricSwitch2 = msg[1].Equals("True") ? "开" : "关";
sysSensorModel.CreateTime = DateTime.Now;
_sensorService.Update(sysSensorModel);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "电交换机2已" + sysSensorModel.ElectricSwitch2;
_logService.Insert(logModel);
if (sysSensorModel.ElectricSwitch2 == "开")
{
Control(0x10, 0x01);
}
else
{
Control(0x10, 0x00);
}
}
else
{
System.Windows.Forms.MessageBox.Show("请先连接服务端!", "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
logModel = new LogModel();
logModel.CreateTime = DateTime.Now;
logModel.Remark = "服务端未连接";
_logService.Insert(logModel);
}
this.Refresh();
break;
default:
break;
}
}
///
/// 远程控制
///
/// 传感器识别码
/// 操作
private void Control(byte kind, byte operation)
{
//标志位
byte head = 0x7f;
//crc
byte nr_crc = 0;
//消息体
byte[] byteaq = new byte[] { 0x92, 0x01, 0x10, 0x01, 0x00, 0x00, 0x00, 0x02, kind, operation };
nr_crc = tools.CRC(byteaq.ToArray(), 0, byteaq.Length);
///转义
int j = 0;
List tBuffer = byteaq.ToList();
tBuffer.Add(nr_crc);
int length = tBuffer.ToArray().Length;
byte[] newAnswer = tBuffer.ToArray();
for (int i = 0; i < length; i++)
{
if (newAnswer[i] == 0x7e || newAnswer[i] == 0x7f)
{
j++;
}
}
byte[] newSendBuffer = new byte[length + j];
for (int i = 0; i < length; i++)
{
newSendBuffer[i] = newAnswer[i];
}
for (int i = 0; i < length + j; i++)
{
if (newSendBuffer[i] == 0x7e)
{
for (int k = length + j - 1; k > i + 1; k--)
{
newSendBuffer[k] = newSendBuffer[k - 1];
}
newSendBuffer[i + 1] = 0x01;
}
if (newSendBuffer[i] == 0x7f)
{
newSendBuffer[i] = 0x7e;
for (int k = length + j - 1; k > i + 1; k--)
{
newSendBuffer[k] = newSendBuffer[k - 1];
}
newSendBuffer[i + 1] = 0x02;
}
}
List buffer = new List();
buffer.Add(head);
for (int i = 0; i < newSendBuffer.Length; i++)
{
buffer.Add(newSendBuffer[i]);
}
buffer.Add(head);
string list = tools.byteToHexStr(buffer.ToArray());
byte[] bytea = tools.ConvertHexStringToBytes(list);
clientModel.SendData(bytea);
}
}
}