Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Flipper-Zero/STM32CubeWB.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c')
-rw-r--r--Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c256
1 files changed, 256 insertions, 0 deletions
diff --git a/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c
new file mode 100644
index 000000000..b4aca3c3c
--- /dev/null
+++ b/Projects/P-NUCLEO-WB55.Nucleo/Applications/BLE/BLE_HeartRateFreeRTOS_ANCS/STM32_WPAN/App/hrs_app.c
@@ -0,0 +1,256 @@
+/* USER CODE BEGIN Header */
+/**
+ ******************************************************************************
+ * @file hrs_app.c
+ * @author MCD Application Team
+ * @brief Heart Rate Service Application
+ ******************************************************************************
+ * @attention
+ *
+ * <h2><center>&copy; Copyright (c) 2019 STMicroelectronics.
+ * All rights reserved.</center></h2>
+ *
+ * This software component is licensed by ST under Ultimate Liberty license
+ * SLA0044, the "License"; You may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at:
+ * www.st.com/SLA0044
+ *
+ ******************************************************************************
+ */
+/* USER CODE END Header */
+
+/* Includes ------------------------------------------------------------------*/
+#include "app_common.h"
+
+#include "ble.h"
+#include "hrs_app.h"
+#include "cmsis_os.h"
+
+/* Private includes ----------------------------------------------------------*/
+/* USER CODE BEGIN Includes */
+
+/* USER CODE END Includes */
+
+/* Private typedef -----------------------------------------------------------*/
+typedef struct
+{
+ HRS_BodySensorLocation_t BodySensorLocationChar;
+ HRS_MeasVal_t MeasurementvalueChar;
+ uint8_t ResetEnergyExpended;
+ uint8_t TimerMeasurement_Id;
+
+} HRSAPP_Context_t;
+/* USER CODE BEGIN PTD */
+
+/* USER CODE END PTD */
+
+/* Private defines ------------------------------------------------------------*/
+/* USER CODE BEGIN PD */
+
+/* USER CODE END PD */
+
+/* Private macros ------------------------------------------------------------*/
+#define HRSAPP_MEASUREMENT_INTERVAL (1000000/CFG_TS_TICK_VAL) /**< 1s */
+/* USER CODE BEGIN PM */
+
+/* USER CODE END PM */
+
+/* Private variables ---------------------------------------------------------*/
+/**
+ * START of Section BLE_APP_CONTEXT
+ */
+
+PLACE_IN_SECTION("BLE_APP_CONTEXT") static HRSAPP_Context_t HRSAPP_Context;
+
+/**
+ * END of Section BLE_APP_CONTEXT
+ */
+
+osThreadId_t HrsProcessId;
+
+const osThreadAttr_t HrsProcess_attr = {
+ .name = CFG_HRS_PROCESS_NAME,
+ .attr_bits = CFG_HRS_PROCESS_ATTR_BITS,
+ .cb_mem = CFG_HRS_PROCESS_CB_MEM,
+ .cb_size = CFG_HRS_PROCESS_CB_SIZE,
+ .stack_mem = CFG_HRS_PROCESS_STACK_MEM,
+ .priority = CFG_HRS_PROCESS_PRIORITY,
+ .stack_size = CFG_HRS_PROCESS_STACK_SIZE
+};
+
+/* USER CODE BEGIN PV */
+
+/* USER CODE END PV */
+
+/* Private functions prototypes-----------------------------------------------*/
+static void HrMeas( void );
+static void HrsProcess(void *argument);
+static void HRSAPP_Measurement(void);
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void );
+/* USER CODE BEGIN PFP */
+
+/* USER CODE END PFP */
+
+/* Functions Definition ------------------------------------------------------*/
+void HRS_Notification(HRS_App_Notification_evt_t *pNotification)
+{
+/* USER CODE BEGIN HRS_Notification_1 */
+
+/* USER CODE END HRS_Notification_1 */
+ switch(pNotification->HRS_Evt_Opcode)
+ {
+/* USER CODE BEGIN HRS_Notification_HRS_Evt_Opcode */
+
+/* USER CODE END HRS_Notification_HRS_Evt_Opcode */
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ case HRS_RESET_ENERGY_EXPENDED_EVT:
+/* USER CODE BEGIN HRS_RESET_ENERGY_EXPENDED_EVT */
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 0;
+ HRSAPP_Context.ResetEnergyExpended = 1;
+/* USER CODE END HRS_RESET_ENERGY_EXPENDED_EVT */
+ break;
+#endif
+
+ case HRS_NOTIFICATION_ENABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_ENABLED */
+ /**
+ * It could be the enable notification is received twice without the disable notification in between
+ */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+ HW_TS_Start(HRSAPP_Context.TimerMeasurement_Id, HRSAPP_MEASUREMENT_INTERVAL);
+/* USER CODE END HRS_NOTIFICATION_ENABLED */
+ break;
+
+ case HRS_NOTIFICATION_DISABLED:
+/* USER CODE BEGIN HRS_NOTIFICATION_DISABLED */
+ HW_TS_Stop(HRSAPP_Context.TimerMeasurement_Id);
+/* USER CODE END HRS_NOTIFICATION_DISABLED */
+ break;
+
+#if (BLE_CFG_OTA_REBOOT_CHAR != 0)
+ case HRS_STM_BOOT_REQUEST_EVT:
+/* USER CODE BEGIN HRS_STM_BOOT_REQUEST_EVT */
+ *(uint32_t*)SRAM1_BASE = *(uint32_t*)pNotification->DataTransfered.pPayload;
+ NVIC_SystemReset();
+/* USER CODE END HRS_STM_BOOT_REQUEST_EVT */
+ break;
+#endif
+
+ default:
+/* USER CODE BEGIN HRS_Notification_Default */
+
+/* USER CODE END HRS_Notification_Default */
+ break;
+ }
+/* USER CODE BEGIN HRS_Notification_2 */
+
+/* USER CODE END HRS_Notification_2 */
+ return;
+}
+
+void HRSAPP_Init(void)
+{
+ HrsProcessId = osThreadNew(HrsProcess, NULL, &HrsProcess_attr);
+/* USER CODE BEGIN HRSAPP_Init */
+ /**
+ * Set Body Sensor Location
+ */
+ HRSAPP_Context.ResetEnergyExpended = 0;
+ HRSAPP_Context.BodySensorLocationChar = HRS_BODY_SENSOR_LOCATION_HAND;
+ HRS_UpdateChar(SENSOR_LOCATION_UUID, (uint8_t *)&HRSAPP_Context.BodySensorLocationChar);
+
+
+ /**
+ * Set Flags for measurement value
+ */
+
+ HRSAPP_Context.MeasurementvalueChar.Flags = ( HRS_HRM_VALUE_FORMAT_UINT16 |
+ HRS_HRM_SENSOR_CONTACTS_PRESENT |
+ HRS_HRM_SENSOR_CONTACTS_SUPPORTED |
+ HRS_HRM_ENERGY_EXPENDED_PRESENT |
+ HRS_HRM_RR_INTERVAL_PRESENT );
+
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT)
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended = 10;
+#endif
+
+#if (BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG != 0)
+ if(HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_RR_INTERVAL_PRESENT)
+ {
+ uint8_t i;
+
+ HRSAPP_Context.MeasurementvalueChar.NbreOfValidRRIntervalValues = BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG;
+ for(i = 0; i < BLE_CFG_HRS_ENERGY_RR_INTERVAL_FLAG; i++)
+ HRSAPP_Context.MeasurementvalueChar.aRRIntervalValues[i] = 1024;
+ }
+#endif
+
+ /**
+ * Create timer for Heart Rate Measurement
+ */
+ HW_TS_Create(CFG_TIM_PROC_ID_ISR, &(HRSAPP_Context.TimerMeasurement_Id), hw_ts_Repeated, HrMeas);
+
+/* USER CODE END HRSAPP_Init */
+ return;
+}
+
+static void HrsProcess(void *argument)
+{
+ UNUSED(argument);
+
+ for(;;)
+ {
+ osThreadFlagsWait( 1, osFlagsWaitAny, osWaitForever);
+ HRSAPP_Measurement( );
+ }
+}
+
+static void HRSAPP_Measurement(void)
+{
+/* USER CODE BEGIN HRSAPP_Measurement */
+ uint32_t measurement;
+
+ measurement = ((HRSAPP_Read_RTC_SSR_SS()) & 0x07) + 65;
+
+ HRSAPP_Context.MeasurementvalueChar.MeasurementValue = measurement;
+#if (BLE_CFG_HRS_ENERGY_EXPENDED_INFO_FLAG != 0)
+ if((HRSAPP_Context.MeasurementvalueChar.Flags & HRS_HRM_ENERGY_EXPENDED_PRESENT) &&
+ (HRSAPP_Context.ResetEnergyExpended == 0))
+ HRSAPP_Context.MeasurementvalueChar.EnergyExpended += 5;
+ else if(HRSAPP_Context.ResetEnergyExpended == 1)
+ HRSAPP_Context.ResetEnergyExpended = 0;
+#endif
+
+ HRS_UpdateChar(HEART_RATE_MEASURMENT_UUID, (uint8_t *)&HRSAPP_Context.MeasurementvalueChar);
+
+/* USER CODE END HRSAPP_Measurement */
+ return;
+}
+
+static void HrMeas( void )
+{
+ /**
+ * The code shall be executed in the background as aci command may be sent
+ * The background is the only place where the application can make sure a new aci command
+ * is not sent if there is a pending one
+ */
+ osThreadFlagsSet( HrsProcessId, 1 );
+
+/* USER CODE BEGIN HrMeas */
+
+/* USER CODE END HrMeas */
+
+ return;
+}
+
+static uint32_t HRSAPP_Read_RTC_SSR_SS ( void )
+{
+ return ((uint32_t)(READ_BIT(RTC->SSR, RTC_SSR_SS)));
+}
+
+/* USER CODE BEGIN FD */
+
+/* USER CODE END FD */
+
+/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/