Thomas Hamilton
/
Servo
Servo file under construction.
Servo.cpp
- Committer:
- Blaze513
- Date:
- 2010-08-31
- Revision:
- 0:c4caca30f35a
File content as of revision 0:c4caca30f35a:
#include "Servo.h" Servo::Servo(PinName sgnl) : SignalLine(sgnl), Period(0.02), UpperRange(0.045), Center(0.075), LowerRange(-0.045), Position(0) { SignalLine.period(0.02); //set period to most common value; SignalLine.write(0.075); //set position to most common center } void Servo::position(float ratio) { Position = ratio; if (ratio > 1) { ratio = 1; } else if (ratio < -1) { ratio = -1; } //saturate position to the range boundaries if (ratio >= 0) { SignalLine.write((ratio * UpperRange) + Center); } else { SignalLine.write((ratio * LowerRange) + Center); } //set normalized position (-1 to 1) } float Servo::position() { float ratio = SignalLine.read() - Center; if (ratio > UpperRange) { ratio = UpperRange; } else if (ratio < LowerRange) { ratio = LowerRange; } //saturate position to the range boundaries if(ratio >= 0) { return ratio / UpperRange; } else { return ratio / LowerRange; } //return normalized position } void Servo::maximum(float seconds) { UpperRange = (seconds / Period) - Center; position(Position); } void Servo::maximum_ms(int milliseconds) { UpperRange = ((milliseconds / 1000) / Period) - Center; position(Position); } void Servo::maximum_us(int microseconds) { UpperRange = ((microseconds / 1000000) / Period) - Center; position(Position); } void Servo::center(float seconds) { Center = seconds / Period; position(Position); } void Servo::center_ms(int milliseconds) { Center = (milliseconds / 1000) / Period; position(Position); } void Servo::center_us(int microseconds) { Center = (microseconds / 1000000) / Period; position(Position); } void Servo::minimum(float seconds) { LowerRange = (seconds / Period) - Center; position(Position); } void Servo::minimum_ms(int milliseconds) { LowerRange = ((milliseconds / 1000) / Period) - Center; position(Position); } void Servo::minimum_us(int microseconds) { LowerRange = ((microseconds / 1000000) / Period) - Center; position(Position); } void Servo::period(float seconds) { Period = seconds; SignalLine.period(seconds); } void Servo::period_ms(int milliseconds) { Period = milliseconds / 1000; SignalLine.period_ms(milliseconds); } void Servo::period_us(int microseconds) { Period = microseconds / 1000000; SignalLine.period_us(microseconds); } void Servo::pulsewidth(float seconds) { Position = (seconds / Period) - Center; if (Position >=0) { Position /= UpperRange; } else { Position /= LowerRange * -1; } SignalLine.pulsewidth(seconds); } void Servo::pulsewidth_ms(int milliseconds) { Position = ((milliseconds / 1000) / Period) - Center; if (Position >=0) { Position /= UpperRange; } else { Position /= LowerRange * -1; } SignalLine.pulsewidth_ms(milliseconds); } void Servo::pulsewidth_us(int microseconds) { Position = ((microseconds / 1000000) / Period) - Center; if (Position >=0) { Position /= UpperRange; } else { Position /= LowerRange * -1; } SignalLine.pulsewidth_us(microseconds); } float Servo::operator =(float assignment) { position(assignment); return assignment; } Servo::operator float() { return position(); }