Skip to main content

Non Invasive Blood Pressure

Overview

NIBP measurement requires the Corsano BP Cuff. To order your cuff, contact info@corsano.com.

NIBP is measured on the CardioWatch every 30 minutes. The raw activity data will contain a value every 30 minutes. If movement is detected, the measurement is postponed by one minute, repeating as necessary until a stable reading is obtained.

2-minute measurement every 30 minutes: motion-aware behavior

Every 30 minutes, the bracelet attempts to start a 2-minute measurement.

Before starting, it checks for motion.

If motion is detected, the measurement is delayed by 1 minute.

After that 1 minute, motion is checked again, and the same rule applies (delay + recheck).

If the entire 30-minute window passes without finding a still period, the bracelet will run the 2-minute measurement immediately at the end of the window, regardless of motion.

Prerequist

  • Device Compatibility: Available for B2 devices.

  • Software Requirement: Requires SDK 1.1.4 or later.

Bracelet setup

1) Bracelet Plan

Ensure the bracelet plan supports NIBP. Refer to the bracelet plans description

2) Enable NIBP

To enable NIBP, set the sampling rate to 1/30 min using the following command:

bleDevice.enqueueCommand(
SetVitalParameterSamplingRateRequest(
VitalParameterWithSamplingRateType.NIBP,
SampleRate.THIRTY_MIN
),

To disable NIBP, set the sample rate to 0:

bleDevice.enqueueCommand(
SetVitalParameterSamplingRateRequest(
VitalParameterWithSamplingRateType.NIBP,
SampleRate.OFF
),

Measurements with a Corsano cuff

NIBP requires three sets of measurements, with at least one hour between each set. Each set consists of three cuff measurements using the Corsano BP Cuff. The NIBP manager handles the measurement sequence.

Start a measurement:

DataSdk.getInstance().getManager().getNibpCalibrationManager().startCalibration(
bleDevice,
"B8:B7:7D:00:0C:AF"
)

Start passing the mac address of the Corsano BP cuff in parameter. Either find the mac address on the back of the cuff (sticker), on detect it by using the cuff BLE scan

Stop a measurement:

DataSdk.getInstance().getManager().getNibpCalibrationManager().stopCalibration(
bleDevice,
DevicePlan.HOSPITAL_MULTICOLOR,
null
)

Note: The stop action is triggered automatically at the end of a measurement but can be manually executed if needed.

Corsano Blood pressure cuff scan

Measurement Sequence:

1) Warm up: 30 seconds
  • A command is sent to the bracelet to start the measurement mode (PPG 128Hz).

  • A 30-second timer begins.

  • The patient must sit still and remain silent.

  • A BloodPressureSession is created in the database.

2) Cuff Measurement (1/3)
  • The patient wears the cuff on the opposite arm from the bracelet.

  • The patient presses the START button on the cuff.

  • Once completed, the cuff transmits SYS/DIA/Pulse data to the manager.

  • The bracelet verifies accuracy and marks the measurement as valid or invalid.

  • Invalid readings occur due to excessive movement or improper bracelet wear.

  • The BloodPressureValue and its accuracy are saved in the database.

  • The BloodPressureValue and its accuracy is saved in the database.

3) Pause (30 seconds)

A 30-second pause before the next measurement.

4) Wait for measurement 2/3:

Same as step 2.

5) Pause (30 seconds)

A 30-second pause before the next measurement.

6) Wait for measurement 3/3:

Same as step 2.

7) Pause (30 seconds)

A 30-second pause before the next measurement.

8) End
  • The BloodPressureSession is updated with an endTimestamp.

  • A command is sent to stop measurement mode (PPG 128Hz).

  • If all measurements are invalid, the sequence must be repeated.

Listener during the sequence

    @PrimaryKey
var startTimestamp: Long = 0L
var endTimestamp: Long = 0L
var measurements: RealmList<BloodPressureValue>? = null

Data models

Calibration data models

BloodPressureSession

    @PrimaryKey
var startTimestamp: Long = 0L
var endTimestamp: Long = 0L
var measurements: RealmList<BloodPressureValue>? = null

BloodPressureValue

    @PrimaryKey
var timestamp: Long = 0L
var date: String = ""
var sbp: Int = 0
var dia: Int = 0
var hr: Int = 0
var braceletSuccess: Boolean? = null

NIBP models

Raw data

Continuous NIBP data is stored in MetricActivity under nibpSystolic and nibpDiastolic

MetricBloodPressureSummary

open class MetricBloodPressureSummary : RealmObject() {
@PrimaryKey
var startTimestamp: Long = 0L
var endTimestamp: Long = 0L
var serverDate: String = ""
var averageSys: Int? = null
var averageDia: Int? = null

var maxDaySys: Int? = null
var maxDayDia: Int? = null

var minDaySys: Int? = null
var minDayDia: Int? = null

var slots: RealmList<MetricBloodPressureSummarySlot> = RealmList()

MetricBloodPressureSummarySlot

open class MetricBloodPressureSummarySlot : RealmObject() {

@PrimaryKey
var startTimestamp: Long = 0L
var endTimestamp: Long = 0L
var date: String = ""
var endDate: String = ""
var systolicPressure: Int? = null
var diastolicPressure: Int? = null

Measurements with an External cuff (non Corsano)

From SDK 1.1.23

NIBP requires three sets of measurements, with at least one hour between each set. Each set consists of two or three cuff measurements. The NIBP measurements have to follow this specific sequence:

BP Measurement

BP Measurement

1) Warm-up

Screens 2) -> 6)

Instructions to prepare the measurement

Duration: 30 seconds

2) Measurement

Screen 7)

Take the measurement on the patient, select the values in the picker and send it to the bracelet

Duration: 45 seconds minimum to take the measurement on the patient, before being able to send it to the bracelet

3) Pause after measurement

Screen 8)

Display the result of the quality of the measurement

Wait 30 seconds before the next step

Duration: 30 seconds

Redo 2) and 3) another time or 2 other times to gather x2 or x3 measurements.

Why x2 or x3?

If the measurement 1 and measurement 2 are too far one from another, a third measurement must be done.

Too far = more than 15 mmHg between SYS or DIA

4) Result of the measurements session

Screen 9)

Display the result of the measurements.

SDK calls during the sequence

Start a measurement:

To call before warm up.

DataSdk.getInstance().getManager().getNibpCalibrationManager().startMeasurementWithExternalCuff(
bleDevice
)

This will start the PPG 128Hz on the bracelet, and start the session in the DB.

Example in MainDataNibpExternalCalibrationFragment.kt

Send a measurement from the external cuff:

DataSdk.getInstance().getManager().getNibpCalibrationManager().sendMeasurementFromExternalCuff(
bleDevice,
sysValue, diaValue, pulseRateValue
)

This will send the measurement to the bracelet, get the quality back, and save it into the DB.

Example in MainDataNibpExternalCalibrationFragment.kt

Stop a measurement:

DataSdk.getInstance().getManager().getNibpCalibrationManager().stopCalibration(
bleDevice,
DevicePlan.HOSPITAL_RAW, // TODO update with your chosen plan
Ppg2Frequency.THIRTY_TWO_HZ // TODO update with your chosen PPG frequency
)

This will stop the PPG 128Hz on the bracelet, and stop the session in the DB.

Example in MainDataNibpExternalCalibrationFragment.kt

Status of a measurement (optional):

val onGoingCalibrationResult = DataSdk.getInstance().getManager().getNibpCalibrationManager().getOnGoingMeasurement()
if (onGoingCalibrationResult.isSuccess) {
onGoingCalibrationResult.getOrNull()?.status
}
    enum class MeasurementStatus(val details: String) {
WARM_UP("CardioWatch warm up started, sit still and relax"),
READY_TO_TAKE_CUFF_MEASUREMENT_1("Please take the measurement 1 on the patient"),
WAITING_FOR_CUFF_MEASUREMENT_1("Bracelet ready to receive cuff measurement 1"),
PAUSE_BETWEEN_MEASUREMENTS("Measurement 1/2 received, pause before next measurement"),
READY_TO_TAKE_CUFF_MEASUREMENT_2("Please take the measurement 2 on the patient"),
WAITING_FOR_CUFF_MEASUREMENT_2("Bracelet ready to receive cuff measurement 2"),
READY_TO_TAKE_CUFF_MEASUREMENT_3("Please take the measurement 3 on the patient"),
WAITING_FOR_CUFF_MEASUREMENT_3("Bracelet ready to receive cuff measurement 3"),
DONE_WITH_SUCCESS("Finished with success"),
DONE_WITH_FAILURE("Finished with failure");
}
  • WARM_UP : screens 2) -> 6)
  • READY_TO_TAKE_CUFF_MEASUREMENT_1 : screens 7) part 1 before being able to send it to the bracelet
  • WAITING_FOR_CUFF_MEASUREMENT_1 : screens 7) part 2 measurement can be sent
  • PAUSE_BETWEEN_MEASUREMENTS : screens 8) pause of 30 seconds
  • DONE_WITH_SUCCESS : screens 9) success = bracelet sucess on one of the measurement
  • DONE_WITH_FAILURE : screens 9) success = bracelet failure on all of the measurements