blob: fc30ec89bd3cdfdd1f963edac765b6b14484179b [file] [log] [blame] [edit]
// Copyright 2025 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.
#include "src/graphics/display/lib/api-protocols/cpp/backlight-fidl-adapter.h"
#include <fidl/fuchsia.hardware.backlight/cpp/wire.h>
#include <lib/zx/result.h>
#include <zircon/assert.h>
#include "src/graphics/display/lib/api-types/cpp/backlight-state.h"
namespace display {
BacklightFidlAdapter::BacklightFidlAdapter(BacklightInterface* backlight) : backlight_(*backlight) {
ZX_DEBUG_ASSERT(backlight != nullptr);
}
BacklightFidlAdapter::~BacklightFidlAdapter() = default;
fidl::ProtocolHandler<fuchsia_hardware_backlight::Device> BacklightFidlAdapter::CreateHandler(
async_dispatcher_t& dispatcher) {
return bindings_.CreateHandler(this, &dispatcher, fidl::kIgnoreBindingClosure);
}
void BacklightFidlAdapter::GetStateNormalized(GetStateNormalizedCompleter::Sync& completer) {
const zx::result<BacklightState> state_result = backlight_.GetBacklightState();
if (state_result.is_error()) {
completer.ReplyError(state_result.error_value());
return;
}
completer.ReplySuccess(state_result->ToFidl(/*use_absolute_brightness=*/false));
}
void BacklightFidlAdapter::SetStateNormalized(
fuchsia_hardware_backlight::wire::DeviceSetStateNormalizedRequest* request,
SetStateNormalizedCompleter::Sync& completer) {
ZX_DEBUG_ASSERT(request != nullptr);
if (!BacklightState::IsValid(request->state, /*use_absolute_brightness=*/false)) {
completer.Close(ZX_ERR_INVALID_ARGS);
return;
}
const zx::result<> set_state_result = backlight_.SetBacklightState(
BacklightState::From(request->state, /*use_absolute_brightness=*/false));
completer.Reply(set_state_result);
}
void BacklightFidlAdapter::GetStateAbsolute(GetStateAbsoluteCompleter::Sync& completer) {
const zx::result<BacklightState> state_result = backlight_.GetBacklightState();
if (state_result.is_error()) {
completer.ReplyError(state_result.error_value());
return;
}
if (!state_result->brightness_nits().has_value()) {
completer.ReplyError(ZX_ERR_NOT_SUPPORTED);
return;
}
completer.ReplySuccess(state_result->ToFidl(/*use_absolute_brightness=*/true));
}
void BacklightFidlAdapter::SetStateAbsolute(
fuchsia_hardware_backlight::wire::DeviceSetStateAbsoluteRequest* request,
SetStateAbsoluteCompleter::Sync& completer) {
ZX_DEBUG_ASSERT(request != nullptr);
if (!BacklightState::IsValid(request->state, /*use_absolute_brightness=*/true)) {
completer.Close(ZX_ERR_INVALID_ARGS);
return;
}
const zx::result<> set_state_result = backlight_.SetBacklightState(
BacklightState::From(request->state, /*use_absolute_brightness=*/true));
completer.Reply(set_state_result);
}
void BacklightFidlAdapter::GetMaxAbsoluteBrightness(
GetMaxAbsoluteBrightnessCompleter::Sync& completer) {
const zx::result<float> nits_result = backlight_.GetMaxBrightnessNits();
if (nits_result.is_error()) {
completer.ReplyError(nits_result.error_value());
return;
}
completer.ReplySuccess(nits_result.value());
}
} // namespace display