Демонстрирует настройку расписания контроллера.
#include <codecvt>
#include <exception>
#include <fstream>
#include <iomanip>
#include <iostream>
#include <limits>
#include <string>
#define ILG_LOG_FILE
using namespace ilg;
uint8_t g_nBankCount = 0;
uint32_t g_nCtrFlags = 0;
const char* kModeNames[] = {"Неактивный", "Норма", "Блок", "Свободно", "Ожидание"};
#ifdef ILG_LOG
const char kLogLevelChars[] = {'-', 'E', 'W', 'I', 'D'};
const char kLogFileName[] = "ilguard.log";
#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
std::cout << "Временные зоны для прохода:" << std::endl;
const char32_t szDowTitles[] = U"ПВСЧПСВ";
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cv;
char32_t szDows[8] = {0};
for (uint8_t i = 0; i < g_nBankCount; i++) {
std::cout << "Банк " << i << ":" << std::endl;
for (size_t j = 0; j < std::size(aTZs); j++) {
pTz = &aTZs[j];
for (size_t k = 0; k < 7; k++)
std::cout << j << "." << cv.to_bytes(szDows) << " " << std::setfill('0') << std::setw(2)
<<
" " << std::setw(2) << (uint)pTz->
nEndHour <<
":" << std::setw(2)
}
std::cout << std::endl;
}
std::cout << "Временные зоны для переключения режима контроллера:" << std::endl;
for (size_t j = 0; j < std::size(aModeTZs); j++) {
pModeTz = &aModeTZs[j];
for (size_t k = 0; k < 7; k++)
std::cout << j << "." << cv.to_bytes(szDows) << " " << std::setfill('0') << std::setw(2)
<<
" " << std::setw(2) << (uint)pTz->
nEndHour <<
":" << std::setw(2)
<< (uint)pTz->
nEndMinute <<
" " << kModeNames[pModeTz->
nMode] << std::endl;
}
}
std::cout <<
"Выполнено за " <<
since(tStartTime).count() <<
" мс" << std::endl;
}
std::cout << "Введите номер банка, номер временной зоны, дни недели (ПВСЧПСВ), время начала "
"(ЧЧ:ММ), время конца (ЧЧ:ММ):"
<< std::endl;
uint nBankN, nZoneN;
std::string sDows;
std::tm tmBegin = {};
std::tm tmEnd = {};
std::cin >> nBankN >> nZoneN >> sDows >> std::get_time(&tmBegin, "%H:%M") >>
std::get_time(&tmEnd, "%H:%M");
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
if (std::cin.fail()) {
std::cout << "Неправильный ввод" << std::endl;
return;
}
uint nDows = 0;
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> cv;
auto s = cv.from_bytes(sDows);
auto c = std::min(s.length(), 7lu);
for (size_t i = 0; i < c; i++)
if (s[i] != '-')
rTz.
nBeginHour =
static_cast<uint8_t
>(tmBegin.tm_hour);
rTz.
nEndHour =
static_cast<uint8_t
>(tmEnd.tm_hour);
rTz.
nEndMinute =
static_cast<uint8_t
>(tmEnd.tm_min);
std::cout << "Запись... " << std::endl;
oController.
WriteTimeZones(
static_cast<uint8_t
>(nBankN),
static_cast<size_t>(nZoneN), &rTz, 1);
std::cout <<
"Записано за " <<
since(tStartTime).count() <<
" мс" << std::endl;
}
if (rParams.
nDiffSec != std::numeric_limits<int64_t>::max()) {
time_t t = time(
nullptr) + rParams.
nDiffSec;
auto tm = *std::localtime(&t);
std::cout << "Дата и время: " << std::put_time(&tm, "%d-%m-%Y %H:%M:%S") << std::endl;
}
else
std::cout << "Дата и время не корректные" << std::endl;
}
std::cout <<
"Синхронизировано за " <<
since(tStartTime).count() <<
" мс" << std::endl;
ShowClock(oController);
}
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];
ss <<
" с/н:" << rInfo.
nSn;
ss <<
" прошивка:" <<
VersionToStr(rInfo.
nFwVersion);
ss <<
" режим: " << kConverterModeNames[rInfo.
nMode];
<< "]: " << 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] <<
": "
std::stringstream ss;
ss << kConverterModelNames[rInfo.
nModel];
ss <<
" с/н:" << rInfo.
nSn;
ss <<
" прошивка:" << VersionToStr(rInfo.
nFwVersion);
ss <<
" режим: " << kConverterModeNames[rInfo.
nMode];
std::cout << "Конвертер успешно подключён [" << ss.str() << ']' << std::endl;
return true;
}
int nCommand;
while (true) {
std::cout << "Выберите контроллер:" << std::endl;
for (size_t i = 0; i < nCount; i++) {
std::stringstream ss;
ss <<
" " << kControllerModelNames[rInfo.
nModel];
ss <<
" с/н:" << rInfo.
nSn;
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;
}
std::cout <<
"Подключение к контроллеру [" << kControllerModelNames[rInfo.
nModel] <<
": "
<< rInfo.
nSn <<
"]..." << std::endl;
std::cout <<
"Контроллер успешно подключён [#" << rInfo.
nAddress <<
' '
<< kControllerModelNames[rInfo.
nModel] <<
" с/н:" << rInfo.
nSn
<<
" прошивка:" << VersionToStr(rInfo.
nFwVersion) <<
']' << std::endl;
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);
#endif
if (!DoConnectToConverter(oILG, oConverter))
return 0;
if (!DoConnectToController(oConverter, oController))
return 0;
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 << "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:
ShowSchedule(oController);
break;
case 2:
SetTimezone(oController);
break;
case 3:
ShowClock(oController);
break;
case 4:
SyncClock(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 ReadTimeZones(uint8_t nBankN, size_t nIdx, ilg_time_zone *pBuf, size_t nCount, size_t *pRead=nullptr)
Читает временные зоны из контроллера.
Definition: ilg_cpp_helpers.h:2298
void SyncClock()
Синхронизирует часы контроллера с часами ПК.
Definition: ilg_cpp_helpers.h:2498
void GetControllerInfo(ilg_controller_info &rInfo) const
Возвращает информацию о контроллере.
Definition: ilg_cpp_helpers.h:2220
void WriteTimeZones(uint8_t nBankN, size_t nIdx, const ilg_time_zone *pTZs, size_t nCount, size_t *pWritten=nullptr)
Пишет временные зоны в контроллер.
Definition: ilg_cpp_helpers.h:2314
void Connect(bool fReconnect=false)
Подключается к контроллеру.
Definition: ilg_cpp_helpers.h:2194
void ReadModeTimeZones(size_t nIdx, ilg_mode_time_zone *pBuf, size_t nCount)
Читает временные зоны для переключения режима контроллера.
Definition: ilg_cpp_helpers.h:2330
void ReadRtcParams(ilg_rtc_params &rParams)
Читает параметры RTC из контроллера.
Definition: ilg_cpp_helpers.h:2462
Класс поиска конвертеров.
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_DUALZONE
Definition: ilguard.h:859
@ ILG_CTR_F_TWOBANKS
Definition: ilguard.h:847
@ ILG_CTR_F_MODES
Definition: ilguard.h:857
Заголовочный файл SDK Guard с классами-помощниками C++.
#define SET_BIT(val, bitN, On)
Устанавливает/снимает бит bitN в числе val.
Definition: ilg_cpp_helpers.h:3601
#define GET_BIT(val, bitN)
Возвращает true если бит bitN установлен в числе val.
Definition: ilg_cpp_helpers.h:3593
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:1088
ilg_controller_mode nMode
Definition: ilguard.h:1100
Definition: ilguard.h:1306
int64_t nDiffSec
Definition: ilguard.h:1308
Definition: ilguard.h:1049
uint8_t nBeginHour
Definition: ilguard.h:1054
uint8_t nBeginMinute
Definition: ilguard.h:1057
uint8_t nEndMinute
Definition: ilguard.h:1063
uint8_t nEndHour
Definition: ilguard.h:1060
uint8_t nDaysOfWeek
Definition: ilguard.h:1051