From 7c1f5d0da87c6e8598f30cf10e782af1c422be6e Mon Sep 17 00:00:00 2001 From: cfif Date: Mon, 2 Jun 2025 13:26:39 +0300 Subject: [PATCH] Init --- IncRemapCollect.h | 8 + ModemDataCollector.c | 422 +++++++++++++++++++++++++++++++++++++++++++ ModemDataCollector.h | 72 ++++++++ modular.json | 10 + 4 files changed, 512 insertions(+) create mode 100644 IncRemapCollect.h create mode 100644 ModemDataCollector.c create mode 100644 ModemDataCollector.h create mode 100644 modular.json diff --git a/IncRemapCollect.h b/IncRemapCollect.h new file mode 100644 index 0000000..27d46e9 --- /dev/null +++ b/IncRemapCollect.h @@ -0,0 +1,8 @@ +// +// Created by zemon on 27.02.25. +// + +#ifndef SMART_COMPONENTS_V2_INCREMAPCOLLECT_H +#define SMART_COMPONENTS_V2_INCREMAPCOLLECT_H +#include "SystemSelector.h" +#endif //SMART_COMPONENTS_V2_INCREMAPCOLLECT_H diff --git a/ModemDataCollector.c b/ModemDataCollector.c new file mode 100644 index 0000000..e2103a6 --- /dev/null +++ b/ModemDataCollector.c @@ -0,0 +1,422 @@ +#include +#include +#include "ModemDataCollector.h" +#include "BaseTypes/Strings.h" +#include "AtCmdBase.h" +//#include "AtCmdCommonProtected.h" +#include "VariablesTable.h" +#include "DeviceStorage.h" +#include "SystemDelayInterface.h" +#include "AtGsmSimComA7600_SSL_LOAD_CA.h" +//#include "PowerManagment.h" + +// +// Created by zemon on 28.08.24. +// +#define LOG_SIGN "Сборщик данных модема" +#define LOGGER env->logger + +void ModemDataCollectorItit( + tModemDataColl *env, + tSim7600ePower *sim7600ePower, + tLoggerInterface *logger, + tAtCmd *gsmAt, + tDeviceStorage *storage, + tSystemSelector *systemSelector +) { + + env->modemVersionRevision.validAudio = MOD_ERROR; + env->modemVersionRevision.sertRevision.validSert = MOD_ERROR; + env->modemVersionRevision.modemStateIsValid = false; + env->fl_IsLoad = false; + env->modemVersionRevision.valid_CCID = MOD_UNDEFANDED; + env->modemVersionRevision.valid_CCIDComer = MOD_UNDEFANDED; + + env->logger = logger; + env->gsmAt = gsmAt; + env->storage = storage; + env->sim7600ePower = sim7600ePower; + env->systemSelector = systemSelector; + tVariableDescriptor *var; + env->modemVersionRevision.resIsChipSelect = false; + + env->timeIsTestModemLimit = SystemGetMs() + 60000; + + var = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_SIM_PROFILE"); + if (var->len) { + env->simProfile.length = var->len; + env->simProfile.data = var->addr; + } +} + +// окерпичиватель модема +void ModemDataCollector_ModemFlashing(tModemDataColl *env) { + env->storage->nvm->device.factoryMode = true; + EraGlonassUveosDumper_ForceDump(&env->storage->uveosDumper); + AtGsm_Gsnss_Simcom7600_GnssStopThread(env->gsmAt); + LoggerInfoStatic(LOGGER, LOG_SIGN, + "Инициализирован повторный переход в режим производственного контроля, команда получена по UDS") +} + +void ModemDataCollector_GeIds(tModemDataColl *env) { + tVariableDescriptor *var; + + if (env->sim7600ePower->thisSimChip == CHIP_ERA) { + var = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_CCID"); + } else { + var = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_CCID_COMERS"); + } + + if (var->len) { + tStringLink idValueIsStorage = { + .length = var->len, + .data = var->addr + }; + + size_t length; + AtCommandResult resIds_readIdEra = AT_ERROR; + AtCommandResult resIds_readIdComers = AT_ERROR; + + if (osMutexAcquire(env->gsmAt->access, 4000) == osOK) { + if (env->sim7600ePower->thisSimChip == CHIP_ERA) { + resIds_readIdEra = AtGsm_Gsnss_Simcom7600_GetCCID(env->gsmAt, env->modemVersionRevision.ssidValue.data, + &length); + env->modemVersionRevision.ssidValue.length = length; + } else { + resIds_readIdComers = AtGsm_Gsnss_Simcom7600_GetCCID(env->gsmAt, + env->modemVersionRevision.ssidComersValue.data, + &length); + env->modemVersionRevision.ssidComersValue.length = length; + } + osMutexRelease(env->gsmAt->access); + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления Mma_GetCGSN_1") + } + + if (var->len) { + if (env->sim7600ePower->thisSimChip == CHIP_ERA) { + if (resIds_readIdEra == AT_OK) { + if ( + (memcmp(env->modemVersionRevision.ssidValue.data, idValueIsStorage.data, length) != 0) || + (env->modemVersionRevision.ssidValue.length != *idValueIsStorage.length) + ) { + + memcpy(idValueIsStorage.data, env->modemVersionRevision.ssidValue.data, length); + *idValueIsStorage.length = length; + env->modemVersionRevision.ssidValue.length = length; + DeviceStorage_DelayedDump(env->storage); + } + env->modemVersionRevision.valid_CCID = MOD_READY; + + } else { + length = 19; + if ( + (memcmp(idValueIsStorage.data, "1111111111111111111", length) == 0) && + (*idValueIsStorage.length == length) + ) { + memcpy(env->modemVersionRevision.ssidValue.data, idValueIsStorage.data, length); + env->modemVersionRevision.ssidValue.length = length; + env->modemVersionRevision.valid_CCID = MOD_ERROR; + return; + } else { + memcpy(idValueIsStorage.data, "1111111111111111111", length); + memcpy(env->modemVersionRevision.ssidValue.data, idValueIsStorage.data, length); + *idValueIsStorage.length = length; + env->modemVersionRevision.ssidValue.length = length; + env->modemVersionRevision.valid_CCID = MOD_ERROR; + DeviceStorage_DelayedDump(env->storage); + } + } + } + + if (env->sim7600ePower->thisSimChip == CHIP_COMERS) { + env->modemVersionRevision.ssidComersValue.length = length; + if (resIds_readIdComers == AT_OK) { + if ( + (memcmp(env->modemVersionRevision.ssidComersValue.data, idValueIsStorage.data, length) != + 0) || + (env->modemVersionRevision.ssidComersValue.length != *idValueIsStorage.length) + ) { + + *idValueIsStorage.length = length; + memcpy(idValueIsStorage.data, env->modemVersionRevision.ssidComersValue.data, length); + env->modemVersionRevision.ssidComersValue.length = length; + DeviceStorage_DelayedDump(env->storage); + } + env->modemVersionRevision.valid_CCIDComer = MOD_READY; + } else { + length = 20; + if ( + (memcmp(idValueIsStorage.data, "1111111111111111111", length) == 0) && + (*idValueIsStorage.length == 20) + ) { + memcpy(env->modemVersionRevision.ssidComersValue.data, idValueIsStorage.data, length); + env->modemVersionRevision.ssidComersValue.length = length; + env->modemVersionRevision.valid_CCIDComer = MOD_ERROR; + return; + } else { + memcpy(idValueIsStorage.data, "1111111111111111111", length); + memcpy(env->modemVersionRevision.ssidComersValue.data, idValueIsStorage.data, length); + *idValueIsStorage.length = length; + env->modemVersionRevision.ssidComersValue.length = length; + env->modemVersionRevision.valid_CCIDComer = MOD_ERROR; + DeviceStorage_DelayedDump(env->storage); + } + } + } + } + } +} + +void ModemDataCollector_GetCGSN(tModemDataColl *env) { + tVariableDescriptor *var = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_CGSN"); + if (var->len) { + tStringLink cgsmidValueStorage = { + .length = var->len, + .data = var->addr + }; + + size_t length; + AtCommandResult resGetCGSN = AT_ERROR; + if (osMutexAcquire(env->gsmAt->access, 2000) == osOK) { + resGetCGSN = AtGsm_Gsnss_Simcom7600_GetCGSN(env->gsmAt, env->modemVersionRevision.cgsmValue.data, &length); + osMutexRelease(env->gsmAt->access); + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления Mma_GetCGSN_4") + } + if (var->len) { + if (resGetCGSN == AT_OK) { + env->modemVersionRevision.cgsmValue.length = length; + if ( + (memcmp(env->modemVersionRevision.cgsmValue.data, cgsmidValueStorage.data, length) != 0) || + (env->modemVersionRevision.cgsmValue.length != *cgsmidValueStorage.length) + ) { + memcpy(cgsmidValueStorage.data, env->modemVersionRevision.cgsmValue.data, length); + *cgsmidValueStorage.length = length; + env->modemVersionRevision.cgsmValue.length = length; + DeviceStorage_DelayedDump(env->storage); + } + } else { + length = 20; + if ( + (memcmp(cgsmidValueStorage.data, "1111111111111111111", length) == 0) && + (*cgsmidValueStorage.length == 20) + ) { + memcpy(env->modemVersionRevision.cgsmValue.data, cgsmidValueStorage.data, length); + env->modemVersionRevision.cgsmValue.length = length; + return; + } else { + memcpy(cgsmidValueStorage.data, "1111111111111111111", length); + memcpy(env->modemVersionRevision.cgsmValue.data, cgsmidValueStorage.data, length); + *cgsmidValueStorage.length = length; + env->modemVersionRevision.cgsmValue.length = length; + DeviceStorage_DelayedDump(env->storage); + } + } + + } + } +} + +bool DeviceTesting_ValidAsCerts(tIsFind *env) { + if ((env->isFind1) && + (env->isFind2) && + (env->isFind3) + ) { + return true; + } else { + return false; + } +} + +void ModemDataCollector_GetSertRev(tModemDataColl *env) { + if (!DeviceTesting_ValidAsCerts(&env->modemVersionRevision.sertRevision.checkCert)) { + if (osMutexAcquire(env->gsmAt->access, 500) == osOK) { + env->modemVersionRevision.sertRevision.checkCert = AtGsmSimComA7600_SSL_CHECK_CA(env->gsmAt, + "ca.pem", + sizeof("ca.pem") - 1, + "crt.pem", + sizeof("crt.pem") - 1, + "key.pem", + sizeof("key.pem") - 1, + 500); + osMutexRelease(env->gsmAt->access); + + if (DeviceTesting_ValidAsCerts(&env->modemVersionRevision.sertRevision.checkCert)) { + env->modemVersionRevision.sertRevision.validSert = MOD_READY; + } else { + env->modemVersionRevision.sertRevision.validSert = MOD_ERROR; + } + } else { + env->modemVersionRevision.sertRevision.validSert = MOD_UNDEFANDED; + } + } else { + env->modemVersionRevision.sertRevision.validSert = MOD_READY; + } +} + +void ModemDataCollector_GetAudioRev(tModemDataColl *env) { + AtCommandResult resGetCgmr; + if (env->modemVersionRevision.validAudio != MOD_READY) { + if (osMutexAcquire(env->gsmAt->access, 500) == osOK) { + resGetCgmr = AtGsm_Gsnss_Simcom7600_GetAudioFilesValidation(env->gsmAt); + osMutexRelease(env->gsmAt->access); + if (resGetCgmr == AT_OK) { + env->modemVersionRevision.validAudio = MOD_READY; + return; + } + if (resGetCgmr == AT_TIMEOUT) { + env->modemVersionRevision.validAudio = MOD_UNDEFANDED; + } + if (resGetCgmr == AT_ERROR) { + env->modemVersionRevision.validAudio = MOD_ERROR; + return; + } + } else { + env->modemVersionRevision.validAudio = MOD_UNDEFANDED; + } + } +} + +void ModemDataCollector_GetSoftRev(tModemDataColl *env) { + AtCommandResult resGetCgmr = AT_ERROR; + + tString32 cgmrValue; + size_t length; + if (osMutexAcquire(env->gsmAt->access, 2000) == osOK) { + resGetCgmr = AtGsm_Gsnss_Simcom7600_GetSoftRevInModem(env->gsmAt, cgmrValue.data, &length); + osMutexRelease(env->gsmAt->access); + } else { + LoggerInfoStatic(LOGGER, LOG_SIGN, "Ошибка захвата управления Mma_GetCGSN_5") + } + + if (resGetCgmr == AT_OK) { + + if (length > 32) { + length = 32; + } + + memcpy(env->modemVersionRevision.softValue.data, cgmrValue.data, length); + env->modemVersionRevision.softValue.length = length; + + // Сравнение с версией в storage + if (((length != env->storage->nvm->modemSaveDeviceSoftVers.length) || + (memcmp(cgmrValue.data, env->storage->nvm->modemSaveDeviceSoftVers.data, + cgmrValue.length) != 0))) { + + env->storage->nvm->modemSaveDeviceSoftVers.length = length; + memcpy(env->storage->nvm->modemSaveDeviceSoftVers.data, cgmrValue.data, cgmrValue.length); + + DeviceStorage_DelayedDump(env->storage); + + } + + } + +} + +bool ModemDataCollector_ChekSelectSimChips(tModemDataColl *env, const eSubSystems *subSystems) { + if (*subSystems == UNDEFANDET) { + ModemDataCollector_SetThisSubSystem(env->systemSelector, UNDEFANDET); + return false; + } + + tString32 ssidValueThis; + size_t length; + + if (*subSystems == TELEMATICA) { + if (env->modemVersionRevision.valid_CCIDComer == MOD_READY) { + if (osMutexAcquire(env->gsmAt->access, 4000) == osOK) { + if (AtGsm_Gsnss_Simcom7600_GetCCID(env->gsmAt, ssidValueThis.data, &length) == AT_OK) { + + if ( + (memcmp(env->modemVersionRevision.ssidComersValue.data, ssidValueThis.data, length) == 0) || + (env->modemVersionRevision.ssidComersValue.length == length) + ) { + osMutexRelease(env->gsmAt->access); + return true; + } else { + osMutexRelease(env->gsmAt->access); + return false; + } + + } else { + osMutexRelease(env->gsmAt->access); + return false; + } + } + } else { + return false; + } + + } else if (*subSystems == UVEOS) { + if (env->modemVersionRevision.valid_CCID == MOD_READY) { + if (osMutexAcquire(env->gsmAt->access, 4000) == osOK) { + if (AtGsm_Gsnss_Simcom7600_GetCCID(env->gsmAt, ssidValueThis.data, &length) == AT_OK) { + + if ( + (memcmp(env->modemVersionRevision.ssidValue.data, ssidValueThis.data, length) == 0) || + (env->modemVersionRevision.ssidValue.length == length) + ) { + osMutexRelease(env->gsmAt->access); + return true; + } else { + osMutexRelease(env->gsmAt->access); + return false; + } + + } else { + osMutexRelease(env->gsmAt->access); + return false; + } + } + } else { + return false; + } + } + return false; +} + +void ModemDataCollector_ChekReadSimChips(tModemDataColl *env) { + tVariableDescriptor *GSM_CCID; + tVariableDescriptor *GSM_CCID_COMERS; + + GSM_CCID = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_CCID"); + GSM_CCID_COMERS = VariablesTable_GetByNameStatic(&env->storage->publicVariablesTable, "GSM_CCID_COMERS"); + + if ( + (memcmp(GSM_CCID->addr, GSM_CCID_COMERS->addr, *(uint8_t *) GSM_CCID->len) == 0) && + ( + (*(uint8_t *) GSM_CCID->len == *(uint8_t *) GSM_CCID_COMERS->len) + ) + ) { + uint8_t lenghtEra = sizeof("1111111111111111111"); + uint8_t lenghtComers = sizeof("1111111111111111111"); + + memcpy(env->modemVersionRevision.ssidValue.data, "1111111111111111111", lenghtEra); + env->modemVersionRevision.ssidValue.length = lenghtEra; + + memcpy(env->modemVersionRevision.ssidComersValue.data, "1111111111111111111", lenghtComers); + env->modemVersionRevision.ssidComersValue.length = lenghtComers; + + memcpy(GSM_CCID->addr, "1111111111111111111", lenghtEra); + memcpy(GSM_CCID_COMERS->addr, "1111111111111111111", lenghtComers); + + DeviceStorage_DelayedDump(env->storage); + env->modemVersionRevision.valid_CCIDComer = MOD_ERROR; + env->modemVersionRevision.valid_CCID = MOD_ERROR; + } +} + +void ModemDataCollector_GetCCIDS(tModemDataColl *env) { + SystemDelayMs(500); + ModemDataCollector_SelectionSimChip(env->systemSelector, CHIP_ERA); + SystemDelayMs(500); + ModemDataCollector_GeIds(env); + SystemDelayMs(500); + ModemDataCollector_SelectionSimChip(env->systemSelector, CHIP_COMERS); + SystemDelayMs(500); + ModemDataCollector_GeIds(env); + + ModemDataCollector_ChekReadSimChips(env); +} \ No newline at end of file diff --git a/ModemDataCollector.h b/ModemDataCollector.h new file mode 100644 index 0000000..3cb9af3 --- /dev/null +++ b/ModemDataCollector.h @@ -0,0 +1,72 @@ +// +// Created by zemon on 28.08.24. +// + +#ifndef SMART_COMPONENTS_MODEMDATACOLLECTOR_H +#define SMART_COMPONENTS_MODEMDATACOLLECTOR_H + +#include "GsmWithGnss.h" +#include "LoggerToSerialPort.h" +#include "PwmSim7600e.h" +#include "AtGsmSimComA7600_SSL_LOAD_CA.h" +#include "IncRemapCollect.h" + +typedef enum { + MOD_UNDEFANDED = 0, + MOD_ERROR = 1, + MOD_READY = 2, +}eValidCCID; + +typedef struct { + eValidCCID validSert; + tIsFind checkCert; +} tSertRevision; + +typedef struct { + bool resIsChipSelect; + tString32 softValue; + tString32 ssidValue; + tString32 ssidComersValue; + tString32 cgsmValue; + bool modemStateIsValid; + eValidCCID valid_CCID; + eValidCCID valid_CCIDComer; + tSertRevision sertRevision; + eValidCCID validSert; + eValidCCID validAudio; + uint16_t *deviceTestFix_ModemAudioFileValidation; + uint16_t *deviceTestFix_ModemCertValidation; + uint16_t *deviceTestFix_ModemValidation; +} tVersionRevision; + + +typedef struct { + tSim7600ePower *sim7600ePower; + tLoggerInterface *logger; + tAtCmd *gsmAt; + tDeviceStorage *storage; + tVersionRevision modemVersionRevision; + tSystemSelector *systemSelector; + tStringLink simProfile; + bool fl_IsLoad; + uint32_t timeIsTestModemLimit; +} tModemDataColl; + +void ModemDataCollectorItit( + tModemDataColl *env, + tSim7600ePower *sim7600ePower, + tLoggerInterface *logger, + tAtCmd *gsmAt, + tDeviceStorage *storage, + tSystemSelector *systemSelector +); + +void ModemDataCollector_GetCCIDS(tModemDataColl *env); +void ModemDataCollector_GetCGSN(tModemDataColl *env); +void ModemDataCollector_GetSoftRev(tModemDataColl *env); +void ModemDataCollector_GetSertRev(tModemDataColl *env); +void ModemDataCollector_GetAudioRev(tModemDataColl *env); +void ModemDataCollector_ModemFlashing(tModemDataColl *env); +bool ModemDataCollector_ChekSelectSimChips(tModemDataColl *env, const eSubSystems *subSystems); + +#endif //SMART_COMPONENTS_MODEMDATACOLLECTOR_H diff --git a/modular.json b/modular.json new file mode 100644 index 0000000..0dd1901 --- /dev/null +++ b/modular.json @@ -0,0 +1,10 @@ +{ + "cmake": { + "inc_dirs": [ + "./" + ], + "srcs": [ + "./**.c" + ] + } +} \ No newline at end of file