Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
118 changes: 118 additions & 0 deletions .github/workflows/pcb.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
name: PCB exports and GitHub Pages

on:
push:
branches: [main]
pull_request:
workflow_dispatch:

permissions:
contents: read

concurrency:
group: pcb-pages-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}

jobs:
pcb:
runs-on: ubuntu-latest
container: ghcr.io/systemscape/kicad_and_pandoc:10
env:
PCB: hardware/ese-rust-board/ese-rust-board
outputs:
available: ${{ steps.board.outputs.available }}
steps:
- uses: actions/checkout@v4

- name: Check board sources
id: board
shell: bash
run: |
files=("$PCB.kicad_pro" "$PCB.kicad_sch" "$PCB.kicad_pcb")
count=0
for file in "${files[@]}"; do
if [[ -f "$file" ]]; then
count=$((count + 1))
fi
done
if [[ "$count" == 0 ]]; then
echo 'available=false' >> "$GITHUB_OUTPUT"
echo 'No board sources yet; publishing documentation only.' >> "$GITHUB_STEP_SUMMARY"
elif [[ "$count" != 3 ]]; then
echo '::error::The board needs matching .kicad_pro, .kicad_sch and .kicad_pcb files.'
exit 1
else
echo 'available=true' >> "$GITHUB_OUTPUT"
fi

- name: Run ERC/DRC and generate exports
if: steps.board.outputs.available == 'true'
run: |
kibot -c hardware/config.kibot.yaml \
-b "$PCB.kicad_pcb" -e "$PCB.kicad_sch" -d outputs

- name: Package manufacturing files
if: steps.board.outputs.available == 'true'
run: |
python3 - <<'PY'
import shutil
shutil.make_archive('outputs/gerbers', 'zip', 'outputs/gerber')
PY

- name: Upload PCB exports and check reports
if: ${{ !cancelled() && steps.board.outputs.available == 'true' }}
uses: actions/upload-artifact@v4
with:
name: pcb-outputs
path: outputs/
if-no-files-found: error
retention-days: 90

site:
needs: pcb
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4

- name: Download PCB exports
if: needs.pcb.outputs.available == 'true'
uses: actions/download-artifact@v4
with:
name: pcb-outputs
path: downloads/

- name: Configure Pages
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
uses: actions/configure-pages@v5

- name: Render Markdown with Jekyll
uses: actions/jekyll-build-pages@v1
with:
source: ./
destination: ./_site

- name: Upload site preview
uses: actions/upload-artifact@v4
with:
name: site-preview
path: _site/
if-no-files-found: error

- name: Upload Pages artifact
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
uses: actions/upload-pages-artifact@v3

deploy:
if: github.ref == 'refs/heads/main' && github.event_name != 'pull_request'
needs: site
runs-on: ubuntu-latest
permissions:
pages: write
id-token: write
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
38 changes: 38 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -19,3 +19,41 @@ target
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

# For PCBs designed using KiCad: https://www.kicad.org/
# Format documentation: https://kicad.org/help/file-formats/

# Temporary files
*.000
*.bak
*.bck
*.kicad_pcb-bak
*.kicad_sch-bak
*-backups
*.kicad_prl
*.sch-bak
*~
_autosave-*
*.tmp
*-save.pro
*-save.kicad_pcb
fp-info-cache
~*.lck
\#auto_saved_files#

# Netlist files (exported from Eeschema)
*.net

# Autorouter files (exported from Pcbnew)
*.dsn
*.ses

# Exported BOM files
*.xml
*.csv
**/.history/
**/__pycache__/
**/node_modules/
.github/site/dist/
artifact/

44 changes: 42 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,42 @@
# ese-2026-rust-hackathon
Hardware and Software for the Rust Hackathon at ESE Kongress 2026
# Embedded Rust zum Anfassen: Hackathon auf dem exklusiven ESE 2026 Rust Devboard

[Hardware](hardware/README.md) · [PCB-Downloads](downloads.md) · [CI](docs/ci.md)

## Worum geht es?

Rust ist auch in der Embedded-Entwicklung auf dem Vormarsch. Aber wie funktioniert “dieses Rust” auf echter Hardware? Wie schreibe ich einen Sensor-Treiber? Wie steuere ich ein Display an? Und wie sieht “Fearless Concurrency” in der Praxis aus?

Im ESE Hackathon finden Sie es heraus: In kleinen Teams entwickeln Sie mit Rust, Embassy und async eine eigene Anwendung zur Erfassung und Darstellung der Luftqualität auf dem Kongressgelände. Wie Sie Messwerte aufbereiten, darstellen und die Bedienung gestalten, entscheiden Sie selbst. Die überzeugendsten Anwendungen werden zum Abschluss ausgezeichnet.

Grundlage ist das exklusive ESE Rust Devboard mit RP2354-Mikrocontroller, Bosch BME690 Gassensor, Display, Buttons und integrierter Debug-Probe. Weitere Peripherie ist steckbar, damit Sie Ihre Anwendung später noch beliebig erweitern können.

Vier erfahrene Embedded-Rust-Entwickler begleiten Sie durchgehend, helfen bei Problemen zügig weiter und zeigen nötigenfalls Lösungswege auf. Zum Abschluss bewertet ein Expertengremium die Sensorlösungen und kürt die besten Embedded-Rust-Hacker.


**Voraussetzungen**

* Laptop mit installierter Rust-Toolchain
* USB-C-Kabel zum Anschluss des Devboards
* Gute Programmierkenntnisse in C/C++ oder vergleichbar
* GitHub-Account für die Zusammenarbeit im Team

Vorteilhaft:

* erste Rust-Erfahrung; ESE-Hackathon-Repository vorab von GitHub geklont und kompiliert (spart Zeit vor Ort).


## Praktischer Nutzen

Nach dem Hackathon können Sie mit einer modernen, speichersicheren Sprache Embedded-Software entwickeln – und wissen aus eigener Erfahrung, wo Rust gegenüber C/C++ im Alltag punktet.

Konkret nehmen Sie mit:

* Das exklusive ESE Rust Devboard mit Bosch BME690 Gassensor, einem RP2354 Microcontroller (in Cortex-M und RISC-V Cores bootbar) und integriertem Debugger
* Ein Embedded-Rust-Projekt mit Embassy von Grund auf aufsetzen
* Einen Treiber für einen I²C-Sensor schreiben und ein Display ansteuern
* Nebenläufigkeit mit async Rust umsetzen – ohne RTOS und ohne Data Races
* Logs per RTT auslesen und eine Rust-Applikation mit probe-rs debuggen
* Peripherie wie GPIO und I²C über das embedded-hal-Ökosystem nutzen
* Embedded-Software im Team und mit Git-Workflow entwickeln

Das Gelernte lässt sich direkt auf andere Cortex-M-Plattformen übertragen.
24 changes: 24 additions & 0 deletions _config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
title: ESE 2026 Rust Hackathon
description: Embedded Rust zum Anfassen
url: https://systemscape.github.io
baseurl: /ese-2026-rust-hackathon
theme: jekyll-theme-cayman
plugins:
- jekyll-relative-links
- jekyll-readme-index
readme_index:
remove_originals: true
relative_links:
enabled: true
collections: true
defaults:
- scope:
path: ""
values:
layout: default
exclude:
- LICENSE
- hardware/config.kibot.yaml
- hardware/ese-rust-board
- outputs
- target
42 changes: 42 additions & 0 deletions docs/ci.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
---
title: Hardware CI
---

# Hardware CI

The [workflow](https://github.com/Systemscape/ese-2026-rust-hackathon/blob/main/.github/workflows/pcb.yaml) builds on pull requests, pushes to
`main`, and manual runs. It uses the same KiCad 10 / KiBot container as the OnMCU
hardware repository, with one board and one complete
[KiBot config](https://github.com/Systemscape/ese-2026-rust-hackathon/blob/main/hardware/config.kibot.yaml).

Add the board's matching `.kicad_pro`, `.kicad_sch` and `.kicad_pcb` files at
`hardware/ese-rust-board/ese-rust-board.*`. Commit any referenced sheets, custom
libraries, library tables and 3D models too, using project-relative paths.
If the board moves, update `PCB` in the workflow and the exclusion in `_config.yml`.
When all three sources are absent, CI publishes documentation only; a partially
added board fails the build.

KiBot runs ERC and DRC, then generates schematic and PCB PDFs, a CSV BOM,
interactive BOM, Gerbers and drills, pick-and-place files, PCB drawings, SVGs,
STEP, 3D-printable stencils and netlists. Errors fail the build and block
deployment. Available check reports and partial exports are uploaded even on
failure. The `pcb-outputs` artifact is retained for 90 days; `site-preview`
contains the rendered site for review on pull requests.

GitHub Pages uses Jekyll to render the README files and other Markdown. The
downloads page lists the generated files automatically. Only successful runs
on `main` deploy the public site; pull requests do not deploy.

In repository **Settings → Pages → Build and deployment**, set **Source** to
**GitHub Actions** before the first deployment. No additional secrets are needed.
The workflow follows GitHub's [Jekyll build](https://github.com/actions/jekyll-build-pages)
and [Pages deployment](https://github.com/actions/deploy-pages) actions.

To generate the same PCB exports locally with KiCad 10 and KiBot installed:

```sh
kibot -c hardware/config.kibot.yaml \
-b hardware/ese-rust-board/ese-rust-board.kicad_pcb \
-e hardware/ese-rust-board/ese-rust-board.kicad_sch -d outputs
python3 -c "import shutil; shutil.make_archive('outputs/gerbers', 'zip', 'outputs/gerber')"
```
21 changes: 21 additions & 0 deletions downloads.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
---
title: PCB downloads
permalink: /downloads/
---

# PCB downloads

[Hackathon](./README.md) · [Hardware](./hardware/README.md)

{% assign exports = site.static_files | where_exp: "file", "file.path contains '/downloads/'" | sort: 'path' %}
{% if exports.size > 0 %}
Exports from commit `{{ site.github.build_revision }}`.

The Gerber ZIP includes copper, mask, silkscreen, paste, board outline and drill files.

{% for file in exports %}
- [{{ file.path | remove_first: '/downloads/' }}]({{ file.path | relative_url }})
{% endfor %}
{% else %}
PCB downloads will appear here once the KiCad board sources are added and pass ERC/DRC.
{% endif %}
4 changes: 4 additions & 0 deletions hardware/README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# ESE Rust Devboard

[Hackathon](../README.md) · [PCB downloads](../downloads.md) · [Hardware CI](../docs/ci.md)

## MCU Foundation
- 2x Raspberry Pi RP2354B (SC1512-A4) https://mou.sr/4yLfwo5 ca. 0.80 €
- 1x as debugger using https://github.com/raspberrypi/debugprobe or https://github.com/probe-rs/rusty-probe-firmware
Expand Down
Loading
Loading