A library to control a linear actuator box

linearActuatorControl.cpp

Committer:
crussell21
Date:
2020-02-24
Revision:
1:cf533adb862c
Parent:
0:1a5f4c492b1a

File content as of revision 1:cf533adb862c:

#include "linearActuatorControl.h"

LinearActuatorControl::LinearActuatorControl() : _controlMode(D7), _runMode(D8), 
    _linAct1(D9), _linAct2(D10), _linAct3(D11), _linAct4(D12), 
    _actBtn1(D3), _actBtn2(D4), _actBtn3(D5), _actBtn4(D6) {
        
    for (int i = 0; i < 4; i++) {
        _idlePositions[i] = 0;
        _actPositions[i] = 0;
        _manualPositionsDown[i] = 0;
        _manualPositionsUp[i] = 1;
    }

    _linAct1.period_ms(20);
    _linAct2.period_ms(20);
    _linAct3.period_ms(20);
    _linAct4.period_ms(20);
}

void LinearActuatorControl::refresh() {
    if (!_controlMode) {
        _linAct1.pulsewidth_us(!_actBtn1 ? (1000*(1+_manualPositionsDown[0])) : (1000*(1+_manualPositionsUp[0])));
        _linAct2.pulsewidth_us(!_actBtn2 ? (1000*(1+_manualPositionsDown[1])) : (1000*(1+_manualPositionsUp[1])));
        _linAct3.pulsewidth_us(!_actBtn3 ? (1000*(1+_manualPositionsDown[2])) : (1000*(1+_manualPositionsUp[2])));
        _linAct4.pulsewidth_us(!_actBtn4 ? (1000*(1+_manualPositionsDown[3])) : (1000*(1+_manualPositionsUp[3])));
        
    } else {
        if (_runMode) { 
            //update PWM to sequence positions
            _linAct1.pulsewidth_us(1000*(1+_actPositions[0]));
            _linAct2.pulsewidth_us(1000*(1+_actPositions[1]));
            _linAct3.pulsewidth_us(1000*(1+_actPositions[2]));
            _linAct4.pulsewidth_us(1000*(1+_actPositions[3]));
        } else {
            //change to idle positions
            _linAct1.pulsewidth_us(1000*(1+_idlePositions[0]));
            _linAct2.pulsewidth_us(1000*(1+_idlePositions[1]));
            _linAct3.pulsewidth_us(1000*(1+_idlePositions[2]));
            _linAct4.pulsewidth_us(1000*(1+_idlePositions[3]));
        }
    }
}

void LinearActuatorControl::setIdlePositions(float pos1, float pos2, float pos3, float pos4) {
    _idlePositions[0] = pos1;
    _idlePositions[1] = pos2;
    _idlePositions[2] = pos3;
    _idlePositions[3] = pos4;
}

void LinearActuatorControl::setManualPositionsDown(float pos1, float pos2, float pos3, float pos4) {
    _manualPositionsDown[0] = pos1;
    _manualPositionsDown[1] = pos2;
    _manualPositionsDown[2] = pos3;
    _manualPositionsDown[3] = pos4;
}

void LinearActuatorControl::setManualPositionsUp(float pos1, float pos2, float pos3, float pos4) {
    _manualPositionsUp[0] = pos1;
    _manualPositionsUp[1] = pos2;
    _manualPositionsUp[2] = pos3;
    _manualPositionsUp[3] = pos4;
}

void LinearActuatorControl::move(float pos1, float pos2, float pos3, float pos4) {
    _actPositions[0] = pos1;
    _actPositions[1] = pos2;
    _actPositions[2] = pos3;
    _actPositions[3] = pos4;
    refresh();
}

bool LinearActuatorControl::inUserSequence() {
    if (_controlMode && _runMode) {
        return true;
    } 
    return false;
}

float _convertToPulseWidth_us(float input) {
    return 1000*(1+input);   
}