Mercurial > public > ostc4
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)
