amiro-os / include / amiro / accel / lis331dlh.hpp @ b8085493
History | View | Annotate | Download (5.662 KB)
1 | 58fe0e0b | Thomas Schöpping | #ifndef LIS331DLH_HPP_
|
---|---|---|---|
2 | #define LIS331DLH_HPP_
|
||
3 | |||
4 | #include <ch.hpp> |
||
5 | |||
6 | namespace amiro {
|
||
7 | |||
8 | class HWSPIDriver; |
||
9 | |||
10 | class LIS331DLH : public chibios_rt::BaseStaticThread<256> { |
||
11 | |||
12 | public:
|
||
13 | |||
14 | struct InterruptConfig {
|
||
15 | |||
16 | uint8_t config; |
||
17 | uint8_t ths; |
||
18 | uint8_t duration; |
||
19 | |||
20 | } __attribute__((packed)); |
||
21 | |||
22 | struct LIS331DLHConfig {
|
||
23 | uint8_t ctrl1; |
||
24 | uint8_t ctrl2; |
||
25 | uint8_t ctrl3; |
||
26 | uint8_t ctrl4; |
||
27 | uint8_t ctrl5; |
||
28 | InterruptConfig int1_cfg; |
||
29 | InterruptConfig int2_cfg; |
||
30 | }; |
||
31 | |||
32 | enum {
|
||
33 | AOI_OR_INT = 0x00u,
|
||
34 | AOI_6MOVE = 0x40u,
|
||
35 | AOI_AND_INT = 0x80u,
|
||
36 | AOI_6POS = 0xC0u,
|
||
37 | ZHIE = 0x20u,
|
||
38 | ZLIE = 0x10u,
|
||
39 | YHIE = 0x08u,
|
||
40 | YLIE = 0x04u,
|
||
41 | XHIE = 0x02u,
|
||
42 | XLIE = 0x01u,
|
||
43 | }; |
||
44 | |||
45 | enum {
|
||
46 | IA = 0x40u,
|
||
47 | ZH = 0x20u,
|
||
48 | ZL = 0x10u,
|
||
49 | YH = 0x08u,
|
||
50 | YL = 0x04u,
|
||
51 | XH = 0x02u,
|
||
52 | XL = 0x01u,
|
||
53 | }; |
||
54 | |||
55 | enum {
|
||
56 | THS_MASK = 0x7Fu,
|
||
57 | }; |
||
58 | |||
59 | enum {
|
||
60 | DURATION_MASK = 0x7Fu,
|
||
61 | }; |
||
62 | |||
63 | enum {
|
||
64 | PM_OFF = 0x00u,
|
||
65 | PM_ODR = 0x20u,
|
||
66 | PM_0_5_HZ = 0x40u,
|
||
67 | PM_1_HZ = 0x60u,
|
||
68 | PM_2_HZ = 0x80u,
|
||
69 | PM_5_HZ = 0xA0u,
|
||
70 | PM_10_HZ = 0xC0u,
|
||
71 | DR_50HZ_37LP = 0x00u,
|
||
72 | DR_100HZ_74LP = 0x08u,
|
||
73 | DR_400HZ_292LP = 0x10u,
|
||
74 | DR_1000HZ_780LP = 0x18u,
|
||
75 | ZEN = 0x04u,
|
||
76 | YEN = 0x02u,
|
||
77 | XEN = 0x01u,
|
||
78 | }; |
||
79 | |||
80 | enum {
|
||
81 | BOOT_REBOOT = 0x80u,
|
||
82 | HPM_NORMAL0 = 0x00u,
|
||
83 | HPM_REF = 0x20u,
|
||
84 | HPM_NORMAL1 = 0x40u,
|
||
85 | FDS_FILTER = 0x10u,
|
||
86 | HPEN_INT2 = 0x08u,
|
||
87 | HPEN_INT1 = 0x04u,
|
||
88 | HPCF_8 = 0x00u,
|
||
89 | HPCF_16 = 0x01u,
|
||
90 | HPCF_32 = 0x02u,
|
||
91 | HPCF_64 = 0x03u,
|
||
92 | }; |
||
93 | |||
94 | enum {
|
||
95 | INT_HIGH = 0x00u,
|
||
96 | INT_LOW = 0x80u,
|
||
97 | PUSH_PULL = 0x00u,
|
||
98 | OPEN_DRAIN = 0x40u,
|
||
99 | LIR2_LATCH = 0x20u,
|
||
100 | I2_CFG_I2 = 0x00u,
|
||
101 | I2_CFG_I1_I2 = 0x08u,
|
||
102 | I2_CFG_DRY = 0x10u,
|
||
103 | I2_CFG_BOOT = 0x18u,
|
||
104 | LIR1_LATCH = 0x04u,
|
||
105 | I1_CFG_I1 = 0x00u,
|
||
106 | I1_CFG_I1_I2 = 0x01u,
|
||
107 | I1_CFG_DRY = 0x02u,
|
||
108 | I1_CFG_BOOT = 0x03u,
|
||
109 | }; |
||
110 | |||
111 | enum {
|
||
112 | BDU_CONT = 0x00u,
|
||
113 | BDU_STOP = 0x80u,
|
||
114 | BLE_LE = 0x00u,
|
||
115 | BLE_BE = 0x40u,
|
||
116 | FS_2G = 0x00u,
|
||
117 | FS_4G = 0x10u,
|
||
118 | FS_8G = 0x30u,
|
||
119 | STSIGN_POS = 0x00u,
|
||
120 | STSIGN_NEG = 0x08u,
|
||
121 | ST_DISABLE = 0x00u,
|
||
122 | ST_ENABLE = 0x02u,
|
||
123 | SIM_4WI = 0x00u,
|
||
124 | SIM_3WI = 0x01u,
|
||
125 | }; |
||
126 | |||
127 | enum {
|
||
128 | SLEEP_TO_WAKE_OFF = 0x00u,
|
||
129 | SLEEP_TO_WAKE_ON = 0x03u,
|
||
130 | }; |
||
131 | |||
132 | /**
|
||
133 | * Return types of getCheck()
|
||
134 | */
|
||
135 | enum {
|
||
136 | CHECK_OK = 0x00,
|
||
137 | CHECK_FAIL = 0x01,
|
||
138 | }; |
||
139 | |||
140 | /**
|
||
141 | * Top view of the AMiRo with charger in the back (F:Front, B:Back).
|
||
142 | * Z is pointing into the ground (Apply right-hand-rule):
|
||
143 | * ___________
|
||
144 | * / F \
|
||
145 | * / X \
|
||
146 | * | | |
|
||
147 | * | Z---Y |
|
||
148 | * | |
|
||
149 | * \ /
|
||
150 | * \____B______/
|
||
151 | */
|
||
152 | enum {
|
||
153 | AXIS_X = 0x00u,
|
||
154 | AXIS_Y = 0x01u,
|
||
155 | AXIS_Z = 0x02u,
|
||
156 | }; |
||
157 | |||
158 | //private:
|
||
159 | |||
160 | struct registers {
|
||
161 | uint8_t reserved_0x00_0x0E[0x0Fu];
|
||
162 | uint8_t who_am_i; |
||
163 | uint8_t reserved_0x10_0x1F[0x10u];
|
||
164 | uint8_t ctrl_reg1; |
||
165 | uint8_t ctrl_reg2; |
||
166 | uint8_t ctrl_reg3; |
||
167 | uint8_t ctrl_reg4; |
||
168 | uint8_t ctrl_reg5; |
||
169 | uint8_t hp_filter_reset; |
||
170 | uint8_t reference; |
||
171 | uint8_t status_reg; |
||
172 | uint16_t out_x; /* LE */
|
||
173 | uint16_t out_y; /* LE */
|
||
174 | uint16_t out_z; /* LE */
|
||
175 | uint8_t reserved_0x2E_0x2F[0x02u];
|
||
176 | uint8_t int1_cfg; |
||
177 | uint8_t int1_src; |
||
178 | uint8_t int1_ths; |
||
179 | uint8_t int1_duration; |
||
180 | uint8_t int2_cfg; |
||
181 | uint8_t int2_src; |
||
182 | uint8_t int2_ths; |
||
183 | uint8_t int2_duration; |
||
184 | uint8_t reserved_0x38_0x3F[0x08u];
|
||
185 | } __attribute__((packed)); |
||
186 | |||
187 | enum {
|
||
188 | LIS331DLH_ID = 0x32u
|
||
189 | }; |
||
190 | |||
191 | enum {
|
||
192 | ZYXOR = 0x80,
|
||
193 | ZOR = 0x40,
|
||
194 | YOR = 0x20,
|
||
195 | XOR = 0x10,
|
||
196 | ZYXDA = 0x08,
|
||
197 | ZDA = 0x04,
|
||
198 | YDA = 0x02,
|
||
199 | XDA = 0x01,
|
||
200 | }; |
||
201 | |||
202 | enum {
|
||
203 | SPI_MULT = 0x40u,
|
||
204 | SPI_READ = 0x80u,
|
||
205 | SPI_WRITE = 0x00u,
|
||
206 | }; |
||
207 | |||
208 | public:
|
||
209 | LIS331DLH(HWSPIDriver* driver); |
||
210 | virtual ~LIS331DLH();
|
||
211 | |||
212 | chibios_rt::EvtSource* getEventSource(); |
||
213 | msg_t configure(LIS331DLHConfig* config); |
||
214 | |||
215 | /**
|
||
216 | * Return the accelaration in LSB for the given axis.
|
||
217 | *
|
||
218 | * @param axis can be one of the axis [AXIS_X | AXIS_Y | AXIS_Z]
|
||
219 | *
|
||
220 | * @return Measured accelaration in in LSB for the given axis
|
||
221 | */
|
||
222 | int16_t getAcceleration(const uint8_t axis);
|
||
223 | |||
224 | /**
|
||
225 | * Return the accelaration in milli g for the given axis
|
||
226 | *
|
||
227 | * @param axis can be one of the axis [AXIS_X | AXIS_Y | AXIS_Z]
|
||
228 | *
|
||
229 | * @return Measured accelaration in in milli g for the given axis
|
||
230 | */
|
||
231 | int16_t getAccelerationForce(const uint8_t axis);
|
||
232 | |||
233 | /**
|
||
234 | * Check the presence of the accelerometer by reading
|
||
235 | * the identifier register and comparing it to the standard
|
||
236 | * value
|
||
237 | *
|
||
238 | * @return [CHECK_OK | CHECK_FAIL]
|
||
239 | */
|
||
240 | uint8_t getCheck(); |
||
241 | |||
242 | /**
|
||
243 | * Do the build in self-test of the device by applying
|
||
244 | * an electrostatic force and measuring the amplitude.
|
||
245 | * The result is then checked against the standard values
|
||
246 | * of the manual
|
||
247 | * TODO Check if it works correct
|
||
248 | *
|
||
249 | * @param config A working config as template (if NULL, predefined config is taken)
|
||
250 | */
|
||
251 | void printSelfTest(LIS331DLHConfig* config);
|
||
252 | |||
253 | protected:
|
||
254 | virtual msg_t main();
|
||
255 | |||
256 | private:
|
||
257 | inline void updateSensorData(); |
||
258 | |||
259 | private:
|
||
260 | |||
261 | HWSPIDriver* driver; |
||
262 | chibios_rt::EvtSource eventSource; |
||
263 | int16_t accelerations[AXIS_Z - AXIS_X + 1];
|
||
264 | /**
|
||
265 | * Stores the configuration [FS_2G | FS_4G | FS_8G] of
|
||
266 | * the current setup
|
||
267 | */
|
||
268 | uint8_t currentFullScaleConfiguration; |
||
269 | |||
270 | |||
271 | }; |
||
272 | |||
273 | } /* amiro */
|
||
274 | |||
275 | #endif /* LIS331DLH_HPP_ */ |