Files
smart-serow/README.md

195 lines
4.8 KiB
Markdown
Raw Normal View History

2026-01-24 21:21:20 +09:00
# Smart Serow
Pi Zero 2W + Arduino Nano motorcycle info terminal.
## Architecture
```
┌─────────────────┐ ┌─────────────────┐
│ Arduino Nano │──────│ Pi Zero 2W │
│ (sensors) │ UART │ (Flutter UI) │──── Display
└─────────────────┘ └─────────────────┘
```
- **Pi Zero 2W**: Runs Flutter UI via DRM/KMS (direct framebuffer, no X11)
- **Arduino Nano**: Sensor interface (future)
## Project Structure
```
smart-serow/
├── arduino/ # Arduino sketches
│ └── hello.ino
├── pi/
│ └── ui/ # Flutter app (elinux target)
│ ├── lib/main.dart
│ ├── pubspec.yaml
│ └── elinux/ # Platform-specific build config
├── scripts/
│ ├── build.sh # Cross-compile for ARM64
│ ├── deploy.sh # Push to Pi via rsync
│ ├── deploy_target.json
│ ├── pi_setup.sh # One-time Pi setup
│ └── smartserow-ui.service
└── pi_sysroot/ # Pi libraries for cross-linking (gitignored)
```
---
## Build Environment Setup (WSL2)
### Requirements
- **WSL2 with Debian Trixie** (glibc 2.38)
- **flutter-elinux**: <https://github.com/aspect-apps/flutter-elinux>
- **ARM64 cross-compiler**:
```bash
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu binutils-aarch64-linux-gnu
```
### Pi Sysroot (for cross-linking)
The ARM64 linker needs Pi's shared libraries to resolve symbols at link time.
These don't execute locally - the linker just reads their symbol tables.
**On the Pi**, grab the libs:
```bash
tar czf pi_libs.tar.gz \
/lib/aarch64-linux-gnu \
/usr/lib/aarch64-linux-gnu
```
**In WSL2**, extract to project root:
```bash
mkdir -p pi_sysroot
tar xzf pi_libs.tar.gz -C pi_sysroot --strip-components=1
```
Key libraries needed:
- libxkbcommon, libEGL, libdrm, libgbm, libinput
- libudev, libsystemd, libfontconfig
---
## Target Environment (Pi Zero 2W)
### Requirements
- **Debian Trixie** (glibc 2.38 - must match build host!)
- Display connected via HDMI/DSI
### First-Time Setup
```bash
# Copy scripts to Pi
scp scripts/pi_setup.sh scripts/smartserow-ui.service user@pi.local:~/
# Run setup on Pi
ssh user@pi.local
chmod +x pi_setup.sh
./pi_setup.sh
```
This installs:
- Runtime dependencies (libgl, libgles, libdrm, libgbm, libinput, fonts)
- Systemd service for auto-start
- User permissions for DRM/KMS access
---
## Build & Deploy
### Build (in WSL2)
```bash
./scripts/build.sh # Normal build
./scripts/build.sh --clean # Clean CMake cache first
```
Build output: `pi/ui/build/elinux/arm64/release/bundle/`
### Deploy
Edit `scripts/deploy_target.json`:
```json
{
"user": "mikkeli",
"host": "smartserow.local",
"remote_path": "/opt/smartserow",
"service_name": "smartserow-ui"
}
```
Deploy:
```bash
./scripts/deploy.sh # Just copy files
./scripts/deploy.sh --restart # Copy and restart service
```
### Verify
```bash
ssh user@pi.local 'systemctl status smartserow-ui'
ssh user@pi.local 'journalctl -u smartserow-ui -f' # Live logs
```
---
## Display Backends
Flutter-elinux supports multiple backends. We use **GBM** (DRM/KMS direct).
| Backend | Use Case | Notes |
|---------|----------|-------|
| `gbm` | Production | Direct framebuffer, fast boot, no X11 |
| `x11` | Debug | Needs X server, mouse/keyboard friendly |
| `wayland` | - | Requires compositor, more dependencies |
The service runs with `-b drm`. For X11 debugging on Pi:
```bash
startx &
./smartserow_ui -b x11
```
---
## Known Issues / Gotchas
### glibc version mismatch
Build host and Pi must have matching glibc. We use Debian Trixie on both.
Symptom: `GLIBC_2.xx not found` at runtime.
### CMake caches compiler
If you change cross-compiler settings, run `./scripts/build.sh --clean`.
### flutter-elinux generates all platforms
The `flutter-elinux create` command scaffolds android/ios/web/etc.
These are gitignored - we only need `elinux/` and `linux/`.
### Libs not found at runtime
If `libflutter_engine.so` not found, check `LD_LIBRARY_PATH` in the service file.
Should point to `/opt/smartserow/bundle/lib`.
---
## Development Tips
### Local testing (Linux desktop)
```bash
cd pi/ui
flutter-elinux run -d linux
```
### Check what a binary needs
```bash
# On Pi
ldd /opt/smartserow/bundle/smartserow_ui
```
### Pi service management
```bash
sudo systemctl start smartserow-ui
sudo systemctl stop smartserow-ui
sudo systemctl restart smartserow-ui
journalctl -u smartserow-ui -f
```