updated README
This commit is contained in:
197
README.md
197
README.md
@@ -1,2 +1,195 @@
|
|||||||
# Smart Serow
|
# Smart Serow
|
||||||
Pi Zero + Arduino Nano motorcycle info terminal
|
|
||||||
|
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
|
||||||
|
```
|
||||||
Reference in New Issue
Block a user