// Copyright 2019 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

library fuchsia.hwinfo;
using fuchsia.intl;

const uint8 MAX_VALUE_SIZE = 255;

/// Collection of properties that is unique per device.
table DeviceInfo {
    1: string:MAX_VALUE_SIZE serial_number;
    2: bool is_retail_demo;
    3: string:MAX_VALUE_SIZE retail_sku;
};

/// Collection of properties that is shared with other devices within the same
/// product line.
table ProductInfo {
    1: string sku;
    2: string language;
    3: fuchsia.intl.RegulatoryDomain regulatory_domain;
    4: vector<fuchsia.intl.LocaleId> locale_list;
    5: string name;
    6: string model;
    7: string manufacturer;
    8: string build_date;
    9: string:MAX_VALUE_SIZE build_name;
    10: string:MAX_VALUE_SIZE colorway;
    11: string:MAX_VALUE_SIZE display;
    12: string:MAX_VALUE_SIZE memory;
    13: string:MAX_VALUE_SIZE nand_storage;
    14: string:MAX_VALUE_SIZE emmc_storage;
    15: string:MAX_VALUE_SIZE microphone;
    16: string:MAX_VALUE_SIZE audio_amplifier;
};

/// Collection of properties that are common among a set of devices based on
/// hardware type
table BoardInfo {
    1: string name;
    2: string revision;
};

/// Device provides an interface to retrieve device-specific properties.
[Discoverable]
protocol Device {
    GetInfo() -> (DeviceInfo info);
};

/// Product provides an interface to retrieve product-specific properties.
[Discoverable]
protocol Product {
    GetInfo() -> (ProductInfo info);
};

/// Board provides an interface to retrieve hardware-specific information.
[Discoverable]
protocol Board {
    GetInfo() -> (BoardInfo info);
};
