1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define LOG_TAG "SensorClient"
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/sensor_client.h>
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
44fe60582f314e381098f8f3bc2e39c5880e9243aAlex Vakulenko#include <log/log.h>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <poll.h>
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <pdx/default_transport/client_channel_factory.h>
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <private/dvr/sensor-ipc.h>
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing android::pdx::Transaction;
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace dvr {
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoSensorClient::SensorClient(int sensor_type)
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    : BASE(pdx::default_transport::ClientChannelFactory::Create(
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko          DVR_SENSOR_SERVICE_CLIENT)),
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      sensor_type_(sensor_type) {}
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex VakulenkoSensorClient::~SensorClient() {}
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint SensorClient::StartSensor() {
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Transaction trans{*this};
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto status = trans.Send<int>(DVR_SENSOR_START, &sensor_type_,
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                                sizeof(sensor_type_), nullptr, 0);
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGE_IF(!status, "startSensor() failed because: %s\n",
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           status.GetErrorMessage().c_str());
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return ReturnStatusOrError(status);
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint SensorClient::StopSensor() {
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Transaction trans{*this};
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto status = trans.Send<int>(DVR_SENSOR_STOP);
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGE_IF(!status, "stopSensor() failed because: %s\n",
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           status.GetErrorMessage().c_str());
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return ReturnStatusOrError(status);
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoint SensorClient::Poll(sensors_event_t* events, int max_events) {
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  int num_events = 0;
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  struct iovec rvec[] = {
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {.iov_base = &num_events, .iov_len = sizeof(int)},
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      {.iov_base = events, .iov_len = max_events * sizeof(sensors_event_t)},
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  };
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  Transaction trans{*this};
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  auto status = trans.SendVector<int>(DVR_SENSOR_POLL, nullptr, rvec);
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  ALOGE_IF(!status, "Sensor poll() failed because: %s\n",
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko           status.GetErrorMessage().c_str());
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return !status ? -status.error() : num_events;
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace dvr
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Entrypoints to simplify using the library when programmatically dynamicly
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// loading it.
57e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Allows us to call this library without linking it, as, for instance,
58e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// when compiling GVR in Google3.
59e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// NOTE(segal): It's kind of a hack.
60e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
61e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" uint64_t dvrStartSensor(int type) {
62e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  android::dvr::SensorClient* service =
63e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      android::dvr::SensorClient::Create(type).release();
64e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  service->StartSensor();
65e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return (uint64_t)service;
66e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
67e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
68e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" void dvrStopSensor(uint64_t service) {
69e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  android::dvr::SensorClient* iss =
70e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      reinterpret_cast<android::dvr::SensorClient*>(service);
71e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  iss->StopSensor();
72e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  delete iss;
73e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
74e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
75e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkoextern "C" int dvrPollSensor(uint64_t service, int max_count,
76e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                             sensors_event_t* events) {
77e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  return reinterpret_cast<android::dvr::SensorClient*>(service)->Poll(
78e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko      events, max_count);
79e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}
80