1 /*
2 * Copyright 2013 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #include <fcntl.h>
18 #include <errno.h>
19 #include <math.h>
20 #include <poll.h>
21 #include <unistd.h>
22 #include <dirent.h>
23 #include <sys/select.h>
24
25 #include <cutils/log.h>
26
27 #include "sensors.h"
28 #include "ProximitySensor.h"
29
30 /*****************************************************************************/
31
ProximitySensor()32 ProximitySensor::ProximitySensor()
33 : SensorBase(NULL, PROXIMITY_DATA),
34 mEnabled(0),
35 mInputReader(4),
36 mHasPendingEvent(false)
37 {
38 mPendingEvent.sensor = ID_PX;
39 mPendingEvent.type = SENSOR_TYPE_PROXIMITY;
40 memset(mPendingEvent.data, 0, sizeof(mPendingEvent.data));
41 }
42
~ProximitySensor()43 ProximitySensor::~ProximitySensor()
44 {
45 }
46
setInitialState()47 int ProximitySensor::setInitialState()
48 {
49 return 0;
50 }
51
enable(int32_t,int en)52 int ProximitySensor::enable(int32_t, int en)
53 {
54 int newState = en ? 1 : 0;
55 int err = 0;
56
57 if (newState != mEnabled) {
58 if (!mEnabled && dev_name != NULL) {
59 open_device();
60 }
61
62 char sysfs[PATH_MAX];
63
64 strcpy(sysfs, I2C);
65 strcat(sysfs, "enable_ps_sensor");
66
67 ALOGI_IF(DEBUG, "enable.open(%s), en(%d)", sysfs, en);
68
69 int fd = open(sysfs, O_RDWR);
70 if (fd < 0) {
71 ALOGE("couldn't open '%s' input device", sysfs);
72 err = -1;
73 } else {
74 char buf[2];
75
76 buf[0] = newState ? '1' : '0';
77 buf[1] = '\0';
78
79 write(fd, buf, sizeof(buf));
80 close(fd);
81 setInitialState();
82 }
83
84 mEnabled = newState;
85
86 if (!mEnabled && dev_name != NULL) {
87 close_device();
88 }
89 }
90 return err;
91 }
92
hasPendingEvents() const93 bool ProximitySensor::hasPendingEvents() const
94 {
95 return mHasPendingEvent;
96 }
97
readEvents(sensors_event_t * data,int count)98 int ProximitySensor::readEvents(sensors_event_t* data, int count)
99 {
100 if (count < 1)
101 return -EINVAL;
102
103 if (mHasPendingEvent) {
104 mHasPendingEvent = false;
105 mPendingEvent.timestamp = getTimestamp();
106 *data = mPendingEvent;
107 return mEnabled ? 1 : 0;
108 }
109
110 ssize_t n = mInputReader.fill(data_fd);
111 if (n < 0)
112 return n;
113
114 int numEventReceived = 0;
115 input_event const* event;
116
117 while (count && mInputReader.readEvent(&event)) {
118 int type = event->type;
119 if (type == EV_ABS) {
120 if (event->code == ABS_DISTANCE) {
121 mPendingEvent.sensor = ID_PX;
122 mPendingEvent.type = SENSOR_TYPE_PROXIMITY;
123 mPendingEvent.distance = (float) event->value;
124 }
125 } else if (type == EV_SYN) {
126 mPendingEvent.timestamp = timevalToNano(event->time);
127
128 if (mEnabled) {
129 *data++ = mPendingEvent;
130 count--;
131 numEventReceived++;
132 }
133 } else {
134 ALOGE("ProximitySensor: unknown event (type=%d, code=%d)",
135 type, event->code);
136 }
137 mInputReader.next();
138 }
139
140 return numEventReceived;
141 }
142
indexToValue(size_t index) const143 float ProximitySensor::indexToValue(size_t index) const
144 {
145 //return index * PROXIMITY_THRESHOLD_CM;
146 return index;
147 }
148