Add forced reinit of all automata for the unit tests
+ added a few constexpr to constructors on the waypull/26/head
parent
b8f6bc9a4e
commit
3cb3cebed9
|
|
@ -7,7 +7,7 @@ namespace finda {
|
||||||
|
|
||||||
class FINDA : protected debounce::Debouncer {
|
class FINDA : protected debounce::Debouncer {
|
||||||
public:
|
public:
|
||||||
inline FINDA()
|
inline constexpr FINDA()
|
||||||
: debounce::Debouncer(debounce) {};
|
: debounce::Debouncer(debounce) {};
|
||||||
void Step(uint16_t time);
|
void Step(uint16_t time);
|
||||||
using debounce::Debouncer::Pressed;
|
using debounce::Debouncer::Pressed;
|
||||||
|
|
|
||||||
|
|
@ -11,8 +11,9 @@ namespace fsensor {
|
||||||
|
|
||||||
class FSensor : protected debounce::Debouncer {
|
class FSensor : protected debounce::Debouncer {
|
||||||
public:
|
public:
|
||||||
inline FSensor()
|
inline constexpr FSensor()
|
||||||
: debounce::Debouncer(debounce) {};
|
: debounce::Debouncer(debounce)
|
||||||
|
, reportedFSensorState(false) {};
|
||||||
void Step(uint16_t time);
|
void Step(uint16_t time);
|
||||||
using debounce::Debouncer::Pressed;
|
using debounce::Debouncer::Pressed;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,12 @@ namespace idler {
|
||||||
class Idler {
|
class Idler {
|
||||||
public:
|
public:
|
||||||
enum {
|
enum {
|
||||||
Ready = 0,
|
Ready = 0, // intentionally set as zero in order to allow zeroing the Idler structure upon startup -> avoid explicit initialization code
|
||||||
Moving,
|
Moving,
|
||||||
Failed
|
Failed
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Idler()
|
inline constexpr Idler()
|
||||||
: state(Ready)
|
: state(Ready)
|
||||||
, plannedEngage(false)
|
, plannedEngage(false)
|
||||||
, plannedSlot(0)
|
, plannedSlot(0)
|
||||||
|
|
|
||||||
|
|
@ -61,6 +61,8 @@ public:
|
||||||
/// @@TODO this is subject of discussion and change in the future
|
/// @@TODO this is subject of discussion and change in the future
|
||||||
class Motion {
|
class Motion {
|
||||||
public:
|
public:
|
||||||
|
inline constexpr Motion() = default;
|
||||||
|
|
||||||
/// Init axis driver - @@TODO this should be probably hidden somewhere deeper ... something should manage the axes and their state
|
/// Init axis driver - @@TODO this should be probably hidden somewhere deeper ... something should manage the axes and their state
|
||||||
/// especially when the TMC may get randomly reset (deinited)
|
/// especially when the TMC may get randomly reset (deinited)
|
||||||
void InitAxis(Axis axis);
|
void InitAxis(Axis axis);
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ public:
|
||||||
Failed
|
Failed
|
||||||
};
|
};
|
||||||
|
|
||||||
inline Selector()
|
inline constexpr Selector()
|
||||||
: state(Ready)
|
: state(Ready)
|
||||||
, plannedSlot(0)
|
, plannedSlot(0)
|
||||||
, currentSlot(0) {}
|
, currentSlot(0) {}
|
||||||
|
|
|
||||||
|
|
@ -31,17 +31,7 @@ bool WhileCondition(logic::FeedToFinda &ff, COND cond, uint32_t maxLoops = 5000)
|
||||||
TEST_CASE("feed_to_finda::feed_phase_unlimited", "[feed_to_finda]") {
|
TEST_CASE("feed_to_finda::feed_phase_unlimited", "[feed_to_finda]") {
|
||||||
using namespace logic;
|
using namespace logic;
|
||||||
|
|
||||||
// no buttons involved ;)
|
ForceReinitAllAutomata();
|
||||||
hal::adc::TADCData noButtons({ 0 });
|
|
||||||
hal::adc::ReinitADC(0, std::move(noButtons), 1);
|
|
||||||
|
|
||||||
// finda OFF
|
|
||||||
hal::adc::TADCData findaOFF({ 0 });
|
|
||||||
hal::adc::ReinitADC(1, std::move(findaOFF), 1);
|
|
||||||
|
|
||||||
// let's assume we have the filament NOT loaded and active slot 0
|
|
||||||
modules::globals::globals.SetFilamentLoaded(false);
|
|
||||||
modules::globals::globals.SetActiveSlot(0);
|
|
||||||
|
|
||||||
FeedToFinda ff;
|
FeedToFinda ff;
|
||||||
main_loop();
|
main_loop();
|
||||||
|
|
@ -103,20 +93,7 @@ TEST_CASE("feed_to_finda::feed_phase_unlimited", "[feed_to_finda]") {
|
||||||
TEST_CASE("feed_to_finda::FINDA_failed", "[feed_to_finda]") {
|
TEST_CASE("feed_to_finda::FINDA_failed", "[feed_to_finda]") {
|
||||||
using namespace logic;
|
using namespace logic;
|
||||||
|
|
||||||
// This is a problem - how to reset all the state machines at once?
|
ForceReinitAllAutomata();
|
||||||
// May be add an #ifdef unit_tests and a reset function for each of the automatons
|
|
||||||
|
|
||||||
// no buttons involved ;)
|
|
||||||
hal::adc::TADCData noButtons({ 0 });
|
|
||||||
hal::adc::ReinitADC(0, std::move(noButtons), 1);
|
|
||||||
|
|
||||||
// finda OFF
|
|
||||||
hal::adc::TADCData findaOFF({ 0 });
|
|
||||||
hal::adc::ReinitADC(1, std::move(findaOFF), 1);
|
|
||||||
|
|
||||||
// let's assume we have the filament NOT loaded and active slot 0
|
|
||||||
modules::globals::globals.SetFilamentLoaded(false);
|
|
||||||
modules::globals::globals.SetActiveSlot(0);
|
|
||||||
|
|
||||||
FeedToFinda ff;
|
FeedToFinda ff;
|
||||||
main_loop();
|
main_loop();
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,7 @@
|
||||||
#include "main_loop_stub.h"
|
#include "main_loop_stub.h"
|
||||||
|
|
||||||
|
#include "../../modules/stubs/stub_adc.h"
|
||||||
|
|
||||||
#include "../../../../src/modules/buttons.h"
|
#include "../../../../src/modules/buttons.h"
|
||||||
#include "../../../../src/modules/finda.h"
|
#include "../../../../src/modules/finda.h"
|
||||||
#include "../../../../src/modules/fsensor.h"
|
#include "../../../../src/modules/fsensor.h"
|
||||||
|
|
@ -9,6 +12,8 @@
|
||||||
#include "../../../../src/modules/permanent_storage.h"
|
#include "../../../../src/modules/permanent_storage.h"
|
||||||
#include "../../../../src/modules/selector.h"
|
#include "../../../../src/modules/selector.h"
|
||||||
|
|
||||||
|
#include <new> // bring in placement new
|
||||||
|
|
||||||
logic::CommandBase *currentCommand = nullptr;
|
logic::CommandBase *currentCommand = nullptr;
|
||||||
|
|
||||||
// just like in the real FW, step all the known automata
|
// just like in the real FW, step all the known automata
|
||||||
|
|
@ -26,3 +31,34 @@ void main_loop() {
|
||||||
currentCommand->Step();
|
currentCommand->Step();
|
||||||
++tmpTiming;
|
++tmpTiming;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ForceReinitAllAutomata() {
|
||||||
|
// This woodoo magic with placement new is just a forced reinit of global instances of firmware's state machines
|
||||||
|
// just for the purposes of separate unit tests. Each unit test needs a "freshly booted firmware" and since all unit tests
|
||||||
|
// in the test binary share the same global data structures, we need some way of making them fresh each time.
|
||||||
|
//
|
||||||
|
// This approach mimics the firmware behavior closely as the firmware initializes its global data structures
|
||||||
|
// on its very start once (by copying static init data from PROGMEM into RAM) - and we need exactly this approach in the unit tests.
|
||||||
|
//
|
||||||
|
// There are multiple other approaches, one of them is adding a special Init() function into each of these state machines.
|
||||||
|
// As this approach might look like a standard and safer way of doing stuff, it has several drawbacks, especially
|
||||||
|
// it needs an explicit call to the Init function every time an object like this is created - this can have negative influence on firmware's code size
|
||||||
|
|
||||||
|
new (&modules::buttons::buttons) modules::buttons::Buttons();
|
||||||
|
new (&modules::leds::leds) modules::leds::LEDs();
|
||||||
|
new (&modules::finda::finda) modules::finda::FINDA();
|
||||||
|
new (&modules::fsensor::fsensor) modules::fsensor::FSensor();
|
||||||
|
new (&modules::idler::idler) modules::idler::Idler();
|
||||||
|
new (&modules::selector::selector) modules::selector::Selector();
|
||||||
|
new (&modules::motion::motion) modules::motion::Motion();
|
||||||
|
|
||||||
|
// no buttons involved ;)
|
||||||
|
hal::adc::ReinitADC(0, hal::adc::TADCData({ 0 }), 1);
|
||||||
|
|
||||||
|
// finda OFF
|
||||||
|
hal::adc::ReinitADC(1, hal::adc::TADCData({ 0 }), 1);
|
||||||
|
|
||||||
|
// let's assume we have the filament NOT loaded and active slot 0
|
||||||
|
modules::globals::globals.SetFilamentLoaded(false);
|
||||||
|
modules::globals::globals.SetActiveSlot(0);
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,6 @@
|
||||||
#include "../../../../src/logic/command_base.h"
|
#include "../../../../src/logic/command_base.h"
|
||||||
|
|
||||||
extern void main_loop();
|
extern void main_loop();
|
||||||
|
extern void ForceReinitAllAutomata();
|
||||||
|
|
||||||
extern logic::CommandBase *currentCommand;
|
extern logic::CommandBase *currentCommand;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue