Пример #1
0
static unsigned char
getByte (BrailleDisplay *brl) {
  unsigned char byte;
  while (!gioAwaitInput(brl->gioEndpoint, 1000000000));
  gioReadByte(brl->gioEndpoint, &byte, 0);
  return byte;
}
Пример #2
0
static unsigned char
getByte (void) {
  unsigned char byte;
  while (!gioAwaitInput(gioEndpoint, 1000000000));
  gioReadByte(gioEndpoint, &byte, 0);
  return byte;
}
Пример #3
0
unsigned char serialAvailable(
 GioEndpoint *gioEndpoint){
 #ifdef ARDUINO
 return Serial.available();
 #endif
 #ifdef BRLTTY
 return gioAwaitInput(gioEndpoint,0);
 #endif
}
Пример #4
0
int
probeBrailleDisplay (
  BrailleDisplay *brl, unsigned int retryLimit,
  GioEndpoint *endpoint, int inputTimeout,
  BrailleRequestWriter *writeRequest,
  BraillePacketReader *readPacket, void *responsePacket, size_t responseSize,
  BrailleResponseHandler *handleResponse
) {
  unsigned int retryCount = 0;

  if (!endpoint) endpoint = brl->gioEndpoint;

  while (writeRequest(brl)) {
    drainBrailleOutput(brl, 0);

    while (gioAwaitInput(endpoint, inputTimeout)) {
      size_t size = readPacket(brl, responsePacket, responseSize);
      if (!size) break;

      {
        BrailleResponseResult result = handleResponse(brl, responsePacket, size);

        switch (result) {
          case BRL_RSP_DONE:
            return 1;

          case BRL_RSP_UNEXPECTED:
            logUnexpectedPacket(responsePacket, size);
          case BRL_RSP_CONTINUE:
            break;

          default:
            logMessage(LOG_WARNING, "unimplemented braille response result: %u", result);
          case BRL_RSP_FAIL:
            return 0;
        }
      }
    }

    if (errno != EAGAIN)
#ifdef ETIMEDOUT
      if (errno != ETIMEDOUT)
#endif /* ETIMEDOUT */
        break;

    if (retryCount == retryLimit) break;
    retryCount += 1;
  }

  return 0;
}
Пример #5
0
static int
nextSerialPacket (unsigned char code, unsigned char *buffer, int size, int wait) {
  int length;

  if (wait)
    if (!gioAwaitInput(gioEndpoint, SERIAL_WAIT_TIMEOUT))
      return 0;

  while ((length = readSerialPacket(buffer, size))) {
    if (buffer[0] == code) return length;
    logUnexpectedPacket(buffer, length);
  }

  return 0;
}
Пример #6
0
static int
startDisplayMode (BrailleDisplay *brl) {
  static const unsigned char data[] = {MM_BLINK_NO, 0};

  if (writePacket(brl, MM_CMD_StartDisplayMode, 0, data, sizeof(data))) {
    if (gioAwaitInput(brl->gioEndpoint, START_INPUT_TIMEOUT)) {
      MM_CommandPacket response;
      size_t size = readPacket(brl, &response);

      if (size) {
        if (response.fields.header.id1 == MM_HEADER_ACK) return 1;
        logUnexpectedPacket(response.bytes, size);
      }
    }
  }

  return 0;
}
Пример #7
0
static int
getSyncBrailleCellCount (BrailleDisplay *brl, unsigned int *count) {
  static const unsigned char data[] = {
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  };

  if (writePacket(brl, 0XFB, 0X01, data, sizeof(data), NULL, 0)) {
    InputPacket packet;

    while (gioAwaitInput(brl->data->gioEndpoint, 1000)) {
      if (readPacket(brl, &packet)) {
        if (packet.data.type == IPT_CELLS) {
          *count = packet.data.data;
          return 1;
        }
      }
    }
  }

  return 0;
}
Пример #8
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;
    }
  }
}