Hi Guy, On Mon, Nov 18, 2019 at 7:19 PM Guy Morand <g.morand@xxxxxxxx> wrote: > > Hello bluetooth developers, > > We are developing a wheelchair that we can controle with a bluetooth > gamepad, the XBOX 360 controller to be more precise. It basically works > fine but when I remove the battery, I get the disconnect event in the > user space around 10 seconds later. That is not acceptable since the > wheelchair will keep rolling to potentially dangerous places! > > I tried to implement a ping mechanism on the bluetooth layer, inspired > from bluez sources somewhere: > int _socket_fd = socket(PF_BLUETOOTH, SOCK_RAW, BTPROTO_L2CAP); > // bind on AF_BLUETOOTH > // connect with AF_BLUETOOTH > > send_cmd->ident = PING_IDENT; > send_cmd->len = htobs(PING_DATA_SIZE); > send_cmd->code = L2CAP_ECHO_REQ; > if (send(_socket_fd, send_buffer, PING_PACKET_SIZE, 0) <= 0) { > // ... > } > > It basically works fine except when the signal gets bad. This will get > printed by the kernel: > [ 859.629431] Bluetooth: hci0 link tx timeout > [ 859.635482] Bluetooth: hci0 killing stalled connection 9c:aa:1b:6b:51:c9 > > In that case, I don't get event from the /dev/jsX device but the gamepad > seems to still answer to pings??!! > > Since I haven't found any acceptable workaround and always find the same > pages again and again, I'm asking here: > * Is it possible to achieve what I want? > * Does it make sense that the ping work but the HID layer seems dead? > * Any recommendation, pointers? Id look into adjusting the link supervision timeout instead of creating a raw socket, you can use hcitool to do that, neither is really great since it require root but at least the supervision timeout is something a lot more reliable for this. -- Luiz Augusto von Dentz