diff --git a/doc/ble_transport.txt b/doc/ble_transport.txt index b54ac2bb..5cf2336a 100644 --- a/doc/ble_transport.txt +++ b/doc/ble_transport.txt @@ -177,10 +177,15 @@ GATT-клиент использует WriteValueWithResultAsync, сервер NotifyValueAsync(value, subscribedClient): DATA/ACK — notify-only, INVITE — indicate-only. DATA/ACK пишут с WriteWithoutResponse и подписываются на Notify; INVITE сохраняет WriteWithResponse/Indicate. Сервер отвечает Respond только на WriteWithResponse. -После открытия исходящего GATT при наличии IBluetoothLEDevice6 (Windows 11) -запрашивается ThroughputOptimized. Request хранится до close линка и закрывается -отдельно. GetConnectionParameters/GetConnectionPhy и события изменений логируют -фактический интервал/latency/timeout и TX/RX PHY. Установка 2M этим API не доступна; +В обеих ролях при наличии IBluetoothLEDevice6 (Windows 11) запрашивается +ThroughputOptimized. Для входящего link BluetoothLEDevice получается через +FromIdAsync(session.DeviceId().Id()), без discovery и нового подключения. +Этот запрос независим от DATA; отказ настройки логируется и не закрывает GATT. +При close запрос получения device отменяется, device и throughput request закрываются; +запоздавший результат закрытого link освобождается без изменения других соединений. +Request хранится до close линка. DEBUG выводит запрошенный диапазон интервалов, +latency/timeout. GetConnectionParameters/GetConnectionPhy и события изменений логируют +на INFO роль и фактический интервал/latency/timeout и TX/RX PHY. Установка 2M этим API не доступна; Windows выбирает PHY с peer. Отсутствие/отказ API не ломает GATT-подключение. Результаты WinRT сериализуются в uasync через bounded mailbox (256 событий). Опоздавшие callbacks используют weak ownership и ID, закрытые handles не трогают. @@ -222,7 +227,10 @@ test_ble_bluez: отдельный dbus-run-session с подставным Blue test_ble_winrt (Windows): объявления с настоящим QueryInterface без EventArgs2 (1809) и с EventArgs2 (2004), сохранение адреса/типа; настоящий mailbox и hresult_error без радио; исключение одного link не останавливает другого, ошибка radio прекращает доставку batch, -shutdown отменяет диагностический таймер, posted_task и поздние callbacks. Тест можно запускать в Wine; +shutdown отменяет диагностический таймер, posted_task и поздние callbacks. +Входящая настройка скорости проверяет независимость от DATA при успехе, отказе, +NULL и исключении, закрытие device и гонку отмены с поздним результатом. +Тест можно запускать в Wine; он не проверяет драйвер, доступность Bluetooth API и физическую передачу. ble_probe 3: ручная проверка реального радио (scan, GATT registration, публикация и замена тестового manufacturer-объявления); не подключается к чужим устройствам. diff --git a/lib/ble/tests/test_ble_winrt.cpp b/lib/ble/tests/test_ble_winrt.cpp index db17eec4..48ee17b3 100644 --- a/lib/ble/tests/test_ble_winrt.cpp +++ b/lib/ble/tests/test_ble_winrt.cpp @@ -104,9 +104,10 @@ static void incoming_speed(UASYNC* ua) { s->close(7); CHECK(speed->cancelled == 1); speed->finish(AsyncStatus::Completed); uasync_poll(ua, 0); CHECK(device->closed == 1 && !s->link(7) && s->link(9) && !s->failed && !owner.link_failures); - s->tune_incoming(*s->link(9), speed.as>()); - s->shutdown(); CHECK(speed->cancelled == 2); - speed->finish(AsyncStatus::Canceled); uasync_poll(ua, 0); + auto pending = make_self(); + s->tune_incoming(*s->link(9), pending.as>()); + s->shutdown(); CHECK(pending->cancelled == 1); + pending->finish(AsyncStatus::Canceled); uasync_poll(ua, 0); CHECK(s->events.empty() && !s->posted && !owner.radio_failures && !owner.link_failures); DEBUG_INFO(CAT, "WinRT test PASS: incoming speed preserves DATA on success/failure, closes device and cancels late/shutdown work"); }