1
- #ifndef _ESPFC_SENSOR_ACCEL_SENSOR_H_
2
- #define _ESPFC_SENSOR_ACCEL_SENSOR_H_
1
+ #pragma once
3
2
3
+ #include " Model.h"
4
4
#include " BaseSensor.h"
5
5
#include " Device/GyroDevice.h"
6
6
@@ -11,115 +11,21 @@ namespace Sensor {
11
11
class AccelSensor : public BaseSensor
12
12
{
13
13
public:
14
- AccelSensor (Model& model): _model(model) {}
14
+ AccelSensor (Model& model);
15
15
16
- int begin ()
17
- {
18
- _model.state .accel .adc .z = ACCEL_G;
19
-
20
- _gyro = _model.state .gyro .dev ;
21
- if (!_gyro) return 0 ;
22
-
23
- _model.state .accel .scale = 16 .f * ACCEL_G / 32768 .f ;
24
-
25
- for (size_t i = 0 ; i < AXIS_COUNT_RPY; i++)
26
- {
27
- _filter[i].begin (FilterConfig (FILTER_FIR2, 1 ), _model.state .accel .timer .rate );
28
- }
29
-
30
- _model.state .accel .biasAlpha = _model.state .accel .timer .rate > 0 ? 5 .0f / _model.state .accel .timer .rate : 0 ;
31
- _model.state .accel .calibrationState = CALIBRATION_IDLE;
32
-
33
- _model.logger .info ().log (F (" ACCEL INIT" )).log (FPSTR (Device::GyroDevice::getName (_gyro->getType ()))).log (_gyro->getAddress ()).log (_model.state .accel .timer .rate ).log (_model.state .accel .timer .interval ).logln (_model.state .accel .present );
34
-
35
- return 1 ;
36
- }
37
-
38
- int update ()
39
- {
40
- int status = read ();
41
-
42
- if (status) filter ();
43
-
44
- return status;
45
- }
46
-
47
- int read ()
48
- {
49
- if (!_model.accelActive ()) return 0 ;
50
-
51
- // if(!_model.state.accel.timer.check()) return 0;
52
-
53
- Stats::Measure measure (_model.state .stats , COUNTER_ACCEL_READ);
54
- _gyro->readAccel (_model.state .accel .raw );
55
-
56
- return 1 ;
57
- }
58
-
59
- int filter ()
60
- {
61
- if (!_model.accelActive ()) return 0 ;
62
-
63
- Stats::Measure measure (_model.state .stats , COUNTER_ACCEL_FILTER);
64
-
65
- _model.state .accel .adc = (VectorFloat)_model.state .accel .raw * _model.state .accel .scale ;
66
-
67
- align (_model.state .accel .adc , _model.config .gyro .align );
68
- _model.state .accel .adc = _model.state .boardAlignment .apply (_model.state .accel .adc );
69
-
70
- for (size_t i = 0 ; i < AXIS_COUNT_RPY; i++)
71
- {
72
- if (_model.config .debug .mode == DEBUG_ACCELEROMETER)
73
- {
74
- _model.state .debug [i] = _model.state .accel .raw [i];
75
- }
76
- _model.state .accel .adc .set (i, _filter[i].update (_model.state .accel .adc [i]));
77
- _model.state .accel .adc .set (i, _model.state .accel .filter [i].update (_model.state .accel .adc [i]));
78
- }
79
-
80
- calibrate ();
81
-
82
- return 1 ;
83
- }
16
+ int begin ();
17
+ int update ();
18
+ int read ();
19
+ int filter ();
84
20
85
21
private:
86
- void calibrate ()
87
- {
88
- switch (_model.state .accel .calibrationState )
89
- {
90
- case CALIBRATION_IDLE:
91
- _model.state .accel .adc -= _model.state .accel .bias ;
92
- break ;
93
- case CALIBRATION_START:
94
- _model.state .accel .bias = VectorFloat (0 , 0 , ACCEL_G);
95
- _model.state .accel .biasSamples = 2 * _model.state .accel .timer .rate ;
96
- _model.state .accel .calibrationState = CALIBRATION_UPDATE;
97
- break ;
98
- case CALIBRATION_UPDATE:
99
- _model.state .accel .bias += (_model.state .accel .adc - _model.state .accel .bias ) * _model.state .accel .biasAlpha ;
100
- _model.state .accel .biasSamples --;
101
- if (_model.state .accel .biasSamples <= 0 ) _model.state .accel .calibrationState = CALIBRATION_APPLY;
102
- break ;
103
- case CALIBRATION_APPLY:
104
- _model.state .accel .bias .z -= ACCEL_G;
105
- _model.state .accel .calibrationState = CALIBRATION_SAVE;
106
- break ;
107
- case CALIBRATION_SAVE:
108
- _model.finishCalibration ();
109
- _model.state .accel .calibrationState = CALIBRATION_IDLE;
110
- break ;
111
- default :
112
- _model.state .accel .calibrationState = CALIBRATION_IDLE;
113
- break ;
114
- }
115
- }
22
+ void calibrate ();
116
23
117
24
Model& _model;
118
25
Device::GyroDevice * _gyro;
119
- Filter _filter[3 ];
26
+ Filter _filter[AXIS_COUNT_RPY ];
120
27
};
121
28
122
29
}
123
30
124
31
}
125
- #endif
0 commit comments