blob: 4663875e9993d5656cb3c5f4b37f2a20a7aef450 [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/Preferences.h"
6
7#include <algorithm>
8
9#include <hal/FRCUsageReporting.h>
Austin Schuh812d0d12021-11-04 20:16:48 -070010#include <networktables/NetworkTable.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080011#include <networktables/NetworkTableInstance.h>
Brian Silverman8fce7482020-01-05 13:18:21 -080012
13using namespace frc;
14
15// The Preferences table name
Austin Schuh812d0d12021-11-04 20:16:48 -070016static constexpr std::string_view kTableName{"Preferences"};
17
18namespace {
19struct Instance {
20 Instance();
21
22 std::shared_ptr<nt::NetworkTable> table{
23 nt::NetworkTableInstance::GetDefault().GetTable(kTableName)};
24 NT_EntryListener listener;
25};
26} // namespace
27
28static Instance& GetInstance() {
29 static Instance instance;
30 return instance;
31}
Brian Silverman8fce7482020-01-05 13:18:21 -080032
Austin Schuh75263e32022-02-22 18:05:32 -080033#ifndef __FRC_ROBORIO__
34namespace frc::impl {
35void ResetPreferencesInstance() {
36 GetInstance() = Instance();
37}
38} // namespace frc::impl
39#endif
40
Brian Silverman8fce7482020-01-05 13:18:21 -080041Preferences* Preferences::GetInstance() {
Austin Schuh812d0d12021-11-04 20:16:48 -070042 ::GetInstance();
Brian Silverman8fce7482020-01-05 13:18:21 -080043 static Preferences instance;
44 return &instance;
45}
46
Austin Schuh812d0d12021-11-04 20:16:48 -070047std::vector<std::string> Preferences::GetKeys() {
48 return ::GetInstance().table->GetKeys();
Brian Silverman8fce7482020-01-05 13:18:21 -080049}
50
Austin Schuh812d0d12021-11-04 20:16:48 -070051std::string Preferences::GetString(std::string_view key,
52 std::string_view defaultValue) {
53 return ::GetInstance().table->GetString(key, defaultValue);
Brian Silverman8fce7482020-01-05 13:18:21 -080054}
55
Austin Schuh812d0d12021-11-04 20:16:48 -070056int Preferences::GetInt(std::string_view key, int defaultValue) {
57 return static_cast<int>(::GetInstance().table->GetNumber(key, defaultValue));
Brian Silverman8fce7482020-01-05 13:18:21 -080058}
59
Austin Schuh812d0d12021-11-04 20:16:48 -070060double Preferences::GetDouble(std::string_view key, double defaultValue) {
61 return ::GetInstance().table->GetNumber(key, defaultValue);
Brian Silverman8fce7482020-01-05 13:18:21 -080062}
63
Austin Schuh812d0d12021-11-04 20:16:48 -070064float Preferences::GetFloat(std::string_view key, float defaultValue) {
65 return ::GetInstance().table->GetNumber(key, defaultValue);
Brian Silverman8fce7482020-01-05 13:18:21 -080066}
67
Austin Schuh812d0d12021-11-04 20:16:48 -070068bool Preferences::GetBoolean(std::string_view key, bool defaultValue) {
69 return ::GetInstance().table->GetBoolean(key, defaultValue);
Brian Silverman8fce7482020-01-05 13:18:21 -080070}
71
Austin Schuh812d0d12021-11-04 20:16:48 -070072int64_t Preferences::GetLong(std::string_view key, int64_t defaultValue) {
73 return static_cast<int64_t>(
74 ::GetInstance().table->GetNumber(key, defaultValue));
75}
76
77void Preferences::SetString(std::string_view key, std::string_view value) {
78 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -080079 entry.SetString(value);
80 entry.SetPersistent();
81}
82
Austin Schuh812d0d12021-11-04 20:16:48 -070083void Preferences::PutString(std::string_view key, std::string_view value) {
84 SetString(key, value);
85}
86
87void Preferences::InitString(std::string_view key, std::string_view value) {
88 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -080089 entry.SetDefaultString(value);
Austin Schuh75263e32022-02-22 18:05:32 -080090 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -080091}
92
Austin Schuh812d0d12021-11-04 20:16:48 -070093void Preferences::SetInt(std::string_view key, int value) {
94 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -080095 entry.SetDouble(value);
96 entry.SetPersistent();
97}
98
Austin Schuh812d0d12021-11-04 20:16:48 -070099void Preferences::PutInt(std::string_view key, int value) {
100 SetInt(key, value);
101}
102
103void Preferences::InitInt(std::string_view key, int value) {
104 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -0800105 entry.SetDefaultDouble(value);
Austin Schuh75263e32022-02-22 18:05:32 -0800106 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -0800107}
108
Austin Schuh812d0d12021-11-04 20:16:48 -0700109void Preferences::SetDouble(std::string_view key, double value) {
110 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -0800111 entry.SetDouble(value);
112 entry.SetPersistent();
113}
114
Austin Schuh812d0d12021-11-04 20:16:48 -0700115void Preferences::PutDouble(std::string_view key, double value) {
116 SetDouble(key, value);
117}
118
119void Preferences::InitDouble(std::string_view key, double value) {
120 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -0800121 entry.SetDefaultDouble(value);
Austin Schuh75263e32022-02-22 18:05:32 -0800122 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -0800123}
124
Austin Schuh812d0d12021-11-04 20:16:48 -0700125void Preferences::SetFloat(std::string_view key, float value) {
126 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -0800127 entry.SetDouble(value);
128 entry.SetPersistent();
129}
130
Austin Schuh812d0d12021-11-04 20:16:48 -0700131void Preferences::PutFloat(std::string_view key, float value) {
132 SetFloat(key, value);
133}
134
135void Preferences::InitFloat(std::string_view key, float value) {
136 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -0800137 entry.SetDefaultDouble(value);
Austin Schuh75263e32022-02-22 18:05:32 -0800138 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -0800139}
140
Austin Schuh812d0d12021-11-04 20:16:48 -0700141void Preferences::SetBoolean(std::string_view key, bool value) {
142 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -0800143 entry.SetBoolean(value);
144 entry.SetPersistent();
145}
146
Austin Schuh812d0d12021-11-04 20:16:48 -0700147void Preferences::PutBoolean(std::string_view key, bool value) {
148 SetBoolean(key, value);
149}
150
151void Preferences::InitBoolean(std::string_view key, bool value) {
152 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -0800153 entry.SetDefaultBoolean(value);
Austin Schuh75263e32022-02-22 18:05:32 -0800154 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -0800155}
156
Austin Schuh812d0d12021-11-04 20:16:48 -0700157void Preferences::SetLong(std::string_view key, int64_t value) {
158 auto entry = ::GetInstance().table->GetEntry(key);
Brian Silverman8fce7482020-01-05 13:18:21 -0800159 entry.SetDouble(value);
160 entry.SetPersistent();
161}
162
Austin Schuh812d0d12021-11-04 20:16:48 -0700163void Preferences::PutLong(std::string_view key, int64_t value) {
164 SetLong(key, value);
165}
166
167void Preferences::InitLong(std::string_view key, int64_t value) {
168 auto entry = ::GetInstance().table->GetEntry(key);
Austin Schuh1e69f942020-11-14 15:06:14 -0800169 entry.SetDefaultDouble(value);
Austin Schuh75263e32022-02-22 18:05:32 -0800170 entry.SetPersistent();
Austin Schuh1e69f942020-11-14 15:06:14 -0800171}
172
Austin Schuh812d0d12021-11-04 20:16:48 -0700173bool Preferences::ContainsKey(std::string_view key) {
174 return ::GetInstance().table->ContainsKey(key);
Brian Silverman8fce7482020-01-05 13:18:21 -0800175}
176
Austin Schuh812d0d12021-11-04 20:16:48 -0700177void Preferences::Remove(std::string_view key) {
178 ::GetInstance().table->Delete(key);
179}
Brian Silverman8fce7482020-01-05 13:18:21 -0800180
181void Preferences::RemoveAll() {
182 for (auto preference : GetKeys()) {
183 if (preference != ".type") {
184 Remove(preference);
185 }
186 }
187}
188
Austin Schuh812d0d12021-11-04 20:16:48 -0700189Instance::Instance() {
190 table->GetEntry(".type").SetString("RobotPreferences");
191 listener = table->AddEntryListener(
192 [=](nt::NetworkTable* table, std::string_view name,
Brian Silverman8fce7482020-01-05 13:18:21 -0800193 nt::NetworkTableEntry entry, std::shared_ptr<nt::Value> value,
194 int flags) { entry.SetPersistent(); },
195 NT_NOTIFY_NEW | NT_NOTIFY_IMMEDIATE);
196 HAL_Report(HALUsageReporting::kResourceType_Preferences, 0);
197}