mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-07-05 03:21:42 +00:00
Subsections are alphabetized according to lexographic ordering. Also, HAL includes were moved from headers to source files where possible. This change may cause user code which uses HAL functionality and does not include the relevant HAL header (since it may have been provided by another WPILib header) to fail to compile.
116 lines
3.0 KiB
C++
116 lines
3.0 KiB
C++
/*----------------------------------------------------------------------------*/
|
|
/* Copyright (c) FIRST 2014-2016. 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 "HAL/HAL.h"
|
|
#include "HAL/Port.h"
|
|
#include "LiveWindow/LiveWindow.h"
|
|
#include "Resource.h"
|
|
#include "WPIErrors.h"
|
|
|
|
#include <limits>
|
|
#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 channel 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());
|
|
m_channel = std::numeric_limits<uint32_t>::max();
|
|
m_port = nullptr;
|
|
return;
|
|
}
|
|
|
|
if (outputs->Allocate(channel, buf.str()) ==
|
|
std::numeric_limits<uint32_t>::max()) {
|
|
CloneError(*outputs);
|
|
m_channel = std::numeric_limits<uint32_t>::max();
|
|
m_port = nullptr;
|
|
return;
|
|
}
|
|
|
|
m_channel = 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);
|
|
}
|
|
|
|
/**
|
|
* 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; }
|