//using System;
//using System.Collections.Generic;
//using System.Linq;
//using System.Text;
//using System.Threading.Tasks;
//using parkMonitor.DB;
//using parkMonitor.LOG;
//using parkMonitor.entity;
//using parkMonitor.model;
//using System.Configuration;
//using System.Threading;
//using parkMonitor.server.uiLogServer;

//namespace parkMonitor.server.CoreThread
//{
//    class CoreThreadTest : IEquipments, ICoreThreadDoWorking
//    {

//        int equipmentStatus_address;//设备总控状态地址
//        int park_completed_address;//停车完成地址
//        int parkingEntX;//入口
//        int parkingEntY;
//        int parkingEntZ;

//        int fetch_completed_address;
//        //获取PLC句柄
//        IEquipments PLC;
//        //获取队列句柄
//        IEquipments queuingThread;
//        //获取号牌句柄
//        IEquipments NumMachine;
//        //QueuingThread queuingThread = new QueuingThread();
//        //数据库
//        DBOperation oper = new DBOperation();
//        //车位分配
//        CEntrance c = new CEntrance();
//        AllotParkingSpace aps = new AllotParkingSpace();

//        string[] equipNames = new string[] { EquipmentName.PLC, EquipmentName.NumMachine, EquipmentName.Web, EquipmentName.Queue };

//        public CoreThreadTest()
//        {
//            equipmentStatus_address = Convert.ToInt32(ConfigurationManager.AppSettings["equipmentStatus_address"]);
//            park_completed_address = Convert.ToInt32(ConfigurationManager.AppSettings["park_completed_address"]);
//            parkingEntX = Convert.ToInt32(ConfigurationManager.AppSettings["parkingEntX"]);
//            parkingEntY = Convert.ToInt32(ConfigurationManager.AppSettings["parkingEntY"]);
//            parkingEntZ = Convert.ToInt32(ConfigurationManager.AppSettings["parkingEntZ"]);

//            //取车完成
//            fetch_completed_address = Convert.ToInt32(ConfigurationManager.AppSettings["fetch_completed_address"]);
//        }

//        public void Start()
//        {

//            for (int i = 0; i < equipNames.Length; ++i)
//            {
//                IEquipments equip = EquipmentSimpleFactory.ins.CreateEquipment(equipNames[i]);
//                if (equip != null)
//                {
//                    equip.Start();
//                }
//            }
//            PLC = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.PLC);
//            queuingThread = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.Queue);
//            NumMachine = EquipmentSimpleFactory.ins.FindEquipment(EquipmentName.NumMachine);
//            //BeginWorking();
//            //监听总状态改变消息
//            //由监控线程发出
//            AsyncCmdServer.ins.listen(AsyncCmdType.TotalStatusChanged, (AlarmStatus type) =>
//            {
//                if (type != AlarmStatus.Normal)
//                {
//                    hangUp();
//                }
//            });
//        }

//        public AbstractMessage GetMessage()
//        {
//            return null;
//        }

//        public void SetMessage(AbstractMessage message)
//        {

//        }

//        public void Stop()
//        {
//            for (int i = 0; i < equipNames.Length; ++i)
//            {
//                IEquipments equip = EquipmentSimpleFactory.ins.FindEquipment(equipNames[i]);
//                if (equip != null)
//                {
//                    equip.Stop();
//                }
//            }
//        }

//        public void BeginWorking()
//        {
//            while (true)
//            {
//                PLCMessage PLCMsg = null;
//                Command queueCmd = null;
//                //等待PLC设备就绪状态
//                Task PLCTask = Task.Factory.StartNew(() =>
//                {
//                    while (true)
//                    {
//                        PLCMsg = (PLCMessage)PLC.GetMessage();
//                        int normalStatus = 0;
//                        if (PLCMsg != null && PLCMsg.plcList != null && PLCMsg.plcList.Count != 0)
//                        {
//                            normalStatus = Convert.ToInt32(PLCMsg.plcList[equipmentStatus_address].Value);
//                        }
//                        //设备总控状态
//                        if (normalStatus == 1)
//                        {
//                            UILogServer.ins.info("设备总状态正常");
//                            break;
//                        }
//                        Thread.Sleep(100);
//                    }
//                });
//                //等待号牌资源
//                Task queueTask = Task.Factory.StartNew(() =>
//                {
//                    while (true)
//                    {
//                        queueCmd = (Command)queuingThread.GetMessage();
//                        if (queueCmd != null)
//                        {
//                            break;
//                        }
//                    }
//                });
//                Task.WaitAll(PLCTask, queueTask);

//                if (queueCmd.commandType == 'f')
//                {
//                    Vehicle vehiclelist = oper.GetVehicle(queueCmd.LicenseNum);
//                    int parkingSpaceID = vehiclelist.parkingSpaceID;
//                    int garageID = vehiclelist.garageID;
//                    Fetching_Space fslist = oper.GetFetchingSpace(parkingSpaceID);
//                    int parkingSpaceX = fslist.parkingSpaceX;
//                    int parkingSpaceY = fslist.parkingSpaceY;
//                    int parkingSpaceZ = fslist.parkingSpaceZ;
//                    int status = 4;//取车
//                    ParkingMessage pm = new ParkingMessage();
//                    pm.status = status;
//                    pm.parkingSpaceID = Convert.ToString(parkingSpaceID);
//                    pm.parkingSpaceX = Convert.ToString(parkingSpaceX);
//                    pm.parkingSpaceY = Convert.ToString(parkingSpaceY);
//                    pm.parkingSpaceZ = Convert.ToString(parkingSpaceZ);
//                    PLC.SetMessage(pm);
//                    Console.WriteLine("取车:" + queueCmd.LicenseNum);
//                    Log.WriteLog("取车:" + queueCmd.LicenseNum);
//                    UILogServer.ins.info("取车:" + queueCmd.LicenseNum);
//                    //等待PLC取车完成信号
//                    Task signalFromPLC = Task.Factory.StartNew(() =>
//                    {
//                        while (true)
//                        {
//                            Thread.Sleep(2000);
//                            PLCMsg = (PLCMessage)PLC.GetMessage();
//                            int fetchingStatus = Convert.ToInt32(PLCMsg.plcList[fetch_completed_address].Value);
//                            //取车完成信号
//                            if (fetchingStatus == 1)
//                            {
//                                //取车完成后或可归零
//                                break;
//                            }
//                        }
//                    });
//                    //Task.WaitAll(signalFromPLC);
//                    signalFromPLC.Wait();
//                    //数据库更新
//                    //更新车库表车位数
//                    int freeSpaceCount = oper.getGarageFreeSpace(garageID);
//                    freeSpaceCount = freeSpaceCount + 1;
//                    oper.UpdateGarageFreeSpace(freeSpaceCount, garageID);
//                    //更新车位表车位状态
//                    oper.UpdateParkingSpaceState(parkingSpaceID, 0);
//                    //更新车辆表车辆停车状态
//                    oper.UpdateVehicleParkState(queueCmd.LicenseNum, 0);
//                    //更新停车记录表
//                    oper.UpdateParkingRecords(6, queueCmd.TimeRecord, queueCmd.parkingRecordsID);
//                }
//                if (queueCmd.commandType == 'e')
//                {
//                    int userId = Convert.ToInt32(queueCmd.userID);
//                    //过期用户指令
//                    oper.InsertToMessageQueue(userId, "停车异常，请联系管理员！", 2);
//                    LogFile logFile = LogFile.ERROR_NUMBERPLATE;
//                    Log.WriteLog(logFile, "过期用户指令,车牌号：" + queueCmd.LicenseNum);
//                    UILogServer.ins.error("过期用户指令,车牌号：" + queueCmd.LicenseNum);
//                    continue;
//                }
//                if (queueCmd.commandType == 's')
//                {
//                    int status = 1;//停车
//                    ParkingMessage pm = new ParkingMessage();
//                    pm.status = status;
//                    PLC.SetMessage(pm);
//                    Console.WriteLine("停车，开激光:" + queueCmd.LicenseNum);
//                    Log.WriteLog("停车，开激光:" + queueCmd.LicenseNum);
//                    UILogServer.ins.info("停车，开激光:" + queueCmd.LicenseNum);
//                    c.parkingEntX = parkingEntX;
//                    c.parkingEntY = parkingEntY;
//                    c.parkingEntZ = parkingEntZ;
//                    Parking_Space ppp = new Parking_Space();
//                    ppp = aps.MallocParkingSpace(c);//得到车位
//                    int parkingSpaceID = ppp.parkingSpaceID;
//                    int parkingSpaceX = ppp.parkingSpaceX;
//                    int parkingSpaceY = ppp.parkingSpaceY;
//                    int parkingSpaceZ = ppp.parkingSpaceZ;
//                    //int garageID = ppp.garageID;
//                    string numberPlate = queueCmd.LicenseNum;
//                    int userID = 0;
//                    //过期号牌判断
//                    if (queueCmd.userID != "")
//                    {
//                        userID = Convert.ToInt32(queueCmd.userID);
//                    }
//                    int garageID = queueCmd.garageID;
//                    string realParkTime = queueCmd.TimeRecord;
//                    UILogServer.ins.info("获得车库信息" + garageID + ",等待激光数据");
//                    Task dataFromLaser = Task.Factory.StartNew(() =>
//                      {
//                          while (true)
//                          {
//                              PLCMsg = (PLCMessage)PLC.GetMessage();
//                              if (PLCMsg != null)
//                              {
//                                  int centerX = 0;
//                                  int centerY = 0;
//                                  int angleA = 0;
//                                  int length = 0;
//                                  int width = 0;
//                                  int height = 0;
//                                  foreach (LaserMessage lm in PLCMsg.laserMsgList)
//                                  {
//                                      if (lm.data != null && lm.status == 3)
//                                      {
//                                          centerX = lm.data.centerX;
//                                          centerY = lm.data.centerY;
//                                          angleA = lm.data.angleA;
//                                          length = lm.data.length;
//                                          width = lm.data.width;
//                                          height = lm.data.height;
//                                          status = 2;
//                                          pm.status = status;
//                                          pm.centerX = Convert.ToString(centerX);
//                                          pm.centerY = Convert.ToString(centerY);
//                                          pm.angleA = Convert.ToString(angleA);
//                                          pm.length = Convert.ToString(length);
//                                          pm.width = Convert.ToString(width);
//                                          pm.height = Convert.ToString(height);
//                                          pm.parkingSpaceID = Convert.ToString(parkingSpaceID);
//                                          pm.parkingSpaceX = Convert.ToString(parkingSpaceX);
//                                          pm.parkingSpaceY = Convert.ToString(parkingSpaceY);
//                                          pm.parkingSpaceZ = Convert.ToString(parkingSpaceZ);
//                                          PLC.SetMessage(pm);
//                                          break;
//                                      }
//                                      else if (lm.status == -1)
//                                      {
//                                          LogFile logFile = LogFile.ERROR;
//                                          Log.WriteLog(logFile, "激光异常");
//                                      }
//                                  }
//                              }
//                              Thread.Sleep(500);
//                          }
//                      });
//                    //Task.WaitAll(dataFromLaser);
//                    dataFromLaser.Wait();

//                    Console.WriteLine("停车，抓车:" + queueCmd.LicenseNum);
//                    Log.WriteLog("停车，抓车:" + queueCmd.LicenseNum);
//                    UILogServer.ins.info("停车，抓车:" + queueCmd.LicenseNum);
//                    Task storeSignal = Task.Factory.StartNew(() =>
//                    {
//                        while (true)
//                        {
//                            Thread.Sleep(1000);
//                            PLCMsg = (PLCMessage)PLC.GetMessage();
//                            int storeStatus = Convert.ToInt32(PLCMsg.plcList[park_completed_address].Value);
//                            //停车完成信号
//                            if (storeStatus == 1)
//                            {
//                                break;
//                            }
//                        }
//                    });
//                    storeSignal.Wait();
//                    status = 3;
//                    pm.status = status;
//                    PLC.SetMessage(pm);

//                    //车停完，号牌ip置空告知号牌机线程
//                    NumberMachineMessage nmm = new NumberMachineMessage();
//                    nmm.aNode = new NumberMachineNode();
//                    nmm.aNode.ip = "";
//                    nmm.aNode.LicenseNum = queueCmd.LicenseNum;
//                    NumMachine.SetMessage(nmm);

//                    Console.WriteLine("停车完成，状态复位");
//                    Log.WriteLog("停车完成，状态复位");
//                    UILogServer.ins.info("停车完成，状态复位");
//                    //根据号牌查找车型
//                    int vehicleTypeID = oper.getVehicleTypeID(numberPlate);
//                    //判断测量数据是否准确
//                    //bool isDataRight = oper.IsDataRight(vehicleTypeLength, vehicleTypeWidth, vehicleTypeHeight, vehicleTypeWheelbase, vehicleTypeID);

//                    //正常写入数据库
//                    if (userID != 0)
//                    {
//                        //更新数据库
//                        //插入停车记录表
//                        int parkingRecordsID = oper.InsertToParkingRecords(userID, numberPlate, parkingSpaceID, garageID, 3, realParkTime);
//                        //车辆表更新车辆信息
//                        oper.UpdateVehicle(numberPlate, 1, realParkTime, parkingRecordsID, parkingSpaceID, 1);
//                        //更新车库表剩余车位数
//                        int freeSpaceCount = oper.getGarageFreeSpace(garageID);
//                        freeSpaceCount = freeSpaceCount - 1;
//                        oper.UpdateGarageFreeSpace(freeSpaceCount, garageID);
//                        //更新车位表车位状态
//                        oper.UpdateParkingSpaceState(parkingSpaceID, 1);
//                        //插入消息队列表
//                        oper.InsertToMessageQueue(userID, "停车成功", 1);
//                    }
//                    //异常写入日志文件
//                    else
//                    {
//                        LogFile logFile = LogFile.ERROR_NUMBERPLATE;
//                        Log.WriteLog(logFile, "号牌：" + numberPlate);
//                        Log.WriteLog(logFile, "入库时间：" + realParkTime);
//                        Log.WriteLog(logFile, "车位id：" + parkingSpaceID);
//                        Log.WriteLog(logFile, "车位x：" + parkingSpaceX);
//                        Log.WriteLog(logFile, "车位y：" + parkingSpaceY);
//                        Log.WriteLog(logFile, "车位z：" + parkingSpaceZ);
//                    }
//                }
//                Thread.Sleep(100);
//            }
//        }

//        /// <summary>挂起</summary>
//        public void hangUp()
//        {

//        }

//        private AbstractMessage GetExecuteNumberPlate()
//        {
             
//            return null;
//        }
//    }
//}
