Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 1 | #include "aos/common/network/team_number.h" |
| 2 | |
| 3 | #include <netinet/in.h> |
Brian Silverman | 8f8b06f | 2013-10-30 22:04:27 -0700 | [diff] [blame] | 4 | #include <inttypes.h> |
Austin Schuh | be2456e | 2015-02-16 02:58:00 -0800 | [diff] [blame^] | 5 | #include <unistd.h> |
| 6 | |
| 7 | #include <string> |
Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 8 | |
| 9 | #include "aos/common/once.h" |
Brian Silverman | 14fd0fb | 2014-01-14 21:42:01 -0800 | [diff] [blame] | 10 | #include "aos/linux_code/configuration.h" |
Brian Silverman | 8f8b06f | 2013-10-30 22:04:27 -0700 | [diff] [blame] | 11 | #include "aos/common/logging/logging.h" |
Austin Schuh | be2456e | 2015-02-16 02:58:00 -0800 | [diff] [blame^] | 12 | #include "aos/common/util/string_to_num.h" |
Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 13 | |
| 14 | namespace aos { |
| 15 | namespace network { |
| 16 | namespace { |
| 17 | |
Philipp Schrader | f75a8bf | 2015-02-02 05:30:16 +0000 | [diff] [blame] | 18 | uint16_t override_team; |
Brian Silverman | de0a53a | 2014-02-10 22:27:44 -0800 | [diff] [blame] | 19 | |
Austin Schuh | be2456e | 2015-02-16 02:58:00 -0800 | [diff] [blame^] | 20 | ::std::string GetHostname() { |
| 21 | char buf[256]; |
| 22 | buf[sizeof(buf) - 1] = '\0'; |
| 23 | PCHECK(gethostname(buf, sizeof(buf) - 1)); |
| 24 | return buf; |
| 25 | } |
| 26 | |
| 27 | int ParseTeamNumber(const std::string &hostname, uint16_t *teamnumber) { |
| 28 | for (size_t i = 0; i < hostname.size(); i++) { |
| 29 | if (hostname[i] == '-') { |
| 30 | const std::string num_as_s = hostname.substr(i + 1); |
| 31 | |
| 32 | int num; |
| 33 | if (!::aos::util::StringToNumber(num_as_s, &num)) { |
| 34 | return -1; |
| 35 | } |
| 36 | if (hostname.substr(0, i) == "roboRIO" && |
| 37 | std::to_string(num) == num_as_s) { |
| 38 | *teamnumber = num; |
| 39 | return 0; |
| 40 | } else { |
| 41 | return -1; |
| 42 | } |
| 43 | } |
| 44 | } |
| 45 | return -1; |
| 46 | } |
| 47 | |
Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 48 | uint16_t *DoGetTeamNumber() { |
Brian Silverman | de0a53a | 2014-02-10 22:27:44 -0800 | [diff] [blame] | 49 | if (override_team != 0) return &override_team; |
Austin Schuh | be2456e | 2015-02-16 02:58:00 -0800 | [diff] [blame^] | 50 | static uint16_t r; |
| 51 | int error = ParseTeamNumber(GetHostname(), &r); |
| 52 | if (error) { |
| 53 | LOG(FATAL, "Invalid hostname %s\n", GetHostname().c_str()); |
| 54 | } |
Brian Silverman | 8f8b06f | 2013-10-30 22:04:27 -0700 | [diff] [blame] | 55 | LOG(INFO, "team number is %" PRIu16 "\n", r); |
Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 56 | return &r; |
| 57 | } |
| 58 | |
| 59 | } // namespace |
| 60 | |
| 61 | uint16_t GetTeamNumber() { |
| 62 | static Once<uint16_t> once(DoGetTeamNumber); |
| 63 | return *once.Get(); |
| 64 | } |
| 65 | |
Brian Silverman | de0a53a | 2014-02-10 22:27:44 -0800 | [diff] [blame] | 66 | void OverrideTeamNumber(uint16_t team) { override_team = team; } |
| 67 | |
Brian Silverman | 431500a | 2013-10-28 19:50:15 -0700 | [diff] [blame] | 68 | } // namespace network |
| 69 | } // namespace aos |