aboutsummaryrefslogtreecommitdiffstats
path: root/c/necho.c
blob: b9dc9d54c27758fa7d497e22bf68b116fe9f661a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include "gbos.h"
/* necho: send a SLIP-framed packet over the link port and print the reply.
   Talks to a host gateway (tools/gateway.py) that echoes frames back. */

#define SLIP_END     0xC0
#define SLIP_ESC     0xDB
#define SLIP_ESC_END 0xDC
#define SLIP_ESC_ESC 0xDD

static void slip_send(const char *buf, unsigned char len) {
    unsigned char i, c;
    ssend(SLIP_END);
    for (i = 0; i < len; i++) {
        c = (unsigned char)buf[i];
        if (c == SLIP_END)      { ssend(SLIP_ESC); ssend(SLIP_ESC_END); }
        else if (c == SLIP_ESC) { ssend(SLIP_ESC); ssend(SLIP_ESC_ESC); }
        else                      ssend(c);
    }
    ssend(SLIP_END);
}

static unsigned char slip_recv(char *buf, unsigned char max) {
    unsigned char len = 0, c;
    for (;;) {
        c = srecv();
        if (c == SLIP_END) { if (len) return len; continue; }
        if (c == SLIP_ESC) {
            c = srecv();
            if (c == SLIP_ESC_END) c = SLIP_END;
            else if (c == SLIP_ESC_ESC) c = SLIP_ESC;
        }
        if (len < max) buf[len++] = (char)c;
    }
}

void main(void) {
    char buf[64];
    unsigned char len;
    puts("net: send 'hello from gbos'"); nl();
    slip_send("hello from gbos", 15);
    len = slip_recv(buf, 63);
    buf[len] = 0;
    puts("net: recv '"); puts(buf); puts("'"); nl();
}