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
11 changes: 11 additions & 0 deletions .github/workflows/e2e-docker.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,17 @@ jobs:
bash embedded/esp32/ci_build_image.sh
'

- name: Build Pico firmware images
timeout-minutes: 30
run: |
docker run --rm \
frameos \
bash -lc '
set -euo pipefail
bash embedded/pico2/ci_build_image.sh
FRAMEOS_PICO_PLATFORM=pico2w bash embedded/pico2/ci_build_image.sh
'

- name: Run Docker container
run: |
docker run -d \
Expand Down
39 changes: 39 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
ARG PYTHON_IMAGE=python:3.12-slim-bookworm
ARG ESP_IDF_VERSION=v5.5.4
ARG ESP_IDF_TARGET=esp32s3
ARG PICO_SDK_VERSION=2.2.0

FROM ${PYTHON_IMAGE} AS nim-toolchain

Expand Down Expand Up @@ -107,6 +108,37 @@ RUN set -eux; \
qemu-system-xtensa --version; \
rm -rf "${IDF_TOOLS_PATH}/dist"

FROM ${PYTHON_IMAGE} AS pico-sdk-toolchain

ARG PICO_SDK_VERSION

ENV DEBIAN_FRONTEND=noninteractive
ENV PICO_SDK_PATH=/opt/pico/pico-sdk

RUN apt-get update \
&& apt-get install -y --no-install-recommends \
build-essential \
ca-certificates \
cmake \
gcc-arm-none-eabi \
git \
libnewlib-arm-none-eabi \
libstdc++-arm-none-eabi-dev \
libstdc++-arm-none-eabi-newlib \
ninja-build \
python3 \
&& rm -rf /var/lib/apt/lists/*

RUN set -eux; \
mkdir -p "$(dirname "${PICO_SDK_PATH}")"; \
git clone --depth 1 --branch "${PICO_SDK_VERSION}" \
https://github.com/raspberrypi/pico-sdk.git "${PICO_SDK_PATH}"; \
git -C "${PICO_SDK_PATH}" submodule update --init --depth 1; \
test -f "${PICO_SDK_PATH}/external/pico_sdk_import.cmake"; \
cmake --version; \
arm-none-eabi-gcc --version; \
printf '#include <cstdlib>\n' | arm-none-eabi-g++ -x c++ -std=gnu++17 -E - >/dev/null

FROM nim-toolchain AS app-builder

ARG FRAMEOS_ARCHIVE_BASE_URL=https://archive.frameos.net
Expand Down Expand Up @@ -235,6 +267,7 @@ ENV VIRTUAL_ENV=/app/backend/.venv
ENV FRAMEOS_NATIVE_JS_TRANSPILE=/app/frameos/build/native_js_transpile
ENV IDF_PATH=/opt/esp/esp-idf
ENV IDF_TOOLS_PATH=/opt/esp/idf-tools
ENV PICO_SDK_PATH=/opt/pico/pico-sdk
ENV PATH="/opt/nim/bin:${VIRTUAL_ENV}/bin:${PATH}"

WORKDIR /app
Expand All @@ -253,6 +286,7 @@ RUN set -eux; \
dosfstools \
e2fsprogs \
flex \
gcc-arm-none-eabi \
genimage \
git \
gnupg \
Expand All @@ -261,6 +295,9 @@ RUN set -eux; \
libgcrypt20 \
libffi-dev \
libglib2.0-0 \
libnewlib-arm-none-eabi \
libstdc++-arm-none-eabi-dev \
libstdc++-arm-none-eabi-newlib \
libpixman-1-0 \
libsdl2-2.0-0 \
libssl-dev \
Expand All @@ -285,10 +322,12 @@ RUN set -eux; \

COPY --from=nim-toolchain /opt/nim /opt/nim
COPY --from=esp-idf-toolchain /opt/esp /opt/esp
COPY --from=pico-sdk-toolchain /opt/pico /opt/pico
COPY --from=app-builder /root/.nimble /root/.nimble
COPY --from=python-deps /app/backend/.venv /app/backend/.venv

RUN bash -lc 'set -euo pipefail; . "${IDF_PATH}/export.sh" >/dev/null 2>&1; qemu-system-xtensa --version'
RUN bash -lc 'set -euo pipefail; test -f "${PICO_SDK_PATH}/external/pico_sdk_import.cmake"; arm-none-eabi-gcc --version; printf "#include <cstdlib>\n" | arm-none-eabi-g++ -x c++ -std=gnu++17 -E - >/dev/null'

COPY docker-entrypoint.sh versions.json ./
COPY backend backend
Expand Down
12 changes: 7 additions & 5 deletions backend/app/api/frames.py
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,7 @@
from app.tasks.binary_builder import FrameBinaryBuilder
from app.tasks.embedded_firmware import (
ensure_embedded_frame_defaults,
embedded_toolchain_error,
embedded_toolchain_available,
latest_embedded_firmware,
normalize_embedded_platform,
Expand Down Expand Up @@ -2638,11 +2639,12 @@ async def api_frame_embedded_firmware(
_not_found()
if (frame.mode or "rpios") != "embedded":
_bad_request("Firmware generation is only available for embedded frames")
if not embedded_toolchain_available():
_bad_request(
"ESP-IDF toolchain not found on the backend. "
"Install it and set IDF_PATH (see embedded/esp32/README.md)."
)
try:
platform = normalize_embedded_platform((frame.embedded or {}).get("platform"))
except ValueError as exc:
_bad_request(str(exc))
if not embedded_toolchain_available(platform):
_bad_request(embedded_toolchain_error(platform))

try:
ensure_embedded_frame_defaults(frame)
Expand Down
Loading
Loading