Hi Luiz, >> 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. we can add an option to L2CAP sockets to adjust the link supervision timeout. Anyway, these days, I would _not_ use Bluetooth BR/EDR for controlling anything. I would find a Gamepad that utilizes Bluetooth LE and focus on that. Regards Marcel