mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-21 01:01:43 +00:00
In the current HAL, once the port structures were created, there was no way to free the structures. The way the C++ libraries were written this wasn't a problem, since it grabbed a copy of each and stored them in an array on bootup. However java does not do this, and grabs new ports every time an object is created. This causes memory leaks if an object is ever disposed in java. The same thing looks to be happening in python, and C# does it too currently, but that would change if this gets merged. Adds java memory management fixes Adds memory management to AnalogInput and Analog Output C++ SolenoidPorts and Digital Ports are all hold static arrays with their port pointers (although solenoid overwrites them if a new solenoid on the same module is created), however analog always grabbed new pointers. I would fix the solenoid one, but I don't know what the ideal way to do it would be. Silently ignores free(null) calls by checking passed parameter is non-null. Change-Id: Id32993b57b53f896e46e55c97541d3bd90b52648
104 lines
2.8 KiB
C++
104 lines
2.8 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) FIRST 2014. 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 the root directory of */
|
|
/* the project. */
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
#include "AnalogOutput.h"
|
|
#include "Resource.h"
|
|
#include "WPIErrors.h"
|
|
#include "LiveWindow/LiveWindow.h"
|
|
|
|
#include <sstream>
|
|
|
|
static std::unique_ptr<Resource> outputs;
|
|
|
|
/**
|
|
* Construct an analog output on the given channel.
|
|
* All analog outputs are located on the MXP port.
|
|
* @param The channel number on the roboRIO to represent.
|
|
*/
|
|
AnalogOutput::AnalogOutput(uint32_t channel) {
|
|
Resource::CreateResourceObject(outputs, kAnalogOutputs);
|
|
|
|
std::stringstream buf;
|
|
buf << "analog input " << channel;
|
|
|
|
if (!checkAnalogOutputChannel(channel)) {
|
|
wpi_setWPIErrorWithContext(ChannelIndexOutOfRange, buf.str());
|
|
return;
|
|
}
|
|
|
|
if (outputs->Allocate(channel, buf.str()) ==
|
|
std::numeric_limits<uint32_t>::max()) {
|
|
CloneError(*outputs);
|
|
return;
|
|
}
|
|
|
|
m_channel = channel;
|
|
|
|
void *port = getPort(m_channel);
|
|
int32_t status = 0;
|
|
m_port = initializeAnalogOutputPort(port, &status);
|
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
|
|
|
LiveWindow::GetInstance()->AddActuator("AnalogOutput", m_channel, this);
|
|
HALReport(HALUsageReporting::kResourceType_AnalogOutput, m_channel);
|
|
}
|
|
|
|
/**
|
|
* Destructor. Frees analog output resource
|
|
*/
|
|
AnalogOutput::~AnalogOutput() {
|
|
freeAnalogOutputPort(m_port);
|
|
outputs->Free(m_channel);
|
|
}
|
|
|
|
/**
|
|
* Set the value of the analog output
|
|
*
|
|
* @param voltage The output value in Volts, from 0.0 to +5.0
|
|
*/
|
|
void AnalogOutput::SetVoltage(float voltage) {
|
|
int32_t status = 0;
|
|
setAnalogOutput(m_port, voltage, &status);
|
|
|
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
|
}
|
|
|
|
/**
|
|
* Get the voltage of the analog output
|
|
*
|
|
* @return The value in Volts, from 0.0 to +5.0
|
|
*/
|
|
float AnalogOutput::GetVoltage() const {
|
|
int32_t status = 0;
|
|
float voltage = getAnalogOutput(m_port, &status);
|
|
|
|
wpi_setErrorWithContext(status, getHALErrorMessage(status));
|
|
|
|
return voltage;
|
|
}
|
|
|
|
void AnalogOutput::UpdateTable() {
|
|
if (m_table != nullptr) {
|
|
m_table->PutNumber("Value", GetVoltage());
|
|
}
|
|
}
|
|
|
|
void AnalogOutput::StartLiveWindowMode() {}
|
|
|
|
void AnalogOutput::StopLiveWindowMode() {}
|
|
|
|
std::string AnalogOutput::GetSmartDashboardType() const {
|
|
return "Analog Output";
|
|
}
|
|
|
|
void AnalogOutput::InitTable(std::shared_ptr<ITable> subTable) {
|
|
m_table = subTable;
|
|
UpdateTable();
|
|
}
|
|
|
|
std::shared_ptr<ITable> AnalogOutput::GetTable() const { return m_table; }
|