diff --git a/hal/include/HAL/HAL.hpp b/hal/include/HAL/HAL.hpp index bf95599b23..60cad32ab7 100644 --- a/hal/include/HAL/HAL.hpp +++ b/hal/include/HAL/HAL.hpp @@ -230,7 +230,7 @@ extern "C" int HALGetJoystickDescriptor(uint8_t joystickNum, HALJoystickDescriptor *desc); int HALGetJoystickIsXbox(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 HALSetJoystickOutputs(uint8_t joystickNum, uint32_t outputs, uint16_t leftRumble, uint16_t rightRumble); int HALGetMatchTime(float *matchTime); diff --git a/hal/lib/Athena/Analog.cpp b/hal/lib/Athena/Analog.cpp index 5a45178736..e56d6585dc 100644 --- a/hal/lib/Athena/Analog.cpp +++ b/hal/lib/Athena/Analog.cpp @@ -273,7 +273,9 @@ uint32_t getAnalogOversampleBits(void* analog_port_pointer, int32_t *status) { int16_t getAnalogValue(void* analog_port_pointer, int32_t *status) { AnalogPort* port = (AnalogPort*) analog_port_pointer; int16_t value; - checkAnalogInputChannel(port->port.pin); + if (!checkAnalogInputChannel(port->port.pin)) { + return 0; + } tAI::tReadSelect readSelect; 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) { AnalogPort* port = (AnalogPort*) analog_port_pointer; int32_t value; - checkAnalogInputChannel(port->port.pin); + if (!checkAnalogInputChannel(port->port.pin)) { + return 0; + } tAI::tReadSelect readSelect; readSelect.Channel = port->port.pin; diff --git a/hal/lib/Athena/Digital.cpp b/hal/lib/Athena/Digital.cpp index 801a6a3287..c99aecca37 100644 --- a/hal/lib/Athena/Digital.cpp +++ b/hal/lib/Athena/Digital.cpp @@ -126,11 +126,11 @@ void initializeDigital(int32_t *status) { // Ensure that PWM output values are set to OFF for (uint32_t pwm_index = 0; pwm_index < kPwmPins; pwm_index++) { // Initialize port structure - DigitalPort* digital_port = new DigitalPort(); - digital_port->port.pin = pwm_index; + DigitalPort digital_port; + digital_port.port.pin = pwm_index; - setPWM(digital_port, kPwmDisabled, status); - setPWMPeriodScale(digital_port, 3, status); // Set all to 4x by default. + setPWM(&digital_port, kPwmDisabled, status); + setPWMPeriodScale(&digital_port, 3, status); // Set all to 4x by default. } digitalSystemsInitialized = true; diff --git a/hal/lib/Athena/ctre/PCM.cpp b/hal/lib/Athena/ctre/PCM.cpp index cd23f3c5ed..58f8bc9002 100644 --- a/hal/lib/Athena/ctre/PCM.cpp +++ b/hal/lib/Athena/ctre/PCM.cpp @@ -209,7 +209,7 @@ CTR_Code PCM::FireOneShotSolenoid(UINT8 idx) CTR_Code PCM::SetOneShotDurationMs(UINT8 idx,uint32_t durMs) { /* sanity check caller's param */ - if(idx > 8) + if(idx > 7) return CTR_InvalidParamValue; /* get latest tx frame */ CtreCanNode::txTask toFill = GetTx(CONTROL_3 | GetDeviceNumber()); diff --git a/hal/lib/Shared/HAL.cpp b/hal/lib/Shared/HAL.cpp index 886ba423e4..978127842c 100644 --- a/hal/lib/Shared/HAL.cpp +++ b/hal/lib/Shared/HAL.cpp @@ -1,6 +1,7 @@ //This file must compile on ALL PLATFORMS. Be very careful what you put in here. #include "HAL/HAL.hpp" #include "FRC_NetworkCommunication/FRCComm.h" +#include 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; if(HALGetJoystickDescriptor(joystickNum, &joystickDesc)<0) { - const char* retval = ""; - return retval; + char* name = (char*)std::malloc(1); + name[0] = '\0'; + return name; } else { - const char* retval(joystickDesc.name); - return retval; + size_t len = std::strlen(joystickDesc.name); + char* name = (char*)std::malloc(len+1); + std::strcpy(name, joystickDesc.name); + return name; } } diff --git a/wpilibc/Athena/include/AnalogAccelerometer.h b/wpilibc/Athena/include/AnalogAccelerometer.h index 4dc5cb77aa..dee50e19f8 100644 --- a/wpilibc/Athena/include/AnalogAccelerometer.h +++ b/wpilibc/Athena/include/AnalogAccelerometer.h @@ -53,7 +53,6 @@ class AnalogAccelerometer : public SensorBase, std::shared_ptr m_analogInput; float m_voltsPerG = 1.0; float m_zeroGVoltage = 2.5; - bool m_allocatedChannel; std::shared_ptr m_table; }; diff --git a/wpilibc/Athena/include/AnalogOutput.h b/wpilibc/Athena/include/AnalogOutput.h index db02d838fe..c30b5c7151 100644 --- a/wpilibc/Athena/include/AnalogOutput.h +++ b/wpilibc/Athena/include/AnalogOutput.h @@ -11,6 +11,7 @@ #include "SensorBase.h" #include "LiveWindow/LiveWindowSendable.h" #include +#include /** * MXP analog output class. diff --git a/wpilibc/Athena/include/AnalogPotentiometer.h b/wpilibc/Athena/include/AnalogPotentiometer.h index 37007669b6..01c29d9cf5 100644 --- a/wpilibc/Athena/include/AnalogPotentiometer.h +++ b/wpilibc/Athena/include/AnalogPotentiometer.h @@ -87,5 +87,4 @@ class AnalogPotentiometer : public Potentiometer, public LiveWindowSendable { std::shared_ptr m_analog_input; double m_fullRange, m_offset; std::shared_ptr m_table; - bool m_init_analog_input; }; diff --git a/wpilibc/Athena/include/CANJaguar.h b/wpilibc/Athena/include/CANJaguar.h index b6eebf623c..5d05d47902 100644 --- a/wpilibc/Athena/include/CANJaguar.h +++ b/wpilibc/Athena/include/CANJaguar.h @@ -177,7 +177,7 @@ class CANJaguar : public MotorSafety, float m_value = 0.0f; // Parameters/configuration - ControlMode m_controlMode; + ControlMode m_controlMode = kPercentVbus; uint8_t m_speedReference = LM_REF_NONE; uint8_t m_positionReference = LM_REF_NONE; double m_p = 0.0; @@ -227,7 +227,7 @@ class CANJaguar : public MotorSafety, mutable std::atomic m_receivedStatusMessage1{false}; mutable std::atomic m_receivedStatusMessage2{false}; - bool m_controlEnabled; + bool m_controlEnabled = false; void verify(); diff --git a/wpilibc/Athena/include/DigitalInput.h b/wpilibc/Athena/include/DigitalInput.h index d47693c863..17a0411395 100644 --- a/wpilibc/Athena/include/DigitalInput.h +++ b/wpilibc/Athena/include/DigitalInput.h @@ -10,6 +10,7 @@ #include "LiveWindow/LiveWindowSendable.h" #include +#include /** * Class to read a digital input. diff --git a/wpilibc/Athena/include/InterruptableSensorBase.h b/wpilibc/Athena/include/InterruptableSensorBase.h index b595c8d46a..d77ae2f048 100644 --- a/wpilibc/Athena/include/InterruptableSensorBase.h +++ b/wpilibc/Athena/include/InterruptableSensorBase.h @@ -45,7 +45,7 @@ class InterruptableSensorBase : public SensorBase { protected: void *m_interrupt = nullptr; - uint32_t m_interruptIndex; + uint32_t m_interruptIndex = std::numeric_limits::max(); void AllocateInterrupts(bool watcher); static std::unique_ptr m_interrupts; diff --git a/wpilibc/Athena/include/SPI.h b/wpilibc/Athena/include/SPI.h index ce29d6c18c..1e7d53d0b5 100644 --- a/wpilibc/Athena/include/SPI.h +++ b/wpilibc/Athena/include/SPI.h @@ -49,9 +49,9 @@ class SPI : public SensorBase { protected: uint8_t m_port; - bool m_msbFirst; - bool m_sampleOnTrailing; - bool m_clk_idle_high; + bool m_msbFirst = false; // default little-endian + bool m_sampleOnTrailing = false; // default data updated on falling edge + bool m_clk_idle_high = false; // default clock active high private: void Init(); diff --git a/wpilibc/Athena/include/Ultrasonic.h b/wpilibc/Athena/include/Ultrasonic.h index e4ba573657..03c9e39cec 100644 --- a/wpilibc/Athena/include/Ultrasonic.h +++ b/wpilibc/Athena/include/Ultrasonic.h @@ -101,8 +101,7 @@ class Ultrasonic : public SensorBase, std::shared_ptr m_pingChannel; std::shared_ptr m_echoChannel; - bool m_allocatedChannels; - bool m_enabled; + bool m_enabled = false; Counter m_counter; Ultrasonic *m_nextSensor; DistanceUnit m_units; diff --git a/wpilibc/Athena/src/AnalogGyro.cpp b/wpilibc/Athena/src/AnalogGyro.cpp index 2a4c3f2c00..7b5dbc115c 100644 --- a/wpilibc/Athena/src/AnalogGyro.cpp +++ b/wpilibc/Athena/src/AnalogGyro.cpp @@ -88,7 +88,10 @@ AnalogGyro::AnalogGyro(std::shared_ptr channel) * significant * 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} @@ -127,6 +130,8 @@ void AnalogGyro::Calibrate() { * of the returned rate from the gyro. */ float AnalogGyro::GetAngle() const { + if (StatusIsFatal()) return 0.f; + int64_t rawValue; uint32_t count; m_analog->GetAccumulatorOutput(rawValue, count); @@ -148,6 +153,8 @@ float AnalogGyro::GetAngle() const { * @return the current rate in degrees per second */ double AnalogGyro::GetRate() const { + if (StatusIsFatal()) return 0.0; + return (m_analog->GetAverageValue() - ((double)m_center + m_offset)) * 1e-9 * m_analog->GetLSBWeight() / ((1 << m_analog->GetOversampleBits()) * m_voltsPerDegreePerSecond); @@ -176,6 +183,8 @@ void AnalogGyro::SetSensitivity(float voltsPerDegreePerSecond) { * @param volts The size of the deadband in volts */ void AnalogGyro::SetDeadband(float volts) { + if (StatusIsFatal()) return; + int32_t deadband = volts * 1e9 / m_analog->GetLSBWeight() * (1 << m_analog->GetOversampleBits()); m_analog->SetAccumulatorDeadband(deadband); diff --git a/wpilibc/Athena/src/AnalogInput.cpp b/wpilibc/Athena/src/AnalogInput.cpp index 540c84ef5b..09ef75f6b7 100644 --- a/wpilibc/Athena/src/AnalogInput.cpp +++ b/wpilibc/Athena/src/AnalogInput.cpp @@ -10,6 +10,7 @@ #include "Timer.h" #include "WPIErrors.h" #include "LiveWindow/LiveWindow.h" +#include "HAL/Port.h" #include @@ -43,10 +44,11 @@ AnalogInput::AnalogInput(uint32_t channel) { m_channel = channel; - void *port = getPort(channel); + void* port = getPort(channel); int32_t status = 0; m_port = initializeAnalogInputPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); LiveWindow::GetInstance()->AddSensor("AnalogInput", channel, this); HALReport(HALUsageReporting::kResourceType_AnalogChannel, channel); diff --git a/wpilibc/Athena/src/AnalogOutput.cpp b/wpilibc/Athena/src/AnalogOutput.cpp index 4905e824a0..74a1f9cc1b 100644 --- a/wpilibc/Athena/src/AnalogOutput.cpp +++ b/wpilibc/Athena/src/AnalogOutput.cpp @@ -9,7 +9,9 @@ #include "Resource.h" #include "WPIErrors.h" #include "LiveWindow/LiveWindow.h" +#include "HAL/Port.h" +#include #include static std::unique_ptr outputs; @@ -27,21 +29,26 @@ AnalogOutput::AnalogOutput(uint32_t channel) { if (!checkAnalogOutputChannel(channel)) { wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str()); + m_channel = std::numeric_limits::max(); + m_port = nullptr; return; } if (outputs->Allocate(channel, buf.str()) == std::numeric_limits::max()) { CloneError(*outputs); + m_channel = std::numeric_limits::max(); + m_port = nullptr; return; } m_channel = channel; - void *port = getPort(m_channel); + void* port = getPort(m_channel); int32_t status = 0; m_port = initializeAnalogOutputPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); LiveWindow::GetInstance()->AddActuator("AnalogOutput", m_channel, this); HALReport(HALUsageReporting::kResourceType_AnalogOutput, m_channel); diff --git a/wpilibc/Athena/src/AnalogTrigger.cpp b/wpilibc/Athena/src/AnalogTrigger.cpp index 47260e2984..cbe627bcf2 100644 --- a/wpilibc/Athena/src/AnalogTrigger.cpp +++ b/wpilibc/Athena/src/AnalogTrigger.cpp @@ -11,6 +11,8 @@ //#include "NetworkCommunication/UsageReporting.h" #include "Resource.h" #include "WPIErrors.h" +#include "HAL/Port.h" + #include /** @@ -20,11 +22,12 @@ * on-board 4-7 are on the MXP port. */ AnalogTrigger::AnalogTrigger(int32_t channel) { - void *port = getPort(channel); + void* port = getPort(channel); int32_t status = 0; uint32_t index = 0; m_trigger = initializeAnalogTrigger(port, &index, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); m_index = index; HALReport(HALUsageReporting::kResourceType_AnalogTrigger, channel); diff --git a/wpilibc/Athena/src/CameraServer.cpp b/wpilibc/Athena/src/CameraServer.cpp index 8565edad7b..af319a4249 100644 --- a/wpilibc/Athena/src/CameraServer.cpp +++ b/wpilibc/Athena/src/CameraServer.cpp @@ -149,7 +149,10 @@ unsigned int CameraServer::GetQuality() { void CameraServer::Serve() { int sock = socket(AF_INET, SOCK_STREAM, 0); - if (sock == -1) wpi_setErrnoError(); + if (sock == -1) { + wpi_setErrnoError(); + return; + } int reuseAddr = 1; if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseAddr, diff --git a/wpilibc/Athena/src/DigitalInput.cpp b/wpilibc/Athena/src/DigitalInput.cpp index acbe186854..e525cc058f 100644 --- a/wpilibc/Athena/src/DigitalInput.cpp +++ b/wpilibc/Athena/src/DigitalInput.cpp @@ -11,6 +11,7 @@ #include "WPIErrors.h" #include "LiveWindow/LiveWindow.h" +#include #include /** @@ -25,6 +26,7 @@ DigitalInput::DigitalInput(uint32_t channel) { if (!CheckDigitalChannel(channel)) { buf << "Digital Channel " << channel; wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str()); + m_channel = std::numeric_limits::max(); return; } m_channel = channel; diff --git a/wpilibc/Athena/src/DigitalOutput.cpp b/wpilibc/Athena/src/DigitalOutput.cpp index 7e4bfee457..bc361c8a86 100644 --- a/wpilibc/Athena/src/DigitalOutput.cpp +++ b/wpilibc/Athena/src/DigitalOutput.cpp @@ -9,6 +9,7 @@ #include "Resource.h" #include "WPIErrors.h" +#include #include /** @@ -21,13 +22,14 @@ DigitalOutput::DigitalOutput(uint32_t channel) { std::stringstream buf; + m_pwmGenerator = (void *)std::numeric_limits::max(); if (!CheckDigitalChannel(channel)) { buf << "Digital Channel " << channel; wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str()); + m_channel = std::numeric_limits::max(); return; } m_channel = channel; - m_pwmGenerator = (void *)std::numeric_limits::max(); int32_t status = 0; allocateDIO(m_digital_ports[channel], false, &status); diff --git a/wpilibc/Athena/src/PIDController.cpp b/wpilibc/Athena/src/PIDController.cpp index ed73b54700..fdbbb5aac2 100644 --- a/wpilibc/Athena/src/PIDController.cpp +++ b/wpilibc/Athena/src/PIDController.cpp @@ -107,7 +107,6 @@ void PIDController::Calculate() { pidInput = m_pidInput; pidOutput = m_pidOutput; enabled = m_enabled; - pidInput = m_pidInput; } if (pidInput == nullptr) return; diff --git a/wpilibc/Athena/src/RobotBase.cpp b/wpilibc/Athena/src/RobotBase.cpp index f5b82dde73..f6a73a41ac 100644 --- a/wpilibc/Athena/src/RobotBase.cpp +++ b/wpilibc/Athena/src/RobotBase.cpp @@ -56,8 +56,10 @@ RobotBase::RobotBase() : m_ds(DriverStation::GetInstance()) { FILE *file = nullptr; file = fopen("/tmp/frc_versions/FRC_Lib_Version.ini", "w"); - fputs("2016 C++ Beta2.0", file); - if (file != nullptr) fclose(file); + if (file != nullptr) { + fputs("2016 C++ Beta2.0", file); + fclose(file); + } } /** diff --git a/wpilibc/Athena/src/SensorBase.cpp b/wpilibc/Athena/src/SensorBase.cpp index 26b06981de..05f9f4fe69 100644 --- a/wpilibc/Athena/src/SensorBase.cpp +++ b/wpilibc/Athena/src/SensorBase.cpp @@ -10,6 +10,7 @@ #include "NetworkCommunication/LoadOut.h" #include "WPIErrors.h" #include "HAL/HAL.hpp" +#include "HAL/Port.h" const uint32_t SensorBase::kDigitalChannels; const uint32_t SensorBase::kAnalogInputs; @@ -36,6 +37,7 @@ SensorBase::SensorBase() { int32_t status = 0; m_digital_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); } for (uint32_t i = 0; i < kRelayChannels; i++) { @@ -43,6 +45,7 @@ SensorBase::SensorBase() { int32_t status = 0; m_relay_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); } for (uint32_t i = 0; i < kPwmChannels; i++) { @@ -50,6 +53,7 @@ SensorBase::SensorBase() { int32_t status = 0; m_pwm_ports[i] = initializeDigitalPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); } } } diff --git a/wpilibc/Athena/src/SolenoidBase.cpp b/wpilibc/Athena/src/SolenoidBase.cpp index 0f06f94241..e063c8e539 100644 --- a/wpilibc/Athena/src/SolenoidBase.cpp +++ b/wpilibc/Athena/src/SolenoidBase.cpp @@ -21,6 +21,7 @@ SolenoidBase::SolenoidBase(uint8_t moduleNumber) SolenoidBase::m_ports[moduleNumber][i] = initializeSolenoidPort(port, &status); wpi_setErrorWithContext(status, getHALErrorMessage(status)); + freePort(port); } } diff --git a/wpilibc/Athena/src/Ultrasonic.cpp b/wpilibc/Athena/src/Ultrasonic.cpp index c2a53f3fd5..69ed10d0af 100644 --- a/wpilibc/Athena/src/Ultrasonic.cpp +++ b/wpilibc/Athena/src/Ultrasonic.cpp @@ -126,6 +126,8 @@ Ultrasonic::Ultrasonic(DigitalOutput *pingChannel, DigitalInput *echoChannel, m_counter(m_echoChannel) { if (pingChannel == nullptr || echoChannel == nullptr) { wpi_setWPIError(NullParameter); + m_nextSensor = nullptr; + m_units = units; return; } m_units = units; diff --git a/wpilibc/Athena/src/Vision/AxisCamera.cpp b/wpilibc/Athena/src/Vision/AxisCamera.cpp index 38552c9945..990c68ab59 100644 --- a/wpilibc/Athena/src/Vision/AxisCamera.cpp +++ b/wpilibc/Athena/src/Vision/AxisCamera.cpp @@ -117,8 +117,10 @@ HSLImage *AxisCamera::GetImage() { int AxisCamera::CopyJPEG(char **destImage, unsigned int &destImageSize, unsigned int &destImageBufferSize) { std::lock_guard lock(m_imageDataMutex); - if (destImage == nullptr) + if (destImage == nullptr) { wpi_setWPIErrorWithContext(NullParameter, "destImage must not be nullptr"); + return 0; + } if (m_imageData.size() == 0) return 0; // if no source image @@ -440,6 +442,7 @@ void AxisCamera::ReadImagesFromCamera() { wpi_setWPIErrorWithContext(IncompatibleMode, "No content-length token found in packet"); close(m_cameraSocket); + if (imgBuffer) delete[] imgBuffer; return; } 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 (setError) + if (setError) { wpi_setErrnoErrorWithContext("Failed to create the camera socket"); + close(camSocket); + } return -1; } @@ -573,10 +578,13 @@ int AxisCamera::CreateCameraSocket(std::string const &requestString, if (connect(camSocket, address->ai_addr, address->ai_addrlen) == -1) { if (setError) wpi_setErrnoErrorWithContext("Failed to connect to the camera"); + freeaddrinfo(address); close(camSocket); return -1; } + freeaddrinfo(address); + int sent = send(camSocket, requestString.c_str(), requestString.size(), 0); if (sent == -1) { if (setError) diff --git a/wpilibc/Athena/src/Vision/BaeUtilities.cpp b/wpilibc/Athena/src/Vision/BaeUtilities.cpp index e1c28946c9..f09ec646bc 100644 --- a/wpilibc/Athena/src/Vision/BaeUtilities.cpp +++ b/wpilibc/Athena/src/Vision/BaeUtilities.cpp @@ -69,6 +69,7 @@ void dprintf(const char *tempString, ...) /* Variable argument list */ for (index = 0; index < tempStringLen; index++) { if (tempString[index] == ' ') { printf("ERROR in dprintf: malformed calling sequence (%s)\n", tempString); + va_end(args); return; } if (tempString[index] == '\\' || tempString[index] == '/') @@ -292,6 +293,7 @@ int processFile(char *inputFile, char *outputString, int lineNumber) { FILE *infile; const int stringSize = 80; // max size of one line in file char inputStr[stringSize]; + inputStr[0] = '\0'; int lineCount = 0; if (lineNumber < 0) return (-1); @@ -323,14 +325,10 @@ int processFile(char *inputFile, char *outputString, int lineNumber) { if (lineNumber == 0) return (lineCount); // check for input out of range if (lineNumber > lineCount) return (-1); - // return the line selected - if (lineCount) { - stripString(inputStr); - strcpy(outputString, inputStr); - return (lineCount); - } else { - return (-1); - } + // return the line selected; lineCount guaranteed to be greater than zero + stripString(inputStr); + strcpy(outputString, inputStr); + return (lineCount); } /** Ignore empty string diff --git a/wpilibc/Athena/src/Vision/VisionAPI.cpp b/wpilibc/Athena/src/Vision/VisionAPI.cpp index 32bab7f48e..163721da3c 100644 --- a/wpilibc/Athena/src/Vision/VisionAPI.cpp +++ b/wpilibc/Athena/src/Vision/VisionAPI.cpp @@ -70,6 +70,7 @@ int frcDispose(const char* functionName, ...) /* Variable argument list */ } disposalPtr = va_arg(disposalPtrList, void*); } + va_end(disposalPtrList); return returnValue; } diff --git a/wpilibc/shared/include/Commands/CommandGroupEntry.h b/wpilibc/shared/include/Commands/CommandGroupEntry.h index 41d1cbe201..442a02c0be 100644 --- a/wpilibc/shared/include/Commands/CommandGroupEntry.h +++ b/wpilibc/shared/include/Commands/CommandGroupEntry.h @@ -22,7 +22,7 @@ class CommandGroupEntry { CommandGroupEntry(Command *command, Sequence state, double timeout = -1.0); bool IsTimedOut() const; - double m_timeout; + double m_timeout = -1.0; Command *m_command = nullptr; Sequence m_state = kSequence_InSequence; }; diff --git a/wpilibc/shared/include/LiveWindow/LiveWindow.h b/wpilibc/shared/include/LiveWindow/LiveWindow.h index e70b82d68c..1f216ab294 100644 --- a/wpilibc/shared/include/LiveWindow/LiveWindow.h +++ b/wpilibc/shared/include/LiveWindow/LiveWindow.h @@ -11,7 +11,7 @@ struct LiveWindowComponent { std::string subsystem; std::string name; - bool isSensor; + bool isSensor = false; LiveWindowComponent() = default; LiveWindowComponent(std::string subsystem, std::string name, bool isSensor) { diff --git a/wpilibc/shared/include/PIDController.h b/wpilibc/shared/include/PIDController.h index cc20c457a0..301356cbb3 100644 --- a/wpilibc/shared/include/PIDController.h +++ b/wpilibc/shared/include/PIDController.h @@ -93,7 +93,6 @@ class PIDController : public LiveWindowSendable, float m_minimumInput = 0; // minimum input - limit setpoint to this bool m_continuous = false; // do the endpoints wrap around? eg. Absolute encoder 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) double m_totalError = 0; // the sum of the errors for use in the integral calc enum { @@ -105,7 +104,7 @@ class PIDController : public LiveWindowSendable, // the percetage or absolute error that is considered on target. float m_tolerance = 0.05; float m_setpoint = 0; - float m_error; + float m_error = 0; float m_result = 0; float m_period; diff --git a/wpilibc/shared/include/SensorBase.h b/wpilibc/shared/include/SensorBase.h index e3742406c5..8638b5eaa9 100644 --- a/wpilibc/shared/include/SensorBase.h +++ b/wpilibc/shared/include/SensorBase.h @@ -56,5 +56,5 @@ class SensorBase : public ErrorBase { private: static SensorBase* m_singletonList; - SensorBase* m_nextSingleton; + SensorBase* m_nextSingleton = nullptr; }; diff --git a/wpilibc/shared/src/LiveWindow/LiveWindow.cpp b/wpilibc/shared/src/LiveWindow/LiveWindow.cpp index 6984e48b7d..793ddcc8ef 100644 --- a/wpilibc/shared/src/LiveWindow/LiveWindow.cpp +++ b/wpilibc/shared/src/LiveWindow/LiveWindow.cpp @@ -136,11 +136,7 @@ void LiveWindow::AddSensor(std::string type, int channel, LiveWindowSendable *component) { std::ostringstream oss; oss << type << "[" << channel << "]"; - std::string types(oss.str()); - auto cc = new char[types.size() + 1]; - types.copy(cc, types.size()); - cc[types.size()] = '\0'; - AddSensor("Ungrouped", cc, component); + AddSensor("Ungrouped", oss.str(), component); std::shared_ptr component_stl( component, NullDeleter()); 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) { std::ostringstream oss; oss << type << "[" << channel << "]"; - std::string types(oss.str()); - auto cc = new char[types.size() + 1]; - types.copy(cc, types.size()); - cc[types.size()] = '\0'; - AddActuator("Ungrouped", cc, std::shared_ptr( - component, [](LiveWindowSendable *) {})); + AddActuator("Ungrouped", oss.str(), std::shared_ptr( + component, [](LiveWindowSendable *) {})); } /** @@ -170,12 +162,8 @@ void LiveWindow::AddActuator(std::string type, int module, int channel, LiveWindowSendable *component) { std::ostringstream oss; oss << type << "[" << module << "," << channel << "]"; - std::string types(oss.str()); - auto cc = new char[types.size() + 1]; - types.copy(cc, types.size()); - cc[types.size()] = '\0'; - AddActuator("Ungrouped", cc, std::shared_ptr( - component, [](LiveWindowSendable *) {})); + AddActuator("Ungrouped", oss.str(), std::shared_ptr( + component, [](LiveWindowSendable *) {})); } /** diff --git a/wpilibj/src/athena/cpp/lib/FRCNetworkCommunicationsLibrary.cpp b/wpilibj/src/athena/cpp/lib/FRCNetworkCommunicationsLibrary.cpp index 545bd39b69..4a163bd061 100644 --- a/wpilibj/src/athena/cpp/lib/FRCNetworkCommunicationsLibrary.cpp +++ b/wpilibj/src/athena/cpp/lib/FRCNetworkCommunicationsLibrary.cpp @@ -390,7 +390,10 @@ JNIEXPORT jstring JNICALL Java_edu_wpi_first_wpilibj_communication_FRCNetworkCom (JNIEnv * env, jclass, jbyte port) { NETCOMM_LOG(logDEBUG) << "Calling HALGetJoystickName"; - return env->NewStringUTF(HALGetJoystickName(port)); + char* joystickName = HALGetJoystickName(port); + jstring str = env->NewStringUTF(joystickName); + std::free(joystickName); + return str; } /*