WPILibC++  trunk
Servo.cpp
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2008. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in $(WIND_BASE)/WPILib. */
5 /*----------------------------------------------------------------------------*/
6 
7 #include "Servo.h"
8 
9 #include "NetworkCommunication/UsageReporting.h"
10 #include "LiveWindow/LiveWindow.h"
11 
12 constexpr float Servo::kMaxServoAngle;
13 constexpr float Servo::kMinServoAngle;
14 
21 void Servo::InitServo()
22 {
23  m_table = NULL;
24  SetBounds(2.27, 1.513, 1.507, 1.5, .743);
25  SetPeriodMultiplier(kPeriodMultiplier_4X);
26 
27 
28  LiveWindow::GetInstance()->AddActuator("Servo", GetModuleNumber(), GetChannel(), this);
29  nUsageReporting::report(nUsageReporting::kResourceType_Servo, GetChannel(), GetModuleNumber() - 1);
30 }
31 
37 Servo::Servo(uint32_t channel) : SafePWM(channel)
38 {
39  InitServo();
40 }
41 
48 Servo::Servo(uint8_t moduleNumber, uint32_t channel) : SafePWM(moduleNumber, channel)
49 {
50  InitServo();
51 }
52 
53 Servo::~Servo()
54 {
55 }
56 
64 void Servo::Set(float value)
65 {
66  SetPosition(value);
67 }
68 
75  SetRaw(0);
76 }
77 
85 float Servo::Get()
86 {
87  return GetPosition();
88 }
89 
101 void Servo::SetAngle(float degrees)
102 {
103  if (degrees < kMinServoAngle)
104  {
105  degrees = kMinServoAngle;
106  }
107  else if (degrees > kMaxServoAngle)
108  {
109  degrees = kMaxServoAngle;
110  }
111 
112  SetPosition(((float) (degrees - kMinServoAngle)) / GetServoAngleRange());
113 }
114 
122 {
123  return (float)GetPosition() * GetServoAngleRange() + kMinServoAngle;
124 }
125 
126 void Servo::ValueChanged(ITable* source, const std::string& key, EntryValue value, bool isNew) {
127  Set(value.f);
128 }
129 
131  if (m_table != NULL) {
132  m_table->PutNumber("Value", Get());
133  }
134 }
135 
137  if (m_table != NULL) {
138  m_table->AddTableListener("Value", this, true);
139  }
140 }
141 
143  if (m_table != NULL) {
144  m_table->RemoveTableListener(this);
145  }
146 }
147 
149  return "Servo";
150 }
151 
152 void Servo::InitTable(ITable *subTable) {
153  m_table = subTable;
154  UpdateTable();
155 }
156 
158  return m_table;
159 }
160 
161 
virtual void SetPosition(float pos)
Definition: PWM.cpp:172
virtual void RemoveTableListener(ITableListener *listener)=0
void AddActuator(const char *subsystem, const char *name, LiveWindowSendable *component)
Definition: LiveWindow.cpp:96
Servo(uint32_t channel)
Definition: Servo.cpp:37
virtual void PutNumber(std::string key, double value)=0
Definition: ITable.h:26
virtual void AddTableListener(ITableListener *listener)=0
void ValueChanged(ITable *source, const std::string &key, EntryValue value, bool isNew)
Definition: Servo.cpp:126
void StopLiveWindowMode()
Definition: Servo.cpp:142
virtual float GetPosition()
Definition: PWM.cpp:205
void InitTable(ITable *subTable)
Definition: Servo.cpp:152
void SetAngle(float angle)
Definition: Servo.cpp:101
void Set(float value)
Definition: Servo.cpp:64
void SetPeriodMultiplier(PeriodMultiplier mult)
Definition: PWM.cpp:347
static LiveWindow * GetInstance()
Definition: LiveWindow.cpp:13
ITable * GetTable()
Definition: Servo.cpp:157
void SetOffline()
Definition: Servo.cpp:74
void StartLiveWindowMode()
Definition: Servo.cpp:136
virtual void SetRaw(uint8_t value)
Definition: PWM.cpp:323
float Get()
Definition: Servo.cpp:85
void UpdateTable()
Definition: Servo.cpp:130
void SetBounds(int32_t max, int32_t deadbandMax, int32_t center, int32_t deadbandMin, int32_t min)
Definition: PWM.cpp:123
std::string GetSmartDashboardType()
Definition: Servo.cpp:148
float GetAngle()
Definition: Servo.cpp:121
Definition: ITable.h:13