mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-03 03:01:44 +00:00
Fixed current and potential bugs caught by Coverity
Change-Id: I9f9d09dc797ffea062eeb49c881be1d5acb63d7b
This commit is contained in:
committed by
Peter Johnson
parent
b0fec4089b
commit
055ee09825
@@ -230,7 +230,7 @@ extern "C"
|
|||||||
int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor *desc);
|
int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor *desc);
|
||||||
int HALGetJoystickIsXbox(uint8_t joystickNum);
|
int HALGetJoystickIsXbox(uint8_t joystickNum);
|
||||||
int HALGetJoystickType(uint8_t joystickNum);
|
int HALGetJoystickType(uint8_t joystickNum);
|
||||||
const char* HALGetJoystickName(uint8_t joystickNum);
|
char* HALGetJoystickName(uint8_t joystickNum);
|
||||||
int HALGetJoystickAxisType(uint8_t joystickNum, uint8_t axis);
|
int HALGetJoystickAxisType(uint8_t joystickNum, uint8_t axis);
|
||||||
int HALSetJoystickOutputs(uint8_t joystickNum, uint32_t outputs, uint16_t leftRumble, uint16_t rightRumble);
|
int HALSetJoystickOutputs(uint8_t joystickNum, uint32_t outputs, uint16_t leftRumble, uint16_t rightRumble);
|
||||||
int HALGetMatchTime(float *matchTime);
|
int HALGetMatchTime(float *matchTime);
|
||||||
|
|||||||
@@ -273,7 +273,9 @@ uint32_t getAnalogOversampleBits(void* analog_port_pointer, int32_t *status) {
|
|||||||
int16_t getAnalogValue(void* analog_port_pointer, int32_t *status) {
|
int16_t getAnalogValue(void* analog_port_pointer, int32_t *status) {
|
||||||
AnalogPort* port = (AnalogPort*) analog_port_pointer;
|
AnalogPort* port = (AnalogPort*) analog_port_pointer;
|
||||||
int16_t value;
|
int16_t value;
|
||||||
checkAnalogInputChannel(port->port.pin);
|
if (!checkAnalogInputChannel(port->port.pin)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
tAI::tReadSelect readSelect;
|
tAI::tReadSelect readSelect;
|
||||||
readSelect.Channel = port->port.pin;
|
readSelect.Channel = port->port.pin;
|
||||||
@@ -304,7 +306,9 @@ int16_t getAnalogValue(void* analog_port_pointer, int32_t *status) {
|
|||||||
int32_t getAnalogAverageValue(void* analog_port_pointer, int32_t *status) {
|
int32_t getAnalogAverageValue(void* analog_port_pointer, int32_t *status) {
|
||||||
AnalogPort* port = (AnalogPort*) analog_port_pointer;
|
AnalogPort* port = (AnalogPort*) analog_port_pointer;
|
||||||
int32_t value;
|
int32_t value;
|
||||||
checkAnalogInputChannel(port->port.pin);
|
if (!checkAnalogInputChannel(port->port.pin)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
tAI::tReadSelect readSelect;
|
tAI::tReadSelect readSelect;
|
||||||
readSelect.Channel = port->port.pin;
|
readSelect.Channel = port->port.pin;
|
||||||
|
|||||||
@@ -126,11 +126,11 @@ void initializeDigital(int32_t *status) {
|
|||||||
// Ensure that PWM output values are set to OFF
|
// Ensure that PWM output values are set to OFF
|
||||||
for (uint32_t pwm_index = 0; pwm_index < kPwmPins; pwm_index++) {
|
for (uint32_t pwm_index = 0; pwm_index < kPwmPins; pwm_index++) {
|
||||||
// Initialize port structure
|
// Initialize port structure
|
||||||
DigitalPort* digital_port = new DigitalPort();
|
DigitalPort digital_port;
|
||||||
digital_port->port.pin = pwm_index;
|
digital_port.port.pin = pwm_index;
|
||||||
|
|
||||||
setPWM(digital_port, kPwmDisabled, status);
|
setPWM(&digital_port, kPwmDisabled, status);
|
||||||
setPWMPeriodScale(digital_port, 3, status); // Set all to 4x by default.
|
setPWMPeriodScale(&digital_port, 3, status); // Set all to 4x by default.
|
||||||
}
|
}
|
||||||
|
|
||||||
digitalSystemsInitialized = true;
|
digitalSystemsInitialized = true;
|
||||||
|
|||||||
@@ -209,7 +209,7 @@ CTR_Code PCM::FireOneShotSolenoid(UINT8 idx)
|
|||||||
CTR_Code PCM::SetOneShotDurationMs(UINT8 idx,uint32_t durMs)
|
CTR_Code PCM::SetOneShotDurationMs(UINT8 idx,uint32_t durMs)
|
||||||
{
|
{
|
||||||
/* sanity check caller's param */
|
/* sanity check caller's param */
|
||||||
if(idx > 8)
|
if(idx > 7)
|
||||||
return CTR_InvalidParamValue;
|
return CTR_InvalidParamValue;
|
||||||
/* get latest tx frame */
|
/* get latest tx frame */
|
||||||
CtreCanNode::txTask<PcmControlSetOneShotDur_t> toFill = GetTx<PcmControlSetOneShotDur_t>(CONTROL_3 | GetDeviceNumber());
|
CtreCanNode::txTask<PcmControlSetOneShotDur_t> toFill = GetTx<PcmControlSetOneShotDur_t>(CONTROL_3 | GetDeviceNumber());
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
//This file must compile on ALL PLATFORMS. Be very careful what you put in here.
|
//This file must compile on ALL PLATFORMS. Be very careful what you put in here.
|
||||||
#include "HAL/HAL.hpp"
|
#include "HAL/HAL.hpp"
|
||||||
#include "FRC_NetworkCommunication/FRCComm.h"
|
#include "FRC_NetworkCommunication/FRCComm.h"
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
int HALGetControlWord(HALControlWord *data)
|
int HALGetControlWord(HALControlWord *data)
|
||||||
{
|
{
|
||||||
@@ -62,17 +63,20 @@ int HALGetJoystickType(uint8_t joystickNum)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* HALGetJoystickName(uint8_t joystickNum)
|
char* HALGetJoystickName(uint8_t joystickNum)
|
||||||
{
|
{
|
||||||
HALJoystickDescriptor joystickDesc;
|
HALJoystickDescriptor joystickDesc;
|
||||||
if(HALGetJoystickDescriptor(joystickNum, &joystickDesc)<0)
|
if(HALGetJoystickDescriptor(joystickNum, &joystickDesc)<0)
|
||||||
{
|
{
|
||||||
const char* retval = "";
|
char* name = (char*)std::malloc(1);
|
||||||
return retval;
|
name[0] = '\0';
|
||||||
|
return name;
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
const char* retval(joystickDesc.name);
|
size_t len = std::strlen(joystickDesc.name);
|
||||||
return retval;
|
char* name = (char*)std::malloc(len+1);
|
||||||
|
std::strcpy(name, joystickDesc.name);
|
||||||
|
return name;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ class AnalogAccelerometer : public SensorBase,
|
|||||||
std::shared_ptr<AnalogInput> m_analogInput;
|
std::shared_ptr<AnalogInput> m_analogInput;
|
||||||
float m_voltsPerG = 1.0;
|
float m_voltsPerG = 1.0;
|
||||||
float m_zeroGVoltage = 2.5;
|
float m_zeroGVoltage = 2.5;
|
||||||
bool m_allocatedChannel;
|
|
||||||
|
|
||||||
std::shared_ptr<ITable> m_table;
|
std::shared_ptr<ITable> m_table;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "SensorBase.h"
|
#include "SensorBase.h"
|
||||||
#include "LiveWindow/LiveWindowSendable.h"
|
#include "LiveWindow/LiveWindowSendable.h"
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* MXP analog output class.
|
* MXP analog output class.
|
||||||
|
|||||||
@@ -87,5 +87,4 @@ class AnalogPotentiometer : public Potentiometer, public LiveWindowSendable {
|
|||||||
std::shared_ptr<AnalogInput> m_analog_input;
|
std::shared_ptr<AnalogInput> m_analog_input;
|
||||||
double m_fullRange, m_offset;
|
double m_fullRange, m_offset;
|
||||||
std::shared_ptr<ITable> m_table;
|
std::shared_ptr<ITable> m_table;
|
||||||
bool m_init_analog_input;
|
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -177,7 +177,7 @@ class CANJaguar : public MotorSafety,
|
|||||||
float m_value = 0.0f;
|
float m_value = 0.0f;
|
||||||
|
|
||||||
// Parameters/configuration
|
// Parameters/configuration
|
||||||
ControlMode m_controlMode;
|
ControlMode m_controlMode = kPercentVbus;
|
||||||
uint8_t m_speedReference = LM_REF_NONE;
|
uint8_t m_speedReference = LM_REF_NONE;
|
||||||
uint8_t m_positionReference = LM_REF_NONE;
|
uint8_t m_positionReference = LM_REF_NONE;
|
||||||
double m_p = 0.0;
|
double m_p = 0.0;
|
||||||
@@ -227,7 +227,7 @@ class CANJaguar : public MotorSafety,
|
|||||||
mutable std::atomic<bool> m_receivedStatusMessage1{false};
|
mutable std::atomic<bool> m_receivedStatusMessage1{false};
|
||||||
mutable std::atomic<bool> m_receivedStatusMessage2{false};
|
mutable std::atomic<bool> m_receivedStatusMessage2{false};
|
||||||
|
|
||||||
bool m_controlEnabled;
|
bool m_controlEnabled = false;
|
||||||
|
|
||||||
void verify();
|
void verify();
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "LiveWindow/LiveWindowSendable.h"
|
#include "LiveWindow/LiveWindowSendable.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class to read a digital input.
|
* Class to read a digital input.
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ class InterruptableSensorBase : public SensorBase {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void *m_interrupt = nullptr;
|
void *m_interrupt = nullptr;
|
||||||
uint32_t m_interruptIndex;
|
uint32_t m_interruptIndex = std::numeric_limits<uint32_t>::max();
|
||||||
void AllocateInterrupts(bool watcher);
|
void AllocateInterrupts(bool watcher);
|
||||||
|
|
||||||
static std::unique_ptr<Resource> m_interrupts;
|
static std::unique_ptr<Resource> m_interrupts;
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ class SPI : public SensorBase {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
uint8_t m_port;
|
uint8_t m_port;
|
||||||
bool m_msbFirst;
|
bool m_msbFirst = false; // default little-endian
|
||||||
bool m_sampleOnTrailing;
|
bool m_sampleOnTrailing = false; // default data updated on falling edge
|
||||||
bool m_clk_idle_high;
|
bool m_clk_idle_high = false; // default clock active high
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void Init();
|
void Init();
|
||||||
|
|||||||
@@ -101,8 +101,7 @@ class Ultrasonic : public SensorBase,
|
|||||||
|
|
||||||
std::shared_ptr<DigitalOutput> m_pingChannel;
|
std::shared_ptr<DigitalOutput> m_pingChannel;
|
||||||
std::shared_ptr<DigitalInput> m_echoChannel;
|
std::shared_ptr<DigitalInput> m_echoChannel;
|
||||||
bool m_allocatedChannels;
|
bool m_enabled = false;
|
||||||
bool m_enabled;
|
|
||||||
Counter m_counter;
|
Counter m_counter;
|
||||||
Ultrasonic *m_nextSensor;
|
Ultrasonic *m_nextSensor;
|
||||||
DistanceUnit m_units;
|
DistanceUnit m_units;
|
||||||
|
|||||||
@@ -88,7 +88,10 @@ AnalogGyro::AnalogGyro(std::shared_ptr<AnalogInput> channel)
|
|||||||
* significant
|
* significant
|
||||||
* drift in the gyro and it needs to be recalibrated after it has been running.
|
* drift in the gyro and it needs to be recalibrated after it has been running.
|
||||||
*/
|
*/
|
||||||
void AnalogGyro::Reset() { m_analog->ResetAccumulator(); }
|
void AnalogGyro::Reset() {
|
||||||
|
if (StatusIsFatal()) return;
|
||||||
|
m_analog->ResetAccumulator();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@inheritDoc}
|
* {@inheritDoc}
|
||||||
@@ -127,6 +130,8 @@ void AnalogGyro::Calibrate() {
|
|||||||
* of the returned rate from the gyro.
|
* of the returned rate from the gyro.
|
||||||
*/
|
*/
|
||||||
float AnalogGyro::GetAngle() const {
|
float AnalogGyro::GetAngle() const {
|
||||||
|
if (StatusIsFatal()) return 0.f;
|
||||||
|
|
||||||
int64_t rawValue;
|
int64_t rawValue;
|
||||||
uint32_t count;
|
uint32_t count;
|
||||||
m_analog->GetAccumulatorOutput(rawValue, count);
|
m_analog->GetAccumulatorOutput(rawValue, count);
|
||||||
@@ -148,6 +153,8 @@ float AnalogGyro::GetAngle() const {
|
|||||||
* @return the current rate in degrees per second
|
* @return the current rate in degrees per second
|
||||||
*/
|
*/
|
||||||
double AnalogGyro::GetRate() const {
|
double AnalogGyro::GetRate() const {
|
||||||
|
if (StatusIsFatal()) return 0.0;
|
||||||
|
|
||||||
return (m_analog->GetAverageValue() - ((double)m_center + m_offset)) * 1e-9 *
|
return (m_analog->GetAverageValue() - ((double)m_center + m_offset)) * 1e-9 *
|
||||||
m_analog->GetLSBWeight() /
|
m_analog->GetLSBWeight() /
|
||||||
((1 << m_analog->GetOversampleBits()) * m_voltsPerDegreePerSecond);
|
((1 << m_analog->GetOversampleBits()) * m_voltsPerDegreePerSecond);
|
||||||
@@ -176,6 +183,8 @@ void AnalogGyro::SetSensitivity(float voltsPerDegreePerSecond) {
|
|||||||
* @param volts The size of the deadband in volts
|
* @param volts The size of the deadband in volts
|
||||||
*/
|
*/
|
||||||
void AnalogGyro::SetDeadband(float volts) {
|
void AnalogGyro::SetDeadband(float volts) {
|
||||||
|
if (StatusIsFatal()) return;
|
||||||
|
|
||||||
int32_t deadband = volts * 1e9 / m_analog->GetLSBWeight() *
|
int32_t deadband = volts * 1e9 / m_analog->GetLSBWeight() *
|
||||||
(1 << m_analog->GetOversampleBits());
|
(1 << m_analog->GetOversampleBits());
|
||||||
m_analog->SetAccumulatorDeadband(deadband);
|
m_analog->SetAccumulatorDeadband(deadband);
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "Timer.h"
|
#include "Timer.h"
|
||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
#include "LiveWindow/LiveWindow.h"
|
#include "LiveWindow/LiveWindow.h"
|
||||||
|
#include "HAL/Port.h"
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
@@ -43,10 +44,11 @@ AnalogInput::AnalogInput(uint32_t channel) {
|
|||||||
|
|
||||||
m_channel = channel;
|
m_channel = channel;
|
||||||
|
|
||||||
void *port = getPort(channel);
|
void* port = getPort(channel);
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
m_port = initializeAnalogInputPort(port, &status);
|
m_port = initializeAnalogInputPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
|
|
||||||
LiveWindow::GetInstance()->AddSensor("AnalogInput", channel, this);
|
LiveWindow::GetInstance()->AddSensor("AnalogInput", channel, this);
|
||||||
HALReport(HALUsageReporting::kResourceType_AnalogChannel, channel);
|
HALReport(HALUsageReporting::kResourceType_AnalogChannel, channel);
|
||||||
|
|||||||
@@ -9,7 +9,9 @@
|
|||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
#include "LiveWindow/LiveWindow.h"
|
#include "LiveWindow/LiveWindow.h"
|
||||||
|
#include "HAL/Port.h"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
static std::unique_ptr<Resource> outputs;
|
static std::unique_ptr<Resource> outputs;
|
||||||
@@ -27,21 +29,26 @@ AnalogOutput::AnalogOutput(uint32_t channel) {
|
|||||||
|
|
||||||
if (!checkAnalogOutputChannel(channel)) {
|
if (!checkAnalogOutputChannel(channel)) {
|
||||||
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
||||||
|
m_channel = std::numeric_limits<uint32_t>::max();
|
||||||
|
m_port = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (outputs->Allocate(channel, buf.str()) ==
|
if (outputs->Allocate(channel, buf.str()) ==
|
||||||
std::numeric_limits<uint32_t>::max()) {
|
std::numeric_limits<uint32_t>::max()) {
|
||||||
CloneError(*outputs);
|
CloneError(*outputs);
|
||||||
|
m_channel = std::numeric_limits<uint32_t>::max();
|
||||||
|
m_port = nullptr;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_channel = channel;
|
m_channel = channel;
|
||||||
|
|
||||||
void *port = getPort(m_channel);
|
void* port = getPort(m_channel);
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
m_port = initializeAnalogOutputPort(port, &status);
|
m_port = initializeAnalogOutputPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
|
|
||||||
LiveWindow::GetInstance()->AddActuator("AnalogOutput", m_channel, this);
|
LiveWindow::GetInstance()->AddActuator("AnalogOutput", m_channel, this);
|
||||||
HALReport(HALUsageReporting::kResourceType_AnalogOutput, m_channel);
|
HALReport(HALUsageReporting::kResourceType_AnalogOutput, m_channel);
|
||||||
|
|||||||
@@ -11,6 +11,8 @@
|
|||||||
//#include "NetworkCommunication/UsageReporting.h"
|
//#include "NetworkCommunication/UsageReporting.h"
|
||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
|
#include "HAL/Port.h"
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -20,11 +22,12 @@
|
|||||||
* on-board 4-7 are on the MXP port.
|
* on-board 4-7 are on the MXP port.
|
||||||
*/
|
*/
|
||||||
AnalogTrigger::AnalogTrigger(int32_t channel) {
|
AnalogTrigger::AnalogTrigger(int32_t channel) {
|
||||||
void *port = getPort(channel);
|
void* port = getPort(channel);
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
uint32_t index = 0;
|
uint32_t index = 0;
|
||||||
m_trigger = initializeAnalogTrigger(port, &index, &status);
|
m_trigger = initializeAnalogTrigger(port, &index, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
m_index = index;
|
m_index = index;
|
||||||
|
|
||||||
HALReport(HALUsageReporting::kResourceType_AnalogTrigger, channel);
|
HALReport(HALUsageReporting::kResourceType_AnalogTrigger, channel);
|
||||||
|
|||||||
@@ -149,7 +149,10 @@ unsigned int CameraServer::GetQuality() {
|
|||||||
void CameraServer::Serve() {
|
void CameraServer::Serve() {
|
||||||
int sock = socket(AF_INET, SOCK_STREAM, 0);
|
int sock = socket(AF_INET, SOCK_STREAM, 0);
|
||||||
|
|
||||||
if (sock == -1) wpi_setErrnoError();
|
if (sock == -1) {
|
||||||
|
wpi_setErrnoError();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
int reuseAddr = 1;
|
int reuseAddr = 1;
|
||||||
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseAddr,
|
if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseAddr,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
#include "LiveWindow/LiveWindow.h"
|
#include "LiveWindow/LiveWindow.h"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -25,6 +26,7 @@ DigitalInput::DigitalInput(uint32_t channel) {
|
|||||||
if (!CheckDigitalChannel(channel)) {
|
if (!CheckDigitalChannel(channel)) {
|
||||||
buf << "Digital Channel " << channel;
|
buf << "Digital Channel " << channel;
|
||||||
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
||||||
|
m_channel = std::numeric_limits<uint32_t>::max();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_channel = channel;
|
m_channel = channel;
|
||||||
|
|||||||
@@ -9,6 +9,7 @@
|
|||||||
#include "Resource.h"
|
#include "Resource.h"
|
||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -21,13 +22,14 @@
|
|||||||
DigitalOutput::DigitalOutput(uint32_t channel) {
|
DigitalOutput::DigitalOutput(uint32_t channel) {
|
||||||
std::stringstream buf;
|
std::stringstream buf;
|
||||||
|
|
||||||
|
m_pwmGenerator = (void *)std::numeric_limits<uint32_t>::max();
|
||||||
if (!CheckDigitalChannel(channel)) {
|
if (!CheckDigitalChannel(channel)) {
|
||||||
buf << "Digital Channel " << channel;
|
buf << "Digital Channel " << channel;
|
||||||
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
||||||
|
m_channel = std::numeric_limits<uint32_t>::max();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_channel = channel;
|
m_channel = channel;
|
||||||
m_pwmGenerator = (void *)std::numeric_limits<uint32_t>::max();
|
|
||||||
|
|
||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
allocateDIO(m_digital_ports[channel], false, &status);
|
allocateDIO(m_digital_ports[channel], false, &status);
|
||||||
|
|||||||
@@ -107,7 +107,6 @@ void PIDController::Calculate() {
|
|||||||
pidInput = m_pidInput;
|
pidInput = m_pidInput;
|
||||||
pidOutput = m_pidOutput;
|
pidOutput = m_pidOutput;
|
||||||
enabled = m_enabled;
|
enabled = m_enabled;
|
||||||
pidInput = m_pidInput;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pidInput == nullptr) return;
|
if (pidInput == nullptr) return;
|
||||||
|
|||||||
@@ -56,8 +56,10 @@ RobotBase::RobotBase() : m_ds(DriverStation::GetInstance()) {
|
|||||||
FILE *file = nullptr;
|
FILE *file = nullptr;
|
||||||
file = fopen("/tmp/frc_versions/FRC_Lib_Version.ini", "w");
|
file = fopen("/tmp/frc_versions/FRC_Lib_Version.ini", "w");
|
||||||
|
|
||||||
fputs("2016 C++ Beta2.0", file);
|
if (file != nullptr) {
|
||||||
if (file != nullptr) fclose(file);
|
fputs("2016 C++ Beta2.0", file);
|
||||||
|
fclose(file);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
#include "NetworkCommunication/LoadOut.h"
|
#include "NetworkCommunication/LoadOut.h"
|
||||||
#include "WPIErrors.h"
|
#include "WPIErrors.h"
|
||||||
#include "HAL/HAL.hpp"
|
#include "HAL/HAL.hpp"
|
||||||
|
#include "HAL/Port.h"
|
||||||
|
|
||||||
const uint32_t SensorBase::kDigitalChannels;
|
const uint32_t SensorBase::kDigitalChannels;
|
||||||
const uint32_t SensorBase::kAnalogInputs;
|
const uint32_t SensorBase::kAnalogInputs;
|
||||||
@@ -36,6 +37,7 @@ SensorBase::SensorBase() {
|
|||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
m_digital_ports[i] = initializeDigitalPort(port, &status);
|
m_digital_ports[i] = initializeDigitalPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < kRelayChannels; i++) {
|
for (uint32_t i = 0; i < kRelayChannels; i++) {
|
||||||
@@ -43,6 +45,7 @@ SensorBase::SensorBase() {
|
|||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
m_relay_ports[i] = initializeDigitalPort(port, &status);
|
m_relay_ports[i] = initializeDigitalPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (uint32_t i = 0; i < kPwmChannels; i++) {
|
for (uint32_t i = 0; i < kPwmChannels; i++) {
|
||||||
@@ -50,6 +53,7 @@ SensorBase::SensorBase() {
|
|||||||
int32_t status = 0;
|
int32_t status = 0;
|
||||||
m_pwm_ports[i] = initializeDigitalPort(port, &status);
|
m_pwm_ports[i] = initializeDigitalPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ SolenoidBase::SolenoidBase(uint8_t moduleNumber)
|
|||||||
SolenoidBase::m_ports[moduleNumber][i] =
|
SolenoidBase::m_ports[moduleNumber][i] =
|
||||||
initializeSolenoidPort(port, &status);
|
initializeSolenoidPort(port, &status);
|
||||||
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
||||||
|
freePort(port);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -126,6 +126,8 @@ Ultrasonic::Ultrasonic(DigitalOutput *pingChannel, DigitalInput *echoChannel,
|
|||||||
m_counter(m_echoChannel) {
|
m_counter(m_echoChannel) {
|
||||||
if (pingChannel == nullptr || echoChannel == nullptr) {
|
if (pingChannel == nullptr || echoChannel == nullptr) {
|
||||||
wpi_setWPIError(NullParameter);
|
wpi_setWPIError(NullParameter);
|
||||||
|
m_nextSensor = nullptr;
|
||||||
|
m_units = units;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
m_units = units;
|
m_units = units;
|
||||||
|
|||||||
@@ -117,8 +117,10 @@ HSLImage *AxisCamera::GetImage() {
|
|||||||
int AxisCamera::CopyJPEG(char **destImage, unsigned int &destImageSize,
|
int AxisCamera::CopyJPEG(char **destImage, unsigned int &destImageSize,
|
||||||
unsigned int &destImageBufferSize) {
|
unsigned int &destImageBufferSize) {
|
||||||
std::lock_guard<priority_mutex> lock(m_imageDataMutex);
|
std::lock_guard<priority_mutex> lock(m_imageDataMutex);
|
||||||
if (destImage == nullptr)
|
if (destImage == nullptr) {
|
||||||
wpi_setWPIErrorWithContext(NullParameter, "destImage must not be nullptr");
|
wpi_setWPIErrorWithContext(NullParameter, "destImage must not be nullptr");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (m_imageData.size() == 0) return 0; // if no source image
|
if (m_imageData.size() == 0) return 0; // if no source image
|
||||||
|
|
||||||
@@ -440,6 +442,7 @@ void AxisCamera::ReadImagesFromCamera() {
|
|||||||
wpi_setWPIErrorWithContext(IncompatibleMode,
|
wpi_setWPIErrorWithContext(IncompatibleMode,
|
||||||
"No content-length token found in packet");
|
"No content-length token found in packet");
|
||||||
close(m_cameraSocket);
|
close(m_cameraSocket);
|
||||||
|
if (imgBuffer) delete[] imgBuffer;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
contentLength = contentLength + 16; // skip past "content length"
|
contentLength = contentLength + 16; // skip past "content length"
|
||||||
@@ -564,8 +567,10 @@ int AxisCamera::CreateCameraSocket(std::string const &requestString,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (getaddrinfo(m_cameraHost.c_str(), "80", nullptr, &address) == -1) {
|
if (getaddrinfo(m_cameraHost.c_str(), "80", nullptr, &address) == -1) {
|
||||||
if (setError)
|
if (setError) {
|
||||||
wpi_setErrnoErrorWithContext("Failed to create the camera socket");
|
wpi_setErrnoErrorWithContext("Failed to create the camera socket");
|
||||||
|
close(camSocket);
|
||||||
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -573,10 +578,13 @@ int AxisCamera::CreateCameraSocket(std::string const &requestString,
|
|||||||
if (connect(camSocket, address->ai_addr, address->ai_addrlen) == -1) {
|
if (connect(camSocket, address->ai_addr, address->ai_addrlen) == -1) {
|
||||||
if (setError)
|
if (setError)
|
||||||
wpi_setErrnoErrorWithContext("Failed to connect to the camera");
|
wpi_setErrnoErrorWithContext("Failed to connect to the camera");
|
||||||
|
freeaddrinfo(address);
|
||||||
close(camSocket);
|
close(camSocket);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
freeaddrinfo(address);
|
||||||
|
|
||||||
int sent = send(camSocket, requestString.c_str(), requestString.size(), 0);
|
int sent = send(camSocket, requestString.c_str(), requestString.size(), 0);
|
||||||
if (sent == -1) {
|
if (sent == -1) {
|
||||||
if (setError)
|
if (setError)
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ void dprintf(const char *tempString, ...) /* Variable argument list */
|
|||||||
for (index = 0; index < tempStringLen; index++) {
|
for (index = 0; index < tempStringLen; index++) {
|
||||||
if (tempString[index] == ' ') {
|
if (tempString[index] == ' ') {
|
||||||
printf("ERROR in dprintf: malformed calling sequence (%s)\n", tempString);
|
printf("ERROR in dprintf: malformed calling sequence (%s)\n", tempString);
|
||||||
|
va_end(args);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (tempString[index] == '\\' || tempString[index] == '/')
|
if (tempString[index] == '\\' || tempString[index] == '/')
|
||||||
@@ -292,6 +293,7 @@ int processFile(char *inputFile, char *outputString, int lineNumber) {
|
|||||||
FILE *infile;
|
FILE *infile;
|
||||||
const int stringSize = 80; // max size of one line in file
|
const int stringSize = 80; // max size of one line in file
|
||||||
char inputStr[stringSize];
|
char inputStr[stringSize];
|
||||||
|
inputStr[0] = '\0';
|
||||||
int lineCount = 0;
|
int lineCount = 0;
|
||||||
|
|
||||||
if (lineNumber < 0) return (-1);
|
if (lineNumber < 0) return (-1);
|
||||||
@@ -323,14 +325,10 @@ int processFile(char *inputFile, char *outputString, int lineNumber) {
|
|||||||
if (lineNumber == 0) return (lineCount);
|
if (lineNumber == 0) return (lineCount);
|
||||||
// check for input out of range
|
// check for input out of range
|
||||||
if (lineNumber > lineCount) return (-1);
|
if (lineNumber > lineCount) return (-1);
|
||||||
// return the line selected
|
// return the line selected; lineCount guaranteed to be greater than zero
|
||||||
if (lineCount) {
|
stripString(inputStr);
|
||||||
stripString(inputStr);
|
strcpy(outputString, inputStr);
|
||||||
strcpy(outputString, inputStr);
|
return (lineCount);
|
||||||
return (lineCount);
|
|
||||||
} else {
|
|
||||||
return (-1);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Ignore empty string
|
/** Ignore empty string
|
||||||
|
|||||||
@@ -70,6 +70,7 @@ int frcDispose(const char* functionName, ...) /* Variable argument list */
|
|||||||
}
|
}
|
||||||
disposalPtr = va_arg(disposalPtrList, void*);
|
disposalPtr = va_arg(disposalPtrList, void*);
|
||||||
}
|
}
|
||||||
|
va_end(disposalPtrList);
|
||||||
return returnValue;
|
return returnValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ class CommandGroupEntry {
|
|||||||
CommandGroupEntry(Command *command, Sequence state, double timeout = -1.0);
|
CommandGroupEntry(Command *command, Sequence state, double timeout = -1.0);
|
||||||
bool IsTimedOut() const;
|
bool IsTimedOut() const;
|
||||||
|
|
||||||
double m_timeout;
|
double m_timeout = -1.0;
|
||||||
Command *m_command = nullptr;
|
Command *m_command = nullptr;
|
||||||
Sequence m_state = kSequence_InSequence;
|
Sequence m_state = kSequence_InSequence;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
struct LiveWindowComponent {
|
struct LiveWindowComponent {
|
||||||
std::string subsystem;
|
std::string subsystem;
|
||||||
std::string name;
|
std::string name;
|
||||||
bool isSensor;
|
bool isSensor = false;
|
||||||
|
|
||||||
LiveWindowComponent() = default;
|
LiveWindowComponent() = default;
|
||||||
LiveWindowComponent(std::string subsystem, std::string name, bool isSensor) {
|
LiveWindowComponent(std::string subsystem, std::string name, bool isSensor) {
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ class PIDController : public LiveWindowSendable,
|
|||||||
float m_minimumInput = 0; // minimum input - limit setpoint to this
|
float m_minimumInput = 0; // minimum input - limit setpoint to this
|
||||||
bool m_continuous = false; // do the endpoints wrap around? eg. Absolute encoder
|
bool m_continuous = false; // do the endpoints wrap around? eg. Absolute encoder
|
||||||
bool m_enabled = false; // is the pid controller enabled
|
bool m_enabled = false; // is the pid controller enabled
|
||||||
bool m_destruct; // should the calculate thread stop running
|
|
||||||
float m_prevInput = 0; // the prior sensor input (used to compute velocity)
|
float m_prevInput = 0; // the prior sensor input (used to compute velocity)
|
||||||
double m_totalError = 0; // the sum of the errors for use in the integral calc
|
double m_totalError = 0; // the sum of the errors for use in the integral calc
|
||||||
enum {
|
enum {
|
||||||
@@ -105,7 +104,7 @@ class PIDController : public LiveWindowSendable,
|
|||||||
// the percetage or absolute error that is considered on target.
|
// the percetage or absolute error that is considered on target.
|
||||||
float m_tolerance = 0.05;
|
float m_tolerance = 0.05;
|
||||||
float m_setpoint = 0;
|
float m_setpoint = 0;
|
||||||
float m_error;
|
float m_error = 0;
|
||||||
float m_result = 0;
|
float m_result = 0;
|
||||||
float m_period;
|
float m_period;
|
||||||
|
|
||||||
|
|||||||
@@ -56,5 +56,5 @@ class SensorBase : public ErrorBase {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
static SensorBase* m_singletonList;
|
static SensorBase* m_singletonList;
|
||||||
SensorBase* m_nextSingleton;
|
SensorBase* m_nextSingleton = nullptr;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -136,11 +136,7 @@ void LiveWindow::AddSensor(std::string type, int channel,
|
|||||||
LiveWindowSendable *component) {
|
LiveWindowSendable *component) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << type << "[" << channel << "]";
|
oss << type << "[" << channel << "]";
|
||||||
std::string types(oss.str());
|
AddSensor("Ungrouped", oss.str(), component);
|
||||||
auto cc = new char[types.size() + 1];
|
|
||||||
types.copy(cc, types.size());
|
|
||||||
cc[types.size()] = '\0';
|
|
||||||
AddSensor("Ungrouped", cc, component);
|
|
||||||
std::shared_ptr<LiveWindowSendable> component_stl(
|
std::shared_ptr<LiveWindowSendable> component_stl(
|
||||||
component, NullDeleter<LiveWindowSendable>());
|
component, NullDeleter<LiveWindowSendable>());
|
||||||
if (std::find(m_sensors.begin(), m_sensors.end(), component_stl) ==
|
if (std::find(m_sensors.begin(), m_sensors.end(), component_stl) ==
|
||||||
@@ -155,12 +151,8 @@ void LiveWindow::AddActuator(std::string type, int channel,
|
|||||||
LiveWindowSendable *component) {
|
LiveWindowSendable *component) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << type << "[" << channel << "]";
|
oss << type << "[" << channel << "]";
|
||||||
std::string types(oss.str());
|
AddActuator("Ungrouped", oss.str(), std::shared_ptr<LiveWindowSendable>(
|
||||||
auto cc = new char[types.size() + 1];
|
component, [](LiveWindowSendable *) {}));
|
||||||
types.copy(cc, types.size());
|
|
||||||
cc[types.size()] = '\0';
|
|
||||||
AddActuator("Ungrouped", cc, std::shared_ptr<LiveWindowSendable>(
|
|
||||||
component, [](LiveWindowSendable *) {}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -170,12 +162,8 @@ void LiveWindow::AddActuator(std::string type, int module, int channel,
|
|||||||
LiveWindowSendable *component) {
|
LiveWindowSendable *component) {
|
||||||
std::ostringstream oss;
|
std::ostringstream oss;
|
||||||
oss << type << "[" << module << "," << channel << "]";
|
oss << type << "[" << module << "," << channel << "]";
|
||||||
std::string types(oss.str());
|
AddActuator("Ungrouped", oss.str(), std::shared_ptr<LiveWindowSendable>(
|
||||||
auto cc = new char[types.size() + 1];
|
component, [](LiveWindowSendable *) {}));
|
||||||
types.copy(cc, types.size());
|
|
||||||
cc[types.size()] = '\0';
|
|
||||||
AddActuator("Ungrouped", cc, std::shared_ptr<LiveWindowSendable>(
|
|
||||||
component, [](LiveWindowSendable *) {}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -390,7 +390,10 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCom
|
|||||||
(JNIEnv * env, jclass, jbyte port)
|
(JNIEnv * env, jclass, jbyte port)
|
||||||
{
|
{
|
||||||
NETCOMM_LOG(logDEBUG) << "Calling HALGetJoystickName";
|
NETCOMM_LOG(logDEBUG) << "Calling HALGetJoystickName";
|
||||||
return env->NewStringUTF(HALGetJoystickName(port));
|
char* joystickName = HALGetJoystickName(port);
|
||||||
|
jstring str = env->NewStringUTF(joystickName);
|
||||||
|
std::free(joystickName);
|
||||||
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user