using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using BroadcastModule;
using db;
using MySql.Data.MySqlClient;
using NumMachine;
using parkMonitor.LOG;
using parkMonitor.tools;
using PLCS7;
using S7.Net;
using Terminal;
using WebServer;
namespace Monitor
{
internal class SystemInitializer
{
///
/// 初始化各模块
///
///
internal void Init(IntPtr flpHandle)
{
Log.WriteLog(LogType.process, LogFile.INFO, "***************** 初始化开始 ****************");
bool initStatus = false;
int retryCount = 0;
string remoteDBConnStr, localDBConnStr;
int DBtimeout;
MyTimer mt = new MyTimer();
mt.StartTiming();
try
{
retryCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("retryCount"));
//数据库
remoteDBConnStr = ConfigurationManager.AppSettings.Get("remoteDBConnStr");
localDBConnStr = ConfigurationManager.AppSettings.Get("localDBConnStr");
DBtimeout = Convert.ToInt32(ConfigurationManager.AppSettings.Get("DBtimeout"));
//plc
Monitor.plcIPAddr = ConfigurationManager.AppSettings.Get("plcIpAddress");
Monitor.plcRack = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcRack"));
Monitor.plcSlot = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcSlot"));
Monitor.plcDatablockConfig = ConfigurationManager.AppSettings.Get("plcDatablockId").Split(',');
Monitor.plcTerminalCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcTerminalCount"));
Monitor.plcParkingSpaceCount = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcParkingSpaceCount"));
Monitor.plcRefreshInterval = Convert.ToInt32(ConfigurationManager.AppSettings.Get("plcRefreshInterval"));
//显示屏
Monitor.allInOneMachineIP = ConfigurationManager.AppSettings.Get("allInOneMachineIP");
Monitor.allInOneMachinePort = Convert.ToInt32(ConfigurationManager.AppSettings.Get("allInOneMachinePort"));
//webServer端口
Monitor.webPort = Convert.ToInt32(ConfigurationManager.AppSettings.Get("webPort"));
Monitor.garageID = Convert.ToInt32(ConfigurationManager.AppSettings.Get("garageID"));
//配置文件读取结束,进入状态1
Monitor.initializeState = 1;
initStatus = true;
}
catch (Exception e) { Console.WriteLine("初始化," + e.Message); return; }
initStatus = initStatus && PLCInit(retryCount);
//PLC初始化结束,进入状态2
if (!initStatus) { return; }
else { Monitor.initializeState = 2; }
//初始化数据库对象
Monitor.remoteDBOper = new DBOperation(remoteDBConnStr, DBtimeout);
Monitor.localDBOper = new DBOperation(localDBConnStr, DBtimeout);
initStatus = initStatus && Monitor.remoteDBOper.InitConnPooling(10);
initStatus = initStatus && Monitor.localDBOper.InitConnPooling(10);
//数据库初始化结束,进入状态3
if (!initStatus) { return; }
else { Monitor.initializeState = 3; }
//初始化web对象
Monitor.webServer = new CentralForWeb();
initStatus = initStatus && Monitor.webServer.Start(Monitor.webPort);
//webServer初始化结束,进入状态4
if (!initStatus) { return; }
else { Monitor.initializeState = 4; }
#region 测试数据库操作
////*******测试数据库操作
//string sql = "select * from parkingrecords where userID = 1;";
//MySqlDataReader reader = null;
//object[] objs = null;
//try
//{
// reader = Monitor.remoteDBOper.Query(sql);
// if (reader != null && reader.Read())
// {
// objs = new object[reader.FieldCount];
// reader.GetValues(objs);
// Console.WriteLine("-------------");
// for (int i = 0; i < objs.Length; i++)
// {
// Console.WriteLine(objs[i] + ",");
// }
// }
//}
//catch (Exception e) { Console.WriteLine(e.Message); }
//string updateParkingRecordsSql = "update parkingrecords set parkingRecordsState = 6,realGetTime = '"
// + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "',parkingPrice = '233' where receiptNum='11221122';";
//List list = new List();
//list.Add(updateParkingRecordsSql);
//Monitor.localDBOper.UpdateTransaction(list);
#endregion
//初始化计费策略
PaymentScheme.ins = PaymentScheme.GetCurrentPaymentScheme(1);
//初始化号牌机对象
Monitor.numMachineLinker = new NumMachineLinker(flpHandle);
Monitor.numMachineLinker.Start();
//初始化显示板对象,显示板udp面向无连接
Monitor.allInOneMachine = new BroadcastBoard(Monitor.allInOneMachineIP, Monitor.allInOneMachinePort);
//Monitor.allInOneMachine.UpdateTime();
//Monitor.allInOneMachine.Play(0, BroadcastBoard.PlayMode.download, "欢迎光临");
//Monitor.allInOneMachine.Play(1, BroadcastBoard.PlayMode.download, "智象停车");
//Monitor.allInOneMachine.Play(2, BroadcastBoard.PlayMode.download, "date");
//Monitor.allInOneMachine.Play(3, BroadcastBoard.PlayMode.download, "time");
//Monitor.allInOneMachine.Refresh();
Terminal.Terminal.Start();
//系统初始化结束,进入状态5
if (!initStatus) { return; }
else { Monitor.initializeState = 5; }
mt.EndTiming();
Console.WriteLine("初始化耗时:" + mt.GetInterval().TotalSeconds);
Log.WriteLog(LogType.process, LogFile.INFO, "初始化完成");
switch (Monitor.initializeState)
{
case 0:
Console.WriteLine("配置文件读写异常");
break;
case 1:
Console.WriteLine("PLC初始化异常");
break;
case 2:
Console.WriteLine("数据库初始化异常");
break;
case 3:
Console.WriteLine("webServer初始化异常");
break;
case 4:
Console.WriteLine("其他异常");
break;
case 5:
Console.WriteLine("初始化成功");
break;
}
}
///
/// PLC初始化与连接
///
///
///
internal bool PLCInit(int retryCount)
{
int temp = retryCount;
//初始化PLC对象
while (temp-- > 0)
{
if (Monitor.PLC == null)
{
Monitor.PLC = new PLCLinker(CpuType.S71500, Monitor.plcIPAddr, (short)Monitor.plcRack, (short)Monitor.plcSlot,
Int32.Parse(Monitor.plcDatablockConfig[0]), Int32.Parse(Monitor.plcDatablockConfig[1]), Int32.Parse(Monitor.plcDatablockConfig[2]),
Monitor.plcTerminalCount, Monitor.plcParkingSpaceCount);
}
else if (Monitor.PLC.isConnected)
{
return true;
}
else { Monitor.PLC.PLCConnect(); }
}
return false;
}
///
/// 系统关闭
///
internal void Stop()
{
//关闭号牌机
if (Monitor.numMachineLinker != null) { Monitor.numMachineLinker.Stop(); }
//关闭webServer
if (Monitor.webServer != null) { Monitor.webServer.Stop(); }
//关闭数据库
if (Monitor.remoteDBOper != null) { Monitor.remoteDBOper.DBClose(); }
if (Monitor.localDBOper != null) { Monitor.localDBOper.DBClose(); }
Terminal.Terminal.Stop();
}
}
}