blob: 51c6506f5970dc60cc4602d14748e3570424b5ea [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 "hal/DutyCycle.h"
6
7#include "HALInitializer.h"
8#include "PortsInternal.h"
9#include "hal/Errors.h"
10#include "hal/handles/HandlesInternal.h"
11#include "hal/handles/LimitedHandleResource.h"
12#include "mockdata/DutyCycleDataInternal.h"
13
14using namespace hal;
15
16namespace {
17struct DutyCycle {
18 uint8_t index;
19};
20struct Empty {};
21} // namespace
22
23static LimitedHandleResource<HAL_DutyCycleHandle, DutyCycle, kNumDutyCycles,
24 HAL_HandleEnum::DutyCycle>* dutyCycleHandles;
25
Austin Schuh812d0d12021-11-04 20:16:48 -070026namespace hal::init {
Brian Silverman8fce7482020-01-05 13:18:21 -080027void InitializeDutyCycle() {
28 static LimitedHandleResource<HAL_DutyCycleHandle, DutyCycle, kNumDutyCycles,
29 HAL_HandleEnum::DutyCycle>
30 dcH;
31 dutyCycleHandles = &dcH;
32}
Austin Schuh812d0d12021-11-04 20:16:48 -070033} // namespace hal::init
Brian Silverman8fce7482020-01-05 13:18:21 -080034
35extern "C" {
36HAL_DutyCycleHandle HAL_InitializeDutyCycle(HAL_Handle digitalSourceHandle,
37 HAL_AnalogTriggerType triggerType,
38 int32_t* status) {
39 hal::init::CheckInit();
40
41 HAL_DutyCycleHandle handle = dutyCycleHandles->Allocate();
42 if (handle == HAL_kInvalidHandle) {
43 *status = NO_AVAILABLE_RESOURCES;
44 return HAL_kInvalidHandle;
45 }
46
47 auto dutyCycle = dutyCycleHandles->Get(handle);
48 if (dutyCycle == nullptr) { // would only occur on thread issue
49 *status = HAL_HANDLE_ERROR;
50 return HAL_kInvalidHandle;
51 }
52
53 int16_t index = getHandleIndex(handle);
54 SimDutyCycleData[index].digitalChannel = getHandleIndex(digitalSourceHandle);
55 SimDutyCycleData[index].initialized = true;
56 SimDutyCycleData[index].simDevice = 0;
57 dutyCycle->index = index;
58 return handle;
59}
60void HAL_FreeDutyCycle(HAL_DutyCycleHandle dutyCycleHandle) {
61 auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
62 dutyCycleHandles->Free(dutyCycleHandle);
Austin Schuh812d0d12021-11-04 20:16:48 -070063 if (dutyCycle == nullptr) {
64 return;
65 }
Brian Silverman8fce7482020-01-05 13:18:21 -080066 SimDutyCycleData[dutyCycle->index].initialized = false;
67}
68
69void HAL_SetDutyCycleSimDevice(HAL_EncoderHandle handle,
70 HAL_SimDeviceHandle device) {
71 auto dutyCycle = dutyCycleHandles->Get(handle);
Austin Schuh812d0d12021-11-04 20:16:48 -070072 if (dutyCycle == nullptr) {
73 return;
74 }
Brian Silverman8fce7482020-01-05 13:18:21 -080075 SimDutyCycleData[dutyCycle->index].simDevice = device;
76}
77
78int32_t HAL_GetDutyCycleFrequency(HAL_DutyCycleHandle dutyCycleHandle,
79 int32_t* status) {
80 auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
81 if (dutyCycle == nullptr) {
82 *status = HAL_HANDLE_ERROR;
83 return 0;
84 }
85 return SimDutyCycleData[dutyCycle->index].frequency;
86}
87double HAL_GetDutyCycleOutput(HAL_DutyCycleHandle dutyCycleHandle,
88 int32_t* status) {
89 auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
90 if (dutyCycle == nullptr) {
91 *status = HAL_HANDLE_ERROR;
92 return 0;
93 }
94 return SimDutyCycleData[dutyCycle->index].output;
95}
96int32_t HAL_GetDutyCycleOutputRaw(HAL_DutyCycleHandle dutyCycleHandle,
97 int32_t* status) {
98 auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
99 if (dutyCycle == nullptr) {
100 *status = HAL_HANDLE_ERROR;
101 return 0;
102 }
103 return SimDutyCycleData[dutyCycle->index].output *
104 HAL_GetDutyCycleOutputScaleFactor(dutyCycleHandle, status);
105}
106int32_t HAL_GetDutyCycleOutputScaleFactor(HAL_DutyCycleHandle dutyCycleHandle,
107 int32_t* status) {
108 return 4e7 - 1;
109}
110int32_t HAL_GetDutyCycleFPGAIndex(HAL_DutyCycleHandle dutyCycleHandle,
111 int32_t* status) {
112 auto dutyCycle = dutyCycleHandles->Get(dutyCycleHandle);
113 if (dutyCycle == nullptr) {
114 *status = HAL_HANDLE_ERROR;
115 return -1;
116 }
117 return dutyCycle->index;
118}
119} // extern "C"