SDK Guard 1.0.1
SDK для связи с сетевыми контроллерами Iron logic
controller_lock/main.cpp

Демонстрирует настройку времён замка контроллера.

#include <exception>
#include <fstream> // для std::fstream
#include <iomanip> // для std::put_time
#include <iostream> // для std::cout и std::cin
// #define ILG_LOG // Раскомментируйте, чтобы включить показ отладочных сообщений
#define ILG_LOG_FILE // Писать лог в файл
using namespace ilg;
// Глобальные переменные:
uint8_t g_nBankCount = 0;
bool g_fEmergencyMode = false;
#ifdef ILG_LOG
const char kLogLevelChars[] = {'-', 'E', 'W', 'I', 'D'};
const char kLogFileName[] = "ilguard.log"; // Путь к лог файлу
void ILG_CALL LogCallback(ilg_log_level level, const char* pContext, const char* pMessage, void*) {
#if 1 // Запись в файл
std::fstream file(kLogFileName, std::ios_base::out | std::ios_base::app);
auto& out = file;
#else // иначе в консоль
auto& out = std::cout;
#endif
auto t = std::time(nullptr);
auto tmb = std::localtime(&t);
out << std::put_time(tmb, "%d-%m-%Y %H:%M:%S") << " [" << kLogLevelChars[level] << ' '
<< pContext << "] " << pMessage << std::endl;
}
#endif
// Показывает времена замка контроллера
void ShowLockTimes(CController& oController) {
uint16_t nOpen, nLet, nMax;
bool fBigTime;
for (uint8_t i = 0; i < g_nBankCount; i++) {
oController.ReadLockTimes(i, nOpen, nLet, nMax, fBigTime);
std::cout << "Банк " << i << ':' << std::endl;
std::cout << "Время открытия двери (0.1 с): " << nOpen << std::endl;
std::cout << "Время контроля закрытой двери (0.1 с): " << nLet << std::endl;
std::cout << "Время контроля открытой двери (0.1 с): " << nMax << std::endl;
std::cout << "Большое время: " << fBigTime << std::endl;
std::cout << "------------" << std::endl;
}
}
// Устанавливает времена замка контроллера
void SetLockTimes(CController& oController) {
std::cout << "Введите номер банка, время открытия (0.1 с), время контроля закрытой двери (0.1 "
"с), время контроля открытой двери (0.1 с):"
<< std::endl;
uint nBankN, nOpen, nLet, nMax;
std::cin >> nBankN >> nOpen >> nLet >> nMax;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (std::cin.fail()) {
std::cout << "Неправильный ввод" << std::endl;
return;
}
auto fBigTime = (nOpen > 255) || (nLet > 255) || (nMax > 255);
std::cout << "Запись..." << std::endl;
auto tStartTime = now();
oController.WriteLockTimes(static_cast<uint8_t>(nBankN), static_cast<uint16_t>(nOpen),
static_cast<uint16_t>(nLet), static_cast<uint16_t>(nMax), fBigTime);
std::cout << "Записано за " << since(tStartTime).count() << " мс" << std::endl;
}
// Открывает дверь
void OpenDoor(CController& oController, bool fOut) {
std::cout << "Открытие двери..." << std::endl;
auto tStartTime = now();
oController.OpenDoor(fOut);
std::cout << "Выполнено за " << since(tStartTime).count() << " мс" << std::endl;
}
// Переключает режим аварийного открывания дверей
void ToggleEmergencyMode(CController& oController) {
std::cout << "Переключение режима..." << std::endl;
auto fEnable = !g_fEmergencyMode;
auto tStartTime = now();
oController.SetEmergencyMode(fEnable);
g_fEmergencyMode = fEnable;
std::cout << "Выполнено за " << since(tStartTime).count() << " мс" << std::endl;
}
// Подключается к конвертеру
bool DoConnectToConverter(CILG& oILR, CConverter& oConverter) {
// Ищем конвертеры
CConverterSearch oSearch(oILR.GetSearch());
std::cout << "Поиск конвертеров..." << std::endl;
oSearch.Scan();
auto nCount = oSearch.GetConverterCount();
if (0 == nCount) {
std::cout << "Конвертер не найден" << std::endl;
return false;
}
std::cout << "Найдено конвертеров: " << nCount << std::endl;
std::cout << std::endl << "Выберите конвертер:" << std::endl;
for (size_t i = 0; i < nCount; i++) {
oSearch.GetConverterInfo(i, rInfo);
std::stringstream ss;
ss << kConverterModelNames[rInfo.nModel];
if (rInfo.nSn != -1)
ss << " с/н:" << rInfo.nSn;
if (rInfo.nFwVersion != 0)
ss << " прошивка:" << VersionToStr(rInfo.nFwVersion);
if (rInfo.nFwBuildDate != 0)
ss << " сборка " << TimeToStr(rInfo.nFwBuildDate);
ss << " режим: " << kConverterModeNames[rInfo.nMode];
std::cout << 1 + i << ". " << rInfo.pszPortName << " [" << rInfo.pszConnect
<< "]: " << ss.str() << std::endl;
}
std::cout << "0 - Выйти из программы" << std::endl;
int nCommand;
std::cin >> nCommand;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (std::cin.fail()) {
std::cin.clear();
nCommand = -1;
}
if ((nCommand <= 0) || (static_cast<size_t>(nCommand) > nCount))
return false;
oSearch.GetConverterInfo(static_cast<size_t>(nCommand - 1), rInfo);
std::cout << "Подключение к конвертеру [" << kPortTypeNames[rInfo.nPortType] << ": "
<< rInfo.pszPortName << "]..." << std::endl;
oConverter = oILR.GetConverter(rInfo.nPortType, rInfo.pszPortName);
oConverter.GetOptions(rOptions);
rOptions.nConnectModel = rInfo.nModel;
oConverter.SetOptions(rOptions);
// Подключаемся к конвертеру
oConverter.Connect();
// Получаем информацию о конвертере
oConverter.GetConverterInfo(rInfo);
std::stringstream ss;
ss << kConverterModelNames[rInfo.nModel];
if (rInfo.nSn != -1)
ss << " с/н:" << rInfo.nSn;
if (rInfo.nFwVersion != 0)
ss << " прошивка:" << VersionToStr(rInfo.nFwVersion);
if (rInfo.nFwBuildDate != 0)
ss << " сборка " << TimeToStr(rInfo.nFwBuildDate);
ss << " режим: " << kConverterModeNames[rInfo.nMode];
std::cout << "Конвертер успешно подключён [" << ss.str() << ']' << std::endl;
return true;
}
// Подключается к контроллеру
bool DoConnectToController(CConverter& oConverter, CController& oController) {
// Поиск контроллеров
int nCommand;
while (true) {
std::cout << "Выберите контроллер:" << std::endl;
oConverter.Scan();
auto nCount = oConverter.GetControllerCount();
for (size_t i = 0; i < nCount; i++) {
oConverter.GetControllerInfo(i, rInfo);
std::stringstream ss;
ss << " " << kControllerModelNames[rInfo.nModel];
if (rInfo.nSn != -1)
ss << " с/н:" << rInfo.nSn;
if (rInfo.nFwVersion != 0)
ss << " прошивка:" << VersionToStr(rInfo.nFwVersion);
std::cout << i + 1 << ". #" << (uint)rInfo.nAddress << ": " << ss.str() << std::endl;
}
if (0 == nCount)
std::cout << "1 - Искать снова" << std::endl;
std::cout << "0 - Выйти из программы" << std::endl;
std::cin >> nCommand;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (std::cin.fail()) {
std::cin.clear();
nCommand = -1;
}
if (0 == nCommand)
return false;
if ((nCommand >= 1) && (static_cast<size_t>(nCommand) <= nCount))
break;
}
oConverter.GetControllerInfo(static_cast<size_t>(nCommand - 1), rInfo);
oController = oConverter.GetController(rInfo.nModel, rInfo.nSn);
// Подключаемся к контроллеру
std::cout << "Подключение к контроллеру [" << kControllerModelNames[rInfo.nModel] << ": "
<< rInfo.nSn << "]..." << std::endl;
oController.Connect();
// Получаем информацию о контроллере
oController.GetControllerInfo(rInfo);
std::cout << "Контроллер успешно подключён [#" << (uint)rInfo.nAddress << ' '
<< kControllerModelNames[rInfo.nModel] << " с/н:" << rInfo.nSn
<< " прошивка:" << VersionToStr(rInfo.nFwVersion) << ']' << std::endl;
// Выключаем авто поиск контроллеров (не обязательно)
oConverter.SetAutoScan(false);
return true;
}
int main() {
try {
#ifdef ILG_LOG
#ifdef ILG_LOG_FILE
// Очищаем лог файл
std::ofstream file(kLogFileName, std::ios_base::out | std::ios_base::trunc);
file.close();
#endif
// Включаем лог отладки
CILG::SetLogCallback(LogCallback);
CILG::SetLogLevel(ILG_LOG_LEVEL_DEBUG);
#endif
CILG oILG;
// Подключаемся к конвертеру
CConverter oConverter;
if (!DoConnectToConverter(oILG, oConverter))
return 0;
// Подключаемся к контроллеру
CController oController;
if (!DoConnectToController(oConverter, oController))
return 0;
// Инициализируем глобальные справочные переменные
oController.GetControllerInfo(rInfo);
g_nBankCount = (rInfo.nCtrFlags & ILG_CTR_F_TWOBANKS) ? 2 : 1;
ilg_rtc_params rParams;
oController.ReadRtcParams(rParams);
g_fEmergencyMode = rParams.fEmergencyOpen;
}
while (true) {
std::cout << "-----" << std::endl;
std::cout << "Введите номер команды:" << std::endl;
std::cout << "1 - Показать времена замка" << std::endl;
std::cout << "2 - Установить времена замка..." << std::endl;
std::cout << "3 - Открыть дверь (вход)" << std::endl;
std::cout << "4 - Открыть дверь (выход)" << std::endl;
std::cout << "5 - Переключить режим аварийного открывания дверей: "
<< std::boolalpha << g_fEmergencyMode << std::endl;
std::cout << "0 - Выйти из программы" << std::endl;
int nCommand;
std::cin >> nCommand;
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (std::cin.fail()) {
std::cin.clear();
nCommand = -1;
}
switch (nCommand) {
case 0:
return 0;
case 1:
ShowLockTimes(oController);
break;
case 2:
SetLockTimes(oController);
break;
case 3:
OpenDoor(oController, false);
break;
case 4:
OpenDoor(oController, true);
break;
case 5:
ToggleEmergencyMode(oController);
break;
default:
std::cout << "Неправильный ввод" << std::endl;
break;
}
}
}
catch (const std::exception& e) {
std::cerr << e.what() << std::endl;
}
return 0;
}
Класс контроллера.
Definition: ilg_cpp_helpers.h:680
void SetEmergencyMode(bool fEnable)
Вкл/выкл старый режим аварийного открывания дверей.
Definition: ilg_cpp_helpers.h:2508
void GetControllerInfo(ilg_controller_info &rInfo) const
Возвращает информацию о контроллере.
Definition: ilg_cpp_helpers.h:2220
void Connect(bool fReconnect=false)
Подключается к контроллеру.
Definition: ilg_cpp_helpers.h:2194
void WriteLockTimes(uint8_t nBankN, uint16_t nOpen, uint16_t nLet, uint16_t nMax, bool fBigTime)
Пишет времена замка в память контроллера.
Definition: ilg_cpp_helpers.h:2254
void ReadLockTimes(uint8_t nBankN, uint16_t &nOpen, uint16_t &nLet, uint16_t &nMax, bool &fBigTime)
Читает времена замка из памяти контроллера.
Definition: ilg_cpp_helpers.h:2234
void ReadRtcParams(ilg_rtc_params &rParams)
Читает параметры RTC из контроллера.
Definition: ilg_cpp_helpers.h:2462
void OpenDoor(bool fOut)
Открывает дверь.
Definition: ilg_cpp_helpers.h:2544
Класс поиска конвертеров.
Definition: ilg_cpp_helpers.h:265
Класс конвертера.
Definition: ilg_cpp_helpers.h:2778
CController GetController(ilg_controller_model nModel, int nSn)
Возвращает дескриптор подключения к контроллеру.
Definition: ilg_cpp_helpers.h:3410
void Scan(bool fReset=false, bool fForce=false)
Ищет контроллеры.
Definition: ilg_cpp_helpers.h:3362
void GetControllerInfo(size_t nIdx, ilg_controller_info &rInfo) const
Возвращает инфо о найденном контроллере.
Definition: ilg_cpp_helpers.h:3379
void SetOptions(const ilg_converter_options &rOptions)
Устанавливает параметры конвертера.
Definition: ilg_cpp_helpers.h:3255
void SetAutoScan(bool fEnable=true, bool fWait=false)
Вкл/выкл режим авто поиска контроллеров.
Definition: ilg_cpp_helpers.h:3383
void GetConverterInfo(ilg_converter_info &rInfo) const
Возвращает информацию о конвертере.
Definition: ilg_cpp_helpers.h:3289
void Connect(bool fReconnect=false)
Подключается к конвертеру.
Definition: ilg_cpp_helpers.h:3263
size_t GetControllerCount() const
Возвращает количество найденных контроллеров.
Definition: ilg_cpp_helpers.h:3373
void GetOptions(ilg_converter_options &rOptions) const
Возвращает параметры конвертера.
Definition: ilg_cpp_helpers.h:3259
Класс для инициализации/финализации библиотеки SDK.
Definition: ilg_cpp_helpers.h:3425
CConverterSearch GetSearch()
Создаёт дескриптор поиска конвертеров.
Definition: ilg_cpp_helpers.h:3575
CConverter GetConverter(ilg_port_type nPortType, const char *pszPortName)
Создаёт дескриптор конвертера.
Definition: ilg_cpp_helpers.h:3581
@ ILG_CTR_F_TWOBANKS
Definition: ilguard.h:847
@ ILG_CTR_F_OLDEMERGOPEN
Definition: ilguard.h:861
Заголовочный файл SDK Guard с классами-помощниками C++.
std::chrono::steady_clock::time_point now()
Definition: ilg_cpp_helpers.h:3605
auto since(std::chrono::time_point< clock_t, duration_t > const &start)
Возвращает интервал времени в миллисекундах от времени start до текущего времени.
Definition: ilg_cpp_helpers.h:3616
Заголовочный файл API SDK Guard.
#define ILG_CALL
Макрос, определяющий соглашение о вызове функций.
Definition: ilguard.h:68
@ ILG_CONTROLLER_MODEL_UNKNOWN
Definition: ilguard.h:384
@ ILG_CONVERTER_MODE_UNKNOWN
Definition: ilguard.h:327
ilg_log_level
Уровень лога.
Definition: ilguard.h:434
@ ILG_LOG_LEVEL_DEBUG
Отладочные сообщения.
Definition: ilguard.h:464
@ ILG_CONVERTER_MODEL_UNKNOWN
Definition: ilguard.h:287
Информация о контроллере.
Definition: ilguard.h:937
uint32_t nCtrFlags
Definition: ilguard.h:953
int nSn
Definition: ilguard.h:947
uint8_t nAddress
Definition: ilguard.h:943
uint32_t nFwVersion
Definition: ilguard.h:945
ilg_controller_model nModel
Definition: ilguard.h:939
Информация о конвертере.
Definition: ilguard.h:527
ilg_port_type nPortType
Definition: ilguard.h:529
const char * pszPortName
Definition: ilguard.h:531
int64_t nFwBuildDate
Definition: ilguard.h:545
ilg_converter_model nModel
Definition: ilguard.h:536
const char * pszConnect
Definition: ilguard.h:534
ilg_converter_mode nMode
Definition: ilguard.h:547
uint32_t nFwVersion
Definition: ilguard.h:542
int nSn
Definition: ilguard.h:538
Настройки конвертера.
Definition: ilguard.h:801
ilg_converter_model nConnectModel
Definition: ilguard.h:803
Definition: ilguard.h:1306
ilg_bool fEmergencyOpen
Definition: ilguard.h:1316