7 Commits

Author SHA1 Message Date
MDietermann
897dc424dc Updated Gitignore 2026-04-13 17:40:22 +02:00
MDietermann
9c3cdbc90f Updated Gitignore 2026-04-13 17:39:18 +02:00
MDietermann
f53663298e fix(wokwi): add serial monitor config and USB_SERIAL_JTAG for ESP32-S3
- Add serialMonitor display config to all diagram templates
- Set USB_SERIAL_JTAG attr on ESP32-S3 for built-in USB serial
- Add TX/RX → $serialMonitor wiring for ESP32 (UART-based serial)
- Remove disconnected breadboard parts (wired directly to MCU pins)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 16:40:42 +02:00
MDietermann
33f1112bf8 fix(renode): wokwi-cli releases are plain binaries, not tarballs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 16:27:07 +02:00
MDietermann
9bec4660f6 feat: add Wokwi CLI for visual breadboard simulation
- Install wokwi-cli binary from GitHub releases
- Generate wokwi.toml and board-specific diagram.json in arduino-new
  with a button + LED breadboard layout for each supported board
- Add <leader>aw keybinding in nvim to run Wokwi simulation
- Diagram templates for: uno, mega, nano, esp32, esp32s3 (+ default)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 16:05:24 +02:00
MDietermann
9c38a8414e fix(neovim): only remove lspconfig config, keep conform and other starter plugins
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:27:06 +02:00
MDietermann
b512d41dc8 feat: add Renode emulator, nvim-dap debugging, and backup collision fix
- Add Renode installation (AUR/deb) with arduino-sim helper script
  supporting STM32F4, RP2040, and nRF52840 (USB HID) platforms
- Add nvim-dap + nvim-dap-ui with GDB remote adapter for Renode debugging
- Add debug keybindings under <leader>d prefix
- Fix backup_config() path collisions when multiple sources share a
  basename (e.g. ~/.config/nvim and ~/.local/share/nvim)
- Strip NvChad starter's nvim-lspconfig block that conflicts with
  native vim.lsp.config, preserving configs/lazy.lua
- Update step counts from 11 to 12 (TOTAL_STEPS 12→13, 13→14 on WSL)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-10 15:23:57 +02:00
14 changed files with 382 additions and 21 deletions

3
.gitignore vendored
View File

@@ -1 +1,2 @@
.idea .idea
WokwiKey.txt

View File

@@ -82,6 +82,7 @@ source "$SCRIPT_DIR/lib/zellij.sh"
source "$SCRIPT_DIR/lib/neovim.sh" source "$SCRIPT_DIR/lib/neovim.sh"
source "$SCRIPT_DIR/lib/yazi.sh" source "$SCRIPT_DIR/lib/yazi.sh"
source "$SCRIPT_DIR/lib/arduino.sh" source "$SCRIPT_DIR/lib/arduino.sh"
source "$SCRIPT_DIR/lib/renode.sh"
source "$SCRIPT_DIR/lib/git.sh" source "$SCRIPT_DIR/lib/git.sh"
source "$SCRIPT_DIR/lib/scaffold.sh" source "$SCRIPT_DIR/lib/scaffold.sh"
source "$SCRIPT_DIR/lib/shell-config.sh" source "$SCRIPT_DIR/lib/shell-config.sh"
@@ -104,6 +105,9 @@ echo " arduino-new my-project uno # scaffold a project"
echo " adev # launch Arduino workspace" echo " adev # launch Arduino workspace"
echo " <leader>av # compile in Neovim" echo " <leader>av # compile in Neovim"
echo " <leader>au # upload in Neovim" echo " <leader>au # upload in Neovim"
echo " wokwi-cli . # simulate with Wokwi (visual)"
echo " arduino-sim build/fw.elf # simulate with Renode (GDB)"
echo " <leader>ds # attach debugger to Renode"
echo " theme # switch colorscheme" echo " theme # switch colorscheme"
echo "" echo ""
warn "A reboot is recommended to apply all changes (shell, groups, PATH)." warn "A reboot is recommended to apply all changes (shell, groups, PATH)."

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 7: Arduino CLI + board cores # Step 7: Arduino CLI + board cores
step "9/11 — Installing Arduino CLI + board cores" step "9/12 — Installing Arduino CLI + board cores"
if $IS_ARCH; then if $IS_ARCH; then
$PKG_INSTALL arduino-cli $PKG_INSTALL arduino-cli

View File

@@ -13,7 +13,7 @@ NC='\033[0m'
VERBOSE=true VERBOSE=true
LOG_FILE="/tmp/archduino-install.log" LOG_FILE="/tmp/archduino-install.log"
CURRENT_STEP=0 CURRENT_STEP=0
TOTAL_STEPS=12 TOTAL_STEPS=13
info() { echo -e "${GREEN}[✓]${NC} $1"; } info() { echo -e "${GREEN}[✓]${NC} $1"; }
warn() { echo -e "${YELLOW}[!]${NC} $1"; } warn() { echo -e "${YELLOW}[!]${NC} $1"; }
@@ -39,7 +39,7 @@ draw_progress() {
} }
begin_quiet_mode() { begin_quiet_mode() {
$IS_WSL && TOTAL_STEPS=13 $IS_WSL && TOTAL_STEPS=14
: >"$LOG_FILE" : >"$LOG_FILE"
# Save real terminal to fd 3/4, redirect everything else to log # Save real terminal to fd 3/4, redirect everything else to log
@@ -82,9 +82,12 @@ BACKUP_DIR="$HOME/.config/archduino/backups/$(date +%Y%m%d_%H%M%S)"
backup_config() { backup_config() {
local src="$1" local src="$1"
[[ ! -e "$src" ]] && return 0 [[ ! -e "$src" ]] && return 0
mkdir -p "$BACKUP_DIR" # Use parent path to avoid collisions when different sources share a basename
cp -a "$src" "$BACKUP_DIR/" # e.g. ~/.config/nvim and ~/.local/share/nvim both have basename "nvim"
info "Backed up $(basename "$src") → $BACKUP_DIR/" local dest="$BACKUP_DIR${src#"$HOME"}"
mkdir -p "$(dirname "$dest")"
cp -a "$src" "$dest"
info "Backed up ${src/#"$HOME"/\~} → ${dest/#"$HOME"/\~}"
} }
# ── TLS workaround ─────────────────────────────────────────────── # ── TLS workaround ───────────────────────────────────────────────

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 2: Nerd Font installation # Step 2: Nerd Font installation
step "2/11 — Installing Nerd Font" step "2/12 — Installing Nerd Font"
FONT_DIR="$HOME/.local/share/fonts/NerdFonts" FONT_DIR="$HOME/.local/share/fonts/NerdFonts"
FONT_NAME="JetBrainsMono" FONT_NAME="JetBrainsMono"

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 8: Git + Lazygit # Step 8: Git + Lazygit
step "10/11 — Setting up Git + Lazygit" step "11/12 — Setting up Git + Lazygit"
if $IS_ARCH; then if $IS_ARCH; then
$PKG_INSTALL lazygit $PKG_INSTALL lazygit

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Steps 5+6: Neovim + NvChad # Steps 5+6: Neovim + NvChad
step "6/11 — Installing Neovim (latest)" step "6/12 — Installing Neovim (latest)"
NVIM_NEEDED=true NVIM_NEEDED=true
if command -v nvim &>/dev/null; then if command -v nvim &>/dev/null; then
@@ -21,7 +21,7 @@ if $NVIM_NEEDED; then
info "Neovim installed: $(nvim --version | head -1)" info "Neovim installed: $(nvim --version | head -1)"
fi fi
step "7/11 — Setting up NvChad" step "7/12 — Setting up NvChad"
NVIM_CFG="$HOME/.config/nvim" NVIM_CFG="$HOME/.config/nvim"
NVCHAD_FRESH=false NVCHAD_FRESH=false
@@ -29,7 +29,7 @@ MIGRATED_PLUGINS_DIR="/tmp/archduino-migrated-plugins"
rm -rf "$MIGRATED_PLUGINS_DIR" rm -rf "$MIGRATED_PLUGINS_DIR"
# Files managed by Archduino or LazyVim-specific — skip during migration # Files managed by Archduino or LazyVim-specific — skip during migration
SKIP_PLUGINS="gruvbox.lua|theme.lua|lsp.lua|arduino.lua|lspconfig.lua" SKIP_PLUGINS="gruvbox.lua|theme.lua|lsp.lua|arduino.lua|lspconfig.lua|dap.lua"
# ── Detect existing config ────────────────────────────────────── # ── Detect existing config ──────────────────────────────────────
if [[ -d "$NVIM_CFG/lua" ]]; then if [[ -d "$NVIM_CFG/lua" ]]; then
@@ -94,6 +94,10 @@ if $NVCHAD_FRESH; then
info "NvChad starter cloned" info "NvChad starter cloned"
fi fi
# ── Strip starter's nvim-lspconfig block (we use native vim.lsp) ─
sed -i '/neovim\/nvim-lspconfig/,/},/d' "$NVIM_CFG/lua/plugins/init.lua"
rm -f "$NVIM_CFG/lua/configs/lspconfig.lua"
# ── Restore migrated plugins ───────────────────────────────────── # ── Restore migrated plugins ─────────────────────────────────────
if [[ -d "$MIGRATED_PLUGINS_DIR" ]] && ls "$MIGRATED_PLUGINS_DIR"/*.lua &>/dev/null; then if [[ -d "$MIGRATED_PLUGINS_DIR" ]] && ls "$MIGRATED_PLUGINS_DIR"/*.lua &>/dev/null; then
mkdir -p "$NVIM_CFG/lua/plugins" mkdir -p "$NVIM_CFG/lua/plugins"
@@ -165,8 +169,67 @@ vim.lsp.enable("clangd")
return {} return {}
LUA LUA
# Clean up legacy configs/lspconfig.lua if present # ── DAP (debug adapter) — for Renode GDB remote debugging ──────
rm -f "$NVIM_CFG/lua/configs/lspconfig.lua" cat >"$NVIM_CFG/lua/plugins/dap.lua" <<'LUA'
return {
{
"mfussenegger/nvim-dap",
keys = { "<leader>d" },
config = function()
local dap = require("dap")
-- GDB remote adapter (connects to Renode's GDB server)
dap.adapters.gdb_remote = {
type = "executable",
command = vim.fn.executable("arm-none-eabi-gdb") == 1
and "arm-none-eabi-gdb"
or "gdb-multiarch",
args = { "-i", "dap" },
}
-- Default debug configurations for Arduino/embedded
dap.configurations.c = {
{
name = "Attach to Renode (GDB :3333)",
type = "gdb_remote",
request = "attach",
target = "localhost:3333",
cwd = "${workspaceFolder}",
program = function()
return vim.fn.input("ELF path: ", vim.fn.getcwd() .. "/build/", "file")
end,
},
}
dap.configurations.cpp = dap.configurations.c
dap.configurations.arduino = dap.configurations.c
-- Breakpoint signs
vim.fn.sign_define("DapBreakpoint", { text = "●", texthl = "DiagnosticError" })
vim.fn.sign_define("DapStopped", { text = "▶", texthl = "DiagnosticOk", linehl = "DiffAdd" })
end,
},
{
"rcarriga/nvim-dap-ui",
dependencies = { "mfussenegger/nvim-dap", "nvim-neotest/nvim-nio" },
keys = { "<leader>du" },
config = function()
local dapui = require("dapui")
dapui.setup()
-- Auto open/close UI on debug sessions
local dap = require("dap")
dap.listeners.after.event_initialized["dapui_config"] = function() dapui.open() end
dap.listeners.before.event_terminated["dapui_config"] = function() dapui.close() end
dap.listeners.before.event_exited["dapui_config"] = function() dapui.close() end
end,
},
{
"nvim-neotest/nvim-nio",
lazy = true,
},
}
LUA
# ── Keymaps ───────────────────────────────────────────────────── # ── Keymaps ─────────────────────────────────────────────────────
cat >"$NVIM_CFG/lua/mappings.lua" <<'LUA' cat >"$NVIM_CFG/lua/mappings.lua" <<'LUA'
@@ -180,6 +243,16 @@ map("n", "<leader>av", "<cmd>ArduinoVerify<cr>", { desc = "Arduino Verify (compi
map("n", "<leader>au", "<cmd>ArduinoUpload<cr>", { desc = "Arduino Upload" }) map("n", "<leader>au", "<cmd>ArduinoUpload<cr>", { desc = "Arduino Upload" })
map("n", "<leader>as", "<cmd>ArduinoSerial<cr>", { desc = "Arduino Serial Monitor" }) map("n", "<leader>as", "<cmd>ArduinoSerial<cr>", { desc = "Arduino Serial Monitor" })
map("n", "<leader>ai", "<cmd>ArduinoInfo<cr>", { desc = "Arduino Board Info" }) map("n", "<leader>ai", "<cmd>ArduinoInfo<cr>", { desc = "Arduino Board Info" })
map("n", "<leader>aw", "<cmd>!wokwi-cli .<cr>", { desc = "Arduino Wokwi Simulate" })
-- Debug (DAP)
map("n", "<leader>ds", function() require("dap").continue() end, { desc = "Debug Start/Continue" })
map("n", "<leader>db", function() require("dap").toggle_breakpoint() end, { desc = "Debug Toggle Breakpoint" })
map("n", "<leader>dn", function() require("dap").step_over() end, { desc = "Debug Step Over" })
map("n", "<leader>di", function() require("dap").step_into() end, { desc = "Debug Step Into" })
map("n", "<leader>do", function() require("dap").step_out() end, { desc = "Debug Step Out" })
map("n", "<leader>dx", function() require("dap").terminate() end, { desc = "Debug Terminate" })
map("n", "<leader>du", function() require("dapui").toggle() end, { desc = "Debug UI Toggle" })
LUA LUA
info "NvChad configured ($THEME_DISPLAY_NAME + Arduino + LSP)" info "NvChad configured ($THEME_DISPLAY_NAME + Arduino + LSP + DAP)"

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 1: Base packages # Step 1: Base packages
step "1/11 — Installing base packages" step "1/12 — Installing base packages"
if $IS_ARCH; then if $IS_ARCH; then
sudo pacman -Syu --noconfirm sudo pacman -Syu --noconfirm

116
lib/renode.sh Normal file
View File

@@ -0,0 +1,116 @@
#!/bin/bash
# Step 10: Renode emulator for Arduino simulation with USB HID support
step "10/12 — Installing Renode emulator"
# gdb-multiarch is needed for nvim-dap to connect to Renode's GDB server
if $IS_ARCH; then
if ! command -v renode &>/dev/null; then
info "Installing Renode from AUR..."
yay -S --needed --noconfirm renode-bin
else
info "Renode already installed"
fi
$PKG_INSTALL arm-none-eabi-gdb
else
if ! command -v renode &>/dev/null; then
info "Installing Renode..."
RENODE_VERSION=$(curl -ks "https://api.github.com/repos/renode/renode/releases/latest" | jq -r '.tag_name' | sed 's/^v//')
curl -ksSLo /tmp/renode.deb "https://github.com/renode/renode/releases/download/v${RENODE_VERSION}/renode_${RENODE_VERSION}_amd64.deb"
sudo apt install -y /tmp/renode.deb
rm -f /tmp/renode.deb
else
info "Renode already installed"
fi
$PKG_INSTALL gdb-multiarch
fi
info "Renode installed: $(renode --version 2>/dev/null | head -1 || echo 'OK')"
# ── Renode helper script ─────────────────────────────────────────
# Provides a quick way to launch Renode with a GDB server for a firmware ELF
cat >~/.local/bin/arduino-sim <<'SIMSCRIPT'
#!/bin/bash
set -euo pipefail
usage() {
echo "Usage: arduino-sim <firmware.elf> [platform]"
echo ""
echo "Launch Renode with a GDB server for debugging firmware."
echo "Connect nvim-dap or gdb to localhost:3333"
echo ""
echo "Platforms:"
echo " stm32f4 STM32F4 Discovery (default)"
echo " rp2040 Raspberry Pi Pico"
echo " nrf52840 nRF52840 (USB HID capable)"
echo ""
echo "Example:"
echo " arduino-sim build/firmware.elf nrf52840"
exit 1
}
[[ $# -lt 1 ]] && usage
ELF="$1"
PLATFORM="${2:-stm32f4}"
[[ ! -f "$ELF" ]] && echo "Error: $ELF not found" && exit 1
# Map platform to Renode machine definition
case "$PLATFORM" in
stm32f4)
RENODE_PLATFORM="platforms/boards/stm32f4_discovery.repl"
MACHINE="STM32F4_Discovery"
;;
rp2040)
RENODE_PLATFORM="platforms/cpus/rp2040.repl"
MACHINE="RP2040"
;;
nrf52840)
RENODE_PLATFORM="platforms/cpus/nrf52840.repl"
MACHINE="nRF52840"
;;
*)
echo "Unknown platform: $PLATFORM"
usage
;;
esac
# Generate a temporary Renode script
RESC=$(mktemp /tmp/renode-XXXXXX.resc)
cat >"$RESC" <<EOF
using sysbus
mach create "$MACHINE"
machine LoadPlatformDescription @$RENODE_PLATFORM
sysbus LoadELF @$(realpath "$ELF")
machine StartGdbServer 3333
showAnalyzer sysbus.uart0 Antmicro.Renode.Analyzers.LoggingUartAnalyzer
start
EOF
echo "Starting Renode ($MACHINE) with GDB server on :3333"
echo "Connect debugger: nvim → <leader>ds or gdb → target remote :3333"
echo ""
renode --disable-xwt "$RESC"
rm -f "$RESC"
SIMSCRIPT
chmod +x ~/.local/bin/arduino-sim
info "Renode simulation helper created (arduino-sim)"
# ── Wokwi CLI (visual breadboard simulation) ────────────────────
if ! command -v wokwi-cli &>/dev/null; then
info "Installing Wokwi CLI..."
WOKWI_VERSION=$(curl -ks "https://api.github.com/repos/wokwi/wokwi-cli/releases/latest" | jq -r '.tag_name' | sed 's/^v//')
curl -ksSLo /tmp/wokwi-cli "https://github.com/wokwi/wokwi-cli/releases/download/v${WOKWI_VERSION}/wokwi-cli-linuxstatic-x64"
sudo install -m 755 /tmp/wokwi-cli /usr/local/bin/wokwi-cli
rm -f /tmp/wokwi-cli
else
info "Wokwi CLI already installed"
fi
info "Wokwi CLI installed (set WOKWI_CLI_TOKEN to enable — get one at https://wokwi.com/dashboard/ci)"

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 9: Project scaffolding tool + templates # Step 9: Project scaffolding tool + templates
step "11/11 — Creating project scaffolding tool" step "12/12 — Creating project scaffolding tool"
mkdir -p ~/.local/bin ~/.config/archduino/templates mkdir -p ~/.local/bin ~/.config/archduino/templates
@@ -67,9 +67,38 @@ build/
*.bin *.bin
EOF EOF
# ── Wokwi simulation config ─────────────────────────────────────
# Determine firmware path format based on board family
case "$BOARD" in
esp32|esp32s3|esp8266)
WOKWI_FW="build/$PROJECT.ino.merged.bin"
;;
*)
WOKWI_FW="build/$PROJECT.ino.hex"
;;
esac
cat > wokwi.toml <<EOF
[wokwi]
version = 1
firmware = "$WOKWI_FW"
elf = "build/$PROJECT.ino.elf"
EOF
# Board-specific diagram with button + LED on breadboard
DIAGRAM_TEMPLATE="$TEMPLATE_DIR/diagram-$BOARD.json"
if [[ -f "$DIAGRAM_TEMPLATE" ]]; then
cp "$DIAGRAM_TEMPLATE" diagram.json
else
cp "$TEMPLATE_DIR/diagram-default.json" diagram.json
fi
git init -q git init -q
echo "✓ Created '$PROJECT' for $BOARD ($FQBN)" echo "✓ Created '$PROJECT' for $BOARD ($FQBN)"
echo " cd $PROJECT && nvim $PROJECT.ino" echo " cd $PROJECT && nvim $PROJECT.ino"
echo ""
echo " Simulate: arduino-cli compile --fqbn $FQBN --output-dir build ."
echo " wokwi-cli ."
SCAFFOLD SCAFFOLD
chmod +x ~/.local/bin/arduino-new chmod +x ~/.local/bin/arduino-new
@@ -135,6 +164,141 @@ void loop() {
delay(1000); delay(1000);
} }
INO INO
# ── Wokwi diagram templates ──────────────────────────────────────
cat >~/.config/archduino/templates/diagram-default.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-uno", "id": "mcu", "top": 0, "left": 0 },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["mcu:2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "mcu:GND.1", "black", []],
["mcu:4", "btn1:1.l", "blue", []],
["btn1:2.l", "mcu:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
cat >~/.config/archduino/templates/diagram-esp32.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "board-esp32-devkit-c-v4", "id": "esp", "top": 0, "left": 0 },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["esp:TX", "$serialMonitor:RX", "", []],
["esp:RX", "$serialMonitor:TX", "", []],
["esp:2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "esp:GND.1", "black", []],
["esp:4", "btn1:1.l", "blue", []],
["btn1:2.l", "esp:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
cat >~/.config/archduino/templates/diagram-esp32s3.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "board-esp32-s3-devkitc-1", "id": "esp", "top": 0, "left": 0, "attrs": { "serialInterface": "USB_SERIAL_JTAG" } },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["esp:2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "esp:GND.1", "black", []],
["esp:4", "btn1:1.l", "blue", []],
["btn1:2.l", "esp:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
cat >~/.config/archduino/templates/diagram-uno.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-uno", "id": "mcu", "top": 0, "left": 0 },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["mcu:2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "mcu:GND.1", "black", []],
["mcu:4", "btn1:1.l", "blue", []],
["btn1:2.l", "mcu:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
cat >~/.config/archduino/templates/diagram-mega.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-mega", "id": "mcu", "top": 0, "left": 0 },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["mcu:2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "mcu:GND.1", "black", []],
["mcu:4", "btn1:1.l", "blue", []],
["btn1:2.l", "mcu:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
cat >~/.config/archduino/templates/diagram-nano.json <<'JSON'
{
"version": 1,
"author": "Archduino",
"editor": "wokwi",
"parts": [
{ "type": "wokwi-arduino-nano", "id": "mcu", "top": 0, "left": 0 },
{ "type": "wokwi-led", "id": "led1", "top": 110, "left": 50, "attrs": { "color": "green" } },
{ "type": "wokwi-resistor", "id": "r1", "top": 150, "left": 30, "attrs": { "value": "220" } },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": 110, "left": 150, "attrs": { "color": "blue" } }
],
"connections": [
["mcu:D2", "led1:A", "green", []],
["led1:C", "r1:1", "black", []],
["r1:2", "mcu:GND.1", "black", []],
["mcu:D4", "btn1:1.l", "blue", []],
["btn1:2.l", "mcu:GND.2", "black", []]
],
"serialMonitor": { "display": "auto" }
}
JSON
# ── Install theme files + theme switcher ───────────────────────── # ── Install theme files + theme switcher ─────────────────────────
mkdir -p ~/.config/archduino/themes mkdir -p ~/.config/archduino/themes
cp "$SCRIPT_DIR/lib/themes/"*.sh ~/.config/archduino/themes/ cp "$SCRIPT_DIR/lib/themes/"*.sh ~/.config/archduino/themes/

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 3: Starship prompt # Step 3: Starship prompt
step "4/11 — Installing Starship" step "4/12 — Installing Starship"
if $IS_ARCH; then if $IS_ARCH; then
$PKG_INSTALL starship $PKG_INSTALL starship

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 8: Yazi file manager # Step 8: Yazi file manager
step "8/11 — Installing Yazi" step "8/12 — Installing Yazi"
if $IS_ARCH; then if $IS_ARCH; then
$PKG_INSTALL yazi ffmpegthumbnailer p7zip poppler $PKG_INSTALL yazi ffmpegthumbnailer p7zip poppler

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 4: Zellij terminal multiplexer # Step 4: Zellij terminal multiplexer
step "5/11 — Installing Zellij" step "5/12 — Installing Zellij"
if $IS_ARCH; then if $IS_ARCH; then
$PKG_INSTALL zellij $PKG_INSTALL zellij

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
# Step 2: Zsh + Oh My Zsh + plugins # Step 2: Zsh + Oh My Zsh + plugins
step "3/11 — Setting up Zsh" step "3/12 — Setting up Zsh"
if [[ ! -d "$HOME/.oh-my-zsh" ]]; then if [[ ! -d "$HOME/.oh-my-zsh" ]]; then
RUNZSH=no KEEP_ZSHRC=yes CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended || RUNZSH=no KEEP_ZSHRC=yes CHSH=no sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended ||