changeset 1034:195bfbdf961d Puls_Integration

Pulse measurement integration: Added function to parse standart GATT pulse service. Added compile switch to remove code from non dev builds.
author Ideenmodellierer
date Thu, 07 Aug 2025 20:18:52 +0200
parents 5f66e44d69f0
children 5b913cdaa9dc
files Discovery/Inc/cv_heartbeat.h Discovery/Src/base.c Discovery/Src/cv_heartbeat.c Discovery/Src/tInfoLogger.c Discovery/Src/tMenuEditCvOption.c
diffstat 5 files changed, 112 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- a/Discovery/Inc/cv_heartbeat.h	Sat Aug 02 22:42:51 2025 +0200
+++ b/Discovery/Inc/cv_heartbeat.h	Thu Aug 07 20:18:52 2025 +0200
@@ -42,6 +42,7 @@
 	SERVICE_INDICATOR,
 	CHARACTERISTIC_INDICATOR,
 	DESCRIPTOR_INDICATOR,
+	PULSE_INDICATOR,
 	OK_INDICATOR,			/* module control */
 	ERROR_INDICATOR			/* module control */
 } indicatior_t;
@@ -65,7 +66,10 @@
 	BT_READ_DESC_CONHANDLE,
 	BT_READ_DESC_CHARHANDLE,
 	BT_READ_DESC_DESCHANDLE,
-	BT_READ_DESC_UUID
+	BT_READ_DESC_UUID,
+	BT_READ_PULSE_CONHANDLE,
+	BT_READ_PULSE_VALUEHANDLE,
+	BT_READ_PULSE_DATA,
 } readDataType_t;
 
 typedef enum
@@ -124,6 +128,13 @@
 	uint8_t uuid[50];
 } btDeviceDescriptor_t;
 
+typedef struct {
+    uint16_t heart_rate;
+    uint16_t energy_expended;
+    uint16_t rr_intervals[10];
+    uint8_t rr_count;
+} HRMeasurement_t;
+
 sensorHeartbeat_State_t cv_heartbeat_getState();
 void refresh_Heartbeat(void);
 void cv_heartbeat_Control(void);
--- a/Discovery/Src/base.c	Sat Aug 02 22:42:51 2025 +0200
+++ b/Discovery/Src/base.c	Thu Aug 07 20:18:52 2025 +0200
@@ -529,17 +529,18 @@
         {
         	TriggerButtonAction();
         }
-
+#ifdef ENABLE_PULSE_SENSOR_BT
         cv_heartbeat_HandleData();
-
+#endif
         if(DoHousekeeping)
         {
            	DoHousekeeping = housekeepingFrame();
         }
         if(DoDisplayRefresh)							/* set every 100ms by timer interrupt */
         {
+#ifdef ENABLE_PULSE_SENSOR_BT
         	cv_heartbeat_Control();
-
+#endif
 	        DoDisplayRefresh = 0;
 
 	        updateSetpointStateUsed();
--- a/Discovery/Src/cv_heartbeat.c	Sat Aug 02 22:42:51 2025 +0200
+++ b/Discovery/Src/cv_heartbeat.c	Thu Aug 07 20:18:52 2025 +0200
@@ -24,6 +24,9 @@
 ///     along with this program.  If not, see <http://www.gnu.org/licenses/>.
 //////////////////////////////////////////////////////////////////////////////
 
+#include "configuration.h"
+
+#ifdef ENABLE_PULSE_SENSOR_BT
 #include "cv_heartbeat.h"
 #include "tMenuEdit.h"
 
@@ -32,6 +35,7 @@
 #include "ostc.h"
 #include "tComm.h"
 #include "tInfoLogger.h"
+#include "stdlib.h"
 
 static sensorHeartbeat_State_t heartbeatState = SENSOR_HB_OFFLINE;
 
@@ -52,7 +56,63 @@
 static uint8_t evaluateDevIndex = 0xFF;
 static uint8_t evaluateSrvIndex = 0xFF;
 static uint8_t evaluateCharIndex = 0xFF;
-static uint8_t evaluateDescIndex = 0xFF;
+
+static void parsePulseMeasurement(uint8_t* pData, uint8_t length)
+{
+	uint8_t rawData[10];
+	char text[40];
+	char* enptr;
+	uint8_t flags = 0;
+	uint16_t rr = 0;
+	uint8_t index = 0;
+	uint8_t* pRaw = (uint8_t*)&rawData;
+	char tmpStr[3];
+
+	tmpStr[2] = 0;
+
+	HRMeasurement_t pulseData;
+
+	for(index = 0; index < length; index +=2)
+	{
+		memcpy(tmpStr,&pData[index],2);
+		rawData[index / 2] = strtol(tmpStr, &enptr,16);
+	}
+	flags = pRaw[0];
+	index = 1;
+    /* 0: Heart Rate Format bit (0 = UINT8, 1 = UINT16) */
+	if (flags & 0x01)
+	{
+	   	pulseData.heart_rate = pRaw[index] | (pRaw[index + 1] << 8);
+	    index += 2;
+	} else
+	{
+	  	pulseData.heart_rate = pRaw[index];
+	    index += 1;
+	}
+
+	/* 3: Energy Expended Status	*/
+	if (flags & 0x08)
+	{
+	   	pulseData.energy_expended = pRaw[index] | (pRaw[index + 1] << 8);
+	    index += 2;
+	} else
+	{
+	  	pulseData.energy_expended = 0;
+	}
+    /* 4: RR-Interval bit			*/
+	pulseData.rr_count = 0;
+	if (flags & 0x10)
+	{
+	    while (index + 1 < 4 && pulseData.rr_count < 10)
+	    {
+	        rr = pRaw[index] | (pRaw[index + 1] << 8);
+	        pulseData.rr_intervals[pulseData.rr_count++] = rr;
+	        index += 2;
+	    }
+	}
+//			snprintf(text,40,"Pulse: %d",pulseData.heart_rate);
+//			InfoLogger_writeLine((uint8_t*)text,strlen(text),0);
+}
 
 static indicatior_t checkIndicators(uint8_t* pdata)
 {
@@ -78,7 +138,10 @@
 	{
 		ret = DESCRIPTOR_INDICATOR;
 	}
-
+	else if(strcmp((char*)pdata,"+UUBTGN:") == 0)
+	{
+		ret = PULSE_INDICATOR;
+	}
 	return ret;
 }
 
@@ -151,6 +214,9 @@
 											heartbeatState = SENSOR_HB_DISCONNECT;
 										}
 							break;
+
+		case SENSOR_HB_SUBSCRIBE:		heartbeatState = SENSOR_HB_CONNECTED;
+							break;
 		case SENSOR_HB_DISCONNECT:		evaluateDevIndex++;
 										connHandle= ' ';
 										if(evaluateDevIndex < curBtIndex)	/* more devices to be evaluated? */
@@ -252,6 +318,11 @@
 												memcpy(curDevDescriptor.uuid, parameter, writeIndex);
 											}
 								break;
+				case BT_READ_PULSE_DATA: 	if(writeIndex < 50)
+											{
+												parsePulseMeasurement(parameter, writeIndex);
+											}
+								break;
 				default:
 					break;
 			}
@@ -275,12 +346,11 @@
 					case SERVICE_INDICATOR: 	readType = BT_READ_SERV_HANDLE;
 						break;
 					case CHARACTERISTIC_INDICATOR: readType = BT_READ_CHAR_CONHANDLE;
-								//					snprintf(text,40,"Found Char");
-							//						InfoLogger_writeLine((uint8_t*)text,strlen(text),0);
 						break;
 					case DESCRIPTOR_INDICATOR: 	readType = BT_READ_DESC_CONHANDLE;
 						break;
-
+					case PULSE_INDICATOR:		readType = BT_READ_PULSE_CONHANDLE;
+						break;
 					default:
 						break;
 				}
@@ -376,6 +446,23 @@
 													}
 													readType = BT_READ_DESC_UUID;
 										break;
+						case BT_READ_PULSE_CONHANDLE: curDevDescriptor.conHandle = parameter[0];
+													  readType = BT_READ_PULSE_VALUEHANDLE;
+										break;
+						case BT_READ_PULSE_VALUEHANDLE: if(writeIndex < 10)
+														{
+											//				if(strcmp((char*)curDevCharacteristic[evaluateCharIndex].valueHandle,(char*) parameter) == 0)
+															{
+																readType = BT_READ_PULSE_DATA;
+															}
+#if 0
+															else
+															{
+																readType = BT_READ_NOTHING;
+															}
+#endif
+														}
+										break;
 						default:					readType = BT_READ_NOTHING;
 							break;
 					}
@@ -384,7 +471,7 @@
 				}
 				else
 				{
-				//	if(readType != BT_READ_NOTHING)
+					if(readType != BT_READ_NOTHING)
 					{
 						parameter[writeIndex++] = data;
 					}
@@ -491,8 +578,6 @@
 			case SENSOR_HB_CONNECT:		if(evaluateDevIndex < curBtIndex)
 										{
 											snprintf(cmd, sizeof(cmd), "AT+UBTACLC=%s\r\n",btDeviceList[evaluateDevIndex].address);
-									//		evaluateDevIndex = devicesIndex;
-									//		devicesIndex++;
 										}
 				break;
 			case SENSOR_HB_DISCONNECT:		snprintf(cmd, sizeof(cmd), "AT+UBTACLD=%c\r\n",connHandle);
@@ -509,7 +594,6 @@
 				break;
 			case SENSOR_HB_DESCRIPTOR: 		snprintf(cmd, sizeof(cmd), "AT+UBTGDCD=%c,%s,%s\r\n",connHandle,curDevCharacteristic[evaluateCharIndex].valueHandle
 																											,curDeviceService[evaluateSrvIndex].end);
-											//memset(curDevDescriptor, 0, sizeof(curDevCharacteristic));
 				break;
 			case SENSOR_HB_SUBSCRIBE: 		snprintf(cmd, sizeof(cmd), "AT+UBTGWC=%c,%s,1\r\n",connHandle,curDevDescriptor.descHandle);
 				break;
@@ -584,4 +668,4 @@
 
     write_buttonTextline(TXT2BYTE_ButtonMinus, TXT2BYTE_ButtonEnter, TXT2BYTE_ButtonPlus);
 }
-
+#endif
--- a/Discovery/Src/tInfoLogger.c	Sat Aug 02 22:42:51 2025 +0200
+++ b/Discovery/Src/tInfoLogger.c	Thu Aug 07 20:18:52 2025 +0200
@@ -96,7 +96,6 @@
  //   memset(lines,0,sizeof(lines));
 }
 
-extern void refresh_Heartbeat(void);
 void refreshInfo_Logger(GFX_DrawCfgScreen s)
 {
 	uint8_t index = 0;
@@ -155,13 +154,10 @@
 		}
 		index++;
 	}
-
-
 	if((time_elapsed_ms(loggerUpdateTime, HAL_GetTick()) > 20000))
 	{
 		set_globalState(previousGlobalState); /* restore state which was active before log data was received */
 	}
-	refresh_Heartbeat();
 }
 
 void sendActionToInfoLogger(uint8_t sendAction)
--- a/Discovery/Src/tMenuEditCvOption.c	Sat Aug 02 22:42:51 2025 +0200
+++ b/Discovery/Src/tMenuEditCvOption.c	Thu Aug 07 20:18:52 2025 +0200
@@ -63,7 +63,9 @@
 			break;
 		case 2:		openEdit_Timer();
 			break;
+#ifdef ENABLE_PULSE_SENSOR_BT
 		case 3: 	openEdit_Heartbeat();
+#endif
 			break;
     }
 }