Skip to content

Commit

Permalink
kiss: add callback support for multiple kiss ports
Browse files Browse the repository at this point in the history
Signed-off-by: Michal Demin <[email protected]>
  • Loading branch information
robots committed Feb 26, 2012
1 parent 21ac4e1 commit 76bb9fb
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
32 changes: 30 additions & 2 deletions bertos/net/kiss.c
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,9 @@ uint8_t kiss_queue_state;
size_t kiss_queue_len = 0;
struct Kiss_msg kiss_queue[KISS_QUEUE];

#define KISS_PORTS 4
kiss_in_callback_t kiss_in_callbacks[KISS_PORTS];

uint8_t kiss_txdelay;
uint8_t kiss_txtail;
uint8_t kiss_persistence;
Expand All @@ -38,6 +41,14 @@ void kiss_init(Serial *ser, AX25Ctx *ax25, Afsk *afsk)
kiss_afsk = afsk;
}

void kiss_set_in_callback(uint8_t port, kiss_in_callback_t fnc)
{
if ((port == 0) || ((port - 1) > KISS_PORTS))
return;

kiss_in_callbacks[port - 1] = fnc;
}

void kiss_serial_poll()
{
static struct Kiss_msg k = {.pos = 0};
Expand Down Expand Up @@ -101,8 +112,21 @@ static void kiss_cmd_process(struct Kiss_msg *k)
cmd = k->buf[0] & 0x0f;
port = k->buf[0] >> 4;

if (port != 0)
if (port != 0) {
kiss_in_callback_t fnc;

if (port > 5)
return;

if (cmd != KISS_CMD_DATA)
return;

fnc = kiss_in_callbacks[port - 1];
if (fnc) {
fnc(k->buf + 1, k->pos - 1);
}
return;
}

if (cmd == KISS_CMD_DATA) {
LOG_INFO("Kiss - queueing message\n");
Expand Down Expand Up @@ -151,7 +175,11 @@ void kiss_queue_process()
if (kiss_queue_len == 0) {
return;
}

/*
if (kiss_afsk->cd) {
return;
}
*/
if (kiss_ax25->dcd) {
return;
}
Expand Down
3 changes: 3 additions & 0 deletions bertos/net/kiss.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,16 @@ enum {
KISS_QUEUE_DELAYED,
};

typedef void (*kiss_in_callback_t)(uint8_t *buf, size_t len);

struct Kiss_msg {
uint8_t buf[ CONFIG_AX25_FRAME_BUF_LEN ];
size_t pos; // next byte to fill
ticks_t last_tick; // timestamp of last byte into buf
};

void kiss_init(Serial *ser, AX25Ctx *ax25, Afsk *afsk);
void kiss_set_in_callback(uint8_t port, kiss_in_callback_t fnc);
void kiss_serial_poll(void);
void kiss_queue_message(uint8_t *buf, size_t len);
void kiss_queue_process(void);
Expand Down

0 comments on commit 76bb9fb

Please sign in to comment.