From b167d2c1d98034b7c7d4775dfba5c13a4b9c4157 Mon Sep 17 00:00:00 2001 From: YunHorn Technology Date: Tue, 3 Dec 2024 23:08:45 +0800 Subject: [PATCH] pre-PRD --- Core/Inc/sts_weight_scale.h | 16 ++++ Core/Src/main.c | 5 +- Core/Src/stm32_lpm_if.c | 36 ++++++++- Core/Src/sts_weight_scale.c | 93 ++++++++-------------- LoRaWAN/App/lora_app.c | 13 ++-- STM32CubeIDE/Release/WLE5CC_NODE_STS.elf | Bin 170460 -> 175292 bytes STS/Core/Inc/yunhorn_sts_sensors.h | 13 +++- STS/Core/Src/yunhorn_sts_process.c | 94 ++++++++++++++++++++++- 8 files changed, 193 insertions(+), 77 deletions(-) diff --git a/Core/Inc/sts_weight_scale.h b/Core/Inc/sts_weight_scale.h index 4367621..33b623d 100644 --- a/Core/Inc/sts_weight_scale.h +++ b/Core/Inc/sts_weight_scale.h @@ -44,6 +44,22 @@ typedef struct } sts_sensor_t; +typedef struct +{ + uint32_t weight_scale_value; + uint8_t tare_off; + uint8_t calibration_knob_value; + uint8_t zero; + uint8_t measure_unit; /* 01: g, 02: kg, 03:pnd, 04: ton */ + float gapvalue; + float gapvalue_default; + uint8_t calibrated; /* 0: not calibrated, 1: calibrated */ + uint16_t range_high; + uint16_t range_low; + uint16_t resolution; + uint16_t range_overload; + +} sts_weight_scale_cfg_t; void sts_weight_scale_init(void); void sts_weight_scale(void); diff --git a/Core/Src/main.c b/Core/Src/main.c index 3264a4b..510ff9b 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -104,7 +104,8 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); PME_ON; -#if 0 + //vcom_DeInit(); +#if 1 if(__HAL_PWR_GET_FLAG(PWR_FLAG_SB) != RESET) { __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); @@ -120,7 +121,7 @@ int main(void) MX_LoRaWAN_Init(); } - sts_weight_scale_init(); + //sts_weight_scale_init(); /* USER CODE BEGIN 2 */ diff --git a/Core/Src/stm32_lpm_if.c b/Core/Src/stm32_lpm_if.c index 5523477..6e7824b 100644 --- a/Core/Src/stm32_lpm_if.c +++ b/Core/Src/stm32_lpm_if.c @@ -78,22 +78,56 @@ const struct UTIL_LPM_Driver_s UTIL_PowerDriver = void PWR_EnterOffMode(void) { +#if 1 /* USER CODE BEGIN EnterOffMode_1 */ + HAL_GPIO_DeInit(GPIOA,GPIO_PIN_All); + HAL_GPIO_DeInit(GPIOB,GPIO_PIN_All); + HAL_GPIO_DeInit(GPIOC,GPIO_PIN_All); + HAL_SuspendTick(); + // SHOULD ADD FOLLOWING LINES + /* Clear Status Flag before entering STOP/STANDBY Mode */ + LL_PWR_ClearFlag_C1STOP_C1STB(); + + + HAL_PWR_EnterSTANDBYMode(); +#endif /* USER CODE END EnterOffMode_1 */ } void PWR_ExitOffMode(void) { +#if 1 /* USER CODE BEGIN ExitOffMode_1 */ + /* USER CODE BEGIN ExitOffMode_1 */ + HAL_ResumeTick(); + // SHOULD ADD FOLLOWING LINES + PME_ON; + /*Not retained periph: + ADC interface + DAC interface USARTx, TIMx, i2Cx, SPIx + SRAM ctrls, DMAx, DMAMux, AES, RNG, HSEM */ + + /* Resume not retained USARTx and DMA */ + //vcom_Resume(); + /* USER CODE BEGIN ExitStopMode_2 */ + MX_GPIO_Init(); + MX_DMA_Init(); + MX_I2C2_Init(); +#endif /* USER CODE END ExitOffMode_1 */ } void PWR_EnterStopMode(void) { /* USER CODE BEGIN EnterStopMode_1 */ - + PME_OFF; +#if 1 + HAL_GPIO_DeInit(GPIOA,GPIO_PIN_All); + HAL_GPIO_DeInit(GPIOB,GPIO_PIN_All); + HAL_GPIO_DeInit(GPIOC,GPIO_PIN_All); +#endif /* USER CODE END EnterStopMode_1 */ HAL_SuspendTick(); /* Clear Status Flag before entering STOP/STANDBY Mode */ diff --git a/Core/Src/sts_weight_scale.c b/Core/Src/sts_weight_scale.c index ff44407..1fd31a7 100644 --- a/Core/Src/sts_weight_scale.c +++ b/Core/Src/sts_weight_scale.c @@ -21,13 +21,13 @@ #include "sts_weight_scale.h" #include uint32_t HX711_Buffer=0; -volatile uint32_t gross_weight; +volatile uint32_t gross_weight=0; volatile int32_t net_weight; uint8_t Flag_Error; volatile uint32_t last_net_weight=0; volatile sts_sensor_t sts_sensor_data; volatile uint32_t sts_weight_scale_value_g = 0, sts_weight_tare_g=0; - +volatile sts_weight_scale_cfg_t ws_cfg={0, 0, 1, 0, 1, 276.2394, 276.2394, 0, 5000, 0, 1,6000}; //校准参数 @@ -51,6 +51,14 @@ void sts_weight_scale_init(void) { HX711_Init(); Get_GrossWeight(); + if (ws_cfg.calibrated !=0) + { + sts_gap_value = ws_cfg.gapvalue; + } else { + sts_gap_value = ws_cfg.gapvalue_default; + } + + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n --- GapValue=%u \r\n", (int)sts_gap_value); } void sts_weight_scale_tare_off(void) @@ -64,48 +72,25 @@ void sts_weight_scale_zero(void) } void sts_weight_calibration(uint8_t knob_weights_in_kg) { - uint32_t diff_value=0.0, tmp_gap_value=0; + float calibrated_gap_value=0.0; HX711_Buffer = HX711_Read(); if(HX711_Buffer >= gross_weight) { net_weight = HX711_Buffer; net_weight = net_weight - gross_weight; //获取实物的AD采样数值。 - tmp_gap_value = net_weight/(1000*knob_weights_in_kg); + calibrated_gap_value = (float)net_weight/(1000.0*knob_weights_in_kg); } - APP_LOG(TS_OFF, VLEVEL_M, "\r\n gap Value =%u \r\n", tmp_gap_value); - - APP_LOG(TS_OFF, VLEVEL_M, "\r\n GapValue == %u \r\n", sts_gap_value); - - while(0) - { - HX711_Buffer = HX711_Read(); - if(HX711_Buffer >= gross_weight) - { - net_weight = HX711_Buffer; - net_weight = net_weight - gross_weight; //获取实物的AD采样数值。 - tmp_gap_value = net_weight/(1000*knob_weights_in_kg); - - //net_weight = (int32_t)((float)net_weight/(float)GapValue); //计算实物的实际重量 - net_weight = (int32_t)((float)net_weight/(float)sts_gap_value); //计算实物的实际重量 - } + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n Previous GapValue == %u \r\n", (int)sts_gap_value); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n Calibrated GapValue == %u \r\n", (int)calibrated_gap_value); - diff_value = (int32_t)(net_weight - knob_weights_in_kg*1000); - if ( diff_value > 0 ) - { - sts_gap_value +=0.1; + ws_cfg.calibrated = 1; + sts_gap_value = calibrated_gap_value; + ws_cfg.gapvalue = calibrated_gap_value; - } else if (diff_value < 0) { - - sts_gap_value -=0.1; - } - - if ((diff_value <= 0.1) && (diff_value >=0)) - break; - - } + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n --------Calibrated GapValue =%u \r\n", (int)sts_gap_value); #if 0 APP_LOG(TS_OFF, VLEVEL_M, "\r\n ##### Knob Weight=%u, We got =%u, Diff =%u GapValue=%u\r\n", @@ -122,37 +107,19 @@ void sts_weight_calibration(uint8_t knob_weights_in_kg) void sts_weight_scale(void) { - //PME_ON; - //HAL_Delay(500); + PME_ON; + //APP_LOG(TS_OFF, VLEVEL_M, "\r\n STS_GAP_VALUE=%u \r\n STS_CALIBRATED=%u \r\n STS_GAP_DEFAULT=%u \r\n GapValue\r\n", + //(int)sts_gap_value, (int)ws_cfg.calibrated, (int)ws_cfg.gapvalue_default, (int)ws_cfg.gapvalue); + HAL_Delay(100); + Get_NetWeight(); + sts_weight_scale_value_g = net_weight; -#if 0 - for (uint8_t cnt=0;cnt<20;cnt++) - { - Get_NetWeight(); - sum_tmp_net_weight += net_weight; - } - net_weight = (uint32_t)((float)sum_tmp_net_weight/20.0); - - APP_LOG(TS_OFF, VLEVEL_M, "\r\nAverage Net Weight = %d g \r\n", net_weight); - - sts_weight_scale_value_g = net_weight; - - // re-calibrate or Zero if changes > 100g - if ((fabs(last_net_weight - net_weight) > 100) && (net_weight > 100)) - { - APP_LOG(TS_OFF, VLEVEL_M, "\r\n Zero ...Get Gross weight\r\n"); - Get_GrossWeight(); - APP_LOG(TS_OFF, VLEVEL_M, "\r\n Zero ...done Gross=%d \r\n",gross_weight); - //HAL_Delay(2000); - //Get_NetWeight(); - } -#endif - last_net_weight = net_weight; + last_net_weight = net_weight; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n STS_WEIGHT SCALE =%u \r\n", (int)net_weight); //HAL_Delay(2000); - //PME_OFF; } @@ -210,7 +177,7 @@ uint32_t HX711_Read(void) //增益128 if (HAL_GPIO_ReadPin(HX711_DOUT_PORT, HX711_DOUT_PIN)==GPIO_PIN_SET) delay_us(1); else break; - }while (timer++<500000); + }while (timer++<500000); // keep this no touch, otherwise get 0x800000 for ever #endif delay_us(1); @@ -261,8 +228,8 @@ void Get_GrossWeight(void) void Get_NetWeight(void) { HX711_Buffer = HX711_Read(); - //APP_LOG(TS_OFF, VLEVEL_M, "\r\n ----- Get Netweight =%d while last gross weight=%d \r\n", HX711_Buffer, gross_weight); - if(HX711_Buffer >= gross_weight) + + if(HX711_Buffer > gross_weight) { net_weight = HX711_Buffer; net_weight = net_weight - gross_weight; //获取实物的AD采样数值。 @@ -277,7 +244,7 @@ void Get_NetWeight(void) } else { net_weight = 0; - APP_LOG(TS_OFF, VLEVEL_M, "\r\n ----- less than gross weight\r\n"); + APP_LOG(TS_OFF, VLEVEL_L, "\r\n %d----- less than gross weight\r\n", net_weight); } } diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index 86f465c..0d02395 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -1118,7 +1118,7 @@ static void SendTxData(void) AppData.BufferSize = i&(~sts_service_mask); - APP_LOG(TS_OFF, VLEVEL_M, "\r\nAppdata.buffersize = %d", AppData.BufferSize); + //APP_LOG(TS_OFF, VLEVEL_M, "\r\nAppdata.buffersize = [ %d ]\r\n", AppData.BufferSize); if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { @@ -1252,14 +1252,15 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) { APP_LOG(TS_OFF, VLEVEL_M, "OTAA =====================\r\n"); } + AppData.Port = 1; AppData.BufferSize = 16; - UTIL_MEM_cpy_8((uint8_t*)AppData.Buffer, (uint8_t *)"YUNHORN168", 10); - UTIL_MEM_cpy_8((uint8_t*)AppData.Buffer+10, (uint8_t *)(uint8_t*)YUNHORN_STS_PRD_STRING, sizeof(YUNHORN_STS_PRD_STRING)); - AppData.BufferSize = sizeof(YUNHORN_STS_PRD_STRING)+10; - LmHandlerParams.IsTxConfirmed = true; + //UTIL_MEM_cpy_8((uint8_t*)AppData.Buffer, (uint8_t *)"YUNHORN168", 10); + UTIL_MEM_cpy_8((uint8_t*)AppData.Buffer, (uint8_t*)YUNHORN_STS_PRD_STRING, sizeof(YUNHORN_STS_PRD_STRING)); + AppData.BufferSize = sizeof(YUNHORN_STS_PRD_STRING); + LmHandlerParams.IsTxConfirmed = LORAMAC_HANDLER_CONFIRMED_MSG; LmHandlerErrorStatus_t status = LmHandlerSend(&AppData, LmHandlerParams.IsTxConfirmed, false); - if (status ==LORAMAC_HANDLER_SUCCESS ) LmHandlerParams.IsTxConfirmed = false; + if (status ==LORAMAC_HANDLER_SUCCESS ) LmHandlerParams.IsTxConfirmed = !LORAMAC_HANDLER_CONFIRMED_MSG; } else { diff --git a/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf b/STM32CubeIDE/Release/WLE5CC_NODE_STS.elf index fee4a8b982870281a06fa1c9c490daa9a98bd445..e38afe982c0675250e0f89764f3a1239fcd48aad 100644 GIT binary patch delta 59858 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 delta 59684 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

L+VmWtQiTX67m&qcl&F574NXjXZE%pV|A3E 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 diff --git a/STS/Core/Inc/yunhorn_sts_sensors.h b/STS/Core/Inc/yunhorn_sts_sensors.h index 88fbac2..1bdb6cb 100644 --- a/STS/Core/Inc/yunhorn_sts_sensors.h +++ b/STS/Core/Inc/yunhorn_sts_sensors.h @@ -47,7 +47,11 @@ enum cfg_cmd_order{ CFG_CMD3, // # Z {H, S, C} M {0,1,2,3,4] CFG_CMD4, // # CFG_CMD5, // 'S','M','H' - CFG_CMD6 + CFG_CMD6, + CFG_CMD7, + CFG_CMD8, + CFG_CMD9, + CFG_CMD10 }; enum p_cmd_order{ P_CMD=0, //'P' //P_MTM_CODE, // #1 @@ -162,11 +166,18 @@ typedef struct sts_cfg_nvm { uint8_t sts_ioc_mask; // I/O Control mask enable all 0xFF, Disable all 0x00 0b0000 0000 uint8_t length; // length of following parameters except AC CODE(20bytes) uint8_t p[STS_CFG_PCFG_SIZE]; +#ifdef STS_R6 + uint8_t ws_cfg_1; + uint8_t ws_cfg_2; + uint8_t ws_cfg_3; + uint8_t ws_cfg_4; +#else uint8_t reserve02; uint8_t reserve03; uint8_t sensor_install_height_in_10cm; uint8_t alarm_parameter05; +#endif uint8_t alarm_mute_reset_timer_in_10sec; //60(0x3C) sec alarm_mute_or_reset_expire_timer_in_sec uint8_t alarm_lamp_bar_flashing_color; //Lamp Bar Flashing color define, 0x20, 2==STS_RED, 0 = STS_DARK, 0x23, 2=STS_RED, 3=STS_BLUE uint8_t occupancy_overtime_threshold_in_10min; // 0 - 9: 0:disable, 1-9 occupy over time threshold * 10 min diff --git a/STS/Core/Src/yunhorn_sts_process.c b/STS/Core/Src/yunhorn_sts_process.c index 0a35d5f..595a041 100644 --- a/STS/Core/Src/yunhorn_sts_process.c +++ b/STS/Core/Src/yunhorn_sts_process.c @@ -86,6 +86,11 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0x0,0x8,0x10,0x0,0x3,0x8,0x21,0x1,0xaf,0xe7, //current work config profile short 0x1,0x8,0x10,0x0,0x3,0x8,0x21,0x1,0xaf,0xe7, //current work config profile long, after measured distance // change the max distance, min distance, SPAD, front center and back center, etc. +#elif defined(STS_R6) + 0x00, //tare off + 0x01, // calibration knob value in kg + 0x00, // zero + 0x01, // measure unit, 01:g, 02:kg, 03:pnd, 04:ton #else 0x08, //start_m [8]*0.1 meter =0.8 0x19, //lenght_m 0x19=[25]*0.1=2.5f meter @@ -137,6 +142,7 @@ volatile uint8_t sensor_data_ready=0; #if defined(STS_WS)||defined(STS_R6) extern volatile uint32_t sts_weight_scale_value_g, sts_weight_tare_g; +extern volatile sts_weight_scale_cfg_t ws_cfg; #endif #if defined(STS_R1)||defined(STS_R5)||defined(STS_R4)||defined(STS_R1D)||defined(STS_O5)||defined(STS_M1)||defined(STS_R6) @@ -576,6 +582,7 @@ void STS_YunhornSTSEventP9_Process(void) //sts_weight_scale_init(); sts_weight_scale(); + #endif } @@ -673,9 +680,9 @@ void STS_O5_SENSOR_Read(STS_OO_SensorDataTypeDef *oo_data) void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) { -#if defined(STS_P2)||defined(STS_O6T)||defined(STS_T6)||defined(STS_O7)||defined(STS_O5) - switch (parse_buffer_size) { + switch (parse_buffer_size) { +#if defined(STS_P2)||defined(STS_O6T)||defined(STS_T6)||defined(STS_O7)||defined(STS_O5) case 4: sts_work_mode = (uint8_t)(parse_buffer[CFG_CMD4]-0x30); switch (sts_work_mode) { @@ -711,10 +718,72 @@ void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) break; } break; +#endif + case 5: break; + +#ifdef STS_R6 + // Weight Scale STS_R6 + // P11WXYY + case 7: + if ((parse_buffer[CFG_CMD4]=='W') && (parse_buffer[CFG_CMD5]>='0')&& (parse_buffer[CFG_CMD5]<='9')) + { + uint8_t sts_ws_cfg_index = (uint8_t)(parse_buffer[CFG_CMD5]-0x30); + uint8_t sts_ws_cfg_value = (parse_buffer[CFG_CMD6]-0x30)*10+(parse_buffer[CFG_CMD7]-0x30); + APP_LOG(TS_OFF, VLEVEL_M, "\r\nCFG_CMD Index=%d, VALUE =0X%02X =%d \r\n", sts_ws_cfg_index, sts_ws_cfg_value,sts_ws_cfg_value); + switch (sts_ws_cfg_index) { + case 1: // head level height threshold + ws_cfg.tare_off = sts_ws_cfg_value; + sts_weight_scale_tare_off(); + break; + case 2: + ws_cfg.calibration_knob_value = sts_ws_cfg_value; + sts_weight_calibration(ws_cfg.calibration_knob_value); + break; + case 3: + ws_cfg.zero = sts_ws_cfg_value; + sts_weight_scale_zero(); + break; + case 4: + ws_cfg.measure_unit = sts_ws_cfg_value; + + break; + + + default: + break; + } + sts_cfg_nvm.ws_cfg_1 = ws_cfg.tare_off; + sts_cfg_nvm.ws_cfg_2 = ws_cfg.zero; + sts_cfg_nvm.ws_cfg_3 = ws_cfg.calibration_knob_value; + sts_cfg_nvm.ws_cfg_4 = ws_cfg.measure_unit; + + OnStoreSTSCFGContextRequest(); + // 2024-11-18 + UTIL_MEM_set_8((void*)outbuf, 0x0, sizeof(outbuf)); + UTIL_MEM_cpy_8((void*)outbuf,(void*)parse_buffer,parse_buffer_size); + uint8_t i = parse_buffer_size; + + + if (ws_cfg.calibrated) { + i++; + uint32_t gap_report=ws_cfg.gapvalue*1000;; + + outbuf[i++] = gap_report<<24&0xff; + outbuf[i++] = gap_report<<16&0xff; + outbuf[i++] = gap_report<<8&0xff; + outbuf[i++] = gap_report&0xff; + } + + STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); + + } + break; +#endif case 12: break; +#ifdef STS_P2 case 13: for (uint8_t i=0; i<10; i++) { sts_cfg_nvm.p[i] = (uint8_t)parse_buffer[CFG_CMD4+i]; @@ -730,11 +799,11 @@ void USER_APP_Parse_CMD_P(uint8_t *parse_buffer, uint8_t parse_buffer_size) ppc_cfg[parse_buffer[CFG_CMD4]].front_zone_center = (uint8_t)parse_buffer[CFG_CMD4+8]; ppc_cfg[parse_buffer[CFG_CMD4]].back_zone_center = (uint8_t)parse_buffer[CFG_CMD4+9]; break; - +#endif default: break; } -#endif + } // following to be fill up @@ -1141,6 +1210,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); break; case 'D': /* "YZD": Distance/Install height Measure */ +#if defined(STS_O6)||defined(STS_P2)||defined(STS_L8)||defined(STS_O7) STS_SENSOR_Distance_Test_Process(); sts_cfg_nvm.sensor_install_height_in_10cm = sts_sensor_install_height/100; //in 10 cm, say 4500mm=450cm=45 dm APP_LOG(TS_OFF, VLEVEL_M, "\n STS CFG NVM -> SENSOR INSTALL HEIGHT STORED = %d dm(10cm)\n", sts_cfg_nvm.sensor_install_height_in_10cm); @@ -1153,6 +1223,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s outbuf[i++] = (uint8_t)sts_hardware_ver; outbuf[i++] = (uint8_t)(99*((GetBatteryLevel()/254)&0xff)); outbuf[i++] = (uint8_t)(2); //two bytes for distance +#endif #if defined(VL53LX)||defined(VL53L0) #if 0 outbuf[i++] = (uint8_t)(sts_sensor_install_height/1000+0x30)&0xff; @@ -1165,6 +1236,7 @@ void USER_APP_AUTO_RESPONDER_Parse(uint8_t *parse_buffer, uint8_t parse_buffer_s #endif STS_SENSOR_Upload_Message(YUNHORN_STS_USER_APP_CTRL_REPLY_PORT, i, (uint8_t *)outbuf); + break; case 'M': /* "YZM": Mask level */ i = 0; @@ -1611,11 +1683,18 @@ void OnStoreSTSCFGContextRequest(void) for (j = 0; j < STS_CFG_PCFG_SIZE; j++) { to_store__value[i++] = (sts_cfg_nvm.p[j]); } +#ifdef STS_R6 + to_store__value[i++] = sts_cfg_nvm.ws_cfg_1; + to_store__value[i++] = sts_cfg_nvm.ws_cfg_2; + to_store__value[i++] = sts_cfg_nvm.ws_cfg_3; + to_store__value[i++] = sts_cfg_nvm.ws_cfg_4; +#else to_store__value[i++] = sts_cfg_nvm.reserve02; to_store__value[i++] = sts_cfg_nvm.reserve03; to_store__value[i++] = sts_cfg_nvm.sensor_install_height_in_10cm; to_store__value[i++] = sts_cfg_nvm.alarm_parameter05; +#endif to_store__value[i++] = sts_cfg_nvm.alarm_mute_reset_timer_in_10sec; to_store__value[i++] = sts_cfg_nvm.alarm_lamp_bar_flashing_color; to_store__value[i++] = sts_cfg_nvm.occupancy_overtime_threshold_in_10min; @@ -1708,11 +1787,18 @@ void STS_REBOOT_CONFIG_Init(void) for (uint8_t j=0; j< sts_cfg_nvm.length; j++) { sts_cfg_nvm.p[j] = (uint8_t)nvm_store_value[NVM_CFG_START+j]; } +#ifdef STS_R6 + sts_cfg_nvm.ws_cfg_1 =(uint8_t)nvm_store_value[NVM_RESERVE02]; + sts_cfg_nvm.ws_cfg_2 =(uint8_t)nvm_store_value[NVM_RESERVE03]; + sts_cfg_nvm.ws_cfg_3 =(uint8_t)nvm_store_value[NVM_SENSOR_INSTALL_HEIGHT]; + sts_cfg_nvm.ws_cfg_4 =(uint8_t)nvm_store_value[NVM_ALARM_PARAMETER05]; +#else sts_cfg_nvm.reserve02 =(uint8_t)nvm_store_value[NVM_RESERVE02]; sts_cfg_nvm.reserve03 =(uint8_t)nvm_store_value[NVM_RESERVE03]; sts_cfg_nvm.sensor_install_height_in_10cm =(uint8_t)nvm_store_value[NVM_SENSOR_INSTALL_HEIGHT]; sts_cfg_nvm.alarm_parameter05 =(uint8_t)nvm_store_value[NVM_ALARM_PARAMETER05]; +#endif sts_cfg_nvm.alarm_mute_reset_timer_in_10sec = (uint8_t)nvm_store_value[NVM_ALARM_MUTE_RESET_TIMER]; sts_cfg_nvm.alarm_lamp_bar_flashing_color = (uint8_t)nvm_store_value[NVM_ALARM_LAMP_BAR_FLASHING_COLOR]; sts_cfg_nvm.occupancy_overtime_threshold_in_10min = (uint8_t)nvm_store_value[NVM_OCCUPANCY_OVERTIME_THRESHOLD];