static size_t getPacket (BrailleDisplay *brl, FS_Packet *packet) { while (1) { size_t count = readPacket(brl, packet); if (count > 0) { switch (packet->header.type) { { int ok; case FS_PKT_NAK: cancelMissingAcknowledgementAlarm(brl); logNegativeAcknowledgement(packet); if (!brl->data->acknowledgementHandler) { logMessage(LOG_WARNING, "unexpected NAK"); continue; } switch (packet->header.arg1) { case FS_ERR_TIMEOUT: { int originalLimit = brl->data->outputPayloadLimit; if (brl->data->outputPayloadLimit > brl->data->model->cellCount) brl->data->outputPayloadLimit = brl->data->model->cellCount; if (brl->data->outputPayloadLimit > 1) brl->data->outputPayloadLimit -= 1; if (brl->data->outputPayloadLimit != originalLimit) { logMessage(LOG_WARNING, "maximum payload length reduced from %d to %d", originalLimit, brl->data->outputPayloadLimit); } break; } } ok = 0; goto doAcknowledgement; case FS_PKT_ACK: cancelMissingAcknowledgementAlarm(brl); if (!brl->data->acknowledgementHandler) { logMessage(LOG_WARNING, "unexpected ACK"); continue; } ok = 1; goto doAcknowledgement; doAcknowledgement: if (handleAcknowledgement(brl, ok)) continue; count = 0; break; } default: break; } } return count; } }
static int getPacket (BrailleDisplay *brl, Packet *packet) { while (1) { int count = readPacket(brl, packet); if (count > 0) { switch (packet->header.type) { { int ok; case PKT_NAK: logNegativeAcknowledgement(packet); if (!brl->data->acknowledgementHandler) { logMessage(LOG_WARNING, "Unexpected NAK."); continue; } switch (packet->header.arg1) { case PKT_ERR_TIMEOUT: { int originalLimit = brl->data->outputPayloadLimit; if (brl->data->outputPayloadLimit > brl->data->model->cellCount) brl->data->outputPayloadLimit = brl->data->model->cellCount; if (brl->data->outputPayloadLimit > 1) brl->data->outputPayloadLimit--; if (brl->data->outputPayloadLimit != originalLimit) logMessage(LOG_WARNING, "Maximum payload length reduced from %d to %d.", originalLimit, brl->data->outputPayloadLimit); break; } } handleNegativeAcknowledgement: ok = 0; goto handleAcknowledgement; case PKT_ACK: if (!brl->data->acknowledgementHandler) { logMessage(LOG_WARNING, "Unexpected ACK."); continue; } ok = 1; handleAcknowledgement: brl->data->acknowledgementHandler(brl, ok); brl->data->acknowledgementHandler = NULL; if (writeRequest(brl)) continue; count = -1; break; } } } else if ((count == 0) && brl->data->acknowledgementHandler && afterTimePeriod(&brl->data->acknowledgementPeriod, NULL)) { if (++brl->data->acknowledgementsMissing < 5) { logMessage(LOG_WARNING, "Missing ACK; assuming NAK."); goto handleNegativeAcknowledgement; } logMessage(LOG_WARNING, "Too many missing ACKs."); count = -1; } return count; } }