@@ -15,9 +15,18 @@ namespace Components {
1515// ----------------------------------------------------------------------
1616
1717Imu ::Imu (const char * const compName) : ImuComponentBase(compName) {
18+ // Initialize the LIS2MDL sensor
1819 lis2mdl = device_get_binding (" LIS2MDL" );
19- FW_ASSERT (lis2mdl != nullptr );
2020 FW_ASSERT (device_is_ready (lis2mdl));
21+
22+ // Initialize the LSM6DSO sensor
23+ lsm6dso = DEVICE_DT_GET_ONE (st_lsm6dso);
24+ FW_ASSERT (device_is_ready (lsm6dso));
25+
26+ // Configure the LSM6DSO sensor
27+ struct sensor_value odr = {.val1 = 12 , .val2 = 500000 }; // 12.5 Hz
28+ FW_ASSERT (sensor_attr_set (lsm6dso, SENSOR_CHAN_ACCEL_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0 );
29+ FW_ASSERT (sensor_attr_set (lsm6dso, SENSOR_CHAN_GYRO_XYZ, SENSOR_ATTR_SAMPLING_FREQUENCY, &odr) == 0 );
2130}
2231
2332Imu ::~Imu () {}
@@ -28,24 +37,54 @@ Imu ::~Imu() {}
2837
2938void Imu ::run_handler (FwIndexType portNum, U32 context) {
3039 // Fetch new data sample
40+ sensor_sample_fetch_chan (lsm6dso, SENSOR_CHAN_ACCEL_XYZ);
41+ sensor_sample_fetch_chan (lsm6dso, SENSOR_CHAN_GYRO_XYZ);
3142 sensor_sample_fetch_chan (lis2mdl, SENSOR_CHAN_MAGN_XYZ);
3243
33- // Extract the data from the sample
34- struct sensor_value magnetic_data_x;
35- struct sensor_value magnetic_data_y;
36- struct sensor_value magnetic_data_z;
37- sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_X, &magnetic_data_x);
38- sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_Y, &magnetic_data_y);
39- sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_Z, &magnetic_data_z);
44+ // Output the magnetic field values via telemetry
45+ this ->tlmWrite_Acceleration (this ->get_acceleration ());
46+ this ->tlmWrite_AngularVelocity (this ->get_angular_velocity ());
47+ this ->tlmWrite_MagneticField (this ->get_magnetic_field ());
48+ }
4049
41- // Convert to float values in gauss
42- float magnetic_field_x = magnetic_data_x.val1 + magnetic_data_x.val2 / 1000000 .0f ;
43- float magnetic_field_y = magnetic_data_y.val1 + magnetic_data_y.val2 / 1000000 .0f ;
44- float magnetic_field_z = magnetic_data_z.val1 + magnetic_data_z.val2 / 1000000 .0f ;
50+ F64 Imu ::sensor_value_to_f64 (const struct sensor_value & val) {
51+ return val.val1 + val.val2 / 1000000 .0f ;
52+ }
4553
46- // Output the magnetic field values via telemetry
47- this ->tlmWrite_MagneticField (Components::Imu_MagneticField (
48- static_cast <F64>(magnetic_field_x), static_cast <F64>(magnetic_field_y), static_cast <F64>(magnetic_field_z)));
54+ Components::Imu_Acceleration Imu ::get_acceleration () {
55+ struct sensor_value x;
56+ struct sensor_value y;
57+ struct sensor_value z;
58+ sensor_channel_get (lsm6dso, SENSOR_CHAN_ACCEL_X, &x);
59+ sensor_channel_get (lsm6dso, SENSOR_CHAN_ACCEL_Y, &y);
60+ sensor_channel_get (lsm6dso, SENSOR_CHAN_ACCEL_Z, &z);
61+
62+ return Components::Imu_Acceleration (this ->sensor_value_to_f64 (x), this ->sensor_value_to_f64 (y),
63+ this ->sensor_value_to_f64 (z));
64+ }
65+
66+ Components::Imu_AngularVelocity Imu ::get_angular_velocity () {
67+ struct sensor_value x;
68+ struct sensor_value y;
69+ struct sensor_value z;
70+ sensor_channel_get (lsm6dso, SENSOR_CHAN_GYRO_X, &x);
71+ sensor_channel_get (lsm6dso, SENSOR_CHAN_GYRO_Y, &y);
72+ sensor_channel_get (lsm6dso, SENSOR_CHAN_GYRO_Z, &z);
73+
74+ return Components::Imu_AngularVelocity (this ->sensor_value_to_f64 (x), this ->sensor_value_to_f64 (y),
75+ this ->sensor_value_to_f64 (z));
76+ }
77+
78+ Components::Imu_MagneticField Imu ::get_magnetic_field () {
79+ struct sensor_value x;
80+ struct sensor_value y;
81+ struct sensor_value z;
82+ sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_X, &x);
83+ sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_Y, &y);
84+ sensor_channel_get (lis2mdl, SENSOR_CHAN_MAGN_Z, &z);
85+
86+ return Components::Imu_MagneticField (this ->sensor_value_to_f64 (x), this ->sensor_value_to_f64 (y),
87+ this ->sensor_value_to_f64 (z));
4988}
5089
5190} // namespace Components
0 commit comments