diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 017ebde..cc55119 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -628,6 +628,8 @@ void OnStoreSTSCFGContextRequest(void); */ void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm); +void STS_REBOOT_GET_NVM_CONFIG(void); + void STS_REBOOT_CONFIG_Init(void); /** diff --git a/LoRaWAN/App/app_lorawan.c b/LoRaWAN/App/app_lorawan.c index 3425f4a..2bf6e98 100644 --- a/LoRaWAN/App/app_lorawan.c +++ b/LoRaWAN/App/app_lorawan.c @@ -26,7 +26,7 @@ #include "stm32_seq.h" /* USER CODE BEGIN Includes */ - +#include "yunhorn_sts_sensors.h" /* USER CODE END Includes */ /* External variables ---------------------------------------------------------*/ @@ -70,7 +70,7 @@ void MX_LoRaWAN_Init(void) /* USER CODE END MX_LoRaWAN_Init_1 */ SystemApp_Init(); /* USER CODE BEGIN MX_LoRaWAN_Init_2 */ - + STS_REBOOT_GET_NVM_CONFIG(); /* USER CODE END MX_LoRaWAN_Init_2 */ LoRaWAN_Init(); /* USER CODE BEGIN MX_LoRaWAN_Init_3 */ diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 53232d1..c9e84d5 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -728,14 +728,26 @@ static void OnRxData(LmHandlerAppData_t *appData, LmHandlerRxParams_t *params) } DeviceClass_t deviceClass = CLASS_A; LmHandlerGetCurrentClass( &deviceClass ); +// Save config to NVM + sts_cfg_nvm.mtmcode1 = (uint8_t)sts_mtmcode1; + sts_cfg_nvm.mtmcode2 = (uint8_t)sts_mtmcode2; + sts_cfg_nvm.version = (uint8_t)sts_version; + sts_cfg_nvm.hardware_ver = (uint8_t)sts_hardware_ver; + sts_cfg_nvm.work_mode = (uint8_t)sts_work_mode; + sts_cfg_nvm.sts_service_mask = (uint8_t)sts_service_mask; + sts_cfg_nvm.p[NVM_LORA_CLASS_ABC-12]= deviceClass; + + OnStoreSTSCFGContextRequest(); + APP_LOG(TS_OFF, VLEVEL_H, "###### YUNHORN LoRa WAN Class Changed to [ %c ] \r\n", "ABC"[deviceClass]); +// Save config to NVM + uint8_t i=0; outbuf[i++] = (uint8_t) 'L'; outbuf[i++] = (uint8_t) sts_mtmcode1; outbuf[i++] = (uint8_t) sts_mtmcode2; outbuf[i++] = (uint8_t) sts_version; outbuf[i++] = (uint8_t) (0x41+ deviceClass); //translate to 'A','B','C' - STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, outbuf); - + STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (char*)outbuf); break; case LORAWAN_USER_APP_PORT: if (appData->BufferSize == 1) @@ -1549,6 +1561,7 @@ void USER_APP_AUTO_RESPONDER_Parse(char *tlv_buf, size_t tlv_buf_size) outbuf[i++] = (uint8_t) sts_mtmcode2; outbuf[i++] = (uint8_t) sts_version; outbuf[i++] = (uint8_t) (0x41+ deviceClass); //translate to 'A','B','C' + STS_SENSOR_Upload_Message(LORAWAN_USER_APP_CTRL_REPLY_PORT, i, (char*)outbuf); } else if ((char)tlv_buf[CFG_CMD3] == 'D') { // Distance Measure "YZD" i=0; @@ -2134,51 +2147,54 @@ void OnRestoreSTSCFGContextRequest(uint8_t *cfg_in_nvm) /* USER CODE END OnRestoreSTSCFGContextRequest_Last */ } +void STS_REBOOT_GET_NVM_CONFIG(void) +{ + /* USER CODE BEGIN OnRestoreContextRequest_1 */ + uint8_t nvm_stored_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; + /* USER CODE END OnRestoreContextRequest_1 */ + UTIL_MEM_cpy_8(nvm_stored_value, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); + /* USER CODE BEGIN OnRestoreContextRequest_Last */ + + if ((nvm_stored_value[NVM_MTM1] != sts_mtmcode1) || (nvm_stored_value[NVM_MTM2] != sts_mtmcode2) || (nvm_stored_value[NVM_VER] != sts_version)) + { + APP_LOG(TS_OFF, VLEVEL_H, "\r\nInitial Boot with Empty Config, Flash with default config....\r\n"); + OnStoreSTSCFGContextRequest(); + UTIL_MEM_set_8((void *)sts_ac_code, 0x00, YUNHORN_STS_AC_CODE_SIZE); + HAL_Delay(1000); + } else + { + sts_cfg_nvm.mtmcode1 = (uint8_t)nvm_stored_value[NVM_MTM1]; + sts_cfg_nvm.mtmcode2 = (uint8_t)nvm_stored_value[NVM_MTM2]; + sts_cfg_nvm.version = (uint8_t)nvm_stored_value[NVM_VER]; + sts_cfg_nvm.hardware_ver = (uint8_t)nvm_stored_value[NVM_HWV]; + sts_cfg_nvm.periodicity = (uint8_t)(nvm_stored_value[NVM_PERIODICITY]); //TxPeriodicity interval + sts_cfg_nvm.unit = (uint8_t)(nvm_stored_value[NVM_UNIT]); + sts_cfg_nvm.sampling = (uint8_t)(nvm_stored_value[NVM_SAMPLING]); //Heart-beat or sampling interval + sts_cfg_nvm.s_unit = (uint8_t)(nvm_stored_value[NVM_S_UNIT]); + sts_cfg_nvm.work_mode = (uint8_t)(nvm_stored_value[NVM_WORK_MODE]); + sts_cfg_nvm.sts_service_mask = (uint8_t)(nvm_stored_value[NVM_SERVICE_MASK]); + sts_cfg_nvm.reseve01 = (uint8_t)(nvm_stored_value[NVM_RESERVE01]); + sts_cfg_nvm.length = (uint8_t)(nvm_stored_value[NVM_LEN]&0x3F); //MAX 32 bytes + + for (uint8_t j=0; j< sts_cfg_nvm.length; j++) { + sts_cfg_nvm.p[j] = (uint8_t)nvm_stored_value[NVM_CFG_START+j]; + } + + sts_cfg_nvm.fall_detection_acc_threshold = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_ACC_THRESHOLD]; + sts_cfg_nvm.fall_detection_depth_threshold = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_DEPTH_THRESHOLD]; + sts_cfg_nvm.fall_detection_reserve = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_RESERVE]; + sts_cfg_nvm.occupancy_overtime_threshold = (uint8_t)nvm_stored_value[NVM_OCCUPANCY_OVERTIME_THRESHOLD]; + + for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) { + sts_cfg_nvm.ac[j] = (uint8_t)nvm_stored_value[NVM_AC_CODE_START +j]; + } + } + +} void STS_REBOOT_CONFIG_Init(void) { - /* USER CODE BEGIN OnRestoreContextRequest_1 */ - uint8_t nvm_stored_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; - - /* USER CODE END OnRestoreContextRequest_1 */ - UTIL_MEM_cpy_8(nvm_stored_value, (void *)STS_CONFIG_NVM_BASE_ADDRESS, YUNHORN_STS_MAX_NVM_CFG_SIZE); - /* USER CODE BEGIN OnRestoreContextRequest_Last */ - - if ((nvm_stored_value[NVM_MTM1] != sts_mtmcode1) || (nvm_stored_value[NVM_MTM2] != sts_mtmcode2) || (nvm_stored_value[NVM_VER] != sts_version)) - { - APP_LOG(TS_OFF, VLEVEL_H, "\r\nInitial Boot with Empty Config, Flash with default config....\r\n"); - OnStoreSTSCFGContextRequest(); - UTIL_MEM_set_8((void *)sts_ac_code, 0x00, YUNHORN_STS_AC_CODE_SIZE); - HAL_Delay(1000); - } else - { - sts_cfg_nvm.mtmcode1 = (uint8_t)nvm_stored_value[NVM_MTM1]; - sts_cfg_nvm.mtmcode2 = (uint8_t)nvm_stored_value[NVM_MTM2]; - sts_cfg_nvm.version = (uint8_t)nvm_stored_value[NVM_VER]; - sts_cfg_nvm.hardware_ver = (uint8_t)nvm_stored_value[NVM_HWV]; - sts_cfg_nvm.periodicity = (uint8_t)(nvm_stored_value[NVM_PERIODICITY]); //TxPeriodicity interval - sts_cfg_nvm.unit = (uint8_t)(nvm_stored_value[NVM_UNIT]); - sts_cfg_nvm.sampling = (uint8_t)(nvm_stored_value[NVM_SAMPLING]); //Heart-beat or sampling interval - sts_cfg_nvm.s_unit = (uint8_t)(nvm_stored_value[NVM_S_UNIT]); - sts_cfg_nvm.work_mode = (uint8_t)(nvm_stored_value[NVM_WORK_MODE]); - sts_cfg_nvm.sts_service_mask = (uint8_t)(nvm_stored_value[NVM_SERVICE_MASK]); - sts_cfg_nvm.reseve01 = (uint8_t)(nvm_stored_value[NVM_RESERVE01]); - sts_cfg_nvm.length = (uint8_t)(nvm_stored_value[NVM_LEN]&0x3F); //MAX 32 bytes - - for (uint8_t j=0; j< sts_cfg_nvm.length; j++) { - sts_cfg_nvm.p[j] = (uint8_t)nvm_stored_value[NVM_CFG_START+j]; - } - - sts_cfg_nvm.fall_detection_acc_threshold = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_ACC_THRESHOLD]; - sts_cfg_nvm.fall_detection_depth_threshold = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_DEPTH_THRESHOLD]; - sts_cfg_nvm.fall_detection_reserve = (uint8_t)nvm_stored_value[NVM_FALL_DETECTION_RESERVE]; - sts_cfg_nvm.occupancy_overtime_threshold = (uint8_t)nvm_stored_value[NVM_OCCUPANCY_OVERTIME_THRESHOLD]; - - for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) { - sts_cfg_nvm.ac[j] = (uint8_t)nvm_stored_value[NVM_AC_CODE_START +j]; - } - } OnRestoreSTSCFGContextProcess(); @@ -2250,6 +2266,32 @@ void OnRestoreSTSCFGContextProcess(void) #endif +// NVM_LORA_RECONFIG ==================================================== + // 1) LoRa Class A/B/C + DeviceClass_t deviceClass=sts_cfg_nvm.p[NVM_LORA_CLASS_ABC-12], defaultclass; + defaultclass = LORAWAN_DEFAULT_CLASS; + if (defaultclass != deviceClass){ + OnClassChange(deviceClass); + APP_LOG(TS_OFF,VLEVEL_L,"\r\nSwitch LoRaWAN Class to %c \r\n", "ABC"[deviceClass]); + } + + // 2) LoRa Region and Sub Channel Plan Group + + + // 3) Uplink and Heart-beat port + + + // 4) ADR and/or DR + + + // 5) Activation Type ABP/OTAA + + + // 6) TX Power + + +// NVM_LORA_RECONFIG ==================================================== + #ifdef YUNHORN_STS_O6_ENABLED sts_lamp_bar_color = STS_GREEN; sts_fall_detection_acc_threshold = (uint8_t)sts_cfg_nvm.fall_detection_acc_threshold*10;