This commit is contained in:
cfif 2025-05-26 14:41:45 +03:00
commit 6d688be71d
21 changed files with 8875 additions and 0 deletions

31
Inc/ModemAlmanah.h Normal file
View File

@ -0,0 +1,31 @@
//
// Created by cfif on 27.02.23.
//
#ifndef GONEC_GSM_MODEMALMANAH_H
#define GONEC_GSM_MODEMALMANAH_H
#include <SerialPortIO.h>
#include "DeviceStorageIni.h"
#include <Gnss.h>
#include "ModemGonec.h"
#include "fs_interface.h"
#include "RtcIO.h"
#include "ModemGnss.h"
#include "httpd_types.h"
#include "file_logger.h"
#include "stdbool.h"
#include "stdlib.h"
#include "string.h"
#include "fs_base_func.h"
#include "httpd_base_func.h"
// Инициализация записи файла альманаха
bool initWriteAlmanah(tFs *fs);
// Запись файла альманаха
bool writeAlmanah(tModemMain *env);
#endif //GONEC_GSM_MODEMALMANAH_H

View File

@ -0,0 +1,13 @@
//
// Created by cfif on 23.03.2024.
//
#ifndef GONEC_FULL_MODEMBUFCREATEHEADER_H
#define GONEC_FULL_MODEMBUFCREATEHEADER_H
#include "ModemSendFunc.h"
bool cuteOffset(tFs *fs, char *path, char *bufDumpFile, uint32_t lenBufDumpFile, uint32_t cuteOffsetBegin);
bool isTo(char *to, char ch);
#endif //GONEC_FULL_MODEMBUFCREATEHEADER_H

65
Inc/ModemGnss.h Normal file
View File

@ -0,0 +1,65 @@
//
// Created by cfif on 08.02.23.
//
#ifndef GONEC_GSM_MODEMGNSS_H
#define GONEC_GSM_MODEMGNSS_H
#include "stdint.h"
#include "stdbool.h"
typedef struct {
double gnss_latitude;
double gnss_longitude;
uint32_t speed;
uint32_t curse;
bool valid;
} tTracertNavData;
typedef struct {
int32_t latitude;
int32_t longitude;
uint16_t direction;
bool valid;
} tNavDataMsd;
typedef struct {
bool isOneDateTime;
bool isOneValidGnss;
uint32_t region;
bool isDateTimeRecv;
bool isTimeOneStartBlock;
double gnss_latitude;
double gnss_longitude;
double latitude;
double longitude;
bool valid;
} tModemNavData;
typedef struct {
int16_t minLatitude;
int16_t maxLatitude;
int16_t minLongitude;
int16_t maxLongitude;
} tRegionData;
typedef struct {
uint8_t min;
uint8_t max;
char ewIndicator;
} tRegionDataEwIndicator;
extern const tRegionData regionData[60];
#endif //GONEC_GSM_MODEMGNSS_H

65
Inc/ModemLog.h Normal file
View File

@ -0,0 +1,65 @@
//
// Created by cfif on 18.02.23.
//
#ifndef GONEC_LOG_MODEMLOG_H
#define GONEC_LOG_MODEMLOG_H
#include <SerialPortIO.h>
#include <DeviceStorageIni.h>
#include <Gnss.h>
#include "ModemGonec.h"
#include "fs_interface.h"
#include "RtcIO.h"
#include "ModemGnss.h"
#include "httpd_types.h"
#include "file_logger.h"
#include <DeviceStorageIni.h>
typedef struct {
tSerialPortIO *io;
// tLoggerInterface *logger;
// tAtCmd modemAt;
tFs *fs;
tRtcIO *rtcIO;
tDeviceStorageIni *store;
osMutexId_t access;
// struct {
// uint8_t modemRx[2048];
// uint8_t modemTx[2048];
// } mem;
struct {
osThreadId_t id;
uint32_t stack[4096];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread;
char filename[64];
char buf[24];
uint8_t bufLog[512];
time_t timestampWriteFileLogger;
} tModemMainLog;
void ModemMainLog_Init(
tModemMainLog *env,
tDeviceStorageIni *store,
tSerialPortIO *io,
tRtcIO *rtcIO,
tFs *fs,
osMutexId_t access_log
);
void ModemMainLog_StartThread(tModemMainLog *env);
uint32_t getStateWriteLog2(tModemMainLog *env);
#endif //GONEC_LOG_MODEMLOG_H

397
Inc/ModemMain.h Normal file
View File

@ -0,0 +1,397 @@
//
// Created by cfif on 04.10.2022.
//
#ifndef MODEMMAIN_H
#define MODEMMAIN_H
#include <SerialPortIO.h>
#include <DeviceStorageIni.h>
#include <Gnss.h>
#include "ModemGonec.h"
#include "fs_interface.h"
#include "RtcIO.h"
#include "ModemGnss.h"
#include "httpd_types.h"
#include "file_logger.h"
#include "stdbool.h"
#include "GonetsReedSalmon.h"
#include "md5alg.h"
#include "Gpios.h"
#include "GonetsAlmanac.h"
//#define DEBUG_MODEM 1
//#define DEBUG_EXT_MODEM 1
#define maxFilesOutBox 128
typedef enum {
TYPE_FILE_MESSAGE = 0,
TYPE_FILE_TRACERT = 1,
TYPE_FILE_KVITIN = 2,
TYPE_FILE_AMS_RADAR = 3,
TYPE_FILE_LORA_WAN = 4
} tTypeFile;
typedef enum {
BUF_NO_RECEIVE = 0,
BUF_NO_RECEIVE_KV = 1,
BUF_RECEIVE = 2
} tBufFreeFillState;
typedef enum {
SLOT_FREE = 0,
SLOT_READY_READ_OR_WRITE = 1,
SLOT_READY_SENDING = 2,
SLOT_INIT = 3
} tStatusModem;
typedef struct {
char path_mask_fileName[MAX_LEN_PATH_FS];
} tModemStatusFile;
typedef struct {
uint32_t sendFrom[32];
uint32_t sendLen[32];
uint32_t idMessage[32];
uint32_t urgency[32];
uint8_t type[32];
uint8_t sos[32];
uint8_t id[32];
tStatusModem status[32];
} tModemStatus;
typedef struct {
uint32_t receive; // Смещение доставленных пакетов
uint32_t no_receive; // Смещение не доставленных пакетов
} tStructReceiveOffset;
typedef struct {
tTypeFile typeFile;
uint32_t from;
uint32_t mnum;
char to[MAX_LEN_PATH_FS];
uint32_t urgency;
uint32_t chSv;
char subj[MAX_LEN_PATH_FS];
uint32_t kvs;
char fileName[MAX_LEN_PATH_FS];
uint32_t dateDay;
uint32_t dateMon;
uint32_t offsetMsg;
uint32_t sizeFileRep;
uint32_t isSendAll;
uint32_t bytes_sending;
uint32_t bytes_no_sending;
uint32_t sos;
uint32_t kvt_num;
uint32_t kvt_mon;
uint32_t kvt_day;
uint32_t crc32_MSK;
uint32_t crc32_REP;
} tFileSendInfo;
typedef struct {
uint32_t bytes_sending;
uint32_t bytes_no_sending;
uint32_t mnum;
uint8_t kvs;
uint8_t valid;
uint8_t isSendAll;
} tFileSendInfoForJson;
typedef struct {
uint32_t from;
uint32_t mnumFrom;
uint32_t to;
uint32_t chSv;
uint32_t kvs;
uint32_t mnum;
uint32_t dateDay;
uint32_t dateMon;
uint32_t fileSize;
uint32_t isEnd;
uint32_t isRecvInbox;
uint32_t crc32_MSK;
uint32_t crc32_REP;
} tFileRecvInfo;
typedef enum {
StateReqAlmaNoSendStatus = 0,
StateReqAlmaSendStatus = 1,
StateReqAlmaReady = 3
} tStateReqAlma;
typedef enum {
StateReqSosStatusOff = 0,
StateReqSosStatusOn = 1
} tStateReqSos;
typedef enum {
StateReqRegNoSendStatus = 0,
StateReqRegSendStatus = 1,
} tStateReqReg;
typedef enum {
StateReqAlmaWebStop = 0,
StateReqAlmaWebRun = 1,
StateReqAlmaWebRunInit = 3
} tStateReqAlmaWebRunStop;
typedef enum {
StateReqExtNone = 0,
StateReqExtForDel = 1,
StateReqExtForCreate = 2
} tStateReqExt;
typedef enum {
MODEM_WORKING_NONE,
MODEM_WORKING_REG,
MODEM_WORKING_ALMA,
MODEM_WORKING_MSG
} tModemWorkingState;
typedef struct {
time_t EVENT_OUTBOX;
time_t EVENT_INBOX;
time_t EVENT_SENTBOX;
time_t EVENT_ALMA;
time_t EVENT_TRACERT;
} tEventWebState;
#define LEN_TRANS_PACKET 1300
typedef struct {
uint32_t numberSender;
uint32_t numberMessage;
uint32_t dataType;
uint32_t dataCreationDay;
uint32_t dataCreationMon;
bool isEnabled;
bool isCrcUpdate;
} tPacketDataForKvitin;
typedef struct {
tFs *fs;
tDeviceStorageIni *store;
tGnss *gnss;
tGpios *gpios;
tLoggerInterface *logger;
tAtCmd modemAt;
tAtCmd modemAtGsm;
tRtcIO *rtcIo;
tModemWorkingState modemWorkingState;
uint32_t stepRssi;
int32_t dataRssi[10];
uint32_t timestamp_start_block;
uint32_t timestamp_start_block_work;
uint32_t timestamp_start_block_work_add;
tModemNavData location;
tFileLogger *flog;
tPacketDataForKvitin packetDataForKvitin[16];
// tFileSendInfoForJson fileSendInfoForJson[maxFilesOutBox];
osMutexId_t accessHTTP;
osMutexId_t accessMODEM;
osMutexId_t accessMODEM_GSM;
tModemStatus modemStatus;
tStatusModem modemStatusOld[32];
bool isModemStart;
bool isRequestModemRecvSlots;
bool modemSlotSendStatusReload;
bool modemSlotReceivedStatusReload;
uint32_t testOne;
struct {
uint8_t modemRx[2048];
uint8_t modemTx[2048];
} memGonec;
struct {
uint8_t modemRx[2048];
uint8_t modemTx[2048];
} memGsm;
struct {
tStateReqExt stateReqDelExtW;
tStateReqExt stateReqCreateExtW;
tStateReqExt stateReqDelExtT;
tStateReqExt stateReqCreateExtT;
tStateReqAlma stateReqAlma;
tStateReqReg stateReqReg;
tStateReqSos stateReqSos;
tStateReqAlmaWebRunStop stateReqAlmaWebRunStop;
} stateRequest;
struct {
osThreadId_t id;
uint32_t stack[6144];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread;
// uint32_t timeStuckGetMs;
uint32_t mnumBufScan[128];
uint32_t mnumBufScanCount;
int32_t rssi;
int32_t temp;
uint32_t state;
uint32_t pwramp;
char bufLog[1024];
osMutexId_t accessTracert;
uint8_t bufReceivedPacket[LEN_TRANS_PACKET];
uint32_t bufReceivedPacketLen;
uint8_t bufSendPacketKvitin[LEN_TRANS_PACKET * 6];
uint32_t timeUpdateModemRegion;
uint8_t bufSendPacket[LEN_TRANS_PACKET];
tStructReceiveOffset structReceiveOffset[250];
tEventWebState eventWebState;
tGalois256 galois256;
tGonetsReedSalmon GonetsReedSalmonParity4;
md5a_context md5ctx_t;
md5a_context md5ctx_r;
int32_t msgId;
char gsmIMEI[16];
char gsmSimId[16];
tGonetsAlmanac alms[50];
int countAlmanac;
bool isModemCheck;
uint32_t isEnableTracerTimeStamp;
} tModemMain;
typedef struct __attribute__ ((packed)) {
uint8_t versionProtocol; // Версия протокола
uint8_t classMessage; // Класс сообщения
uint8_t typeMessage; // Тип сообщения
uint32_t typeCodingNoise: 4; // Тип помехоустойчивого кодирования
uint32_t typeTransformation: 4; // Тип преобразования сообщения
uint32_t typeCompression: 4; // Тип сжатия сообщения
uint32_t typeCrc: 4; // Тип контрольной суммы
uint32_t reserve; // Резерв
uint8_t crc8; // crc
uint32_t rc; // Р-С
} tStructRepresentationPacket;
typedef struct __attribute__ ((packed)) {
//#pragma scalar_storage_order big-endian
//#pragma pack(push, 1)
//typedef struct {
uint32_t versionProtocol: 4; // Версия протокола
uint32_t dataType: 4; // Тип данных
uint32_t numberSender: 24; // Номер отправителя
uint32_t dateCreateTransportPacketDay: 5; // Дата формирования транспортного пакета
uint32_t dateCreateTransportPacketMon: 4; // Дата формирования транспортного пакета
uint32_t numberMessage: 15; // Номер сообщения
uint32_t offsetPacket: 23; // Смещение пакета в сообщении
uint32_t isEnd: 1; // Признак последнего пакета
} tStructTransportPacket;
//#pragma pack(pop)
//#pragma scalar_storage_order little-endian
typedef struct __attribute__ ((packed)) {
//#pragma scalar_storage_order big-endian
//#pragma pack(push, 1)
//typedef struct {
uint32_t d1: 5; // Признак последнего пакета
uint32_t d2: 3; // Признак последнего пакета
uint32_t d3: 4; // Признак последнего пакета
uint32_t d4: 4; // Признак последнего пакета
uint32_t d5: 8; // Признак последнего пакета
} tGGG;
//#pragma pack(pop)
//#pragma scalar_storage_order little-endian
typedef struct __attribute__ ((packed)) {
uint32_t offsetKvitPacket: 24; // Смещение доставленных пакетов
} tStructTransportKvitPacketData;
typedef struct __attribute__ ((packed)) {
uint32_t versionProtocol: 4; // Версия протокола
uint32_t dataType: 4; // Тип данных
uint32_t numberSender: 24; // Номер отправителя
uint32_t dateCreateTransportPacketDay: 5; // Дата формирования транспортного пакета
uint32_t dateCreateTransportPacketMon: 4; // Дата формирования транспортного пакета
uint32_t numberMessage: 15; // Номер сообщения
} tStructTransportKvitPacket;
typedef struct __attribute__ ((packed)) {
uint8_t packetType; // Тип пакета
uint16_t sizeTransportPacket; // Размер транспортного служебного пакета
uint8_t numberRecipient[3]; // Номер получателя
uint8_t idArray; // Идентификатор массива
uint16_t offsetByteArray; // Смещение первого байта сегмента в массиве
uint8_t isEndSegment; // Признак последнего сегмент в массиве
uint8_t typeArray; // Тип массива
} tStructTransportPacketService;
void ModemMain_Init(
tModemMain *env,
tGpios *gpios,
tSerialPortIO *ioGonec,
tSerialPortIO *ioGsm,
tGnss *gnss,
tDeviceStorageIni *store,
tFileLogger *flog,
tFs *fs,
tRtcIO *rtcIo,
osMutexId_t accessMODEM_GSM,
osMutexId_t accessMODEM,
osMutexId_t accessHTTP,
osMutexId_t accessTracert
);
void ModemMain_StartThread(tModemMain *env);
bool stuckModem(tModemMain *env);
void getDelFilesDirScanCrc(tModemMain *env);
void controlFiles(tFs *fs, char *ext, char *path);
void sendMsd(tModemMain *env);
//void sendAmsRadar(tModemMain *env, char *buf, uint32_t buf_len);
bool almac_load_from_file(tModemMain *env);
void sendExtProtokolPack(tModemMain *env, tTypeFile typeFile, char *buf, uint32_t buf_len);
#endif //MODEMMAIN_H

16
Inc/ModemReceive.h Normal file
View File

@ -0,0 +1,16 @@
//
// Created by cfif on 21.04.23.
//
#ifndef GONEC_GSM_MODEMRECEIVE_H
#define GONEC_GSM_MODEMRECEIVE_H
#include "ModemMain.h"
void RequestModemRecvSlots(tModemMain *env);
bool HandlerModemInPaket(tModemMain *env, uint32_t id);
bool HandlerModemPaketKvitin(tModemMain *env);
// Создание файла квитанции входящего сообщения
bool createFileKvitinInbox(tModemMain *env);
bool HandlerModemKvitPaket(tModemMain *env);
#endif //GONEC_GSM_MODEMRECEIVE_H

80
Inc/ModemReceiveFunc.h Normal file
View File

@ -0,0 +1,80 @@
//
// Created by cfif on 21.02.23.
//
#ifndef GONEC_GSM_MODEMRECEIVEFUNC_C_H
#define GONEC_GSM_MODEMRECEIVEFUNC_C_H
#include <SerialPortIO.h>
#include <Gnss.h>
#include "ModemGonec.h"
#include "fs_interface.h"
#include "RtcIO.h"
#include "ModemGnss.h"
#include "httpd_types.h"
#include "file_logger.h"
#include "stdbool.h"
#include "stdlib.h"
#include "string.h"
#include "fs_base_func.h"
typedef enum {
RECV_OK = 0,
RECV_ERROR_CRC = 1,
RECV_ERROR= 2
} tReceiveBuildResult;
// Получение информации о принятых файлах
bool checkNumSentBox(tFs *fs, tRtcIO *rtc, uint32_t mnum, uint32_t from);
// Создание имени файла
void createFileNameForId(char *path, char *basePath, uint32_t id, char *ext);
// Создание имени файла
void createFileNameForId_REP_MSK_INF(char *pathRep, char *pathMsk, char *pathInf, char *basePath, uint32_t id);
// Создание имени файла из транспортного пакета
//void
//createFileFragInbox(char *path, uint32_t dateCreateTransportPacket, uint32_t numberSender, uint32_t numberMessage, char t, char *ext);
bool readRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName);
bool writeRecvFileInfo(tFs *fs, tFileRecvInfo *fileRecvInfo, char *path_inf_fileName);
bool readRepresentationRecvFileRep(tFs *fs, tStructRepresentationPacket *structRepresentationPacket,
char *path_dir_frag_inbox_fileName);
// Прием пакетов - Создание файлов
bool isReceivedCreate(tFs *fs, uint32_t mnum, uint32_t to, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len,
char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName, bool *isCrcUpdate);
// Прием пакетов - Добавление файлов
bool isReceivedAppend(tFs *fs, tStructTransportPacket *packet, uint8_t *buf, uint32_t buf_len,
char *path_dir_info_fileName, char *path_dir_mask_fileName, char *path_dir_frag_inbox_fileName, bool *isCrcUpdate);
// Сообщение принято целиком
bool isReceivedAll(tFs *fs, char *path_dir_info_fileName, char *path_dir_mask_fileName, bool *isAll);
bool Kvitin(tFs *fs, tRtcIO *rtcIo, uint32_t numberMessage, uint32_t numberSender,
char *path_dir_info_fileName, char *path_dir_mask_fileName, uint8_t *bufKvit, uint32_t *lenPacketKvit,
bool *isAll);
// Получение информации о принятых файлах квитанций
bool checkNumSentBoxKvitin(tFs *fs,
uint8_t *bufReceivedPacket,
uint32_t bufReceivedPacketLen,
uint32_t numberSender,
uint32_t numberMessage,
uint32_t dateCreateTransportPacketMon,
uint32_t dateCreateTransportPacketDay);
// Перенос собранного фрагментированного файла в хранилище принятых сообщений inbox
tReceiveBuildResult renameFromFrgToInBox(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, uint32_t idFile, tRtcIO *rtc, char *path_dir_info_fileName,
char *path_dir_frag_inbox_fileName, tLoggerInterface *logger);
tReceiveBuildResult
renameFromFrgToInBox5555(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, uint32_t idFile, tRtcIO *rtc,
char *path_dir_info_fileName,
char *path_dir_frag_inbox_fileName, tLoggerInterface *logger);
#endif //GONEC_GSM_MODEMRECEIVEFUNC_C_H

29
Inc/ModemSend.h Normal file
View File

@ -0,0 +1,29 @@
//
// Created by cfif on 21.04.23.
//
#ifndef GONEC_GSM_MODEMSEND_H
#define GONEC_GSM_MODEMSEND_H
#include "ModemMain.h"
// Количество файлов
int getCountFiles(tModemMain *env, char *path);
// Удаление самого старого файла tracert
bool delFilesOld(tModemMain *env, char *path);
void RequestSendMessagesModemSlots(tModemMain *env);
void RunStopTaskModem(tModemMain *env);
bool getIsSlotsRouting(tModemMain *env);
// Удаление файлов трассировки из отправки
bool delRepout(tModemMain *env, tTypeFile typeFile, bool isDelFiles, bool isAllFiles);
bool ModemMain_CreateOutFiles(tModemMain *env, tTypeFile typeFile, int32_t gr);
// Котроль файлов в отправке и приеме
void controlFiles(tFs *fs, char *ext, char *path);
bool getIsSlotsSos(tModemMain *env);
bool ToSentFiles(tModemMain *env, tFileSendInfo *fileSendInfo,
char *path_dir_rep_fileName,
char *path_dir_mask_fileName,
char *path_dir_info_fileName);
#endif //GONEC_GSM_MODEMSEND_H

81
Inc/ModemSendFunc.h Normal file
View File

@ -0,0 +1,81 @@
//
// Created by cfif on 21.02.23.
//
#ifndef GONEC_GSM_MODEMSENDFUNC_H
#define GONEC_GSM_MODEMSENDFUNC_H
#include <SerialPortIO.h>
#include <DeviceStorageIni.h>
#include <Gnss.h>
#include "ModemGonec.h"
#include "fs_interface.h"
#include "RtcIO.h"
#include "ModemGnss.h"
#include "httpd_types.h"
#include "file_logger.h"
#include "stdbool.h"
#include "stdlib.h"
#include "string.h"
#include "fs_base_func.h"
#include "httpd_base_func.h"
#include "ModemReceiveFunc.h"
#include "GonetsReedSalmon.h"
// Редактирование файла маски пакета транспортного уровня
bool editMaskPacketTransportKvitinCrunch(tFs *fs, uint32_t from, uint32_t lenTransPaket, char *path_mask_fileName,
tBufFreeFillState isFill);
// Поиск неотправленных блоков в файле маски
bool isFindMaskPacketTransportIsNotProc(tFs *fs, bool *isFind, char *path_mask_fileName);
// Получение имени файла по ид
//void createFileNameFromId(char *out_fileName, uint32_t id, uint8_t len_pref, char *ext);
// Создание имени файла из транспортного пакета
//void createFileFragInbox(char *path, uint32_t numberSender, uint32_t dateCreateTransportPacket, uint32_t numberMessage, char t,
// char *ext);
// Создание файлов транспортного уровня
//bool createFilesTransport(tFs *fs, tRtcIO *rtcIo, char *path_rep_fileName, tFileInfo *fileInfo, uint32_t *countPacket);
// Поиск самого срочного сообщения
uint32_t getMaxUrgencyOutbox(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, tRtcIO *rtcIo, char *path, char *out_fileName, char *path_out_fileName, tTypeFile typeFile, tDeviceStorageIni *store, uint32_t gr);
// Создание файла уровня представления
bool createFileRepresentation(tFs *fs, tGonetsReedSalmon *gonetsReedSalmon, md5a_context *md5ctx, tRtcIO *rtcIo, char *path_out_fileName, tFileSendInfo *fileSendInfo, uint32_t gr, uint32_t cuteOffsetBegin);
uint32_t getCountTypeFileInRepout(tFs *fs, tTypeFile typeFile, uint32_t *idInRepout);
uint32_t getCountTracertInRepoutCute(tFs *fs, uint32_t max);
uint32_t getOldOut(tFs *fs, char *path, uint32_t *idInRepout, uint32_t countIdInRepout);
// Создание пакета транспортного уровня
bool
createPacketTransport(tFs *fs, uint32_t offset, uint8_t *bufSendPacket, bool *isFrom, uint32_t *from, uint32_t *lenTransPaket, tFileSendInfo *fileSendInfo,
tRtcIO *rtcIo, char *path_rep_fileName, char *path_mask_fileName);
// Создание пакета квитанции
bool
createPacketKvitin(tFs *fs, uint32_t offset, uint8_t *bufSendPacket, bool *isFrom, uint32_t *from,
uint32_t *lenTransPaket,
tFileSendInfo *fileSendInfo,
tRtcIO *rtcIo, char *path_rep_fileName, char *path_mask_fileName);
// Редактирование файла маски пакета транспортного уровня
bool editMaskPacketTransport(tFs *fs, uint32_t from, uint32_t lenTransPaket, char *path_mask_fileName, tBufFreeFillState isFill);
// Поиск неотправленных блоков в файле маски
bool isFindMaskPacketTransport(tFs *fs, bool *isFind, char *path_mask_fileName, tFileSendInfo *fileSendInfo);
// Перенос файла в хранилище отправленных сообщений sentbox
bool renameFromOutBoxToSentBox(tFs *fs, tRtcIO *rtc, tFileSendInfo *fileSendInfo);
bool readSendFileInfo(tFs *fs, tFileSendInfo *fileSendInfo, char *path_inf_fileName);
bool writeSendFileInfo(tFs *fs, tFileSendInfo *fileSendInfo, char *path_inf_fileName);
bool createBufStateFileSend(tFs *fs);
#endif //GONEC_GSM_MODEMSENDFUNC_H

29
Inc/Modem_Timer.h Normal file
View File

@ -0,0 +1,29 @@
//
// Created by cfif on 16.05.23.
//
#ifndef GONEC_FULL_MODEM_TIMER_H
#define GONEC_FULL_MODEM_TIMER_H
#include "ModemMain.h"
typedef struct {
tModemMain *modemMain;
tSerialPortIO *io;
tFileLogger *flog;
tLoggerInterface *logger;
tGpios *gpios;
struct {
osThreadId_t id;
uint32_t stack[2048];
StaticTask_t controlBlock;
osThreadAttr_t attr;
} thread;
} tModemTimer;
extern volatile uint32_t timeModemStuckGetMs;
void ModemTimer_Init(tModemTimer *env, tModemMain *modemMain, tSerialPortIO *io, tFileLogger *flog, tGpios *gpios);
void ModemTimer_StartThread(tModemTimer *env);
#endif //GONEC_FULL_MODEM_TIMER_H

44
Src/ModemAlmanah.c Normal file
View File

@ -0,0 +1,44 @@
//
// Created by cfif on 27.02.23.
//
#include "ModemAlmanah.h"
// Инициализация записи файла альманаха
bool initWriteAlmanah(tFs *fs) {
FRESULT fr;
fr = f_unlink_i(fs, file_tmp_almhs);
}
// Запись файла альманаха
bool writeAlmanah(tModemMain *env) {
bool ret;
FRESULT fr;
fr = f_unlink_i(env->fs, file_tmp_almhs);
FIL file;
fr = f_open_i(env->fs, &file, (TCHAR *) file_tmp_almhs, FA_WRITE | FA_CREATE_ALWAYS);
if (fr) {
return false;
}
UINT bytes_written;
fr = f_write_i(env->fs, &file, env->bufReceivedPacket, env->bufReceivedPacketLen, &bytes_written);
f_close_i(env->fs, &file);
if (osMutexAcquire(env->accessHTTP, TIME_MUTEX_HTTP_ACCESS) == osOK) {
fr = f_unlink_i(env->fs, file_cur_almhs);
fr = f_rename_i(env->fs, file_tmp_almhs, file_cur_almhs);
osMutexRelease(env->accessHTTP);
} else {
return false;
}
almac_load_from_file(env);
return true;
}

View File

@ -0,0 +1,43 @@
//
// Created by cfif on 23.03.2024.
//
#include "ModemBufCreateHeader.h"
bool cuteOffset(tFs *fs, char *path, char *bufDumpFile, uint32_t lenBufDumpFile, uint32_t cuteOffsetBegin) {
FIL file;
FRESULT fr;
UINT bytes_read;
fr = f_open_i(fs, &file, (TCHAR *) path, FA_READ);
if (fr != FR_OK) return false;
fr = f_read_i(fs, &file, bufDumpFile, 512, &bytes_read);
if (fr != FR_OK) {
fr = f_close_i(fs, &file);
return false;
}
fr = f_close_i(fs, &file);
for (uint32_t i = cuteOffsetBegin; i < lenBufDumpFile - 13; ++i) {
bufDumpFile[i] = bufDumpFile[i + 13];
}
return true;
}
bool isTo(char *to, char ch) {
for (size_t i = 0; i < strlen(to); i++) {
if ((to[i] < '0') || (to[i] > '9')) {
return true;
}
}
if (strlen(to) > 5)
return true;
return false;
}

925
Src/ModemGnss.c Normal file
View File

@ -0,0 +1,925 @@
//
// Created by cfif on 08.02.23.
//
#include "ModemGnss.h"
const tRegionData regionData[60] = {
{0, 30, 0, 30},
{0, 30, 30, 60},
{0, 30, 60, 90},
{0, 30, 90, 120},
{0, 30, 120, 150},
{0, 30, 150, 180},
{0, 30, -150, -180},
{0, 30, -120, 150},
{0, 30, -90, -120},
{0, 30, -60, -90},
{0, 30, -30, -60},
{0, 30, 0, -30},
{30, 60, 0, 30},
{30, 60, 30, 60},
{30, 60, 60, 90},
{30, 60, 90, 120},
{30, 60, 120, 150},
{30, 60, 150, 180},
{30, 60, -150, -180},
{30, 60, -120, -150},
{30, 60, -90, -120},
{30, 60, -60, -90},
{30, 60, -30, -60},
{30, 60, 0, -30},
{60, 90, 0, 60},
{60, 90, 60, 120},
{60, 90, 120, 180},
{60, 90, -120, -180},
{60, 90, -60, -120},
{60, 90, 0, -60},
{0, -30, 0, 30},
{0, -30, 30, 60},
{0, -30, 60, 90},
{0, -30, 90, 120},
{0, -30, 120, 150},
{0, -30, 150, 180},
{0, -30, -150, -180},
{0, -30, -120, 150},
{0, -30, -90, -120},
{0, -30, -60, -90},
{0, -30, -30, -60},
{0, -30, 0, -30},
{-30, -60, 0, 30},
{-30, -60, 30, 60},
{-30, -60, 60, 90},
{-30, -60, 90, 120},
{-30, -60, 120, 150},
{-30, -60, 150, 180},
{-30, -60, -150, -180},
{-30, -60, -120, -150},
{-30, -60, -90, -120},
{-30, -60, -60, -90},
{-30, -60, -30, -60},
{-30, -60, 0, -30},
{-60, -90, 0, 60},
{-60, -90, 60, 120},
{-60, -90, 120, 180},
{-60, -90, -120, -180},
{-60, -90, -60, -120},
{-60, -90, 0, -60}
};
/*
const uint8_t bufFillOperation[2048] = {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55,
0x55, 0x55, 0x55,
0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
const uint8_t bufFreeOperationKV[2048] = {0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
0x01, 0x01, 0x01,
0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01};
*/
const uint8_t dumpAlma[] = {239, 93, 4, 161, 4, 0, 155, 0, 0, 1, 16, 5, 166, 248, 13, 2, 23, 144, 22, 103, 12, 115, 245,
164, 64, 226, 86, 65, 156, 140, 10, 94, 65, 129, 207, 15, 35, 132, 71, 91, 63, 211, 164, 20,
116, 123, 9, 247, 63, 169, 77, 156, 220, 239, 80, 217, 63, 156, 50, 55, 223, 136, 94, 19,
64, 48, 186, 188, 57, 0, 43, 187, 64, 206, 34, 142, 99, 25, 38, 19, 63, 96, 95, 232, 15,
206, 214, 151, 190, 38, 8, 166, 250, 12, 2, 23, 69, 128, 211, 187, 30, 168, 244, 64, 208,
156, 245, 35, 147, 10, 94, 65, 40, 41, 176, 0, 166, 12, 92, 63, 137, 93, 219, 219, 45, 9,
247, 63, 141, 179, 233, 8, 224, 102, 219, 63, 190, 48, 153, 42, 24, 133, 20, 64, 144, 244,
105, 21, 9, 43, 187, 64, 34, 33, 107, 151, 26, 38, 19, 63, 149, 251, 175, 105, 2, 71, 151,
190, 38, 21, 139, 136, 13, 2, 23, 108, 63, 25, 227, 131, 203, 131, 64, 229, 212, 206, 115,
125, 10, 94, 65, 209, 173, 215, 244, 160, 160, 100, 63, 188, 60, 157, 43, 74, 9, 247, 63,
114, 140, 100, 143, 80, 51, 253, 63, 79, 116, 93, 248, 193, 41, 23, 64, 10, 47, 193, 169,
235, 42, 187, 64, 156, 33, 117, 63, 26, 38, 19, 63, 190, 175, 62, 220, 221, 28, 145, 190,
38, 22, 139, 136, 13, 2, 23, 9, 107, 99, 236, 228, 31, 166, 64, 235, 198, 187, 222, 145, 10,
94, 65, 209, 173, 215, 244, 160, 160, 100, 63, 149, 99, 178, 184, 255, 8, 247, 63, 67, 84,
225, 207, 240, 38, 0, 64, 248, 51, 188, 89, 131, 119, 22, 64, 186, 188, 57, 92, 7, 43, 187,
64, 46, 32, 87, 71, 27, 38, 19, 63, 19, 9, 6, 64, 24, 254, 145, 190, 38, 23, 139, 136, 12,
2, 23, 148, 135, 133, 26, 172, 186, 244, 64, 133, 63, 195, 81, 129, 10, 94, 65, 144, 107,
67, 197, 56, 127, 99, 63, 18, 46, 228, 17, 220, 8, 247, 63, 155, 115, 240, 76, 104, 82, 250,
63, 33, 90, 43, 218, 28, 183, 23, 64, 231, 29, 167, 232, 240, 42, 187, 64, 58, 31, 67, 247,
27, 38, 19, 63, 1, 166, 200, 203, 64, 218, 143, 190, 38, 25, 55, 130, 12, 2, 23, 245, 47,
73, 229, 224, 112, 244, 64, 251, 206, 47, 139, 131, 10, 94, 65, 193, 225, 5, 17, 169, 105,
87, 63, 213, 175, 116, 62, 60, 11, 247, 63, 161, 16, 1, 135, 80, 165, 228, 63, 63, 168, 139,
20, 202, 66, 227, 63, 107, 41, 32, 237, 243, 42, 187, 64, 76, 45, 106, 212, 17, 38, 19, 63,
89, 49, 17, 158, 82, 196, 140, 190, 38, 26, 55, 131, 12, 2, 23, 63, 171, 204, 20, 26, 5,
245, 64, 211, 106, 72, 22, 127, 10, 94, 65, 157, 42, 223, 51, 18, 161, 65, 63, 178, 157,
239, 167, 198, 11, 247, 63, 64, 189, 25, 53, 95, 149, 24, 64, 5, 222, 201, 167, 199, 182,
219, 63, 194, 109, 109, 225, 237, 42, 187, 64, 41, 48, 166, 196, 15, 38, 19, 63, 169, 43,
138, 220, 109, 133, 178, 190, 38, 27, 42, 24, 12, 2, 23, 209, 144, 241, 40, 187, 251, 244,
64, 44, 182, 73, 51, 136, 10, 94, 65, 140, 16, 30, 109, 28, 177, 102, 63, 90, 45, 176, 199,
68, 10, 247, 63, 75, 120, 66, 175, 63, 169, 4, 64, 43, 221, 93, 103, 67, 78, 20, 64, 115,
247, 57, 62, 250, 42, 187, 64, 25, 39, 232, 75, 22, 38, 19, 63, 157, 104, 123, 19, 119, 180,
150, 190, 38, 30, 38, 234, 13, 2, 23, 197, 32, 176, 114, 216, 181, 165, 64, 160, 252, 221,
199, 132, 10, 94, 65, 176, 86, 237, 154, 144, 214, 88, 63, 61, 158, 150, 31, 184, 10, 247,
63, 193, 114, 132, 12, 228, 201, 24, 64, 160, 136, 69, 12, 59, 44, 16, 64, 11, 208, 182,
154, 245, 42, 187, 64, 184, 41, 31, 104, 20, 38, 19, 63, 183, 13, 119, 145, 131, 29, 163,
190, 38, 31, 38, 234, 12, 2, 23, 163, 63, 52, 115, 35, 162, 244, 64, 44, 243, 86, 221, 122,
10, 94, 65, 3, 36, 154, 64, 17, 139, 88, 63, 118, 140, 43, 46, 142, 10, 247, 63, 133, 94,
127, 18, 159, 75, 24, 64, 42, 230, 32, 232, 104, 133, 17, 64, 122, 255, 31, 39, 232, 42,
187, 64, 196, 40, 11, 24, 21, 38, 19, 63, 231, 102, 54, 85, 236, 188, 164, 190, 38, 32, 38,
234, 13, 2, 23, 18, 133, 150, 117, 255, 248, 116, 64, 57, 236, 190, 189, 114, 10, 94, 65,
145, 42, 138, 87, 89, 219, 84, 63, 136, 161, 213, 201, 25, 10, 247, 63, 56, 19, 211, 133,
88, 253, 209, 63, 200, 153, 38, 108, 63, 217, 16, 64, 65, 245, 15, 34, 221, 42, 187, 64, 36,
38, 212, 251, 22, 38, 19, 63, 151, 179, 206, 12, 141, 18, 154, 190, 38, 33, 5, 125, 12, 2,
23, 53, 39, 47, 178, 231, 107, 244, 64, 65, 14, 74, 86, 136, 10, 94, 65, 70, 234, 61, 149,
211, 158, 98, 63, 9, 51, 109, 255, 202, 10, 247, 63, 56, 19, 211, 133, 88, 253, 221, 63,
221, 233, 206, 19, 207, 249, 20, 64, 189, 114, 189, 109, 250, 42, 187, 64, 245, 41, 36, 60,
20, 38, 19, 63, 90, 47, 197, 53, 146, 168, 152, 190, 38, 34, 5, 126, 13, 2, 23, 59, 137, 8,
255, 226, 231, 118, 64, 44, 240, 21, 78, 146, 10, 94, 65, 160, 79, 228, 73, 210, 53, 99, 63,
141, 12, 114, 23, 97, 10, 247, 63, 115, 45, 90, 128, 182, 213, 227, 63, 88, 144, 102, 44,
154, 14, 20, 64, 88, 56, 73, 243, 7, 43, 187, 64, 208, 39, 247, 199, 21, 38, 19, 63, 28, 56,
241, 185, 152, 95, 150, 190, 38, 35, 5, 126, 13, 2, 23, 151, 170, 180, 197, 69, 80, 154, 64,
165, 47, 132, 161, 138, 10, 94, 65, 244, 106, 128, 210, 80, 163, 96, 63, 158, 9, 77, 18, 75,
10, 247, 63, 226, 91, 88, 55, 222, 157, 228, 63, 150, 207, 242, 60, 184, 171, 19, 64, 56,
130, 84, 138, 253, 42, 187, 64, 86, 39, 237, 31, 22, 38, 19, 63, 174, 223, 168, 181, 117,
106, 148, 190, 38};
uint32_t getAlmaSize() {
return sizeof(dumpAlma);
}
const uint8_t dump3[] = {
0xFB, 0xB5, 0x03, 0x70, 0x17, 0x00, 0x01, 0x70, 0x17, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0xF0, 0x00, 0x9E,
0xC1, 0x02, 0x18, 0x00, 0x6B, 0xD0, 0xD7, 0x00, 0x00, 0x80,
0x01, 0x01, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xB4,
0x0D, 0x4B, 0x22, 0xF3, 0xD0, 0x94, 0xD0, 0xBB,
0xD1, 0x8F, 0x20, 0xE2, 0x84, 0x96, 0x36, 0x30, 0x30, 0x30, 0x2E, 0x74, 0x78, 0x74, 0x00, 0x00,
0x33, 0x3A, 0x32, 0x31, 0x3A, 0x32, 0x32, 0x20, 0xD0,
0x9F, 0xD1, 0x80, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x80, 0xD0, 0xBA, 0xD0, 0xB0, 0x20,
0xD0, 0xB4, 0xD0, 0xB8, 0xD1, 0x81, 0xD0, 0xBA, 0xD0,
0xB0, 0x0D, 0x0A, 0xD0, 0x94, 0xD0, 0xB8, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xBA, 0xD1, 0x82, 0xD0,
0xBE, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB9, 0x20, 0x4F,
0x92, 0x04, 0x6D, 0x87, 0x5A, 0x2A, 0x18, 0xAC, 0x0C, 0x71, 0x8B, 0xAC, 0x0E, 0xFA, 0x95, 0x31,
0x32, 0x38, 0x0D, 0x0A, 0xD0, 0xA4, 0xD0, 0xB0, 0xD0,
0xB9, 0xD0, 0xBB, 0xD0, 0xBE, 0xD0, 0xB2, 0x20, 0x32, 0x31, 0x30, 0x35, 0x0D, 0x0A, 0xD0, 0x9D,
0xD1, 0x83, 0xD0, 0xBB, 0xD0, 0xB5, 0xD0, 0xB2, 0xD1,
0x8B, 0xD1, 0x85, 0x20, 0x30, 0x0D, 0x0A, 0xD0, 0x9E, 0xD1, 0x88, 0xD0, 0xB8, 0xD0, 0xB1, 0xD0,
0xBE, 0xD0, 0xBA, 0x20, 0x30, 0x0D, 0x0A, 0x50, 0x6F,
0x77, 0x65, 0x72, 0x20, 0x6F, 0x6E, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x0D, 0x0A, 0x38, 0x37,
0x41, 0x46, 0x20, 0x37, 0x37, 0x34, 0x37, 0x20, 0x33,
0x39, 0x41, 0x46, 0x20, 0x36, 0x44, 0x41, 0x31, 0x20, 0x32, 0x43, 0x41, 0x46, 0x20, 0x41, 0x39,
0x44, 0x36, 0x20, 0x38, 0x39, 0x30, 0x30, 0x20, 0x33,
0x35, 0x45, 0x35, 0x20, 0x44, 0x35, 0x44, 0x45, 0x20, 0x43, 0xFC, 0x10, 0x4B, 0xEC, 0x78, 0xFA,
0x07, 0x23, 0xCB, 0xD9, 0x0B, 0x6B, 0x06, 0x1E, 0xAF,
0xE0, 0x31, 0x30, 0x38, 0x20, 0x41, 0x31, 0x39, 0x41, 0x20, 0x46, 0x39, 0x41, 0x33, 0x20, 0x30,
0x36, 0x33, 0x30, 0x20, 0x33, 0x36, 0x30, 0x34, 0x20,
0x30, 0x39, 0x32, 0x45, 0x20, 0x33, 0x46, 0x41, 0x36, 0x20, 0x0D, 0x0A, 0xD0, 0xA4, 0xD0, 0xB0,
0xD0, 0xB9, 0xD0, 0xBB, 0x20, 0xD0, 0xBA, 0xD0, 0xBE,
0xD0, 0xBD, 0xD1, 0x84, 0xD0, 0xB8, 0xD0, 0xB3, 0xD1, 0x83, 0xD1, 0x80, 0xD0, 0xB0, 0xD1, 0x86,
0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0, 0xB7, 0xD0, 0xB0,
0xD0, 0xB3, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xB6, 0xD0, 0xB5, 0xD0, 0xBD, 0x2E, 0x0D, 0x0A, 0xD0,
0x9F, 0xD0, 0xB0, 0xD0, 0xBC, 0xD1, 0x8F, 0xD1, 0x82,
0xD1, 0x8C, 0x20, 0xD1, 0x84, 0xD0, 0xBB, 0xD1, 0x8D, 0xD1, 0x88, 0x20, 0x34, 0x30, 0x39, 0x36,
0xD0, 0xBA, 0xD0, 0x91, 0x0D, 0xA5, 0xBC, 0x09, 0x15,
0x9A, 0x4A, 0x74, 0x5E, 0x92, 0x31, 0x69, 0x30, 0x20, 0x93, 0xF4, 0xE0, 0x0A, 0xD0, 0x90, 0xD0,
0xA2, 0x3A, 0x20, 0x36, 0x31, 0x34, 0x31, 0x20, 0x20,
0x20, 0x76, 0x65, 0x72, 0x3A, 0x20, 0x20, 0x4E, 0x6F, 0x76, 0x20, 0x33, 0x30, 0x20, 0x32, 0x30,
0x31, 0x37, 0x20, 0x31, 0x38, 0x3A, 0x31, 0x38, 0x3A,
0x30, 0x31, 0x0D, 0x0A, 0x76, 0x50, 0x3A, 0x20, 0x30, 0x6D, 0x56, 0x0D, 0x0A, 0x31, 0x33, 0x3A,
0x32, 0x31, 0x3A, 0x32, 0x32, 0x20, 0x42, 0x41, 0x54,
0x2E, 0xD0, 0x9D, 0xD0, 0xB5, 0xD1, 0x82, 0x20, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB6, 0xD0, 0xB8,
0xD0, 0xBC, 0xD0, 0xB0, 0x20, 0xD0, 0xB1, 0xD0, 0xB0,
0xD1, 0x82, 0xD0, 0xB0, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB8, 0x2E, 0x0D, 0x0A, 0xD0, 0xA2, 0xD0,
0xB5, 0xD1, 0x81, 0xD1, 0x82, 0x20, 0xD0, 0xBF, 0xD1,
0x80, 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC, 0xF5, 0x9A, 0xD0, 0xCC, 0x55, 0xF5, 0x3D, 0x77, 0x5D,
0x19, 0xF0, 0x19, 0x64, 0xF7, 0x4A, 0x69, 0xD0, 0xBD,
0xD0, 0xB8, 0xD0, 0xBA, 0xD0, 0xB0, 0x0D, 0x0A, 0xD0, 0xA1, 0xD1, 0x82, 0xD0, 0xB0, 0xD1, 0x80,
0xD1, 0x82, 0x20, 0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8,
0xD0, 0xB5, 0xD0, 0xBC, 0xD0, 0xBD, 0xD0, 0xB8, 0xD0, 0xBA, 0xD0, 0xB0, 0x0D, 0x0A, 0x31, 0x33,
0x3A, 0x32, 0x31, 0x3A, 0x32, 0x36, 0x20, 0x52, 0x53,
0x53, 0x49, 0x3A, 0x20, 0x2D, 0x31, 0x30, 0x31, 0x0D, 0x0A, 0xD0, 0x9E, 0xD0, 0xBF, 0xD1, 0x80,
0xD0, 0xB5, 0xD0, 0xB4, 0xD0, 0xB5, 0xD0, 0xBB, 0xD0,
0xB5, 0xD0, 0xBD, 0x20, 0xD0, 0xB3, 0xD0, 0xB5, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB3,
0xD0, 0xB8, 0xD0, 0xBE, 0xD0, 0xBD, 0x20, 0x31, 0x34,
0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0x4D, 0xD0, 0xA1, 0x31, 0xD0,
0xBE, 0xD1, 0x3D, 0xDF, 0x32, 0x44, 0xE5, 0xAC, 0x88,
0x79, 0x05, 0x71, 0x1B, 0xBF, 0x34, 0x0F, 0x20, 0x6F, 0x81, 0xD0, 0xBD, 0x20, 0xD0, 0x9A, 0xD0,
0x90, 0x3D, 0x33, 0x30, 0x20, 0xD0, 0xB4, 0xD0, 0xBE,
0x20, 0xD0, 0x9A, 0xD0, 0x90, 0x3D, 0x31, 0x37, 0x31, 0x38, 0xD0, 0xBA, 0xD0, 0xBC, 0x20, 0x74,
0x3A, 0x31, 0x39, 0x2E, 0x36, 0x32, 0x35, 0x0D, 0x0A,
0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x72, 0x47, 0x53,
0x4D, 0x3A, 0x20, 0x30, 0x20, 0x72, 0x65, 0x73, 0x3A,
0x20, 0x30, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0xD0, 0x95, 0xD1,
0x81, 0xD1, 0x82, 0xD1, 0x8C, 0x20, 0xD0, 0xBA, 0xD0,
0xBE, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB4, 0xD0, 0xB8, 0xD0, 0xBD, 0xD0, 0xB0, 0xD1, 0x82, 0xD1,
0x8B, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD0, 0xBE,
0xD1, 0x82, 0xD0, 0xBF, 0xC0, 0x83, 0x38, 0x42, 0x64, 0xF6, 0x23, 0x1C, 0x02, 0xEA, 0x8E, 0xE7,
0x69, 0x55, 0x10, 0x98, 0xD1, 0x80, 0xD0, 0xB0, 0xD0,
0xB2, 0xD0, 0xBA, 0xD1, 0x83, 0x0D, 0x0A, 0x44, 0x6F, 0x70, 0x70, 0x6C, 0x65, 0x72, 0x3A, 0x20,
0x31, 0x36, 0x32, 0x34, 0x20, 0x48, 0x7A, 0x2E, 0x20,
0x4E, 0x6F, 0x69, 0x73, 0x65, 0x3A, 0x20, 0x36, 0x32, 0x28, 0x31, 0x33, 0x29, 0x2C, 0x32, 0x30,
0x33, 0x28, 0x39, 0x29, 0x2C, 0x31, 0x34, 0x33, 0x28,
0x31, 0x31, 0x29, 0x2C, 0x31, 0x37, 0x33, 0x28, 0x39, 0x29, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34,
0x37, 0x3A, 0x30, 0x39, 0x20, 0xD0, 0x97, 0xD0, 0xB0,
0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xBE, 0xD1, 0x81, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD0, 0xB7,
0xD0, 0xB0, 0xD0, 0xBF, 0xD0, 0xB8, 0xD1, 0x81, 0xD1,
0x8C, 0x20, 0x46, 0xD0, 0xBF, 0xD0, 0xBA, 0x3D, 0x32, 0x31, 0x37, 0x20, 0xD0, 0xA1, 0xD0, 0x9B,
0xA2, 0xA6, 0x96, 0x6B, 0x72, 0x48, 0x96, 0xF9, 0xED,
0x47, 0x37, 0x16, 0x3F, 0x8B, 0xC2, 0x98, 0x3D, 0x36, 0x36, 0x20, 0xD0, 0xA0, 0xD0, 0x97, 0x3D,
0x35, 0x35, 0x39, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34,
0x37, 0x3A, 0x31, 0x32, 0x20, 0xD0, 0x92, 0xD1, 0x8B, 0xD0, 0xB4, 0xD0, 0xB0, 0xD1, 0x87, 0xD0,
0xB0, 0x20, 0xD0, 0xBF, 0xD0, 0xBE, 0xD1, 0x81, 0xD1,
0x8B, 0xD0, 0xBB, 0xD0, 0xBA, 0xD0, 0xB8, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x31,
0x32, 0x20, 0xD0, 0x9A, 0xD0, 0x91, 0xD0, 0x9E, 0xD0,
0x9A, 0x20, 0xD1, 0x81, 0xD0, 0xB8, 0xD0, 0xBD, 0xD1, 0x85, 0xD1, 0x80, 0xD0, 0xBE, 0xD0, 0xBF,
0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x8B, 0xD0, 0xBB, 0xD0,
0xBA, 0xD0, 0xB0, 0x20, 0xD0, 0xA1, 0xD0, 0x98, 0x3D, 0x36, 0x39, 0x43, 0x81, 0xA2, 0xBB, 0xA8,
0xF9, 0x12, 0xAF, 0x65, 0x1C, 0x8C, 0x88, 0x33, 0x6E,
0x6A, 0x52, 0x86, 0xFC, 0xA3, 0x6C, 0xC2, 0x8D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const uint8_t dump2[] = {0xFB, 0xDA, 0x00, 0x70, 0x17, 0x00, 0x01, 0x70, 0x17, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0xE7,
0x00, 0xB9, 0xC1, 0x02, 0x18, 0x00, 0x6E, 0xD4, 0xD7,
0x00, 0x00, 0x80, 0x01, 0x01, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x84, 0x3D, 0x32,
0x9D, 0xD0, 0x92, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xBC,
0xD1, 0x8F, 0x20, 0x31, 0x34, 0x2D, 0x30, 0x33, 0x2D, 0x32, 0x33, 0x20, 0x31, 0x31, 0x3A, 0x33,
0x38, 0x3A, 0x34, 0x35, 0x3C, 0x64, 0x69, 0x76, 0x3E,
0x26, 0x6E, 0x62, 0x73, 0x70, 0x3B, 0xD0, 0x9E, 0xD1, 0x82, 0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB0,
0xD0, 0xB2, 0xD0, 0xBA, 0xD0, 0xB0, 0x20, 0xD0, 0xA2,
0xD0, 0xB5, 0xD0, 0xBA, 0xD1, 0x81, 0xD1, 0x82, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xBE, 0xD0, 0xB3,
0xD0, 0xBE, 0x20, 0xD1, 0x81, 0xD0, 0xBE, 0xD0, 0xBE,
0xD0, 0xB1, 0xD1, 0x89, 0xD0, 0xB5, 0xD0, 0xBD, 0xD0, 0xB8, 0xD1, 0x8F, 0x20, 0xD0, 0xBE, 0xD1,
0x82, 0x20, 0xD0, 0x90, 0xD0, 0xA2, 0x20, 0xE2, 0x84,
0x96, 0x36, 0x31, 0x34, 0x36, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD0, 0x90, 0xD0, 0xA2, 0x20,
0xE2, 0x84, 0x96, 0x36, 0x30, 0x30, 0x30, 0x20, 0xD0,
0xB2, 0x20, 0xD0, 0xBF, 0xD1, 0x80, 0xD1, 0x8F, 0xD0, 0xBC, 0xD0, 0xBE, 0xD0, 0xB9, 0x20, 0xD0,
0xB0, 0xD0, 0xB4, 0xD1, 0x80, 0xD0, 0xB5, 0xD1, 0x81,
0xD0, 0xB0, 0xD1, 0x86, 0xD0, 0xB8, 0xD0, 0xB8, 0x3C, 0x2F, 0x64, 0x69, 0x76, 0x3E, 0x31, 0xC4,
0x21, 0x49, 0x1A, 0x73, 0x81, 0x56, 0xE0, 0x2C, 0x7B,
0xED, 0xA7, 0x21, 0x24, 0x23, 0x75, 0x1F, 0xC8, 0x46, 0xE0, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
const uint8_t dump[] = {0x1A, 0x01, 0x37, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x8C, 0xCE, 0x4E, 0x1D,
0x0D, 0xF5, 0xE1, 0xCB, 0xEA, 0x3C, 0x82, 0xFF, 0xA1,
0x4D, 0x8B, 0x8E, 0xF4, 0xFB, 0xB5, 0x03, 0x70, 0x17, 0x00, 0x01, 0x70, 0x17, 0x00, 0x00, 0x00,
0x00, 0x01, 0x00, 0xF0, 0x00, 0x9E, 0xC1, 0x02, 0x18,
0x00, 0x6B, 0xD0, 0xD7, 0x00, 0x00, 0x80, 0x01, 0x01, 0x02, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
0xB4, 0x0D, 0x4B, 0x22, 0xF3, 0xD0, 0x94, 0xD0, 0xBB,
0xD1, 0x8F, 0x20, 0xE2, 0x84, 0x96, 0x36, 0x30, 0x30, 0x30, 0x2E, 0x74, 0x78, 0x74, 0x00, 0x00,
0x33, 0x3A, 0x32, 0x31, 0x3A, 0x32, 0x32, 0x20, 0xD0,
0x9F, 0xD1, 0x80, 0xD0, 0xBE, 0xD0, 0xB2, 0xD0, 0xB5, 0xD1, 0x80, 0xD0, 0xBA, 0xD0, 0xB0, 0x20,
0xD0, 0xB4, 0xD0, 0xB8, 0xD1, 0x81, 0xD0, 0xBA, 0xD0,
0xB0, 0x0D, 0x0A, 0xD0, 0x94, 0xD0, 0xB8, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xBA, 0xD1, 0x82, 0xD0,
0xBE, 0xD1, 0x80, 0xD0, 0xB8, 0xD0, 0xB9, 0x20, 0x4F,
0x92, 0x04, 0x6D, 0x87, 0x5A, 0x2A, 0x18, 0xAC, 0x0C, 0x71, 0x8B, 0xAC, 0x0E, 0xFA, 0x95, 0x31,
0x32, 0x38, 0x0D, 0x0A, 0xD0, 0xA4, 0xD0, 0xB0, 0xD0,
0xB9, 0xD0, 0xBB, 0xD0, 0xBE, 0xD0, 0xB2, 0x20, 0x32, 0x31, 0x30, 0x35, 0x0D, 0x0A, 0xD0, 0x9D,
0xD1, 0x83, 0xD0, 0xBB, 0xD0, 0xB5, 0xD0, 0xB2, 0xD1,
0x8B, 0xD1, 0x85, 0x20, 0x30, 0x0D, 0x0A, 0xD0, 0x9E, 0xD1, 0x88, 0xD0, 0xB8, 0xD0, 0xB1, 0xD0,
0xBE, 0xD0, 0xBA, 0x20, 0x30, 0x0D, 0x0A, 0x50, 0x6F,
0x77, 0x65, 0x72, 0x20, 0x6F, 0x6E, 0x20, 0x72, 0x65, 0x73, 0x65, 0x74, 0x0D, 0x0A, 0x38, 0x37,
0x41, 0x46, 0x20, 0x37, 0x37, 0x34, 0x37, 0x20, 0x33,
0x39, 0x41, 0x46, 0x20, 0x36, 0x44, 0x41, 0x31, 0x20, 0x32, 0x43, 0x41, 0x46, 0x20, 0x41, 0x39,
0x44, 0x36, 0x20, 0x38, 0x39, 0x30, 0x30, 0x20, 0x33,
0x35, 0x45, 0x35, 0x20, 0x44, 0x35, 0x44, 0x45, 0x20, 0x43, 0xFC, 0x10, 0x4B, 0xEC, 0x78, 0xFA,
0x07, 0x23, 0xCB, 0xD9, 0x0B, 0x6B, 0x06, 0x1E, 0xAF,
0xE0, 0x31, 0x30, 0x38, 0x20, 0x41, 0x31, 0x39, 0x41, 0x20, 0x46, 0x39, 0x41, 0x33, 0x20, 0x30,
0x36, 0x33, 0x30, 0x20, 0x33, 0x36, 0x30, 0x34, 0x20,
0x30, 0x39, 0x32, 0x45, 0x20, 0x33, 0x46, 0x41, 0x36, 0x20, 0x0D, 0x0A, 0xD0, 0xA4, 0xD0, 0xB0,
0xD0, 0xB9, 0xD0, 0xBB, 0x20, 0xD0, 0xBA, 0xD0, 0xBE,
0xD0, 0xBD, 0xD1, 0x84, 0xD0, 0xB8, 0xD0, 0xB3, 0xD1, 0x83, 0xD1, 0x80, 0xD0, 0xB0, 0xD1, 0x86,
0xD0, 0xB8, 0xD0, 0xB8, 0x20, 0xD0, 0xB7, 0xD0, 0xB0,
0xD0, 0xB3, 0xD1, 0x80, 0xD1, 0x83, 0xD0, 0xB6, 0xD0, 0xB5, 0xD0, 0xBD, 0x2E, 0x0D, 0x0A, 0xD0,
0x9F, 0xD0, 0xB0, 0xD0, 0xBC, 0xD1, 0x8F, 0xD1, 0x82,
0xD1, 0x8C, 0x20, 0xD1, 0x84, 0xD0, 0xBB, 0xD1, 0x8D, 0xD1, 0x88, 0x20, 0x34, 0x30, 0x39, 0x36,
0xD0, 0xBA, 0xD0, 0x91, 0x0D, 0xA5, 0xBC, 0x09, 0x15,
0x9A, 0x4A, 0x74, 0x5E, 0x92, 0x31, 0x69, 0x30, 0x20, 0x93, 0xF4, 0xE0, 0x0A, 0xD0, 0x90, 0xD0,
0xA2, 0x3A, 0x20, 0x36, 0x31, 0x34, 0x31, 0x20, 0x20,
0x20, 0x76, 0x65, 0x72, 0x3A, 0x20, 0x20, 0x4E, 0x6F, 0x76, 0x20, 0x33, 0x30, 0x20, 0x32, 0x30,
0x31, 0x37, 0x20, 0x31, 0x38, 0x3A, 0x31, 0x38, 0x3A,
0x30, 0x31, 0x0D, 0x0A, 0x76, 0x50, 0x3A, 0x20, 0x30, 0x6D, 0x56, 0x0D, 0x0A, 0x31, 0x33, 0x3A,
0x32, 0x31, 0x3A, 0x32, 0x32, 0x20, 0x42, 0x41, 0x54,
0x2E, 0xD0, 0x9D, 0xD0, 0xB5, 0xD1, 0x82, 0x20, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB6, 0xD0, 0xB8,
0xD0, 0xBC, 0xD0, 0xB0, 0x20, 0xD0, 0xB1, 0xD0, 0xB0,
0xD1, 0x82, 0xD0, 0xB0, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB8, 0x2E, 0x0D, 0x0A, 0xD0, 0xA2, 0xD0,
0xB5, 0xD1, 0x81, 0xD1, 0x82, 0x20, 0xD0, 0xBF, 0xD1,
0x80, 0xD0, 0xB8, 0xD0, 0xB5, 0xD0, 0xBC, 0xF5, 0x9A, 0xD0, 0xCC, 0x55, 0xF5, 0x3D, 0x77, 0x5D,
0x19, 0xF0, 0x19, 0x64, 0xF7, 0x4A, 0x69, 0xD0, 0xBD,
0xD0, 0xB8, 0xD0, 0xBA, 0xD0, 0xB0, 0x0D, 0x0A, 0xD0, 0xA1, 0xD1, 0x82, 0xD0, 0xB0, 0xD1, 0x80,
0xD1, 0x82, 0x20, 0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xB8,
0xD0, 0xB5, 0xD0, 0xBC, 0xD0, 0xBD, 0xD0, 0xB8, 0xD0, 0xBA, 0xD0, 0xB0, 0x0D, 0x0A, 0x31, 0x33,
0x3A, 0x32, 0x31, 0x3A, 0x32, 0x36, 0x20, 0x52, 0x53,
0x53, 0x49, 0x3A, 0x20, 0x2D, 0x31, 0x30, 0x31, 0x0D, 0x0A, 0xD0, 0x9E, 0xD0, 0xBF, 0xD1, 0x80,
0xD0, 0xB5, 0xD0, 0xB4, 0xD0, 0xB5, 0xD0, 0xBB, 0xD0,
0xB5, 0xD0, 0xBD, 0x20, 0xD0, 0xB3, 0xD0, 0xB5, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB5, 0xD0, 0xB3,
0xD0, 0xB8, 0xD0, 0xBE, 0xD0, 0xBD, 0x20, 0x31, 0x34,
0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0x4D, 0xD0, 0xA1, 0x31, 0xD0,
0xBE, 0xD1, 0x3D, 0xDF, 0x32, 0x44, 0xE5, 0xAC, 0x88,
0x79, 0x05, 0x71, 0x1B, 0xBF, 0x34, 0x0F, 0x20, 0x6F, 0x81, 0xD0, 0xBD, 0x20, 0xD0, 0x9A, 0xD0,
0x90, 0x3D, 0x33, 0x30, 0x20, 0xD0, 0xB4, 0xD0, 0xBE,
0x20, 0xD0, 0x9A, 0xD0, 0x90, 0x3D, 0x31, 0x37, 0x31, 0x38, 0xD0, 0xBA, 0xD0, 0xBC, 0x20, 0x74,
0x3A, 0x31, 0x39, 0x2E, 0x36, 0x32, 0x35, 0x0D, 0x0A,
0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0x54, 0x69, 0x6D, 0x65, 0x72, 0x47, 0x53,
0x4D, 0x3A, 0x20, 0x30, 0x20, 0x72, 0x65, 0x73, 0x3A,
0x20, 0x30, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x30, 0x39, 0x20, 0xD0, 0x95, 0xD1,
0x81, 0xD1, 0x82, 0xD1, 0x8C, 0x20, 0xD0, 0xBA, 0xD0,
0xBE, 0xD0, 0xBE, 0xD1, 0x80, 0xD0, 0xB4, 0xD0, 0xB8, 0xD0, 0xBD, 0xD0, 0xB0, 0xD1, 0x82, 0xD1,
0x8B, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD0, 0xBE,
0xD1, 0x82, 0xD0, 0xBF, 0xC0, 0x83, 0x38, 0x42, 0x64, 0xF6, 0x23, 0x1C, 0x02, 0xEA, 0x8E, 0xE7,
0x69, 0x55, 0x10, 0x98, 0xD1, 0x80, 0xD0, 0xB0, 0xD0,
0xB2, 0xD0, 0xBA, 0xD1, 0x83, 0x0D, 0x0A, 0x44, 0x6F, 0x70, 0x70, 0x6C, 0x65, 0x72, 0x3A, 0x20,
0x31, 0x36, 0x32, 0x34, 0x20, 0x48, 0x7A, 0x2E, 0x20,
0x4E, 0x6F, 0x69, 0x73, 0x65, 0x3A, 0x20, 0x36, 0x32, 0x28, 0x31, 0x33, 0x29, 0x2C, 0x32, 0x30,
0x33, 0x28, 0x39, 0x29, 0x2C, 0x31, 0x34, 0x33, 0x28,
0x31, 0x31, 0x29, 0x2C, 0x31, 0x37, 0x33, 0x28, 0x39, 0x29, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34,
0x37, 0x3A, 0x30, 0x39, 0x20, 0xD0, 0x97, 0xD0, 0xB0,
0xD0, 0xBF, 0xD1, 0x80, 0xD0, 0xBE, 0xD1, 0x81, 0x20, 0xD0, 0xBD, 0xD0, 0xB0, 0x20, 0xD0, 0xB7,
0xD0, 0xB0, 0xD0, 0xBF, 0xD0, 0xB8, 0xD1, 0x81, 0xD1,
0x8C, 0x20, 0x46, 0xD0, 0xBF, 0xD0, 0xBA, 0x3D, 0x32, 0x31, 0x37, 0x20, 0xD0, 0xA1, 0xD0, 0x9B,
0xA2, 0xA6, 0x96, 0x6B, 0x72, 0x48, 0x96, 0xF9, 0xED,
0x47, 0x37, 0x16, 0x3F, 0x8B, 0xC2, 0x98, 0x3D, 0x36, 0x36, 0x20, 0xD0, 0xA0, 0xD0, 0x97, 0x3D,
0x35, 0x35, 0x39, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34,
0x37, 0x3A, 0x31, 0x32, 0x20, 0xD0, 0x92, 0xD1, 0x8B, 0xD0, 0xB4, 0xD0, 0xB0, 0xD1, 0x87, 0xD0,
0xB0, 0x20, 0xD0, 0xBF, 0xD0, 0xBE, 0xD1, 0x81, 0xD1,
0x8B, 0xD0, 0xBB, 0xD0, 0xBA, 0xD0, 0xB8, 0x0D, 0x0A, 0x31, 0x34, 0x3A, 0x34, 0x37, 0x3A, 0x31,
0x32, 0x20, 0xD0, 0x9A, 0xD0, 0x91, 0xD0, 0x9E, 0xD0,
0x9A, 0x20, 0xD1, 0x81, 0xD0, 0xB8, 0xD0, 0xBD, 0xD1, 0x85, 0xD1, 0x80, 0xD0, 0xBE, 0xD0, 0xBF,
0xD0, 0xBE, 0xD1, 0x81, 0xD1, 0x8B, 0xD0, 0xBB, 0xD0,
0xBA, 0xD0, 0xB0, 0x20, 0xD0, 0xA1, 0xD0, 0x98, 0x3D, 0x36, 0x39, 0x43, 0x81, 0xA2, 0xBB, 0xA8,
0xF9, 0x12, 0xAF, 0x65, 0x1C, 0x8C, 0x88, 0x33, 0x6E,
0x6A, 0x52, 0x86, 0xFC, 0xA3, 0x6C, 0xC2, 0x8D, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};

155
Src/ModemLog.c Normal file
View File

@ -0,0 +1,155 @@
//
// Created by cfif on 18.02.23.
//
#include <stddef.h>
#include <SystemDelayInterface.h>
#include <ModemMain.h>
#include <CmsisRtosThreadUtils.h>
#include "SerialPort.h"
#include "stdlib.h"
#include "string.h"
#include "httpd_types.h"
#include "httpd_base_func.h"
#include "fs_base_func.h"
#include "math.h"
#include "fs_base_func.h"
#include "file_logger.h"
#include "ModemLog.h"
/*
void GsmWithGnss_Urc(tModemMainLog *env, tAtBuffer *buff) {
if (buff->data[0] == '\r')
return;
LoggerInfoRaw(LOGGER, LOG_SIGN, buff->data, buff->len);
}
*/
void ModemMainLog_Init(
tModemMainLog *env,
tDeviceStorageIni *store,
tSerialPortIO *io,
tRtcIO *rtcIO,
tFs *fs,
osMutexId_t access_log
) {
env->io = io;
env->fs = fs;
env->rtcIO = rtcIO;
env->access = access_log;
env->store = store;
env->timestampWriteFileLogger = 0;
// AtCmdInit(
// &env->modemAt, io,
// env->mem.modemTx, sizeof(env->mem.modemTx),
// env->mem.modemRx, sizeof(env->mem.modemRx),
// 1000, 1000
// );
// AtCmdSetUrcProcessor(&env->modemAt, env, GsmWithGnss_Urc);
//Инициализируем главный поток
InitThreadAtrStatic(&env->thread.attr, "ModemMainLog", env->thread.controlBlock, env->thread.stack, osPriorityNormal);
env->thread.id = 0;
}
uint32_t getStateWriteLog2(tModemMainLog *env) {
return env->timestampWriteFileLogger;
}
static uint16_t FileLoggerRaw_Write(tModemMainLog *env, uint32_t size) {
FIL file;
FRESULT fr;
if (osMutexAcquire(env->access, 8000) == osOK) {
env->filename[0] = '\0';
strcat(env->filename, dir_logs2);
time_t timestamp;
env->rtcIO->get(env->rtcIO, &timestamp);
timestamp += env->store->nvm.Settings_General.GMTcorr_v * 3600;
struct tm timestampTM;
localtime_r(&timestamp, &timestampTM);
strftime(env->buf, sizeof(env->buf), "%d-%m-%y.LOG", &timestampTM);
strcat(env->filename, env->buf);
fr = f_open_i(env->fs, &file, (TCHAR *) env->filename, FA_WRITE | FA_OPEN_APPEND);
if (fr) {
osMutexRelease(env->access);
return 0;
}
UINT bytes_written;
fr = f_write_i(env->fs, &file, env->bufLog, size, &bytes_written);
if (fr) {
f_close_i(env->fs, &file);
osMutexRelease(env->access);
return 0;
}
fr = f_close_i(env->fs, &file);
if (fr) {
osMutexRelease(env->access);
return 0;
}
osMutexRelease(env->access);
return bytes_written;
}
return 0;
}
static _Noreturn void ModemMainLog_Thread(tModemMainLog *env) {
for (;;) {
/*
if (AtCmdReceiveNextLine(&env->modemAt, 0xffff) == AT_OK) {
if (AtCmdRxBeginWithStatic(&env->modemAt, "#RSSI")) {
AtCmdRxClear(&env->modemAt);
} else {
AtCmdProcessUnresolvedLine(&env->modemAt);
AtCmdRxClear(&env->modemAt);
}
}
*/
uint16_t len = SerialPortReceive(env->io, env->bufLog, sizeof(env->bufLog), 500);
if (len > 0) {
FileLoggerRaw_Write(env, len);
env->rtcIO->get(env->rtcIO, &env->timestampWriteFileLogger);
}
//LoggerInfo(LOGGER, LOG_SIGN, (char *)env->bufLog, len);
//uint8_t data[512];
//uint16_t len = SerialPortReceive(env->io, data, sizeof(data), 2000);
//LoggerInfoRaw(LOGGER, LOG_SIGN, (char *)data, len);
}
}
void ModemMainLog_StartThread(tModemMainLog *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (ModemMainLog_Thread), (void *) (env), &env->thread.attr);
} else {
osThreadResume(env->thread.id);
}
}

1413
Src/ModemMain.c Normal file

File diff suppressed because it is too large Load Diff

1059
Src/ModemReceive.c Normal file

File diff suppressed because it is too large Load Diff

1415
Src/ModemReceiveFunc.c Normal file

File diff suppressed because it is too large Load Diff

1503
Src/ModemSend.c Normal file

File diff suppressed because it is too large Load Diff

1433
Src/ModemSendFunc.c Normal file

File diff suppressed because it is too large Load Diff

61
Src/Modem_Timer.c Normal file
View File

@ -0,0 +1,61 @@
//
// Created by cfif on 16.05.23.
//
#include "Modem_Timer.h"
#include "CmsisRtosThreadUtils.h"
#define LOGGER env->logger
#define LOG_SIGN "GONEC"
void ModemTimer_Init(tModemTimer *env, tModemMain *modemMain, tSerialPortIO *io, tFileLogger *flog, tGpios *gpios) {
env->modemMain = modemMain;
env->io = io;
env->flog = flog;
env->gpios = gpios;
InitThreadAtrStatic(&env->thread.attr, "ModemTimer", env->thread.controlBlock, env->thread.stack, osPriorityHigh);
env->thread.id = 0;
}
extern volatile uint32_t timeModemStuckGetMs;
static _Noreturn void ModemTimer_Thread(tModemTimer *env) {
uint8_t data[] = {'A', 'T', '\r', '\n'};
for (;;) {
if (env->modemMain->location.isOneDateTime == false) {
uint32_t dlStuckGetMs = SystemGetMs() - timeModemStuckGetMs;
// Если завис больше 30 секунд
if (dlStuckGetMs > 30000) {
GpioPinSet(&env->gpios->Power.gonec_reset, false);
SystemDelayMs(1000);
GpioPinSet(&env->gpios->Power.gonec_reset, true);
SystemDelayMs(6000);
timeModemStuckGetMs = SystemGetMs();
LoggerInfoStatic(LOGGER, LOG_SIGN, "Контроль задачи модема");
SerialPortTransmit(env->io, data, 4, 1000);
}
}
SystemDelayMs(1000);
}
}
void ModemTimer_StartThread(tModemTimer *env) {
if (!env->thread.id) {
env->thread.id = osThreadNew((osThreadFunc_t) (ModemTimer_Thread), (void *) (env), &env->thread.attr);
} else {
osThreadResume(env->thread.id);
}
}

18
modular.json Normal file
View File

@ -0,0 +1,18 @@
{
"dep": [
{
"type": "git",
"provider": "GONEC_NEW",
"repo": "GONEC_ARTERY_Modem_GONEC"
}
],
"cmake": {
"inc_dirs": [
"Inc"
],
"srcs": [
"Src/**.c"
]
}
}