Read Beast commands on Beast output clients, interpret the Mode A/C setting command.
This commit is contained in:
parent
34aeb29347
commit
cbdfd9dc5d
71
net_io.c
71
net_io.c
|
@ -67,6 +67,7 @@
|
||||||
// handled via non-blocking I/O and manually polling clients to see if
|
// handled via non-blocking I/O and manually polling clients to see if
|
||||||
// they have something new to share with us when reading is needed.
|
// they have something new to share with us when reading is needed.
|
||||||
|
|
||||||
|
static int handleBeastCommand(struct client *c, char *p);
|
||||||
static int decodeBinMessage(struct client *c, char *p);
|
static int decodeBinMessage(struct client *c, char *p);
|
||||||
static int decodeHexMessage(struct client *c, char *hex);
|
static int decodeHexMessage(struct client *c, char *hex);
|
||||||
#ifdef ENABLE_WEBSERVER
|
#ifdef ENABLE_WEBSERVER
|
||||||
|
@ -146,6 +147,7 @@ struct client *createGenericClient(struct net_service *service, int fd)
|
||||||
c->next = Modes.clients;
|
c->next = Modes.clients;
|
||||||
c->fd = fd;
|
c->fd = fd;
|
||||||
c->buflen = 0;
|
c->buflen = 0;
|
||||||
|
c->modeac_requested = 0;
|
||||||
Modes.clients = c;
|
Modes.clients = c;
|
||||||
|
|
||||||
++service->connections;
|
++service->connections;
|
||||||
|
@ -252,7 +254,7 @@ void modesInitNet(void) {
|
||||||
s = serviceInit("Raw TCP output", &Modes.raw_out, send_raw_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
s = serviceInit("Raw TCP output", &Modes.raw_out, send_raw_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
||||||
serviceListen(s, Modes.net_bind_address, Modes.net_output_raw_ports);
|
serviceListen(s, Modes.net_bind_address, Modes.net_output_raw_ports);
|
||||||
|
|
||||||
s = serviceInit("Beast TCP output", &Modes.beast_out, send_beast_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
s = serviceInit("Beast TCP output", &Modes.beast_out, send_beast_heartbeat, READ_MODE_BEAST_COMMAND, NULL, handleBeastCommand);
|
||||||
serviceListen(s, Modes.net_bind_address, Modes.net_output_beast_ports);
|
serviceListen(s, Modes.net_bind_address, Modes.net_output_beast_ports);
|
||||||
|
|
||||||
s = serviceInit("Basestation TCP output", &Modes.sbs_out, send_sbs_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
s = serviceInit("Basestation TCP output", &Modes.sbs_out, send_sbs_heartbeat, READ_MODE_IGNORE, NULL, NULL);
|
||||||
|
@ -312,6 +314,7 @@ static void modesCloseClient(struct client *c) {
|
||||||
// mark it as inactive and ready to be freed
|
// mark it as inactive and ready to be freed
|
||||||
c->fd = -1;
|
c->fd = -1;
|
||||||
c->service = NULL;
|
c->service = NULL;
|
||||||
|
c->modeac_requested = 0;
|
||||||
}
|
}
|
||||||
//
|
//
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
|
@ -803,6 +806,29 @@ void sendBeastSettings(struct client *c, const char *settings)
|
||||||
anetWrite(c->fd, buf, len);
|
anetWrite(c->fd, buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Handle a Beast command message.
|
||||||
|
// Currently, we just look for the Mode A/C command message
|
||||||
|
// and ignore everything else.
|
||||||
|
//
|
||||||
|
static int handleBeastCommand(struct client *c, char *p) {
|
||||||
|
if (p[0] != '1') {
|
||||||
|
// huh?
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (p[1]) {
|
||||||
|
case 'j':
|
||||||
|
c->modeac_requested = 0;
|
||||||
|
break;
|
||||||
|
case 'J':
|
||||||
|
c->modeac_requested = 1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
//=========================================================================
|
//=========================================================================
|
||||||
//
|
//
|
||||||
|
@ -1752,6 +1778,49 @@ static void modesReadFromClient(struct client *c) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case READ_MODE_BEAST_COMMAND:
|
||||||
|
while (som < eod && ((p = memchr(som, (char) 0x1a, eod - som)) != NULL)) { // The first byte of buffer 'should' be 0x1a
|
||||||
|
char *eom; // one byte past end of message
|
||||||
|
|
||||||
|
som = p; // consume garbage up to the 0x1a
|
||||||
|
++p; // skip 0x1a
|
||||||
|
|
||||||
|
if (p >= eod) {
|
||||||
|
// Incomplete message in buffer, retry later
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*p == '1') {
|
||||||
|
eom = p + 2;
|
||||||
|
} else {
|
||||||
|
// Not a valid beast command, skip 0x1a and try again
|
||||||
|
++som;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// we need to be careful of double escape characters in the message body
|
||||||
|
for (p = som + 1; p < eod && p < eom; p++) {
|
||||||
|
if (0x1A == *p) {
|
||||||
|
p++;
|
||||||
|
eom++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (eom > eod) { // Incomplete message in buffer, retry later
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Have a 0x1a followed by 1 - pass message to handler.
|
||||||
|
if (c->service->read_handler(c, som + 1)) {
|
||||||
|
modesCloseClient(c);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// advance to next message
|
||||||
|
som = eom;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case READ_MODE_ASCII:
|
case READ_MODE_ASCII:
|
||||||
//
|
//
|
||||||
// This is the ASCII scanning case, AVR RAW or HTTP at present
|
// This is the ASCII scanning case, AVR RAW or HTTP at present
|
||||||
|
|
2
net_io.h
2
net_io.h
|
@ -32,6 +32,7 @@ typedef void (*heartbeat_fn)(struct net_service *);
|
||||||
typedef enum {
|
typedef enum {
|
||||||
READ_MODE_IGNORE,
|
READ_MODE_IGNORE,
|
||||||
READ_MODE_BEAST,
|
READ_MODE_BEAST,
|
||||||
|
READ_MODE_BEAST_COMMAND,
|
||||||
READ_MODE_ASCII
|
READ_MODE_ASCII
|
||||||
} read_mode_t;
|
} read_mode_t;
|
||||||
|
|
||||||
|
@ -58,6 +59,7 @@ struct client {
|
||||||
struct net_service *service; // Service this client is part of
|
struct net_service *service; // Service this client is part of
|
||||||
int buflen; // Amount of data on buffer
|
int buflen; // Amount of data on buffer
|
||||||
char buf[MODES_CLIENT_BUF_SIZE+1]; // Read buffer
|
char buf[MODES_CLIENT_BUF_SIZE+1]; // Read buffer
|
||||||
|
int modeac_requested; // 1 if this Beast output connection has asked for A/C
|
||||||
};
|
};
|
||||||
|
|
||||||
// Common writer state for all output sockets of one type
|
// Common writer state for all output sockets of one type
|
||||||
|
|
Loading…
Reference in a new issue