diff --git a/commons/passive/google/google_places_info.avsc b/commons/passive/google/google_places_info.avsc index 2302ee89..b6799f24 100644 --- a/commons/passive/google/google_places_info.avsc +++ b/commons/passive/google/google_places_info.avsc @@ -11,11 +11,15 @@ "type": "enum", "doc": "The predefined categories or tags assigned to different places based on their characteristics. These types can represent various categories such as restaurants, cafes, museums, parks, hotels, airports, hospitals, and more.", "symbols": [ "ACCOUNTING", "ADMINISTRATIVE_AREA_LEVEL_1", "ADMINISTRATIVE_AREA_LEVEL_2", "ADMINISTRATIVE_AREA_LEVEL_3", "ADMINISTRATIVE_AREA_LEVEL_4", "ADMINISTRATIVE_AREA_LEVEL_5", "AIRPORT", "AMUSEMENT_PARK", "AQUARIUM", "ARCHIPELAGO", "ART_GALLERY", "ATM", "BAKERY", "BANK", "BAR", "BEAUTY_SALON", "BICYCLE_STORE", "BOOK_STORE", "BOWLING_ALLEY", "BUS_STATION", "CAFE", "CAMPGROUND", "CAR_DEALER", "CAR_RENTAL", "CAR_REPAIR", "CAR_WASH", "CASINO", "CEMETERY", "CHURCH", "CITY_HALL", "CLOTHING_STORE", "COLLOQUIAL_AREA", "CONTINENT", "CONVENIENCE_STORE", "COUNTRY", "COURTHOUSE", "DENTIST", "DEPARTMENT_STORE", "DOCTOR", "DRUGSTORE", "ELECTRICIAN", "ELECTRONICS_STORE", "EMBASSY", "ESTABLISHMENT", "FINANCE", "FIRE_STATION", "FLOOR", "FLORIST", "FOOD", "FUNERAL_HOME", "FURNITURE_STORE", "GAS_STATION", "GENERAL_CONTRACTOR", "GEOCODE", "GROCERY_OR_SUPERMARKET", "GYM", "HAIR_CARE", "HARDWARE_STORE", "HEALTH", "HINDU_TEMPLE", "HOME_GOODS_STORE", "HOSPITAL", "INSURANCE_AGENCY", "INTERSECTION", "JEWELRY_STORE", "LAUNDRY", "LAWYER", "LIBRARY", "LIGHT_RAIL_STATION", "LIQUOR_STORE", "LOCAL_GOVERNMENT_OFFICE", "LOCALITY", "LOCKSMITH", "LODGING", "MEAL_DELIVERY", "MEAL_TAKEAWAY", "MOSQUE", "MOVIE_RENTAL", "MOVIE_THEATER", "MOVING_COMPANY", "MUSEUM", "NATURAL_FEATURE", "NEIGHBORHOOD", "NIGHT_CLUB", "PAINTER", "PARK", "PARKING", "PET_STORE", "PHARMACY", "PHYSIOTHERAPIST", "PLACE_OF_WORSHIP", "PLUMBER", "PLUS_CODE", "POINT_OF_INTEREST", "POLICE", "POLITICAL", "POST_BOX", "POST_OFFICE", "POSTAL_CODE_PREFIX", "POSTAL_CODE_SUFFIX", "POSTAL_CODE", "POSTAL_TOWN", "PREMISE", "PRIMARY_SCHOOL", "REAL_ESTATE_AGENCY", "RESTAURANT", "ROOFING_CONTRACTOR", "ROOM", "ROUTE", "RV_PARK", "SCHOOL", "SECONDARY_SCHOOL", "SHOE_STORE", "SHOPPING_MALL", "SPA", "STADIUM", "STORAGE", "STORE", "STREET_ADDRESS", "STREET_NUMBER", "SUBLOCALITY_LEVEL_1", "SUBLOCALITY_LEVEL_2", "SUBLOCALITY_LEVEL_3", "SUBLOCALITY_LEVEL_4", "SUBLOCALITY_LEVEL_5", "SUBLOCALITY", "SUBPREMISE", "SUBWAY_STATION", "SUPERMARKET", "SYNAGOGUE", "TAXI_STAND", "TOURIST_ATTRACTION", "TOWN_SQUARE", "TRAIN_STATION", "TRANSIT_STATION", "TRAVEL_AGENCY", "UNIVERSITY", "VETERINARY_CARE", "ZOO"] - }], "doc": "Categorizing places based on their characteristics or attributes, this field represents the first type, if any, among the retrieved place categories.", "default": null + }], "doc": "Categorizing places based on their characteristics or attributes, This field is deprecated, as the Google Place.Type enum is deprecated. Instead, use the placeType field of string type.", "default": null }, - { "name": "type2", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the second type, if any, among the retrieved place categories.", "default": null }, - { "name": "type3", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the third type, if any, among the retrieved place categories.", "default": null }, - { "name": "type4", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the fourth type, if any, among the retrieved place categories.", "default": null }, + { "name": "type2", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, This field is deprecated, as the Google Place.Type enum is deprecated. Instead, use the placeType field of string type.", "default": null }, + { "name": "type3", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, This field is deprecated, as the Google Place.Type enum is deprecated. Instead, use the placeType field of string type.", "default": null }, + { "name": "type4", "type": ["null", "org.radarcns.passive.google.PlacesType"], "doc": "Categorizing places based on their characteristics or attributes, This field is deprecated, as the Google Place.Type enum is deprecated. Instead, use the placeType field of string type.", "default": null }, + { "name": "placeType1", "type": ["null", "string"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the first type, if any, among the retrieved place categories.", "default": null }, + { "name": "placeType2", "type": ["null", "string"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the second type, if any, among the retrieved place categories.", "default": null }, + { "name": "placeType3", "type": ["null", "string"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the third type, if any, among the retrieved place categories.", "default": null }, + { "name": "placeType4", "type": ["null", "string"], "doc": "Categorizing places based on their characteristics or attributes, this field represents the fourth type, if any, among the retrieved place categories.", "default": null }, { "name": "city", "type": ["null", "string"], "doc": "The city returned corresponds to the current location of the user's device.", "default": null }, { "name": "state", "type": ["null", "string"], "doc": "The state returned corresponds to the current location of the user's device.", "default": null }, { "name": "country", "type": ["null", "string"], "doc": "The country returned corresponds to the current location of the user's device.", "default": null }, diff --git a/commons/passive/ticwatch/ticwatch_acceleration.avsc b/commons/passive/ticwatch/ticwatch_acceleration.avsc new file mode 100644 index 00000000..d72508b5 --- /dev/null +++ b/commons/passive/ticwatch/ticwatch_acceleration.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.passive.ticwatch", + "type": "record", + "name": "TicwatchAcceleration", + "doc": "Data from 3-axis accelerometer sensor of a Mobovi TicWatch device.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ms)." }, + { "name": "timeReceived", "type": "double", "doc": "Processed time since the Unix Epoch (seconds)." }, + { "name": "x", "type": "float", "doc": "Acceleration in the x-axis (g)." }, + { "name": "y", "type": "float", "doc": "Acceleration in the y-axis (g)." }, + { "name": "z", "type": "float", "doc": "Acceleration in the z-axis (g)." } + ] +} \ No newline at end of file diff --git a/commons/passive/ticwatch/ticwatch_battery_level.avsc b/commons/passive/ticwatch/ticwatch_battery_level.avsc new file mode 100644 index 00000000..869bac11 --- /dev/null +++ b/commons/passive/ticwatch/ticwatch_battery_level.avsc @@ -0,0 +1,11 @@ +{ + "namespace": "org.radarcns.passive.ticwatch", + "type": "record", + "name": "TicwatchBatteryLevel", + "doc": "Battery level of a TicWatch device.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ms)." }, + { "name": "timeReceived", "type": "double", "doc": "Processed time since the Unix Epoch (seconds)." }, + { "name": "batteryLevel", "type": "float", "doc": "Battery level from 0 to 1. Note that the battery level is a rough estimate." } + ] +} \ No newline at end of file diff --git a/commons/passive/ticwatch/ticwatch_gyroscope.avsc b/commons/passive/ticwatch/ticwatch_gyroscope.avsc new file mode 100644 index 00000000..e602a814 --- /dev/null +++ b/commons/passive/ticwatch/ticwatch_gyroscope.avsc @@ -0,0 +1,13 @@ +{ + "namespace": "org.radarcns.passive.ticwatch", + "type": "record", + "name": "TicwatchGyroscope", + "doc": "Data from 3-axis gyroscope sensor of a Mobovi TicWatch device.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ms)." }, + { "name": "timeReceived", "type": "double", "doc": "Processed time since the Unix Epoch (seconds)." }, + { "name": "x", "type": "float", "doc": "Angular velocity in the x-axis (rad/s)." }, + { "name": "y", "type": "float", "doc": "Angular velocity in the y-axis (rad/s)." }, + { "name": "z", "type": "float", "doc": "Angular velocity in the z-axis (rad/s)." } + ] +} \ No newline at end of file diff --git a/commons/passive/ticwatch/ticwatch_ppg.avsc b/commons/passive/ticwatch/ticwatch_ppg.avsc new file mode 100644 index 00000000..c8810913 --- /dev/null +++ b/commons/passive/ticwatch/ticwatch_ppg.avsc @@ -0,0 +1,12 @@ +{ + "namespace": "org.radarcns.passive.ticwatch", + "type": "record", + "name": "TicwatchPpg", + "doc": "PPG collected using a Mobovi TicWatch.", + "fields": [ + { "name": "time", "type": "double", "doc": "Device timestamp in UTC (ms)." }, + { "name": "timeReceived", "type": "double", "doc": "Processed time since the Unix Epoch (seconds)." }, + { "name": "redled", "type": "float", "doc": "Red LED." }, + { "name": "iredled", "type": "float", "doc": "Infrared LED." } + ] +} \ No newline at end of file diff --git a/java-sdk/buildSrc/src/main/kotlin/Versions.kt b/java-sdk/buildSrc/src/main/kotlin/Versions.kt index 060996f7..d9090f8a 100644 --- a/java-sdk/buildSrc/src/main/kotlin/Versions.kt +++ b/java-sdk/buildSrc/src/main/kotlin/Versions.kt @@ -1,5 +1,5 @@ object Versions { - const val project = "0.8.8" + const val project = "0.8.9" const val kotlin = "1.9.10" const val java = 17 diff --git a/java-sdk/radar-schemas-registration/src/main/java/org/radarbase/schema/registration/SchemaRegistry.kt b/java-sdk/radar-schemas-registration/src/main/java/org/radarbase/schema/registration/SchemaRegistry.kt index 4d235091..3728f5e5 100644 --- a/java-sdk/radar-schemas-registration/src/main/java/org/radarbase/schema/registration/SchemaRegistry.kt +++ b/java-sdk/radar-schemas-registration/src/main/java/org/radarbase/schema/registration/SchemaRegistry.kt @@ -18,6 +18,7 @@ package org.radarbase.schema.registration import io.ktor.client.plugins.auth.Auth import io.ktor.client.plugins.auth.providers.BasicAuthCredentials import io.ktor.client.plugins.auth.providers.basic +import io.ktor.client.request.basicAuth import io.ktor.client.request.setBody import io.ktor.client.request.url import io.ktor.http.ContentType @@ -56,8 +57,8 @@ import kotlin.time.toKotlinDuration */ class SchemaRegistry( private val baseUrl: String, - apiKey: String? = null, - apiSecret: String? = null, + private val apiKey: String? = null, + private val apiSecret: String? = null, private val topicConfiguration: Map = emptyMap(), ) { private val schemaClient: SchemaRetriever = schemaRetriever(baseUrl) { @@ -66,6 +67,7 @@ class SchemaRegistry( if (apiKey != null && apiSecret != null) { install(Auth) { basic { + sendWithoutRequest { true } credentials { BasicAuthCredentials(username = apiKey, password = apiSecret) } @@ -93,6 +95,9 @@ class SchemaRegistry( try { httpClient.request> { url("subjects") + if (apiKey != null && apiSecret != null) { + basicAuth(apiKey, apiSecret) + } } } catch (ex: RestException) { logger.error( @@ -175,6 +180,7 @@ class SchemaRegistry( val record: SpecificRecord = AvroTopic.parseSpecificRecord(topicValueSchema) record.javaClass to record.schema } + defaultTopic != null -> defaultTopic.valueClass to defaultTopic.valueSchema else -> { logger.warn( diff --git a/specifications/passive/ticwatch-1.0.0.yml b/specifications/passive/ticwatch-1.0.0.yml new file mode 100644 index 00000000..036bc1af --- /dev/null +++ b/specifications/passive/ticwatch-1.0.0.yml @@ -0,0 +1,47 @@ +#====================================== TicWatch device =====================================# +vendor: Mobobi +model: TicWatch +version: 1.0.0 +app_provider: .ticwatch.TicwatchSeviceProvier +data: + - type: ACCELEROMETER + sample_rate: + dynamic: true + unit: G + processing_state: RAW + topic: android_esl_ticwatch_acceleration + value_schema: .passive.ticwatch.TicwatchAcceleration + - type: GYROSCOPE + sample_rate: + dynamic: true + unit: RADAIAN_PER_SEC + processing_state: RAW + topic: android_esl_ticwatch_gyroscope + value_schema: .passive.ticwatch.TicwatchGyroscope + - type: BATTERY + sample_rate: + dynamic: true + unit: PERCENTAGE + processing_state: RAW + topic: android_esl_ticwatch_battery_level + value_schema: .passive.ticwatch.TicwatchBatteryLevel + - type: PPG + sample_rate: + dynamic: true + unit: UNKNOWN + processing_state: RAW + topic: android_esl_ticwatch_ppg + value_schema: .passive.ticwatch.TicwatchPpg + - type: EXTERNAL_TIME + doc: Information sent by the Mobovi Ticwatch about time synchronisation with a NTP server. + sample_rate: + dynamic: true + unit: SECOND + topic: application_external_time + value_schema: .monitor.application.ApplicationExternalTime + - type: DEVICE_INFO + doc: Device information where the app is installed. + sample_rate: + dynamic: true + topic: application_device_info + value_schema: .monitor.application.ApplicationDeviceInfo