diff --git a/Core/Inc/yunhorn_sts_sensors.h b/Core/Inc/yunhorn_sts_sensors.h index 9864f51..f1fe390 100644 --- a/Core/Inc/yunhorn_sts_sensors.h +++ b/Core/Inc/yunhorn_sts_sensors.h @@ -546,10 +546,10 @@ typedef struct sts_cfg_nvm { uint8_t mtmcode2; uint8_t version; uint8_t hardware_ver; - uint8_t periodicity; //count of uplink duty cycle duration high {99} + uint8_t periodicity; // uplink interval in following 'unit' uint8_t unit; // uplink time unit of duty cycle duration, in 'S', 'M','H' seconds, minutes, hours - uint8_t sampling; // heart-beat interval or count of sampling duty cycle duration high {99} - uint8_t s_unit; // Heart-beat interval or sampling time unit of duty cycle duration, in 'S', 'M','H' seconds, minutes, hours + uint8_t sampling; // heart-beat interval or sampling interval in following 'unit' + uint8_t s_unit; // Heart-beat interval or sampling time unit, in 'S', 'M','H' seconds, minutes, hours uint8_t work_mode; uint8_t sts_service_mask; uint8_t reseve01; diff --git a/Core/Src/yunhorn_sts_process.c b/Core/Src/yunhorn_sts_process.c index 47c0063..c4ae997 100644 --- a/Core/Src/yunhorn_sts_process.c +++ b/Core/Src/yunhorn_sts_process.c @@ -412,14 +412,6 @@ void STS_YunhornSTSEventP8_Process(void) void STS_YunhornSTSEventP9_Process(void) { APP_LOG(TS_OFF, VLEVEL_L, "\r\n P9 Testing Process start\r\n"); -#if 0 - BSP_LCD_Init(); - BSP_LCD_Clear(LCD_COLOR_BLUE); - BSP_LCD_DisplayOn(); - BSP_LCD_Test(); - BSP_LCD_DisplayOff(); -#endif - //MX_I2C2_Init(); mlx90640_display_init(); mlx90640_display_process(); diff --git a/LoRaWAN/App/lora_app.c b/LoRaWAN/App/lora_app.c index f523ced..24dc4fc 100644 --- a/LoRaWAN/App/lora_app.c +++ b/LoRaWAN/App/lora_app.c @@ -111,7 +111,7 @@ volatile sts_cfg_nvm_t sts_cfg_nvm = { 0xFF, //reserve 0xFF, //reserve 0xFF, //reserve - 0xF, //reserve + 0xFF, //reserve }, // ******************* above 28 bytes28 bytes // ******************* below 4 bytes 0x01, //fall_detection_acc_threshold = *10 acceleration measure @@ -147,9 +147,6 @@ typedef enum TxEventType_e } TxEventType_t; /* USER CODE BEGIN PTD */ -//#define YUNHORN_STS_SAMPLING_CHECK_TIME SamplingPeriodicity -//#define YUNHORN_STS_UPLOADING_MESSAGE_TIME UploadingMessagePeriodicity -//#define YUNHORN_STS_HEART_BEAT_CHECK_TIME HeartBeatPeriodicity #define YUNHORN_STS_RSS_WAKEUP_CHECK_TIME SamplingPeriodicity //3000 ms #define YUNHORN_STS_SAMPLING_CHECK_TIME SamplingPeriodicity /* USER CODE END PTD */ @@ -456,31 +453,11 @@ static UTIL_TIMER_Object_t RxLedTimer; */ static UTIL_TIMER_Object_t JoinLedTimer; -/** - * @brief Timer to handle the YunHorn STS RSS WakeUP Checking - */ -//static UTIL_TIMER_Object_t YunhornSTSRSSWakeUpTimer; - -/** - * @brief Timer to handle the YunHorn STS Sensor Sampling Process - */ -//static UTIL_TIMER_Object_t YunhornSTSSamplingCheckTimer; - -/** - * @brief Timer to handle the YunHorn STS Sensor Uploading Process - */ -//static UTIL_TIMER_Object_t YunhornSTSUploadingMessageTimer; - /** * @brief Timer to handle the YunHorn STS Sensor Heart Beat Process */ static UTIL_TIMER_Object_t YunhornSTSHeartBeatTimer; -/** - * @brief Heart-Beat Timer period - */ -//static UTIL_TIMER_Time_t HeartBeatPeriodicity = 30*APP_TX_DUTYCYCLE; // 5 MIN initial - /* USER CODE END PV */ /* Exported functions ---------------------------------------------------------*/ @@ -599,22 +576,19 @@ void LoRaWAN_Init(void) // UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventP9), UTIL_SEQ_RFU, STS_YunhornSTSEventP12_Process); // UTIL_SEQ_RegTask((1 << CFG_SEQ_Task_YunhornSTSEventPIORS485), UTIL_SEQ_RFU, STS_YunhornSTSEventPIORS485_Process); + + // Three (3) Types of Timer + // 1) wakeup timer or sampling timer --- work but may not upload or Tx anything up, shortest interval say 1s, 3s, 10s + // 2) Tx timer or upload timer --- for valid message upload at given interval, TX_ON_TIMER, medum interval say 30s, 10 min. + // 3) Heart-beat timer --- no matter wakeup or sampling or Tx or upload, upload a short keep-live message at longer interval, say 30 min. 1 hour +// type 1, wakerup timer #ifdef YUNHORN_STS_O6_ENABLED UTIL_TIMER_Create(&YunhornSTSRSSWakeUpTimer, YUNHORN_STS_RSS_WAKEUP_CHECK_TIME, UTIL_TIMER_PERIODIC, OnYunhornSTSOORSSWakeUpTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSRSSWakeUpTimer); #endif - - // Uploading Message - // FOR Periodically upload message sensor, use this as Heart Beat interval -#if defined(YUNHORN_STS_MM_ENABLED) - UTIL_TIMER_Create(&YunhornSTSUploadingMessageTimer, - YUNHORN_STS_UPLOADING_MESSAGE_TIME, - UTIL_TIMER_PERIODIC, OnYunhornSTSUploadingMessageEvent, NULL); - UTIL_TIMER_Start(&YunhornSTSUploadingMessageTimer); -#endif - + // type 1, sampling timer // for IAQ sensor, multiple sampling, result in one average result between upload interval #if (defined(YUNHORN_STS_E0_ENABLED)) // Samping sensor interval @@ -624,19 +598,19 @@ void LoRaWAN_Init(void) UTIL_TIMER_Start(&YunhornSTSSamplingCheckTimer); #endif - // Heart Beat Timer - // FOR Event trigger type sensor, use this as Heart Beat Timer, such as O1/O2/O3/M1 -#if (defined(YUNHORN_STS_R0_ENABLED)||defined(YUNHORN_STS_R5_ENABLED)) - UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, HeartBeatPeriodicity, - UTIL_TIMER_ONESHOT, OnYunhornSTSHeartBeatTimerEvent, NULL); - UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); -#endif -#if defined(YUNHORN_STS_M1A_ENABLED) + + // type 2. Tx timer or upload timer, + // covered by above TxTimer + +// **************************************************************************************** +// Heart Beat Timer, no matter any other timer, there is always a heart-beat timer +// **************************************************************************************** + UTIL_TIMER_Create(&YunhornSTSHeartBeatTimer, HeartBeatPeriodicity, UTIL_TIMER_ONESHOT, OnYunhornSTSHeartBeatTimerEvent, NULL); UTIL_TIMER_Start(&YunhornSTSHeartBeatTimer); -#endif + /* USER CODE END LoRaWAN_Init_Last */ @@ -649,7 +623,7 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) switch (GPIO_Pin) { case BUT1_Pin: -#if (defined(STM32WL55xx)||defined(STM32WLE5xx)) + #ifdef YUNHORN_STS_O5_ENABLED UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP1), CFG_SEQ_Prio_0); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); @@ -671,16 +645,16 @@ void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) } #endif -#endif + break; case BUT2_Pin: -#if defined(STS_USE_STM32WLE5) - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); -#endif - break; -#if defined(STS_USE_STM32WL55) - case BUT3_Pin: + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStopJoinEvent), CFG_SEQ_Prio_0); + + break; + + case BUT3_Pin: +#if defined(STM32WL55xx) UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaStoreContextEvent), CFG_SEQ_Prio_0); #endif break; @@ -710,9 +684,8 @@ static void OnRxData(LmHandlerAppData_t *appData, LmHandlerRxParams_t *params) if (params != NULL) { -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_SET); /* LED_BLUE */ -#endif UTIL_TIMER_Start(&RxLedTimer); @@ -758,16 +731,12 @@ static void OnRxData(LmHandlerAppData_t *appData, LmHandlerRxParams_t *params) if (AppLedStateOn == RESET) { APP_LOG(TS_OFF, VLEVEL_M, "LED OFF\r\n"); -#if defined(STM32WL55xx) HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ -#endif } else { APP_LOG(TS_OFF, VLEVEL_M, "LED ON\r\n"); -#if defined(STM32WL55xx) HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_SET); /* LED_RED */ -#endif } } break; @@ -788,7 +757,7 @@ static void OnRxData(LmHandlerAppData_t *appData, LmHandlerRxParams_t *params) } if (params->RxSlot < RX_SLOT_NONE) { - APP_LOG(TS_OFF, VLEVEL_M, "###### D/L FRAME:%04d | PORT:%d | DR:%d | SLOT:%s | RSSI:%d | SNR:%d\r\n", + APP_LOG(TS_OFF, VLEVEL_H, "###### D/L FRAME:%04d | PORT:%d | DR:%d | SLOT:%s | RSSI:%d | SNR:%d\r\n", params->DownlinkCounter, RxPort, params->Datarate, slotStrings[params->RxSlot], params->Rssi, params->Snr); } @@ -806,13 +775,13 @@ static void SendTxData(void) #if defined(YUNHORN_STS_M1A_ENABLED) STS_M1A_SensorDataTypeDef m1a_data; #endif - #if defined(YUNHORN_STS_R0_ENABLED)||defined(YUNHORN_STS_R5_ENABLED) STS_R0_SensorDataTypeDef r0_data; #endif #if defined(STS_O5) STS_OO_SensorDataTypeDef oo_data; #endif + UTIL_TIMER_Time_t nextTxIn = 0; AppData.Port = LORAWAN_USER_APP_PORT; @@ -826,16 +795,15 @@ static void SendTxData(void) #if defined(SOAP_LEVEL_SENSOR) STS_YunhornSTSEventP6_Process(); #endif - #if defined(YUNHORN_STS_M1A_ENABLED) - UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP9), CFG_SEQ_Prio_0); +// UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP9), CFG_SEQ_Prio_0); + STS_M1A_SENSOR_Read(&m1a_data); m1a_data.battery_Pct = (uint8_t)(99*batteryLevel/254); // STS_R0_SENSOR_Read(&r0_data); - //r0_data.battery_mV = batteryLevelmV; -// r0_data.battery_Pct = (uint8_t)(99*batteryLevel/254); + #endif //UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP6), CFG_SEQ_Prio_0); @@ -853,18 +821,15 @@ static void SendTxData(void) // APP_LOG(TS_ON, VLEVEL_M, "\r\nVDDA: %d\r\n", batteryLevel); // APP_LOG(TS_ON, VLEVEL_M, "\r\ntemp: %d\r\n", (int16_t)(sensor_data.temperature)); - //APP_LOG(TS_ON, VLEVEL_L, "\r\nDistance = %d mm, VBAT=%d%%\r\n", r0_data.distance_mm, r0_data.battery_Pct); - -//#ifdef ROCTEC_R5 i = 0; AppData.Buffer[i++] = AppLedStateOn; AppData.Buffer[i++] = (uint8_t)(0xFF & sts_mtmcode1); //mtmcode1; //#02 AppData.Buffer[i++] = (uint8_t)(0xFF & sts_mtmcode2); //mtmcode2; //#03 AppData.Buffer[i++] = (uint8_t)(0xFF & sts_hardware_ver); //hardware_Ver; //#04 AppData.Buffer[i++] = (uint8_t)(0xFF & (99*batteryLevel/254)); //#05 -//#endif + if (heart_beat_timer != 0U) { @@ -878,7 +843,7 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t)(r0_data.battery_Pct); #endif - } else if ((upload_message_timer !=0U)||(sensor_data_ready!=0U)) //sensor_data_ready for manual push button-1 trigger) + } else if ((upload_message_timer != 0U)||(sensor_data_ready != 0U)) //sensor_data_ready for manual push button-1 trigger) { AppData.Port = LORAWAN_USER_APP_PORT; sensor_data_ready =0; @@ -938,9 +903,6 @@ static void SendTxData(void) AppData.Buffer[i++] = (uint8_t)((int)m1a_data.centerTemp)&0xff; //#13 AppData.Buffer[i++] = (uint8_t)(((int)(m1a_data.centerTemp*100))%100)&0xff; //#14 - - - #endif } @@ -950,21 +912,20 @@ static void SendTxData(void) if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { UTIL_TIMER_Stop(&JoinLedTimer); -#if defined(STM32WL55xx) HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ -#endif } + status = LmHandlerSend(&AppData, LmHandlerParams.IsTxConfirmed, false); if (LORAMAC_HANDLER_SUCCESS == status) { - APP_LOG(TS_ON, VLEVEL_M, "SEND REQUEST\r\n"); + APP_LOG(TS_ON, VLEVEL_L, "SEND REQUEST\r\n"); } else if (LORAMAC_HANDLER_DUTYCYCLE_RESTRICTED == status) { nextTxIn = LmHandlerGetDutyCycleWaitTime(); if (nextTxIn > 0) { - APP_LOG(TS_ON, VLEVEL_M, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); + APP_LOG(TS_ON, VLEVEL_L, "Next Tx in : ~%d second(s)\r\n", (nextTxIn / 1000)); } } } @@ -984,7 +945,8 @@ static void OnTxTimerEvent(void *context) /* USER CODE BEGIN OnTxTimerEvent_1 */ /* USER CODE END OnTxTimerEvent_1 */ - //upload_message_timer =1U; + upload_message_timer =1U; + UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_YunhornSTSEventP9), CFG_SEQ_Prio_0); UTIL_SEQ_SetTask((1 << CFG_SEQ_Task_LoRaSendOnTxTimerOrButtonEvent), CFG_SEQ_Prio_0); /*Wait for next tx slot*/ @@ -997,23 +959,23 @@ static void OnTxTimerEvent(void *context) /* USER CODE BEGIN PrFD_LedEvents */ static void OnTxTimerLedEvent(void *context) { -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_RESET); /* LED_GREEN */ -#endif + } static void OnRxTimerLedEvent(void *context) { -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED1_GPIO_Port, LED1_Pin, GPIO_PIN_RESET); /* LED_BLUE */ -#endif + } static void OnJoinTimerLedEvent(void *context) { -#if defined(STM32WL55xx) + HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); /* LED_RED */ -#endif + } /* USER CODE END PrFD_LedEvents */ @@ -1026,9 +988,9 @@ static void OnTxData(LmHandlerTxParams_t *params) /* Process Tx event only if its a mcps response to prevent some internal events (mlme) */ if (params->IsMcpsConfirm != 0) { -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED2_GPIO_Port, LED2_Pin, GPIO_PIN_SET); /* LED_GREEN */ -#endif + UTIL_TIMER_Start(&TxLedTimer); APP_LOG(TS_OFF, VLEVEL_L, "\r\n###### ========== MCPS-Confirm =============\r\n"); //YUNHORN TODO was VLEVEL_M @@ -1057,9 +1019,8 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) if (joinParams->Status == LORAMAC_HANDLER_SUCCESS) { UTIL_TIMER_Stop(&JoinLedTimer); -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ -#endif APP_LOG(TS_OFF, VLEVEL_M, "\r\n###### = JOINED = "); if (joinParams->Mode == ACTIVATION_TYPE_ABP) @@ -1075,7 +1036,7 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); - /* + uint32_t periodicity = (sts_cfg_nvm.periodicity); //TxPeriodicty interval if ((char)sts_cfg_nvm.unit =='M') { periodicity *= 60; @@ -1087,8 +1048,8 @@ static void OnJoinRequest(LmHandlerJoinParams_t *joinParams) TxPeriodicity= periodicity*1000; // to ms - OnTxPeriodicityChanged(TxPeriodicity); TO-DO XXXXX - */ + OnTxPeriodicityChanged(TxPeriodicity); + APP_LOG(TS_OFF, VLEVEL_L,"\r\n STS_LoRa_WAN_Joined = %s \r\n", (STS_LoRa_WAN_Joined == 1)?"ABP":"OTAA"); } @@ -2046,9 +2007,9 @@ void STS_SENSOR_Upload_Message(uint8_t appDataPort, uint8_t appBufferSize, char if ((JoinLedTimer.IsRunning) && (LmHandlerJoinStatus() == LORAMAC_HANDLER_SET)) { UTIL_TIMER_Stop(&JoinLedTimer); -#if defined(STM32WL55xx) + HAL_GPIO_WritePin(LED3_GPIO_Port, LED3_Pin, GPIO_PIN_RESET); /* LED_RED */ -#endif + } status = LmHandlerSend(&AppData, LmHandlerParams.IsTxConfirmed, false); @@ -2081,8 +2042,6 @@ void OnStoreSTSCFGContextRequest(void) { /* USER CODE BEGIN OnStoreContextRequest_1 */ uint8_t i=0,j=0,nvm_store_value[YUNHORN_STS_MAX_NVM_CFG_SIZE]={0x0}; - -#if (defined(YUNHORN_STS_O5_ENABLED) || defined(YUNHORN_STS_O6_ENABLED) || defined(YUNHORN_STS_R0_ENABLED) || defined(YUNHORN_STS_R5_ENABLED)) || defined(YUNHORN_STS_M1A_ENABLED) sts_cfg_nvm.length = STS_NVM_CFG_SIZE; nvm_store_value[i++] = sts_cfg_nvm.mtmcode1; nvm_store_value[i++] = sts_cfg_nvm.mtmcode2; @@ -2111,7 +2070,7 @@ void OnStoreSTSCFGContextRequest(void) nvm_store_value[i++] = (sts_cfg_nvm.ac[j]); } } -#endif + /* USER CODE END OnStoreContextRequest_1 */ /* store nvm in flash */ @@ -2148,7 +2107,6 @@ void STS_REBOOT_CONFIG_Init(void) 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 defined(YUNHORN_STS_O6_ENABLED) || defined(YUNHORN_STS_R0_ENABLED) || defined(YUNHORN_STS_R5_ENABLED) || defined(YUNHORN_STS_M1A_ENABLED) 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"); @@ -2183,9 +2141,8 @@ void STS_REBOOT_CONFIG_Init(void) sts_cfg_nvm.ac[j] = (uint8_t)nvm_stored_value[NVM_AC_CODE_START +j]; } } -#endif - OnRestoreSTSCFGContextProcess(); + OnRestoreSTSCFGContextProcess(); /* USER CODE END OnRestoreContextRequest_Last */ } @@ -2227,14 +2184,14 @@ void OnRestoreSTSCFGContextProcess(void) //Heart-beat or Sampling interval samplingperiodicity = (samplingperiodicity > 0)? samplingperiodicity : 1; // in seconds unit HeartBeatPeriodicity = samplingperiodicity*1000; - +// For wakeup and sampling sensors #if defined(YUNHORN_STS_O6_ENABLED) ||defined(YUNHORN_STS_O5_ENABLED) OnYunhornSTSSamplingPeriodicityChanged(HeartBeatPeriodicity); // in m-sec unit #endif -#if defined(YUNHORN_STS_R0_ENABLED)||defined(YUNHORN_STS_R5_ENABLED) ||defined(YUNHORN_STS_M1A_ENABLED) +// For all NON- Tx-On-Event sensors OnYunhornSTSHeartBeatPeriodicityChanged(HeartBeatPeriodicity); -#endif + } sts_work_mode = sts_cfg_nvm.work_mode; diff --git a/mlx90640/mlx90640_lcd_display.c b/mlx90640/mlx90640_lcd_display.c index 413ecad..d0336a7 100644 --- a/mlx90640/mlx90640_lcd_display.c +++ b/mlx90640/mlx90640_lcd_display.c @@ -394,11 +394,6 @@ void STS_M1A_SENSOR_Read(STS_M1A_SensorDataTypeDef *m1a_data) m1a_data->h_water_cnt = h_water_cnt; m1a_data->spot_cnt = spot_cnt; //max(v_water_cnt, h_water_cnt); - - - -// APP_LOG(TS_OFF, VLEVEL_L,"spill_cnt=%d, V_cnt=%d H_cnt=%d, Spot_cnt=%d \r\n", waterSpillCount, v_water_cnt, h_water_cnt, m1a_data->spot_cnt); - //memcpy((void *)m1a_data->waterSpillMatrix,(const void *) zoneMask,sizeof(zoneMask)); uint8_t i=0; if (spot_cnt != 0) {