Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions .github/workflows/flutter-stage-a.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
name: Flutter Stage A
on:
push:
paths: ["flutter_app/**", ".github/workflows/flutter-stage-a.yml"]
pull_request:
paths: ["flutter_app/**", ".github/workflows/flutter-stage-a.yml"]
jobs:
verify:
runs-on: ubuntu-latest
defaults:
run:
working-directory: flutter_app
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
distribution: temurin
java-version: '17'
- uses: subosito/flutter-action@v2
with:
flutter-version: '3.44.9'
channel: stable
cache: true
- run: flutter pub get
- run: dart format --output=none --set-exit-if-changed lib test tool
- run: flutter analyze
- run: flutter test
- run: flutter build apk --debug
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# SatoriManager 项目

Flutter/Android 重构与三页界面位于 [flutter_app](flutter_app/README.md)。旧 Qt 工程仍保留;Flutter 版的真实设备与锁屏运行尚待验收。

## 项目简介
SatoriManager 是一个基于 Qt 和 QML 的小型机器人控制项目,用户可以通过移动端远程操控机器人。项目支持模式切换(如自动模式、睡眠模式、人脸识别等)以及机器人头部的旋转和眨眼控制,包含移动端控制客户端和机器人服务器端的通信功能。

Expand Down
212 changes: 212 additions & 0 deletions docs/BLE_A0_A1_REPORT.md

Large diffs are not rendered by default.

10 changes: 10 additions & 0 deletions docs/protocol/compatibility.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"protocol": "SatoriEye BLE v1.2",
"source": "ESP-3RDEYE/docs/ble/v1",
"files": {
"satori-ble-v1.md": "13e6c166aa938bb8904dd58e30645c7dcce7678d977afa472c1075a84e1ec462",
"satori_ble_v1_golden_vectors.json": "9f6a9d4b9759c9b36a7ef9c7f6aa0412f15ec8a81cd96128faec62917edbb14e",
"satori_ble_v1_1_management_vectors.json": "a8d2869740b370af3e003f086e0f076c1db16ef42ef95222f1bb543493d2ad8a",
"satori_ble_v1_2_shared_pairing_vectors.json": "0550f136fb109da8769a9a32ff3dfeb25f095e85419d9961e87a7c6a8982b9a7"
}
}
313 changes: 313 additions & 0 deletions docs/protocol/satori-ble-v1.md

Large diffs are not rendered by default.

102 changes: 102 additions & 0 deletions docs/protocol/satori_ble_v1_1_management_vectors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
{
"schema_version": 1,
"protocol": "SatoriEye BLE v1.1 owner management",
"warning": "All codes are synthetic test inputs, never actual device secrets.",
"commands": [
{
"name": "set_pairing_code",
"opcode": 8,
"sequence": 2,
"token": 305419896,
"code": 654321,
"hex": "01080200000078563412f1fb0900000000000000"
},
{
"name": "set_leading_zero_code",
"opcode": 8,
"sequence": 3,
"token": 305419896,
"code": 42,
"hex": "010803000000785634122a000000000000000000"
},
{
"name": "open_transfer",
"opcode": 9,
"sequence": 4,
"token": 305419896,
"hex": "0109040000007856341200000000000000000000"
},
{
"name": "cancel_transfer",
"opcode": 10,
"sequence": 5,
"token": 305419896,
"hex": "010a050000007856341200000000000000000000"
}
],
"rejection_cases": [
{
"name": "default_code_forbidden",
"expected_result": 4,
"hex": "0108020000007856341240e20100000000000000"
},
{
"name": "code_too_large",
"expected_result": 4,
"hex": "0108020000007856341240420f00000000000000"
},
{
"name": "code_reserved_nonzero",
"expected_result": 4,
"hex": "01080200000078563412f1fb0900010000000000"
},
{
"name": "open_reserved_nonzero",
"expected_result": 4,
"hex": "0109020000007856341201000000000000000000"
},
{
"name": "cancel_reserved_nonzero",
"expected_result": 4,
"hex": "010a020000007856341201000000000000000000"
},
{
"name": "wrong_token",
"expected_result": 6,
"hex": "01080200000001000000f1fb0900000000000000"
}
],
"events": [
{
"name": "set_code_ok",
"hex": "018802000000785634120001000000000cff0000"
},
{
"name": "open_transfer_ok",
"hex": "018904000000785634120001040000000cff0000"
},
{
"name": "cancel_transfer_ok",
"hex": "018a05000000785634120001040000000cff0000"
}
],
"scenarios": [
"empty_device_default_bootstrap",
"existing_identity_never_overwritten",
"partial_nvs_fails_closed",
"only_owner_changes_code",
"persist_failure_preserves_code",
"duplicate_set_does_not_rewrite",
"code_change_keeps_bond",
"default_code_cannot_open_transfer",
"open_halts_before_ack",
"retry_does_not_extend_window",
"stranger_denied_outside_window",
"timeout_retains_old_owner",
"reboot_closes_window",
"new_owner_commit_before_old_bond_delete",
"failed_commit_retains_old_owner",
"cancel_keeps_old_owner",
"new_phone_claim_stays_paused"
]
}
73 changes: 73 additions & 0 deletions docs/protocol/satori_ble_v1_2_shared_pairing_vectors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"schema_version": 1,
"protocol": "SatoriEye BLE v1.2 shared pairing",
"warning": "Synthetic test inputs only; no real device secrets.",
"reads": [
{
"name": "shared_device_info",
"hex": "010200020201df0100001414d007701702030000",
"protocol_minor": 2,
"capabilities": 479,
"security_policy": 2,
"max_bonds": 8
}
],
"rejection_cases": [
{
"name": "open_transfer_unsupported",
"hex": "0109020000007856341200000000000000000000",
"expected_result": 3
},
{
"name": "cancel_transfer_unsupported",
"hex": "010a020000007856341200000000000000000000",
"expected_result": 3
}
],
"scenarios": [
"three_phones_same_code_bonds_retained",
"only_one_connection_no_takeover",
"disconnect_reenables_advertising",
"failed_connect_reenables_advertising",
"changed_code_retains_existing_bonds",
"old_code_cannot_enroll_new_phone",
"eight_bonds_full_no_eviction",
"non_sc_or_unbonded_denied",
"upgrade_keeps_existing_bonds",
"every_connection_auto_arms_configured_output",
"reconnect_auto_arms_without_action_replay",
"invalid_explicit_configuration_stays_connected_paused",
"pause_cancels_inflight_auto_start",
"no_user_configuration_uses_built_in_profile",
"maintenance_overrides_preserved",
"malformed_configuration_not_hidden_by_defaults",
"pause_during_reconnect_backoff_persists_across_retries",
"release_lost_ack_replayed_with_default_retry_timing",
"release_window_starts_at_completion_and_does_not_extend"
],
"built_in_profile": {
"id": "satori_c3_v1",
"logical_minimum": [
500,
500,
500
],
"logical_maximum": [
2500,
2500,
2500
],
"startup": [
1500,
1500,
1500
],
"source": "Qt mobileclient.h MIN_PWM_VALUE/MAX_PWM_VALUE; mobileclient.cpp currentCH1/2/3"
},
"timing": {
"command_timeout_ms": 500,
"command_max_retries": 3,
"release_ack_window_ms": 3000,
"release_ack_window_origin": "action_completion"
}
}
Loading
Loading