using NNanomsg;
using NNanomsg.Protocols;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Google.Protobuf;
using Message;
using tool;
using Newtonsoft.Json.Linq;
using System.Runtime.InteropServices;
using communication_base;
namespace monitor_main_windows
{
class Monitor_communication : communication_base.Communication_socket_base
{
//由于C#不能多继承 就只能直接写成单例模式了
///
/// 单例
///
class Nested
{
// 创建模板类实例,参数2设为true表示支持私有构造函数
internal static readonly Monitor_communication instance = Activator.CreateInstance(typeof(Monitor_communication), true) as Monitor_communication;
}
private static Monitor_communication instance = null;
public static Monitor_communication Instance
{
get
{
return Nested.instance;
}
}
// 各类消息委托,收到对应消息即调用对应委托/回调
public delegate void parkspaceStatusDelegate(Parkspace_allocation_data_msg parkspace_status);
public delegate void parkspaceForceUpdateResponseDelegate(Parkspace_force_update_response_msg response);
public delegate void parkspace_manual_search_ResponseDelegate(Parkspace_manual_search_response_msg response);
//停车流程进度消息
public delegate void storing_process_statu_msgDelegate(Storing_process_statu_msg response);
//取车流程进度消息
public delegate void picking_process_statu_msgDelegate(Picking_process_statu_msg response);
// 对应委托/回调句柄
private parkspaceStatusDelegate m_parkspaceStatusCallback;
private parkspaceForceUpdateResponseDelegate m_parkspaceForceUpdateResponseCallback;
private parkspace_manual_search_ResponseDelegate m_parkspacemanual_search_Callback;
private storing_process_statu_msgDelegate m_storing_process_statu_Callback;
private picking_process_statu_msgDelegate m_picking_process_statu_Callback;
// 对应委托/回调句柄设置函数
public void SetParkspaceStatusDelegate(parkspaceStatusDelegate callback)
{
m_parkspaceStatusCallback = callback;
}
public void SetParkspaceForceUpdateResponseDelegate(parkspaceForceUpdateResponseDelegate callback)
{
m_parkspaceForceUpdateResponseCallback = callback;
}
public void SetParkspace_manual_search_ResponseDelegate(parkspace_manual_search_ResponseDelegate callback)
{
m_parkspacemanual_search_Callback = callback;
}
public void SetStoring_process_statu_msgDelegate(storing_process_statu_msgDelegate callback)
{
m_storing_process_statu_Callback = callback;
}
public void SetPicking_process_statu_msgDelegate(picking_process_statu_msgDelegate callback)
{
m_picking_process_statu_Callback = callback;
}
private Monitor_communication()
{
m_parkspace_status_access_lock = new object();
// 设置车位状态回调
SetParkspaceStatusDelegate(ParkspaceStatusUpdate);
}
///
/// 初始化
///
///
public void monitor_communication_init()
{
base.communication_init();
}
///
/// 反初始化
///
///
public void monitor_communication_uninit()
{
base.communication_uninit();
}
///
/// 车位更新回调内部定义
///
///
private void ParkspaceStatusUpdate(Parkspace_allocation_data_msg parkspace_status)
{
lock (m_parkspace_status_access_lock)
{
m_parkspace_data_msg = parkspace_status;
//comm.m_parkspace_current_status.MergeFrom(parkspace_status);
m_last_parkspace_status_time = DateTime.Now;
}
}
///
/// 获取当前车位状态
///
public bool Get_parkspace_status(ref Parkspace_allocation_data_msg msg)
{
lock (m_parkspace_status_access_lock)
{
msg = new Parkspace_allocation_data_msg();
msg.MergeFrom(m_parkspace_data_msg);
}
if ((DateTime.Now - m_last_parkspace_status_time).TotalMilliseconds > m_timeout_milli)
{
return false;
}
else
{
return true;
}
}
//重载检查消息--检查是否给终端的消息
///
/// 检查消息
///
///
///
public override bool check_msg(ByteString message)
{
return true;
}
///
/// 检查执行器状态
///
///
///
///
public override bool check_executer()
{
return base.check_executer();
}
///
/// 检查连接状态
///
///
///
///
public bool check_connect()
{
if ((DateTime.Now.Ticks / 10000 - m_recv_parkspace_status_time.Ticks / 10000) > m_timeout_milli)
{
return false;
}
else
{
return true;
}
}
///
/// 发送消息
///
///
public override void encapsulate_msg(ByteString msg)
{
base.encapsulate_msg(msg);
}
///
/// 定时封装发送消息, 一般为心跳和状态信
///
public override void encapsulate_send_data()
{
Parkspace_refresh_request_msg t_refresh_req = new Parkspace_refresh_request_msg();
t_refresh_req.BaseInfo = new Base_info();
t_refresh_req.BaseInfo.MsgType = Message_type.EParkspaceRefreshRequestMsg;
t_refresh_req.BaseInfo.TimeoutMs = 5000;
t_refresh_req.BaseInfo.Sender = Message.Communicator.EEmpty;
t_refresh_req.BaseInfo.Receiver = Message.Communicator.EParkspace;
encapsulate_msg(t_refresh_req.ToByteString());
// Console.WriteLine(terminal_Status_Msg.ToString());
}
//重载处理消息
public override void execute_msg(ByteString messgae)
{
Base_msg base_msg = new Base_msg();
try
{
base_msg = Base_msg.Parser.ParseFrom(messgae);
}
catch (Exception ex)
{
Console.WriteLine("message analysis error ! ");
}
if (base_msg.BaseInfo != null)
{
switch (base_msg.BaseInfo.MsgType)
{
//车位数据反馈消息
case Message_type.EParkspaceAllocationDataResponseMsg:
{
Parkspace_allocation_data_msg parkspace_status_msg = Parkspace_allocation_data_msg.Parser.ParseFrom(messgae);
m_parkspaceStatusCallback?.Invoke(parkspace_status_msg);
}
break;
//手动修改车位反馈消息
case Message_type.EParkspaceForceUpdateResponseMsg:
{
Parkspace_force_update_response_msg parkspace_force_update_msg = Parkspace_force_update_response_msg.Parser.ParseFrom(messgae);
m_parkspaceForceUpdateResponseCallback?.Invoke(parkspace_force_update_msg);
}
break;
//手动查询车位反馈消息
case Message_type.EParkspaceManualSearchResponseMsg:
{
Parkspace_manual_search_response_msg parkspace_Manual_Search_Response_Msg = Parkspace_manual_search_response_msg.Parser.ParseFrom(messgae);
m_parkspacemanual_search_Callback?.Invoke(parkspace_Manual_Search_Response_Msg);
}
break;
//数据库状态消息,包括车位信息
case Message_type.EParkspaceAllocationStatusMsg:
{
m_recv_parkspace_status_time = DateTime.Now;
Parkspace_allocation_data_msg parkspace_allocation_data_msg = Parkspace_allocation_data_msg.Parser.ParseFrom(messgae);
if (parkspace_allocation_data_msg.ErrorManager.ErrorCode == 0)
{
UIMessageData.Instance.DatabaseNodeStatu = UIMessageData.NodeStatu.Normal;
}
else
{
UIMessageData.Instance.DatabaseNodeStatu = UIMessageData.NodeStatu.Error;
}
}
break;
//停车指令进度条消息
case Message_type.EStoringProcessStatuMsg:
{
Storing_process_statu_msg storing_Process_Statu_Msg = Storing_process_statu_msg.Parser.ParseFrom(messgae);
m_storing_process_statu_Callback?.Invoke(storing_Process_Statu_Msg);
}
break;
//取车指令进度条消息
case Message_type.EPickingProcessStatuMsg:
{
Picking_process_statu_msg picking_Process_Statu_Msg = Picking_process_statu_msg.Parser.ParseFrom(messgae);
m_picking_process_statu_Callback?.Invoke(picking_Process_Statu_Msg);
}
break;
//中控系统状态消息
case Message_type.ECentralControllerStatuMsg:
{
UIMessageData.Instance.MainNodeStatu = UIMessageData.NodeStatu.Normal;
}
break;
//出口LED系统状态消息
case Message_type.ENotifyStatusMsg:
{
UIMessageData.Instance.OutputUnnormalNodeStatu = UIMessageData.NodeStatu.Normal;
}
break;
//调度模块硬件状态消息
case Message_type.EDispatchStatusMsg:
{
Dispatch_terminal_status_msg dispatch_Terminal_Status_Msg = Dispatch_terminal_status_msg.Parser.ParseFrom(messgae);
UIMessageData.NodeStatu nodeStatu = UIMessageData.NodeStatu.Error;
if (dispatch_Terminal_Status_Msg.TerminalStatus != Terminal_status.ETerminalFault &&
dispatch_Terminal_Status_Msg.TerminalStatus != Terminal_status.ETerminalUnknow)
{
nodeStatu = UIMessageData.NodeStatu.Normal;
}
else
{
nodeStatu = UIMessageData.NodeStatu.Error;
}
switch (dispatch_Terminal_Status_Msg.IdStruct.UnitId)
{
case 0:
{
UIMessageData.Instance.PLCStatuA = nodeStatu;
}
break;
case 1:
{
UIMessageData.Instance.PLCStatuB = nodeStatu;
}
break;
case 2:
{
UIMessageData.Instance.PLCStatuC = nodeStatu;
}
break;
default:
break;
}
}
break;
//终端状态消息
case Message_type.ETerminalStatusMsg:
{
Terminal_status_msg terminal_Status_Msg = Terminal_status_msg.Parser.ParseFrom(messgae);
//Console.WriteLine(terminal_Status_Msg.ToString());
switch (terminal_Status_Msg.IdStruct.TerminalId)
{
case 0:
{
UIMessageData.Instance.TerminalStatuA1 = UIMessageData.NodeStatu.Normal;
}
break;
case 1:
{
UIMessageData.Instance.TerminalStatuA2 = UIMessageData.NodeStatu.Normal;
}
break;
case 2:
{
UIMessageData.Instance.TerminalStatuB1 = UIMessageData.NodeStatu.Normal;
}
break;
case 3:
{
UIMessageData.Instance.TerminalStatuB2 = UIMessageData.NodeStatu.Normal;
}
break;
case 4:
{
UIMessageData.Instance.TerminalStatuC1 = UIMessageData.NodeStatu.Normal;
}
break;
case 5:
{
UIMessageData.Instance.TerminalStatuC2 = UIMessageData.NodeStatu.Normal;
}
break;
case 6:
{
UIMessageData.Instance.OutputTerminal1Statu = UIMessageData.NodeStatu.Normal;
}
break;
case 7:
{
UIMessageData.Instance.OutputTerminal2Statu = UIMessageData.NodeStatu.Normal;
}
break;
default:
break;
}
}
break;
//地面雷达状态消息
case Message_type.EGroundStatusMsg:
{
Ground_status_msg ground_Statu_Msg = Ground_status_msg.Parser.ParseFrom(messgae);
UIMessageData.NodeStatu nodeStatu = UIMessageData.NodeStatu.Error;
if (ground_Statu_Msg.ErrorManager.ErrorLevel == Error_level.MinorError ||
ground_Statu_Msg.ErrorManager.ErrorLevel == Error_level.NegligibleError ||
ground_Statu_Msg.ErrorManager.ErrorCode == 0)
{
nodeStatu = UIMessageData.NodeStatu.Normal;
}
else
{
nodeStatu = UIMessageData.NodeStatu.Error;
}
switch (ground_Statu_Msg.IdStruct.TerminalId)
{
case 0:
{
UIMessageData.Instance.LidarStatuA1 = nodeStatu;
}
break;
case 1:
{
UIMessageData.Instance.LidarStatuA2 = nodeStatu;
}
break;
case 2:
{
UIMessageData.Instance.LidarStatuB1 = nodeStatu;
}
break;
case 3:
{
UIMessageData.Instance.LidarStatuB2 = nodeStatu;
}
break;
case 4:
{
UIMessageData.Instance.LidarStatuC1 = nodeStatu;
}
break;
case 5:
{
UIMessageData.Instance.LidarStatuC2 = nodeStatu;
}
break;
default:
break;
}
}
break;
default:
//Console.WriteLine("unrecognized message received");
break;
}
}
}
private DateTime m_recv_parkspace_status_time; //接收车位状态时间
private Parkspace_allocation_data_msg m_parkspace_data_msg; //车位数据
///
/// 车位状态访问锁
///
private object m_parkspace_status_access_lock;
///
/// 当前时间
///
private DateTime m_last_parkspace_status_time;
public int m_timeout_milli = 3000;
}
}