Skip to content

georgik/esp32-conways-game-of-life-rs

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

99 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

ESP32 Conway's Game of Life in Rust

Implementation of Conway's Game of Life Rust Bare Metal.

Wokwi

ESP32 Conways Game of Life in Rust

Recommended Tools

Supported boards

ESP32-S3-BOX-3 Minimal Implementation

The implementation is based on Rust no_std, using mipidsi crate.

cd esp32-s3-box-3-minimal cargo run --release 

Waveshare ESP32-C6-LCD 1.47

Rust Bare Metal no_std with Bevy ECS no_std on 1.47 inch ESP32-C6 LCD Waheshare with DMA and framebuffer - Conway's Game of Life:

2025-03-bevy-no_std.mp4

The implementation is based on Rust no_std and Bevy ECS no_std, plus mipidsi crate.

cd waveshare-esp32-c6-lcd-1_28 cargo run --release 

Waveshare ESP32-S3-Touch-LCD 1.28

ESP32 Conways Game of Life in Rust - Waveshare ESP32-S3 Touch LCD with Bevy ECS

Rust Bare Metal no_std with Bevy ECS no_std on Waheshare ESP32-S3 LCD Touch 1.28 inch with DMA and framebuffer:

The implementation is based on Rust no_std and Bevy ECS no_std, plus mipidsi crate.

cd waveshare-esp32-s3-touch-lcd-1_28 cargo run --release 

Waveshare ESP32-S3-Touch-AMOLED 1.8

ESP32 Conways Game of Life in Rust - Waveshare ESP32-S3 Touch AMOLED with Bevy ECS

Rust Bare Metal no_std with Bevy ECS no_std on Waveshare ESP32-S3 Touch AMOLED 1.8 inch with DMA and framebuffer:

The implementation is based on Rust no_std and Bevy ECS no_std, featuring a high-density 368Γ—448 pixel AMOLED display with enhanced font visibility.

cd waveshare-esp32-s3-touch-amoled-1_8 cargo run --release 

M5Stack Atom-S3

ESP32 Conways Game of Life in Rust - M5Stack Atom-S3 with Bevy ECS

Controls: Press button under display to reset the game state (GPIO 41).

The implementation is based on Rust no_std, using mipidsi crate and Bevy ECS. It requires es-rs toolchain for ESP32-S3 version at least 1.85, because of edition 2024.

Installation of the toolchain:

cargo install espup espup install --toolchain-version 1.85.0.0 source ~/export-esp.sh 

Build:

cd m5stack-atom-s3 cargo run --release 

M5Stack CoreS3

ESP32 Conways Game of Life in Rust - M5Stack CoreS3 with Bevy ECS

Controls: Press the button under display to reset the game state.

Note: Press Boot button and reset to enter download mode.

The implementation is based on Rust no_std, using mipidsi crate and Bevy ECS.

Installation of the toolchain:

espup install --toolchain-version 1.85.0.0 source ~/export-esp.sh 

Build:

cd m5stack-cores3 cargo run --release 

ESP32-S3-BOX-3

ESP32 Conways Game of Life in Rust - ESP32-S3-BOX-3 with Bevy ECS

The implementation is based on Rust no_std, using mipidsi crate and Bevy ECS. It requires es-rs toolchain for ESP32-S3 version at least 1.85, because of edition 2024.

Installation of the toolchain:

cargo install espup espup install --toolchain-version 1.85.0.0 source ~/export-esp.sh 

Build:

cd esp32-s3-box-3 cargo run --release 

ESP32-S3-LCD-Ev-Board

ESP32 Conways Game of Life in Rust - ESP32-S3-LCD-Ev-Board with Bevy ECS

ESP32-S3-LCD-Ev-Board is more complex when it comes to the display. Initialization sequence for the display is:

  • initialize I2C
  • tunnel SPI commands via I2C bus
  • configure 16 GPIOs to transfer data
  • all data must be transferred in one transaction (requires PSRAM)

The timing of the display must be precise, otherwise incorrect data will be displayed.

Working configuration of timing:

 // Configure the RGB display let config = Config::default() .with_clock_mode(ClockMode { polarity: Polarity::IdleLow, phase: Phase::ShiftLow, }) .with_frequency(Rate::from_mhz(10)) .with_format(Format { enable_2byte_mode: true, ..Default::default() }) .with_timing(FrameTiming { // active region horizontal_active_width: 480, vertical_active_height: 480, // extend total timings for larger porch intervals horizontal_total_width: 600, // allow long back/front porch horizontal_blank_front_porch: 80, vertical_total_height: 600, // allow longer vertical blank vertical_blank_front_porch: 80, // maintain sync widths hsync_width: 10, vsync_width: 4, // place HSYNC pulse well before active data hsync_position: 10, }) .with_vsync_idle_level(Level::High) .with_hsync_idle_level(Level::High) .with_de_idle_level(Level::Low) .with_disable_black_region(false);

This is only bare metal implementation, does not contain Bevy ECS in this version.

cargo install espup espup install --toolchain-version 1.85.0.0 source ~/export-esp.sh 

Build:

cd esp32-s3-lcd-ev-board cargo run --release 

ESP32-C3-LCDKit

ESP32 Conways Game of Life in Rust - ESP32-C3-LCDkit with Bevy ECS

Controls: Press button rotary button to reset the game state (GPIO 9).

cd esp32-c3-lcdkit cargo run --release 

ESoPe SLD_C_W_S3

ESP32 Conways Game of Life in Rust - ESoPe SLD_C_W_S3

Board: SDL_C_W_S3 Display: RGB Schukat Smartwin display-concept

The implementation is based on Embassy Async Rust no_std with RGB interface. Both cores of ESP32-S3 are used. One core is handling DMA transfers to the display, while the other core is running the game logic.

RGB displays are very time-sensitive, so the timing of the display must be precise, that's also why one core is dedicated to the display.

The display configuration is stored in EEPROM for this specific display type.

Run:

cd esope-sld-c-w-s3 cargo r -r 

The board requires connection using ESP-Prog. You need to switch the board into boot mode. Press and hold the BOOT button, then press the RESET button, then release the BOOT button. Press the RESET button again to start the program.

WASM

This is experimental implementation for WASM.

cd wasm cargo run 

Then navigate to http://localhost:8000/ in your browser.

ESP32-WROVER-KIT

This board is no longer in production, yet it's still used by many developers.

ESP32 Conways Game of Life in Rust - ESP-WROVER-KIT with Bevy ECS

The implementation is based on Rust no_std, using mipidsi crate and Bevy ECS. It requires es-rs toolchain for ESP32-S3 version at least 1.88, because of edition 2024.

Installation of the toolchain:

cargo install espup espup install --toolchain-version 1.88.0.0 source ~/export-esp.sh 

Build:

cd esp32-wrover-kit cargo run --release 

πŸ“¦ Project Maintenance with xtask

This repository includes a comprehensive Rust-based maintenance tool that replaces shell scripts for managing multiple ESP32 embedded projects.

πŸ› οΈ Installation & Setup

  1. Clone the repository:

    git clone <repository-url> cd esp32-conways-game-of-life-rs
  2. Install dependencies:

    # Install cargo-edit for dependency updates cargo install cargo-edit # Build the xtask tool cargo build
  3. Set up ESP-IDF environment (required for building):

    source ~/projects/esp-idf/export.sh
  4. Fix workspace issues (one-time setup):

    cargo xtask fix-workspace

πŸ“‹ Available Commands

List Projects

cargo xtask list

Shows all discovered ESP32 projects and their status.

Build All Projects

# Build all projects (stops on first failure) cargo xtask build # Build all projects (continue even if some fail) cargo xtask build --keep-going # Build with verbose output cargo xtask build --verbose

Update Dependencies

# Preview available updates cargo xtask update --dry-run # Update to compatible versions only cargo xtask update # Include potentially breaking updates cargo xtask update --incompatible # Preview breaking changes cargo xtask update --dry-run --incompatible

Format Code

# Format all projects using cargo fmt cargo xtask format # Format with verbose output cargo xtask format --verbose

Run All Tasks

# Run: format β†’ update (compatible) β†’ build cargo xtask all # Run all tasks, continue on failures cargo xtask all --keep-going

Fix Workspace Issues

# Add empty [workspace] sections to prevent conflicts cargo xtask fix-workspace

Update Bootloader & Bevy ECS

# Preview what changes would be made cargo xtask update-bootloader --dry-run --verbose # Update ESP-IDF bootloader support and Bevy ECS to latest version cargo xtask update-bootloader

Automatically adds ESP-IDF bootloader support with correct chip-specific features and updates Bevy ECS to the latest version across all projects.

πŸ”§ Development

Adding New Commands

The tool is designed for easy extension. To add new commands:

  1. Add command to Commands enum in xtask/src/main.rs
  2. Implement the command handler function
  3. Add the match arm in main()