mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-06 03:31:43 +00:00
Improved error handling in HAL Digital and Solenoid systems.
Change-Id: Iafd68c5bd143e9ee87ecf714bccb2c77e599b649
This commit is contained in:
committed by
Dustin Spicuzza
parent
91891081b9
commit
d690974ad0
@@ -160,6 +160,44 @@ bool checkRelayChannel(void* digital_port_pointer) {
|
|||||||
return port->port.pin < kRelayPins;
|
return port->port.pin < kRelayPins;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a port to make sure that it is not NULL and is a valid PWM port.
|
||||||
|
*
|
||||||
|
* Sets the status to contain the appropriate error.
|
||||||
|
*
|
||||||
|
* @return true if the port passed validation.
|
||||||
|
*/
|
||||||
|
static bool verifyPWMChannel(DigitalPort *port, int32_t *status) {
|
||||||
|
if (port == NULL) {
|
||||||
|
*status = NULL_PARAMETER;
|
||||||
|
return false;
|
||||||
|
} else if (!checkPWMChannel(port)) {
|
||||||
|
*status = PARAMETER_OUT_OF_RANGE;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check a port to make sure that it is not NULL and is a valid Relay port.
|
||||||
|
*
|
||||||
|
* Sets the status to contain the appropriate error.
|
||||||
|
*
|
||||||
|
* @return true if the port passed validation.
|
||||||
|
*/
|
||||||
|
static bool verifyRelayChannel(DigitalPort *port, int32_t *status) {
|
||||||
|
if (port == NULL) {
|
||||||
|
*status = NULL_PARAMETER;
|
||||||
|
return false;
|
||||||
|
} else if (!checkRelayChannel(port)) {
|
||||||
|
*status = PARAMETER_OUT_OF_RANGE;
|
||||||
|
return false;
|
||||||
|
} else {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Map DIO pin numbers from their physical number (10 to 26) to their position
|
* Map DIO pin numbers from their physical number (10 to 26) to their position
|
||||||
* in the bit field.
|
* in the bit field.
|
||||||
@@ -185,7 +223,7 @@ uint32_t remapMXPPWMChannel(uint32_t pin) {
|
|||||||
*/
|
*/
|
||||||
void setPWM(void* digital_port_pointer, unsigned short value, int32_t *status) {
|
void setPWM(void* digital_port_pointer, unsigned short value, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
checkPWMChannel(port);
|
if (!verifyPWMChannel(port, status)) { return; }
|
||||||
|
|
||||||
if(port->port.pin < tPWM::kNumHdrRegisters) {
|
if(port->port.pin < tPWM::kNumHdrRegisters) {
|
||||||
pwmSystem->writeHdr(port->port.pin, value, status);
|
pwmSystem->writeHdr(port->port.pin, value, status);
|
||||||
@@ -202,7 +240,7 @@ void setPWM(void* digital_port_pointer, unsigned short value, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
unsigned short getPWM(void* digital_port_pointer, int32_t *status) {
|
unsigned short getPWM(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
checkPWMChannel(port);
|
if (!verifyPWMChannel(port, status)) { return 0; }
|
||||||
|
|
||||||
if(port->port.pin < tPWM::kNumHdrRegisters) {
|
if(port->port.pin < tPWM::kNumHdrRegisters) {
|
||||||
return pwmSystem->readHdr(port->port.pin, status);
|
return pwmSystem->readHdr(port->port.pin, status);
|
||||||
@@ -213,6 +251,8 @@ unsigned short getPWM(void* digital_port_pointer, int32_t *status) {
|
|||||||
|
|
||||||
void latchPWMZero(void* digital_port_pointer, int32_t *status) {
|
void latchPWMZero(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
|
if (!verifyPWMChannel(port, status)) { return; }
|
||||||
|
|
||||||
pwmSystem->writeZeroLatch(port->port.pin, true, status);
|
pwmSystem->writeZeroLatch(port->port.pin, true, status);
|
||||||
pwmSystem->writeZeroLatch(port->port.pin, false, status);
|
pwmSystem->writeZeroLatch(port->port.pin, false, status);
|
||||||
}
|
}
|
||||||
@@ -225,7 +265,7 @@ void latchPWMZero(void* digital_port_pointer, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
void setPWMPeriodScale(void* digital_port_pointer, uint32_t squelchMask, int32_t *status) {
|
void setPWMPeriodScale(void* digital_port_pointer, uint32_t squelchMask, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
checkPWMChannel(port);
|
if (!verifyPWMChannel(port, status)) { return; }
|
||||||
|
|
||||||
if(port->port.pin < tPWM::kNumPeriodScaleHdrElements) {
|
if(port->port.pin < tPWM::kNumPeriodScaleHdrElements) {
|
||||||
pwmSystem->writePeriodScaleHdr(port->port.pin, squelchMask, status);
|
pwmSystem->writePeriodScaleHdr(port->port.pin, squelchMask, status);
|
||||||
@@ -316,7 +356,10 @@ void setPWMOutputChannel(void* pwmGenerator, uint32_t pin, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
void setRelayForward(void* digital_port_pointer, bool on, int32_t *status) {
|
void setRelayForward(void* digital_port_pointer, bool on, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
checkRelayChannel(port);
|
if (!verifyRelayChannel(port, status)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<priority_recursive_mutex> sync(digitalRelayMutex);
|
std::lock_guard<priority_recursive_mutex> sync(digitalRelayMutex);
|
||||||
uint8_t forwardRelays = relaySystem->readValue_Forward(status);
|
uint8_t forwardRelays = relaySystem->readValue_Forward(status);
|
||||||
@@ -335,7 +378,10 @@ void setRelayForward(void* digital_port_pointer, bool on, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
void setRelayReverse(void* digital_port_pointer, bool on, int32_t *status) {
|
void setRelayReverse(void* digital_port_pointer, bool on, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
checkRelayChannel(port);
|
if (!verifyRelayChannel(port, status)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
std::lock_guard<priority_recursive_mutex> sync(digitalRelayMutex);
|
std::lock_guard<priority_recursive_mutex> sync(digitalRelayMutex);
|
||||||
uint8_t reverseRelays = relaySystem->readValue_Reverse(status);
|
uint8_t reverseRelays = relaySystem->readValue_Reverse(status);
|
||||||
@@ -352,6 +398,8 @@ void setRelayReverse(void* digital_port_pointer, bool on, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
bool getRelayForward(void* digital_port_pointer, int32_t *status) {
|
bool getRelayForward(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
|
if (!verifyRelayChannel(port, status)) { return false; }
|
||||||
|
|
||||||
uint8_t forwardRelays = relaySystem->readValue_Forward(status);
|
uint8_t forwardRelays = relaySystem->readValue_Forward(status);
|
||||||
return (forwardRelays & (1 << port->port.pin)) != 0;
|
return (forwardRelays & (1 << port->port.pin)) != 0;
|
||||||
}
|
}
|
||||||
@@ -361,6 +409,8 @@ bool getRelayForward(void* digital_port_pointer, int32_t *status) {
|
|||||||
*/
|
*/
|
||||||
bool getRelayReverse(void* digital_port_pointer, int32_t *status) {
|
bool getRelayReverse(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
|
if (!verifyRelayChannel(port, status)) { return false; }
|
||||||
|
|
||||||
uint8_t reverseRelays = relaySystem->readValue_Reverse(status);
|
uint8_t reverseRelays = relaySystem->readValue_Reverse(status);
|
||||||
return (reverseRelays & (1 << port->port.pin)) != 0;
|
return (reverseRelays & (1 << port->port.pin)) != 0;
|
||||||
}
|
}
|
||||||
@@ -415,26 +465,30 @@ bool allocateDIO(void* digital_port_pointer, bool input, int32_t *status) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool allocatePWMChannel(void* digital_port_pointer, int32_t *status) {
|
bool allocatePWMChannel(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
char buf[64];
|
if (!verifyPWMChannel(port, status)) { return false; }
|
||||||
snprintf(buf, 64, "PWM %d", port->port.pin);
|
|
||||||
if (PWMChannels->Allocate(port->port.pin, buf) == ~0ul) {
|
char buf[64];
|
||||||
*status = RESOURCE_IS_ALLOCATED;
|
snprintf(buf, 64, "PWM %d", port->port.pin);
|
||||||
return false;
|
if (PWMChannels->Allocate(port->port.pin, buf) == ~0ul) {
|
||||||
|
*status = RESOURCE_IS_ALLOCATED;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (port->port.pin > tPWM::kNumHdrRegisters-1) {
|
if (port->port.pin > tPWM::kNumHdrRegisters-1) {
|
||||||
snprintf(buf, 64, "PWM %d and DIO %d", port->port.pin, remapMXPPWMChannel(port->port.pin) + 10);
|
snprintf(buf, 64, "PWM %d and DIO %d", port->port.pin, remapMXPPWMChannel(port->port.pin) + 10);
|
||||||
if (DIOChannels->Allocate(remapMXPPWMChannel(port->port.pin) + 10, buf) == ~0ul) return false;
|
if (DIOChannels->Allocate(remapMXPPWMChannel(port->port.pin) + 10, buf) == ~0ul) return false;
|
||||||
uint32_t bitToSet = 1 << remapMXPPWMChannel(port->port.pin);
|
uint32_t bitToSet = 1 << remapMXPPWMChannel(port->port.pin);
|
||||||
short specialFunctions = digitalSystem->readEnableMXPSpecialFunction(status);
|
short specialFunctions = digitalSystem->readEnableMXPSpecialFunction(status);
|
||||||
digitalSystem->writeEnableMXPSpecialFunction(specialFunctions | bitToSet, status);
|
digitalSystem->writeEnableMXPSpecialFunction(specialFunctions | bitToSet, status);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freePWMChannel(void* digital_port_pointer, int32_t *status) {
|
void freePWMChannel(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
|
if (!verifyPWMChannel(port, status)) { return; }
|
||||||
|
|
||||||
PWMChannels->Free(port->port.pin);
|
PWMChannels->Free(port->port.pin);
|
||||||
if(port->port.pin > tPWM::kNumHdrRegisters-1) {
|
if(port->port.pin > tPWM::kNumHdrRegisters-1) {
|
||||||
DIOChannels->Free(remapMXPPWMChannel(port->port.pin) + 10);
|
DIOChannels->Free(remapMXPPWMChannel(port->port.pin) + 10);
|
||||||
@@ -529,7 +583,7 @@ bool getDIO(void* digital_port_pointer, int32_t *status) {
|
|||||||
bool getDIODirection(void* digital_port_pointer, int32_t *status) {
|
bool getDIODirection(void* digital_port_pointer, int32_t *status) {
|
||||||
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
DigitalPort* port = (DigitalPort*) digital_port_pointer;
|
||||||
tDIO::tOutputEnable currentOutputEnable = digitalSystem->readOutputEnable(status);
|
tDIO::tOutputEnable currentOutputEnable = digitalSystem->readOutputEnable(status);
|
||||||
//Shift 00000001 over port->port.pin-1 places.
|
//Shift 00000001 over port->port.pin-1 places.
|
||||||
//AND it against the currentOutputEnable
|
//AND it against the currentOutputEnable
|
||||||
//if it == 0, then return false
|
//if it == 0, then return false
|
||||||
//else return true
|
//else return true
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ bool getSolenoid(void* solenoid_port_pointer, int32_t *status) {
|
|||||||
void setSolenoid(void* solenoid_port_pointer, bool value, int32_t *status) {
|
void setSolenoid(void* solenoid_port_pointer, bool value, int32_t *status) {
|
||||||
solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
|
solenoid_port_t* port = (solenoid_port_t*) solenoid_port_pointer;
|
||||||
|
|
||||||
port->module->SetSolenoid(port->pin, value);
|
*status = port->module->SetSolenoid(port->pin, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
int getPCMSolenoidBlackList(void* solenoid_port_pointer, int32_t *status){
|
int getPCMSolenoidBlackList(void* solenoid_port_pointer, int32_t *status){
|
||||||
|
|||||||
Reference in New Issue
Block a user