For Blood Pressure Demo
Embed:
(wiki syntax)
Show/hide line numbers
BloodPressureService.h
00001 #include "BLE.h" 00002 //#include "Gap.h" 00003 00004 /* 00005 * @This example can be demonstrated with Blood Pressure Android App downloaded from 00006 * @https://github.com/Marcomissyou/BluetoothLeBooldPressure.git 00007 * @Author: Marco.Hsu 00008 * @Email: marco.missyou@gmail.com 00009 */ 00010 class BloodPressureService { 00011 public: 00012 BloodPressureService(BLEDevice &_ble, float Systolic, float Diastolic, float mean_arterial, uint16_t BloodFeature): 00013 ble(_ble), 00014 BloodPressureValue(Systolic, Diastolic, mean_arterial), 00015 BloodFeatureValue(BloodFeature), 00016 //GlucoseFeatureValue(GluFeature), 00017 BloodPressureGatt(GattCharacteristic::UUID_BLOOD_PRESSURE_MEASUREMENT_CHAR, BloodPressureValue.getPointer(), 00018 sizeof(uint8_t), BloodPressureStruc::MAX_VALUE_BYTES, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE), 00019 BloodFeature(GattCharacteristic::UUID_BLOOD_PRESSURE_FEATURE_CHAR, &BloodFeatureValue) { 00020 setupService(); 00021 } 00022 00023 void updateBloodPressureMeasurement(float Systolic, float Diastolic, float mean_arterial) { 00024 BloodPressureValue.uploadBloodPressureValue(Systolic, Diastolic, mean_arterial); 00025 ble.updateCharacteristicValue(BloodPressureGatt.getValueAttribute().getHandle(), BloodPressureValue.getPointer(), 6); 00026 } 00027 00028 00029 00030 private: 00031 void setupService(void) { 00032 static bool serviceAdded = false; /* We should only ever need to add the heart rate service once. */ 00033 if (serviceAdded) { 00034 return; 00035 } 00036 00037 GattCharacteristic *charTable[] = {&BloodPressureGatt, &BloodFeature}; 00038 GattService BloodService(GattService::UUID_BLOOD_PRESSURE_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *)); 00039 00040 ble.addService(BloodService); 00041 serviceAdded = true; 00042 00043 } 00044 00045 //========================================================================================================== 00046 private: 00047 struct BloodPressureStruc { 00048 static const unsigned MAX_VALUE_BYTES = 8; 00049 static const unsigned FLAGS_BYTE_INDEX = 0; 00050 00051 static const unsigned Blood_Pressure_Units_Flag = 0; // 0 in units of mmHg, 1 in units of kPa 00052 static const unsigned Time_Stamp_Flag = 0; // 00053 static const unsigned Pulse_Rate_Flag = 0; 00054 static const unsigned User_ID_Flag = 0; 00055 static const unsigned Measurement_Status_Flag = 0; 00056 00057 static const unsigned VALUE_FORMAT_BITNUM = 0; 00058 static const uint8_t VALUE_FORMAT_FLAG = 0; 00059 00060 // Initial setting Blood Pressure measurement value 00061 BloodPressureStruc(float Systolic, float Diastolic, float mean_arterial) : BloodPressureValue() { 00062 uploadBloodPressureValue(Systolic, Diastolic, mean_arterial); 00063 } 00064 00065 // function to update Blood Pressure measurement value in unit of mmHg 00066 void uploadBloodPressureValue(float Systolic, float Diastolic, float mean_arterial) { 00067 uint16_t ieee11073_Systolic = ieee11073_float16(Systolic); 00068 uint16_t ieee11073_Diastolic = ieee11073_float16(Diastolic); 00069 uint16_t ieee11073_mean_arterial = ieee11073_float16(mean_arterial); 00070 BloodPressureValue[FLAGS_BYTE_INDEX] = (Blood_Pressure_Units_Flag << 0)|(Time_Stamp_Flag << 1)| 00071 (Pulse_Rate_Flag << 2)|(User_ID_Flag << 3)|(Measurement_Status_Flag << 4); 00072 //memcpy(&BloodPressureValue[FLAGS_BYTE_INDEX], &ieee11073_Systolic, 2); 00073 //memcpy(&BloodPressureValue[FLAGS_BYTE_INDEX+2], &ieee11073_Diastolic, 2); 00074 //memcpy(&BloodPressureValue[FLAGS_BYTE_INDEX+4], &ieee11073_mean_arterial, 2); 00075 BloodPressureValue[FLAGS_BYTE_INDEX + 1] = (uint8_t)(ieee11073_Systolic &0xff); 00076 BloodPressureValue[FLAGS_BYTE_INDEX + 2] = (uint8_t)(ieee11073_Systolic >> 8); 00077 BloodPressureValue[FLAGS_BYTE_INDEX + 3] = (uint8_t)(ieee11073_Diastolic &0xff); 00078 BloodPressureValue[FLAGS_BYTE_INDEX + 4] = (uint8_t)(ieee11073_Diastolic >> 8); 00079 BloodPressureValue[FLAGS_BYTE_INDEX + 5] = (uint8_t)(ieee11073_mean_arterial &0xff); 00080 BloodPressureValue[FLAGS_BYTE_INDEX + 6] = (uint8_t)(ieee11073_mean_arterial >>8); 00081 } 00082 00083 00084 uint8_t *getPointer(void) { 00085 return BloodPressureValue; 00086 } 00087 00088 const uint8_t *getPointer(void) const { 00089 return BloodPressureValue; 00090 } 00091 00092 uint16_t ieee11073_float16(float BloodPressure) { 00093 uint8_t exponent = 0; 00094 uint16_t mantissa = (uint16_t)BloodPressure; 00095 return ((exponent << 12)&0xF0) | (mantissa << 0) & 0x0FFF ; 00096 } 00097 private: 00098 uint8_t BloodPressureValue[MAX_VALUE_BYTES]; 00099 }; 00100 00101 00102 private: 00103 BLEDevice &ble; 00104 00105 BloodPressureStruc BloodPressureValue; 00106 GattCharacteristic BloodPressureGatt; // data carrier 00107 00108 uint16_t BloodFeatureValue; 00109 ReadOnlyGattCharacteristic<uint16_t> BloodFeature; 00110 00111 };
Generated on Wed Jul 13 2022 18:14:47 by 1.7.2