blob: b92d36ce7993f0bf3c06b888f2728df221ccd0be [file] [log] [blame]
// Copyright 2022 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "iioservice/daemon/iio_sensor.h"
#include <memory>
#include <utility>
#include <base/bind.h>
#include <base/check.h>
#include <libmems/iio_channel_impl.h>
#include <libmems/iio_context_impl.h>
#include <libmems/iio_device_impl.h>
#include "iioservice/include/common.h"
namespace iioservice {
// static
void IioSensor::IioSensorDeleter(IioSensor* server) {
if (server == nullptr)
return;
if (!server->ipc_task_runner_->RunsTasksInCurrentSequence()) {
server->ipc_task_runner_->PostTask(
FROM_HERE, base::BindOnce(&IioSensor::IioSensorDeleter, server));
return;
}
delete server;
}
// static
IioSensor::ScopedIioSensor IioSensor::Create(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<
chromeos::mojo_service_manager::mojom::ServiceProvider> receiver) {
DCHECK(ipc_task_runner->RunsTasksInCurrentSequence());
ScopedIioSensor server(
new IioSensor(std::move(ipc_task_runner), std::move(receiver)),
IioSensorDeleter);
server->SetSensorService();
return server;
}
void IioSensor::Request(
chromeos::mojo_service_manager::mojom::ProcessIdentityPtr identity,
mojo::ScopedMessagePipeHandle receiver) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(sensor_service_);
LOGF(INFO) << "Received SensorService from Mojo Service Manager";
sensor_service_->AddReceiver(
mojo::PendingReceiver<cros::mojom::SensorService>(std::move(receiver)));
}
void IioSensor::OnDeviceAdded(int iio_device_id) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(sensor_service_);
LOGF(INFO) << "iio device id: " << iio_device_id;
sensor_service_->OnDeviceAdded(iio_device_id);
}
void IioSensor::OnDeviceRemoved(int iio_device_id) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
DCHECK(sensor_service_);
LOGF(INFO) << "iio device id: " << iio_device_id;
sensor_service_->OnDeviceRemoved(iio_device_id);
}
IioSensor::IioSensor(
scoped_refptr<base::SequencedTaskRunner> ipc_task_runner,
mojo::PendingReceiver<
chromeos::mojo_service_manager::mojom::ServiceProvider> receiver)
: ipc_task_runner_(std::move(ipc_task_runner)),
receiver_(this, std::move(receiver)) {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
// Ignore |receiver_|'s disconnect handler, as ServiceManager mojo pipe should
// also disconnect when ServiceProvider does.
}
void IioSensor::SetSensorService() {
DCHECK(ipc_task_runner_->RunsTasksInCurrentSequence());
sensor_service_ = SensorServiceImpl::Create(
ipc_task_runner_, std::make_unique<libmems::IioContextImpl>());
}
} // namespace iioservice