Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
  }
}
Esempio n. 3
0
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;
  }
}