syntax = "proto3"; package maestro_pw; import "google/protobuf/empty.proto"; /* -- Maestro Service --------------------------------------------------------------------------- */ message SoftwareInfo { int32 unknown2 = 2; FirmwareInfo firmware = 4; fixed64 unknown5 = 5; bool unknown6 = 6; } message FirmwareInfo { // Note: order might not be correct FirmwareVersion case = 1; FirmwareVersion right = 2; FirmwareVersion left = 3; } message FirmwareVersion { string unknown = 1; string version_string = 2; } message HardwareInfo { int32 unknown1 = 1; int32 unknown2 = 2; int32 unknown5 = 5; int32 unknown6 = 6; SerialNumbers serial_number = 7; } message SerialNumbers { string case = 1; string right = 2; string left = 3; } message RuntimeInfo { int64 timestamp_ms = 2; // maybe unix time in ms (consistent ~60s difference to actual time) int32 unknown3 = 3; BatteryInfo battery_info = 6; PlacementInfo placement = 7; } message BatteryInfo { DeviceBatteryInfo case = 1; DeviceBatteryInfo left = 2; DeviceBatteryInfo right = 3; } message DeviceBatteryInfo { int32 level = 1; // battery level in percent BatteryState state = 2; } enum BatteryState { BATTERY_STATE_UNKNOWN = 0; BATTERY_NOT_CHARGING = 1; BATTERY_CHARGING = 2; } message PlacementInfo { bool right_bud_in_case = 1; bool left_bud_in_case = 2; } message WallClockMsg { // TODO } message ReadSettingMsg { oneof value_oneof { AllegroSettingType settings_id = 4; } } enum AllegroSettingType { ALLEGRO_SETTING_TYPE_UNKNOWN = 0; ALLEGRO_AUTO_OTA_ENABLE = 1; ALLEGRO_OHD_ENABLE = 2; ALLEGRO_OOBE_IS_FINISHED = 3; ALLEGRO_GESTURE_ENABLE = 4; ALLEGRO_DIAGNOSTICS_ENABLE = 5; ALLEGRO_OOBE_MODE = 6; ALLEGRO_GESTURE_CONTROL = 7; ALLEGRO_ANC_ACCESSIBILITY_MODE = 8; ALLEGRO_ANCR_STATE_ONE_BUD = 9; ALLEGRO_ANCR_STATE_TWO_BUDS = 10; ALLEGRO_MULTIPOINT_ENABLE = 11; ALLEGRO_ANCR_GESTURE_LOOP = 12; ALLEGRO_CURRENT_ANCR_STATE = 13; ALLEGRO_OTTS_MODE = 14; ALLEGRO_VOLUME_EQ_ENABLE = 15; ALLEGRO_CURRENT_USER_EQ = 16; ALLEGRO_VOLUME_ASYMMETRY = 17; ALLEGRO_LAST_SAVED_USER_EQ = 18; } message WriteSettingMsg { oneof value_oneof { SettingValue setting = 4; } } message SettingsRsp { oneof value_oneof { SettingValue value = 4; } } message SettingValue { oneof value_oneof { bool auto_ota_enable = 1; bool ohd_enable = 2; // on-head detection bool oobe_is_finished = 3; // out-of-box experience? bool gesture_enable = 4; bool diagnostics_enable = 5; bool oobe_mode = 6; GestureControl gesture_control = 7; // reading anc_accessibility_mode returns non-zero status (code: 2) // reading ancr_state_one_bud returns non-zero status (code: 2) // reading ancr_state_two_buds returns non-zero status (code: 2) bool multipoint_enable = 11; AncrGestureLoop ancr_gesture_loop = 12; AncState current_ancr_state = 13; int32 otts_mode = 14; // might be bool bool volume_eq_enable = 15; EqBands current_user_eq = 16; int32 volume_asymmetry = 17; // value goes from 0 t0 200 (incl.), even/odd indicates left/right // reading last_saved_user_eq returns non-zero status (code: 2) bool sum_to_mono = 19; // id 20 does not seem to exist (yet?) bool volume_exposure_notifications = 21; bool speech_detection = 22; } } message GestureControl { DeviceGestureControl left = 1; DeviceGestureControl right = 2; } message DeviceGestureControl { oneof value_oneof { GestureControlType type = 4; } } message GestureControlType { RegularActionTarget value = 1; } enum RegularActionTarget { ACTION_TARGET_UNKNOWN = 0; ACTION_TARGET_CHECK_NOTIFICATIONS = 1; ACTION_TARGET_PREVIOUS_TRACK_REPEAT = 2; ACTION_TARGET_NEXT_TRACK = 3; ACTION_TARGET_PLAY_PAUSE_TRACK = 4; ACTION_TARGET_ANC_CONTROL = 5; ACTION_TARGET_ASSISTANT_QUERY = 6; } message AncrGestureLoop { bool active = 1; bool off = 2; bool aware = 3; bool adaptive = 4; } enum AncState { ANC_STATE_UNKNOWN = 0; ANC_STATE_OFF = 1; ANC_STATE_ACTIVE = 2; ANC_STATE_AWARE = 3; ANC_STATE_ADAPTIVE = 4; } message EqBands { // bands go from -6.0 to 6.0 float low_bass = 1; float bass = 2; float mid = 3; float treble = 4; float upper_treble = 5; } message OobeActionRsp { OobeAction action = 1; } enum OobeAction { OOBE_ACTION_UNKNOWN = 0; OOBE_ACTION_SINGLE_TAP = 1; OOBE_ACTION_DOUBLE_TAP = 2; OOBE_ACTION_TRIPLE_TAP = 3; OOBE_ACTION_HOLD = 4; OOBE_ACTION_SWIPE_FORWARD = 5; OOBE_ACTION_SWIPE_BACKWARD = 6; OOBE_ACTION_SWIPE_UP = 7; OOBE_ACTION_SWIPE_DOWN = 8; OOBE_ACTION_HOTWORD = 9; OOBE_ACTION_LEFT_ON_HEAD = 10; OOBE_ACTION_LEFT_OFF_HEAD = 11; OOBE_ACTION_RIGHT_ON_HEAD = 12; OOBE_ACTION_RIGHT_OFF_HEAD = 13; OOBE_ACTION_SPECULATIVE_TAP = 14; OOBE_ACTION_HOLD_END = 15; OOBE_ACTION_HOLD_CANCEL = 16; } service Maestro { rpc GetSoftwareInfo(google.protobuf.Empty) returns (SoftwareInfo) {} rpc GetHardwareInfo(google.protobuf.Empty) returns (HardwareInfo) {} rpc SubscribeRuntimeInfo(google.protobuf.Empty) returns (stream RuntimeInfo) {} rpc SetWallClock(WallClockMsg) returns (google.protobuf.Empty) {} rpc WriteSetting(WriteSettingMsg) returns (google.protobuf.Empty) {} rpc ReadSetting(ReadSettingMsg) returns (SettingsRsp) {} rpc SubscribeToSettingsChanges(google.protobuf.Empty) returns (stream SettingsRsp) {} rpc SubscribeToOobeActions(google.protobuf.Empty) returns (stream OobeActionRsp) {} } /* -- Multipoint Service ------------------------------------------------------------------------ */ message QuietModeStatusEvent { int32 source = 1; } message ForceMultipointSwitchMsg { // TODO } service Multipoint { rpc SubscribeToQuietModeStatus(google.protobuf.Empty) returns (stream QuietModeStatusEvent) {} rpc ForceMultipointSwitch(ForceMultipointSwitchMsg) returns (google.protobuf.Empty) {} } /* -- EartipFitTest Service --------------------------------------------------------------------- */ message StartEartipFitTestMsg { // TODO } message EndEartipFitTestMsg { // TODO } message SubscribeToEartipFitTestResultsMsg { // TODO } message EartipFitTestResult { // TODO } service EartipFitTest { rpc StartTest(StartEartipFitTestMsg) returns (google.protobuf.Empty) {} rpc EndTest(StartEartipFitTestMsg) returns (google.protobuf.Empty) {} rpc SubscribeToResults(SubscribeToEartipFitTestResultsMsg) returns (stream EartipFitTestResult) {} } /* -- JitterBuffer Service ---------------------------------------------------------------------- */ message SetJitterBufferSizePreferenceMsg { // TODO } service JitterBuffer { rpc SetJitterBufferSizePreference(SetJitterBufferSizePreferenceMsg) returns (google.protobuf.Empty) {} } /* -- Dosimeter Service ------------------------------------------------------------------------- */ message DosimeterSummaryEntry { int32 unknown1 = 1; float unknown6 = 6; } message DosimeterSummary { int32 unknown1 = 1; repeated DosimeterSummaryEntry unknown2 = 2; int32 unknown4 = 4; float unknown5 = 5; } message DosimeterLiveDbMsg { float intensity = 2; // convert to dB via log10(x) * 10 } service Dosimeter { rpc FetchDailySummaries(google.protobuf.Empty) returns (DosimeterSummary) {} rpc SubscribeToLiveDb(google.protobuf.Empty) returns (DosimeterLiveDbMsg) {} }