static unsigned char getByte (BrailleDisplay *brl) { unsigned char byte; while (!gioAwaitInput(brl->gioEndpoint, 1000000000)); gioReadByte(brl->gioEndpoint, &byte, 0); return byte; }
static unsigned char getByte (void) { unsigned char byte; while (!gioAwaitInput(gioEndpoint, 1000000000)); gioReadByte(gioEndpoint, &byte, 0); return byte; }
unsigned char serialAvailable( GioEndpoint *gioEndpoint){ #ifdef ARDUINO return Serial.available(); #endif #ifdef BRLTTY return gioAwaitInput(gioEndpoint,0); #endif }
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; }
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; }
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; }
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; }
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; } } }