Kullanıcı tercihleri mimarisi ve uygulama kılavuzu

Bu sayfada, SDV Kullanıcı Tercihleri sisteminin mimarisi hakkında bir kılavuz ve kullanıcı tarafından kontrol edilebilen bir hizmet ile istemci uygulama talimatları yer almaktadır.

Mimariye genel bakış

Kullanıcı Tercihleri sistemi, kullanıcı ayarlarının depolanmasını ve yönetilmesini bu ayarların uygulanmasından ve zorunlu kılınmasından ayırır. Temel mimari terimler tabloda özetlenmiştir:

ÖzellikAçıklamaRolSorumluluk
Kullanıcı tarafından kontrol edilebilen hizmet Belirli bir alanı (ör. HVAC, araba koltukları, ses) yöneten standart bir SDV hizmet paketi Kontrol ettiği donanımın veya alt sistemin özelliklerinin ve kısıtlamalarının amaçlanan durumunu sağlar.
  • Kayıt: Kullanıcı tercihleri aracısını, desteklediği ayarlar (meta veriler, varsayılanlar, kısıtlamalar) hakkında bilgilendirir.
  • Uygulama ve özerklik: Ayarları değiştirme isteklerini alır, mevcut durum ve güvenlik kurallarına göre doğrular ve donanıma uygular. Tam özerkliği korur ve bir ayar değişikliğinin kabul edilip edilmediğini belirtir.
Kullanıcı tercihleri aracısı Merkezi düzenleyici Merkezi depolama, kullanıcı profili yönetimi ve bildirim merkezi sağlar.
  • Depolama: Ayarlar kullanıcı başına (ör. sürücü, yolcu) kalıcı olarak saklanır.
  • Yönlendirme: Proxy'ler, istemcilerden (ör. insan makine arayüzü (HMI)) gelen istekleri uygun kullanıcı tarafından kontrol edilebilir hizmete yönlendirir.
  • Bildirimler: ChangeNotifier arayüzünü kullanarak ilgilenen taraflara (görünümler veya HMI'ler) yayın değişikliklerini bildirir.
  • Kullanıcı yönetimi: Kullanıcı geçişini yönetir ve tüm kayıtlı hizmetlere doğru kalıcı durumu uygular.
Kullanıcı tercihleri istemcisi Kullanıcı arayüzü sağlayan bir uygulama veya hizmet (ör. kullanıcı tercihlerine göre etkileşimde bulunması gereken bir HMI veya başka bir mantık içeren bir IVI uygulaması) Kullanıcılarla etkileşim kurar, ayarları gösterir ve değişiklik isteklerini başlatır.
  • Görüntüleme: Mevcut ayarları ve kısıtlamaları kullanıcıya gösterir.
  • Değişiklik iste: Kullanıcı tarafından başlatılan ayar değişikliklerini kullanıcı tercihleri aracısına gönderir.
  • Bildirim alma: Ayarların anlık güncellemelerine abone olur ve bunlara tepki verir.

Kullanıcı tarafından kontrol edilebilen bir hizmet uygulama

Kullanıcı Tercihleri aracısına hangi anahtarların mevcut olduğunu, veri türlerini, varsayılan değerlerini ve kısıtlamalarını (ör. minimum ve maksimum değerler) bildirmek için hizmet paketinizi UserPreferencesRegistryService arayüzüyle etkileşime geçirmelisiniz. Hizmetiniz başladığında, kullanıma sunduğu ayarları kaydetmesi gerekir. Kullanıcı bir ayarı değiştirmeye çalıştığında (veya kullanıcılar arasında geçiş yaparken) hizmetinizde RequestSettingsChange işlevi çağrılır.

Kullanıcı Tercihleri'nin (ve HMI'ye sahip bir kullanıcının) hizmetinizi kontrol etmesine izin vermek için bu bölümdeki adımları uygulayın.

  1. VSIDL dosyasında hizmet arayüzlerini tanımlayın:

    • Sunucu olarak com.sdv.google.user_preferences.user_controllable.UserControllableService'yı uygulayın. Bu ayar, temsilcinin size değişiklik istekleri göndermesine olanak tanır.
    • Müşteri olarak com.sdv.google.user_preferences.UserPreferencesRegistryService kullanın. Bu işlem, başlatma sırasında ayarlarınızı kaydeder.

    Aşağıdaki örnekte, kullanıcı tarafından kontrol edilebilen bir hizmet için service_bundle.vsidl gösterilmektedir:

    service_bundle {
        name: "MyFeatureService"
        server {
            service: "com.sdv.google.user_preferences.user_controllable.UserControllableService"
        }
        client {
            service: "com.sdv.google.user_preferences.UserPreferencesRegistryService"
        }
    }
    
  2. Başlangıçta anahtar proto'daki kayıt ayarları user_preferences_registry_service.proto:

    1. UserPreferencesRegistryService ağına bağlanın.
    2. RegisterSettingsRequest örneği oluşturun.
    3. SettingsGroup örneğini (ayarların mantıksal koleksiyonu) tanımlayın.
    4. Her ayar için şunları tanımlayın:

      *   **Key:** Unique string ID (for example, `TEMPERATURE`)
      *   **Kind:** `PER_USER` (stored per user profile) or `SHARED`
          (global)
      *   **Default value:** Initial value if no user preference exists
      *   **Constraints:** (optional) Validation rules (for example, Min
          16, Max 32 for HVAC).
      
    5. Şu numaraya telefon et: RegisterSettings().

    Aşağıdaki örnek, kavramsal Rust dilindedir:

    let temperature_setting = SettingDefinition {
        name: "TEMPERATURE".to_string(),
        kind: SettingKind::PER_USER.into(),
        default_value: Value::Int64(22), // Default 22 degrees
        constraint: Some(Constraints::Int64Constraints(Int64Constraints {
            min_value: Some(16),
            max_value: Some(32),
            ..Default::default()
        })),
        ..Default::default()
    };
    
    registry_client.RegisterSettings(&RegisterSettingsRequest {
        group_name: "HVAC".to_string(),
        version: "1.0".to_string(),
        settings_definitions: vec![temperature_setting],
    }).await?;
    
  3. user_controllable_service.proto içinde ayar değiştirme isteklerini işleme:

    1. RequestSettingsChange RPC'sini uygulayın.
    2. İstenen değerlerin geçerli bağlamda (ör. donanım hazırsa) geçerli olup olmadığını doğrulayın.
    3. Değişikliği uygulamak için belirli bir mantık uygulayın (örneğin, koltuğu hareket ettirin, fan hızını değiştirin).
    4. RequestSettingsChangeResponse içinde uygulanan değerleri döndürür:
    5. Değişikliği kabul ettiyseniz yeni değeri döndürün.
    6. Değeri reddettiyseniz veya sınırladıysanız ayarladığınız (veya sakladığınız) değeri döndürün.

    Aşağıdaki örnek, kavramsal Rust dilindedir:

    async fn RequestSettingsChange(
        &self,
        _caller_id: ServiceFqin,
        request: &RequestSettingsChangeRequest
    ) -> SdvResult<RequestSettingsChangeResponse> {
        let mut applied_settings = Vec::new();
    
        for setting in &request.settings {
            if self.hardware.set_value(setting.key, setting.value).is_ok() {
                // Change accepted
                applied_settings.push(setting.clone());
            } else {
                // Change rejected, return current actual value
                let current_val = self.hardware.get_value(setting.key);
                applied_settings.push(create_setting(setting.key, current_val));
            }
        }
    
        Ok(RequestSettingsChangeResponse {
            settings: applied_settings,
        })
    }
    
  4. Alt sisteminizi temiz bir duruma geri döndürmek için FactoryReset RPC'yi uygulayın:

    1. Tüm ayarları varsayılan değerlerine (kod yapılandırmanızda tanımlandığı şekilde) sıfırlayın.
    2. Değerlerin harici olarak (sıfırlama yoluyla, kullanıcı isteğiyle değil) değiştirildiğini aracıya bildirmek için kayıt hizmetinde UpdateSettings işlevini çağırın.

Geriye dönük uyumluluk ve şema gelişimi

Kullanıcı tarafından kontrol edilebilen bir hizmet tarafından tanımlanan ayarların şeması, herkese açık arayüz olarak kabul edilir. Bu arayüz, kullanıcı tercihleri aracısı ve farklı yayın planlarına sahip olabilecek çeşitli istemciler (ör. HMI'ler) tarafından kullanılır. Bu nedenle, sistem kararsızlığını ve istemci bozulmasını önlemek için sıkı bir geriye dönük uyumluluk sağlamak önemlidir.

Uyumlu değişiklikler

Kullanıcı tarafından kontrol edilebilen bir hizmet, ayar şemasına yalnızca uyumlu değişiklikler getirmelidir. Bu değişiklikler, eski istemcilerin güncellemeler olmadan doğru şekilde çalışmaya devam etmesini sağlar:

  • Makul bir varsayılan değere sahip yeni ve isteğe bağlı bir ayar ekleyin:

    • Bu ayar isteğe bağlıdır. Bu nedenle, istemcilerin hizmetin farklı sürümlerini desteklemek için bu ayarın varlığını kontrol etmesi gerekir.
    • Güncellenerek bu ayarı tanımayan istemciler ayarı yoksayar.
    • Yeni ayarla ilgili kullanıcı tercihi yoksa aracı, sağlanan varsayılan değeri kullanır.

Uyumsuz değişiklikler

Aşağıdaki değişiklikler, eski istemcileri hemen etkilediği için uyumluluğu bozan değişiklikler olarak kabul edilir ve yasaktır:

  • Mevcut bir ayarı kaldırma

  • Mevcut bir ayarın anlamını, birimini veya veri türünü değiştirme (örneğin, santigrat cinsinden sıcaklığı temsil eden bir tam sayıdan Pascal cinsinden basıncı temsil eden bir kayan sayıya geçme).

  • Mevcut bir ayarın varsayılan değerini değiştirin. Varsayılan değer değişikliklerinin yasaklanmasının temel nedeni, kalıcı veri taşıma işleminde yaşanabilecek olası sorunlardır. Ajan, hizmetin kayıt şemasına göre ayarları depolar. Varsayılan bir değeri değiştirmek, mevcut tüm kullanıcı profillerini yeni varsayılana taşımak için karmaşık bir mantık gerektirir. Aksi takdirde, tercihi açıkça ayarlamayan kullanıcılar için teknik olarak yanlış bir değer kullanma riski ortaya çıkar.

Zarar veren gerekli değişiklikleri işleme

Kullanıcıları etkileyen bir değişiklik yapılması gerekiyorsa hizmet, mevcut ayarı değiştirmemelidir. Bu geçişi uyumluluğu koruyarak yönetme yaklaşımı, öncelikle kullanıcı tarafından kontrol edilebilen hizmet mantığında yer alır:

  1. İstediğiniz yeni tanım, anahtar veya birimle yeni bir ayar oluşturun.
  2. Uyumluluk için kaydederek mevcut ayarın desteğini sonlandırın. Yeni müşteriler geliştirirken bu yeni ayarı kullanın.
  3. Yeni müşterilere, kullanıcı tarafından kontrol edilebilen hizmetin iş mantığı içinde uyumluluk mantığı uygulamalarını tavsiye edin.

Hizmetin RequestSettingsChange uygulaması, bir ayarda yapılan değişikliğin, desteği sonlandırılan karşılığında ve karşılığında yapılan değişikliğin ayarda yansıtılmasını sağlamalıdır.

Örnek uyumluluk mantığı:

  1. Bir hizmet, eski ayar TEMPERATURE_C (Celsius) desteğini sonlandırıp TEMPERATURE_K (Kelvin) ayarını kullanıma sunuyor.

  2. Aracı, yeni ayarı güncelleme isteği gönderdiğinde:

    • Hizmet, TEMPERATURE_K için bir istek alır (örneğin, 295,15 K).

    • Hizmetin mantığı, bunu santigrat dereceye (22 °C) dönüştürür ve eski istemcilerde tutarlılığı korumak için her iki değeri de dahili olarak güncelleyip kalıcı hale getirir.

  3. Temsilci, eski bir istemciden kullanımdan kaldırılan ayar için istek gönderdiğinde:

    • Hizmet, TEMPERATURE_C için bir istek alır (örneğin, 24 °C).
    • Hizmet, bu değeri Kelvin'e (297,15 K) dönüştürür ve her iki değeri de dahili olarak güncelleyip kalıcı hale getirir.

Bu çift yazma stratejisi, yayın takvimlerinden bağımsız olarak tüm istemcilerin tutarlı ve doğru veriler okumasını sağlar. Böylece, harici yayın uyuşmazlıklarından kaynaklanan bozulmalar önlenir.

İstemci uygulama

UserPreferences temsilcisiyle etkileşim kuran bir istemci (ör. HMI) uygulamak için:

  1. Belirli kullanıcı tercihleri arayüzleriyle etkileşim kurmak için istemci hizmeti paketinizi tanımlayın. VSIDL dosyanızda:

    • Sunucu olarak, istemcinize ayar değişiklikleriyle ilgili gerçek zamanlı bildirimler göndermesi için com.sdv.google.user_preferences.view.ChangeNotifier uygulayın.
    • Müşteri olarak, com.sdv.google.user_preferences.UserPreferencesManagementService simgesini kullanarak ayar değişiklikleri isteyebilir ve güncellemeleri takip edebilirsiniz.
    • İstemci olarak, kullanıcı profillerini (ör. oluşturma, seçme, silme, fabrika ayarlarına sıfırlama) yönetmek için com.sdv.google.user_preferences.UserPreferencesAdminService simgesini kullanın.

    Aşağıdaki örnekte bir istemci için service_bundle.vsidl dosyası gösterilmektedir:

    service_bundle {
        name: "MyHmiClient"
        server {
            service: "com.sdv.google.user_preferences.view.ChangeNotifier"
        }
        client {
            service: "com.sdv.google.user_preferences.UserPreferencesManagementService"
        }
        client {
            service: "com.sdv.google.user_preferences.UserPreferencesAdminService"
        }
    }
    

    Yetkilendirme politikalarını buna göre ekleyin. Kullanıcı tercihi aracısının iletişim kurmasına izin vermek için belirtilen sunuculara yönelik bir istemci oluşturun. Örneğin:

    server {
        service: "com.sdv.google.user_preferences.view.ChangeNotifier"
        allow_all_channels: true
    }
    client {
        service: "com.sdv.google.user_preferences.UserPreferencesManagementService"
        allow_all_channels: true
    }
    client {
        service: "com.sdv.google.user_preferences.UserPreferencesAdminService"
        allow_all_channels: true
    }
    
  2. İstek ayarlarını UserPreferencesManagementService bölümünde değiştirebilirsiniz:

    1. UserPreferencesManagementService ağına bağlanın.
    2. RequestSettingsChangeRequest örneği oluşturun, SettingsGroupId ve istediğiniz ayarları belirtin.
    3. İsteğe bağlı. ChangePersistencePolicy değerini PERSISTENT_CHANGE (varsayılan) veya NON_PERSISTENT_CHANGE olarak ayarlayın.
    4. Şu numaraya telefon et: RequestSettingsChange().

    Aşağıdaki örnek, kavramsal Rust dilindedir:

    management_client.RequestSettingsChange(&RequestSettingsChangeRequest {
        settings_group_id: Some(SettingsGroupId {
            service_fqin: hvac_service_fqin.to_string(),
            name: "HVAC".to_string(),
            ..Default::default()
        }).into(),
        settings: vec![Setting {
            key: "TEMPERATURE".to_string(),
            value: Some(Value::Int64(24)),
            ..Default::default()
        }],
        change_persistence_policy: ChangePersistencePolicy::PERSISTENT_CHANGE.into(),
        ..Default::default()
    }).await?;
    
  3. user_preferences_management_service.proto ve change_notifier.proto ile ayar değişikliklerine abone olma:

    1. Hizmet paketinize ChangeNotifier arayüzünden OnSettingsChange TBG'sini uygulayın. Kullanıcı tercihleri aracısı, bir değişiklik olduğunda bu yöntemi çağırır.
    2. UserPreferencesManagementService ağına bağlanın.
    3. İzlemek istediğiniz SubscribeToSettingsChangeAndGetSettingsRequest belirten bir SettingsGroupId oluşturun.
    4. Ayarların durumunu geri döndürmek ve gelecekteki güncellemeleri OnSettingsChange uygulamanız üzerinden göndermek için SubscribeToSettingsChangeAndGetSettings() işlevini çağırın.

    ChangeNotifier arayüzünü uygulama ile ilgili aşağıdaki örnek, kavramsal Rust dilindedir:

    #[async_trait]
    impl ChangeNotifier for MyHmiServiceImpl {
        async fn OnSettingsChange(
            &self,
            _caller_id: ServiceFqin,
            request: &OnSettingsChangeRequest,
        ) -> SdvResult<OnSettingsChangeResponse> {
            // Process the active_settings, pending_changes, and persisted_settings
            // Update your UI or internal state accordingly.
            info!("Received settings change for group: {}", request.settings_group_id.name);
            // ...
            Ok(OnSettingsChangeResponse::new())
        }
    }
    

    Aşağıdaki abonelik örneği kavramsal Rust dilindedir:

    management_client.SubscribeToSettingsChangeAndGetSettings(&SubscribeToSettingsChangeAndGetSettingsRequest {
        settings_group_id: Some(SettingsGroupId {
            service_fqin: hvac_service_fqin.to_string(),
            name: "HVAC".to_string(),
            ..Default::default()
        }).into(),
        ..Default::default()
    }).await?;
    
  4. İsteğe bağlı: Kullanıcı profillerini yöneten istemciler (ör. özel bir ayarlar uygulaması), yönetici hizmetiyle etkileşim kurmak için user_preferences_admin_service.proto kullanabilir:

    1. UserPreferencesAdminService ağına bağlanın.
    2. Kullanıcı profillerini yönetmek için CreateUser, SelectUser, DeleteUser, FactoryReset ve ListUsers gibi RPC'leri kullanın.

    Aşağıdaki kullanıcı oluşturma örneği kavramsal Rust dilindedir:

    admin_service_client.CreateUser(&CreateUserRequest {
        user: Some(User {
            id: 1,
            flags: UserFlags::DRIVER.value(),
            ..Default::default()
        }).into(),
        ..Default::default()
    }).await?;
    
  5. user_preferences_admin_service.proto ile yönetici hizmeti üzerinden kullanılabilir ayarları ve kullanıcıları keşfedin:

    1. ListUsers() üzerinde UserPreferencesAdminService'yi çağırarak tüm kayıtlı kullanıcıların listesini alın.
    2. UserPreferencesAdminService üzerinde GetUserSettings(user_id) işlevini çağırarak belirli bir kullanıcının ayarlarını alın.

    Aşağıdaki kullanıcıları listeleme ve ayarları alma örneği kavramsal Rust dilindedir:

    // List all users
    let list_users_response = admin_service_client.ListUsers(&ListUsersRequest::new()).await?;
    info!("Available users: {:?}", list_users_response.users);
    
    // Get settings for a specific user (for example, user with ID 1)
    if let Some(user_id) = list_users_response.users.first().map(|u| u.id) {
        let get_settings_response = admin_service_client.GetUserSettings(&GetUserSettingsRequest {
            user_id,
            ..Default::default()
        }).await?;
        info!("Settings for user {}: {:?}", user_id, get_settings_response.groups);
    }
    

Akış özeti

  1. İstemci, aracının yönetim ve idari hizmetlerine bağlanır.
  2. İstemci, ayar gruplarını keşfedip bunlara abone olur ve ilk durumu gösterir.
  3. İstemci, aracıya bir RequestSettingsChange gönderir.
  4. Temsilci, güncellenmiş ayarlar ve durumla birlikte müşteriye bir OnSettingsChange bildirimi gönderir.

Çalışan tam bir örnek için HMIService bölümündeki @samples/user_preferences/v1/ konusuna bakın.

Aracıyı uygulama

Düzenleyici tarafından başlatılan bir hizmet paketi, kullanıcı tercihlerini uygulayan bir aracıdır. Kolaylık sağlamak için bir referans uygulaması sağlanır.

Ayrıca, aracı için bu örnek hizmet paketi user_preferences_sample.vsidl dosyası sağlanır:

package: "com.sdv.oem.user_preferences"

service_bundle {
    name: "UserPreferencesServiceBundle"
    server {
        service: "com.sdv.google.user_preferences.UserPreferencesAdminService"
    }
    server {
        service: "com.sdv.google.user_preferences.UserPreferencesManagementService"
    }
    server {
        service: "com.sdv.google.user_preferences.UserPreferencesRegistryService"
    }
    client {
        service: "com.sdv.google.user_preferences.view.ChangeNotifier"
    }
    client {
        service: "com.sdv.google.user_preferences.user_controllable.UserControllableService"
    }
}

Uygulama, oluşturulan ara yazılımı kullanabilir ve kullanıcı tercihleri aracını uygulayan hizmet paketi tarafından referans verilen bir rust_ffi_shared içinde derlenmelidir:

sdv_service_bundle_metadata {
  # This name must match the agent's Bundle Name
  name: "UserPreferencesServiceBundle"
  version_number: 1
  version_name: "1"

  native_library_path: "lib64/<USER-PREFERENCES-FFI-LIB>.so"

  orchestration_config_path: "etc/user_preferences_service_bundle/<USER-PREFERENCES-ORCHESTRATION>.textproto"

  authorization_policy_path: "etc/user_preferences_service_bundle/permissions.textproto"
}

İstemcinin yetkilendirme politikası .textproto dosyasında gerekli izinler olmalıdır:

client {
    service: "com.sdv.google.user_preferences.UserPreferencesManagementService"
    allow_all_channels: true
}

client {
    service: "com.sdv.google.user_preferences.UserPreferencesRegistryService"
    allow_all_channels: true
}

client {
    service: "com.sdv.google.user_preferences.UserPreferencesAdminService"
    allow_all_channels: true
}

Ek: Temel kavramlar

Bu bölümde bazı temel kavramlar açıklanmaktadır.

Kullanıcılar

Her araç kullanıcısı (User sınıfı), tercihlerini saklayabileceği bir hesap oluşturabilir. Kullanıcı tercihleri yalnızca araç sürücülerinin hesaplarını destekler. Misafir sürücüler, tek kullanımdan sonra otomatik olarak silinen geçici hesaplar oluşturabilir.

message User {
  // Required.
  // A unique ID for the user.
  int32 id = 1;

  // Bit flags that define properties of user. Integer values have to be powers of 2 as they are used as
  // a bit mask.
  enum UserFlags {
    // Due to Protobuff requirement to have the first enum option set to 0,
    // Assign 0 to an unused flag
    UNSET = 0x0;
    // Marks the user as vehicle driver
    DRIVER = 0x01;
    // Ephemeral users have non-persistent state, once another user is selected
    // the profile is deleted automatically
    EPHEMERAL = 0x02;
  }

  // Required.
  // Bitmask for the user flags defined above
  int32 flags = 2;
}

Ayarlar grupları

Ayar grupları (SettingsGroup sınıfı), ilgili ayarları düzenleyip yönetir. Araçtaki her yapılandırılabilir bileşen, ayarlarını anahtar/değer çiftleri olarak gösterilen bir ayar listesinden oluşan gruplar halinde tanımlar. Örneğin, elektrikli koltuklara sahip araçlar, sürücü koltuğu için bir ayar grubu, ön yolcu koltuğu için de başka bir ayar grubu tanımlayabilir. Her iki grup da aynı ada sahip ayarları içerir.

message SettingsGroup {
  // Required.
  // The identifier for this group.
  SettingsGroupId id = 1;

  // Required.
  // The version number of schema used by this setting group.
  string version = 2;

  // Required.
  // The list of settings within the setting group.
  repeated Setting settings = 3;
}

Ayarlar

Ayarı (Setting sınıfı), SettingsGroup içindeki tek bir ayarı temsil eder. Bu mesaj, ayarın adı olan bir anahtar ve birkaç türden biri olabilen bir değerden oluşur.

Bu örnekte, bir ayarın anahtar ve değerle nasıl temsil edildiği gösterilmektedir:

// A key value pair representing a setting within a UserControllableService SettingsGroup.
message Setting {
  // Required.
  // A name that uniquely identifies a setting within a SettingsGroup.
  string key = 1;

  // Required.
  // New value of the setting.
  oneof value {
    bool bool = 2;
    float float = 3;
    int32 int32 = 4;
    int64 int64 = 5;
    bytes blob = 6;
    int32 enum = 7;
  }
}

Ayar tanımları

Ayarlar tanımları (SettingDefinition sınıfı), bir ayar grubundaki tek tek ayarlar için şablon görevi görür. Bu özellikler, ayarın tüm kullanıcılarla paylaşılıp paylaşılmadığı, her kullanıcıya özel olup olmadığı veya harici olarak yönetilip yönetilmediği (geçiş) gibi ayarın temel özelliklerini belirtir.

Önemli olarak, ayar tanımları, ayarın değeriyle ilgili tüm kısıtlamaları da (ör. minimum ve maksimum değerler, izin verilen artışlar veya sınırlı bir seçenek grubu) tanımlar. Bu kısıtlamalar, her ayar için veri bütünlüğünü ve tutarlılığını sağlar.

// The definition of a setting, along with its properties such as type and constraints
message SettingDefinition {
  // Required.
  SettingKind kind = 1;

  // Required.
  SettingWithConstraints setting_with_constraints = 2;
}

enum SettingKind {
  // A setting which is applied for all vehicle users.
  SHARED = 0;
  // Store the value of the setting for each vehicle user separately.
  PER_USER = 1;
  // UserControllableService is fully responsible for the storage of PASSTHROUGH setting.
  // User Preferences only notifies UserControllableService when the value is explicitly set by
  // user. User Preferences does not attempt to request changes based on user change or service
  // registration.
  PASSTHROUGH = 2;
};

message SettingWithConstraints {
  // Required
  Setting setting = 1;

  // Required.
  // Defines restrictions on the setting's value
  oneof constraints {
    FloatConstraints float_constraints = 2;
    Int32Constraints int32_constraints = 3;
    Int64Constraints int64_constraints = 4;
    EnumConstraints enum_constraints = 5;
  }
}

message Int32Constraints {
  // The minimum value that a setting can have.
  optional int32 min_value = 1;
  // The maximum value that a setting can have.
  optional int32 max_value = 2;
  // The step by which a setting's value can be increased or decreased.
  optional int32 step = 3;
}

message Int64Constraints {
  // The minimum value that a setting can have.
  optional int64 min_value = 1;
  // The maximum value that a setting can have.
  optional int64 max_value = 2;
  // The step by which a setting's value can be increased or decreased.
  optional int64 step = 3;
}

message FloatConstraints {
  // The minimum value that a setting can have.
  optional float min_value = 1;
  // The maximum value that a setting can have.
  optional float max_value = 2;
  // The step by which a setting's value can be increased or decreased.
  optional float step = 3;
}

message EnumConstraints {
  // Required.
  // List of unique values sorted in ascending order.
  repeated int32 possible_values = 1;
}

Kullanıcı bir ayarı güncellediğinde gerçekleşen etkinliklerin örnek sırası

Bu örnekte, bir kullanıcı ayarı güncellemek için Android Automotive OS (AAOS) araç içi bilgi-eğlence (IVI) sistemini kullandığında gerçekleşen etkinliklerin sırası gösterilmektedir:

Kullanıcı ayarı değiştirdiğinde gerçekleşen etkinlikler

Şekil 1. Kullanıcı bir ayarı değiştirdiğinde gerçekleşen etkinlikler.

Bir araç çalıştırıldığında gerçekleşen etkinliklerin örnek sırası

Bu örnekte, SDV Kullanıcı Tercihleri'nin bir araç çalıştırılırken kullanıcının tercih ettiği ayarları nasıl uyguladığı gösterilmektedir:

Araç çalıştırılırkenki etkinlikler

Şekil 2. Bir araç çalıştırıldığında gerçekleşen etkinlikler.