#define LOG_TAG "SensorClient" #include <private/dvr/sensor_client.h> #include <log/log.h> #include <poll.h> #include <pdx/default_transport/client_channel_factory.h> #include <private/dvr/sensor-ipc.h> using android::pdx::Transaction; namespace android { namespace dvr { SensorClient::SensorClient(int sensor_type) : BASE(pdx::default_transport::ClientChannelFactory::Create( DVR_SENSOR_SERVICE_CLIENT)), sensor_type_(sensor_type) {} SensorClient::~SensorClient() {} int SensorClient::StartSensor() { Transaction trans{*this}; auto status = trans.Send<int>(DVR_SENSOR_START, &sensor_type_, sizeof(sensor_type_), nullptr, 0); ALOGE_IF(!status, "startSensor() failed because: %s\n", status.GetErrorMessage().c_str()); return ReturnStatusOrError(status); } int SensorClient::StopSensor() { Transaction trans{*this}; auto status = trans.Send<int>(DVR_SENSOR_STOP); ALOGE_IF(!status, "stopSensor() failed because: %s\n", status.GetErrorMessage().c_str()); return ReturnStatusOrError(status); } int SensorClient::Poll(sensors_event_t* events, int max_events) { int num_events = 0; struct iovec rvec[] = { {.iov_base = &num_events, .iov_len = sizeof(int)}, {.iov_base = events, .iov_len = max_events * sizeof(sensors_event_t)}, }; Transaction trans{*this}; auto status = trans.SendVector<int>(DVR_SENSOR_POLL, nullptr, rvec); ALOGE_IF(!status, "Sensor poll() failed because: %s\n", status.GetErrorMessage().c_str()); return !status ? -status.error() : num_events; } } // namespace dvr } // namespace android // Entrypoints to simplify using the library when programmatically dynamicly // loading it. // Allows us to call this library without linking it, as, for instance, // when compiling GVR in Google3. // NOTE(segal): It's kind of a hack. extern "C" uint64_t dvrStartSensor(int type) { android::dvr::SensorClient* service = android::dvr::SensorClient::Create(type).release(); service->StartSensor(); return (uint64_t)service; } extern "C" void dvrStopSensor(uint64_t service) { android::dvr::SensorClient* iss = reinterpret_cast<android::dvr::SensorClient*>(service); iss->StopSensor(); delete iss; } extern "C" int dvrPollSensor(uint64_t service, int max_count, sensors_event_t* events) { return reinterpret_cast<android::dvr::SensorClient*>(service)->Poll( events, max_count); }