You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
74 lines
1.9 KiB
74 lines
1.9 KiB
#include "ymodem.h"
|
|
#include "tick.h"
|
|
#include "serial.h"
|
|
|
|
struct serial_ymodem {
|
|
struct ymodem_xfer xfer;
|
|
int (*on_info)(void *user, const char *name, unsigned int size);
|
|
int (*on_data)(void *user, const void *name, unsigned int size);
|
|
struct serial *uart;
|
|
void *user;
|
|
};
|
|
|
|
static int do_getc(struct ymodem_xfer *xfer, uint8_t *c, int timeout)
|
|
{
|
|
struct serial_ymodem *modem = (struct serial_ymodem *)xfer;
|
|
uint64_t end = millis() + timeout;
|
|
int n;
|
|
|
|
do {
|
|
n = serial_recv_buffered(modem->uart, c, 1);
|
|
} while ((n != 1) && (millis() < end));
|
|
return n == 1 ? 0 : -1;
|
|
}
|
|
|
|
static int do_putc(struct ymodem_xfer *xfer, uint8_t c)
|
|
{
|
|
struct serial_ymodem *modem = (struct serial_ymodem *)xfer;
|
|
int nr;
|
|
|
|
do {
|
|
nr = serial_send_buffered(modem->uart, &c, 1);
|
|
} while (nr != 1);
|
|
return 0;
|
|
}
|
|
|
|
static int on_info(struct ymodem_xfer *xfer, const char *name, unsigned int size)
|
|
{
|
|
struct serial_ymodem *modem = (struct serial_ymodem *)xfer;
|
|
|
|
if (modem->on_info) {
|
|
return modem->on_info(modem->user, name, size);
|
|
}
|
|
return -1;
|
|
}
|
|
|
|
static int on_data(struct ymodem_xfer *xfer, const void *data, unsigned int size)
|
|
{
|
|
struct serial_ymodem *modem = (struct serial_ymodem *)xfer;
|
|
|
|
if (modem->on_data)
|
|
return modem->on_data(modem->user, data, size);
|
|
return -1;
|
|
}
|
|
|
|
int serial_ymodem_recv(struct serial *uart, void *user,
|
|
int (*_on_info)(void *user, const char *name, unsigned int size),
|
|
int (*_on_data)(void *user, const void *data, unsigned int len))
|
|
{
|
|
struct serial_ymodem modem = {
|
|
.xfer = {
|
|
.getc = do_getc,
|
|
.putc = do_putc,
|
|
.on_info = on_info,
|
|
.on_data = on_data,
|
|
},
|
|
.on_info = _on_info,
|
|
.on_data = _on_data,
|
|
.uart = uart,
|
|
.user = user
|
|
};
|
|
|
|
return ymodem_recv(&modem.xfer);
|
|
}
|
|
|
|
|