#pragma once #define M4_MMREV 0.7 #define M5_MMREV 0.8 #if CORE_MOCK class AccelStepper { public: enum { DRIVER, FULL4WIRE, }; AccelStepper(uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5, bool enable = true) {} unsigned long computeNewSpeed () { return 0; } float maxSpeed () { return 0; } float acceleration () { return 5; } long distanceToGo () { return 0; } float speed() {return 0;} }; #else #include <AccelStepper.h> #endif class ISRStepper: public AccelStepper { // usefulness: make computeNewSpeed() public to be called outside from interrupt public: ISRStepper(uint8_t interface = AccelStepper::FULL4WIRE, uint8_t pin1 = 2, uint8_t pin2 = 3, uint8_t pin3 = 4, uint8_t pin4 = 5, bool enable = true): AccelStepper(interface, pin1, pin2, pin3, pin4, enable) { } // make it public inline unsigned long computeNewSpeed () { return AccelStepper::computeNewSpeed(); } }; class Motor { public: using MotorHardware_t = ISRStepper; //using an instance //CONSTRUCTORS Motor (MotorHardware_t& stepper); //SETTERS void set_physical (int steps_per_revolution, float mm_per_revolution, bool clockwise_equals_forward); void set_steps_per_revolution(float steps_per_revolution); void set_mm_per_revolution (float mm_per_revolution); void set_retain_acceleration_mm_per_sec_per_sec (float acceleration_mm_per_sec_per_sec); void set_clockwise_equals_forward (bool forward_clockwise); void set_speed_mm_per_sec (float mm_per_sec); //GETTERS float get_steps_per_revolution(); float get_mm_per_revolution () const; bool get_clockwise_equals_forward (); float get_retain_acceleration_mm_per_sec_per_sec () const; //CONVERSIONS float mm_to_step (float mm) const; float step_to_mm (int step) const; //MOVEMENTS void move_to_step_limit_switch (int step); void move_to_mm_limit_switch (float mm); void move_to_step (int step); void move_to_mm (float mm); void stop (); void stay_here (); void move_step_limit_switch (int step); void move_mm_limit_switch (float mm); void move_step (int step); void move_mm (float mm); bool motor_is_running (); //POSITION int where_step (); int where_mm (); void reset_position(); //CONFIGURATION void show_configuration (); protected: int _steps_per_revolution = -1; float _mm_per_revolution = -1; float _retain_acceleration_mm_per_sec_per_sec = -1; //Useful for the limit switch bool _clockwise_equals_forward; MotorHardware_t& stepper; }; extern ISRStepper stepper;