From 9d55cf0ed924046127e0ba29c292e9fc62c0b199 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 11:10:26 -0700 Subject: [PATCH 01/18] add DS_Store to gitignore --- .gitignore | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index b418cc8eff..97fbaca117 100644 --- a/.gitignore +++ b/.gitignore @@ -155,3 +155,7 @@ src/.clangd # external is a special directory for bazel so it should be ignored src/external + +# macOS folder info +.DS_Store + From a27eefc612a17c718541f86e00920c8c4dc24964 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 13:52:28 -0700 Subject: [PATCH 02/18] add macos setup script --- environment_setup/macos_requirements.txt | 13 ++++ environment_setup/setup_software_mac.sh | 98 ++++++++++++++++++++++++ environment_setup/util.sh | 38 +++++++++ 3 files changed, 149 insertions(+) create mode 100644 environment_setup/macos_requirements.txt create mode 100755 environment_setup/setup_software_mac.sh diff --git a/environment_setup/macos_requirements.txt b/environment_setup/macos_requirements.txt new file mode 100644 index 0000000000..8e4cf0bb42 --- /dev/null +++ b/environment_setup/macos_requirements.txt @@ -0,0 +1,13 @@ +ansible-lint==24.12.2 +pyqtgraph==0.13.7 +thefuzz==0.19.0 +iterfzf==0.5.0.20.0 +python-Levenshtein==0.25.1 +psutil==5.9.0 +PyOpenGL==3.1.6 +ruff==0.5.5 +pyqt-toast-notification==1.3.2 +grpcio-tools==1.71.0 +platformio==6.1.18 +pyqt6==6.9.1 + diff --git a/environment_setup/setup_software_mac.sh b/environment_setup/setup_software_mac.sh new file mode 100755 index 0000000000..c7304d9d7e --- /dev/null +++ b/environment_setup/setup_software_mac.sh @@ -0,0 +1,98 @@ +#!/bin/bash +set -x +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# +# UBC Thunderbots macOS Software Setup +# +# This script will install all required libraries and dependencies to build +# and run the Thunderbots codebase on macOS, including the AI and unit tests. +#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# + +# Save the parent dir of this script +CURR_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) +cd "$CURR_DIR" || exit + +source util.sh + +arch=$(uname -m) +print_status_msg "Detected architecture: ${arch}" + +# Check for Homebrew and install if missing +if ! command -v brew &>/dev/null; then + print_status_msg "Installing Homebrew..." + /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" + + # Configure Homebrew in current shell + if [ "$arch" = "arm64" ]; then + eval "$(/opt/homebrew/bin/brew shellenv)" + else + eval "$(/usr/local/bin/brew shellenv)" + fi +fi + +print_status_msg "Installing Utilities and Dependencies" + +# Update Homebrew +brew update + +# Install required packages +host_software_packages=( + cmake@4 + python@3.12 + bazelisk + openjdk@21 + pyqt@6 + qt@6 + node@20 + go@1.24 + clang-format@20 +) + +for pkg in "${host_software_packages[@]}"; do + if ! brew list "$pkg" &>/dev/null; then + print_status_msg "Installing $pkg..." + brew install "$pkg" + else + print_status_msg "$pkg already installed, skipping..." + fi +done + +# Set up cache +mkdir /tmp/tbots_download_cache + +# Set up Python +print_status_msg "Setting Up Python Environment" + +# Create virtual environment +sudo python3.12 -m venv /opt/tbotspython +chmod +source /opt/tbotspython/bin/activate + +# Install Python dependencies +sudo pip install --upgrade pip +sudo pip install -r macos_requirements.txt + +print_status_msg "Done Setting Up Python Environment" + +print_status_msg "Fetching game controller" +install_gamecontroller_macos + +print_status_msg "Setting up TIGERS AutoRef" +install_java_macos +install_autoref_macos +sudo chmod +x "$CURR_DIR/../src/software/autoref/run_autoref.sh" +sudo cp "$CURR_DIR/../src/software/autoref/DIV_B.txt" "/opt/tbotspython/autoReferee/config/geometry/DIV_B.txt" +print_status_msg "Finished setting up AutoRef" + +print_status_msg "Setting Up Python Development Headers" +install_python_toolchain_headers_macos +print_status_msg "Done Setting Up Python Development Headers" + +print_status_msg "Granting Permissions to /opt/tbotspython" +sudo chown -R $(id -u):$(id -g) /opt/tbotspython +print_status_msg "Done Granting Permissions to /opt/tbotspython" + +print_status_msg "Done Environment Configuration" + +print_status_msg "Software Setup Complete" +print_status_msg "Note: Some changes require a new terminal session to take effect" + diff --git a/environment_setup/util.sh b/environment_setup/util.sh index e3603b5510..885193fc2a 100755 --- a/environment_setup/util.sh +++ b/environment_setup/util.sh @@ -8,6 +8,15 @@ install_autoref() { rm -rf /tmp/tbots_download_cache/autoReferee.zip /tmp/tbots_download_cache/AutoReferee-${autoref_commit} } +install_autoref_macos() { + autoref_version=1.5.5 + curl -L https://github.com/TIGERs-Mannheim/AutoReferee/releases/download/${autoref_version}/autoReferee.zip -o /tmp/tbots_download_cache/autoReferee.zip + unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/autoReferee.zip + + sudo mv /tmp/tbots_download_cache/autoReferee /opt/tbotspython/ + rm -rf /tmp/tbots_download_cache/autoReferee.zip +} + install_bazel() { download=https://github.com/bazelbuild/bazelisk/releases/download/v1.26.0/bazelisk-linux-arm64 @@ -46,6 +55,19 @@ install_gamecontroller () { sudo chmod +x /opt/tbotspython/gamecontroller } +install_gamecontroller_macos () { + curl -L https://github.com/RoboCup-SSL/ssl-game-controller/archive/refs/tags/v3.17.0.zip -o /tmp/tbots_download_cache/ssl-game-controller.zip + unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/ssl-game-controller.zip + cd /tmp/tbots_download_cache/ssl-game-controller-3.17.0 + make install + go build cmd/ssl-game-controller/main.go + sudo mv main /opt/tbotspython/gamecontroller + sudo chmod +x /opt/tbotspython/gamecontroller + + cd - + sudo rm -rf /tmp/tbots_download_cache/ssl-game-controller-3.17.0 /tmp/tbots_download_cache/go /tmp/tbots_download_cache/go.tar.gz /tmp/tbots_download_cache/ssl-game-controller.zip +} + install_java () { java_home="" java_download=https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz @@ -58,6 +80,17 @@ install_java () { rm /tmp/tbots_download_cache/jdk-21.tar.gz } +install_java_macos () { + java_home="" + java_download=https://download.oracle.com/java/21/latest/jdk-21_macos-aarch64_bin.tar.gz + curl -L $java_download -o /tmp/tbots_download_cache/jdk-21.tar.gz + mkdir /tmp/tbots_download_cache/jdk + tar -xzf /tmp/tbots_download_cache/jdk-21.tar.gz -C /tmp/tbots_download_cache + sudo mv /tmp/tbots_download_cache/jdk-21*/Contents/Home /opt/tbotspython/bin/jdk + rm /tmp/tbots_download_cache/jdk-21.tar.gz + rm -rf /tmp/tbots_download_cache/jdk +} + install_python_dev_cross_compile_headers() { mkdir -p /opt/tbotspython/cross_compile_headers wget -N https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz -O /tmp/tbots_download_cache/python-3.12.0.tar.xz @@ -90,6 +123,11 @@ install_python_dev_cross_compile_headers() { rm -rf /tmp/tbots_download_cache/python-3.12.0.tar.xz } +install_python_toolchain_headers_macos() { + sudo mkdir -p /opt/tbotspython/py_headers/include/ + sudo ln -sfn "$(python3.12-config --includes | awk '{for(i=1;i<=NF;++i) if ($i ~ /^-I/) print substr($i, 3)}' | head -n1)" /opt/tbotspython/py_headers/include/ +} + is_x86() { if [[ $1 == "x86_64" ]]; then return 0 From 16fff779b864a84150e060fbbfc792b7822d0873 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 14:25:17 -0700 Subject: [PATCH 03/18] setup cross compiler headers --- environment_setup/setup_software_mac.sh | 4 ++++ environment_setup/util.sh | 10 ++++++++++ src/MODULE.bazel | 4 ++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/environment_setup/setup_software_mac.sh b/environment_setup/setup_software_mac.sh index c7304d9d7e..7b7b2bc679 100755 --- a/environment_setup/setup_software_mac.sh +++ b/environment_setup/setup_software_mac.sh @@ -83,6 +83,10 @@ sudo chmod +x "$CURR_DIR/../src/software/autoref/run_autoref.sh" sudo cp "$CURR_DIR/../src/software/autoref/DIV_B.txt" "/opt/tbotspython/autoReferee/config/geometry/DIV_B.txt" print_status_msg "Finished setting up AutoRef" +print_status_msg "Setting up cross compiler for robot software" +install_cross_compiler_mac +print_status_msg "Done setting up cross compiler for robot software" + print_status_msg "Setting Up Python Development Headers" install_python_toolchain_headers_macos print_status_msg "Done Setting Up Python Development Headers" diff --git a/environment_setup/util.sh b/environment_setup/util.sh index 885193fc2a..8c5be169e7 100755 --- a/environment_setup/util.sh +++ b/environment_setup/util.sh @@ -44,6 +44,16 @@ install_cross_compiler() { rm /tmp/tbots_download_cache/$full_file_name } +install_cross_compiler_mac() { + file_name=aarch64-tbots-linux-gnu-for-aarch64 + full_file_name=$file_name.tar.xz + curl -L "https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name" \ + -o /tmp/tbots_download_cache/$full_file_name + tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/ + sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython + rm /tmp/tbots_download_cache/$full_file_name +} + install_gamecontroller () { arch=arm64 if is_x86 $1; then diff --git a/src/MODULE.bazel b/src/MODULE.bazel index b016c260d4..e1d8792571 100644 --- a/src/MODULE.bazel +++ b/src/MODULE.bazel @@ -274,13 +274,13 @@ new_local_repository( new_local_repository( name = "py_cc_toolchain_host", build_file = "@//extlibs:py_cc_toolchain.BUILD", - path = "/usr/include/python3.12/", + path = "/opt/tbotspython/py_headers/include/python3.12/", ) new_local_repository( name = "py_cc_toolchain_for_k8_jetson_nano_cross_compile", build_file = "@//extlibs:py_cc_toolchain.BUILD", - path = "/opt/tbotspython/cross_compile_headers/include/python3.12/", + path = "/opt/tbotspython/py_headers/include/python3.12/", ) ############################################## From 999a3e0947422ab5b0b881255422b0607ce9175b Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 14:25:41 -0700 Subject: [PATCH 04/18] selectively ignore evdev --- src/software/thunderscope/requirements.in | 2 +- src/software/thunderscope/requirements_lock.txt | 3 --- src/software/thunderscope/robot_diagnostics/BUILD | 8 ++++++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/software/thunderscope/requirements.in b/src/software/thunderscope/requirements.in index 32a0054344..18c98bc70f 100644 --- a/src/software/thunderscope/requirements.in +++ b/src/software/thunderscope/requirements.in @@ -1,6 +1,6 @@ colorama==0.4.6 netifaces==0.11.0 -evdev==1.7.0 +evdev==1.7.0; sys_platform == "linux" numpy==1.26.4 protobuf==6.31.1 pyqtgraph==0.13.7 diff --git a/src/software/thunderscope/requirements_lock.txt b/src/software/thunderscope/requirements_lock.txt index a50ed09232..55045c79c5 100644 --- a/src/software/thunderscope/requirements_lock.txt +++ b/src/software/thunderscope/requirements_lock.txt @@ -12,9 +12,6 @@ darkdetect==0.7.1 \ --hash=sha256:3efe69f8ecd5f1b7f4fbb0d1d93f656b0e493c45cc49222380ffe2a529cbc866 \ --hash=sha256:47be3cf5134432ddb616bbffc927237718407914993c82809983e7ccebf49013 # via pyqtdarktheme-fork -evdev==1.7.0 \ - --hash=sha256:95bd2a1e0c6ce2cd7a2ecc6e6cd9736ff794b3ad5cb54d81d8cbc2e414d0b870 - # via -r software/thunderscope/requirements.in netifaces==0.11.0 \ --hash=sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32 \ --hash=sha256:08e3f102a59f9eaef70948340aeb6c89bd09734e0dca0f3b82720305729f63ea \ diff --git a/src/software/thunderscope/robot_diagnostics/BUILD b/src/software/thunderscope/robot_diagnostics/BUILD index 107b65fce8..aee3a437d1 100644 --- a/src/software/thunderscope/robot_diagnostics/BUILD +++ b/src/software/thunderscope/robot_diagnostics/BUILD @@ -35,8 +35,12 @@ py_library( ":handheld_controller", "//software/thunderscope:constants", requirement("pyqtgraph"), - requirement("evdev"), - ], + ] + select({ + # TODO: remove this selection when we replace evdev to + # other macos supported libs. + "@platforms//os:linux": [requirement("evdev")], + "//conditions:default": [], + }), ) py_library( From b8f3534482ac45708731776d2af05a6bc848f7c8 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 17:06:41 -0700 Subject: [PATCH 05/18] add chrono clock compat --- src/software/logger/BUILD | 6 ++++++ src/software/logger/log_merger.cpp | 5 ++--- src/software/logger/log_merger.h | 14 ++++++-------- src/software/logger/time_compat.h | 9 +++++++++ 4 files changed, 23 insertions(+), 11 deletions(-) create mode 100644 src/software/logger/time_compat.h diff --git a/src/software/logger/BUILD b/src/software/logger/BUILD index d10935a852..a266ae8da4 100644 --- a/src/software/logger/BUILD +++ b/src/software/logger/BUILD @@ -10,6 +10,7 @@ cc_library( ], deps = [ "@g3log", + ":time_compat", ], ) @@ -189,3 +190,8 @@ cc_library( "@zlib", ], ) + +cc_library( + name = "time_compat", + srcs = ["time_compat.h"], +) diff --git a/src/software/logger/log_merger.cpp b/src/software/logger/log_merger.cpp index 8f82680cfa..338c4c1029 100644 --- a/src/software/logger/log_merger.cpp +++ b/src/software/logger/log_merger.cpp @@ -11,7 +11,7 @@ std::list LogMerger::log(g3::LogMessage &log) { std::string msg = log.message(); - std::chrono::_V2::system_clock::time_point current_time = + Clock::time_point current_time = std::chrono::system_clock::now(); // add passed time from testing current_time += passed_time; @@ -38,8 +38,7 @@ std::list LogMerger::log(g3::LogMessage &log) } } -std::list LogMerger::_getOldMessages( - std::chrono::_V2::system_clock::time_point current_time) +std::list LogMerger::_getOldMessages(Clock::time_point current_time) { std::list result; while (message_list.size() > 0) diff --git a/src/software/logger/log_merger.h b/src/software/logger/log_merger.h index 2cdbd9d679..3dbc7f8148 100644 --- a/src/software/logger/log_merger.h +++ b/src/software/logger/log_merger.h @@ -4,6 +4,7 @@ #include #include #include +#include "time_compat.h" /** @@ -41,11 +42,9 @@ class LogMerger * Looks through the message list for expired messages, removes them from the list and * map, and returns them as strings */ - std::list _getOldMessages( - std::chrono::_V2::system_clock::time_point current_time); + std::list _getOldMessages(Clock::time_point current_time); - const std::chrono::_V2::system_clock::duration LOG_MERGE_DURATION = - std::chrono::seconds(2); + const Clock::duration LOG_MERGE_DURATION = std::chrono::seconds(2); private: /** @@ -55,10 +54,10 @@ class LogMerger { g3::LogMessage log; std::string msg; - std::chrono::_V2::system_clock::time_point timestamp; + Clock::time_point timestamp; Message(g3::LogMessage &log, std::string msg, - std::chrono::_V2::system_clock::time_point timestamp) + Clock::time_point timestamp) : log(log), msg(msg), timestamp(timestamp) { } @@ -68,8 +67,7 @@ class LogMerger repeat_map; // maps string messages to their number of repeats for fast access std::list message_list; // used to keep track of time order for messages - std::chrono::_V2::system_clock::duration - passed_time; // for testing, time passed manually + Clock::duration passed_time; // for testing, time passed manually bool enable_merging; }; diff --git a/src/software/logger/time_compat.h b/src/software/logger/time_compat.h new file mode 100644 index 0000000000..d292b301d4 --- /dev/null +++ b/src/software/logger/time_compat.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +#if defined(__APPLE__) +using Clock = std::chrono::system_clock; +#else +using Clock = std::chrono::_V2::system_clock; +#endif From d32fb6dc2cd215218a9e3c2a73a87091804e8dfa Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 17:33:28 -0700 Subject: [PATCH 06/18] add compat flags --- .../src/amun/simulator/simulator.cpp | 4 ++-- src/software/logger/BUILD | 9 ++++++--- src/software/logger/compat_flags.h | 18 ++++++++++++++++++ src/software/logger/csv_sink.cpp | 6 +----- src/software/logger/log_merger.h | 2 +- src/software/logger/logger.h | 8 ++++---- src/software/logger/proto_logger.cpp | 4 ++-- src/software/logger/time_compat.h | 9 --------- 8 files changed, 34 insertions(+), 26 deletions(-) create mode 100644 src/software/logger/compat_flags.h delete mode 100644 src/software/logger/time_compat.h diff --git a/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp b/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp index 2c00c5a798..f4e257bb39 100644 --- a/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp +++ b/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp @@ -677,12 +677,12 @@ void Simulator::handleSimulatorSetupCommand(const std::unique_ptr if (realism.has_vision_delay()) { - m_visionDelay = std::max(0l, realism.vision_delay()); + m_visionDelay = std::max(0l, realism.vision_delay()); } if (realism.has_vision_processing_time()) { - m_visionProcessingTime = std::max(0l, realism.vision_processing_time()); + m_visionProcessingTime = std::max(0l, realism.vision_processing_time()); } if (realism.has_simulate_dribbling()) diff --git a/src/software/logger/BUILD b/src/software/logger/BUILD index a266ae8da4..134e185c0e 100644 --- a/src/software/logger/BUILD +++ b/src/software/logger/BUILD @@ -10,7 +10,7 @@ cc_library( ], deps = [ "@g3log", - ":time_compat", + ":compat_flags", ], ) @@ -29,6 +29,7 @@ cc_library( ":protobuf_sink", "@g3log", "@g3sinks", + ":compat_flags", ], ) @@ -105,6 +106,7 @@ cc_library( ], deps = [ "@g3log", + ":compat_flags", ], ) @@ -188,10 +190,11 @@ cc_library( "@base64", "@boost//:filesystem", "@zlib", + ":compat_flags", ], ) cc_library( - name = "time_compat", - srcs = ["time_compat.h"], + name = "compat_flags", + srcs = ["compat_flags.h"], ) diff --git a/src/software/logger/compat_flags.h b/src/software/logger/compat_flags.h new file mode 100644 index 0000000000..32eed9b6a3 --- /dev/null +++ b/src/software/logger/compat_flags.h @@ -0,0 +1,18 @@ +#pragma once + +#include + +#if defined(__APPLE__) +using Clock = std::chrono::system_clock; +#else +using Clock = std::chrono::_V2::system_clock; +#endif + +#if __cplusplus > 201703L +#include +namespace fs = std::filesystem; +#else +#include +namespace fs = std::experimental::filesystem; +#endif + diff --git a/src/software/logger/csv_sink.cpp b/src/software/logger/csv_sink.cpp index 07494a78fb..345442d681 100644 --- a/src/software/logger/csv_sink.cpp +++ b/src/software/logger/csv_sink.cpp @@ -1,10 +1,6 @@ #include "software/logger/csv_sink.h" -#if __cplusplus > 201703L -#include -#else -#include -#endif +#include "compat_flags.h" CSVSink::CSVSink(const std::string& log_directory) : log_directory(log_directory) {} diff --git a/src/software/logger/log_merger.h b/src/software/logger/log_merger.h index 3dbc7f8148..d4dba461d4 100644 --- a/src/software/logger/log_merger.h +++ b/src/software/logger/log_merger.h @@ -4,7 +4,7 @@ #include #include #include -#include "time_compat.h" +#include "compat_flags.h" /** diff --git a/src/software/logger/logger.h b/src/software/logger/logger.h index ea6f5a4b6f..817af6cf61 100644 --- a/src/software/logger/logger.h +++ b/src/software/logger/logger.h @@ -3,8 +3,6 @@ #include #include -#include -#include #include #include #include @@ -15,6 +13,8 @@ #include "software/logger/plotjuggler_sink.h" #include "software/logger/protobuf_sink.h" +#include "compat_flags.h" + // This undefines LOG macro defined by g3log #undef LOG @@ -90,9 +90,9 @@ class LoggerSingleton // hermetic build principles // if log dir doesn't exist, create it - if (!std::experimental::filesystem::exists(runtime_dir)) + if (!fs::exists(runtime_dir)) { - std::experimental::filesystem::create_directories(runtime_dir); + fs::create_directories(runtime_dir); } auto csv_sink_handle = logWorker->addSink(std::make_unique(runtime_dir), diff --git a/src/software/logger/proto_logger.cpp b/src/software/logger/proto_logger.cpp index 2362267139..30bd7b51c9 100644 --- a/src/software/logger/proto_logger.cpp +++ b/src/software/logger/proto_logger.cpp @@ -5,7 +5,6 @@ #include #include -#include #include #include #include @@ -13,6 +12,7 @@ #include "base64.h" #include "shared/constants.h" +#include "compat_flags.h" ProtoLogger::ProtoLogger(const std::string& log_path, std::function time_provider, @@ -31,7 +31,7 @@ ProtoLogger::ProtoLogger(const std::string& log_path, std::stringstream ss; ss << std::put_time(&tm, REPLAY_FILE_TIME_FORMAT.data()); log_folder_ = log_path_ + "/" + REPLAY_FILE_PREFIX + ss.str() + "/"; - std::experimental::filesystem::create_directories(log_folder_); + fs::create_directories(log_folder_); // Start logging in a separate thread log_thread_ = std::thread(&ProtoLogger::logProtobufs, this); diff --git a/src/software/logger/time_compat.h b/src/software/logger/time_compat.h deleted file mode 100644 index d292b301d4..0000000000 --- a/src/software/logger/time_compat.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include - -#if defined(__APPLE__) -using Clock = std::chrono::system_clock; -#else -using Clock = std::chrono::_V2::system_clock; -#endif From 11fcb391257cff2f69c90ca904d8960594a33080 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 22:55:09 -0700 Subject: [PATCH 07/18] do not link lstdc --- src/.bazelrc | 4 ++-- src/software/logger/BUILD | 5 ++++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/.bazelrc b/src/.bazelrc index 12ec7a0860..187c842e0d 100644 --- a/src/.bazelrc +++ b/src/.bazelrc @@ -65,8 +65,8 @@ common --enable_platform_specific_config build --incompatible_remove_legacy_whole_archive=False # Escalate Warnings to fail Compile for Thunderbots code -build --features=external_include_paths -build --per_file_copt=proto/.*,proto/message_translation/.*,proto/primitive/.*,software/.*,shared/.*,-external/.*@-Wall,-Wextra,-Wno-unused-parameter,-Wno-deprecated,-Werror,-Wno-deprecated-declarations +build:linux --features=external_include_paths +build:linux --per_file_copt=proto/.*,proto/message_translation/.*,proto/primitive/.*,software/.*,shared/.*,-external/.*@-Wall,-Wextra,-Wno-unused-parameter,-Wno-deprecated,-Werror,-Wno-deprecated-declarations # TODO: #3492 # build --per_file_copt=software/.*,shared/.*,-external/.*@-Wconversion diff --git a/src/software/logger/BUILD b/src/software/logger/BUILD index 134e185c0e..e097d54037 100644 --- a/src/software/logger/BUILD +++ b/src/software/logger/BUILD @@ -20,7 +20,10 @@ cc_library( "custom_logging_levels.h", "logger.h", ], - linkopts = ["-lstdc++fs"], + linkopts = select({ + "@platforms//os:linux": ["-lstdc++fs"], + "//conditions:default": [], + }), deps = [ ":coloured_cout_sink", ":csv_sink", From 068f212d5a88764ae89e37d0e3a5c9e0647dee19 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 23:07:34 -0700 Subject: [PATCH 08/18] add evdev import guards --- .../thunderscope/robot_diagnostics/handheld_controller.py | 7 ++++++- .../robot_diagnostics/handheld_controller_widget.py | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/software/thunderscope/robot_diagnostics/handheld_controller.py b/src/software/thunderscope/robot_diagnostics/handheld_controller.py index c8e1bc2121..d3a39a3ab0 100644 --- a/src/software/thunderscope/robot_diagnostics/handheld_controller.py +++ b/src/software/thunderscope/robot_diagnostics/handheld_controller.py @@ -1,6 +1,11 @@ import numpy -from evdev import InputDevice, ecodes +# TODO: remove the try-catch when we rewrite this with macOS-compatible lib +try: + from evdev import InputDevice, ecodes +except ImportError: + pass + from threading import Thread diff --git a/src/software/thunderscope/robot_diagnostics/handheld_controller_widget.py b/src/software/thunderscope/robot_diagnostics/handheld_controller_widget.py index ba9473509e..12e9464703 100644 --- a/src/software/thunderscope/robot_diagnostics/handheld_controller_widget.py +++ b/src/software/thunderscope/robot_diagnostics/handheld_controller_widget.py @@ -1,7 +1,11 @@ import numpy -import evdev -from evdev import ecodes +# TODO: remove the try-catch when we rewrite this with macOS-compatible lib +try: + import evdev + from evdev import ecodes +except ImportError: + pass from proto.import_all_protos import * from pyqtgraph.Qt.QtWidgets import * From 4d2b6e970b909add5ac8ecaadc51d7a56cc39574 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 20 Sep 2025 23:16:06 -0700 Subject: [PATCH 09/18] selectively set network interface based on platform --- .../thunderscope/binary_context_managers/BUILD | 1 + .../binary_context_managers/game_controller.py | 10 ++++++++-- src/software/thunderscope/util.py | 8 ++++++++ 3 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/software/thunderscope/binary_context_managers/BUILD b/src/software/thunderscope/binary_context_managers/BUILD index e7805dad6f..52910c81c5 100644 --- a/src/software/thunderscope/binary_context_managers/BUILD +++ b/src/software/thunderscope/binary_context_managers/BUILD @@ -23,6 +23,7 @@ py_library( "//proto:import_all_protos", "//software/networking:ssl_proto_communication", "//software/thunderscope/common:thread_safe_circular_buffer", + "//software/thunderscope:util", ], ) diff --git a/src/software/thunderscope/binary_context_managers/game_controller.py b/src/software/thunderscope/binary_context_managers/game_controller.py index 20c8f11033..150552129e 100644 --- a/src/software/thunderscope/binary_context_managers/game_controller.py +++ b/src/software/thunderscope/binary_context_managers/game_controller.py @@ -4,7 +4,6 @@ import random import logging import os -import socket import time from subprocess import Popen from typing import Any @@ -21,6 +20,7 @@ from software.thunderscope.common.thread_safe_circular_buffer import ( ThreadSafeCircularBuffer, ) +from software.thunderscope.util import is_current_platform_macos logger = logging.getLogger(__name__) import itertools @@ -288,10 +288,16 @@ def __send_referee_command(data: Referee) -> None: if autoref_proto_unix_io is not None: autoref_proto_unix_io.send_proto(Referee, data) + + if is_current_platform_macos(): + loopback_iface = "en0" + else: + loopback_iface = "lo" + self.receive_referee_command = tbots_cpp.SSLRefereeProtoListener( Gamecontroller.REFEREE_IP, self.referee_port, - "lo", + loopback_iface, __send_referee_command, True, ) diff --git a/src/software/thunderscope/util.py b/src/software/thunderscope/util.py index d5634557f9..d879236115 100644 --- a/src/software/thunderscope/util.py +++ b/src/software/thunderscope/util.py @@ -1,3 +1,4 @@ +import platform from typing import Callable, NoReturn, TYPE_CHECKING if TYPE_CHECKING: @@ -195,3 +196,10 @@ def color_from_gradient( int(b_range[i] + (b_range[i + 1] - b_range[i]) * sig_val), int(a_range[i] + (a_range[i + 1] - a_range[i]) * sig_val), ) + +def is_current_platform_macos() -> bool: + """ + Return True if the current process is running on macOS. + Uses platform.system(), which should reliably return 'Darwin' on macOS. + """ + return platform.system().lower() == "darwin" From 42a0793b8176d841040dc3520c1eb589501dca52 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 27 Sep 2025 13:30:26 -0700 Subject: [PATCH 10/18] revert requirements.txt and generate mac specific --- src/software/thunderscope/BUILD | 1 + .../thunderscope/requirements_lock.darwin.txt | 126 ++++++++++++++++++ .../thunderscope/requirements_lock.txt | 3 + 3 files changed, 130 insertions(+) create mode 100644 src/software/thunderscope/requirements_lock.darwin.txt diff --git a/src/software/thunderscope/BUILD b/src/software/thunderscope/BUILD index 464997efca..3b17bdc17b 100644 --- a/src/software/thunderscope/BUILD +++ b/src/software/thunderscope/BUILD @@ -7,6 +7,7 @@ compile_pip_requirements( name = "requirements", src = "requirements.in", requirements_txt = "requirements_lock.txt", + requirements_darwin = "requirements_lock.darwin.txt", ) py_binary( diff --git a/src/software/thunderscope/requirements_lock.darwin.txt b/src/software/thunderscope/requirements_lock.darwin.txt new file mode 100644 index 0000000000..87532ad2ba --- /dev/null +++ b/src/software/thunderscope/requirements_lock.darwin.txt @@ -0,0 +1,126 @@ +# +# This file is autogenerated by pip-compile with Python 3.12 +# by the following command: +# +# bazel run //software/thunderscope:requirements.update +# +colorama==0.4.6 \ + --hash=sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44 \ + --hash=sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6 + # via -r software/thunderscope/requirements.in +darkdetect==0.7.1 \ + --hash=sha256:3efe69f8ecd5f1b7f4fbb0d1d93f656b0e493c45cc49222380ffe2a529cbc866 \ + --hash=sha256:47be3cf5134432ddb616bbffc927237718407914993c82809983e7ccebf49013 + # via pyqtdarktheme-fork +netifaces==0.11.0 \ + --hash=sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32 \ + --hash=sha256:08e3f102a59f9eaef70948340aeb6c89bd09734e0dca0f3b82720305729f63ea \ + --hash=sha256:0f6133ac02521270d9f7c490f0c8c60638ff4aec8338efeff10a1b51506abe85 \ + --hash=sha256:18917fbbdcb2d4f897153c5ddbb56b31fa6dd7c3fa9608b7e3c3a663df8206b5 \ + --hash=sha256:2479bb4bb50968089a7c045f24d120f37026d7e802ec134c4490eae994c729b5 \ + --hash=sha256:2650beee182fed66617e18474b943e72e52f10a24dc8cac1db36c41ee9c041b7 \ + --hash=sha256:28f4bf3a1361ab3ed93c5ef360c8b7d4a4ae060176a3529e72e5e4ffc4afd8b0 \ + --hash=sha256:3ecb3f37c31d5d51d2a4d935cfa81c9bc956687c6f5237021b36d6fdc2815b2c \ + --hash=sha256:469fc61034f3daf095e02f9f1bbac07927b826c76b745207287bc594884cfd05 \ + --hash=sha256:48324183af7f1bc44f5f197f3dad54a809ad1ef0c78baee2c88f16a5de02c4c9 \ + --hash=sha256:50721858c935a76b83dd0dd1ab472cad0a3ef540a1408057624604002fcfb45b \ + --hash=sha256:54ff6624eb95b8a07e79aa8817288659af174e954cca24cdb0daeeddfc03c4ff \ + --hash=sha256:5be83986100ed1fdfa78f11ccff9e4757297735ac17391b95e17e74335c2047d \ + --hash=sha256:5f9ca13babe4d845e400921973f6165a4c2f9f3379c7abfc7478160e25d196a4 \ + --hash=sha256:73ff21559675150d31deea8f1f8d7e9a9a7e4688732a94d71327082f517fc6b4 \ + --hash=sha256:7dbb71ea26d304e78ccccf6faccef71bb27ea35e259fb883cfd7fd7b4f17ecb1 \ + --hash=sha256:815eafdf8b8f2e61370afc6add6194bd5a7252ae44c667e96c4c1ecf418811e4 \ + --hash=sha256:841aa21110a20dc1621e3dd9f922c64ca64dd1eb213c47267a2c324d823f6c8f \ + --hash=sha256:84e4d2e6973eccc52778735befc01638498781ce0e39aa2044ccfd2385c03246 \ + --hash=sha256:8f7da24eab0d4184715d96208b38d373fd15c37b0dafb74756c638bd619ba150 \ + --hash=sha256:96c0fe9696398253f93482c84814f0e7290eee0bfec11563bd07d80d701280c3 \ + --hash=sha256:aab1dbfdc55086c789f0eb37affccf47b895b98d490738b81f3b2360100426be \ + --hash=sha256:c03fb2d4ef4e393f2e6ffc6376410a22a3544f164b336b3a355226653e5efd89 \ + --hash=sha256:c37a1ca83825bc6f54dddf5277e9c65dec2f1b4d0ba44b8fd42bc30c91aa6ea1 \ + --hash=sha256:c92ff9ac7c2282009fe0dcb67ee3cd17978cffbe0c8f4b471c00fe4325c9b4d4 \ + --hash=sha256:c9a3a47cd3aaeb71e93e681d9816c56406ed755b9442e981b07e3618fb71d2ac \ + --hash=sha256:cb925e1ca024d6f9b4f9b01d83215fd00fe69d095d0255ff3f64bffda74025c8 \ + --hash=sha256:d07b01c51b0b6ceb0f09fc48ec58debd99d2c8430b09e56651addeaf5de48048 \ + --hash=sha256:e76c7f351e0444721e85f975ae92718e21c1f361bda946d60a214061de1f00a1 \ + --hash=sha256:eb4813b77d5df99903af4757ce980a98c4d702bbcb81f32a0b305a1537bdf0b1 + # via -r software/thunderscope/requirements.in +numpy==1.26.4 \ + --hash=sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b \ + --hash=sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818 \ + --hash=sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20 \ + --hash=sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0 \ + --hash=sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010 \ + --hash=sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a \ + --hash=sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea \ + --hash=sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c \ + --hash=sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71 \ + --hash=sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110 \ + --hash=sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be \ + --hash=sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a \ + --hash=sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a \ + --hash=sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5 \ + --hash=sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed \ + --hash=sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd \ + --hash=sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c \ + --hash=sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e \ + --hash=sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0 \ + --hash=sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c \ + --hash=sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a \ + --hash=sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b \ + --hash=sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0 \ + --hash=sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6 \ + --hash=sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2 \ + --hash=sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a \ + --hash=sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30 \ + --hash=sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218 \ + --hash=sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5 \ + --hash=sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07 \ + --hash=sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2 \ + --hash=sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4 \ + --hash=sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764 \ + --hash=sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef \ + --hash=sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3 \ + --hash=sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f + # via + # -r software/thunderscope/requirements.in + # pyqtgraph +packaging==24.2 \ + --hash=sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759 \ + --hash=sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f + # via qtpy +protobuf==6.31.1 \ + --hash=sha256:0414e3aa5a5f3ff423828e1e6a6e907d6c65c1d5b7e6e975793d5590bdeecc16 \ + --hash=sha256:426f59d2964864a1a366254fa703b8632dcec0790d8862d30034d8245e1cd447 \ + --hash=sha256:4ee898bf66f7a8b0bd21bce523814e6fbd8c6add948045ce958b73af7e8878c6 \ + --hash=sha256:6f1227473dc43d44ed644425268eb7c2e488ae245d51c6866d19fe158e207402 \ + --hash=sha256:720a6c7e6b77288b85063569baae8536671b39f15cc22037ec7045658d80489e \ + --hash=sha256:7fa17d5a29c2e04b7d90e5e32388b8bfd0e7107cd8e616feef7ed3fa6bdab5c9 \ + --hash=sha256:8764cf4587791e7564051b35524b72844f845ad0bb011704c3736cce762d8fe9 \ + --hash=sha256:a40fc12b84c154884d7d4c4ebd675d5b3b5283e155f324049ae396b95ddebc39 \ + --hash=sha256:d8cac4c982f0b957a4dc73a80e2ea24fab08e679c0de9deb835f4a12d69aca9a + # via -r software/thunderscope/requirements.in +pyqt-toast-notification==1.3.2 \ + --hash=sha256:135736ec0f16bff41104dee3c60ac318e5d55ae3378bf26892c6d08c36088ae6 \ + --hash=sha256:82688101202737736d51ab6c74a573b32266ecb7c8b0002f913407bd369737d9 + # via -r software/thunderscope/requirements.in +pyqt6-qt6==6.8.1 \ + --hash=sha256:006d786693d0511fbcf184a862edbd339c6ed1bb3bd9de363d73a19ed4b23dff \ + --hash=sha256:08065d595f1e6fc2dde9f4450eeff89082f4bad26f600a8e9b9cc5966716bfcf \ + --hash=sha256:1eb8460a1fdb38d0b2458c2974c01d471c1e59e4eb19ea63fc447aaba3ad530e \ + --hash=sha256:20843cb86bd94942d1cd99e39bf1aeabb875b241a35a8ab273e4bbbfa63776db \ + --hash=sha256:9f3790c4ce4dc576e48b8718d55fb8743057e6cbd53a6ca1dd253ffbac9b7287 \ + --hash=sha256:a8bc2ed4ee5e7c6ff4dd1c7db0b27705d151fee5dc232bbd1bf17618f937f515 \ + --hash=sha256:d6ca5d2b9d2ec0ee4a814b2175f641a5c4299cb80b45e0f5f8356632663f89b3 + # via -r software/thunderscope/requirements.in +pyqtdarktheme-fork==2.3.2 \ + --hash=sha256:3ea94fed5df262d960378409357c63032639f749794d766f41a45ad8558b2523 \ + --hash=sha256:d96ee64f0884678fad9b6bc352d5e37d84ca786fa60ed32ffaa7e6c6bc67e964 + # via -r software/thunderscope/requirements.in +pyqtgraph==0.13.7 \ + --hash=sha256:64f84f1935c6996d0e09b1ee66fe478a7771e3ca6f3aaa05f00f6e068321d9e3 \ + --hash=sha256:7754edbefb6c367fa0dfb176e2d0610da3ada20aa7a5318516c74af5fb72bf7a + # via -r software/thunderscope/requirements.in +qtpy==2.4.2 \ + --hash=sha256:5a696b1dd7a354cb330657da1d17c20c2190c72d4888ba923f8461da67aa1a1c \ + --hash=sha256:9d6ec91a587cc1495eaebd23130f7619afa5cdd34a277acb87735b4ad7c65156 + # via pyqt-toast-notification diff --git a/src/software/thunderscope/requirements_lock.txt b/src/software/thunderscope/requirements_lock.txt index 55045c79c5..a50ed09232 100644 --- a/src/software/thunderscope/requirements_lock.txt +++ b/src/software/thunderscope/requirements_lock.txt @@ -12,6 +12,9 @@ darkdetect==0.7.1 \ --hash=sha256:3efe69f8ecd5f1b7f4fbb0d1d93f656b0e493c45cc49222380ffe2a529cbc866 \ --hash=sha256:47be3cf5134432ddb616bbffc927237718407914993c82809983e7ccebf49013 # via pyqtdarktheme-fork +evdev==1.7.0 \ + --hash=sha256:95bd2a1e0c6ce2cd7a2ecc6e6cd9736ff794b3ad5cb54d81d8cbc2e414d0b870 + # via -r software/thunderscope/requirements.in netifaces==0.11.0 \ --hash=sha256:043a79146eb2907edf439899f262b3dfe41717d34124298ed281139a8b93ca32 \ --hash=sha256:08e3f102a59f9eaef70948340aeb6c89bd09734e0dca0f3b82720305729f63ea \ From d6b303dbaad1b36def7cd6a0719864377b7954ce Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 18 Oct 2025 11:51:24 -0700 Subject: [PATCH 11/18] resolve ubuntu failure --- environment_setup/setup_software.sh | 1 + environment_setup/setup_software_mac.sh | 2 +- environment_setup/util.sh | 2 +- src/MODULE.bazel | 2 +- 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/environment_setup/setup_software.sh b/environment_setup/setup_software.sh index c2c65d90ec..ec68c9e48f 100755 --- a/environment_setup/setup_software.sh +++ b/environment_setup/setup_software.sh @@ -158,6 +158,7 @@ print_status_msg "Done setting up cross compiler for robot software" print_status_msg "Setting Up Python Development Headers" install_python_dev_cross_compile_headers $g_arch +install_python_toolchain_headers print_status_msg "Done Setting Up Python Development Headers" print_status_msg "Setting Up PlatformIO" diff --git a/environment_setup/setup_software_mac.sh b/environment_setup/setup_software_mac.sh index 7b7b2bc679..36fd69929b 100755 --- a/environment_setup/setup_software_mac.sh +++ b/environment_setup/setup_software_mac.sh @@ -88,7 +88,7 @@ install_cross_compiler_mac print_status_msg "Done setting up cross compiler for robot software" print_status_msg "Setting Up Python Development Headers" -install_python_toolchain_headers_macos +install_python_toolchain_headers print_status_msg "Done Setting Up Python Development Headers" print_status_msg "Granting Permissions to /opt/tbotspython" diff --git a/environment_setup/util.sh b/environment_setup/util.sh index 8c5be169e7..91b6e5c04f 100755 --- a/environment_setup/util.sh +++ b/environment_setup/util.sh @@ -133,7 +133,7 @@ install_python_dev_cross_compile_headers() { rm -rf /tmp/tbots_download_cache/python-3.12.0.tar.xz } -install_python_toolchain_headers_macos() { +install_python_toolchain_headers() { sudo mkdir -p /opt/tbotspython/py_headers/include/ sudo ln -sfn "$(python3.12-config --includes | awk '{for(i=1;i<=NF;++i) if ($i ~ /^-I/) print substr($i, 3)}' | head -n1)" /opt/tbotspython/py_headers/include/ } diff --git a/src/MODULE.bazel b/src/MODULE.bazel index e1d8792571..ddc82daf33 100644 --- a/src/MODULE.bazel +++ b/src/MODULE.bazel @@ -280,7 +280,7 @@ new_local_repository( new_local_repository( name = "py_cc_toolchain_for_k8_jetson_nano_cross_compile", build_file = "@//extlibs:py_cc_toolchain.BUILD", - path = "/opt/tbotspython/py_headers/include/python3.12/", + path = "/opt/tbotspython/cross_compile_headers/include/python3.12/", ) ############################################## From c85da8103a326f66f2d764dd2b099e96d7a5380b Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 15 Nov 2025 12:25:07 -0800 Subject: [PATCH 12/18] update req lock for linux --- src/software/thunderscope/requirements_lock.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/software/thunderscope/requirements_lock.txt b/src/software/thunderscope/requirements_lock.txt index a50ed09232..1b4d0632ee 100644 --- a/src/software/thunderscope/requirements_lock.txt +++ b/src/software/thunderscope/requirements_lock.txt @@ -12,7 +12,7 @@ darkdetect==0.7.1 \ --hash=sha256:3efe69f8ecd5f1b7f4fbb0d1d93f656b0e493c45cc49222380ffe2a529cbc866 \ --hash=sha256:47be3cf5134432ddb616bbffc927237718407914993c82809983e7ccebf49013 # via pyqtdarktheme-fork -evdev==1.7.0 \ +evdev==1.7.0 ; sys_platform == "linux" \ --hash=sha256:95bd2a1e0c6ce2cd7a2ecc6e6cd9736ff794b3ad5cb54d81d8cbc2e414d0b870 # via -r software/thunderscope/requirements.in netifaces==0.11.0 \ From 49e0b0a7053a502e580235f81ec3f8c63ac860a2 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 22 Nov 2025 12:03:40 -0800 Subject: [PATCH 13/18] change bazelrc --- src/.bazelrc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/.bazelrc b/src/.bazelrc index 187c842e0d..143184468b 100644 --- a/src/.bazelrc +++ b/src/.bazelrc @@ -65,7 +65,7 @@ common --enable_platform_specific_config build --incompatible_remove_legacy_whole_archive=False # Escalate Warnings to fail Compile for Thunderbots code -build:linux --features=external_include_paths +build --features=external_include_paths build:linux --per_file_copt=proto/.*,proto/message_translation/.*,proto/primitive/.*,software/.*,shared/.*,-external/.*@-Wall,-Wextra,-Wno-unused-parameter,-Wno-deprecated,-Werror,-Wno-deprecated-declarations # TODO: #3492 # build --per_file_copt=software/.*,shared/.*,-external/.*@-Wconversion From 1ee0a5878a9820a338c70fbc3cdab7bc5532cd73 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:13:11 +0000 Subject: [PATCH 14/18] [pre-commit.ci lite] apply automatic fixes --- .../er_force_sim/src/amun/simulator/simulator.cpp | 3 ++- src/software/logger/BUILD | 12 ++++++------ src/software/logger/compat_flags.h | 3 +-- src/software/logger/log_merger.cpp | 3 +-- src/software/logger/log_merger.h | 4 ++-- src/software/logger/logger.h | 3 +-- src/software/logger/proto_logger.cpp | 2 +- src/software/thunderscope/BUILD | 2 +- .../thunderscope/binary_context_managers/BUILD | 2 +- .../binary_context_managers/game_controller.py | 1 - src/software/thunderscope/util.py | 4 ++-- 11 files changed, 18 insertions(+), 21 deletions(-) diff --git a/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp b/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp index f4e257bb39..1f64796560 100644 --- a/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp +++ b/src/extlibs/er_force_sim/src/amun/simulator/simulator.cpp @@ -682,7 +682,8 @@ void Simulator::handleSimulatorSetupCommand(const std::unique_ptr if (realism.has_vision_processing_time()) { - m_visionProcessingTime = std::max(0l, realism.vision_processing_time()); + m_visionProcessingTime = + std::max(0l, realism.vision_processing_time()); } if (realism.has_simulate_dribbling()) diff --git a/src/software/logger/BUILD b/src/software/logger/BUILD index e097d54037..6fa65a6909 100644 --- a/src/software/logger/BUILD +++ b/src/software/logger/BUILD @@ -9,8 +9,8 @@ cc_library( "log_merger.h", ], deps = [ - "@g3log", ":compat_flags", + "@g3log", ], ) @@ -21,18 +21,18 @@ cc_library( "logger.h", ], linkopts = select({ - "@platforms//os:linux": ["-lstdc++fs"], - "//conditions:default": [], + "@platforms//os:linux": ["-lstdc++fs"], + "//conditions:default": [], }), deps = [ ":coloured_cout_sink", + ":compat_flags", ":csv_sink", ":log_merger", ":plotjuggler_sink", ":protobuf_sink", "@g3log", "@g3sinks", - ":compat_flags", ], ) @@ -108,8 +108,8 @@ cc_library( "custom_logging_levels.h", ], deps = [ - "@g3log", ":compat_flags", + "@g3log", ], ) @@ -188,12 +188,12 @@ cc_library( "proto_logger.h", ], deps = [ + ":compat_flags", "//proto:tbots_cc_proto", "//software/multithreading:thread_safe_buffer", "@base64", "@boost//:filesystem", "@zlib", - ":compat_flags", ], ) diff --git a/src/software/logger/compat_flags.h b/src/software/logger/compat_flags.h index 32eed9b6a3..c57d8854d2 100644 --- a/src/software/logger/compat_flags.h +++ b/src/software/logger/compat_flags.h @@ -5,7 +5,7 @@ #if defined(__APPLE__) using Clock = std::chrono::system_clock; #else -using Clock = std::chrono::_V2::system_clock; +using Clock = std::chrono::_V2::system_clock; #endif #if __cplusplus > 201703L @@ -15,4 +15,3 @@ namespace fs = std::filesystem; #include namespace fs = std::experimental::filesystem; #endif - diff --git a/src/software/logger/log_merger.cpp b/src/software/logger/log_merger.cpp index 338c4c1029..4139e4fea5 100644 --- a/src/software/logger/log_merger.cpp +++ b/src/software/logger/log_merger.cpp @@ -11,8 +11,7 @@ std::list LogMerger::log(g3::LogMessage &log) { std::string msg = log.message(); - Clock::time_point current_time = - std::chrono::system_clock::now(); + Clock::time_point current_time = std::chrono::system_clock::now(); // add passed time from testing current_time += passed_time; std::list messages_to_log = _getOldMessages(current_time); diff --git a/src/software/logger/log_merger.h b/src/software/logger/log_merger.h index d4dba461d4..00a44c02de 100644 --- a/src/software/logger/log_merger.h +++ b/src/software/logger/log_merger.h @@ -4,6 +4,7 @@ #include #include #include + #include "compat_flags.h" @@ -56,8 +57,7 @@ class LogMerger std::string msg; Clock::time_point timestamp; - Message(g3::LogMessage &log, std::string msg, - Clock::time_point timestamp) + Message(g3::LogMessage &log, std::string msg, Clock::time_point timestamp) : log(log), msg(msg), timestamp(timestamp) { } diff --git a/src/software/logger/logger.h b/src/software/logger/logger.h index 817af6cf61..5b6e372e33 100644 --- a/src/software/logger/logger.h +++ b/src/software/logger/logger.h @@ -7,14 +7,13 @@ #include #include +#include "compat_flags.h" #include "software/logger/coloured_cout_sink.h" #include "software/logger/csv_sink.h" #include "software/logger/custom_logging_levels.h" #include "software/logger/plotjuggler_sink.h" #include "software/logger/protobuf_sink.h" -#include "compat_flags.h" - // This undefines LOG macro defined by g3log #undef LOG diff --git a/src/software/logger/proto_logger.cpp b/src/software/logger/proto_logger.cpp index 30bd7b51c9..4cde56cab7 100644 --- a/src/software/logger/proto_logger.cpp +++ b/src/software/logger/proto_logger.cpp @@ -11,8 +11,8 @@ #include #include "base64.h" -#include "shared/constants.h" #include "compat_flags.h" +#include "shared/constants.h" ProtoLogger::ProtoLogger(const std::string& log_path, std::function time_provider, diff --git a/src/software/thunderscope/BUILD b/src/software/thunderscope/BUILD index 3b17bdc17b..5234832aab 100644 --- a/src/software/thunderscope/BUILD +++ b/src/software/thunderscope/BUILD @@ -6,8 +6,8 @@ package(default_visibility = ["//visibility:public"]) compile_pip_requirements( name = "requirements", src = "requirements.in", - requirements_txt = "requirements_lock.txt", requirements_darwin = "requirements_lock.darwin.txt", + requirements_txt = "requirements_lock.txt", ) py_binary( diff --git a/src/software/thunderscope/binary_context_managers/BUILD b/src/software/thunderscope/binary_context_managers/BUILD index 52910c81c5..947416d088 100644 --- a/src/software/thunderscope/binary_context_managers/BUILD +++ b/src/software/thunderscope/binary_context_managers/BUILD @@ -22,8 +22,8 @@ py_library( deps = [ "//proto:import_all_protos", "//software/networking:ssl_proto_communication", - "//software/thunderscope/common:thread_safe_circular_buffer", "//software/thunderscope:util", + "//software/thunderscope/common:thread_safe_circular_buffer", ], ) diff --git a/src/software/thunderscope/binary_context_managers/game_controller.py b/src/software/thunderscope/binary_context_managers/game_controller.py index 150552129e..79cc8a0925 100644 --- a/src/software/thunderscope/binary_context_managers/game_controller.py +++ b/src/software/thunderscope/binary_context_managers/game_controller.py @@ -288,7 +288,6 @@ def __send_referee_command(data: Referee) -> None: if autoref_proto_unix_io is not None: autoref_proto_unix_io.send_proto(Referee, data) - if is_current_platform_macos(): loopback_iface = "en0" else: diff --git a/src/software/thunderscope/util.py b/src/software/thunderscope/util.py index d879236115..2e3e420203 100644 --- a/src/software/thunderscope/util.py +++ b/src/software/thunderscope/util.py @@ -197,9 +197,9 @@ def color_from_gradient( int(a_range[i] + (a_range[i + 1] - a_range[i]) * sig_val), ) + def is_current_platform_macos() -> bool: - """ - Return True if the current process is running on macOS. + """Return True if the current process is running on macOS. Uses platform.system(), which should reliably return 'Darwin' on macOS. """ return platform.system().lower() == "darwin" From 6642aa248ddecfbafd1b529ddd7954413e3d4957 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 6 Dec 2025 11:20:38 -0800 Subject: [PATCH 15/18] add cpp template type --- src/software/ai/hl/stp/play/play.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/software/ai/hl/stp/play/play.cpp b/src/software/ai/hl/stp/play/play.cpp index d3da53bf6f..ad2dde8301 100644 --- a/src/software/ai/hl/stp/play/play.cpp +++ b/src/software/ai/hl/stp/play/play.cpp @@ -206,7 +206,7 @@ std::unique_ptr Play::get( new_primitives_to_assign->robot_primitives()) { primitives_to_run->mutable_robot_primitives()->insert( - google::protobuf::MapPair(robot_id, primitive)); + google::protobuf::MapPair(robot_id, primitive)); } robots = remaining_robots; From 34b23388d3666816eb00cb90a90dfebdf74d9aae Mon Sep 17 00:00:00 2001 From: "pre-commit-ci-lite[bot]" <117423508+pre-commit-ci-lite[bot]@users.noreply.github.com> Date: Sat, 6 Dec 2025 19:27:20 +0000 Subject: [PATCH 16/18] [pre-commit.ci lite] apply automatic fixes --- src/software/ai/hl/stp/play/play.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/software/ai/hl/stp/play/play.cpp b/src/software/ai/hl/stp/play/play.cpp index ad2dde8301..ddd0a98465 100644 --- a/src/software/ai/hl/stp/play/play.cpp +++ b/src/software/ai/hl/stp/play/play.cpp @@ -206,7 +206,8 @@ std::unique_ptr Play::get( new_primitives_to_assign->robot_primitives()) { primitives_to_run->mutable_robot_primitives()->insert( - google::protobuf::MapPair(robot_id, primitive)); + google::protobuf::MapPair( + robot_id, primitive)); } robots = remaining_robots; From 822d644b35ca677161b8dc6aafb6a7325407d07a Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Sat, 6 Dec 2025 11:56:35 -0800 Subject: [PATCH 17/18] refactor setup script --- environment_setup/setup_software_mac.sh | 10 +- environment_setup/util.sh | 120 ++++++++++++------------ 2 files changed, 62 insertions(+), 68 deletions(-) diff --git a/environment_setup/setup_software_mac.sh b/environment_setup/setup_software_mac.sh index 36fd69929b..ee1e334c4e 100755 --- a/environment_setup/setup_software_mac.sh +++ b/environment_setup/setup_software_mac.sh @@ -1,5 +1,4 @@ #!/bin/bash -set -x #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~# # UBC Thunderbots macOS Software Setup # @@ -13,7 +12,7 @@ cd "$CURR_DIR" || exit source util.sh -arch=$(uname -m) +arch=$(uname -s) print_status_msg "Detected architecture: ${arch}" # Check for Homebrew and install if missing @@ -74,17 +73,16 @@ sudo pip install -r macos_requirements.txt print_status_msg "Done Setting Up Python Environment" print_status_msg "Fetching game controller" -install_gamecontroller_macos +install_gamecontroller $arch print_status_msg "Setting up TIGERS AutoRef" -install_java_macos -install_autoref_macos +install_autoref $arch sudo chmod +x "$CURR_DIR/../src/software/autoref/run_autoref.sh" sudo cp "$CURR_DIR/../src/software/autoref/DIV_B.txt" "/opt/tbotspython/autoReferee/config/geometry/DIV_B.txt" print_status_msg "Finished setting up AutoRef" print_status_msg "Setting up cross compiler for robot software" -install_cross_compiler_mac +install_cross_compiler $arch print_status_msg "Done setting up cross compiler for robot software" print_status_msg "Setting Up Python Development Headers" diff --git a/environment_setup/util.sh b/environment_setup/util.sh index 91b6e5c04f..fb85ba8a2b 100755 --- a/environment_setup/util.sh +++ b/environment_setup/util.sh @@ -1,20 +1,20 @@ install_autoref() { - autoref_commit=b30660b78728c3ce159de8ae096181a1ec52e9ba - wget -N https://github.com/TIGERs-Mannheim/AutoReferee/archive/${autoref_commit}.zip -O /tmp/tbots_download_cache/autoReferee.zip - unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/autoReferee.zip + if is_darwin $1; then + autoref_version=1.5.5 + curl -L https://github.com/TIGERs-Mannheim/AutoReferee/releases/download/${autoref_version}/autoReferee.zip -o /tmp/tbots_download_cache/autoReferee.zip + unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/autoReferee.zip - /tmp/tbots_download_cache/AutoReferee-${autoref_commit}/./gradlew installDist -p /tmp/tbots_download_cache/AutoReferee-${autoref_commit} -Dorg.gradle.java.home=/opt/tbotspython/bin/jdk - mv /tmp/tbots_download_cache/AutoReferee-${autoref_commit}/build/install/autoReferee /opt/tbotspython/ - rm -rf /tmp/tbots_download_cache/autoReferee.zip /tmp/tbots_download_cache/AutoReferee-${autoref_commit} -} - -install_autoref_macos() { - autoref_version=1.5.5 - curl -L https://github.com/TIGERs-Mannheim/AutoReferee/releases/download/${autoref_version}/autoReferee.zip -o /tmp/tbots_download_cache/autoReferee.zip - unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/autoReferee.zip + sudo mv /tmp/tbots_download_cache/autoReferee /opt/tbotspython/ + rm -rf /tmp/tbots_download_cache/autoReferee.zip + else + autoref_commit=b30660b78728c3ce159de8ae096181a1ec52e9ba + wget -N https://github.com/TIGERs-Mannheim/AutoReferee/archive/${autoref_commit}.zip -O /tmp/tbots_download_cache/autoReferee.zip + unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/autoReferee.zip - sudo mv /tmp/tbots_download_cache/autoReferee /opt/tbotspython/ - rm -rf /tmp/tbots_download_cache/autoReferee.zip + /tmp/tbots_download_cache/AutoReferee-${autoref_commit}/./gradlew installDist -p /tmp/tbots_download_cache/AutoReferee-${autoref_commit} -Dorg.gradle.java.home=/opt/tbotspython/bin/jdk + mv /tmp/tbots_download_cache/AutoReferee-${autoref_commit}/build/install/autoReferee /opt/tbotspython/ + rm -rf /tmp/tbots_download_cache/autoReferee.zip /tmp/tbots_download_cache/AutoReferee-${autoref_commit} + fi } install_bazel() { @@ -34,48 +34,47 @@ install_clang_format() { install_cross_compiler() { file_name=aarch64-tbots-linux-gnu-for-aarch64 - if is_x86 $1; then - file_name=aarch64-tbots-linux-gnu-for-x86 + if is_darwin $1; then + full_file_name=$file_name.tar.xz + curl -L "https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name" \ + -o /tmp/tbots_download_cache/$full_file_name + tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/ + sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython + rm /tmp/tbots_download_cache/$full_file_name + else + if is_x86 $1; then + file_name=aarch64-tbots-linux-gnu-for-x86 + fi + full_file_name=$file_name.tar.xz + wget https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name -O /tmp/tbots_download_cache/$full_file_name + tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/ + sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython + rm /tmp/tbots_download_cache/$full_file_name fi - full_file_name=$file_name.tar.xz - wget https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name -O /tmp/tbots_download_cache/$full_file_name - tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/ - sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython - rm /tmp/tbots_download_cache/$full_file_name -} - -install_cross_compiler_mac() { - file_name=aarch64-tbots-linux-gnu-for-aarch64 - full_file_name=$file_name.tar.xz - curl -L "https://raw.githubusercontent.com/UBC-Thunderbots/Software-External-Dependencies/refs/heads/main/toolchain/$full_file_name" \ - -o /tmp/tbots_download_cache/$full_file_name - tar -xf /tmp/tbots_download_cache/$full_file_name -C /tmp/tbots_download_cache/ - sudo mv /tmp/tbots_download_cache/aarch64-tbots-linux-gnu /opt/tbotspython - rm /tmp/tbots_download_cache/$full_file_name } install_gamecontroller () { - arch=arm64 - if is_x86 $1; then - arch=amd64 + if is_darwin $1; then + curl -L https://github.com/RoboCup-SSL/ssl-game-controller/archive/refs/tags/v3.17.0.zip -o /tmp/tbots_download_cache/ssl-game-controller.zip + unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/ssl-game-controller.zip + cd /tmp/tbots_download_cache/ssl-game-controller-3.17.0 + make install + go build cmd/ssl-game-controller/main.go + sudo mv main /opt/tbotspython/gamecontroller + sudo chmod +x /opt/tbotspython/gamecontroller + + cd - + sudo rm -rf /tmp/tbots_download_cache/ssl-game-controller-3.17.0 /tmp/tbots_download_cache/go /tmp/tbots_download_cache/go.tar.gz /tmp/tbots_download_cache/ssl-game-controller.zip + else + arch=arm64 + if is_x86 $1; then + arch=amd64 + fi + + wget https://github.com/RoboCup-SSL/ssl-game-controller/releases/download/v3.16.1/ssl-game-controller_v3.16.1_linux_${arch} -O /tmp/tbots_download_cache/gamecontroller + sudo mv /tmp/tbots_download_cache/gamecontroller /opt/tbotspython/gamecontroller + sudo chmod +x /opt/tbotspython/gamecontroller fi - - wget https://github.com/RoboCup-SSL/ssl-game-controller/releases/download/v3.16.1/ssl-game-controller_v3.16.1_linux_${arch} -O /tmp/tbots_download_cache/gamecontroller - sudo mv /tmp/tbots_download_cache/gamecontroller /opt/tbotspython/gamecontroller - sudo chmod +x /opt/tbotspython/gamecontroller -} - -install_gamecontroller_macos () { - curl -L https://github.com/RoboCup-SSL/ssl-game-controller/archive/refs/tags/v3.17.0.zip -o /tmp/tbots_download_cache/ssl-game-controller.zip - unzip -q -o -d /tmp/tbots_download_cache/ /tmp/tbots_download_cache/ssl-game-controller.zip - cd /tmp/tbots_download_cache/ssl-game-controller-3.17.0 - make install - go build cmd/ssl-game-controller/main.go - sudo mv main /opt/tbotspython/gamecontroller - sudo chmod +x /opt/tbotspython/gamecontroller - - cd - - sudo rm -rf /tmp/tbots_download_cache/ssl-game-controller-3.17.0 /tmp/tbots_download_cache/go /tmp/tbots_download_cache/go.tar.gz /tmp/tbots_download_cache/ssl-game-controller.zip } install_java () { @@ -90,17 +89,6 @@ install_java () { rm /tmp/tbots_download_cache/jdk-21.tar.gz } -install_java_macos () { - java_home="" - java_download=https://download.oracle.com/java/21/latest/jdk-21_macos-aarch64_bin.tar.gz - curl -L $java_download -o /tmp/tbots_download_cache/jdk-21.tar.gz - mkdir /tmp/tbots_download_cache/jdk - tar -xzf /tmp/tbots_download_cache/jdk-21.tar.gz -C /tmp/tbots_download_cache - sudo mv /tmp/tbots_download_cache/jdk-21*/Contents/Home /opt/tbotspython/bin/jdk - rm /tmp/tbots_download_cache/jdk-21.tar.gz - rm -rf /tmp/tbots_download_cache/jdk -} - install_python_dev_cross_compile_headers() { mkdir -p /opt/tbotspython/cross_compile_headers wget -N https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tar.xz -O /tmp/tbots_download_cache/python-3.12.0.tar.xz @@ -146,6 +134,14 @@ is_x86() { fi } +is_darwin() { + if [[ $1 == "Darwin" ]]; then + return 0 + else + return 1 + fi +} + print_status_msg () { echo "================================================================" echo $1 From 2e7f57917ad8e63bfabfa2f2a1628961de115559 Mon Sep 17 00:00:00 2001 From: Minghao Li Date: Wed, 21 Jan 2026 22:43:19 -0800 Subject: [PATCH 18/18] address comments --- environment_setup/setup_software_mac.sh | 28 ++++++++----------------- 1 file changed, 9 insertions(+), 19 deletions(-) diff --git a/environment_setup/setup_software_mac.sh b/environment_setup/setup_software_mac.sh index ee1e334c4e..b714235023 100755 --- a/environment_setup/setup_software_mac.sh +++ b/environment_setup/setup_software_mac.sh @@ -12,21 +12,9 @@ cd "$CURR_DIR" || exit source util.sh -arch=$(uname -s) -print_status_msg "Detected architecture: ${arch}" - -# Check for Homebrew and install if missing -if ! command -v brew &>/dev/null; then - print_status_msg "Installing Homebrew..." - /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" - - # Configure Homebrew in current shell - if [ "$arch" = "arm64" ]; then - eval "$(/opt/homebrew/bin/brew shellenv)" - else - eval "$(/usr/local/bin/brew shellenv)" - fi -fi +# Since we only support MacOS Arm chips (M series), we can use "Darwin" as the identifier +# for mac setup procedures and ignore the architecture for now. +sys=$(uname -s) print_status_msg "Installing Utilities and Dependencies" @@ -73,16 +61,16 @@ sudo pip install -r macos_requirements.txt print_status_msg "Done Setting Up Python Environment" print_status_msg "Fetching game controller" -install_gamecontroller $arch +install_gamecontroller $sys print_status_msg "Setting up TIGERS AutoRef" -install_autoref $arch +install_autoref $sys sudo chmod +x "$CURR_DIR/../src/software/autoref/run_autoref.sh" sudo cp "$CURR_DIR/../src/software/autoref/DIV_B.txt" "/opt/tbotspython/autoReferee/config/geometry/DIV_B.txt" print_status_msg "Finished setting up AutoRef" print_status_msg "Setting up cross compiler for robot software" -install_cross_compiler $arch +install_cross_compiler $sys print_status_msg "Done setting up cross compiler for robot software" print_status_msg "Setting Up Python Development Headers" @@ -93,7 +81,9 @@ print_status_msg "Granting Permissions to /opt/tbotspython" sudo chown -R $(id -u):$(id -g) /opt/tbotspython print_status_msg "Done Granting Permissions to /opt/tbotspython" -print_status_msg "Done Environment Configuration" +print_status_msg "Set up ansible-lint" +/opt/tbotspython/bin/ansible-galaxy collection install ansible.posix +print_status_msg "Finished setting up ansible-lint" print_status_msg "Software Setup Complete" print_status_msg "Note: Some changes require a new terminal session to take effect"