{"id":21201679,"url":"https://github.com/oleander/u701","last_synced_at":"2026-06-30T15:31:59.265Z","repository":{"id":224454104,"uuid":"703418774","full_name":"oleander/u701","owner":"oleander","description":" u701 is a Rust-based BLE proxy that remaps Android-specific button inputs from a terrain command device to be compatible with iOS through an ESP32 microcontroller","archived":false,"fork":false,"pushed_at":"2025-08-22T07:09:31.000Z","size":3458,"stargazers_count":1,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-17T05:09:11.622Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oleander.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-10-11T07:56:39.000Z","updated_at":"2025-08-22T02:52:53.000Z","dependencies_parsed_at":"2025-08-22T00:37:45.013Z","dependency_job_id":null,"html_url":"https://github.com/oleander/u701","commit_stats":null,"previous_names":["oleander/u701"],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/oleander/u701","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleander%2Fu701","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleander%2Fu701/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleander%2Fu701/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleander%2Fu701/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oleander","download_url":"https://codeload.github.com/oleander/u701/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oleander%2Fu701/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34973611,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-30T02:00:05.919Z","response_time":92,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-20T20:10:28.940Z","updated_at":"2026-06-30T15:31:59.226Z","avatar_url":"https://github.com/oleander.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# u701 [![Rust Build Status](https://github.com/oleander/u701/actions/workflows/rust.yml/badge.svg)](https://github.com/oleander/u701/actions/workflows/rust.yml)\n\n**u701** is a BLE proxy developed in Rust and C++ for the [Terrain Command](https://carpe-iter.com/support/rally-command-getting-started/) controller by [Carpe Iter](https://carpe-iter.com). This software enables BLE event remapping for iOS device compatibility, expanding upon the original Android-only support. It operates on an ESP32C3 microcontroller but is designed to be portable to other platforms.\n\n## Setup\n\n* `cargo install cargo-pio espup just`\n* `just setup build`\n\n## Hardware Support\n\n- Terrain Command v2\n- ESP32C3\n\n\u003e For Terrain Command V3, update event IDs in `machine/src/constants.rs`.\n\n## Flashing the ESP32\n\n1. Connect the ESP32 to your computer.\n2. Run `just upload` to flash the ESP32.\n3. Run `just monitor` to view the serial output.\n\n## Features\n\n- **Direct Button Mapping**: Facilitates direct mapping of buttons to HID events, such as Play/Pause.\n- **Meta Key Combinations**: Utilizes red buttons on the Terrain Command as meta keys for triggering complex events.\n- **iOS Shortcuts Integration**: Enables triggering of iOS shortcuts through BLE events for advanced functionality.\n\n## Event Mapping Flow\n\nEvent processing in the Terrain Command follows this sequence:\n\n1. A button press occurs on the Terrain Command.\n2. The Terrain Command emits a BLE event.\n3. The ESP32, equipped with this software, receives and remaps the event.\n4. The iPhone receives the remapped BLE event.\n\nThe ESP32 functions both as a BLE host and server.\n\n## Terrain Command Button Layout\n\nThe controller features eight buttons, outlined as follows:\n\n| Row 1                  | Row 2                  |\n| ---------------------- | ---------------------- |\n| M1 :red_circle:        | M2 :red_circle:        |\n| A2 :black_circle:      | B2 :black_circle:      |\n| A3 :large_blue_circle: | B3 :large_blue_circle: |\n| A4 :black_circle:      | B4 :black_circle:      |\n\n## Meta Keys\n\nMeta keys (`M1` and `M2`) can be used in combination with other buttons to initiate unique BLE events:\n\n1. Press and release a Meta key.\n2. Press another button to trigger the corresponding event.\n\n### M1 and M2 Combinations\n\n| Key | M1 Combination | M2 Combination |\n| --- | -------------- | -------------- |\n| A2  | Shortcut A     | Shortcut G     |\n| A3  | Shortcut B     | Shortcut H     |\n| A4  | Shortcut C     | Shortcut I     |\n| B2  | Shortcut D     | Shortcut J     |\n| B3  | Shortcut E     | Shortcut K     |\n| B4  | Shortcut F     | Shortcut L     |\n\n## Shortcuts\n\nSteps to map iOS shortcuts:\n\n1. Create a shortcut in the iOS Shortcuts app.\n2. Navigate to `Settings -\u003e Accessibility -\u003e Keyboards -\u003e Commands` on your iPhone.\n3. Scroll to the bottom and select your shortcut.\n4. Press a key combination on the Terrain Command (e.g., `M1` + `A2`).\n5. The shortcut is now mapped and will be triggered with the key combination.\n\n## HID Events\n\nHID events are pre-mapped to the following keys:\n\n- `A2`: Volume Down\n- `A3`: Previous Song\n- `A4`: Play/Pause\n- `B2`: Volume Up\n- `B3`: Next Song\n- `B4`: Eject\n\n\u003e `Eject` in iOS is used to toggle the keyboard visibility. When iOS connects to an external keyboard, the on-screen keyboard is hidden. Pressing `Eject` on the Terrain Command will toggle the on-screen keyboard.\n\n## Custom Events\n\nFor custom events, modify mappings in `machine/src/constants.rs`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foleander%2Fu701","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foleander%2Fu701","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foleander%2Fu701/lists"}