blob: bae069b74ff800b7845bffa6eb6c1b1aaa3a41f4 [file] [log] [blame]
Maxwell Henderson80bec322024-01-09 15:48:44 -08001// 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.
4
5#include "glass/networktables/NTProfiledPIDController.h"
6
7#include <fmt/format.h>
8#include <wpi/StringExtras.h>
9
10using namespace glass;
11
12NTProfiledPIDControllerModel::NTProfiledPIDControllerModel(
13 std::string_view path)
14 : NTProfiledPIDControllerModel(nt::NetworkTableInstance::GetDefault(),
15 path) {}
16
17NTProfiledPIDControllerModel::NTProfiledPIDControllerModel(
18 nt::NetworkTableInstance inst, std::string_view path)
19 : m_inst{inst},
20 m_name{inst.GetStringTopic(fmt::format("{}/.name", path)).Subscribe("")},
21 m_controllable{inst.GetBooleanTopic(fmt::format("{}/.controllable", path))
22 .Subscribe(false)},
23 m_p{inst.GetDoubleTopic(fmt::format("{}/p", path)).GetEntry(0)},
24 m_i{inst.GetDoubleTopic(fmt::format("{}/i", path)).GetEntry(0)},
25 m_d{inst.GetDoubleTopic(fmt::format("{}/d", path)).GetEntry(0)},
26 m_goal{inst.GetDoubleTopic(fmt::format("{}/goal", path)).GetEntry(0)},
27 m_iZone{inst.GetDoubleTopic(fmt::format("{}/izone", path)).GetEntry(0)},
28 m_pData{fmt::format("NTPIDCtrlP:{}", path)},
29 m_iData{fmt::format("NTPIDCtrlI:{}", path)},
30 m_dData{fmt::format("NTPIDCtrlD:{}", path)},
31 m_goalData{fmt::format("NTPIDCtrlGoal:{}", path)},
32 m_iZoneData{fmt::format("NTPIDCtrlIZone:{}", path)},
33 m_nameValue{wpi::rsplit(path, '/').second} {}
34
35void NTProfiledPIDControllerModel::SetP(double value) {
36 m_p.Set(value);
37}
38
39void NTProfiledPIDControllerModel::SetI(double value) {
40 m_i.Set(value);
41}
42
43void NTProfiledPIDControllerModel::SetD(double value) {
44 m_d.Set(value);
45}
46
47void NTProfiledPIDControllerModel::SetGoal(double value) {
48 m_goal.Set(value);
49}
50void NTProfiledPIDControllerModel::SetIZone(double value) {
51 m_iZone.Set(value);
52}
53
54void NTProfiledPIDControllerModel::Update() {
55 for (auto&& v : m_name.ReadQueue()) {
56 m_nameValue = std::move(v.value);
57 }
58 for (auto&& v : m_p.ReadQueue()) {
59 m_pData.SetValue(v.value, v.time);
60 }
61 for (auto&& v : m_i.ReadQueue()) {
62 m_iData.SetValue(v.value, v.time);
63 }
64 for (auto&& v : m_d.ReadQueue()) {
65 m_dData.SetValue(v.value, v.time);
66 }
67 for (auto&& v : m_goal.ReadQueue()) {
68 m_goalData.SetValue(v.value, v.time);
69 }
70 for (auto&& v : m_iZone.ReadQueue()) {
71 m_iZoneData.SetValue(v.value, v.time);
72 }
73 for (auto&& v : m_controllable.ReadQueue()) {
74 m_controllableValue = v.value;
75 }
76}
77
78bool NTProfiledPIDControllerModel::Exists() {
79 return m_goal.Exists();
80}