diff --git a/.github/workflows/c-cpp.yml b/.github/workflows/c-cpp.yml
index e5111ba..4478f93 100644
--- a/.github/workflows/c-cpp.yml
+++ b/.github/workflows/c-cpp.yml
@@ -67,11 +67,68 @@ jobs:
echo "Is Release: ${{ steps.version.outputs.is-release }}"
echo "Tag: ${{ steps.version.outputs.tag }}"
- test:
- name: Run Unit Tests
+ cmake-build:
+ name: CMake Build and Test
runs-on: ubuntu-latest
needs: version
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4
+
+ - name: Setup CMake
+ uses: jwlawson/actions-setup-cmake@v1.13
+ with:
+ cmake-version: '4.1.0'
+
+ - name: Setup Python
+ uses: actions/setup-python@v4
+ with:
+ python-version: '3.11'
+
+ - name: Install PlatformIO
+ run: |
+ python -m pip install --upgrade pip
+ pip install platformio==${{ env.PLATFORMIO_VERSION }}
+
+ - name: Cache PlatformIO packages
+ uses: actions/cache@v3
+ with:
+ path: |
+ ~/.platformio
+ ~/.cache/pip
+ key: ${{ runner.os }}-pio-${{ hashFiles('**/platformio.ini') }}
+ restore-keys: |
+ ${{ runner.os }}-pio-
+
+ - name: Configure CMake
+ working-directory: ./code/RocketLauncher
+ run: |
+ cmake --preset default
+
+ - name: Build CMake Project
+ working-directory: ./code/RocketLauncher
+ run: |
+ cmake --build . --preset default
+
+ - name: Run CMake Tests
+ working-directory: ./code/RocketLauncher
+ run: |
+ ctest --preset default --output-on-failure
+
+ - name: Upload CMake test results
+ uses: actions/upload-artifact@v4
+ if: always()
+ with:
+ name: cmake-test-results
+ path: ./code/RocketLauncher/build/
+ retention-days: 30
+
+ test:
+ name: Run PlatformIO Unit Tests
+ runs-on: ubuntu-latest
+ needs: [version, cmake-build]
+
steps:
- name: Checkout code
uses: actions/checkout@v4
@@ -96,23 +153,23 @@ jobs:
restore-keys: |
${{ runner.os }}-pio-
- - name: Run Unit Tests
+ - name: Run PlatformIO Unit Tests
working-directory: ./code/RocketLauncher
run: |
pio test -e native
- - name: Upload test results
+ - name: Upload PlatformIO test results
uses: actions/upload-artifact@v4
if: always()
with:
- name: test-results
+ name: platformio-test-results
path: ./code/RocketLauncher/.pio/test/native/
retention-days: 30
build-simulation:
name: Build Simulation Firmware
runs-on: ubuntu-latest
- needs: [version, test]
+ needs: [version, cmake-build, test]
steps:
- name: Checkout code
@@ -164,7 +221,7 @@ jobs:
build-hardware:
name: Build Hardware Firmware
runs-on: ubuntu-latest
- needs: [version, test]
+ needs: [version, cmake-build, test]
steps:
- name: Checkout code
@@ -204,8 +261,6 @@ jobs:
./code/RocketLauncher/.pio/build/uno_hw/firmware.elf
retention-days: 90
-
-
create-tag:
name: Create Git Tag
runs-on: ubuntu-latest
@@ -262,9 +317,10 @@ jobs:
## ๐ Luke's Rocket Launcher v${{ needs.version.outputs.version }}
### What's New
- - Automated build and testing
+ - Automated build and testing with CMake
- Pre-compiled firmware for Arduino and SimulIDE
- Comprehensive unit test coverage
+ - Modern CMake build system for IDE integration
### Downloads
- **Simulation Firmware**: For SimulIDE testing
@@ -279,6 +335,7 @@ jobs:
- **Version**: ${{ needs.version.outputs.version }}
- **Build Date**: ${{ github.event.head_commit.timestamp }}
- **Commit**: ${{ github.sha }}
+ - **Build System**: CMake + PlatformIO
draft: false
prerelease: false
@@ -367,7 +424,7 @@ jobs:
### For Hardware
1. Download the package
2. Use Arduino IDE or PlatformIO to upload `firmware/hardware/firmware.hex`
- 3. Or use `make upload` from the project directory
+ 3. Or use `./scripts/build.sh upload` from the project directory
### For Simulation
1. Download the package
@@ -380,6 +437,7 @@ jobs:
- **Built on**: ${{ github.event.head_commit.timestamp }}
- **Commit**: ${{ github.sha }}
- **Platform**: ${{ runner.os }}
+ - **Build System**: CMake + PlatformIO
## ๐ Documentation
- [Project README](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher#readme)
@@ -406,7 +464,7 @@ jobs:
build-status:
name: Build Status Report
runs-on: ubuntu-latest
- needs: [test, build-simulation, build-hardware]
+ needs: [cmake-build, test, build-simulation, build-hardware]
if: always()
steps:
@@ -422,10 +480,16 @@ jobs:
echo "**Branch:** ${{ github.ref_name }}" >> $GITHUB_STEP_SUMMARY
echo "" >> $GITHUB_STEP_SUMMARY
- if [ "${{ needs.test.result }}" == "success" ]; then
- echo "โ
**Tests:** PASSED" >> $GITHUB_STEP_SUMMARY
+ if [ "${{ needs.cmake-build.result }}" == "success" ]; then
+ echo "โ
**CMake Build:** SUCCESS" >> $GITHUB_STEP_SUMMARY
else
- echo "โ **Tests:** FAILED" >> $GITHUB_STEP_SUMMARY
+ echo "โ **CMake Build:** FAILED" >> $GITHUB_STEP_SUMMARY
+ fi
+
+ if [ "${{ needs.test.result }}" == "success" ]; then
+ echo "โ
**PlatformIO Tests:** PASSED" >> $GITHUB_STEP_SUMMARY
+ else
+ echo "โ **PlatformIO Tests:** FAILED" >> $GITHUB_STEP_SUMMARY
fi
if [ "${{ needs.build-simulation.result }}" == "success" ]; then
@@ -441,6 +505,7 @@ jobs:
fi
echo "" >> $GITHUB_STEP_SUMMARY
+ echo "**Build System:** CMake + PlatformIO" >> $GITHUB_STEP_SUMMARY
echo "**Firmware files are available as artifacts above.**" >> $GITHUB_STEP_SUMMARY
publish-package:
@@ -503,7 +568,9 @@ jobs:
"launcher",
"firmware",
"simulide",
- "3d-printing"
+ "3d-printing",
+ "cmake",
+ "platformio"
],
"author": "KofTwentyTwo",
"license": "MIT",
@@ -556,7 +623,7 @@ jobs:
### For Hardware
1. Download the package
2. Use Arduino IDE or PlatformIO to upload \`firmware/hardware/firmware.hex\`
- 3. Or use \`make upload\` from the project directory
+ 3. Or use \`./scripts/build.sh upload\` from the project directory
### For Simulation
1. Download the package
@@ -569,6 +636,7 @@ jobs:
- **Built on**: ${{ github.event.head_commit.timestamp }}
- **Commit**: ${{ github.sha }}
- **Platform**: ${{ runner.os }}
+ - **Build System**: CMake + PlatformIO
## ๐ Documentation
- [Project README](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher#readme)
diff --git a/.gitignore b/.gitignore
index 845cda6..fe8ae36 100644
--- a/.gitignore
+++ b/.gitignore
@@ -53,3 +53,4 @@ dkms.conf
# debug information files
*.dwo
+/code/RocketLauncher/.pio/
diff --git a/code/RocketLauncher/.idea/.gitignore b/.idea/.gitignore
similarity index 100%
rename from code/RocketLauncher/.idea/.gitignore
rename to .idea/.gitignore
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..b7a48fc
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+RocketLauncher
\ No newline at end of file
diff --git a/.idea/Lukes-Rocket-Launcher.iml b/.idea/Lukes-Rocket-Launcher.iml
new file mode 100644
index 0000000..f08604b
--- /dev/null
+++ b/.idea/Lukes-Rocket-Launcher.iml
@@ -0,0 +1,2 @@
+
+
\ No newline at end of file
diff --git a/.idea/cmake.xml b/.idea/cmake.xml
new file mode 100644
index 0000000..cbe208e
--- /dev/null
+++ b/.idea/cmake.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/material_theme_project_new.xml b/.idea/material_theme_project_new.xml
similarity index 100%
rename from code/RocketLauncher/.idea/material_theme_project_new.xml
rename to .idea/material_theme_project_new.xml
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..736a86d
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
new file mode 100644
index 0000000..169cf7d
--- /dev/null
+++ b/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/vcs.xml b/.idea/vcs.xml
similarity index 68%
rename from code/RocketLauncher/.idea/vcs.xml
rename to .idea/vcs.xml
index b2bdec2..35eb1dd 100644
--- a/code/RocketLauncher/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -1,6 +1,6 @@
-
+
\ No newline at end of file
diff --git a/code/RocketLauncher/.gitignore b/code/RocketLauncher/.gitignore
index 56b1dcd..3794f57 100644
--- a/code/RocketLauncher/.gitignore
+++ b/code/RocketLauncher/.gitignore
@@ -1,2 +1,70 @@
-.pio
-build
+# CMake build directories
+build/
+build-*/
+out/
+
+# CMake generated files
+CMakeCache.txt
+CMakeFiles/
+cmake_install.cmake
+Makefile
+*.cmake
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+rocket_tests
+
+# Arduino specific
+*.hex
+*.elf
+*.eep
+*.lss
+*.map
+*.sym
+
+# IDE files
+.vscode/settings.json
+.idea/
+*.swp
+*.swo
+*~
+
+# OS generated files
+.DS_Store
+.DS_Store?
+._*
+.Spotlight-V100
+.Trashes
+ehthumbs.db
+Thumbs.db
+
+# Logs
+*.log
+*.tmp
+
+# Unity test framework
+lib/Unity/
+external/Unity/
diff --git a/code/RocketLauncher/.idea/codeStyles/Project.xml b/code/RocketLauncher/.idea/codeStyles/Project.xml
deleted file mode 100644
index 46cd2c9..0000000
--- a/code/RocketLauncher/.idea/codeStyles/Project.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/codeStyles/codeStyleConfig.xml b/code/RocketLauncher/.idea/codeStyles/codeStyleConfig.xml
deleted file mode 100644
index 79ee123..0000000
--- a/code/RocketLauncher/.idea/codeStyles/codeStyleConfig.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/dbnavigator.xml b/code/RocketLauncher/.idea/dbnavigator.xml
deleted file mode 100644
index 3b39be9..0000000
--- a/code/RocketLauncher/.idea/dbnavigator.xml
+++ /dev/null
@@ -1,437 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/dictionaries/project.xml b/code/RocketLauncher/.idea/dictionaries/project.xml
deleted file mode 100644
index 10f1929..0000000
--- a/code/RocketLauncher/.idea/dictionaries/project.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
- simulide
- thomasfredericks
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/editor.xml b/code/RocketLauncher/.idea/editor.xml
deleted file mode 100644
index 41a708e..0000000
--- a/code/RocketLauncher/.idea/editor.xml
+++ /dev/null
@@ -1,251 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/.idea/misc.xml b/code/RocketLauncher/.idea/misc.xml
deleted file mode 100644
index 386a2b4..0000000
--- a/code/RocketLauncher/.idea/misc.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/code/RocketLauncher/CMakeLists.txt b/code/RocketLauncher/CMakeLists.txt
new file mode 100644
index 0000000..f68931a
--- /dev/null
+++ b/code/RocketLauncher/CMakeLists.txt
@@ -0,0 +1,183 @@
+cmake_minimum_required(VERSION 4.1.0)
+project(RocketLauncher VERSION 1.0.0 LANGUAGES CXX)
+
+# Set C++ standard
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED ON)
+
+# Options
+option(BUILD_TESTS "Build unit tests" ON)
+option(ENABLE_FORMATTING "Enable code formatting" ON)
+option(PLATFORMIO_INTEGRATION "Enable PlatformIO integration" ON)
+
+# Set output directories
+set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
+set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
+
+# Include cmake modules
+list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)
+
+# Find required packages (PkgConfig not needed for this project)
+
+# Source files (for testing and documentation)
+set(SOURCES
+ src/RocketController.cpp
+)
+
+set(HEADERS
+ src/ArduinoInterface.h
+ src/RocketController.h
+)
+
+# Tests (native only - Arduino builds handled by PlatformIO)
+if(BUILD_TESTS)
+ enable_testing()
+
+ # Test executable (excludes main.cpp and Arduino-specific code)
+ add_executable(rocket_tests
+ test/test_rocket_controller.cpp
+ src/RocketController.cpp
+ )
+
+ # Test configuration (same as PlatformIO native env)
+ target_compile_definitions(rocket_tests PRIVATE
+ ARDUINO=0
+ UNITY_INCLUDE_DOUBLE
+ UNITY_DOUBLE_PRECISION=1e-12
+ UNITY_INCLUDE_CONFIG_H
+ )
+
+ # Compiler flags (same as PlatformIO native env)
+ target_compile_options(rocket_tests PRIVATE
+ -std=c++17
+ -Wall -Wextra -Wpedantic
+ )
+
+ # Add tests
+ add_test(NAME RocketControllerTests COMMAND rocket_tests)
+endif()
+
+# PlatformIO integration targets (these become proper CMake targets for CLion)
+if(PLATFORMIO_INTEGRATION)
+ # Find PlatformIO
+ find_program(PLATFORMIO "pio")
+
+ if(PLATFORMIO)
+ # Main firmware targets that CLion will see
+ add_custom_target(firmware_sim ALL
+ COMMAND ${PLATFORMIO} run -e simulide
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Building simulation firmware with PlatformIO"
+ SOURCES ${SOURCES} ${HEADERS}
+ )
+
+ add_custom_target(firmware_hw ALL
+ COMMAND ${PLATFORMIO} run -e uno_hw
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Building hardware firmware with PlatformIO"
+ SOURCES ${SOURCES} ${HEADERS}
+ )
+
+ # Test target that CLion will see
+ add_custom_target(pio_tests
+ COMMAND ${PLATFORMIO} test -e native
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Running PlatformIO tests"
+ SOURCES ${SOURCES} ${HEADERS}
+ )
+
+ # Utility targets
+ add_custom_target(upload
+ COMMAND ${PLATFORMIO} run -e uno_hw -t upload
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Uploading firmware to Arduino with PlatformIO"
+ DEPENDS firmware_hw
+ )
+
+ add_custom_target(monitor
+ COMMAND ${PLATFORMIO} device monitor -b 115200
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Starting serial monitor with PlatformIO"
+ )
+
+ # Clean target
+ add_custom_target(pio_clean
+ COMMAND ${PLATFORMIO} run -t clean
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Cleaning PlatformIO build files"
+ )
+
+ # Combined build target (what CLion will see as the main target)
+ add_custom_target(all_firmware ALL
+ COMMAND ${CMAKE_COMMAND} -E echo "Building all firmware targets..."
+ COMMAND ${PLATFORMIO} run -e simulide
+ COMMAND ${PLATFORMIO} run -e uno_hw
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Building both simulation and hardware firmware with PlatformIO"
+ SOURCES ${SOURCES} ${HEADERS}
+ DEPENDS firmware_sim firmware_hw
+ )
+
+ # Set dependencies so CLion understands the build order
+ if(BUILD_TESTS)
+ add_dependencies(rocket_tests all_firmware)
+ endif()
+
+ message(STATUS "PlatformIO integration enabled - CMake targets created for CLion")
+ else()
+ message(WARNING "PlatformIO not found. Install with: pip install platformio")
+ message(WARNING "Firmware targets will not be available")
+ endif()
+endif()
+
+# Code formatting
+if(ENABLE_FORMATTING)
+ find_program(CLANG_FORMAT "clang-format")
+ if(CLANG_FORMAT)
+ add_custom_target(format
+ COMMAND ${CLANG_FORMAT} -i ${SOURCES} ${HEADERS}
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
+ COMMENT "Formatting source code with clang-format"
+ )
+ endif()
+endif()
+
+# Custom targets
+add_custom_target(clean-all
+ COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_BINARY_DIR}
+ COMMENT "Cleaning all CMake build files"
+)
+
+# Help target
+add_custom_target(show_help
+ COMMAND ${CMAKE_COMMAND} --help
+ COMMENT "Showing CMake help"
+)
+
+# Status target
+add_custom_target(status
+ COMMAND ${CMAKE_COMMAND} -E echo "Project: ${PROJECT_NAME}"
+ COMMAND ${CMAKE_COMMAND} -E echo "Version: ${PROJECT_VERSION}"
+ COMMAND ${CMAKE_COMMAND} -E echo "Build directory: ${CMAKE_BINARY_DIR}"
+ COMMAND ${CMAKE_COMMAND} -E echo "Source directory: ${CMAKE_SOURCE_DIR}"
+ COMMAND ${CMAKE_COMMAND} -E echo ""
+ COMMAND ${CMAKE_COMMAND} -E echo "PlatformIO integration: ${PLATFORMIO_INTEGRATION}"
+ COMMAND ${CMAKE_COMMAND} -E echo "Tests enabled: ${BUILD_TESTS}"
+ COMMENT "Showing project status"
+)
+
+# Install rules (for tests only)
+if(BUILD_TESTS)
+ install(TARGETS rocket_tests
+ RUNTIME DESTINATION bin
+ )
+endif()
+
+# Package configuration
+include(CMakePackageConfigHelpers)
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
+ VERSION ${PROJECT_VERSION}
+ COMPATIBILITY AnyNewerVersion
+)
diff --git a/code/RocketLauncher/CMakePresets.json b/code/RocketLauncher/CMakePresets.json
new file mode 100644
index 0000000..2d1dbbf
--- /dev/null
+++ b/code/RocketLauncher/CMakePresets.json
@@ -0,0 +1,124 @@
+{
+ "version": 3,
+ "configurePresets": [
+ {
+ "name": "default",
+ "displayName": "Default Configuration",
+ "description": "Default build configuration with tests and PlatformIO integration",
+ "generator": "Unix Makefiles",
+ "binaryDir": "${sourceDir}/build",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Debug",
+ "BUILD_TESTS": "ON",
+ "PLATFORMIO_INTEGRATION": "ON",
+ "ENABLE_FORMATTING": "ON"
+ }
+ },
+ {
+ "name": "release",
+ "displayName": "Release Configuration",
+ "description": "Release build configuration optimized for production",
+ "generator": "Unix Makefiles",
+ "binaryDir": "${sourceDir}/build-release",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Release",
+ "BUILD_TESTS": "OFF",
+ "PLATFORMIO_INTEGRATION": "ON",
+ "ENABLE_FORMATTING": "OFF"
+ }
+ },
+ {
+ "name": "tests-only",
+ "displayName": "Tests Only",
+ "description": "Build only unit tests (no PlatformIO integration)",
+ "generator": "Unix Makefiles",
+ "binaryDir": "${sourceDir}/build-tests",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Debug",
+ "BUILD_TESTS": "ON",
+ "PLATFORMIO_INTEGRATION": "OFF",
+ "ENABLE_FORMATTING": "ON"
+ }
+ },
+ {
+ "name": "minimal",
+ "displayName": "Minimal Configuration",
+ "description": "Minimal build with no tests or PlatformIO integration",
+ "generator": "Unix Makefiles",
+ "binaryDir": "${sourceDir}/build-minimal",
+ "cacheVariables": {
+ "CMAKE_BUILD_TYPE": "Debug",
+ "BUILD_TESTS": "OFF",
+ "PLATFORMIO_INTEGRATION": "OFF",
+ "ENABLE_FORMATTING": "OFF"
+ }
+ }
+ ],
+ "buildPresets": [
+ {
+ "name": "default",
+ "configurePreset": "default",
+ "targets": ["all"]
+ },
+ {
+ "name": "release",
+ "configurePreset": "release",
+ "targets": ["all"]
+ },
+ {
+ "name": "tests",
+ "configurePreset": "tests-only",
+ "targets": ["rocket_tests"]
+ },
+ {
+ "name": "minimal",
+ "configurePreset": "minimal",
+ "targets": ["all"]
+ },
+ {
+ "name": "clean",
+ "configurePreset": "default",
+ "targets": ["clean"]
+ },
+ {
+ "name": "firmware-sim",
+ "configurePreset": "default",
+ "targets": ["firmware_sim"]
+ },
+ {
+ "name": "firmware-hw",
+ "configurePreset": "default",
+ "targets": ["firmware_hw"]
+ },
+ {
+ "name": "all-firmware",
+ "configurePreset": "default",
+ "targets": ["all_firmware"]
+ },
+ {
+ "name": "upload",
+ "configurePreset": "default",
+ "targets": ["upload"]
+ },
+ {
+ "name": "monitor",
+ "configurePreset": "default",
+ "targets": ["monitor"]
+ },
+ {
+ "name": "pio-clean",
+ "configurePreset": "default",
+ "targets": ["pio_clean"]
+ }
+ ],
+ "testPresets": [
+ {
+ "name": "default",
+ "configurePreset": "default"
+ },
+ {
+ "name": "quick",
+ "configurePreset": "tests-only"
+ }
+ ]
+}
diff --git a/code/RocketLauncher/Makefile b/code/RocketLauncher/Makefile
deleted file mode 100644
index 3ee62b3..0000000
--- a/code/RocketLauncher/Makefile
+++ /dev/null
@@ -1,142 +0,0 @@
-# ๐ Luke's Rocket Launch Controller - Makefile
-# Simple build system for Arduino-based rocket launcher
-
-# Project Configuration
-PROJECT_NAME = RocketLauncher
-BUILD_DIR = .pio
-OUT_DIR = out
-
-# PlatformIO Configuration
-PIO_CMD = pio
-PIO_ENV_SIM = simulide
-PIO_ENV_HW = uno_hw
-
-# Default target
-.DEFAULT_GOAL := all
-
-# Colors for pretty output
-GREEN = \033[0;32m
-YELLOW = \033[1;33m
-RED = \033[0;31m
-BLUE = \033[0;34m
-NC = \033[0m # No Color
-
-# Help target
-.PHONY: help
-help: ## Show this help message
- @echo "$(GREEN)๐ Luke's Rocket Launch Controller - Build System$(NC)"
- @echo ""
- @echo "$(BLUE)Available targets:$(NC)"
- @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " $(YELLOW)%-15s$(NC) %s\n", $$1, $$2}' $(MAKEFILE_LIST)
- @echo ""
- @echo "$(BLUE)Quick start:$(NC)"
- @echo " make # Run tests and build everything (default)"
- @echo " make build-only # Build everything (skip tests)"
- @echo " make test # Run unit tests"
- @echo " make build-sim # Build for simulation"
- @echo " make build-hw # Build for hardware"
- @echo " make clean # Clean build files"
-
-# Build targets
-.PHONY: all
-all: test build ## Run tests and build for both simulation and hardware
-
-.PHONY: build-only
-build-only: build ## Build for both simulation and hardware (skip tests)
-
-.PHONY: build-sim
-build-sim: ## Build project for SimulIDE simulation
- @echo "$(GREEN)๐ง Building for simulation...$(NC)"
- @$(PIO_CMD) run -e $(PIO_ENV_SIM)
- @echo "$(GREEN)โ
Simulation build complete!$(NC)"
- @echo "$(BLUE) Firmware: $(OUT_DIR)/simulide/firmware.hex$(NC)"
-
-.PHONY: build-hw
-build-hw: ## Build project for Arduino hardware
- @echo "$(GREEN)๐ง Building for hardware...$(NC)"
- @$(PIO_CMD) run -e $(PIO_ENV_HW)
- @echo "$(GREEN)โ
Hardware build complete!$(NC)"
- @echo "$(BLUE) Firmware: $(BUILD_DIR)/$(PIO_ENV_HW)/firmware.hex$(NC)"
-
-.PHONY: build
-build: build-sim build-hw ## Build for both simulation and hardware
-
-# Test targets
-.PHONY: test
-test: ## Run unit tests
- @echo "$(GREEN)๐งช Running unit tests...$(NC)"
- @$(PIO_CMD) test -e native
- @echo "$(GREEN)โ
Tests completed!$(NC)"
-
-.PHONY: test-verbose
-test-verbose: ## Run tests with verbose output
- @echo "$(GREEN)๐งช Running verbose tests...$(NC)"
- @$(PIO_CMD) test --verbose
- @echo "$(GREEN)โ
Verbose tests completed!$(NC)"
-
-# Cleanup targets
-.PHONY: clean
-clean: ## Clean build artifacts
- @echo "$(YELLOW)๐งน Cleaning build files...$(NC)"
- @$(PIO_CMD) run -t clean
- @rm -rf $(OUT_DIR)
- @echo "$(GREEN)โ
Clean complete!$(NC)"
-
-.PHONY: clean-all
-clean-all: ## Clean everything including dependencies
- @echo "$(YELLOW)๐งน Deep cleaning...$(NC)"
- @$(PIO_CMD) run -t clean
- @rm -rf $(BUILD_DIR)
- @rm -rf $(OUT_DIR)
- @echo "$(GREEN)โ
Deep clean complete!$(NC)"
-
-# Upload targets
-.PHONY: upload
-upload: build-hw ## Upload firmware to Arduino
- @echo "$(GREEN)๐ Uploading to Arduino...$(NC)"
- @$(PIO_CMD) run -e $(PIO_ENV_HW) -t upload
- @echo "$(GREEN)โ
Upload complete!$(NC)"
-
-.PHONY: upload-sim
-upload-sim: build-sim ## Build and prepare for SimulIDE
- @echo "$(GREEN)๐ฎ Preparing for SimulIDE simulation...$(NC)"
- @echo "$(BLUE) Open wiring/rocker_launcher_controls.sim1 in SimulIDE$(NC)"
- @echo "$(BLUE) Firmware will auto-load from: $(OUT_DIR)/simulide/firmware.hex$(NC)"
-
-# Development targets
-.PHONY: monitor
-monitor: ## Monitor Arduino serial output
- @echo "$(GREEN)๐ก Starting serial monitor...$(NC)"
- @$(PIO_CMD) device monitor -b 115200
-
-.PHONY: format
-format: ## Format source code with clang-format
- @echo "$(GREEN)๐จ Formatting source code...$(NC)"
- @if command -v clang-format >/dev/null 2>&1; then \
- clang-format -i src/**/*.cpp src/**/*.h lib/**/*.cpp lib/**/*.h 2>/dev/null || true; \
- echo "$(GREEN)โ
Code formatting complete!$(NC)"; \
- else \
- echo "$(YELLOW)โ ๏ธ clang-format not found. Install clang-format to format code.$(NC)"; \
- echo "$(BLUE) macOS: brew install clang-format$(NC)"; \
- echo "$(BLUE) Ubuntu: sudo apt install clang-format$(NC)"; \
- fi
-
-.PHONY: release
-release: ## Create a semantic versioned release
- @echo "$(GREEN)๐ท๏ธ Creating semantic release...$(NC)"
- @if [ -f "../../scripts/release.sh" ]; then \
- ../../scripts/release.sh; \
- else \
- echo "$(YELLOW)โ ๏ธ Release script not found. Please run from project root:$(NC)"; \
- echo "$(BLUE) make release$(NC)"; \
- fi
-
-# Status
-.PHONY: status
-status: ## Show project status
- @echo "$(GREEN)๐ Project Status$(NC)"
- @echo "$(BLUE) Project: $(PROJECT_NAME)$(NC)"
- @echo "$(BLUE) Build dir: $(BUILD_DIR)$(NC)"
- @echo "$(BLUE) Output dir: $(OUT_DIR)$(NC)"
- @if [ -d "$(BUILD_DIR)" ]; then echo "$(GREEN) โ
Build directory exists$(NC)"; else echo "$(RED) โ Build directory missing$(NC)"; fi
- @if [ -d "$(OUT_DIR)" ]; then echo "$(GREEN) โ
Output directory exists$(NC)"; else echo "$(RED) โ Output directory missing$(NC)"; fi
diff --git a/code/RocketLauncher/README.md b/code/RocketLauncher/README.md
new file mode 100644
index 0000000..f73e361
--- /dev/null
+++ b/code/RocketLauncher/README.md
@@ -0,0 +1,361 @@
+# ๐ Luke's Rocket Launch Controller
+
+A modern Arduino-based rocket launcher controller built with **CMake** and **PlatformIO**.
+
+## ๐๏ธ Build System
+
+This project uses a **hybrid build approach** that gives you the best of both worlds:
+
+- **CMake** - Primary build system for IDE integration (CLion, VS Code) and project management
+- **PlatformIO** - Arduino firmware building and library management
+- **Unity** - Unit testing framework for native development
+
+### Key Benefits
+
+- **CLion Tier 1 Support** - Full CMake integration for the best IDE experience
+- **Cross-platform compatibility** - Works on macOS, Linux, and Windows
+- **Multiple build configurations** - Presets for different use cases
+- **Modern C++ standards** - C++17 support with proper toolchain
+- **Maintainable architecture** - Standard CMake practices
+
+## ๐ Prerequisites
+
+### Required
+- **CMake 3.20+** - Modern build system
+- **Make** - Build tool (usually comes with CMake)
+- **C++17 compatible compiler** - For native builds and testing
+- **PlatformIO** - For Arduino development
+
+### Optional
+- **SimulIDE** - For simulation testing
+- **clang-format** - For code formatting
+
+### Installation
+
+#### macOS
+```bash
+# Install CMake
+brew install cmake
+
+# Install PlatformIO
+pip install platformio
+
+# Install SimulIDE (optional)
+brew install --cask simulide
+
+# Install clang-format (optional)
+brew install clang-format
+```
+
+#### Ubuntu/Debian
+```bash
+# Install CMake and build tools
+sudo apt update
+sudo apt install cmake build-essential
+
+# Install PlatformIO
+pip install platformio
+
+# Install SimulIDE (optional)
+sudo apt install simulide
+
+# Install clang-format (optional)
+sudo apt install clang-format
+```
+
+#### Windows
+- Download and install [CMake](https://cmake.org/download/)
+- Install PlatformIO: `pip install platformio`
+- Download and install [SimulIDE](https://www.simulide.com/) (optional)
+
+## ๐ Quick Start
+
+### 1. Clone and Navigate
+```bash
+git clone
+cd RocketLauncher
+```
+
+### 2. Build Everything
+```bash
+# Using the build script (recommended)
+./scripts/build.sh
+
+# Or using CMake directly
+cmake --preset default
+cmake --build --preset default
+```
+
+### 3. Run Tests
+```bash
+./scripts/build.sh test
+```
+
+## ๐ ๏ธ Build Commands
+
+### Using the Build Script (Recommended)
+
+The `scripts/build.sh` script provides a familiar interface:
+
+```bash
+# Full build (configure + build + test)
+./scripts/build.sh
+
+# Configure only
+./scripts/build.sh configure
+
+# Build only (assumes already configured)
+./scripts/build.sh build
+
+# Run tests
+./scripts/build.sh test
+
+# Clean build files
+./scripts/build.sh clean
+
+# Build specific firmware
+./scripts/build.sh firmware-sim # Simulation firmware
+./scripts/build.sh firmware-hw # Hardware firmware
+./scripts/build.sh all-firmware # Both firmwares
+
+# Arduino operations
+./scripts/build.sh upload # Upload to Arduino
+./scripts/build.sh monitor # Start serial monitor
+
+# Utilities
+./scripts/build.sh format # Format source code
+./scripts/build.sh status # Show project status
+./scripts/build.sh help # Get help
+```
+
+### Using CMake Directly
+
+```bash
+# Configure with default preset
+cmake --preset default
+
+# Build with default preset
+cmake --build --preset default
+
+# Run tests
+ctest --preset default
+
+# Build specific targets
+cmake --build . --target firmware_sim
+cmake --build . --target firmware_hw
+cmake --build . --target rocket_tests
+```
+
+## โ๏ธ Build Presets
+
+The project includes several pre-configured build presets:
+
+| Preset | Description | Tests | PlatformIO | Optimization |
+|--------|-------------|-------|------------|--------------|
+| `default` | Full development build | โ
| โ
| Debug |
+| `release` | Production build | โ | โ
| Release |
+| `tests-only` | Unit tests only | โ
| โ | Debug |
+| `minimal` | Minimal build | โ | โ | Debug |
+
+### Using Presets
+
+```bash
+# Configure with specific preset
+cmake --preset release
+
+# Build with specific preset
+cmake --build --preset tests-only
+
+# Using build script with preset
+./scripts/build.sh --preset release
+```
+
+## ๐ Project Structure
+
+```
+RocketLauncher/
+โโโ CMakeLists.txt # Main CMake configuration
+โโโ CMakePresets.json # Build presets for CLion
+โโโ platformio.ini # PlatformIO configuration
+โโโ cmake/ # CMake modules
+โ โโโ FindUnity.cmake # Unity test framework finder
+โโโ lib/Unity/ # Unity test framework
+โ โโโ unity.h # Test framework header
+โ โโโ unity.cpp # Test framework implementation
+โโโ scripts/ # Build helper scripts
+โ โโโ build.sh # Main build script
+โโโ src/ # Source code
+โ โโโ main.cpp # Arduino main program
+โ โโโ RocketController.cpp # Rocket control logic
+โ โโโ RocketController.h # Rocket control interface
+โ โโโ ArduinoInterface.h # Arduino abstraction
+โโโ test/ # Unit tests
+โ โโโ test_rocket_controller.cpp
+โโโ lib/ # External libraries
+โโโ include/ # Header files
+โโโ .vscode/ # VS Code configuration
+ โโโ settings.json # Editor settings
+```
+
+## ๐ง Configuration
+
+### Environment Variables
+
+- `ARDUINO_HOME` - Path to Arduino installation (optional, auto-detected)
+
+### CMake Options
+
+```bash
+# Configure with custom options
+cmake -DBUILD_TESTS=OFF -DPLATFORMIO_INTEGRATION=OFF ..
+
+# Available options:
+# BUILD_TESTS - Enable/disable unit tests (default: ON)
+# PLATFORMIO_INTEGRATION - Enable/disable PlatformIO integration (default: ON)
+# ENABLE_FORMATTING - Enable/disable code formatting (default: ON)
+```
+
+## ๐งช Testing
+
+### Running Tests
+
+```bash
+# Run all tests
+./scripts/build.sh test
+
+# Run tests with verbose output
+ctest --preset default --output-on-failure
+
+# Run specific test
+ctest --preset default -R RocketControllerTests
+```
+
+### Test Framework
+
+The project uses the **Unity test framework** for unit testing. Tests are automatically discovered and run during the build process.
+
+## ๐ฑ Arduino Development
+
+### Building Firmware
+
+```bash
+# Build for Arduino Uno
+./scripts/build.sh firmware-hw
+
+# Build for simulation
+./scripts/build.sh firmware-sim
+
+# Build both
+./scripts/build.sh all-firmware
+```
+
+### Uploading to Arduino
+
+```bash
+# Upload hardware firmware (requires Arduino connection)
+./scripts/build.sh upload
+```
+
+**Note**: Upload functionality requires proper Arduino connection and may need configuration for your specific setup.
+
+### Arduino Libraries
+
+The project automatically includes these Arduino libraries via PlatformIO:
+- `LiquidCrystal` - LCD display support
+- `Bounce2` - Button debouncing
+
+## ๐ฎ Simulation
+
+### SimulIDE Integration
+
+The simulation build creates firmware compatible with SimulIDE:
+
+1. Build simulation firmware: `./scripts/build.sh firmware-sim`
+2. Open SimulIDE
+3. Load your simulation file (`.sim1`)
+4. Firmware will auto-load from the PlatformIO build output
+
+## ๐ Migration from Makefile
+
+### Old Makefile Commands โ New CMake Commands
+
+| Old Makefile | New CMake | Description |
+|--------------|-----------|-------------|
+| `make all` | `./scripts/build.sh` | Full build |
+| `make build-only` | `./scripts/build.sh build` | Build only |
+| `make test` | `./scripts/build.sh test` | Run tests |
+| `make clean` | `./scripts/build.sh clean` | Clean build |
+| `make build-sim` | `./scripts/build.sh firmware-sim` | Simulation build |
+| `make build-hw` | `./scripts/build.sh firmware-hw` | Hardware build |
+| `make upload` | `./scripts/build.sh upload` | Upload to Arduino |
+| `make format` | `./scripts/build.sh format` | Format code |
+| `make status` | `./scripts/build.sh status` | Show status |
+
+### Key Benefits of CMake
+
+1. **Cross-platform**: Works on macOS, Linux, and Windows
+2. **IDE integration**: Better support in CLion, VS Code, etc.
+3. **Presets**: Multiple build configurations without reconfiguration
+4. **Modular**: Reusable build components
+5. **Standards**: Follows modern C++ build practices
+6. **Maintainable**: Easier to extend and modify
+
+## ๐ Troubleshooting
+
+### Common Issues
+
+#### CMake not found
+```bash
+# Install CMake
+# macOS
+brew install cmake
+
+# Ubuntu
+sudo apt install cmake
+
+# Windows
+# Download from cmake.org
+```
+
+#### PlatformIO not found
+```bash
+# Install PlatformIO
+pip install platformio
+```
+
+#### Build failures
+```bash
+# Clean and rebuild
+./scripts/build.sh clean
+./scripts/build.sh
+
+# Check dependencies
+./scripts/build.sh status
+```
+
+### Getting Help
+
+1. Check the project status: `./scripts/build.sh status`
+2. Verify dependencies are installed
+3. Check build logs in the build directory
+4. Ensure you're using CMake 3.20+
+
+## ๐ค Contributing
+
+1. Fork the repository
+2. Create a feature branch
+3. Make your changes
+4. Test with: `./scripts/build.sh test`
+5. Submit a pull request
+
+## ๐ License
+
+[Your License Here]
+
+## ๐ Acknowledgments
+
+- **Luke** - Original rocket launcher design
+- **Arduino community** - Hardware platform
+- **PlatformIO community** - Arduino development tools
+- **CMake community** - Build system
+- **Unity framework** - Testing framework
diff --git a/code/RocketLauncher/scripts/build.sh b/code/RocketLauncher/scripts/build.sh
new file mode 100755
index 0000000..8d1c70c
--- /dev/null
+++ b/code/RocketLauncher/scripts/build.sh
@@ -0,0 +1,332 @@
+#!/bin/bash
+
+# ๐ Luke's Rocket Launch Controller - CMake Build Script
+# Modern build system for Arduino-based rocket launcher with PlatformIO integration
+
+set -e
+
+# Colors for pretty output
+GREEN='\033[0;32m'
+YELLOW='\033[1;33m'
+RED='\033[0;31m'
+BLUE='\033[0;34m'
+NC='\033[0m' # No Color
+
+# Project Configuration
+PROJECT_NAME="RocketLauncher"
+BUILD_DIR="build"
+DEFAULT_PRESET="default"
+
+# Function to print colored output
+print_status() {
+ echo -e "${GREEN}๐ง $1${NC}"
+}
+
+print_warning() {
+ echo -e "${YELLOW}โ ๏ธ $1${NC}"
+}
+
+print_error() {
+ echo -e "${RED}โ $1${NC}"
+}
+
+print_info() {
+ echo -e "${BLUE}โน๏ธ $1${NC}"
+}
+
+# Function to show help
+show_help() {
+ echo -e "${GREEN}๐ Luke's Rocket Launch Controller - Build System${NC}"
+ echo ""
+ echo -e "${BLUE}Available commands:${NC}"
+ echo " build.sh # Configure and build everything (default)"
+ echo " build.sh configure # Configure CMake project"
+ echo " build.sh build # Build project"
+ echo " build.sh test # Run tests"
+ echo " build.sh clean # Clean build files"
+ echo " build.sh format # Format source code"
+ echo " build.sh status # Show project status"
+ echo ""
+ echo -e "${BLUE}CMake targets (what CLion sees):${NC}"
+ echo " build.sh firmware-sim # Build simulation firmware"
+ echo " build.sh firmware-hw # Build hardware firmware"
+ echo " build.sh all-firmware # Build both firmwares"
+ echo " build.sh upload # Upload to Arduino"
+ echo " build.sh monitor # Start serial monitor"
+ echo " build.sh pio-clean # Clean PlatformIO files"
+ echo ""
+ echo -e "${BLUE}Build presets:${NC}"
+ echo " default # Full build with tests and PlatformIO integration"
+ echo " release # Optimized release build"
+ echo " tests-only # Unit tests only (no PlatformIO)"
+ echo " minimal # Minimal build (no tests, no PlatformIO)"
+ echo ""
+ echo -e "${BLUE}Examples:${NC}"
+ echo " ./scripts/build.sh # Full build"
+ echo " ./scripts/build.sh firmware-sim # Build simulation firmware"
+ echo " ./scripts/build.sh --preset release # Release build"
+}
+
+# Function to check dependencies
+check_dependencies() {
+ print_status "Checking dependencies..."
+
+ if ! command -v cmake &> /dev/null; then
+ print_error "CMake not found. Please install CMake 3.20 or later."
+ exit 1
+ fi
+
+ if ! command -v make &> /dev/null; then
+ print_error "Make not found. Please install Make."
+ exit 1
+ fi
+
+ # Check for PlatformIO
+ if ! command -v pio &> /dev/null; then
+ print_warning "PlatformIO not found. Arduino builds will not work."
+ print_info "Install with: pip install platformio"
+ print_info "Or use: ./scripts/build.sh --preset tests-only"
+ else
+ print_status "PlatformIO found"
+ fi
+
+ print_status "Dependencies check complete"
+}
+
+# Function to configure project
+configure_project() {
+ local preset=${1:-$DEFAULT_PRESET}
+ print_status "Configuring project with preset: $preset"
+
+ mkdir -p "$BUILD_DIR"
+ cd "$BUILD_DIR"
+
+ cmake --preset "$preset" ..
+
+ if [ $? -eq 0 ]; then
+ print_status "Configuration successful"
+ else
+ print_error "Configuration failed"
+ exit 1
+ fi
+
+ cd ..
+}
+
+# Function to build project
+build_project() {
+ local preset=${1:-$DEFAULT_PRESET}
+ print_status "Building project with preset: $preset"
+
+ if [ ! -d "$BUILD_DIR" ]; then
+ print_warning "Build directory not found. Running configure first..."
+ configure_project "$preset"
+ fi
+
+ cd "$BUILD_DIR"
+ # Build without preset since we're already in the configured build directory
+ cmake --build .
+
+ if [ $? -eq 0 ]; then
+ print_status "Build successful"
+ print_info "Output files in: $BUILD_DIR"
+ else
+ print_error "Build failed"
+ exit 1
+ fi
+
+ cd ..
+}
+
+# Function to run tests
+run_tests() {
+ print_status "Running tests..."
+
+ if [ ! -d "$BUILD_DIR" ]; then
+ print_warning "Build directory not found. Running configure first..."
+ configure_project
+ fi
+
+ cd "$BUILD_DIR"
+ # Run tests without preset since we're already in the configured build directory
+ ctest --output-on-failure
+
+ if [ $? -eq 0 ]; then
+ print_status "Tests completed successfully"
+ else
+ print_error "Tests failed"
+ exit 1
+ fi
+
+ cd ..
+}
+
+# Function to clean build files
+clean_build() {
+ print_status "Cleaning build files..."
+
+ if [ -d "$BUILD_DIR" ]; then
+ rm -rf "$BUILD_DIR"
+ print_status "Build directory removed"
+ fi
+
+ # Clean other build directories
+ for dir in build-*; do
+ if [ -d "$dir" ]; then
+ rm -rf "$dir"
+ print_status "Removed $dir"
+ fi
+ done
+
+ print_status "Clean complete"
+}
+
+# Function to build specific CMake targets
+build_target() {
+ local target=$1
+ local description=$2
+
+ print_status "$description"
+
+ if [ ! -d "$BUILD_DIR" ]; then
+ print_warning "Build directory not found. Running configure first..."
+ configure_project
+ fi
+
+ cd "$BUILD_DIR"
+ cmake --build . --target "$target"
+
+ if [ $? -eq 0 ]; then
+ print_status "Target '$target' built successfully"
+ else
+ print_error "Target '$target' build failed"
+ exit 1
+ fi
+
+ cd ..
+}
+
+# Function to format code
+format_code() {
+ print_status "Formatting source code..."
+
+ if command -v clang-format &> /dev/null; then
+ find src/ -name "*.cpp" -o -name "*.h" | xargs clang-format -i
+ print_status "Code formatting complete"
+ else
+ print_warning "clang-format not found. Install clang-format to format code."
+ print_info "macOS: brew install clang-format"
+ print_info "Ubuntu: sudo apt install clang-format"
+ fi
+}
+
+# Function to show status
+show_status() {
+ print_status "Project Status"
+ print_info "Project: $PROJECT_NAME"
+ print_info "Build directory: $BUILD_DIR"
+ print_info "Source directory: $(pwd)"
+
+ if [ -d "$BUILD_DIR" ]; then
+ print_info "โ
Build directory exists"
+
+ # Check for test executable
+ if [ -f "$BUILD_DIR/rocket_tests" ]; then
+ print_info "โ
Test executable exists"
+ fi
+ else
+ print_warning "โ Build directory missing"
+ fi
+
+ # Check PlatformIO status
+ if command -v pio &> /dev/null; then
+ print_info "โ
PlatformIO found"
+
+ # Check PlatformIO project
+ if [ -f "platformio.ini" ]; then
+ print_info "โ
PlatformIO project configuration found"
+ else
+ print_warning "โ ๏ธ PlatformIO project configuration not found"
+ fi
+ else
+ print_warning "โ PlatformIO not found"
+ fi
+}
+
+# Main script logic
+main() {
+ local command=${1:-"all"}
+ local preset=${2:-$DEFAULT_PRESET}
+
+ case $command in
+ "help"|"-h"|"--help")
+ show_help
+ exit 0
+ ;;
+ "configure")
+ check_dependencies
+ configure_project "$preset"
+ ;;
+ "build")
+ check_dependencies
+ build_project "$preset"
+ ;;
+ "test")
+ check_dependencies
+ run_tests
+ ;;
+ "clean")
+ clean_build
+ ;;
+ "format")
+ format_code
+ ;;
+ "status")
+ show_status
+ ;;
+ "firmware-sim")
+ check_dependencies
+ build_target "firmware_sim" "Building simulation firmware"
+ ;;
+ "firmware-hw")
+ check_dependencies
+ build_target "firmware_hw" "Building hardware firmware"
+ ;;
+ "all-firmware")
+ check_dependencies
+ build_target "all_firmware" "Building both firmwares"
+ ;;
+ "upload")
+ check_dependencies
+ build_target "upload" "Building and uploading firmware"
+ ;;
+ "monitor")
+ check_dependencies
+ build_target "monitor" "Starting serial monitor"
+ ;;
+ "pio-clean")
+ check_dependencies
+ build_target "pio_clean" "Cleaning PlatformIO files"
+ ;;
+ "all")
+ check_dependencies
+ configure_project "$preset"
+ build_project "$preset"
+ run_tests
+ ;;
+ *)
+ print_error "Unknown command: $command"
+ show_help
+ exit 1
+ ;;
+ esac
+}
+
+# Handle preset argument
+if [[ "$1" == "--preset" ]]; then
+ preset="$2"
+ shift 2
+ main "$1" "$preset"
+else
+ main "$@"
+fi
diff --git a/code/RocketLauncher/test/test_rocket_controller.cpp b/code/RocketLauncher/test/test_rocket_controller.cpp
index 2f0bc39..9586a8b 100644
--- a/code/RocketLauncher/test/test_rocket_controller.cpp
+++ b/code/RocketLauncher/test/test_rocket_controller.cpp
@@ -1,9 +1,103 @@
-#include
#include
#include
+#include
#include "../src/RocketController.h"
#include "../src/ArduinoInterface.h"
+// Minimal Unity test framework implementation for CMake builds
+// This avoids dependency on external Unity files
+namespace Unity {
+ extern int unity_current_test_failed;
+ extern int unity_number_of_tests;
+ extern int unity_number_of_failures;
+
+ void unity_begin(const char* filename);
+ void unity_end(void);
+ void unity_run_test(void (*test_func)(void), const char* test_name);
+}
+
+// Forward declarations for test setup/teardown
+void setUp(void);
+void tearDown(void);
+
+// Unity test framework - minimal implementation for CMake integration
+int Unity::unity_current_test_failed = 0;
+int Unity::unity_number_of_tests = 0;
+int Unity::unity_number_of_failures = 0;
+
+void Unity::unity_begin(const char* filename) {
+ std::cout << "Unity Test Framework" << std::endl;
+ std::cout << "===================" << std::endl;
+ std::cout << "Running tests from: " << filename << std::endl << std::endl;
+
+ unity_current_test_failed = 0;
+ unity_number_of_tests = 0;
+ unity_number_of_failures = 0;
+}
+
+void Unity::unity_end(void) {
+ std::cout << std::endl << "===================" << std::endl;
+ std::cout << "Test Results:" << std::endl;
+ std::cout << "Tests Run: " << unity_number_of_tests << std::endl;
+ std::cout << "Failures: " << unity_number_of_failures << std::endl;
+
+ if (unity_number_of_failures == 0) {
+ std::cout << "All tests passed!" << std::endl;
+ } else {
+ std::cout << "Some tests failed!" << std::endl;
+ }
+}
+
+void Unity::unity_run_test(void (*test_func)(void), const char* test_name) {
+ std::cout << "Running test: " << test_name << std::endl;
+
+ unity_current_test_failed = 0;
+
+ // Call setUp and tearDown if they exist
+ setUp();
+ test_func();
+ tearDown();
+
+ if (unity_current_test_failed) {
+ std::cout << " โ FAILED" << std::endl;
+ } else {
+ std::cout << " โ
PASSED" << std::endl;
+ }
+}
+
+// Unity test macros
+#define TEST_ASSERT(condition) \
+ do { \
+ if (!(condition)) { \
+ Unity::unity_current_test_failed = 1; \
+ Unity::unity_number_of_failures++; \
+ } \
+ Unity::unity_number_of_tests++; \
+ } while(0)
+
+#define TEST_ASSERT_EQUAL(expected, actual) \
+ TEST_ASSERT((expected) == (actual))
+
+#define TEST_ASSERT_TRUE(condition) \
+ TEST_ASSERT(condition)
+
+#define TEST_ASSERT_FALSE(condition) \
+ TEST_ASSERT(!(condition))
+
+#define TEST_ASSERT_NULL(pointer) \
+ TEST_ASSERT((pointer) == nullptr)
+
+#define TEST_ASSERT_NOT_NULL(pointer) \
+ TEST_ASSERT((pointer) != nullptr)
+
+#define TEST_ASSERT_LESS_OR_EQUAL(expected, actual) \
+ TEST_ASSERT((actual) <= (expected))
+
+// Unity test runner macros
+#define UNITY_BEGIN() Unity::unity_begin(__FILE__)
+#define UNITY_END() Unity::unity_end()
+#define RUN_TEST(test_func) Unity::unity_run_test(test_func, #test_func)
+
// Simple mock Arduino interface for testing
class MockArduinoInterface : public ArduinoInterface
{
diff --git a/docs/SEMANTIC_VERSIONING.md b/docs/SEMANTIC_VERSIONING.md
deleted file mode 100644
index be1d21d..0000000
--- a/docs/SEMANTIC_VERSIONING.md
+++ /dev/null
@@ -1,192 +0,0 @@
-# ๐ท๏ธ Semantic Versioning Guide
-
-This document explains how to use the semantic versioning system for Luke's Rocket Launcher project.
-
-## ๐ **Overview**
-
-The project now uses **semantic versioning** to automatically manage releases, create GitHub releases, and package firmware files. This ensures consistent versioning and makes it easy for users to get the latest firmware.
-
-## ๐ข **Version Format**
-
-**Format**: `MAJOR.MINOR.PATCH` (e.g., `1.0.0`, `1.2.3`)
-
-- **MAJOR** (1.0.0 โ 2.0.0): Breaking changes, incompatible API changes
-- **MINOR** (1.0.0 โ 1.1.0): New features, backward compatible
-- **PATCH** (1.0.0 โ 1.0.1): Bug fixes, improvements, backward compatible
-
-## ๐ **Creating Releases**
-
-### **Option 1: Using the Release Script (Recommended)**
-
-```bash
-# From project root directory
-./scripts/release.sh --type minor
-
-# Or with custom version
-./scripts/release.sh --version 1.0.0
-
-# Dry run to see what would happen
-./scripts/release.sh --type patch --dry-run
-```
-
-**Script Options:**
-- `--type`: `patch`, `minor`, or `major`
-- `--version`: Specific version number
-- `--message`: Custom release message
-- `--dry-run`: Preview without making changes
-
-### **Option 2: Using Make**
-
-```bash
-# From code/RocketLauncher directory
-make release
-```
-
-### **Option 3: Manual Git Tags**
-
-```bash
-git tag -a v1.0.0 -m "Release v1.0.0"
-git push origin v1.0.0
-```
-
-### **Option 4: GitHub Actions Manual Trigger**
-
-1. Go to [Actions](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher/actions)
-2. Click "Semantic Release"
-3. Click "Run workflow"
-4. Enter version and release type
-5. Click "Run workflow"
-
-## ๐ **Commit Message Convention**
-
-Use conventional commit messages to automatically determine version increments:
-
-```bash
-# Patch releases (bug fixes, improvements)
-fix(arduino): resolve startup transition issue
-fix(testing): fix mock interface behavior
-docs: update installation instructions
-
-# Minor releases (new features)
-feat(arduino): add new safety feature
-feat(testing): add comprehensive test suite
-feat(build): add automated release workflow
-
-# Major releases (breaking changes)
-feat!: completely redesign state machine
-BREAKING CHANGE: change pin assignments
-```
-
-## ๐ **Release Workflow**
-
-When you create a release:
-
-1. **Version Determination**: Script calculates next version
-2. **Git Tag**: Creates and pushes version tag
-3. **GitHub Actions**: Automatically triggers build workflow
-4. **Build & Test**: Runs tests and builds firmware
-5. **Package Creation**: Creates downloadable firmware files
-6. **GitHub Release**: Creates release with assets and notes
-
-## ๐ฆ **Release Assets**
-
-Each release automatically includes:
-
-- **Simulation Firmware**: `.hex` file for SimulIDE
-- **Hardware Firmware**: `.hex` file for Arduino
-- **Release Notes**: Auto-generated from commits
-- **Build Information**: Version, date, commit hash
-
-## ๐ฏ **Best Practices**
-
-### **When to Release**
-
-- **Patch**: Bug fixes, documentation updates, minor improvements
-- **Minor**: New features, enhancements, backward compatible changes
-- **Major**: Breaking changes, major redesigns, incompatible updates
-
-### **Release Frequency**
-
-- **Patch**: Weekly or as needed
-- **Minor**: Monthly or when features are complete
-- **Major**: Quarterly or for significant changes
-
-### **Before Releasing**
-
-1. **Test Everything**: Ensure all tests pass
-2. **Update Documentation**: Keep README and docs current
-3. **Check Dependencies**: Verify library versions are stable
-4. **Clean Working Directory**: Commit or stash all changes
-
-## ๐ ๏ธ **Troubleshooting**
-
-### **Common Issues**
-
-**Tag Already Exists:**
-```bash
-# Check existing tags
-git tag -l
-
-# Delete local tag if needed
-git tag -d v1.0.0
-
-# Delete remote tag if needed
-git push origin --delete v1.0.0
-```
-
-**Workflow Fails:**
-1. Check [Actions](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher/actions) for errors
-2. Ensure tests pass locally: `make test`
-3. Verify build works: `make build`
-
-**Version Calculation Issues:**
-```bash
-# Check current version
-git describe --tags --abbrev=0
-
-# See commit history
-git log --oneline --decorate
-```
-
-## ๐ **Examples**
-
-### **Example 1: Bug Fix Release**
-
-```bash
-# Fix a bug
-git commit -m "fix(arduino): resolve button debouncing issue"
-
-# Create patch release
-./scripts/release.sh --type patch --message "Bug fix release"
-```
-
-### **Example 2: Feature Release**
-
-```bash
-# Add new feature
-git commit -m "feat(arduino): add current sensing circuit"
-
-# Create minor release
-./scripts/release.sh --type minor --message "Add current sensing feature"
-```
-
-### **Example 3: Major Update**
-
-```bash
-# Breaking change
-git commit -m "feat!: redesign state machine architecture"
-
-# Create major release
-./scripts/release.sh --type major --message "Complete state machine redesign"
-```
-
-## ๐ **Related Links**
-
-- [GitHub Actions](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher/actions)
-- [Releases](https://github.com/KofTwentyTwo/Lukes-Rocket-Launcher/releases)
-- [Conventional Commits](https://www.conventionalcommits.org/)
-- [Semantic Versioning](https://semver.org/)
-
----
-
-**๐ Ready to release? Use `./scripts/release.sh --help` for more options!**