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