qmk_userspace/qmk_flash_tools/lib/qmk_helpers.sh
2025-10-09 14:45:23 +02:00

143 lines
4.1 KiB
Bash

#!/usr/bin/env bash
# =============================================================================
# QMK Helper Functions Library
# =============================================================================
# Functions for building and flashing QMK firmware
# =============================================================================
# ----------------------
# Function: build_firmware
# Build QMK firmware for the specified keyboard and keymap
# Usage: build_firmware "fingerpunch/sweeeeep" "smathev"
# ----------------------
build_firmware() {
local keyboard="$1"
local keymap="$2"
if [[ -z "$keyboard" || -z "$keymap" ]]; then
echo "❌ Error: keyboard and keymap required" >&2
return 1
fi
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >&2
echo "🛠 Building firmware for $keyboard" >&2
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━" >&2
qmk compile -kb "$keyboard" -km "$keymap"
if [[ $? -eq 0 ]]; then
echo "✅ Firmware compiled successfully" >&2
echo "" >&2
return 0
else
echo "❌ Firmware compilation failed" >&2
return 1
fi
}
# ----------------------
# Function: flash_with_bootloader
# Flash firmware using a specific bootloader target
# Usage: flash_with_bootloader "fingerpunch/sweeeeep" "smathev" "uf2-split-left"
# ----------------------
flash_with_bootloader() {
local keyboard="$1"
local keymap="$2"
local bootloader="$3"
if [[ -z "$keyboard" || -z "$keymap" || -z "$bootloader" ]]; then
echo "❌ Error: keyboard, keymap, and bootloader required" >&2
return 1
fi
echo "📤 Flashing firmware with bootloader: $bootloader" >&2
echo "" >&2
qmk flash -kb "$keyboard" -km "$keymap" -bl "$bootloader"
if [[ $? -eq 0 ]]; then
echo "" >&2
echo "✅ Firmware flashed successfully!" >&2
return 0
else
echo "" >&2
echo "❌ Firmware flashing failed" >&2
return 1
fi
}
# ----------------------
# Function: flash_side
# Flash firmware for a specific keyboard side (left/right)
# Usage: flash_side "fingerpunch/sweeeeep" "smathev" "left"
# ----------------------
flash_side() {
local keyboard="$1"
local keymap="$2"
local side="$3"
if [[ -z "$keyboard" || -z "$keymap" || -z "$side" ]]; then
echo "❌ Error: keyboard, keymap, and side required" >&2
return 1
fi
if [[ "$side" != "left" && "$side" != "right" ]]; then
echo "❌ Error: side must be 'left' or 'right'" >&2
return 1
fi
local bootloader="uf2-split-$side"
echo "🎯 Flashing $side side with handedness" >&2
flash_with_bootloader "$keyboard" "$keymap" "$bootloader"
}
# ----------------------
# Function: check_qmk_installed
# Verify QMK CLI is installed and available
# Usage: check_qmk_installed || exit 1
# ----------------------
check_qmk_installed() {
if ! command -v qmk &> /dev/null; then
echo "❌ Error: 'qmk' CLI is not installed or not in PATH" >&2
echo " Install it with: python3 -m pip install qmk" >&2
return 1
fi
return 0
}
# ----------------------
# Function: verify_keyboard_exists
# Check if a keyboard definition exists in QMK
# Usage: verify_keyboard_exists "fingerpunch/sweeeeep"
# ----------------------
verify_keyboard_exists() {
local keyboard="$1"
if [[ -z "$keyboard" ]]; then
echo "❌ Error: keyboard required" >&2
return 1
fi
# Try to list keymaps for this keyboard
qmk list-keymaps -kb "$keyboard" &>/dev/null
if [[ $? -eq 0 ]]; then
return 0
else
echo "❌ Error: Keyboard '$keyboard' not found in QMK" >&2
return 1
fi
}
# ----------------------
# Function: clean_build
# Clean previous build artifacts
# Usage: clean_build
# ----------------------
clean_build() {
echo "🧹 Cleaning previous build..." >&2
qmk clean &>/dev/null
echo "✅ Build directory cleaned" >&2
}