Files
trikkeSensors/main/trikke_transport.c
T

44 lines
1.3 KiB
C

#include "trikke_transport.h"
static bool status_is_valid(trikke_transport_status_t status)
{
return status >= TRIKKE_TRANSPORT_COMPLETE &&
status <= TRIKKE_TRANSPORT_FATAL;
}
void trikke_transport_sender_init(trikke_transport_sender_t *sender)
{
if (sender != NULL) {
sender->pending = false;
}
}
trikke_transport_status_t trikke_transport_sender_step(
trikke_transport_sender_t *sender,
const trikke_transport_t *transport,
const uint8_t *packet,
size_t packet_size)
{
if (sender == NULL || transport == NULL || transport->begin == NULL ||
transport->poll == NULL || packet == NULL || packet_size == 0) {
return TRIKKE_TRANSPORT_FATAL;
}
const trikke_transport_status_t status = sender->pending
? transport->poll(transport->context)
: transport->begin(transport->context, packet, packet_size);
if (!status_is_valid(status)) {
sender->pending = false;
return TRIKKE_TRANSPORT_FATAL;
}
if (status == TRIKKE_TRANSPORT_PENDING) {
sender->pending = true;
} else {
// RETRY from poll is allowed only when the backend has discarded or
// otherwise resolved the old transfer and knows resubmission is safe.
sender->pending = false;
}
return status;
}