diff --git a/Core/Inc/sys_conf.h b/Core/Inc/sys_conf.h index 241072d..f10502a 100644 --- a/Core/Inc/sys_conf.h +++ b/Core/Inc/sys_conf.h @@ -47,12 +47,12 @@ extern "C" { /** * @brief Verbose level for all trace logs */ -#define VERBOSE_LEVEL VLEVEL_OFF +#define VERBOSE_LEVEL VLEVEL_M /** * @brief Enable trace logs */ -#define APP_LOG_ENABLED 0 +#define APP_LOG_ENABLED 1 /** * @brief Activate monitoring (probes) of some internal RF signals for debug purpose @@ -75,7 +75,7 @@ extern "C" { * @brief Enable/Disable MCU Debugger pins (dbg serial wires) * @note by HW serial wires are ON by default, need to put them OFF to save power */ -#define DEBUGGER_ENABLED 0 +#define DEBUGGER_ENABLED 1 /** * @brief Disable Low Power mode diff --git a/Core/Src/main.c b/Core/Src/main.c index 8f32d48..3e47a35 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -114,6 +114,7 @@ int main(void) { MX_I2C2_Init(); MX_DMA_Init(); + MX_USART2_UART_Init(); #if defined(STS_T6) MX_TIM1_Init(); #endif @@ -124,7 +125,10 @@ int main(void) //MX_USART2_UART_Init(); - STS_TOF_VL53LX_PresenceDetection_Process_Init(); + STS_Sensor_Init(); + STS_Sensor_Prepare(); + + //STS_TOF_VL53LX_PresenceDetection_Process_Init(); /* USER CODE END 2 */ diff --git a/Core/Src/sts_lamp_bar.c b/Core/Src/sts_lamp_bar.c index f634a67..80afbd2 100644 --- a/Core/Src/sts_lamp_bar.c +++ b/Core/Src/sts_lamp_bar.c @@ -127,7 +127,7 @@ void STS_Lamp_Bar_Scoller(uint8_t color, uint8_t lum_level) for(uint8_t i = 0; i 5)) + { + PIRValue = 0; + lockLow = true; sts_pir_state = 0; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n PIRValue=%d \r\n", PIRValue); + if (sts_pir_state != prev_sts_pir_state) { + sts_pir_state_changed = 1; + } + prev_sts_pir_state = sts_pir_state; } } // HAL_Delay(50); //__HAL_GPIO_EXTI_CLEAR_IT(GPIO_Pin); // APP_LOG(TS_OFF, VLEVEL_M, "\r\nMotion Detection result=%d \r\n", sts_pir_state); - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + if ( sts_pir_state_changed == 1) + { + sts_pir_state_changed = 0; + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); + } break; #endif @@ -942,7 +1130,7 @@ static void SendTxData(void) #elif defined(STS_O5) AppData.Port = YUNHORN_STS_O5_LORA_APP_DATA_PORT; /* STS-O5 Data Port */ #endif - + AppLedStateOn = LED1_STATE; AppData.Buffer[i++] = (uint8_t) (AppLedStateOn|0x80); // for first byte, cannot be 0x0 AppData.Buffer[i++] = (uint8_t) sts_mtmcode1; AppData.Buffer[i++] = (uint8_t) sts_mtmcode2; @@ -1076,6 +1264,18 @@ static void SendTxData(void) #endif //STS_P2 + if ((heart_beat_timer != 0L)) + { + heart_beat_timer=0; + sensor_data_ready = 0; + + AppData.Port = (uint8_t)YUNHORN_STS_T6_LORA_APP_HTBT_PORT; //LORAWAN_USER_APP_PORT+1; + AppData.Buffer[i++] = (uint8_t)(AppLedStateOn|0x80)&0x0ff; + AppData.Buffer[i++] = (uint8_t)(99*batteryLevel/254)&0xff; + } else if ((sensor_data_ready != 0)) + { + sensor_data_ready = 0; + #if defined(STS_T6) AppData.Buffer[i++] = 4; AppData.Buffer[i++] = (uint8_t)((sts_t6_sensor_data.tof_range_presence_state & 0xFF)); @@ -1105,9 +1305,21 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t)(sts_m1_sensor_data.measure_tech & 0xFF); AppData.Buffer[i++] = (uint8_t)(sts_m1_sensor_data.on_off_event & 0xFF); #endif //STS_M1 + } + //AppData.BufferSize = (uint8_t)(i&(~sts_service_mask)); + AppData.BufferSize = (uint8_t)(sts_service_mask > STS_SERVICE_MASK_L1? 0:i)&0xff;; - AppData.BufferSize = i&(~sts_service_mask); +#ifdef CLOCK_SYNC + if( IsClockSynched == false ) + { + status = LmhpClockSyncAppTimeReq( ); + + if (LORAMAC_HANDLER_SUCCESS == status) { + OnSysTimeUpdate(); + } + } +#endif if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { @@ -1129,7 +1341,8 @@ static void SendTxData(void) } } } - + heart_beat_timer = 0; + sensor_data_ready = 0; if (EventType == TX_ON_TIMER) { UTIL_TIMER_Stop(&TxTimer); @@ -1143,9 +1356,10 @@ static void SendTxData(void) static void OnTxTimerEvent(void *context) { /* USER CODE BEGIN OnTxTimerEvent_1 */ - + if (sts_warm_up_count <= 5) + { /* USER CODE END OnTxTimerEvent_1 */ - UTIL_TIMER_Stop(&TxTimer); + //UTIL_TIMER_Stop(&TxTimer); #ifdef STS_R4 UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP6), CFG_SEQ_Prio_0); @@ -1154,10 +1368,9 @@ static void OnTxTimerEvent(void *context) #elif (defined(STS_R1D)||defined(STS_R5)||defined(STS_R1)) APP_LOG(TS_OFF, VLEVEL_H, "\nSET TASK P4\r\n"); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP4), CFG_SEQ_Prio_0); + #elif (defined(STS_P2)||defined(STS_T6)) - UTIL_TIMER_Stop(&YunhornSTSWakeUpScanTimer); - APP_LOG(TS_OFF, VLEVEL_M, "\r\nTxTimer Event \r\n"); #endif @@ -1168,10 +1381,11 @@ static void OnTxTimerEvent(void *context) UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer); #endif + sts_warm_up_count++; /*Wait for next tx slot*/ UTIL_TIMER_Start(&TxTimer); /* USER CODE BEGIN OnTxTimerEvent_2 */ - + } /* USER CODE END OnTxTimerEvent_2 */ } @@ -1258,7 +1472,10 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) APP_LOG(TS_OFF, VLEVEL_H, "###### U/L FRAME:JOIN | DR:%d | PWR:%d\r\n", joinParams->Datarate, joinParams->TxPower); } - //UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer); + UTIL_TIMER_Start(&STSLampBarColorTimer); + + UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); + /* USER CODE END OnJoinRequest_1 */ } @@ -1300,7 +1517,7 @@ static void OnBeaconStatusChange(LmHandlerBeaconParams_t *params) static void OnSysTimeUpdate(void) { /* USER CODE BEGIN OnSysTimeUpdate_1 */ - + IsClockSynched = true; /* USER CODE END OnSysTimeUpdate_1 */ } @@ -1428,9 +1645,11 @@ static void OnStopJoinTimerEvent(void *context) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); } /* USER CODE BEGIN OnStopJoinTimerEvent_Last */ +#ifndef STM32WLE5xx HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); /* LED_BLUE */ HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */ HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ +#endif /* USER CODE END OnStopJoinTimerEvent_Last */ } @@ -1642,10 +1861,11 @@ void OnYunhornSTSHeartBeatPeriodicityChanged(uint32_t periodicity) static void OnYunhornSTSWakeUpScanTimerEvent(void *context) { #if defined(STS_P2)||defined(STS_T6)||defined(L8) - // UTIL_TIMER_Stop(&YunhornSTSWakeUpScanTimer); + UTIL_TIMER_Stop(&YunhornSTSWakeUpScanTimer); + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP5), CFG_SEQ_Prio_0); - // UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer); + UTIL_TIMER_Start(&YunhornSTSWakeUpScanTimer); #endif } @@ -1675,3 +1895,319 @@ void OnYunhornSTSTxPeriodicityChanged(uint32_t periodicity) /* USER CODE END OnYunhornSTSTxPeriodicityChanged */ } + + +void OnStoreSTSCFGContextRequest(void) +{ + /* USER CODE BEGIN OnStoreContextRequest_1 */ +#if 0 + uint8_t i=0,j=0; + uint8_t to_store__value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; /* KEEP THIS LOCAL */ + sts_cfg_nvm.length = STS_NVM_CFG_SIZE; + to_store__value[i++] = sts_cfg_nvm.mtmcode1; + to_store__value[i++] = sts_cfg_nvm.mtmcode2; + to_store__value[i++] = sts_cfg_nvm.version; + to_store__value[i++] = sts_cfg_nvm.hardware_ver; + to_store__value[i++] = sts_cfg_nvm.periodicity; + to_store__value[i++] = sts_cfg_nvm.unit; + to_store__value[i++] = sts_cfg_nvm.sampling; + to_store__value[i++] = sts_cfg_nvm.s_unit; + to_store__value[i++] = sts_cfg_nvm.work_mode; + to_store__value[i++] = sts_cfg_nvm.sts_service_mask; + to_store__value[i++] = sts_cfg_nvm.sts_ioc_mask; + to_store__value[i++] = (uint8_t) STS_CFG_PCFG_SIZE; //sts_cfg_nvm.length; + + for (j = 0; j < STS_CFG_PCFG_SIZE; j++) { + to_store__value[i++] = (sts_cfg_nvm.p[j]); + } + + to_store__value[i++] = sts_cfg_nvm.color_occupy_vacant; + to_store__value[i++] = sts_cfg_nvm.sts_door_jam_profile; + to_store__value[i++] = sts_cfg_nvm.sensor_install_height_in_10cm; + to_store__value[i++] = sts_cfg_nvm.alarm_parameter05; + 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; + + to_store__value[i++] = sts_cfg_nvm.motionless_duration_threshold_in_min; + to_store__value[i++] = sts_cfg_nvm.unconscious_or_motionless_level_threshold; + to_store__value[i++] = sts_cfg_nvm.fall_detection_acc_threshold; + to_store__value[i++] = sts_cfg_nvm.fall_detection_depth_threshold; + to_store__value[i++] = sts_cfg_nvm.fall_confirm_threshold_in_10sec; + + if ((nvm_stored_value[NVM_AC_CODE_START]!= 0x0) && (nvm_stored_value[NVM_AC_CODE_START+19]!=0x0)) + { + //APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer good NVM Stored ac_code to NVM_STORE_VALUE\r\n"); + UTIL_MEM_cpy_8((void*)&to_store__value[NVM_AC_CODE_START], (void*)&nvm_store_value[NVM_AC_CODE_START],YUNHORN_STS_AC_CODE_SIZE); + } else if ((sts_ac_code[0]!=0x0) && (sts_ac_code[YUNHORN_STS_AC_CODE_SIZE-1]!=0x0)) + { + //APP_LOG(TS_OFF, VLEVEL_M, "\n\r Transfer new generated ac_code to NVM_STORE_VALUE\r\n"); + UTIL_MEM_cpy_8((void*)&to_store__value[NVM_AC_CODE_START], (void*)sts_ac_code,YUNHORN_STS_AC_CODE_SIZE); + UTIL_MEM_cpy_8((void*)&nvm_store_value[NVM_AC_CODE_START], (void*)sts_ac_code,YUNHORN_STS_AC_CODE_SIZE); + } +#endif + /* USER CODE END OnStoreContextRequest_1 */ + /* store nvm in flash */ + //if ((sts_ac_code[0] != 0 ) && (sts_ac_code[YUNHORN_STS_AC_CODE_SIZE-1] !=0)) + { + for (uint8_t j=0; j 10)? periodicity : 10; // in seconds unit + + //APP_LOG(TS_OFF, VLEVEL_M, "\n\n Tx periodicity in NVM =%u sec\n",periodicity); + + TxPeriodicity= periodicity*1000; // to ms + + uint32_t sampling_heartbeat_periodicity = (sts_cfg_nvm.sampling); //Heart-beat or Sampling interval + if ((char)sts_cfg_nvm.s_unit =='M') { + sampling_heartbeat_periodicity *= 60; + } else if ((char) sts_cfg_nvm.s_unit =='H') { + sampling_heartbeat_periodicity *= 3600; + } else if ((char) sts_cfg_nvm.s_unit =='S') { + sampling_heartbeat_periodicity *= 1; + } else if ((char) sts_cfg_nvm.s_unit =='L') { + sampling_heartbeat_periodicity *= 100; + } + + STS_HeartBeatTimerPeriod_sec = sampling_heartbeat_periodicity; + APP_LOG(TS_OFF, VLEVEL_H, "\n\n sampling or heartbeat periodicity in NVM =%u sec\n",sampling_heartbeat_periodicity); + + + + if ((sts_cfg_nvm.ac[0] ==0x0 )&& (sts_cfg_nvm.ac[19]==0x0)) + { // ensure it's not in production yet + + OnYunhornSTSTxPeriodicityChanged(APP_TX_DUTYCYCLE); // in msec unit + OnYunhornSTSHeartBeatPeriodicityChanged(STS_HeartBeatTimerPeriod_sec); //TODO XXXX + + //OnTxPeriodicityChanged(10000); // APP_TX_DUTYCYCLE in msec unit + //TxPeriodicity = APP_TX_DUTYCYCLE; + + } else + { + //OnYunhornSTSTxPeriodicityChanged(TxPeriodicity); // in msec unit + //OnTxPeriodicityChanged(TxPeriodicity); + //Heart-beat or Sampling interval + //sampling_heartbeat_periodicity = (sampling_heartbeat_periodicity > 0)? sampling_heartbeat_periodicity : 1; // in seconds unit + //sampling_heartbeat_periodicity = sampling_heartbeat_periodicity*1000; +#ifdef STS_P2 + STS_TxPeriod_sec = periodicity; + STS_HeartBeatTimerPeriod_sec = sampling_heartbeat_periodicity; + sts_people_count_sensor_data->Count_Period = sts_cfg_nvm.periodicity; + sts_people_count_sensor_data->Count_Period_Unit = sts_cfg_nvm.unit; +#endif + +#if defined(STS_T6) + STS_HeartBeatTimerPeriod_sec = periodicity; + OnYunhornSTSHeartBeatPeriodicityChanged(STS_HeartBeatTimerPeriod_sec); +#endif + +#if defined(STS_R1)||defined(STS_R5)||defined(STS_R4)||defined(STS_R1D)||defined(STS_O5)||defined(STS_M1) + OnYunhornSTSHeartBeatPeriodicityChanged(sampling_heartbeat_periodicity*1000); +#endif + } + + sts_work_mode = sts_cfg_nvm.work_mode; + sts_service_mask = sts_cfg_nvm.sts_service_mask; + sts_door_jam_profile = sts_cfg_nvm.sts_door_jam_profile; + sts_color_occupy_vacant = sts_cfg_nvm.color_occupy_vacant; + APP_LOG(TS_OFF, VLEVEL_M, "\r\n Color Occupy =%02x, VACANT =%02x \r\n",((sts_color_occupy_vacant>>4)&0x0f), sts_color_occupy_vacant&0x0f ); + +#ifdef YUNHORN_STS_O6_ENABLED + sts_lamp_bar_color = STS_COLOR_DEFAULT_VACANT; + sts_fall_detection_acc_threshold = (uint8_t)sts_cfg_nvm.fall_detection_acc_threshold*10; + sts_fall_detection_depth_threshold = (uint8_t)sts_cfg_nvm.fall_detection_depth_threshold*10; //in cm + // **** = sts_cfg_nvm.fall_detection_reserve; + sts_occupancy_overtime_threshold = (uint8_t)sts_cfg_nvm.occupancy_overtime_threshold*10; // minutes +#endif + + + for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) + { + sts_ac_code[j] = sts_cfg_nvm.ac[j]; + } + //for (uint8_t j=0; j< YUNHORN_STS_AC_CODE_SIZE; j++) + //{ + // 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); + +#ifdef YUNHORN_STS_O6_ENABLED + if ((sts_version == sts_cfg_nvm.version)&& (NVM_CFG_PARAMETER_SIZE == sts_cfg_nvm.length)) + { + STS_PRESENCE_SENSOR_Init(); + STS_PRESENCE_SENSOR_RSS_Init(); + } +#endif + +} + +static void STS_Show_STS_CFG_NVM(uint8_t * store_value, uint16_t store_size) +{ + APP_LOG(TS_OFF, VLEVEL_M, "\n-----------------------------------------------\n"); + APP_LOG(TS_OFF, VLEVEL_M, "\n00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15\n"); + for (uint16_t i=0; i< store_size; i++) + { + if (i%16==0) APP_LOG(TS_OFF, VLEVEL_M, "\n"); + APP_LOG(TS_OFF, VLEVEL_M, "%02X ", store_value[i]); + + } + APP_LOG(TS_OFF, VLEVEL_M, "\n\r"); + APP_LOG(TS_OFF, VLEVEL_M, "\n###############################################\n\r"); +} + + + + + + + + + + + + diff --git a/LoRaWAN/Target/lorawan_conf.h b/LoRaWAN/Target/lorawan_conf.h index 31b262b..443d818 100644 --- a/LoRaWAN/Target/lorawan_conf.h +++ b/LoRaWAN/Target/lorawan_conf.h @@ -58,7 +58,7 @@ extern "C" { * - 0x01000400: Link Layer TS001-1.0.4 + Regional Parameters RP002-1.0.1 * - 0x01010100: soon available ... */ -#define LORAMAC_SPECIFICATION_VERSION 0x01010100 +#define LORAMAC_SPECIFICATION_VERSION 0x01000400 /*! * @brief Enable the additional LoRaWAN packages @@ -69,7 +69,7 @@ extern "C" { * - Firmware Management Protocol (Package ID: 4, Default Port: 203) * The Certification Protocol is also defined as a mandatory package (Package ID: 0, Default Port: 224) */ -#define LORAWAN_DATA_DISTRIB_MGT 0 +#define LORAWAN_DATA_DISTRIB_MGT 1 /*! * @brief LoRaWAN packages version diff --git a/STM32CubeIDE/.cproject b/STM32CubeIDE/.cproject index fffa6ba..d3e8e63 100644 --- a/STM32CubeIDE/.cproject +++ b/STM32CubeIDE/.cproject @@ -137,6 +137,7 @@