blob: 707ecd63ba50f7c1c33c4a5befa2315a8040a9d2 [file] [log] [blame]
Ravago Jones486de802021-05-19 20:47:55 -07001#include "y2021_bot3/constants.h"
2
Tyler Chatowbf0609c2021-07-31 16:13:27 -07003#include <cinttypes>
Ravago Jones486de802021-05-19 20:47:55 -07004#include <map>
5
6#if __has_feature(address_sanitizer)
7#include "sanitizer/lsan_interface.h"
8#endif
9
10#include "absl/base/call_once.h"
11#include "aos/logging/logging.h"
12#include "aos/mutex/mutex.h"
13#include "aos/network/team_number.h"
14
15namespace y2021_bot3 {
16namespace constants {
17
18const int Values::kZeroingSampleSize;
19
20namespace {
21
22const uint16_t kCompTeamNumber = 971;
23const uint16_t kPracticeTeamNumber = 9971;
24const uint16_t kCodingRobotTeamNumber = 7971;
25
26const Values *DoGetValuesForTeam(uint16_t team) {
27 Values *const r = new Values();
28
29 switch (team) {
30 // A set of constants for tests.
31 case 1:
32 break;
33
34 case kCompTeamNumber:
35 break;
36
37 case kPracticeTeamNumber:
38 break;
39
40 case kCodingRobotTeamNumber:
41 break;
42
43 default:
44 AOS_LOG(FATAL, "unknown team #%" PRIu16 "\n", team);
45 }
46
47 return r;
48}
49
50void DoGetValues(const Values **result) {
51 uint16_t team = ::aos::network::GetTeamNumber();
52 AOS_LOG(INFO, "creating a Constants for team %" PRIu16 "\n", team);
53 *result = DoGetValuesForTeam(team);
54}
55
56} // namespace
57
58const Values &GetValues() {
59 static absl::once_flag once;
60 static const Values *result;
61 absl::call_once(once, DoGetValues, &result);
62 return *result;
63}
64
65const Values &GetValuesForTeam(uint16_t team_number) {
66 static ::aos::Mutex mutex;
67 ::aos::MutexLocker locker(&mutex);
68
69 // IMPORTANT: This declaration has to stay after the mutex is locked to avoid
70 // race conditions.
71 static ::std::map<uint16_t, const Values *> values;
72
73 if (values.count(team_number) == 0) {
74 values[team_number] = DoGetValuesForTeam(team_number);
75#if __has_feature(address_sanitizer)
76 __lsan_ignore_object(values[team_number]);
77#endif
78 }
79 return *values[team_number];
80}
81
82} // namespace constants
83} // namespace y2021_bot3