blob: a8375e0f16b3c03ec1e78f6ef15b2b69c120659d [file] [log] [blame]
Austin Schuh812d0d12021-11-04 20:16:48 -07001// Copyright (c) FIRST and other WPILib contributors.
2// Open Source Software; you can modify and/or share it under the terms of
3// the WPILib BSD license file in the root directory of this project.
Brian Silverman8fce7482020-01-05 13:18:21 -08004
5#include "frc/DutyCycle.h"
6
7#include <hal/DutyCycle.h>
8#include <hal/FRCUsageReporting.h>
Austin Schuh812d0d12021-11-04 20:16:48 -07009#include <wpi/NullDeleter.h>
10#include <wpi/sendable/SendableBuilder.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080011
12#include "frc/DigitalSource.h"
Austin Schuh812d0d12021-11-04 20:16:48 -070013#include "frc/Errors.h"
Brian Silverman8fce7482020-01-05 13:18:21 -080014
15using namespace frc;
16
17DutyCycle::DutyCycle(DigitalSource* source)
Austin Schuh812d0d12021-11-04 20:16:48 -070018 : m_source{source, wpi::NullDeleter<DigitalSource>()} {
19 if (!m_source) {
20 throw FRC_MakeError(err::NullParameter, "{}", "source");
Brian Silverman8fce7482020-01-05 13:18:21 -080021 }
Austin Schuh812d0d12021-11-04 20:16:48 -070022 InitDutyCycle();
Brian Silverman8fce7482020-01-05 13:18:21 -080023}
24
25DutyCycle::DutyCycle(DigitalSource& source)
Austin Schuh812d0d12021-11-04 20:16:48 -070026 : m_source{&source, wpi::NullDeleter<DigitalSource>()} {
Brian Silverman8fce7482020-01-05 13:18:21 -080027 InitDutyCycle();
28}
29
30DutyCycle::DutyCycle(std::shared_ptr<DigitalSource> source)
31 : m_source{std::move(source)} {
Austin Schuh812d0d12021-11-04 20:16:48 -070032 if (!m_source) {
33 throw FRC_MakeError(err::NullParameter, "{}", "source");
Brian Silverman8fce7482020-01-05 13:18:21 -080034 }
Austin Schuh812d0d12021-11-04 20:16:48 -070035 InitDutyCycle();
Brian Silverman8fce7482020-01-05 13:18:21 -080036}
37
Austin Schuh812d0d12021-11-04 20:16:48 -070038DutyCycle::~DutyCycle() {
39 HAL_FreeDutyCycle(m_handle);
40}
Brian Silverman8fce7482020-01-05 13:18:21 -080041
42void DutyCycle::InitDutyCycle() {
43 int32_t status = 0;
44 m_handle =
45 HAL_InitializeDutyCycle(m_source->GetPortHandleForRouting(),
46 static_cast<HAL_AnalogTriggerType>(
47 m_source->GetAnalogTriggerTypeForRouting()),
48 &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070049 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080050 int index = GetFPGAIndex();
51 HAL_Report(HALUsageReporting::kResourceType_DutyCycle, index + 1);
Austin Schuh812d0d12021-11-04 20:16:48 -070052 wpi::SendableRegistry::AddLW(this, "Duty Cycle", index);
Brian Silverman8fce7482020-01-05 13:18:21 -080053}
54
55int DutyCycle::GetFPGAIndex() const {
56 int32_t status = 0;
57 auto retVal = HAL_GetDutyCycleFPGAIndex(m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070058 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080059 return retVal;
60}
61
62int DutyCycle::GetFrequency() const {
63 int32_t status = 0;
64 auto retVal = HAL_GetDutyCycleFrequency(m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070065 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080066 return retVal;
67}
68
69double DutyCycle::GetOutput() const {
70 int32_t status = 0;
71 auto retVal = HAL_GetDutyCycleOutput(m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070072 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080073 return retVal;
74}
75
76unsigned int DutyCycle::GetOutputRaw() const {
77 int32_t status = 0;
78 auto retVal = HAL_GetDutyCycleOutputRaw(m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070079 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080080 return retVal;
81}
82
83unsigned int DutyCycle::GetOutputScaleFactor() const {
84 int32_t status = 0;
85 auto retVal = HAL_GetDutyCycleOutputScaleFactor(m_handle, &status);
Austin Schuh812d0d12021-11-04 20:16:48 -070086 FRC_CheckErrorStatus(status, "Channel {}", GetSourceChannel());
Brian Silverman8fce7482020-01-05 13:18:21 -080087 return retVal;
88}
89
Austin Schuh812d0d12021-11-04 20:16:48 -070090int DutyCycle::GetSourceChannel() const {
91 return m_source->GetChannel();
92}
Brian Silverman8fce7482020-01-05 13:18:21 -080093
Austin Schuh812d0d12021-11-04 20:16:48 -070094void DutyCycle::InitSendable(wpi::SendableBuilder& builder) {
Brian Silverman8fce7482020-01-05 13:18:21 -080095 builder.SetSmartDashboardType("Duty Cycle");
Austin Schuh1e69f942020-11-14 15:06:14 -080096 builder.AddDoubleProperty(
97 "Frequency", [this] { return this->GetFrequency(); }, nullptr);
98 builder.AddDoubleProperty(
99 "Output", [this] { return this->GetOutput(); }, nullptr);
Brian Silverman8fce7482020-01-05 13:18:21 -0800100}