// Copyright 2018 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.
@available(added=15)
library fuchsia.hardware.rtc;

using zx;

type Time = struct {
    seconds uint8;
    minutes uint8;
    hours uint8;
    day uint8;
    month uint8;
    year uint16;
};

@discoverable
open protocol Device {
    /// Get the current RTC time.
    /// If the driver detects that it does not have a valid time to report, then it will return an
    /// `ZX_ERR_INTERNAL` error.
    flexible Get() -> (struct {
        rtc Time;
    }) error zx.Status;

    /// Set the RTC time.
    /// If the RTC time is not valid, the driver will return an `ZX_ERR_OUT_OF_RANGE` error.
    flexible Set(struct {
        rtc Time;
    }) -> (struct {
        status zx.Status;
    });
};

service Service {
    device client_end:Device;
};
