/// <summary> /// 当程序崩溃时,保存最后的数据 /// </summary> private void SaveAgingDataWhenAppCrash() { AgingDock dock = null; string fileName = DateTime.Now.ToString("yyyy-MM-dd HH_mm_ss_fff") + ".xlsx"; List <Controller> controllers = null; for (int i = 0; i < m_DockList.Count; i++) { dock = m_DockList[i]; controllers = dock.Controllers; if (controllers == null) { continue; } for (int j = 0; i < controllers.Count; j++) { if (controllers[j] != null) { List <AgingPump> pumpList = controllers[j].SortAgingPumpList(); if (pumpList == null || pumpList.Count == 0) { continue; } else { dock.ExportExcel(fileName); break; } } } } }
private void UploadAlarm(BaseCommand e) { if (e != null && e.RemoteSocket != null) { Controller controller = ControllerManager.Instance().Get(e.RemoteSocket); if (controller != null) { int dockNo = controller.DockNo; AgingDock dock = m_DockList.Find((x) => { return((int)x.Tag == dockNo); });//在每个货架内部保存报警信息 if (dock != null) { dock.UpdateAlarmInfo(e as GetAlarm); } else { Logger.Instance().ErrorFormat("UploadAlarm()->货架没找到 DockNo={0}", dockNo); } } else { IPEndPoint point = e.RemoteSocket.ConnectSocket.RemoteEndPoint as IPEndPoint; byte[] ipByte = point.Address.GetAddressBytes(); long ip = ControllerManager.Bytes2Long(ipByte); Logger.Instance().ErrorFormat("UploadAlarm()->控制器没找到 ip={0}", ip); } } else { Logger.Instance().Error("UploadAlarm()->传入的参数为空"); } }
private void LoadDockList() { m_DockList.Clear(); if (m_DockCount <= 0) { Logger.Instance().Info("机架数量小于等于0,请重新设置。"); return; } int rowCount = m_DockCount / 5; if (m_DockCount % 5 > 0) { rowCount += 1; } for (int i = 0; i < rowCount; i++) { RowDefinition row = new RowDefinition(); row.Height = GridLength.Auto; dockGrid.RowDefinitions.Add(row); } for (int i = 0; i < 5; i++) { ColumnDefinition col = new ColumnDefinition(); col.Width = GridLength.Auto; dockGrid.ColumnDefinitions.Add(col); } for (int i = 0; i < m_DockCount; i++) { AgingDock dock = new AgingDock(); dock.OnConfigrationCompleted += OnConfigrationCompleted; dock.OnPumpSelected += OnPumpSelected; dock.SetTimeOut(m_TimeOut);//设置信号量的等待时间,和命令超时时间一样 if (m_DockCount == 1) { dock.Name = "dock" + m_DockNumber.ToString(); dock.Tag = m_DockNumber; dock.DockNo = m_DockNumber; dock.Margin = new Thickness(10, 10, 10, 10); dock.SetTitle(m_DockNumber.ToString() + "号架"); } else { dock.Name = "dock" + (i + 1).ToString(); dock.Tag = i + 1; dock.DockNo = i + 1; dock.Margin = new Thickness(10, 10, 10, 10); dock.SetTitle((i + 1).ToString() + "号架"); } dockGrid.Children.Add(dock); m_DockList.Add(dock); Grid.SetRow(dock, i / 5); dock.dockGrid.Background = new SolidColorBrush(ColorSet[i / 5]); dock.DefaultColor = ColorSet[i / 5]; Grid.SetColumn(dock, i % 5); } }
/// <summary> /// 当客户端连入时要发送泵类型信息, /// 如果用户尚未配置,则不用发,留到点开始的时候发 /// </summary> /// <param name="e"></param> private void SendPumpType2Wifi(SocketConnectArgs e) { Controller controller = ControllerManager.Instance().Get(e.ConnectedSocket); if (controller == null) { return; } int dockNo = controller.DockNo; AgingDock dock = m_DockList.Find((x) => { return(x.DockNo == dockNo); }); if (dock == null || dock.ChannelHashRowNo == null || !dock.ChannelHashRowNo.ContainsKey(controller.RowNo)) { return; } AgingParameter para = m_DockParameter[dockNo] as AgingParameter; if (para != null) { if (Enum.IsDefined(typeof(ProductID), para.PumpType)) { ProductID pid = (ProductID)Enum.Parse(typeof(ProductID), para.PumpType); CommandManage cmdManager = new CommandManage(); int iChannel = (int)dock.ChannelHashRowNo[controller.RowNo]; byte channel = (byte)(iChannel & 0x000000FF); //一旦收到连接,立即发送泵信息,必须要延迟10秒 cmdManager.SendPumpType(pid, (ushort)m_QueryInterval, e.ConnectedSocket, null, channel); } else { Logger.Instance().ErrorFormat("SendPumpType2Wifi()->para.PumpType is not defined! para.PumpType={0}", para.PumpType); } } else { Logger.Instance().Debug("SendPumpType2Wifi()->DefaultParameter is null"); } }
private void OnConfigrationCompleted(object sender, ConfigrationArgs e) { foreach (DictionaryEntry entry in e.DockParameter) { if (m_DockParameter.ContainsKey(entry.Key)) { m_DockParameter[entry.Key] = new AgingParameter((AgingParameter)entry.Value); } else { m_DockParameter.Add(entry.Key, new AgingParameter((AgingParameter)entry.Value)); } } AgingDock dock = null; for (int i = 0; i < m_DockList.Count; i++) { dock = m_DockList[i]; if (m_DockParameter.ContainsKey(dock.DockNo)) { dock.lbPumpType.Content = "泵型号:" + ((AgingParameter)m_DockParameter[dock.DockNo]).PumpType; } } }
/// <summary> /// 当客户端连入时要发送泵类型信息, /// 如果用户尚未配置,则不用发,留到点开始的时候发 /// </summary> /// <param name="e"></param> private void SendPumpType2Wifi(SocketConnectArgs e) { Controller controller = ControllerManager.Instance().Get(e.ConnectedSocket); if (controller == null) { return; } int dockNo = controller.DockNo; AgingDock dock = m_DockList.Find((x) => { return(x.DockNo == dockNo); }); if (dock == null || dock.ChannelHashRowNo == null || !dock.ChannelHashRowNo.ContainsKey(controller.RowNo)) { return; } AgingParameter para = m_DockParameter[dockNo] as AgingParameter; if (para != null) { CustomProductID cid = ProductIDConvertor.Name2CustomProductID(para.PumpType); ProductID pid = ProductIDConvertor.Custom2ProductID(cid); CommandManage cmdManager = new CommandManage(); int iChannel = (int)dock.ChannelHashRowNo[controller.RowNo]; byte channel = (byte)(iChannel & 0x000000FF); //一旦收到连接,立即发送泵信息,必须要延迟10秒 if (pid == ProductID.Graseby1200En)//英文版的ID和中文的一样 { pid = ProductID.Graseby1200; } cmdManager.SendPumpType(pid, (ushort)m_QueryInterval, e.ConnectedSocket, null, channel); } else { Logger.Instance().Debug("SendPumpType2Wifi()->DefaultParameter is null"); } }
/// <summary> /// 当客户端l连入或断开时要更新主界面 /// </summary> /// <param name="e"></param> private void SocketConnectOrClose(SocketConnectArgs e) { Controller controller = ControllerManager.Instance().Get(e.ConnectedSocket); if (controller == null) { return; } int dockNo = controller.DockNo; AgingDock dock = null; for (int i = 0; i < m_DockList.Count; i++) { dock = m_DockList[i]; if (dock.DockNo == dockNo) { if (e.Connected == true) { #region //如果已经开始老化了,新的控制器不准连入,但是如果是偶然断开重连的除外 if (dock.IsStartAging) { //这里主要是通过连接时间戳判断的 if (controller.SocketConnectTimestamp.Year > 2000) { controller.SocketConnectTimestamp = DateTime.Now; } else { if (controller.SocketToken != null && controller.SocketToken.ConnectSocket != null) { AsyncServer.Instance().CloseClientSocketEx(controller.SocketToken); } //controller.SocketToken.ConnectSocket.Shutdown(SocketShutdown.Both); else { Logger.Instance().ErrorFormat("SocketConnectOrClose() Error,编号为{0}的控制器SocketToken为null", dockNo); } break; } } else { controller.SocketConnectTimestamp = DateTime.Now; } SolidColorBrush brush = dock.dockGrid.Background as SolidColorBrush; switch (dock.AgingStatus) { case EAgingStatus.Unknown: case EAgingStatus.Waiting: dock.dockGrid.Background = new SolidColorBrush(Colors.Blue); dock.AgingStatus = EAgingStatus.PowerOn; break; case EAgingStatus.PowerOn: dock.dockGrid.Background = new SolidColorBrush(Colors.Blue); break; case EAgingStatus.Charging: case EAgingStatus.DisCharging: case EAgingStatus.Recharging: dock.dockGrid.Background = new SolidColorBrush(Colors.Yellow); break; case EAgingStatus.AgingComplete: dock.dockGrid.Background = new SolidColorBrush(Colors.Green); break; case EAgingStatus.Alarm: //出现除低电和耗尽以外的报警时提示红色 dock.dockGrid.Background = new SolidColorBrush(Colors.Red); break; default: break; } dock.lbStatus.Content = AgingStatusMetrix.Instance().GetAgingStatus(dock.AgingStatus); List <Controller> controllers = ControllerManager.Instance().Get(dockNo); int clientCount = controllers.Count((x) => { return(x.SocketToken != null && x.SocketToken.ConnectSocket != null && x.SocketToken.ConnectSocket.Connected == true); }); dock.lbWifiCount.Content = string.Format("控制器数量:{0}/5", clientCount); #endregion } else { #region List <Controller> controllers = ControllerManager.Instance().Get(dockNo); int clientCount = controllers.Count((x) => { return(x.SocketToken != null && x.SocketToken != e.ConnectedSocket && x.SocketToken.ConnectSocket != null && x.SocketToken.ConnectSocket.Connected == true); }); dock.lbWifiCount.Content = string.Format("控制器数量:{0}/5", clientCount); //int index = controllers.FindIndex((x) => { return x.SocketToken != null && x.SocketToken != e.ConnectedSocket;}); if (clientCount <= 0) { //dock.AgingStatus = EAgingStatus.Waiting; dock.dockGrid.Background = new SolidColorBrush(dock.DefaultColor); dock.lbStatus.Content = "等待接入"; break; } #endregion } break; } } }