Oddbean new post about | logout
  *
 *  Created on: 2021/5/17 9:48
 *      Author: ChenWei
 *
 */

#include "stm32f1xx_hal.h"
#include "MotorDriver.h"

namespace motorDriver {

    // motor driver for the 40mm linear actuator, left and right movement
    MotorDriver::MotorDriver() :
        m_left{
            .pwmPin = GPIO_PIN_12,
            .motorPwdnPin = GPIO_PIN_13,
            .directionPin = GPIO_PIN_14,
            .speedLimitHz = 5000, // max speed limit
            .dutyRange = 1000 // duty cycle range: 0~100%
        },
        m_right{
            .pwmPin = GPIO_PIN_9,
            .motorPwdnPin = GPIO_PIN_10,
            .directionPin = GPIO_PIN_8,
            .speedLimitHz = 5000, // max speed limit
            .dutyRange = 1000 // duty cycle range: 0~100%
        } {

    }

    void MotorDriver::move(float32_t leftSpeed, float32_t rightSpeed) {
        m_left.setSpeed(leftSpeed);
        m_right.setSpeed(rightSpeed);
        // move left motor
        if (m_left.isMoving()) {
            HAL_GPIO_WritePin(m_left.pwmPin, GPIO_HIGH);
        } else {
            HAL_GPIO_WritePin(m_left.pwmPin, GPIO_LOW);
        }
        // move right motor
        if (m_right.isMoving()) {
            HAL_GPIO_WritePin(m_right.pwmPin, GPIO_HIGH);
        } else {
            HAL_GPIO_WritePin(m_right.pwmPin, GPIO_LOW);
        }
    }

    void MotorDriver::stop() {
        m_left.stop();
        m_right.stop();
        // move left motor
        if (m_left.isMoving()) {
            HAL_GPIO_WritePin(m_left.pwmPin, GPIO_HIGH);
        } else {
            HAL_GPIO_WritePin(m_left.pwmPin, GPIO_LOW);
        }
        // move right motor
        if (m_right.isMoving()) {
            HAL_GPIO_WritePin(m_right.pwmPin, GPIO_HIGH);
        } else {
            HAL_GPIO_WritePin(m_right.pwmPin, GPIO_LOW);
        }
    }

    void MotorDriver::setDirection(bool32_t direction) {
        if (direction == DIR_LEFT) {
            m_left.setDirection(DIRECTION_FORWARD);
            m_right.setDirection(DIRECTION_BACKWARD);
        } else if (direction == DIR_RIGHT) {
            m_left.setDirection(DIRECTION_BACKWARD);
            m_right.setDirection(DIRECTION_FORWARD);
        } else {
            // stop motors
            stop();
        }
    }

    bool32_t MotorDriver::isMoving() const {
        return (m_left.isMoving() || m_right.isMoving());
    }

}