Files
allwpilib/wpilibc/lib/Servo.cpp
Brad Miller 69d9ad70ab CMake Changes
This is the changes made by Patrick Plenefisch converting the native
code to use CMake and the CMake Maven Plugin, as opposed to the
native Maven plugin. This is to allow for compatibility with newer
versions of the GCC toolchain. All the cpp sources were moved from
maven style directories to cpp style directories for CMake.

Change-Id: I67f5e3608948f37c83b0990d232105a3784f8593
2014-04-01 11:18:29 -04:00

162 lines
3.9 KiB
C++

/*----------------------------------------------------------------------------*/
/* Copyright (c) FIRST 2008. All Rights Reserved. */
/* Open Source Software - may be modified and shared by FRC teams. The code */
/* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
/*----------------------------------------------------------------------------*/
#include "Servo.h"
//#include "NetworkCommunication/UsageReporting.h"
#include "LiveWindow/LiveWindow.h"
constexpr float Servo::kMaxServoAngle;
constexpr float Servo::kMinServoAngle;
/**
* Common initialization code called by all constructors.
*
* InitServo() assigns defaults for the period multiplier for the servo PWM control signal, as
* well as the minimum and maximum PWM values supported by the servo.
*/
void Servo::InitServo()
{
m_table = NULL;
SetBounds(2.27, 1.513, 1.507, 1.5, .743);
SetPeriodMultiplier(kPeriodMultiplier_4X);
LiveWindow::GetInstance()->AddActuator("Servo", GetModuleNumber(), GetChannel(), this);
HALReport(HALUsageReporting::kResourceType_Servo, GetChannel(), GetModuleNumber() - 1);
}
/**
* Constructor that assumes the default digital module.
*
* @param channel The PWM channel on the digital module to which the servo is attached.
*/
Servo::Servo(uint32_t channel) : SafePWM(channel)
{
InitServo();
// printf("Done initializing servo %d\n", channel);
}
/**
* Constructor that specifies the digital module.
*
* @param moduleNumber The digital module (1 or 2).
* @param channel The PWM channel on the digital module to which the servo is attached (1..10).
*/
Servo::Servo(uint8_t moduleNumber, uint32_t channel) : SafePWM(moduleNumber, channel)
{
InitServo();
}
Servo::~Servo()
{
}
/**
* Set the servo position.
*
* Servo values range from 0.0 to 1.0 corresponding to the range of full left to full right.
*
* @param value Position from 0.0 to 1.0.
*/
void Servo::Set(float value)
{
SetPosition(value);
}
/**
* Set the servo to offline.
*
* Set the servo raw value to 0 (undriven)
*/
void Servo::SetOffline() {
SetRaw(0);
}
/**
* Get the servo position.
*
* Servo values range from 0.0 to 1.0 corresponding to the range of full left to full right.
*
* @return Position from 0.0 to 1.0.
*/
float Servo::Get()
{
return GetPosition();
}
/**
* Set the servo angle.
*
* Assume that the servo angle is linear with respect to the PWM value (big assumption, need to test).
*
* Servo angles that are out of the supported range of the servo simply "saturate" in that direction
* In other words, if the servo has a range of (X degrees to Y degrees) than angles of less than X
* result in an angle of X being set and angles of more than Y degrees result in an angle of Y being set.
*
* @param degrees The angle in degrees to set the servo.
*/
void Servo::SetAngle(float degrees)
{
if (degrees < kMinServoAngle)
{
degrees = kMinServoAngle;
}
else if (degrees > kMaxServoAngle)
{
degrees = kMaxServoAngle;
}
SetPosition(((float) (degrees - kMinServoAngle)) / GetServoAngleRange());
}
/**
* Get the servo angle.
*
* Assume that the servo angle is linear with respect to the PWM value (big assumption, need to test).
* @return The angle in degrees to which the servo is set.
*/
float Servo::GetAngle()
{
return (float)GetPosition() * GetServoAngleRange() + kMinServoAngle;
}
void Servo::ValueChanged(ITable* source, const std::string& key, EntryValue value, bool isNew) {
Set(value.f);
}
void Servo::UpdateTable() {
if (m_table != NULL) {
m_table->PutNumber("Value", Get());
}
}
void Servo::StartLiveWindowMode() {
if (m_table != NULL) {
m_table->AddTableListener("Value", this, true);
}
}
void Servo::StopLiveWindowMode() {
if (m_table != NULL) {
m_table->RemoveTableListener(this);
}
}
std::string Servo::GetSmartDashboardType() {
return "Servo";
}
void Servo::InitTable(ITable *subTable) {
m_table = subTable;
UpdateTable();
}
ITable * Servo::GetTable() {
return m_table;
}