Example #1
0
static int
updateUsbKeys (BrailleDisplay *brl) {
  while (1) {
    unsigned char packet[8];

    {
      ssize_t result = gioReadData(brl->gioEndpoint, packet, sizeof(packet), 0);
      if (!result) return 1;

      if (result < 0) {
        if (errno == ENODEV) {
          /* Display was disconnected */
          return 0;
        }

        logMessage(LOG_ERR, "USB read error: %s", strerror(errno));
        keysInitialized = 0;
        return 1;
      }

      if (result < sizeof(packet)) {
        /* The display should only ever deliver packets of exactly 8 bytes */
        logPartialPacket(packet, result);
        keysInitialized = 0;
        return 1;
      }

      logInputPacket(packet, result);
    }

    updateKeys(brl, packet);
  }
}
Example #2
0
int
gioReadByte (GioEndpoint *endpoint, unsigned char *byte, int wait) {
  ssize_t result = gioReadData(endpoint, byte, 1, wait);
  if (result > 0) return 1;
  if (result == 0) errno = EAGAIN;
  return 0;
}
Example #3
0
static int
readPacket (BrailleDisplay *brl, Packet *packet) {
  while (1) {
    int size = sizeof(PacketHeader);
    int hasPayload = 0;

    if (brl->data->inputCount >= sizeof(PacketHeader)) {
      if (brl->data->inputBuffer.packet.header.type & 0X80) {
        hasPayload = 1;
        size += brl->data->inputBuffer.packet.header.arg1 + 1;
      }
    }

    if (size <= brl->data->inputCount) {
      logInputPacket(brl->data->inputBuffer.bytes, size);

      if (hasPayload) {
        unsigned char checksum = 0;
        int index;

        for (index=0; index<size; index+=1)
          checksum -= brl->data->inputBuffer.bytes[index];

        if (checksum) logMessage(LOG_WARNING, "Input packet checksum error.");
      }

      memcpy(packet, &brl->data->inputBuffer, size);
      memmove(&brl->data->inputBuffer.bytes[0], &brl->data->inputBuffer.bytes[size],
              brl->data->inputCount -= size);
      return size;
    }

  retry:
    {
      int count = gioReadData(brl->data->gioEndpoint,
                              &brl->data->inputBuffer.bytes[brl->data->inputCount],
                              size - brl->data->inputCount,
                              0);

      if (count < 1) {
        if (count == -1) {
          logSystemError("read");
        } else if ((count == 0) && (brl->data->inputCount > 0)) {
          if (gioAwaitInput(brl->data->gioEndpoint, 1000)) goto retry;
          if (errno != EAGAIN) count = -1;
          logPartialPacket(brl->data->inputBuffer.bytes, brl->data->inputCount);
          brl->data->inputCount = 0;
        }

        return count;
      }
      brl->data->acknowledgementsMissing = 0;

      if (!brl->data->inputCount) {
        static const unsigned char packets[] = {
          PKT_ACK, PKT_NAK,
          PKT_KEY, PKT_EXTKEY, PKT_BUTTON, PKT_WHEEL,
          PKT_INFO
        };
        int first;

        for (first=0; first<count; first+=1)
          if (memchr(packets, brl->data->inputBuffer.bytes[first], sizeof(packets)))
            break;

        if (first) {
          logDiscardedBytes(brl->data->inputBuffer.bytes, first);
          memmove(&brl->data->inputBuffer.bytes[0], &brl->data->inputBuffer.bytes[first], count-=first);
        }
      }

      brl->data->inputCount += count;
    }
  }
}