diff --git a/.github/workflows/snyk.yaml b/.github/workflows/snyk.yaml index 97a9baa6..f705c8a5 100644 --- a/.github/workflows/snyk.yaml +++ b/.github/workflows/snyk.yaml @@ -3,6 +3,7 @@ on: pull_request: branches: - master + - release-* jobs: security: diff --git a/commons/catalogue/unit.avsc b/commons/catalogue/unit.avsc index 0a4585d3..d55276f4 100644 --- a/commons/catalogue/unit.avsc +++ b/commons/catalogue/unit.avsc @@ -8,6 +8,7 @@ "CALORIES_PER_SEC", "CELSIUS", "DEGREE", + "MILLI_G", "G", "KILO_OHM", "LUX", @@ -21,6 +22,7 @@ "RMSSD_IN_MILLI_SEC", "SECOND", "MICRO_VOLT", + "VOLT", "UNKNOWN" ] } diff --git a/commons/passive/audio/phone_audio_input.avsc b/commons/passive/audio/phone_audio_input.avsc new file mode 100644 index 00000000..518a4565 --- /dev/null +++ b/commons/passive/audio/phone_audio_input.avsc @@ -0,0 +1,24 @@ +{ + "namespace": "org.radarcns.passive.audio", + "type": "record", + "name": "PhoneAudioInput", + "doc": "Uncompressed high-quality audio data collected by the PhoneAudioInput plugin, making use of low-level classes that interact directly with hardware.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." }, + { "name": "fileName", "type": "string", "doc": "Name of the audio file after it is saved to S3." }, + { "name": "filePath", "type": "string", "doc": "Path of the audio file retrieved after uploading to S3 storage." }, + { "name": "deviceName", "type": "string", "doc": "Name of the input audio device used for routing during this recording." }, + { "name": "deviceId", "type": "string", "doc": "Identifier associated with the input device used for audio recording." }, + { "name": "deviceSampleRates", "type": "string", "doc": "Supported sample rates of the input audio device." }, + { "name": "deviceEncodings", "type": "string", "doc": "Supported encodings of the input audio device." }, + { "name": "deviceType", "type": "string", "doc": "Type of the input audio device used for recording." }, + { "name": "deviceChannelCounts", "type": "string", "doc": "Supported channel counts of the input audio device." }, + { "name": "audioLength", "type": "long", "doc": "Length of the audio recording (in milliseconds)." }, + { "name": "audioFileSize", "type": "long", "doc": "Size of the audio file (in bytes)." }, + { "name": "hadPlayback", "type": "boolean", "doc": "Whether the recorded audio file was played before uploading to s3 storage." }, + { "name": "audioFileExtension", "type": "string", "doc": "Extension of the audio file." }, + { "name": "configuredSampleRate", "type": "int", "doc": "Sample rate for audio recording configured by firebase remote configs in application."}, + { "name": "configuredEncoding", "type": "string", "doc": "Encoding for audio recording configured by firebase remote configs in application." } + ] +} diff --git a/commons/passive/polar/polar_acceleration.avsc b/commons/passive/polar/polar_acceleration.avsc new file mode 100644 index 00000000..3839db43 --- /dev/null +++ b/commons/passive/polar/polar_acceleration.avsc @@ -0,0 +1,14 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarAcceleration", + "doc": "Accelerometer data. Axis specific acceleration data in mG.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ns)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." }, + { "name": "x", "type": "int", "doc": "Acceleration in the x-axis (mG)." }, + { "name": "y", "type": "int", "doc": "Acceleration in the y-axis (mG)." }, + { "name": "z", "type": "int", "doc": "Acceleration in the z-axis (mG)." } + ] +} diff --git a/commons/passive/polar/polar_battery_level.avsc b/commons/passive/polar/polar_battery_level.avsc new file mode 100644 index 00000000..ccb3c3c7 --- /dev/null +++ b/commons/passive/polar/polar_battery_level.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarBatteryLevel", + "doc": "Device battery level.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." }, + { "name": "batteryLevel", "type": "float", "doc": "Battery level from 0 to 1." } + ] +} diff --git a/commons/passive/polar/polar_ecg.avsc b/commons/passive/polar/polar_ecg.avsc new file mode 100644 index 00000000..3f8f4d96 --- /dev/null +++ b/commons/passive/polar/polar_ecg.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarEcg", + "doc": "Data from ECG in yV.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ns)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." } , + { "name": "ecgSignal", "type": "int", "doc": "ECG signal (yV)." } + ] +} diff --git a/commons/passive/polar/polar_heart_rate.avsc b/commons/passive/polar/polar_heart_rate.avsc new file mode 100644 index 00000000..1a4466eb --- /dev/null +++ b/commons/passive/polar/polar_heart_rate.avsc @@ -0,0 +1,16 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarHeartRate", + "doc": "Heart rate as beats per minute.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device receiver timestamp in UTC (ns)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." }, + { "name": "heartRate", "type": "int", "doc": "Heart rate (bpm)." }, + { "name": "rrsMs", "type": {"type": "array", "items": "int"}, "doc": "Data for rrsMs." }, + { "name": "rrAvailable", "type": "boolean", "doc": "Data for rrAvailable." }, + { "name": "contactStatus", "type": "boolean", "doc": "Data for contactStatus." }, + { "name": "contactStatusSupported", "type": "boolean", "doc": "Data for contactStatusSupported." } + ] +} diff --git a/commons/passive/polar/polar_pp_interval.avsc b/commons/passive/polar/polar_pp_interval.avsc new file mode 100644 index 00000000..8c358b2c --- /dev/null +++ b/commons/passive/polar/polar_pp_interval.avsc @@ -0,0 +1,17 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarPpInterval", + "doc": "PP interval representing cardiac pulse-to-pulse interval extracted from PPG signal.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (s)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." }, + { "name": "blockerBit", "type": "boolean", "doc": "Data for blockerBit." }, + { "name": "errorEstimate", "type": "int", "doc": "Data for errorEstimate." }, + { "name": "heartRate", "type": "int", "doc": "Data for errorEstimate." }, + { "name": "ppInterval", "type": "int", "doc": "The duration (s) of the detected inter-beat interval (i.e., the distance in seconds from the previous beat)." }, + { "name": "skinContactStatus", "type": "boolean", "doc": "Data for skinContactStatus." }, + { "name": "skinContactSupported", "type": "boolean", "doc": "Data for skinContactSupported." } + ] +} diff --git a/commons/passive/polar/polar_ppg.avsc b/commons/passive/polar/polar_ppg.avsc new file mode 100644 index 00000000..c65efa6e --- /dev/null +++ b/commons/passive/polar/polar_ppg.avsc @@ -0,0 +1,15 @@ +{ + "namespace": "org.radarcns.passive.polar", + "type": "record", + "name": "PolarPpg", + "doc": "Data from PPG channels.", + "fields": [ + { "name": "deviceName", "type": "string", "doc": "Polar device name." }, + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ns)." }, + { "name": "timeReceived", "type": "double", "doc": "Device receiver timestamp in UTC (s)." } , + { "name": "ppg0", "type": "int", "doc": "PPG0." }, + { "name": "ppg1", "type": "int", "doc": "PPG1." }, + { "name": "ppg2", "type": "int", "doc": "PPG2." }, + { "name": "ambient", "type": "int", "doc": "Ambient channel representing the background noise caused by other light sources, so it can be used to remove the background noise from ppg channels." } + ] +} diff --git a/java-sdk/buildSrc/src/main/kotlin/Versions.kt b/java-sdk/buildSrc/src/main/kotlin/Versions.kt index 3ec38247..34ac30c5 100644 --- a/java-sdk/buildSrc/src/main/kotlin/Versions.kt +++ b/java-sdk/buildSrc/src/main/kotlin/Versions.kt @@ -1,12 +1,12 @@ object Versions { - const val project = "0.8.10" + const val project = "0.8.11" const val kotlin = "1.9.10" const val java = 17 const val avroGenerator = "1.9.1" const val radarCommons = "1.1.2" - const val avro = "1.11.3" + const val avro = "1.11.4" const val jackson = "2.16.1" const val argparse = "0.9.0" const val radarJersey = "0.11.1" diff --git a/specifications/passive/android_phone_audio-1.0.0.yml b/specifications/passive/android_phone_audio-1.0.0.yml new file mode 100644 index 00000000..433a35cb --- /dev/null +++ b/specifications/passive/android_phone_audio-1.0.0.yml @@ -0,0 +1,13 @@ +#====================================== Android Phone Audio =======================================# +vendor: ANDROID +model: PHONE +version: 1.0.0 +data: + # Phone Audio Input + - type: PHONE_AUDIO_INPUT + app_provider: .phone.PhoneAudioInputProvider + processing_state: RADAR + topic: android_phone_audio_input + value_schema: .passive.audio.PhoneAudioInput + sample_rate: + dynamic: true diff --git a/specifications/passive/polar-1.0.0.yml b/specifications/passive/polar-1.0.0.yml new file mode 100644 index 00000000..5622ef5c --- /dev/null +++ b/specifications/passive/polar-1.0.0.yml @@ -0,0 +1,48 @@ +#====================================== POLAR H10 or Vantage V3 device =====================================# +vendor: POLAR +model: GENERIC +version: 1.0.0 +app_provider: .polar.PolarProvider +data: + - type: ACCELEROMETER + sample_rate: + frequency: 50 + unit: MILLI_G + processing_state: RAW + topic: android_polar_acceleration + value_schema: .passive.polar.PolarAcceleration + - type: BATTERY + sample_rate: + dynamic: true + unit: PERCENTAGE + processing_state: RAW + topic: android_polar_battery_level + value_schema: .passive.polar.PolarBatteryLevel + - type: ECG + sample_rate: + dynamic: true + unit: VOLT + processing_state: RAW + topic: android_polar_ecg + value_schema: .passive.polar.PolarEcg + - type: PPG + sample_rate: + dynamic: true + unit: UNKNOWN + processing_state: RAW + topic: android_polar_ppg + value_schema: .passive.polar.PolarPpg + - type: HEART_RATE + sample_rate: + frequency: 1 + unit: BEATS_PER_MIN + processing_state: VENDOR + topic: android_polar_heart_rate + value_schema: .passive.polar.PolarHeartRate + - type: PULSE_TO_PULSE_INTERVAL + sample_rate: + dynamic: true + unit: SECOND + processing_state: VENDOR + topic: android_polar_pulse_to_pulse_interval + value_schema: .passive.polar.PolarPpInterval