/*----------------------------------------------------------------------------*/ | |
/* 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 "SensorBase.h" | |
#include "NetworkCommunication/LoadOut.h" | |
#include "WPIErrors.h" | |
const UINT32 SensorBase::kSystemClockTicksPerMicrosecond; | |
const UINT32 SensorBase::kDigitalChannels; | |
const UINT32 SensorBase::kAnalogChannels; | |
const UINT32 SensorBase::kAnalogModules; | |
const UINT32 SensorBase::kDigitalModules; | |
const UINT32 SensorBase::kSolenoidChannels; | |
const UINT32 SensorBase::kSolenoidModules; | |
const UINT32 SensorBase::kPwmChannels; | |
const UINT32 SensorBase::kRelayChannels; | |
const UINT32 SensorBase::kChassisSlots; | |
SensorBase *SensorBase::m_singletonList = NULL; | |
/** | |
* Creates an instance of the sensor base and gets an FPGA handle | |
*/ | |
SensorBase::SensorBase() | |
{ | |
} | |
/** | |
* Frees the resources for a SensorBase. | |
*/ | |
SensorBase::~SensorBase() | |
{ | |
} | |
/** | |
* Add sensor to the singleton list. | |
* Add this sensor to the list of singletons that need to be deleted when | |
* the robot program exits. Each of the sensors on this list are singletons, | |
* that is they aren't allocated directly with new, but instead are allocated | |
* by the static GetInstance method. As a result, they are never deleted when | |
* the program exits. Consequently these sensors may still be holding onto | |
* resources and need to have their destructors called at the end of the program. | |
*/ | |
void SensorBase::AddToSingletonList() | |
{ | |
m_nextSingleton = m_singletonList; | |
m_singletonList = this; | |
} | |
/** | |
* Delete all the singleton classes on the list. | |
* All the classes that were allocated as singletons need to be deleted so | |
* their resources can be freed. | |
*/ | |
void SensorBase::DeleteSingletons() | |
{ | |
for (SensorBase *next = m_singletonList; next != NULL;) | |
{ | |
SensorBase *tmp = next; | |
next = next->m_nextSingleton; | |
delete tmp; | |
} | |
m_singletonList = NULL; | |
} | |
/** | |
* Check that the analog module number is valid. | |
* | |
* @return Analog module is valid and present | |
*/ | |
bool SensorBase::CheckAnalogModule(UINT8 moduleNumber) | |
{ | |
if (nLoadOut::getModulePresence(nLoadOut::kModuleType_Analog, moduleNumber - 1)) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the digital module number is valid. | |
* | |
* @return Digital module is valid and present | |
*/ | |
bool SensorBase::CheckDigitalModule(UINT8 moduleNumber) | |
{ | |
if (nLoadOut::getModulePresence(nLoadOut::kModuleType_Digital, moduleNumber - 1)) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the digital module number is valid. | |
* | |
* @return Digital module is valid and present | |
*/ | |
bool SensorBase::CheckPWMModule(UINT8 moduleNumber) | |
{ | |
return CheckDigitalModule(moduleNumber); | |
} | |
/** | |
* Check that the digital module number is valid. | |
* | |
* @return Digital module is valid and present | |
*/ | |
bool SensorBase::CheckRelayModule(UINT8 moduleNumber) | |
{ | |
return CheckDigitalModule(moduleNumber); | |
} | |
/** | |
* Check that the solenoid module number is valid. | |
* | |
* @return Solenoid module is valid and present | |
*/ | |
bool SensorBase::CheckSolenoidModule(UINT8 moduleNumber) | |
{ | |
if (nLoadOut::getModulePresence(nLoadOut::kModuleType_Solenoid, moduleNumber - 1)) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the digital channel number is valid. | |
* Verify that the channel number is one of the legal channel numbers. Channel numbers are | |
* 1-based. | |
* | |
* @return Digital channel is valid | |
*/ | |
bool SensorBase::CheckDigitalChannel(UINT32 channel) | |
{ | |
if (channel > 0 && channel <= kDigitalChannels) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the digital channel number is valid. | |
* Verify that the channel number is one of the legal channel numbers. Channel numbers are | |
* 1-based. | |
* | |
* @return Relay channel is valid | |
*/ | |
bool SensorBase::CheckRelayChannel(UINT32 channel) | |
{ | |
if (channel > 0 && channel <= kRelayChannels) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the digital channel number is valid. | |
* Verify that the channel number is one of the legal channel numbers. Channel numbers are | |
* 1-based. | |
* | |
* @return PWM channel is valid | |
*/ | |
bool SensorBase::CheckPWMChannel(UINT32 channel) | |
{ | |
if (channel > 0 && channel <= kPwmChannels) | |
return true; | |
return false; | |
} | |
/** | |
* Check that the analog channel number is value. | |
* Verify that the analog channel number is one of the legal channel numbers. Channel numbers | |
* are 1-based. | |
* | |
* @return Analog channel is valid | |
*/ | |
bool SensorBase::CheckAnalogChannel(UINT32 channel) | |
{ | |
if (channel > 0 && channel <= kAnalogChannels) | |
return true; | |
return false; | |
} | |
/** | |
* Verify that the solenoid channel number is within limits. | |
* | |
* @return Solenoid channel is valid | |
*/ | |
bool SensorBase::CheckSolenoidChannel(UINT32 channel) | |
{ | |
if (channel > 0 && channel <= kSolenoidChannels) | |
return true; | |
return false; | |
} | |