wip good so far
This commit is contained in:
parent
1e3c7505fc
commit
68f5cba632
|
@ -45,9 +45,11 @@
|
|||
/* External variables ---------------------------------------------------------*/
|
||||
/* USER CODE BEGIN EV */
|
||||
uint8_t outbuf[128]={0x0};
|
||||
extern volatile uint8_t *sts_ac_code;
|
||||
extern volatile uint8_t sts_ac_code[20];
|
||||
extern volatile sts_cfg_nvm_t sts_cfg_nvm;
|
||||
extern volatile uint32_t rfac_timer;
|
||||
extern volatile uint32_t STS_TOFScanPeriod_msec, STS_TxPeriod_sec, STS_HeartBeatTimerPeriod_sec;
|
||||
|
||||
/* USER CODE END EV */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
|
@ -364,8 +366,8 @@ static UTIL_TIMER_Object_t YunhornSTSLampBarColorTimer;
|
|||
/**
|
||||
* @brief Tx Timer period
|
||||
*/
|
||||
static UTIL_TIMER_Time_t TxPeriodicity = APP_TX_DUTYCYCLE;
|
||||
|
||||
//static UTIL_TIMER_Time_t TxPeriodicity = APP_TX_DUTYCYCLE;
|
||||
UTIL_TIMER_Time_t TxPeriodicity = APP_TX_DUTYCYCLE;
|
||||
/**
|
||||
* @brief Join Timer period
|
||||
*/
|
||||
|
@ -499,9 +501,8 @@ void LoRaWAN_Init(void)
|
|||
}
|
||||
|
||||
/* USER CODE BEGIN LoRaWAN_Init_Last */
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n reboot config start \n");
|
||||
|
||||
//STS_REBOOT_CONFIG_Init();
|
||||
STS_REBOOT_CONFIG_Init();
|
||||
|
||||
UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), UTIL_SEQ_RFU, STS_YunhornSTSEventRFAC_Process);
|
||||
|
||||
|
@ -516,7 +517,8 @@ void LoRaWAN_Init(void)
|
|||
UTIL_TIMER_Create(&YunhornSTSWakeUpScanTimer, STS_TOFScanPeriod_msec, UTIL_TIMER_PERIODIC, (void*)OnYunhornSTSWakeUpScanTimerEvent, NULL);
|
||||
UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer);
|
||||
|
||||
UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL);
|
||||
//UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_PERIODIC, OnYunhornSTSHeartBeatTimerEvent, NULL);
|
||||
UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, 1000*STS_HeartBeatTimerPeriod_sec, UTIL_TIMER_ONESHOT, OnYunhornSTSHeartBeatTimerEvent, NULL);
|
||||
UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer);
|
||||
|
||||
/* USER CODE END LoRaWAN_Init_Last */
|
||||
|
@ -1218,26 +1220,33 @@ static void OnYunhornSTSOORSSWakeUpTimerEvent(void *context)
|
|||
static void OnYunhornSTSHeartBeatTimerEvent(void *context)
|
||||
{
|
||||
// UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0);
|
||||
UTIL_TIMER_Stop(&YunhornSTSHeartBeatTimer);
|
||||
#if 1
|
||||
uint8_t appHeartBeatDataPort, appHeartBeatBufferSize, appHeartBeatDataBuffer[32];
|
||||
appHeartBeatDataPort = YUNHORN_STS_P2_LORA_APP_HTBT_PORT;
|
||||
appHeartBeatBufferSize = 2;
|
||||
appHeartBeatDataBuffer[0]=0x80;
|
||||
appHeartBeatDataBuffer[1]=0x63; //TODO XXX change to battery level %
|
||||
|
||||
uint8_t appDataPort, appBufferSize, appDataBuffer[32];
|
||||
appDataPort = YUNHORN_STS_P2_LORA_APP_HTBT_PORT;
|
||||
appBufferSize = 2;
|
||||
appDataBuffer[0]=0x80;
|
||||
appDataBuffer[1]=0x63; //TODO XXX change to battery level %
|
||||
|
||||
STS_SENSOR_Upload_Message(appDataPort, appBufferSize, (uint8_t*)appDataBuffer);
|
||||
|
||||
if ((sts_ac_code[0]==0x0) && (sts_ac_code[19]==0x0)) /* simple validation of non-empty ac code */
|
||||
STS_SENSOR_Upload_Message(appHeartBeatDataPort, appHeartBeatBufferSize, (uint8_t*)appHeartBeatDataBuffer);
|
||||
#endif
|
||||
if (rfac_timer <100)
|
||||
{
|
||||
STS_YunhornSTSEventRFAC_Process();
|
||||
rfac_timer ++;
|
||||
}
|
||||
#if 0
|
||||
if ((sts_cfg_nvm.ac[0]==0x0) && (sts_cfg_nvm.ac[19]==0x0)) /* simple validation of non-empty ac code */
|
||||
{
|
||||
/* RFAC Challenge */
|
||||
if (rfac_timer < (STS_BURN_IN_RFAC+3)) {
|
||||
rfac_timer ++;
|
||||
}
|
||||
//STS_YunhornSTSEventRFAC_Process();
|
||||
UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventRFAC), CFG_SEQ_Prio_0);
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n Start send RFAC request \n");
|
||||
STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, 4, (uint8_t*)"RFAC");
|
||||
}
|
||||
#endif
|
||||
UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1247,25 +1256,25 @@ static void OnYunhornSTSHeartBeatTimerEvent(void *context)
|
|||
*/
|
||||
void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity)
|
||||
{
|
||||
/* USER CODE BEGIN OnTxPeriodicityChanged_1 */
|
||||
/* USER CODE BEGIN OnYunhornSTSHeartBeatPeriodicityChanged_1 */
|
||||
|
||||
/* USER CODE END OnTxPeriodicityChanged_1 */
|
||||
/* USER CODE END OnYunhornSTSHeartBeatPeriodicityChanged_1 */
|
||||
|
||||
if (periodicity == 0)
|
||||
{
|
||||
/* Revert to application default periodicity */
|
||||
/* Revert to application default Heat-beat periodicity */
|
||||
periodicity = 10*APP_TX_DUTYCYCLE; //10*10 000 ms
|
||||
}
|
||||
|
||||
/* Update timer periodicity */
|
||||
/* Update timer YunhornSTSHeartBeatTimer */
|
||||
|
||||
UTIL_TIMER_Stop(&YunhornSTSHeartBeatTimer);
|
||||
UTIL_TIMER_SetPeriod(&YunhornSTSHeartBeatTimer, periodicity);
|
||||
UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer);
|
||||
|
||||
/* USER CODE BEGIN OnTxPeriodicityChanged_2 */
|
||||
/* USER CODE BEGIN OnYunhornSTSHeartBeatPeriodicityChanged_2 */
|
||||
APP_LOG(TS_OFF, VLEVEL_H,"**************** HeartBeatPeriodicity = %u (sec)\r\n", periodicity/1000 );
|
||||
/* USER CODE END OnTxPeriodicityChanged_2 */
|
||||
/* USER CODE END OnYunhornSTSHeartBeatPeriodicityChanged_2 */
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN PrFD_YunhornSTSWakeUpScanTimerEvents */
|
||||
|
|
|
@ -43,6 +43,12 @@ uint32_t sts_hmac_verify(void)
|
|||
ret = sts_hmac_sha1((const uint8_t *) mKey, sizeof(mKey), (const uint8_t*)(uid+4), 4, &hmac_result);
|
||||
|
||||
ret = memcmp(hmac_result.hmac_tag, (void *)sts_ac_code, sizeof(sts_ac_code));
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n STS_AC_CODE \n");
|
||||
|
||||
for (uint8_t k=0; k<sizeof(sts_ac_code); k++)
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "%02d : AC: %02x\t HMAC_TAG:%02x\n", k, sts_ac_code[k], hmac_result.hmac_tag[k]);
|
||||
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n STS_AC_CODE \n");
|
||||
|
||||
hmac_result.ac_pass = (ret == 0x0)?1U:0U;
|
||||
|
||||
|
|
|
@ -98,7 +98,7 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = {
|
|||
// below 20 bytes for RFAC code
|
||||
{0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0, 0x0,0x0,0x0,0x0,0x0}
|
||||
};
|
||||
static uint8_t nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0};
|
||||
volatile uint8_t nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0};
|
||||
volatile uint8_t sts_ac_code[20]={0x0};
|
||||
volatile uint8_t sts_service_mask=STS_SERVICE_MASK_L0;
|
||||
volatile uint8_t sts_work_mode=4;
|
||||
|
@ -109,6 +109,7 @@ volatile uint32_t STS_TOFScanPeriod_msec=50, STS_TxPeriod_sec=10, STS_HeartBeatT
|
|||
static uint8_t outbuf[128]={0x0};
|
||||
extern volatile hmac_result_t hmac_result;
|
||||
extern uint16_t sensor_id;
|
||||
extern UTIL_TIMER_Time_t TxPeriodicity;
|
||||
#if 0
|
||||
volatile uint8_t sts_reed_hall_result, last_sts_reed_hall_result,sts_reed_hall_changed_flag;
|
||||
volatile uint32_t event_start_time, event_stop_time;
|
||||
|
@ -200,15 +201,15 @@ extern UTIL_TIMER_Object_t YunhornSTSHeartBeatTimer;
|
|||
/* initiated by AUTO RESPOND PARSE PROCESS */
|
||||
void STS_YunhornAuthenticationCode_Process(void)
|
||||
{
|
||||
if ((sts_ac_code[0] == 0x00) && (sts_ac_code[19]== 0x0)) {
|
||||
if ((sts_cfg_nvm.ac[0] == 0x00) && (sts_cfg_nvm.ac[19]== 0x0)) {
|
||||
APP_LOG(TS_OFF,VLEVEL_M, "Initial AC CODE blank... \r\n");
|
||||
return;
|
||||
}
|
||||
if (sts_hmac_verify() != 0)
|
||||
{
|
||||
sts_service_mask = STS_SERVICE_MASK_L2;
|
||||
sts_ac_code[0] = 0x0;
|
||||
sts_ac_code[19]= 0x0;
|
||||
sts_cfg_nvm.ac[0] = 0x0;
|
||||
sts_cfg_nvm.ac[19]= 0x0;
|
||||
} else {
|
||||
sts_service_mask = STS_SERVICE_MASK_L0;
|
||||
}
|
||||
|
@ -218,26 +219,19 @@ void STS_YunhornAuthenticationCode_Process(void)
|
|||
/* initiated by Heart-beat timer */
|
||||
void STS_YunhornSTSEventRFAC_Process(void)
|
||||
{
|
||||
if ((sts_ac_code[0] ==0x0)&& (sts_ac_code[19]== 0x0))
|
||||
|
||||
if ((rfac_timer >= STS_BURN_IN_RFAC) && (rfac_timer < (STS_BURN_IN_RFAC +3)))
|
||||
{
|
||||
if ((rfac_timer >= STS_BURN_IN_RFAC) && (rfac_timer < (STS_BURN_IN_RFAC +3)))
|
||||
{
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\r\n -------------------RFAC Process\r\n");
|
||||
STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, 4, (uint8_t*)"RFAC");
|
||||
}
|
||||
if ((rfac_timer > (STS_BURN_IN_RFAC + 2)))
|
||||
{
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\r\n -------------------Verify RFAC Success or Not\r\n");
|
||||
if (sts_hmac_verify() != 0)
|
||||
{
|
||||
sts_service_mask = STS_SERVICE_MASK_L2;
|
||||
sts_ac_code[0] = 0x0;
|
||||
sts_ac_code[19]= 0x0;
|
||||
} else {
|
||||
sts_service_mask = STS_SERVICE_MASK_L0;
|
||||
}
|
||||
}
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\r\n -RFAC Process\r\n");
|
||||
STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, 4, (uint8_t*)"RFAC");
|
||||
}
|
||||
#if 0
|
||||
if ((rfac_timer > (STS_BURN_IN_RFAC + 3)))
|
||||
{
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\r\n -Verify RFAC Success or Not\r\n");
|
||||
STS_YunhornAuthenticationCode_Process();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -1105,14 +1099,14 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s
|
|||
|
||||
periodicity_length = periodicity_length*1000; //translate to 1000ms=1s
|
||||
|
||||
|
||||
TxPeriodicity = periodicity_length;
|
||||
//OnTxPeriodicityChanged(periodicity_length);
|
||||
#if defined(STS_O6)||defined(STS_O7)
|
||||
OnYunhornSTSHeartBeatPeriodicityChanged(periodicity_length);
|
||||
#endif
|
||||
// 2024-07-31
|
||||
UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf));
|
||||
UTIL_MEM_cpy_8((void*)outbuf,(void*)parse_buffer,parse_buffer_size);
|
||||
UTIL_MEM_cpy_8(outbuf,parse_buffer,parse_buffer_size);
|
||||
i = parse_buffer_size;
|
||||
|
||||
STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf);
|
||||
|
@ -1151,7 +1145,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s
|
|||
STS_HeartBeatTimerPeriod_sec = heart_beat_or_sampling_periodicity_length;
|
||||
|
||||
#ifdef STS_P2
|
||||
//OnYunhornSTSHeartBeatPeriodicityChanged(heart_beat_or_sampling_periodicity_length*1000);
|
||||
//OnYunhornSTSHeartBeatPeriodicityChanged(STS_HeartBeatTimerPeriod_sec*1000);
|
||||
#endif
|
||||
|
||||
#ifdef YUNHORN_STS_E0_ENABLED
|
||||
|
@ -1342,9 +1336,8 @@ void STS_SENSOR_Upload_Config_Invalid_Message(void)
|
|||
void OnStoreSTSCFGContextRequest(void)
|
||||
{
|
||||
/* USER CODE BEGIN OnStoreContextRequest_1 */
|
||||
|
||||
uint8_t i=0,j=0;
|
||||
#if 1
|
||||
uint8_t nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; /* KEEP THIS LOCAL */
|
||||
sts_cfg_nvm.length = STS_NVM_CFG_SIZE;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.mtmcode1;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.mtmcode2;
|
||||
|
@ -1358,14 +1351,11 @@ void OnStoreSTSCFGContextRequest(void)
|
|||
nvm_store_value[i++] = sts_cfg_nvm.sts_service_mask;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.sts_ioc_mask;
|
||||
nvm_store_value[i++] = (uint8_t) STS_CFG_PCFG_SIZE; //sts_cfg_nvm.length;
|
||||
#endif
|
||||
|
||||
|
||||
for (j = 0; j < STS_CFG_PCFG_SIZE; j++) {
|
||||
nvm_store_value[i++] = (sts_cfg_nvm.p[j]);
|
||||
}
|
||||
|
||||
#if 1
|
||||
nvm_store_value[i++] = sts_cfg_nvm.reserve02;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.reserve03;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.sensor_install_height_in_10cm;
|
||||
|
@ -1374,44 +1364,25 @@ void OnStoreSTSCFGContextRequest(void)
|
|||
nvm_store_value[i++] = sts_cfg_nvm.alarm_lamp_bar_flashing_color;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.occupancy_overtime_threshold_in_10min;
|
||||
|
||||
|
||||
nvm_store_value[i++] = sts_cfg_nvm.motionless_duration_threshold_in_min;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.unconscious_or_motionless_level_threshold;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.fall_detection_acc_threshold;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.fall_detection_depth_threshold;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.fall_confirm_threshold_in_10sec;
|
||||
nvm_store_value[i++] = sts_cfg_nvm.occupancy_overtime_threshold_in_10min;
|
||||
#endif
|
||||
|
||||
if ((sts_cfg_nvm.ac[0]!=0x0) && (sts_cfg_nvm.ac[19]!=0x0)) {
|
||||
for (j = 0; j < YUNHORN_STS_AC_CODE_SIZE; j++) {
|
||||
nvm_store_value[i++] = (sts_cfg_nvm.ac[j]);
|
||||
}
|
||||
}
|
||||
for (uint8_t x=0; x< 64; x++)
|
||||
{
|
||||
if (x%16 ==0) APP_LOG(TS_OFF, VLEVEL_M, "\n");
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "%02x ",nvm_store_value[x]);
|
||||
}
|
||||
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n STS_CFG_NVM stored to NVM_STORE_VALUE\n");
|
||||
/* USER CODE END OnStoreContextRequest_1 */
|
||||
/* store nvm in flash */
|
||||
//UTIL_MEM_cpy_8((void*)nvm_store_value, (void *)&sts_cfg_nvm,YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
|
||||
if (FLASH_IF_Erase(STS_CONFIG_NVM_BASE_ADDRESS, FLASH_PAGE_SIZE) == FLASH_IF_OK)
|
||||
{
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n ***********FLASH ERASED ***********\n");
|
||||
if (FLASH_IF_Write(STS_CONFIG_NVM_BASE_ADDRESS, (const void *)nvm_store_value, YUNHORN_STS_MAX_NVM_CFG_SIZE) == FLASH_IF_OK)
|
||||
{
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n +++++++++++ FLASH OK +++++++++++++ \n");
|
||||
} else {
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n ----------- FLASH ERROR ------------- \n");
|
||||
}
|
||||
|
||||
//FLASH_IF_Write(STS_CONFIG_NVM_BASE_ADDRESS, (const void *)&sts_cfg_nvm, YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
} else {
|
||||
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "\n ***********FLASH NOT ERASED ***********\n");
|
||||
FLASH_IF_Write(STS_CONFIG_NVM_BASE_ADDRESS, (const void *)nvm_store_value, YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
}
|
||||
|
||||
|
||||
/* USER CODE BEGIN OnStoreContextRequest_Last */
|
||||
|
||||
|
||||
|
@ -1433,16 +1404,10 @@ void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm)
|
|||
void STS_REBOOT_CONFIG_Init(void)
|
||||
{
|
||||
/* USER CODE BEGIN OnRestoreContextRequest_1 */
|
||||
|
||||
uint8_t nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0};
|
||||
/* USER CODE END OnRestoreContextRequest_1 */
|
||||
//UTIL_MEM_cpy_8((void*)nvm_store_value, (void*)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
FLASH_IF_Read(nvm_store_value, STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
/* USER CODE BEGIN OnRestoreContextRequest_Last */
|
||||
for (uint8_t x=0; x< 64; x++)
|
||||
{
|
||||
if (x%16 ==0) APP_LOG(TS_OFF, VLEVEL_M, "\n");
|
||||
APP_LOG(TS_OFF, VLEVEL_M, "%02x ",nvm_store_value[x]);
|
||||
}
|
||||
|
||||
if ((nvm_store_value[NVM_MTM1] != sts_mtmcode1) || (nvm_store_value[NVM_MTM2] != sts_mtmcode2) || (nvm_store_value[NVM_VER] != sts_version))
|
||||
{
|
||||
|
@ -1488,7 +1453,6 @@ void STS_REBOOT_CONFIG_Init(void)
|
|||
sts_cfg_nvm.ac[j] = (uint8_t)nvm_store_value[NVM_AC_CODE_START +j];
|
||||
}
|
||||
|
||||
//UTIL_MEM_cpy_8((void*) &sts_cfg_nvm, (void*)nvm_store_value, YUNHORN_STS_MAX_NVM_CFG_SIZE);
|
||||
}
|
||||
|
||||
OnRestoreSTSCFGContextProcess();
|
||||
|
@ -1558,7 +1522,7 @@ void OnRestoreSTSCFGContextProcess(void)
|
|||
//{
|
||||
// sts_ac_code[j] = sts_cfg_nvm.ac[j];
|
||||
//}
|
||||
UTIL_MEM_cpy_8((void*)sts_ac_code,(void*)sts_cfg_nvm.ac, YUNHORN_STS_AC_CODE_SIZE);
|
||||
//UTIL_MEM_cpy_8((void*)sts_ac_code,(void*)sts_cfg_nvm.ac, YUNHORN_STS_AC_CODE_SIZE);
|
||||
|
||||
#ifdef YUNHORN_STS_O6_ENABLED
|
||||
if ((sts_version == sts_cfg_nvm.version)&& (NVM_CFG_PARAMETER_SIZE == sts_cfg_nvm.length))
|
||||
|
|
Loading…
Reference in New Issue