Skip to content

Commit

Permalink
feat!: refactor adc to support multiple samples (#530)
Browse files Browse the repository at this point in the history
* fix: ServiceForwarder with LimitedStreamReader ends up in infinite loop

* TestServiceForwarder.cpp: format file

* Update protobuf/echo/test/TestServiceForwarder.cpp

* ServiceForwarderBase: empty ContentsReader should break

* adc interface refactored

---------

Co-authored-by: Rob Ekelmans <[email protected]>
Co-authored-by: EkelmansPh <[email protected]>
  • Loading branch information
3 people authored Jan 19, 2024
1 parent d264a4b commit 419f636
Show file tree
Hide file tree
Showing 2 changed files with 24 additions and 11 deletions.
28 changes: 20 additions & 8 deletions hal/interfaces/AnalogToDigitalPin.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
#define HAL_ANALOG_TO_DIGITAL_PIN_HPP

#include "infra/util/AutoResetFunction.hpp"
#include "infra/util/MemoryRange.hpp"
#include "infra/util/Unit.hpp"

namespace hal
Expand All @@ -16,16 +17,22 @@ namespace hal
~AnalogToDigitalPin() = default;

public:
virtual void Measure(const infra::Function<void(infra::Quantity<Unit, Storage> value)>& onDone) = 0;
using SamplesRange = infra::MemoryRange<infra::Quantity<Unit, Storage>>;

virtual void Measure(SamplesRange samples, const infra::Function<void()>& onDone) = 0;
};

template<class Storage>
class AnalogToDigitalPinImplBase
{
protected:
AnalogToDigitalPinImplBase() = default;
AnalogToDigitalPinImplBase(const AnalogToDigitalPinImplBase&) = delete;
AnalogToDigitalPinImplBase& operator=(const AnalogToDigitalPinImplBase&) = delete;
~AnalogToDigitalPinImplBase() = default;

public:
virtual void Measure(const infra::Function<void(int32_t value)>& onDone) = 0;
virtual void Measure(std::size_t numberOfSamples, const infra::Function<void(infra::MemoryRange<Storage> samplesBuffer)>& onDone) = 0;
};

template<class Conversion, class Unit, class Storage, class Impl>
Expand All @@ -35,12 +42,13 @@ namespace hal
{
public:
template<class... Args>
AnalogToDigitalPinConverter(Args&&... args);
explicit AnalogToDigitalPinConverter(Args&&... args);

void Measure(const infra::Function<void(infra::Quantity<Unit, Storage> value)>& onDone);
void Measure(typename AnalogToDigitalPin<Unit, Storage>::SamplesRange samples, const infra::Function<void()>& onDone);

private:
infra::AutoResetFunction<void(infra::Quantity<Unit, Storage> value)> onDone;
typename AnalogToDigitalPin<Unit, Storage>::SamplesRange samples;
infra::AutoResetFunction<void()> onDone;
};

//// Implementation ////
Expand All @@ -52,12 +60,16 @@ namespace hal
{}

template<class Conversion, class Unit, class Storage, class Impl>
void AnalogToDigitalPinConverter<Conversion, Unit, Storage, Impl>::Measure(const infra::Function<void(infra::Quantity<Unit, Storage> value)>& onDone)
void AnalogToDigitalPinConverter<Conversion, Unit, Storage, Impl>::Measure(typename AnalogToDigitalPin<Unit, Storage>::SamplesRange samples, const infra::Function<void()>& onDone)
{
this->samples = samples;
this->onDone = onDone;
Impl::Measure([this](int32_t value)
Impl::Measure(samples.size(), [this](auto samplesBuffer)
{
this->onDone(infra::Quantity<Conversion, Storage>(value));
for (std::size_t index = 0; index < this->samples.size(); index++)
this->samples[index] = infra::Quantity<Conversion, Storage>(samplesBuffer[index]);

this->onDone();
});
}
}
Expand Down
7 changes: 4 additions & 3 deletions hal/interfaces/test_doubles/AnalogToDigitalPinImplMock.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,17 @@
#define HAL_ANALOG_TO_DIGITAL_PIN_IMPL_MOCK_HPP

#include "hal/interfaces/AnalogToDigitalPin.hpp"
#include "infra/util/Unit.hpp"
#include "gmock/gmock.h"

namespace hal
{
class AnalogToDigitalPinImplMock
: AnalogToDigitalPinImplBase
: public AnalogToDigitalPinImplBase<uint32_t>
{
public:
MOCK_METHOD1(Measure, void(const infra::Function<void(int32_t value)>& onDone));
virtual ~AnalogToDigitalPinImplMock() = default;

MOCK_METHOD2(Measure, void(std::size_t numberOfSamples, const infra::Function<void(infra::MemoryRange<int32_t> samples)>& onDone));
};
}

Expand Down

0 comments on commit 419f636

Please sign in to comment.