Create escape room control software. Each Raspberry Pi (RPi) controls some number of wired props in the room. The room and props are referred to as the game. The game is made up of a number of game elements which can be puzzles, lights, sound, etc.. Each element can utilize one or more props, wired and/or non-wired.
## System Diagram
![[EG-Controllers.png]]
## Tasks
- [x] Add horse nicker as a sound effect ➕ 2026-05-11 ✅ 2026-05-11
- [x] Set horse to only trigger in auto pilot if ship and axe puzzle are solved, otherwise nicker and reset after 10 seconds ➕ 2026-05-10 ✅ 2026-05-12
- [x] Set helmets to only trigger in auto pilot if knocker is solved, otherwise grunt and reset after 10 seconds ➕ 2026-05-10 ✅ 2026-05-12
- [x] Display the version number in the DMG title (use `version.json5`) ➕ 2026-04-21 ✅ 2026-05-14
- [x] Collect and display the prop controller version numbers and display in the user interface ➕ 2026-05-11 ✅ 2026-05-14
- [x] Change the drum sequence and the number of lights that illuminate ➕ 2026-05-15 ✅ 2026-05-20
- [x] Add the lock combinations to the user interface ➕ 2026-04-23 ✅ 2026-05-20
- [x] Put all locks on one tab ➕ 2026-05-22 ✅ 2026-05-30
- [ ] Add drum puzzle sequence to the UI ➕ 2026-05-22
- [ ] Add axe puzzle order to the UI ➕ 2026-05-22
- [ ] Add the table puzzle order to the UI ➕ 2026-05-22
- [ ] Move all lock combinations onto one tab ➕ 2026-05-21
- [ ] Add Postgres user for the control software ➕ 2026-05-22
- [ ] Add tables for the Memir phrases ➕ 2026-05-22
- [ ] Collect and display the game controller version number in the user interface ➕ 2026-05-14
- [ ] Change the knocker sequence to match the tapping ➕ 2026-05-15
## Archived Tasks
- [x] Change each prop controller to send the time to the next ping in seconds along with it's name ➕ 2026-04-21 ✅ 2026-05-09
- [x] Ensure prop controllers send a ping when they start ➕ 2026-04-22 ✅ 2026-05-09
- [x] Add `.pkg` generation to the `odin_ui/Justfile` with version number in file name ➕ 2026-03-20 ✅ 2026-05-09
- [x] Rename `sys_ping_interval_secs` in the server to be `initial_sys_poll_time_secs`➕ 2026-04-21 ✅ 2026-05-09
- [x] Keep track of all next contact Instant ➕ 2026-04-21 ✅ 2026-05-10
- [x] Switch iOS build of Odin to Escape Gallery profile ➕ 2026-04-16 ✅ 2026-05-10
- [x] Add support for pre-defined messages for Memir in the user interface ➕ 2026-03-05 ✅ 2026-05-06
- [x] Create a separate stopwatch task with it's own commands; start, stop, reset ➕ 2026-02-06 ✅ 2026-02-11
- [x] Incorporate new stopwatch into auto pilot and UI ➕ 2026-02-09 ✅ 2026-03-17
- [x] Fix timer to be visible everywhere ➕ 2026-02-07 ✅ 2026-03-17
- [x] Finish the dragon prop code (reset is not working) ➕ 2026-01-03 ✅ 2026-01-10
- [x] Finish the coding for the detection of the knocker sequence ➕ 2026-01-04 ✅ 2026-01-10
- [x] Add `av1` and `av2` into System tab ➕ 2025-12-13 ✅ 2025-12-13
- [x] Create prop control software for `odin-av1`➕ 2025-12-13 ✅ 2025-12-13
- [x] Create prop control software for `odin-av2`➕ 2025-12-13 ✅ 2025-12-13
- [x] RFID reader for spear do not register RFID tag reliably. Wall is likely too thick, there are metal nails or screws in the wood, RFID tags buried too deep ➕ 2025-11-08 ✅ 2025-11-13
- [x] Dagger no longer registers reliably. RFID in wrong position or too deep. Also, knife can be reversed so not sure which side RFID tag is on ➕ 2025-11-08 ✅ 2025-11-13
- [x] Horses right eye no longer registers light/dark - need to dismantle and debug ➕ 2025-11-08 ✅ 2025-11-13
- [x] Divide up the controllers equally between the power supplies and see if that fixes the power on problem ➕ 2025-11-08 ✅ 2025-11-13
- [x] Add horse head eye sensor code code in `odin_middle`➕ 2025-11-04 ✅ 2025-11-06
- [x] Add short door latch opener code to `odin_left`➕ 2025-11-05 ✅ 2025-11-06
- [x] Add long door latch opener code to `odin_left`➕ 2025-11-05 ✅ 2025-11-06
- [x] Position the drums ➕ 2025-11-13 ✅ 2025-11-13
- [x] Add code to drive tree lights in `odin_tree`➕ 2025-11-06 ✅ 2025-11-13
- [x] Move code into the `odin_prop_util` from `odin_prop_msg`➕ 2025-12-09 ✅ 2025-12-09
- [x] Fix the `Justfile` to label builds correctly ➕ 2025-12-09 ✅ 2025-12-09
- [x] Configure scripting on `odin-ctrl`➕ 2025-12-09 ✅ 2025-12-09
- [x] Add code to receive commands from script and forward ➕ 2025-12-09 ✅ 2025-12-13
- [x] Update prop and game controllers ➕ 2025-12-13 ✅ 2025-12-13
- [x] Copy auto pilot code over from the simulator ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot UI in the app ➕ 2025-12-13 ✅ 2025-12-23
- [x] Get auto pilot triggering the axe puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the table puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the ship puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the bird puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the horse puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the bear puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the fish puzzle ➕ 2025-12-14 ✅ 2025-12-23
- [x] Get auto pilot triggering the fireplace ➕ 2025-12-14 ✅ 2025-12-23
- [x] Test EG room cameras ➕ 2025-07-06 ✅ 2025-12-23
- [x] Test EG speakers with `audio-forwarder`➕ 2025-09-15 ✅ 2025-12-23
- [x] Test Memir speakers with `audio-forwarder`➕ 2025-10-23 ✅ 2025-12-23
- [x] Test EG microphone with `audio-forwarder`➕ 2025-09-15 ✅ 2025-12-23
- [x] Get crank count code working on `odin_right`➕ 2025-11-05 ✅ 2025-12-23
- [x] Add the crank count to the fireplace UI ➕ 2025-10-31 ✅ 2025-12-23
- [x] Add `room_on` state to the `game.controller.state` message and set when all prop controllers are alive ➕ 2025-10-20 ✅ 2025-12-23
- [x] Update UI based on `room_on` state ➕ 2025-10-20 ✅ 2025-12-23
- [x] Re-install the knocker in the wall ➕ 2025-12-26 ✅ 2025-12-26
## Notes
Debug msgpack encoded messages on NATS using:
```sh
nats sub --translate 'mpk --to-json' prop.<prop-host>.state
```
You can also create a debug build of the the prop controller that uses [`to_vec_named`](https://docs.rs/rmp-serde/1.3.0/rmp_serde/encode/fn.to_vec_named.html) to add field names to the structure.
## References
![[odin_left_middle_right.png.jpeg]]
- [NATS](https://github.com/nats-io/nats.ws)
- [[Prop and Game Controller Raspberry Pi Configuration]]
- [Use Rhai for Scripting in Rust](https://crates.io/crates/rhai)
- The room is expected to be started in the following order - game controller then prop controllers and user interface.
- When a prop controller starts it will connect to the NATS server, and once successful will immediately send a system state message, updating the game controllers alive/dead state for that prop controller.
- The prop controller system state ping interval defaults to 60 seconds.
- The system service on the game controller will send a request for full state to all prop controllers when it starts. This is to handle situations where the room is running and the game controller needs to be restarted.
- The system service keeps a list of the last contact time for each of prop controllers. This time is updated each time a prop controller sends a system state message.
- Every 60 seconds (by default) the system service goes through the contact times and checks to see if the last contact time from any prop controller is greater than twice that, i.e. 120 seconds. If so it marks the prop controller as dead.
- The system server will only send out changes to the alive/dead status of systems if anything changes to avoid unnecessary network traffic.
Escape buddy is a web site that let’s you find “buddies” to do Escape rooms with.
## Notes
- Register as a user
- Cities that you can play in
- Preferred size of group
- Male/female/mixed
- List of Escape Rooms completed
- Implies a list of Escape rooms?
- Escape rooms interested in
- Ratings from other players
- Are these public & hidden?
- Maybe just written feedback?
- Can create an escape team
- Can request to join a team
- Could you vet who joins?
- Team name
- Escape rooms interested in, or specific one?
- Can create an event
- Suggest dates & times for the game
- Sign up for the game
- Split the cost among team members
- Post a review of the escape room
- Post pictures
## Requirements
- Authentication
- Database
- Image/file storage
- Web site
- App
## Examples
[Spark Golf](https://www.spark.golf/)
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.