public void setControllerMode(ushort serialNumber, ZG_CTR_MODE mode) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } //Читаем режим hr = ZGIntf.ZG_Ctr_SetCtrMode(ControllerHandler, mode); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_SetCtrMode (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_SetCtrMode").setErrorCode(hr); } } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public List <ControllerEvent> getEvents(ushort serialNumber, int eventIndex, int eventCount) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } return(fetchEventsBlock(ControllerHandler, eventIndex, eventCount).items); } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public void clearKey(ushort serialNumber, int keyIndex) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } //Удаляем ключ hr = ZGIntf.ZG_Ctr_ClearKeys(ControllerHandler, keyIndex, 1, null, default(IntPtr), 0, true); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_ClearKeys (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_ClearKeys").setErrorCode(hr); } } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public List <ControllerKey> getKeys(ushort serialNumber, int keyIndex, int keyCount) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); ZG_CTR_KEY[] aKeys = new ZG_CTR_KEY[keyCount]; List <ControllerKey> keyList = new List <ControllerKey>(); ControllerKey newKey; 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); } //Читаем список карт hr = ZGIntf.ZG_Ctr_ReadKeys(ControllerHandler, keyIndex, aKeys, keyCount, null, IntPtr.Zero, 0); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_ReadKeys (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_ReadKeys").setErrorCode(hr); } for (int i = 0; i < keyCount; i++) { if (aKeys[i].nType.Equals(ZG_CTR_KEY_TYPE.ZG_KEY_NORMAL)) { newKey = new ControllerKey(); newKey.code = CardArrayToString(aKeys[i].rNum); newKey.isErased = aKeys[i].fErased; keyList.Add(newKey); //log.Info("KEY: " + newKey.name + ", " + aKeys[i].nAccess + ", " + aKeys[i].nFlags); } else { keyList.Add(null); } } return(keyList); } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public void addKey(ushort serialNumber, int keyIndex, String code) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } //Пишем ключ ZG_CTR_KEY[] aKeys = new ZG_CTR_KEY[1]; aKeys[0].nType = ZG_CTR_KEY_TYPE.ZG_KEY_NORMAL; aKeys[0].rNum = CardStringToArray(code); aKeys[0].nAccess = 255; //Доступ без рассписания aKeys[0].nFlags = ZGIntf.ZG_KF_SHORTNUM; int _keyIndex = -1; if (keyIndex == -1) { hr = ZGIntf.ZG_Ctr_GetKeyTopIndex(ControllerHandler, ref _keyIndex, 0); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_GetKeyTopIndex (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_GetKeyTopIndex").setErrorCode(hr); } } else { _keyIndex = keyIndex; } hr = ZGIntf.ZG_Ctr_WriteKeys(ControllerHandler, _keyIndex, aKeys, 1, null, default(IntPtr), 0, true); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_WriteKeys (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_WriteKeys").setErrorCode(hr); } } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public List <ControllerInfoShort> GetControllers() { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); ZG_CTR_MODE ControllerMode = ZG_CTR_MODE.ZG_MODE_UNDEF; uint ControllerModeFlags = 0; tmpControllerInfoShortList = new List <ControllerInfoShort>(); int hr = ZGIntf.ZG_Cvt_EnumControllers(ConverterHandler, tmpEnumConverters, IntPtr.Zero); if (hr < 0) { log.Fatal("Ошибка ZG_Cvt_EnumControllers (" + hr + ")."); throw new ZCommonException("Ошибка ZG_Cvt_EnumControllers").setErrorCode(hr); } if (tmpControllerInfoShortList.Count > 0) { for (int i = 0; i < tmpControllerInfoShortList.Count; i++) { try { //Открываем контроллер hr = ZGIntf.ZG_Ctr_Open(ref ControllerHandler, ConverterHandler, 255, tmpControllerInfoShortList[i].serialNumber, ref ControllerInfo); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_Open (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_Open").setErrorCode(hr); } //Читаем режим hr = ZGIntf.ZG_Ctr_GetCtrModeInfo(ControllerHandler, ref ControllerMode, ref ControllerModeFlags); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_GetCtrModeInfo (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_GetCtrModeInfo").setErrorCode(hr); } tmpControllerInfoShortList[i].mode = ControllerMode; } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } } } return(tmpControllerInfoShortList); }
public ControllerDateTime getControllerDateTime(ushort serialNumber) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } //Ставим контроллеру дату/время ZG_CTR_CLOCK clock = new ZG_CTR_CLOCK(); hr = ZGIntf.ZG_Ctr_GetClock(ControllerHandler, ref clock); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_GetClock (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_GetClock").setErrorCode(hr); } ControllerDateTime response = new ControllerDateTime(); response.year = clock.nYear; response.month = clock.nMonth; response.day = clock.nDay; response.hour = clock.nHour; response.minute = clock.nMinute; response.second = clock.nSecond; return(response); } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
public void setControllerDateTime(ushort serialNumber, ushort year, ushort month, ushort day, ushort hour, ushort minute, ushort second) { IntPtr ControllerHandler = new IntPtr(0); ZG_CTR_INFO ControllerInfo = new ZG_CTR_INFO(); 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); } //Ставим контроллеру дату/время ZG_CTR_CLOCK clock = new ZG_CTR_CLOCK(); clock.fStopped = false; clock.nYear = year; clock.nMonth = month; clock.nDay = day; clock.nHour = hour; clock.nMinute = minute; clock.nSecond = second; hr = ZGIntf.ZG_Ctr_SetClock(ControllerHandler, ref clock); if (hr < 0) { log.Fatal("Ошибка ZG_Ctr_SetClock (" + hr + ")"); throw new ZCommonException("Ошибка ZG_Ctr_SetClock").setErrorCode(hr); } } finally { //Автоматически закрываем контроллер if (ControllerHandler != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(ControllerHandler); } } }
internal static void Main(string[] args) { ZG_CTR_INFO rCtrInfo = new ZG_CTR_INFO(); int hr; IntPtr hCvt; string msg; //if (TestDeviceAccess(out hCvt, ref rCtrInfo)) return; if (TestDevices.TestDeviceAccess(out hCvt, ref rCtrInfo)) { return; // Тестирование Доступа К Устройству } try { m_nCtrMaxEvents = rCtrInfo.nMaxEvents; m_fProximity = ((rCtrInfo.nFlags & ZGIntf.ZG_CTR_F_PROXIMITY) != 0); m_nCtrFlags = rCtrInfo.nFlags; msg = string.Format("{0} адрес: {1}, с/н: {2}, v{3}.{4}, Количество событий: {5}, Тип ключей: {6}.", CtrTypeStrs[(int)rCtrInfo.nType], rCtrInfo.nAddr, rCtrInfo.nSn, rCtrInfo.nVersion & 0xff, (rCtrInfo.nVersion >> 8) & 0xff, rCtrInfo.nMaxEvents, KeyModeStrs[m_fProximity ? 1 : 0]); Console.WriteLine(msg); OnReportHandler(msg); m_fCtrNotifyEnabled = false; int nWrIdx = 0; int nRdIdx = 0; hr = ZGIntf.ZG_Ctr_ReadEventIdxs(m_hCtr, ref nWrIdx, ref nRdIdx); if (hr < 0) { Console.WriteLine("Ошибка ZG_Ctr_ReadEventIdxs ({0}).", hr); Console.ReadLine(); return; } m_nAppReadEventIdx = nWrIdx; //Console.WriteLine("-----"); msg = "-----"; Console.WriteLine(msg); OnReportHandler(msg); } catch (Exception ex) { OnReportHandler(ex.Message); throw; // бросаемся дальше } try { string s; while (true) { Console.WriteLine("Введите номер команды:"); Console.WriteLine("1 - показать новые события"); Console.WriteLine("2 - показать все события ({0})", m_nCtrMaxEvents); Console.WriteLine("3 - {0} уведомления о новых событиях.", m_fCtrNotifyEnabled ? "Выключить" : "Включить"); Console.WriteLine("9 - Восстановить заводские настройки (сброс индексов)"); Console.WriteLine("0 - выход"); s = Console.ReadLine(); bool returnAfterExecute = false; if (args != null && args.Length > 0) { s = args[0]; // для примера чисто тебе напишу вариант с одним параметром, ты уже сам сможешь придумать обработку нескольких или вызов методов отдельно от этого шлака returnAfterExecute = true; } //Console.WriteLine(); if (s != "") { Console.WriteLine(); switch (Convert.ToInt32(s)) { case 1: DoShowNewEvents(); if (returnAfterExecute) { return; } break; case 2: DoShowAllEvents(); if (returnAfterExecute) { return; } break; case 3: // Активация контроля за новыми событиями через отдельный поток ToggleEventNotifyer(); if (returnAfterExecute) { return; } break; case 9: DoRestoreFactorySettings(); break; case 0: return; default: Console.WriteLine("Неверная команда."); break; } } Console.WriteLine("-----"); } } finally { StopNotifyThread(); if (m_hCtr != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(m_hCtr); } if (hCvt != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(hCvt); } ZGIntf.ZG_Finalyze(); } }
private void Form1_Load(object sender, EventArgs e) { // Проверяем версию SDK UInt32 nVersion = ZGIntf.ZG_GetVersion(); if ((((nVersion & 0xFF)) != ZGIntf.ZG_SDK_VER_MAJOR) || (((nVersion >> 8) & 0xFF) != ZGIntf.ZG_SDK_VER_MINOR)) { Console.WriteLine("Неправильная версия SDK Guard."); Console.ReadLine(); return; } IntPtr hCvt = new IntPtr(0); m_hCtr = new IntPtr(0); int hr; hr = ZGIntf.ZG_Initialize(ZPIntf.ZP_IF_NO_MSG_LOOP); if (hr < 0) { Console.WriteLine("Ошибка ZG_Initialize ({0}).", hr); Console.ReadLine(); return; } try { ZG_CVT_INFO rInfo = new ZG_CVT_INFO(); ZG_CVT_OPEN_PARAMS rOp = new ZG_CVT_OPEN_PARAMS(); rOp.nPortType = CvtPortType; rOp.pszName = CvtPortName; rOp.nSpeed = ZG_CVT_SPEED.ZG_SPEED_57600; hr = ZGIntf.ZG_Cvt_Open(ref hCvt, ref rOp, rInfo); if (hr < 0) { Console.WriteLine("Ошибка ZG_Cvt_Open ({0}).", hr); Console.ReadLine(); return; } ZG_CTR_INFO rCtrInfo = new ZG_CTR_INFO(); hr = ZGIntf.ZG_Ctr_Open(ref m_hCtr, hCvt, CtrAddr, 0, ref rCtrInfo); if (hr < 0) { Console.WriteLine("Ошибка ZG_Ctr_Open ({0}).", hr); Console.ReadLine(); return; } m_nCtrMaxBanks = ((rCtrInfo.nFlags & ZGIntf.ZG_CTR_F_2BANKS) != 0) ? 2 : 1; m_fProximity = ((rCtrInfo.nFlags & ZGIntf.ZG_CTR_F_PROXIMITY) != 0); Console.WriteLine("{0} адрес: {1}, с/н: {2}, v{3}.{4}, Количество банков: {5}, Тип ключей: {6}.", CtrTypeStrs[(int)rCtrInfo.nType], rCtrInfo.nAddr, rCtrInfo.nSn, rCtrInfo.nVersion & 0xff, (rCtrInfo.nVersion >> 8) & 0xff, m_nCtrMaxBanks, KeyModeStrs[m_fProximity ? 1 : 0]); m_oEvent = new ManualResetEvent(false); ZG_CTR_NOTIFY_SETTINGS rNS = new ZG_CTR_NOTIFY_SETTINGS( ZGIntf.ZG_NF_CTR_KEY_TOP, m_oEvent.SafeWaitHandle, IntPtr.Zero, 0, 0, 3000, // Период проверки верхней границы ключей 0); hr = ZGIntf.ZG_Ctr_SetNotification(m_hCtr, rNS); if (hr < 0) { Console.WriteLine("Ошибка ZG_Ctr_SetNotification ({0}).", hr); Console.ReadLine(); return; } StartNotifyThread(); Console.WriteLine("-----"); //while (true) //{ //DoOpenLock(0); /* * Console.WriteLine("Введите номер команды:"); * Console.WriteLine("1 - показать времена замков"); * Console.WriteLine("2 - установить времена замков..."); * Console.WriteLine("3 - открыть замок (Вход)"); * Console.WriteLine("4 - открыть замок (Выход)"); * Console.WriteLine("9 - восстановить заводские настройки (для всех банков)"); * Console.WriteLine("0 - выход"); * s = Console.ReadLine(); * if (s != "") * { * Console.WriteLine(); * switch (Convert.ToInt32(s)) * { * case 1: * //ShowLockTimes(); * break; * case 2: * //DoSetLockTimes(); * break; * case 3: * DoOpenLock(0); * break; * case 4: * DoOpenLock(1); * break; * case 9: * //DoRestoreFactorySettings(); * break; * case 0: * return; * default: * Console.WriteLine("Неверная команда."); * break; * } * } * Console.WriteLine("-----"); */ //} } finally { if (m_hCtr != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(m_hCtr); } if (hCvt != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(hCvt); } ZGIntf.ZG_Finalyze(); } }
internal static void Main(string[] args) { ZG_CTR_INFO rCtrInfo = new ZG_CTR_INFO(); int hr; IntPtr hCvt; string msg; //if (TestDeviceAccess(out hCvt, ref rCtrInfo)) return; //if (TestDevice.TestDeviceAccess(out hCvt, ref rCtrInfo)) return; // Тестирование Доступа К Устройству try { m_nCtrMaxBanks = ((rCtrInfo.nFlags & ZGIntf.ZG_CTR_F_2BANKS) != 0) ? 2 : 1; m_fProximity = ((rCtrInfo.nFlags & ZGIntf.ZG_CTR_F_PROXIMITY) != 0); // в любом месте, где мы хотим видеть текст не только в консоли, но и в результате вывода, вызываем OnReportHandler msg = string.Format("{0} адрес: {1}, с/н: {2}, v{3}.{4}, Количество банков: {5}, Тип ключей: {6}.", CtrTypeStrs[(int)rCtrInfo.nType], rCtrInfo.nAddr, rCtrInfo.nSn, rCtrInfo.nVersion & 0xff, (rCtrInfo.nVersion >> 8) & 0xff, m_nCtrMaxBanks, KeyModeStrs[m_fProximity ? 1 : 0]); Console.WriteLine(msg); OnReportHandler(msg); } catch (Exception ex) { OnReportHandler(ex.Message); throw; // бросаемся дальше } try { m_oEvent = new ManualResetEvent(false); ZG_CTR_NOTIFY_SETTINGS rNS = new ZG_CTR_NOTIFY_SETTINGS( ZGIntf.ZG_NF_CTR_KEY_TOP, m_oEvent.SafeWaitHandle, IntPtr.Zero, 0, 0, 3000, // Период проверки верхней границы ключей 0); hr = ZGIntf.ZG_Ctr_SetNotification(m_hCtr, rNS); if (hr < 0) { Console.WriteLine("Ошибка ZG_Ctr_SetNotification ({0}).", hr); Console.ReadLine(); return; } StartNotifyThread(); Console.WriteLine("-----"); string s; while (true) { Console.WriteLine("Введите номер команды:"); Console.WriteLine("1 - показать ключи"); Console.WriteLine("2 - поиск ключа по номеру..."); Console.WriteLine("3 - показать верхнюю границу ключей"); Console.WriteLine("6 - установка ключа..."); Console.WriteLine("7 - стирание ключа..."); Console.WriteLine("8 - стирание всех ключей..."); Console.WriteLine("0 - выход"); s = Console.ReadLine(); bool returnAfterExecute = false; if (args != null && args.Length > 0) { s = args[0]; // для примера чисто тебе напишу вариант с одним параметром, ты уже сам сможешь придумать обработку нескольких или вызов методов отдельно от этого шлака returnAfterExecute = true; } if (s != "") { Console.WriteLine(); switch (Convert.ToInt32(s)) { case 1: ShowKeys(); if (returnAfterExecute) { return; } break; case 2: DoFindKeyByNumber(); break; case 3: ShowKeyTopIndex(); break; case 6: DoSetKey(); if (returnAfterExecute) { return; } break; case 7: DoClearKey(); break; case 8: DoClearAllKeys(); break; case 0: return; default: Console.WriteLine("Неверная команда."); break; } } Console.WriteLine("-----"); } } catch (Exception ex) { OnReportHandler(ex.Message); throw; // бросаемся дальше } finally { StopNotifyThread(); if (m_hCtr != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(m_hCtr); } if (hCvt != IntPtr.Zero) { ZGIntf.ZG_CloseHandle(hCvt); } ZGIntf.ZG_Finalyze(); } }
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); } } }