ECG Data - A4100 Sample Health App ECG Sensor
ECG Sample test data
Upon clicking the Mason ECG tests option, the user can view either of the following screens based on first-time user experience vs a returning user to this screen.
In case the user doesn’t have permission for sensor data it will ask for permission first and once the user provides the permission the sensor will be active to send data. This one-time permission until the user disables the permission.
Grant Permissions
The following line of code is utilized in the Activity class within the Oncreate() method. It will first check for permission. If it is not enabled, you need to open up the Allow permission screen (First Figure below). If permissions are already granted User would see the Second Figure below.
// Code snippet to get Heart Rate, Stress, and value
// get Heart Rate @Override public void HandleHeartRate(ECGHeartRate ecgHeartRate) { Log.i(TAG, "Get Heart Rate: " + Integer.toString(ecgHeartRate.getBpm())); } // get Stress Score and State @Override public void HandleStress(ECGStress ecgStress) { String score = Integer.toString(ecgStress.getScore()); String state = Integer.toString(ecgStress.getState()); } // get Total Energy and Progress @Override public void HandleEnergy(ECGEnergy ecgEnergy) { String totalEnergy = Float.toString(ecgEnergy.getTotalEnergy()); String progress = Integer.toString(ecgEnergy.getProgress()); } // User Details @Override public void HandleUserId(ECGUserID ecgUserID) { String mode = Integer.toString(ecgUserID.getMode()); String status = Integer.toString(ecgUserID.getStatus()); String enrollProgress = Integer.toString(ecgUserID.getEnrolProgress()); int enrollUserCnt = ecgUserID.getEnrolUserCount(); String enrollUserCntStr = Integer.toString(enrollUserCnt); String enrollFTEReason = Integer.toString(ecgUserID.getEnrolFTEReason()); int currentAutorizedUser = ecgUserID.getAuthUserId(); String curAuthUserStr = Integer.toString(currentAutorizedUser); String autRejectionReason = Integer.toString(ecgUserID.getAuthRejectReason()); String authProgress = Integer.toString(ecgUserID.getAuthProgress()); } // get heart rate variability and progress @Override public void HandleHeartRateVariability(ECGHeartRateVariability ecgHeartRateVariability) { String hrv = Integer.toString(ecgHeartRateVariability.getHeartRateVariability()); String progress = Integer.toString(ecgHeartRateVariability.getProgress()); } // get user presence and signal quality @Override public void HandleUserPresence(ECGUserPresence ecgUserPresence) { String presence = Integer.toString(ecgUserPresence.getUserPresence()); String alive = Integer.toString(ecgUserPresence.getUserAlive()); String sQuality = Integer.toString(ecgUserPresence.getSignalQuality()); } // get Samples and Subtype @Override public void HandleECGSamples(ECGSamples ecgSamples) { float[] samples = ecgSamples.getSamples(); int subType = ecgSamples.getSubtype(); } // get Execution Response @Override public void HandleExecuteResponse(ECGExecuteResponse ecgExecuteResponse) { String id = Integer.toString(ecgExecuteResponse.getCommandId()); String ret = Integer.toString(ecgExecuteResponse.getResponse()); Log.i("Name: " + ecgExecuteResponse.getCommandName()); } // get ECG Firmware Version @Override public void HandleGetVersion(ECGFwVersion ecgFwVersion) { Log.i("Version " + ecgFwVersion.getVersion()); } // get User Metadata @Override public void HandleGetUserMetadata(ECGUserMetadata ecgUserMetadata) { String age = Integer.toString(ecgUserMetadata.getAge()); String h = Integer.toString(ecgUserMetadata.getHeight()); String w = Integer.toString(ecgUserMetadata.getWeight()); String g = Integer.toString(ecgUserMetadata.getGender()); } // get ECG Library Config @Override public void HandleGetLibConfig(ECGLibConfig ecgLibConfig) { int useCase = ecgLibConfig.getUseCase(); int authMode = ecgLibConfig.getContinuousAuthEnable(); } };
The below code path is executed overall for measuring the sensor data. The measurement takes roughly 10-15 seconds.
// Measuring the sensor Data
private SensorEventListener mUserControlEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { ecgManager.dispatch(event); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.d("TAG", "Accuracy has changed to $accuracyLevel." + accuracy); } }; private SensorEventListener mECGSensorDataEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { ecgManager.dispatch(event); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.d("TAG", "Accuracy has changed to $accuracyLevel." + accuracy); } }; private SensorEventListener mECGSampleDataEventListener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent event) { ecgManager.dispatch(event); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { Log.d("TAG", "Accuracy has changed to $accuracyLevel." + accuracy); } };
Data Collection for New Sensor Event
For SensorManager to get notified of new sensor data, one should utilize the public interface SensorEventListener. This has two callback methods:
Callback method | Parameters |
public abstract void onAccuracyChanged (Sensor sensor, int accuracy) | Sensor: Sensor accuracy : int: The new accuracy of this sensor, one of SensorManager.SENSOR_STATUS |
public abstract void onSensorChanged (SensorEvent event) | event : SensorEvent: the SensorEvent. |
Please Note
- onAccuracyChanged() is called when the accuracy of the registered sensor has changed. Unlike onSensorChanged(), this is only called when this accuracy value is changed. Implement onAccuracyChanged Method empty as it will never change.
- Local caching is not applicable for capturing ECG sensor data.