9 #include "DigitalModule.h"
10 #include "NetworkCommunication/UsageReporting.h"
13 #include "WPIErrors.h"
18 const int32_t PWM::kPwmDisabled;
28 void PWM::InitPWM(uint8_t moduleNumber, uint32_t channel)
35 snprintf(buf, 64,
"Digital Module %d", moduleNumber);
36 wpi_setWPIErrorWithContext(ModuleIndexOutOfRange, buf);
41 snprintf(buf, 64,
"PWM Channel %d", channel);
42 wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf);
46 snprintf(buf, 64,
"PWM %d (Module: %d)", channel, moduleNumber);
47 if (allocated->
Allocate((moduleNumber - 1) * kPwmChannels + channel - 1, buf) == ~0ul)
49 CloneError(allocated);
54 m_module->
SetPWM(m_channel, kPwmDisabled);
55 m_eliminateDeadband =
false;
57 nUsageReporting::report(nUsageReporting::kResourceType_PWM, channel, moduleNumber - 1);
67 PWM::PWM(uint8_t moduleNumber, uint32_t channel)
70 InitPWM(moduleNumber, channel);
84 InitPWM(GetDefaultDigitalModule(), channel);
96 m_module->
SetPWM(m_channel, kPwmDisabled);
97 allocated->
Free((m_module->GetNumber() - 1) * kPwmChannels + m_channel - 1);
110 m_eliminateDeadband = eliminateDeadband;
123 void PWM::SetBounds(int32_t max, int32_t deadbandMax, int32_t center, int32_t deadbandMin, int32_t min)
127 m_deadbandMaxPwm = deadbandMax;
128 m_centerPwm = center;
129 m_deadbandMinPwm = deadbandMin;
144 void PWM::SetBounds(
double max,
double deadbandMax,
double center,
double deadbandMin,
double min)
148 double loopTime = m_module->
GetLoopTiming()/(kSystemClockTicksPerMicrosecond*1e3);
157 uint32_t PWM::GetModuleNumber()
159 return m_module->GetNumber();
186 rawValue = (int32_t)( (pos * (
float) GetFullRangeScaleFactor()) + GetMinNegativePwm());
188 wpi_assert((rawValue >= GetMinNegativePwm()) && (rawValue <= GetMaxPositivePwm()));
189 wpi_assert(rawValue != kPwmDisabled);
192 SetRaw((uint8_t)rawValue);
209 if (value < GetMinNegativePwm())
213 else if (value > GetMaxPositivePwm())
219 return (
float)(value - GetMinNegativePwm()) / (
float)GetFullRangeScaleFactor();
244 else if (speed > 1.0)
253 rawValue = GetCenterPwm();
255 else if (speed > 0.0)
257 rawValue = (int32_t)(speed * ((
float)GetPositiveScaleFactor()) +
258 ((float) GetMinPositivePwm()) + 0.5);
262 rawValue = (int32_t)(speed * ((
float)GetNegativeScaleFactor()) +
263 ((
float) GetMaxNegativePwm()) + 0.5);
267 wpi_assert((rawValue >= GetMinNegativePwm()) && (rawValue <= GetMaxPositivePwm()));
268 wpi_assert(rawValue != kPwmDisabled);
271 SetRaw((uint8_t)rawValue);
290 if (value == PWM::kPwmDisabled)
294 else if (value > GetMaxPositivePwm())
298 else if (value < GetMinNegativePwm())
302 else if (value > GetMinPositivePwm())
304 return (
float)(value - GetMinPositivePwm()) / (
float)GetPositiveScaleFactor();
306 else if (value < GetMaxNegativePwm())
308 return (
float)(value - GetMaxNegativePwm()) / (
float)GetNegativeScaleFactor();
326 m_module->
SetPWM(m_channel, value);
339 return m_module->
GetPWM(m_channel);
352 case kPeriodMultiplier_4X:
355 case kPeriodMultiplier_2X:
358 case kPeriodMultiplier_1X:
372 if (m_table != NULL) {
379 if (m_table != NULL) {
386 if (m_table != NULL) {
392 return "Speed Controller";
virtual void SetPosition(float pos)
virtual void RemoveTableListener(ITableListener *listener)=0
void InitTable(ITable *subTable)
virtual void PutNumber(std::string key, double value)=0
void ValueChanged(ITable *source, const std::string &key, EntryValue value, bool isNew)
uint8_t GetPWM(uint32_t channel)
virtual void AddTableListener(ITableListener *listener)=0
static bool CheckPWMChannel(uint32_t channel)
virtual float GetPosition()
static bool CheckPWMModule(uint8_t moduleNumber)
static const int32_t kDefaultPwmStepsDown
void Free(uint32_t index)
uint32_t Allocate(const char *resourceDesc)
void SetPeriodMultiplier(PeriodMultiplier mult)
static constexpr float kDefaultPwmCenter
virtual bool StatusIsFatal() const
Check if the current error code represents a fatal error.
virtual void SetRaw(uint8_t value)
void SetPWM(uint32_t channel, uint8_t value)
static DigitalModule * GetInstance(uint8_t moduleNumber)
static void CreateResourceObject(Resource **r, uint32_t elements)
static constexpr float kDefaultPwmPeriod
void StartLiveWindowMode()
void SetBounds(int32_t max, int32_t deadbandMax, int32_t center, int32_t deadbandMin, int32_t min)
std::string GetSmartDashboardType()
void EnableDeadbandElimination(bool eliminateDeadband)
void StopLiveWindowMode()
void SetPWMPeriodScale(uint32_t channel, uint32_t squelchMask)
virtual void SetSpeed(float speed)