1cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca/*
2cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Copyright (C) 2015 Intel Corporation
3cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca *
4cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Licensed under the Apache License, Version 2.0 (the "License");
5cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * you may not use this file except in compliance with the License.
6cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * You may obtain a copy of the License at
7cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca *
8cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca *      http://www.apache.org/licenses/LICENSE-2.0
9cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca *
10cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Unless required by applicable law or agreed to in writing, software
11cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * distributed under the License is distributed on an "AS IS" BASIS,
12cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * See the License for the specific language governing permissions and
14cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * limitations under the License.
15cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca */
16cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
17cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#ifndef SENSOR_HPP
18cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#define SENSOR_HPP
19cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
202260148caf820ec683166792851b504e036c1f39Constantin Musca/**
212260148caf820ec683166792851b504e036c1f39Constantin Musca * The default sensor __attribute__((constructor)) priority is represented by
222260148caf820ec683166792851b504e036c1f39Constantin Musca * the first available priority value. The [0, 100] ones are used by the system
232260148caf820ec683166792851b504e036c1f39Constantin Musca * implementation.
242260148caf820ec683166792851b504e036c1f39Constantin Musca */
252260148caf820ec683166792851b504e036c1f39Constantin Musca#define DEFAULT_SENSOR_CONSTRUCTOR_PRIORITY 101
262260148caf820ec683166792851b504e036c1f39Constantin Musca
27cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#include "AcquisitionThread.hpp"
28cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
29cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Muscastruct sensors_event_t;
30cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Muscaclass AcquisitionThread;
31cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
32cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca/**
33cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * Sensor representation class
34cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca *
35cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * It supports sensor enabling/disabling, changing the sensor's parameters
36cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca * and event reading.
37cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca */
38cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Muscaclass Sensor {
39cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca  public:
40cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
41cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Sensor constructor
42cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
43cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    Sensor();
44cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
45cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
46cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Sensor destructor
47cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
48cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual ~Sensor();
49cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
50cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
51cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Activate the sensor
52cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param handle sensor identifier
53cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param enabled 1 for enabling and 0 for disabling
54cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return 0 on success and a negative error number otherwise
55cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
56cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual int activate(int handle, int enabled);
57cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
58cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
59cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Set delay
60cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param handle sensor identifier
61cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param ns the sampling period at which the sensor should run, in nanoseconds
62cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return 0 on success and a negative error number otherwise
63cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
64cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual int setDelay(int handle, int64_t ns);
65cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
66cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
67cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Poll for events
68cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param data where to store the events
69cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param count the number of events returned must be <= to the count
709178ce05cb05831817580fc11fb7b20bc2031319Constantin Musca     * @return number of events returned in data on success and a negative error number otherwise
71cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
72cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual int pollEvents(sensors_event_t* data, int count) = 0;
73cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
74cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
75cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Sets a sensor’s parameters, including sampling frequency and maximum report latency
76cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param handle sensor identifier
77cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param flags currently unused
78cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param period_ns the sampling period at which the sensor should run, in nanoseconds
79cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param timeout the maximum time by which events can be delayed before being reported
80cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     *          through the HAL, in nanoseconds
81cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return 0 on success and a negative error number otherwise
82cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
83cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual int batch(int handle, int flags, int64_t period_ns, int64_t timeout);
84cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
85cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
86cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Add a flush complete event to the end of the hardware FIFO for the specified sensor and flushes the FIFO
87cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param handle sensor identifier
88cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return 0 on success and a negative error number otherwise
89cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
90cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual int flush(int handle);
91cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
92cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
93cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Read and store an event
94cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param event where to store the event
95cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return true on success and a false otherwise
96cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
97cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    virtual bool readOneEvent(sensors_event_t *event);
98cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
99cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
100cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Get sensor identifier
101cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return sensor handle
102cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
103cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    int getHandle() { return handle; }
104cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
105cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
106cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Get sensor type
107cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return sensor type
108cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
109cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    int getType() { return type; }
110cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
111cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
112cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Get sensor delay in nanoseconds
113cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return sensor delay
114cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
115cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    int64_t getDelay() { return delay; }
116cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
117d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca    /**
118d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca     * Gravitational acceleration constant in m/s^2
119d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca     */
120d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca    static const float kGravitationalAcceleration;
121d6572c0c36e5e96c4a40bb6d8728d0fef0adc351Constantin Musca
122cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca  protected:
123cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    /**
124cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * Enable or disable the associated acquisition thread
1252260148caf820ec683166792851b504e036c1f39Constantin Musca     * @param pollFd poll file descriptor
126cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param handle sensor identifier
127cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @param enabled 1 for enabling and 0 for disabling
128cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     * @return 0 on success and a negative error number otherwise
129cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca     */
1302260148caf820ec683166792851b504e036c1f39Constantin Musca    virtual int activateAcquisitionThread(int pollFd, int handle, int enabled);
131cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
132cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    AcquisitionThread *acquisitionThread;
133cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    int handle, type;
134cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca    int64_t delay;
135cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca};
136cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca
137cf6591ae5272db9f2718d75d0e32d0298b0dc7fdConstantin Musca#endif  // SENSOR_HPP
138