PM2_Lib

Dependencies:   LSM9DS1 RangeFinder FastPWM

Servo.cpp

Committer:
pmic
Date:
2022-03-22
Revision:
18:21c0a669d6ef
Parent:
16:69911e81dfd4
Child:
19:518ed284d98b

File content as of revision 18:21c0a669d6ef:

#include "Servo.h"

const float Servo::MIN_INPUT = 0.01f;
const float Servo::MAX_INPUT = 0.99f;

Servo::Servo(PinName Pin) : ServoPin(Pin) {}

/**
 * Sets the desired angle.
 * @_Input a value between 0...1.
 */
void Servo::SetPosition(float _Input)
{
    if (_Input < MIN_INPUT) _Input = MIN_INPUT;
    if (_Input > MAX_INPUT) _Input = MAX_INPUT;
    Position = static_cast<int>(_Input * static_cast<float>(Period));
    printf("Position: %d\r\n", Position);
}

void Servo::StartPulse()
{
    ServoPin = 1;
    PulseStop.attach(callback(this, &Servo::EndPulse), std::chrono::microseconds{static_cast<long int>(Position)});
}

void Servo::EndPulse()
{
    ServoPin = 0;
}

/**
 * Enables the servo with start angle and period.
 * @_StartInput a value between 0...1.
 * @_Period period in mus.
 */
void Servo::Enable(float _StartInput, int _Period)
{
    if (_StartInput < MIN_INPUT) _StartInput = MIN_INPUT;
    if (_StartInput > MAX_INPUT) _StartInput = MAX_INPUT;
    Period = _Period;
    Position = static_cast<int>(_StartInput * static_cast<float>(Period));
    printf("Position: %d\r\n", Position);
    Pulse.attach(callback(this, &Servo::StartPulse), std::chrono::microseconds{static_cast<long int>(Period)});
}

/**
 * Disables the servo.
 */
void Servo::Disable()
{
    Pulse.detach();
}