44 lines
1.3 KiB
C
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;
|
|
}
|