Ejemplo n.º 1
0
        private FetchEventsResult fetchEventsBlock(IntPtr ControllerHandler, int eventIndex, int eventCount)
        {
            //log.Info("Requested from " + eventIndex + ", count of " + eventCount);
            ZG_EV_TIME    rTime   = new ZG_EV_TIME();
            ZG_CTR_DIRECT nDirect = new ZG_CTR_DIRECT();

            ZG_CTR_EVENT[] aEvents = new ZG_CTR_EVENT[eventCount];
            int            hr      = ZGIntf.ZG_Ctr_ReadEvents(ControllerHandler, eventIndex, aEvents, eventCount, null, IntPtr.Zero);

            if (hr < 0)
            {
                log.Fatal("Ошибка ZG_Ctr_ReadEvents (" + hr + ")");
                throw new ZCommonException("Ошибка ZG_Ctr_ReadEvents").setErrorCode(hr);
            }
            ZG_CTR_EVENT      rEv;
            FetchEventsResult result = new FetchEventsResult();

            result.items = new List <ControllerEvent>();
            for (int j = 0; j < eventCount; j++)
            {
                rEv = aEvents[j];
                switch (rEv.nType)
                {
                case ZG_CTR_EV_TYPE.ZG_EV_KEY_NOT_FOUND:
                case ZG_CTR_EV_TYPE.ZG_EV_KEY_OPEN:
                case ZG_CTR_EV_TYPE.ZG_EV_KEY_ACCESS:
                    int nKeyIdx  = 0;
                    int nKeyBank = 0;
                    ZGIntf.ZG_Ctr_DecodePassEvent(ControllerHandler, rEv.aData, ref rTime, ref nDirect, ref nKeyIdx, ref nKeyBank);
                    ControllerEvent newEvent = new ControllerEvent();
                    newEvent.month    = rTime.nMonth;
                    newEvent.day      = rTime.nDay;
                    newEvent.hour     = rTime.nHour;
                    newEvent.minute   = rTime.nMinute;
                    newEvent.second   = rTime.nSecond;
                    newEvent.keyIndex = nKeyIdx;
                    result.items.Add(newEvent);
                    result.lastReadIndex  = eventIndex + j;
                    result.lastReadMonth  = rTime.nMonth;
                    result.lastReadDay    = rTime.nDay;
                    result.lastReadHour   = rTime.nHour;
                    result.lastReadMinute = rTime.nMinute;
                    result.lastReadSecond = rTime.nSecond;
                    break;
                }
            }
            return(result);
        }
Ejemplo n.º 2
0
        public GetUnreadEventsResult getUnreadEvents(ushort serialNumber, int lastReadIndex, int lastReadMonth, int lastReadDay, int lastReadHour, int lastReadMinute, int lastReadSecond, int maxEvents)
        {
            IntPtr                ControllerHandler = new IntPtr(0);
            ZG_CTR_INFO           ControllerInfo    = new ZG_CTR_INFO();
            GetUnreadEventsResult result            = new GetUnreadEventsResult();

            result.items = new List <ControllerEvent>();
            try
            {
                //Открываем контроллер
                int hr = ZGIntf.ZG_Ctr_Open(ref ControllerHandler, ConverterHandler, 255, serialNumber, ref ControllerInfo);
                if (hr < 0)
                {
                    log.Fatal("Ошибка ZG_Ctr_Open (" + hr + ")");
                    throw new ZCommonException("Ошибка ZG_Ctr_Open").setErrorCode(hr);
                }
                //Читаем указатель на следующее записываемое событие
                int writeIndex = 0;
                int _readIndex = 0;
                hr = ZGIntf.ZG_Ctr_ReadEventIdxs(ControllerHandler, ref writeIndex, ref _readIndex);
                //log.Info("WriteIndex: " + writeIndex);
                if (lastReadIndex == -1)
                {
                    //Никогда не читали событий из контроллера
                    //log.Info("Не читали события из контроллера");
                    if (writeIndex > 0)
                    {
                        FetchEventsResult fetchEventsResult = fetchEventsBlock(ControllerHandler, 0, writeIndex);
                        if (fetchEventsResult.items.Count > 0)
                        {
                            result.items          = fetchEventsResult.items;
                            result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                            result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                            result.lastReadDay    = fetchEventsResult.lastReadDay;
                            result.lastReadHour   = fetchEventsResult.lastReadHour;
                            result.lastReadMinute = fetchEventsResult.lastReadMinute;
                            result.lastReadSecond = fetchEventsResult.lastReadSecond;
                        }
                        else
                        {
                            result.lastReadIndex = -1;
                        }
                    }
                    else
                    {
                        //Если следующий индекс, в который будет производиться запись, равен нулю, то ничего пока не читаем
                        result.lastReadIndex = -1;
                    }
                }
                else
                {
                    //Читаем последнее полученное в прошлый раз событие
                    FetchEventsResult fetchEventsResult = fetchEventsBlock(ControllerHandler, lastReadIndex, 1);
                    //Если на прежнем месте события нет, или оно по свойствам отличается от последнего прочитанного, значит был сбой в работе контроллера
                    //и нужно перечитать все события с него
                    if ((fetchEventsResult.items.Count == 0) ||
                        !(fetchEventsResult.items[0].month == lastReadMonth) ||
                        !(fetchEventsResult.items[0].day == lastReadDay) ||
                        !(fetchEventsResult.items[0].hour == lastReadHour) ||
                        !(fetchEventsResult.items[0].minute == lastReadMinute) ||
                        !(fetchEventsResult.items[0].second == lastReadSecond)
                        )
                    {
                        //log.Info("Последнее событие отличается");
                        //Читаем хвост от следующего индекса записи до конца списка
                        fetchEventsResult = fetchEventsBlock(ControllerHandler, writeIndex, maxEvents - writeIndex);
                        if (fetchEventsResult.items.Count > 0)
                        {
                            result.items.AddRange(fetchEventsResult.items);
                            result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                            result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                            result.lastReadDay    = fetchEventsResult.lastReadDay;
                            result.lastReadHour   = fetchEventsResult.lastReadHour;
                            result.lastReadMinute = fetchEventsResult.lastReadMinute;
                            result.lastReadSecond = fetchEventsResult.lastReadSecond;
                        }
                        //Читаем от начала списка до следующего индекса записи
                        if (writeIndex > 0)
                        {
                            fetchEventsResult = fetchEventsBlock(ControllerHandler, 0, writeIndex);
                            if (fetchEventsResult.items.Count > 0)
                            {
                                result.items.AddRange(fetchEventsResult.items);
                                result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                                result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                                result.lastReadDay    = fetchEventsResult.lastReadDay;
                                result.lastReadHour   = fetchEventsResult.lastReadHour;
                                result.lastReadMinute = fetchEventsResult.lastReadMinute;
                                result.lastReadSecond = fetchEventsResult.lastReadSecond;
                            }
                        }
                        if (result.items.Count == 0)
                        {
                            result.lastReadIndex = -1;
                        }
                    }
                    else
                    {
                        //log.Info("Последнее событие в порядке");
                        if (writeIndex > lastReadIndex)
                        {
                            //Читаем небольшой хвост от текущего индекса до следующего индекса записи
                            fetchEventsResult = fetchEventsBlock(ControllerHandler, lastReadIndex + 1, writeIndex - lastReadIndex - 1);
                            if (fetchEventsResult.items.Count > 0)
                            {
                                result.items          = fetchEventsResult.items;
                                result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                                result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                                result.lastReadDay    = fetchEventsResult.lastReadDay;
                                result.lastReadHour   = fetchEventsResult.lastReadHour;
                                result.lastReadMinute = fetchEventsResult.lastReadMinute;
                                result.lastReadSecond = fetchEventsResult.lastReadSecond;
                            }
                            else
                            {
                                result.lastReadIndex  = lastReadIndex;
                                result.lastReadMonth  = lastReadMonth;
                                result.lastReadDay    = lastReadDay;
                                result.lastReadHour   = lastReadHour;
                                result.lastReadMinute = lastReadMinute;
                                result.lastReadSecond = lastReadSecond;
                            }
                        }
                        else
                        {
                            //Индекс записи до шёл до конца списка и теперь отстаёт от нас
                            //Читаем вначале хвост от нас до конца списка
                            if (lastReadIndex < maxEvents - 1)
                            {
                                fetchEventsResult = fetchEventsBlock(ControllerHandler, lastReadIndex + 1, maxEvents - lastReadIndex - 1);
                                if (fetchEventsResult.items.Count > 0)
                                {
                                    result.items.AddRange(fetchEventsResult.items);
                                    result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                                    result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                                    result.lastReadDay    = fetchEventsResult.lastReadDay;
                                    result.lastReadHour   = fetchEventsResult.lastReadHour;
                                    result.lastReadMinute = fetchEventsResult.lastReadMinute;
                                    result.lastReadSecond = fetchEventsResult.lastReadSecond;
                                }
                            }
                            //Читаем от начала списка до индекса записи
                            if (writeIndex > 0)
                            {
                                fetchEventsResult = fetchEventsBlock(ControllerHandler, 0, writeIndex);
                                if (fetchEventsResult.items.Count > 0)
                                {
                                    result.items.AddRange(fetchEventsResult.items);
                                    result.lastReadIndex  = fetchEventsResult.lastReadIndex;
                                    result.lastReadMonth  = fetchEventsResult.lastReadMonth;
                                    result.lastReadDay    = fetchEventsResult.lastReadDay;
                                    result.lastReadHour   = fetchEventsResult.lastReadHour;
                                    result.lastReadMinute = fetchEventsResult.lastReadMinute;
                                    result.lastReadSecond = fetchEventsResult.lastReadSecond;
                                }
                            }
                            if (result.items.Count == 0)
                            {
                                result.lastReadIndex  = lastReadIndex;
                                result.lastReadMonth  = lastReadMonth;
                                result.lastReadDay    = lastReadDay;
                                result.lastReadHour   = lastReadHour;
                                result.lastReadMinute = lastReadMinute;
                                result.lastReadSecond = lastReadSecond;
                            }
                        }
                    }
                }
                //log.Info("Событий вернулось: " + result.items.Count);
                return(result);
            }
            finally
            {
                //Автоматически закрываем контроллер
                if (ControllerHandler != IntPtr.Zero)
                {
                    ZGIntf.ZG_CloseHandle(ControllerHandler);
                }
            }
        }