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