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