diff --git a/src/shared/sensors/Sensor.h b/src/shared/sensors/Sensor.h index 5cba9b216e5a72cf0f52bf8e6ae9ad8e4a287bbc..1b5e83bd0bee1d97d1c16c4320f7da91aeefa19e 100644 --- a/src/shared/sensors/Sensor.h +++ b/src/shared/sensors/Sensor.h @@ -22,6 +22,8 @@ #pragma once +#include <miosix.h> + #include <array> #include <type_traits> @@ -97,15 +99,32 @@ protected: */ virtual Data sampleImpl() = 0; + // Thread safe mutex to synchronize writes and reads + miosix::FastMutex mutex; + public: virtual ~Sensor() {} - void sample() override { lastSample = sampleImpl(); } + void sample() override + { + // Sampling outside of the protected zone ensures that the sampling + // action cannot cause locks or delays + Data d = sampleImpl(); + + { + miosix::Lock<miosix::FastMutex> l(mutex); + lastSample = d; + } + } /** * @return last available sample from this sensor */ - virtual const Data& getLastSample() { return lastSample; } + virtual const Data& getLastSample() + { + miosix::Lock<miosix::FastMutex> l(mutex); + return lastSample; + } }; /** diff --git a/src/tests/sensors/analog/test-analog-pressure-sensors.cpp b/src/tests/sensors/analog/test-analog-pressure-sensors.cpp index 98cc37b3a09c24f0361462ecca13abd57c404d23..d64e113db0a53fdfe00a05df163f2524ced11207 100644 --- a/src/tests/sensors/analog/test-analog-pressure-sensors.cpp +++ b/src/tests/sensors/analog/test-analog-pressure-sensors.cpp @@ -73,14 +73,14 @@ int main() ADS1118 ads1118(spiSlave); std::function<ADCData()> getVoltageFunction = - std::bind(&ADS1118::getVoltage, ads1118, channel1); + std::bind(&ADS1118::getVoltage, std::ref(ads1118), channel1); HSCMAND015PA analogSensor(getVoltageFunction); analogSensor.init(); analogSensor.selfTest(); std::function<ADCData()> getVoltageFunction2 = - std::bind(&ADS1118::getVoltage, ads1118, channel2); + std::bind(&ADS1118::getVoltage, std::ref(ads1118), channel2); HSCMRNN030PA analogSensor2(getVoltageFunction2); analogSensor2.init();