Skip to content

Commit d47f4db

Browse files
committed
♻️ (imu): Break setDataAvailableInterrupt in multiple methods
1 parent 2e14e8d commit d47f4db

File tree

5 files changed

+63
-17
lines changed

5 files changed

+63
-17
lines changed

drivers/CoreIMU/include/CoreIMU.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ class CoreIMU : public interface::IMU, public interface::DeepSleepEnabled
2323
void init() final;
2424

2525
void registerOnDataAvailableCallback(data_available_callback_t const &callback) final;
26+
void enableOnDataAvailable() final;
27+
void disableOnDataAvailable() final;
2628

2729
void setPowerMode(PowerMode mode) final;
2830

@@ -39,7 +41,8 @@ class CoreIMU : public interface::IMU, public interface::DeepSleepEnabled
3941
uint16_t number_bytes_to_read) -> int32_t;
4042

4143
void onDataAvailableHandler(auto timestamp);
42-
void setDataAvailableInterrupt();
44+
45+
void setInterruptCallback(std::function<void()> const &callback);
4346

4447
interface::I2C &_i2c;
4548
CoreEventQueue _event_queue {};
@@ -52,6 +55,7 @@ class CoreIMU : public interface::IMU, public interface::DeepSleepEnabled
5255
std::array<int16_t, 3> data_raw_xl {};
5356
std::array<int16_t, 3> data_raw_gy {};
5457
data_available_callback_t _on_data_available_callback {};
58+
std::function<void()> _on_data_available_wrapper_callback {};
5559

5660
static constexpr uint8_t kMaxBufferLength = 32;
5761
std::array<uint8_t, kMaxBufferLength> _rx_buffer {};

drivers/CoreIMU/source/CoreIMU.cpp

Lines changed: 34 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ void CoreIMU::init()
3333
lsm6dsox_dataready_pulsed_t data_ready_pulsed {LSM6DSOX_DRDY_PULSED};
3434
lsm6dsox_data_ready_mode_set(&_register_io_function, data_ready_pulsed);
3535

36-
setDataAvailableInterrupt();
36+
enableOnDataAvailable();
3737
}
3838

3939
void CoreIMU::setPowerMode(PowerMode mode)
@@ -77,6 +77,13 @@ void CoreIMU::setPowerMode(PowerMode mode)
7777
void CoreIMU::registerOnDataAvailableCallback(data_available_callback_t const &callback)
7878
{
7979
_on_data_available_callback = callback;
80+
81+
_on_data_available_wrapper_callback = [this] {
82+
auto timestamp = rtos::Kernel::Clock::now();
83+
_event_queue.call([this, timestamp] { onDataAvailableHandler(timestamp); });
84+
};
85+
86+
setInterruptCallback(_on_data_available_wrapper_callback);
8087
}
8188

8289
void CoreIMU::onDataAvailableHandler(auto timestamp)
@@ -100,6 +107,28 @@ void CoreIMU::onDataAvailableHandler(auto timestamp)
100107
}
101108
}
102109

110+
void CoreIMU::enableOnDataAvailable()
111+
{
112+
lsm6dsox_pin_int1_route_t lsm6dsox_int1 {
113+
.drdy_xl = PROPERTY_ENABLE,
114+
.den_flag = PROPERTY_ENABLE,
115+
};
116+
lsm6dsox_pin_int1_route_set(&_register_io_function, lsm6dsox_int1);
117+
118+
setInterruptCallback(_on_data_available_wrapper_callback);
119+
}
120+
121+
void CoreIMU::disableOnDataAvailable()
122+
{
123+
lsm6dsox_pin_int1_route_t lsm6dsox_int1 {
124+
.drdy_xl = PROPERTY_DISABLE,
125+
.den_flag = PROPERTY_DISABLE,
126+
};
127+
lsm6dsox_pin_int1_route_set(&_register_io_function, lsm6dsox_int1);
128+
129+
setInterruptCallback({});
130+
}
131+
103132
void CoreIMU::enableDeepSleep()
104133
{
105134
setPowerMode(interface::IMU::PowerMode::Off);
@@ -146,20 +175,11 @@ auto CoreIMU::ptr_io_read(CoreIMU *handle, uint8_t read_address, uint8_t *p_buff
146175
return handle->read(read_address, number_bytes_to_read, p_buffer);
147176
}
148177

149-
void CoreIMU::setDataAvailableInterrupt()
178+
void CoreIMU::setInterruptCallback(std::function<void()> const &callback)
150179
{
151-
lsm6dsox_pin_int1_route_t lsm6dsox_int1 {
152-
.drdy_xl = PROPERTY_ENABLE,
153-
.den_flag = PROPERTY_ENABLE,
154-
};
155-
lsm6dsox_pin_int1_route_set(&_register_io_function, lsm6dsox_int1);
156-
157-
auto data_available_callback = [this] {
158-
auto timestamp = rtos::Kernel::Clock::now();
159-
_event_queue.call([this, timestamp] { onDataAvailableHandler(timestamp); });
160-
};
161-
162-
_irq.onRise(data_available_callback);
180+
if (callback != nullptr) {
181+
_irq.onRise(callback);
182+
}
163183
}
164184

165185
} // namespace leka

drivers/CoreIMU/tests/CoreIMU_test.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,22 @@ TEST_F(CoreIMUTest, emptyOnDataAvailableCallback)
8787
on_rise_callback();
8888
}
8989

90+
TEST_F(CoreIMUTest, enableOnDataAvailable)
91+
{
92+
EXPECT_CALL(mocki2c, write).Times(AtLeast(1));
93+
EXPECT_CALL(mocki2c, read).Times(AtLeast(1));
94+
95+
coreimu.enableOnDataAvailable();
96+
}
97+
98+
TEST_F(CoreIMUTest, disableOnDataAvailable)
99+
{
100+
EXPECT_CALL(mocki2c, write).Times(AtLeast(1));
101+
EXPECT_CALL(mocki2c, read).Times(AtLeast(1));
102+
103+
coreimu.disableOnDataAvailable();
104+
}
105+
90106
TEST_F(CoreIMUTest, enableDeepSleep)
91107
{
92108
EXPECT_CALL(mocki2c, write).Times(AtLeast(1));

include/interface/drivers/IMU.hpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,12 @@ class IMU
4747

4848
using data_available_callback_t = std::function<void(const SensorData)>;
4949

50-
virtual void init() = 0;
50+
virtual void init() = 0;
51+
5152
virtual void registerOnDataAvailableCallback(data_available_callback_t const &callback) = 0;
52-
virtual void setPowerMode(PowerMode) = 0;
53+
virtual void enableOnDataAvailable() = 0;
54+
virtual void disableOnDataAvailable() = 0;
55+
56+
virtual void setPowerMode(PowerMode) = 0;
5357
};
5458
} // namespace leka::interface

tests/unit/mocks/mocks/leka/IMU.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ class IMU : public interface::IMU
1616
MOCK_METHOD(void, setPowerMode, (PowerMode), (override));
1717

1818
void registerOnDataAvailableCallback(data_available_callback_t const &cb) override { data_available_callback = cb; }
19+
MOCK_METHOD(void, enableOnDataAvailable, (), (override));
20+
MOCK_METHOD(void, disableOnDataAvailable, (), (override));
1921

2022
void call_data_available_callback(const SensorData &data) { data_available_callback(data); }
2123

0 commit comments

Comments
 (0)