Beispiel #1
0
 public ZoneScanner(Zone z, JDQVisitor visitor)
 {
     this._zone = z;
     this._visitor = visitor;
     int dueTime = 1000;//Timeout.Infinite;
     _timer = new Timer(new TimerCallback(OnTimerCallback), null, dueTime, DEV_SCAN_INTERVAL);
 }
Beispiel #2
0
 private void _OnZoneStateChanged(Zone _z, bool allOn)
 {
     bool isTotalOpen = UpdateFunctionTableByZone(_z);
     // 设置 中控 输出.
     lock (_ccs)
     {
         try
         {
             JDQRequest req1 = new JDQRequest(1, JDQRequestType.SetOutput); // Read FAS/IBP
             req1.SetOutput(_z.Reg.ZoneCoil, _z.IsZoneOpen());
             req1.SetOutput(6, isTotalOpen); // 全区域.
             SocketError err;
             byte[] recv = _ccs.SSend(req1.Encode(), out err, 500);
         }
         catch (Exception) { }
     }
     if (this.OnZoneStateChanged != null)
     {
         OnZoneStateChanged.Invoke(_z, isTotalOpen); // 发出通知.
     }
 }
Beispiel #3
0
        private void _OnDoorStateChanged(Zone _z, Door _d)
        {
            this.CloseAlarmAsNecessary(_d);

            UpdateFunctionTableByDoor(_z, _d);

            if (this.OnDoorStateChanged != null)
            {
                OnDoorStateChanged.Invoke(_z, _d);
            }
            // log.DebugFormat("Zone: {0}, Door {0} changed: ", _z.Name, ValueHelper.GetIpLastAddr(d.IpAddr));
        }
Beispiel #4
0
        /// 更新点表, 用于读取返回.
        bool UpdateFunctionTableByZone(Zone _z)
        {
            // 更新 区域信息.
            // 0x01 0~6 通讯故障
            // 更新 主控.
            int totalOpened = 0, totalCnt = 0, errorCnt = 0;
            foreach (Zone z in _zones)
            {
                totalOpened += z.OpenCnt;
                totalCnt += z.TotalCnt;
                errorCnt += z.HasException? 1:0;
            }
            bool isTotalOpen = totalOpened >= totalCnt / 2;
            // 全区域异常:
            _ptable.SetValueAt(REG_SUMMARY, 0, errorCnt > 0);
            // 当前区域异常.
            _ptable.SetValueAt(REG_SUMMARY, _z.Reg.ZoneCoil, _z.HasException);
            // 当前区域状态
            _ptable.SetValueAt(REG_ZONE_SUMMARY, _z.Reg.ZoneCoil, _z.IsZoneOpen());
            // 全区域开?
            _ptable.SetValueAt(REG_ZONE_SUMMARY, 6, isTotalOpen);

            return isTotalOpen;
        }
Beispiel #5
0
        // 更新点表 - 门
        void UpdateFunctionTableByDoor(Zone _z, Door _d)
        {
            DoorState ds = _d.State;
            // 开门/关门
            _ptable.SetValueAt(_z.Reg.SetDoor, _d.Coil, ds.DoorAction == RelayState.ACTION);
            // 开门到位
            _ptable.SetValueAt(_z.Reg.GetOpenState, _d.Coil, ds.OpenState == OnOff.ON);
            // 关门到位
            _ptable.SetValueAt(_z.Reg.GetCloseState, _d.Coil, ds.CloseState == OnOff.ON);
            // 异常
            _ptable.SetValueAt(_z.Reg.GetErrorState, _d.Coil, ds.Error != DoorError.Success);
            // LCB
            _ptable.SetValueAt(_z.Reg.GetLCB, _d.Coil, ds.LCB == OnOff.ON);
            // 绿灯
            _ptable.SetValueAt(_z.Reg.SetGreen, _d.Coil, ds.GreenLamp == RelayState.ACTION);
            // 红灯
            _ptable.SetValueAt(_z.Reg.SetRed, _d.Coil, ds.RedLamp == RelayState.ACTION);

            // 按需关闭蜂鸣器.
        }
Beispiel #6
0
 ///  控制某区域.
 void ControllOneZone(Zone z, OnOff to)
 {
     foreach (Door d in z.Doors)
     {
         if (d.Enabled)
         {
             ControlDoor(d, to);
         }
     }
 }
Beispiel #7
0
 private void UpdateZoneState(Zone z)
 {
 }
Beispiel #8
0
 // 区域状态变化回调
 private void OnZoneStateChanged(Zone z, bool totalOn)
 {
     DataGridViewRow zi = _zoneRows[z.Name];
     if (zi != null)
     {
         UpdateRowImg(zi, Properties.Resources.green_24);
         UpdateRowText(zi, ViewColumns.NAME, z.Name + "(" + z.Statistics + ")");
         Label li;
         if (z.Reg.ZoneCoil == 0) li = lb_z1;
         else if (z.Reg.ZoneCoil == 1) li = lb_z2;
         else if (z.Reg.ZoneCoil == 2) li = lb_z3;
         else if (z.Reg.ZoneCoil == 3) li = lb_z4;
         else if (z.Reg.ZoneCoil == 4) li = lb_z5;
         else li = lb_z6;
         this.UpdateLabelImg(li, z.IsZoneOpen() ? OnOff.ON : OnOff.OFF);
         this.UpdateLabelImg(lb_z_all, totalOn ? OnOff.ON : OnOff.OFF);
     }
 }
Beispiel #9
0
        // 门状态变化回调
        private void OnDoorStateChanged(Zone z, Door d)
        {
            DataGridViewRow di = _doorRows[d.IpAddr];
            if (di != null)
            {
                UpdateRowText(di, ViewColumns.ACTION, EnumHelper.ToString(d.State.DoorAction));
                UpdateRowText(di, ViewColumns.OPEN_STATE, EnumHelper.ToString(d.State.OpenState));
                UpdateRowText(di, ViewColumns.CLOSE_STATE, EnumHelper.ToString(d.State.CloseState));
                UpdateRowText(di, ViewColumns.GREEN_LAMP, EnumHelper.ToString(d.State.GreenLamp));
                UpdateRowText(di, ViewColumns.RED_LAMP, EnumHelper.ToString(d.State.RedLamp));
                UpdateRowText(di, ViewColumns.LCB, EnumHelper.ToString(d.State.LCB));
                UpdateRowText(di, ViewColumns.BEEP, EnumHelper.ToString(d.State.Beep));
                UpdateRowText(di, ViewColumns.ERROR, EnumHelper.ToString(d.State.Error, d.State.ExtError));

                if (DoorError.Success != d.State.Error)
                {
                    UpdateRowImg(di, Properties.Resources.yellow_24);
                }
                else
                {
                    UpdateRowImg(di, Properties.Resources.green_24);
                }
            }
        }
Beispiel #10
0
        public IList<Zone> LoadConfig()
        {
            IList<Zone> _zones = new List<Zone>();
            log.InfoFormat("解析文件: '{0}' ...", CFG_FILE);
            var doorCount = 0;
            try
            {
                XDocument doc = XDocument.Load(CFG_FILE);
                var root = doc.Root;

                var ccse = root.Element("ccs");
                _ccsip = GetValue(ccse, "ip", "192.168.31.254");

                string ipPrefix = GetValue(root, "ipp", "192.168.31");
                byte zcnt = Convert.ToByte(GetValue(root, "zones"));
                _regMin = REG_START;
                _regMax = (byte)(REG_START + zcnt * REG_CMD_CNT); //共 7 组命令.

                byte _funcOffset = 0;
                foreach (var ze in root.Elements("zone"))
                {
                    byte zoneCoil = Convert.ToByte(GetValue(ze, "zreg")); //1~6
                    byte regStart = (byte)(_funcOffset + REG_START);
                    _funcOffset++;

                    Zone z = new Zone()
                    {
                        Name = GetValue(ze, "name"),
                        Reg = new RegInfo()
                        {
                            ZoneCoil = zoneCoil,
                            SetDoor = regStart,
                            GetOpenState = (byte)(regStart + zcnt * REG_GET_DOOR_OPEN),
                            GetCloseState = (byte)(regStart + zcnt * REG_GET_DOOR_CLOSE),
                            GetErrorState = (byte)(regStart + zcnt * REG_GET_DOOR_ERROR),
                            GetLCB = (byte)(regStart + zcnt * REG_GET_LCB),
                            SetGreen = (byte)(regStart + zcnt * REG_SET_GREEN), //5=开绿灯
                            SetRed = (byte)(regStart + zcnt * REG_SET_RED),   // 6=开红灯
                        },
                    };
                    _zones.Add(z);
                    // 该区域的门配置.
                    foreach (var de in ze.Elements("d"))
                    {
                        Door d = new Door();
                        string ip = GetValue(de, "ip", "");
                        if (ip.Length <= 3)
                        {
                            ip = ipPrefix + "." + ip;
                        }
                        d.DevId = Convert.ToByte(GetValue(de, "id", "1"));
                        d.Coil = Convert.ToByte(GetValue(de, "c")); //Coil/Bit
                        d.IpAddr = ip;
                        d.Enabled = GetValue(de, "enable", "1") == "1";
                        z.AddDoor(d);
                        UpdateDoorMap(z, d);
                    }
                    doorCount += z.TotalCnt;
                    log.DebugFormat("区域: {0}, doors={1}", z.Name, z.TotalCnt);
                }
            }
            catch (Exception e)
            {
                throw new Exception(string.Format("读取配置文件 {0} 异常:{1}", CFG_FILE, e.Message));
            }
            _zoneCnt = _zones.Count;
            log.InfoFormat("配置已读取, 共 {0} 个区域, {1} 樘门.", _zoneCnt, doorCount);
            return _zones;
        }
Beispiel #11
0
 // Reg.Bit => Door
 void UpdateDoorMap(Zone z, Door d)
 {
     _doorMap[string.Format("{0}.{1}", z.Reg.SetDoor, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.SetGreen, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.SetRed, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.GetCloseState, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.GetOpenState, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.GetErrorState, d.Coil)] = d;
     _doorMap[string.Format("{0}.{1}", z.Reg.GetLCB, d.Coil)] = d;
 }