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:


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 braceletWAITING_FOR_CUFF_MEASUREMENT_1: screens 7) part 2 measurement can be sentPAUSE_BETWEEN_MEASUREMENTS: screens 8) pause of 30 secondsDONE_WITH_SUCCESS: screens 9) success = bracelet sucess on one of the measurementDONE_WITH_FAILURE: screens 9) success = bracelet failure on all of the measurements