int AccessoryTasks() { DWORD size; BYTE err; switch (channel_state) { case CHANNEL_INIT: USBHostAndroidRead(rx_buf, 1, ANDROID_INTERFACE_ACC); channel_state = CHANNEL_WAIT_OPEN; break; case CHANNEL_WAIT_OPEN: if (USBHostAndroidRxIsComplete(&err, &size, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Read failed with error code %d", err); return -1; } USBHostAndroidWrite(&is_channel_open, 1, ANDROID_INTERFACE_ACC); if (is_channel_open) { USBHostAndroidRead(rx_buf, rx_buf_size, ANDROID_INTERFACE_ACC); channel_state = CHANNEL_OPEN; } else { channel_state = CHANNEL_WAIT_CLOSED; } } break; case CHANNEL_OPEN: if (USBHostAndroidRxIsComplete(&err, &size, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Read failed with error code %d", err); return -1; } if (size) { callback(0, rx_buf, size); } // Channel might have been closed from within the callback. if (channel_state == CHANNEL_OPEN) { USBHostAndroidRead(rx_buf, rx_buf_size, ANDROID_INTERFACE_ACC); } } break; case CHANNEL_WAIT_CLOSED: if (USBHostAndroidTxIsComplete(&err, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Write failed with error code %d", err); return -1; } callback(0, NULL, 0); channel_state = CHANNEL_INIT; } break; } return channel_state == CHANNEL_INIT; }
static void AccessoryTasks() { DWORD size; BYTE err; // handle detach if (channel_state > CHANNEL_DETACHED && !USBHostAndroidIsInterfaceAttached(ANDROID_INTERFACE_ACC)) { if (is_channel_open) { callback(NULL, 1, callback_arg); is_channel_open = 0; } channel_state = CHANNEL_DETACHED; } switch (channel_state) { case CHANNEL_DETACHED: if (USBHostAndroidIsInterfaceAttached(ANDROID_INTERFACE_ACC)) { channel_state = CHANNEL_INIT; } break; case CHANNEL_INIT: USBHostAndroidRead(rx_buf, 1, ANDROID_INTERFACE_ACC); channel_state = CHANNEL_WAIT_OPEN; break; case CHANNEL_WAIT_OPEN: if (USBHostAndroidRxIsComplete(&err, &size, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Read failed with error code %d", err); return; } USBHostAndroidWrite(&is_channel_open, 1, ANDROID_INTERFACE_ACC); if (is_channel_open) { USBHostAndroidRead(rx_buf, rx_buf_size, ANDROID_INTERFACE_ACC); channel_state = CHANNEL_OPEN; } else { channel_state = CHANNEL_WAIT_CLOSED; } } break; case CHANNEL_OPEN: if (USBHostAndroidRxIsComplete(&err, &size, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Read failed with error code %d", err); return; } if (size) { callback(rx_buf, size, callback_arg); } // Channel might have been closed from within the callback. if (channel_state == CHANNEL_OPEN) { USBHostAndroidRead(rx_buf, rx_buf_size, ANDROID_INTERFACE_ACC); } } break; case CHANNEL_WAIT_CLOSED: if (USBHostAndroidTxIsComplete(&err, ANDROID_INTERFACE_ACC)) { if (err != USB_SUCCESS) { log_printf("Write failed with error code %d", err); return; } callback(NULL, 0, callback_arg); channel_state = CHANNEL_INIT; } break; } }
static void ADBPacketRecvTasks() { BYTE ret_val; DWORD bytes_received; switch (adb_packet_recv_state) { case ADB_PACKET_STATE_START: if (USBHostAndroidRead((BYTE*) &adb_packet_recv_header, sizeof(ADB_PACKET_HEADER), ANDROID_INTERFACE_ADB) != USB_SUCCESS) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_WAIT_HEADER); break; case ADB_PACKET_STATE_WAIT_HEADER: if (USBHostAndroidRxIsComplete(&ret_val, &bytes_received, ANDROID_INTERFACE_ADB)) { if (ret_val != USB_SUCCESS) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } // TODO: probably not needed // if (bytes_received == 0) { // adb_packet_recv_header.command = 0; // CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_IDLE); // break; // } if (bytes_received != sizeof(ADB_PACKET_HEADER) || adb_packet_recv_header.command != (~adb_packet_recv_header.magic) || adb_packet_recv_header.data_length > ADB_PACKET_MAX_RECV_DATA_BYTES) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } if (adb_packet_recv_header.data_length == 0) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_IDLE); break; } if (USBHostAndroidRead(adb_packet_recv_data, adb_packet_recv_header.data_length, ANDROID_INTERFACE_ADB) != USB_SUCCESS) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_WAIT_DATA); } break; case ADB_PACKET_STATE_WAIT_DATA: if (USBHostAndroidRxIsComplete(&ret_val, &bytes_received, ANDROID_INTERFACE_ADB)) { if (ret_val != USB_SUCCESS || bytes_received != adb_packet_recv_header.data_length) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } if (ADBChecksum(adb_packet_recv_data, adb_packet_recv_header.data_length) != adb_packet_recv_header.data_check) { CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_ERROR); break; } CHANGE_STATE(adb_packet_recv_state, ADB_PACKET_STATE_IDLE); } break; case ADB_PACKET_STATE_IDLE: case ADB_PACKET_STATE_ERROR: break; } }