#ifndef MOTOR_H #define MOTOR_H #include #include "config.h" class MotorController { public: void begin(); void setSpeed(int speed); // 0-100 percentage void setDirection(int dir); // -1=reverse, 0=stop, 1=forward void stop(); void update(); // Call in loop() for stall detection int getSpeed(); int getDirection(); float getCurrentRight(); // Current in amps (forward direction) float getCurrentLeft(); // Current in amps (reverse direction) float getCurrentActive(); // Current from active direction bool isStalled(); // True if stall detected // Callback for stall events void setStallCallback(void (*callback)(float current)); // Pingpong mode void startPingpong(int speed, int timeMs, int speedRandomPercent, int timeRandomPercent); void stopPingpong(); bool isPingpongActive(); int getPingpongSpeed(); int getPingpongTime(); int getPingpongSpeedRandom(); int getPingpongTimeRandom(); private: int _speed = 0; int _direction = 0; float _currentRight = 0; float _currentLeft = 0; bool _stalled = false; unsigned long _stallStartTime = 0; void (*_stallCallback)(float current) = nullptr; // Pingpong state bool _pingpongActive = false; int _pingpongBaseSpeed = 50; int _pingpongBaseTime = 2000; int _pingpongSpeedRandomPercent = 0; int _pingpongTimeRandomPercent = 0; int _pingpongCurrentSpeed = 50; int _pingpongCurrentTime = 2000; unsigned long _pingpongLastSwitch = 0; int _pingpongDirection = 1; void applyMotorState(); float readCurrentSense(int pin); void checkStall(); void updatePingpong(); int applyRandomness(int baseValue, int randomPercent); }; extern MotorController motor; #endif