For Blood Pressure Demo

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers BloodPressureService.h Source File

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 };