blob: 7e4e98d339b067b19feb03bcac57e903cbe49cdf [file] [log] [blame]
Brian Silverman8fce7482020-01-05 13:18:21 -08001/*----------------------------------------------------------------------------*/
Austin Schuh1e69f942020-11-14 15:06:14 -08002/* Copyright (c) 2019-2020 FIRST. All Rights Reserved. */
Brian Silverman8fce7482020-01-05 13:18:21 -08003/* Open Source Software - may be modified and shared by FRC teams. The code */
4/* must be accompanied by the FIRST BSD license file in the root directory of */
5/* the project. */
6/*----------------------------------------------------------------------------*/
7
8#include "frc/DutyCycle.h"
9
10#include <hal/DutyCycle.h>
11#include <hal/FRCUsageReporting.h>
12
Austin Schuh1e69f942020-11-14 15:06:14 -080013#include "frc/Base.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080014#include "frc/DigitalSource.h"
15#include "frc/WPIErrors.h"
16#include "frc/smartdashboard/SendableBuilder.h"
17
18using namespace frc;
19
20DutyCycle::DutyCycle(DigitalSource* source)
21 : m_source{source, NullDeleter<DigitalSource>()} {
22 if (m_source == nullptr) {
23 wpi_setWPIError(NullParameter);
24 } else {
25 InitDutyCycle();
26 }
27}
28
29DutyCycle::DutyCycle(DigitalSource& source)
30 : m_source{&source, NullDeleter<DigitalSource>()} {
31 InitDutyCycle();
32}
33
34DutyCycle::DutyCycle(std::shared_ptr<DigitalSource> source)
35 : m_source{std::move(source)} {
36 if (m_source == nullptr) {
37 wpi_setWPIError(NullParameter);
38 } else {
39 InitDutyCycle();
40 }
41}
42
43DutyCycle::~DutyCycle() { HAL_FreeDutyCycle(m_handle); }
44
45void DutyCycle::InitDutyCycle() {
46 int32_t status = 0;
47 m_handle =
48 HAL_InitializeDutyCycle(m_source->GetPortHandleForRouting(),
49 static_cast<HAL_AnalogTriggerType>(
50 m_source->GetAnalogTriggerTypeForRouting()),
51 &status);
52 wpi_setHALError(status);
53 int index = GetFPGAIndex();
54 HAL_Report(HALUsageReporting::kResourceType_DutyCycle, index + 1);
55 SendableRegistry::GetInstance().AddLW(this, "Duty Cycle", index);
56}
57
58int DutyCycle::GetFPGAIndex() const {
59 int32_t status = 0;
60 auto retVal = HAL_GetDutyCycleFPGAIndex(m_handle, &status);
61 wpi_setHALError(status);
62 return retVal;
63}
64
65int DutyCycle::GetFrequency() const {
66 int32_t status = 0;
67 auto retVal = HAL_GetDutyCycleFrequency(m_handle, &status);
68 wpi_setHALError(status);
69 return retVal;
70}
71
72double DutyCycle::GetOutput() const {
73 int32_t status = 0;
74 auto retVal = HAL_GetDutyCycleOutput(m_handle, &status);
75 wpi_setHALError(status);
76 return retVal;
77}
78
79unsigned int DutyCycle::GetOutputRaw() const {
80 int32_t status = 0;
81 auto retVal = HAL_GetDutyCycleOutputRaw(m_handle, &status);
82 wpi_setHALError(status);
83 return retVal;
84}
85
86unsigned int DutyCycle::GetOutputScaleFactor() const {
87 int32_t status = 0;
88 auto retVal = HAL_GetDutyCycleOutputScaleFactor(m_handle, &status);
89 wpi_setHALError(status);
90 return retVal;
91}
92
93int DutyCycle::GetSourceChannel() const { return m_source->GetChannel(); }
94
95void DutyCycle::InitSendable(SendableBuilder& builder) {
96 builder.SetSmartDashboardType("Duty Cycle");
Austin Schuh1e69f942020-11-14 15:06:14 -080097 builder.AddDoubleProperty(
98 "Frequency", [this] { return this->GetFrequency(); }, nullptr);
99 builder.AddDoubleProperty(
100 "Output", [this] { return this->GetOutput(); }, nullptr);
Brian Silverman8fce7482020-01-05 13:18:21 -0800101}