Skip to content

Commit

Permalink
Add udp support.
Browse files Browse the repository at this point in the history
All sockets are now created in both tcp and udp mode, processing is
same, so connect either using udp or tcp, it does not matter.

Add a "socket" framework were additional sockets/ports can be added
easily.
  • Loading branch information
eriksl committed Dec 21, 2016
1 parent 1983725 commit ec64a4a
Show file tree
Hide file tree
Showing 12 changed files with 669 additions and 365 deletions.
4 changes: 2 additions & 2 deletions Makefile
Expand Up @@ -161,12 +161,12 @@ SDKLIBS := -lhal -lpp -lphy -lnet80211 -llwip -lwpa -lcrypto

OBJS := application.o config.o display.o display_cfa634.o display_lcd.o display_orbital.o display_saa.o \
http.o i2c.o i2c_sensor.o io.o io_gpio.o io_aux.o io_mcp.o io_pcf.o ota.o queue.o \
stats.o time.o uart.o user_main.o util.o
socket.o stats.o time.o uart.o user_main.o util.o
OTA_OBJ := rboot-bigflash.o rboot-api.o
HEADERS := application.h config.h display.h display_cfa634.h display_lcd.h display_orbital.h display_saa.h \
esp-uart-register.h http.h i2c.h i2c_sensor.h io.h io_gpio.h \
io_aux.h io_mcp.h io_pcf.h ota.h queue.h stats.h uart.h user_config.h \
user_main.h util.h
socket.h user_main.h util.h

.PRECIOUS: *.c *.h
.PHONY: all flash flash-plain flash-ota clean free linkdebug always ota
Expand Down
112 changes: 56 additions & 56 deletions application.c
Expand Up @@ -249,122 +249,122 @@ irom static app_action_t application_function_stats(const string_t *src, string_
return(app_action_normal);
}

irom static app_action_t application_function_bridge_tcp_port(const string_t *src, string_t *dst)
irom static app_action_t application_function_bridge_port(const string_t *src, string_t *dst)
{
int tcp_port;
int port;

if(parse_int(1, src, &tcp_port, 0) == parse_ok)
if(parse_int(1, src, &port, 0) == parse_ok)
{
if((tcp_port < 0) || (tcp_port > 65535))
if((port < 0) || (port > 65535))
{
string_format(dst, "> invalid port %d\n", tcp_port);
string_format(dst, "> invalid port %d\n", port);
return(app_action_error);
}

if(tcp_port == 0)
config_delete("tcp.bridge.port", -1, -1, false);
if(port == 0)
config_delete("bridge.port", -1, -1, false);
else
if(!config_set_int("tcp.bridge.port", -1, -1, tcp_port))
if(!config_set_int("bridge.port", -1, -1, port))
{
string_cat(dst, "> cannot set config\n");
return(app_action_error);
}
}

if(!config_get_int("tcp.bridge.port", -1, -1, &tcp_port))
tcp_port = 0;
if(!config_get_int("bridge.port", -1, -1, &port))
port = 0;

string_format(dst, "> port: %d\n", tcp_port);
string_format(dst, "> port: %d\n", port);

return(app_action_normal);
}

irom static app_action_t application_function_bridge_tcp_timeout(const string_t *src, string_t *dst)
irom static app_action_t application_function_bridge_timeout(const string_t *src, string_t *dst)
{
int tcp_timeout;
int timeout;

if(parse_int(1, src, &tcp_timeout, 0) == parse_ok)
if(parse_int(1, src, &timeout, 0) == parse_ok)
{
if((tcp_timeout < 0) || (tcp_timeout > 65535))
if((timeout < 0) || (timeout > 65535))
{
string_format(dst, "> invalid timeout: %d\n", tcp_timeout);
string_format(dst, "> invalid timeout: %d\n", timeout);
return(app_action_error);
}

if(tcp_timeout == 90)
config_delete("tcp.bridge.timeout", -1, -1, false);
if(timeout == 90)
config_delete("bridge.timeout", -1, -1, false);
else
if(!config_set_int("tcp.bridge.timeout", -1, -1, tcp_timeout))
if(!config_set_int("bridge.timeout", -1, -1, timeout))
{
string_cat(dst, "> cannot set config\n");
return(app_action_error);
}
}

if(!config_get_int("tcp.bridge.timeout", -1, -1, &tcp_timeout))
tcp_timeout = 90;
if(!config_get_int("bridge.timeout", -1, -1, &timeout))
timeout = 90;

string_format(dst, "> timeout: %d\n", tcp_timeout);
string_format(dst, "> timeout: %d\n", timeout);

return(app_action_normal);
}

irom static app_action_t application_function_command_tcp_port(const string_t *src, string_t *dst)
irom static app_action_t application_function_command_port(const string_t *src, string_t *dst)
{
int tcp_port;
int port;

if(parse_int(1, src, &tcp_port, 0) == parse_ok)
if(parse_int(1, src, &port, 0) == parse_ok)
{
if((tcp_port < 1) || (tcp_port > 65535))
if((port < 1) || (port > 65535))
{
string_format(dst, "> invalid port %d\n", tcp_port);
string_format(dst, "> invalid port %d\n", port);
return(app_action_error);
}

if(tcp_port == 24)
config_delete("tcp.cmd.port", -1, -1, false);
if(port == 24)
config_delete("cmd.port", -1, -1, false);
else
if(!config_set_int("tcp.cmd.port", -1, -1, tcp_port))
if(!config_set_int("cmd.port", -1, -1, port))
{
string_cat(dst, "> cannot set config\n");
return(app_action_error);
}
}

if(!config_get_int("tcp.cmd.port", -1, -1, &tcp_port))
tcp_port = 24;
if(!config_get_int("cmd.port", -1, -1, &port))
port = 24;

string_format(dst, "> port: %d\n", tcp_port);
string_format(dst, "> port: %d\n", port);

return(app_action_normal);
}

irom static app_action_t application_function_command_tcp_timeout(const string_t *src, string_t *dst)
irom static app_action_t application_function_command_timeout(const string_t *src, string_t *dst)
{
int tcp_timeout;
int timeout;

if(parse_int(1, src, &tcp_timeout, 0) == parse_ok)
if(parse_int(1, src, &timeout, 0) == parse_ok)
{
if((tcp_timeout < 0) || (tcp_timeout > 65535))
if((timeout < 0) || (timeout > 65535))
{
string_format(dst, "> invalid timeout: %d\n", tcp_timeout);
string_format(dst, "> invalid timeout: %d\n", timeout);
return(app_action_error);
}

if(tcp_timeout == 90)
config_delete("tcp.cmd.timeout", -1, -1, false);
if(timeout == 90)
config_delete("cmd.timeout", -1, -1, false);
else
if(!config_set_int("tcp.cmd.timeout", -1, -1, tcp_timeout))
if(!config_set_int("cmd.timeout", -1, -1, timeout))
{
string_cat(dst, "> cannot set config\n");
return(app_action_error);
}
}

if(!config_get_int("tcp.cmd.timeout", -1, -1, &tcp_timeout))
tcp_timeout = 90;
if(!config_get_int("cmd.timeout", -1, -1, &timeout))
timeout = 90;

string_format(dst, "> timeout: %d\n", tcp_timeout);
string_format(dst, "> timeout: %d\n", timeout);

return(app_action_normal);
}
Expand Down Expand Up @@ -1239,24 +1239,24 @@ irom static app_action_t application_function_gpio_assoc_set(const string_t *src
static const application_function_table_t application_function_table[] =
{
{
"btp", "bridge-tcp-port",
application_function_bridge_tcp_port,
"set uart tcp bridge tcp port (default 23)"
"bp", "bridge-port",
application_function_bridge_port,
"set uart bridge tcp/udp port (default 23)"
},
{
"btt", "bridge-tcp-timeout",
application_function_bridge_tcp_timeout,
"set uart tcp bridge tcp timeout (default 0)"
"bt", "bridge-timeout",
application_function_bridge_timeout,
"set uart bridge tcp connection timeout (default 0)"
},
{
"ctp", "command-tcp-port",
application_function_command_tcp_port,
"set command tcp port (default 24)"
"cp", "command-port",
application_function_command_port,
"set command tcp/udp port (default 24)"
},
{
"ctt", "command-tcp-timeout",
application_function_command_tcp_timeout,
"set command tcp timeout (default 0)"
"ct", "command-timeout",
application_function_command_timeout,
"set command tcp connection timeout (default 0)"
},
{
"cd", "config-dump",
Expand Down
34 changes: 17 additions & 17 deletions display_cfa634.c
Expand Up @@ -110,13 +110,13 @@ irom bool_t display_cfa634_init(void)
{
msleep(10);

queue_push(&data_send_queue, 25); // send UDG
queue_push(&data_send_queue, ix);
queue_push(&uart_send_queue, 25); // send UDG
queue_push(&uart_send_queue, ix);

for(byte = 0; byte < display_common_udg_byte_size; byte++)
queue_push(&data_send_queue, display_common_udg[ix].pattern[byte]);
queue_push(&uart_send_queue, display_common_udg[ix].pattern[byte]);

uart_start_transmit(!queue_empty(&data_send_queue));
uart_start_transmit(!queue_empty(&uart_send_queue));
}

inited = true;
Expand All @@ -138,10 +138,10 @@ attr_const irom bool_t display_cfa634_bright(int brightness)
if((brightness < 0) || (brightness > 4))
return(false);

queue_push(&data_send_queue, 15); // set contrast
queue_push(&data_send_queue, values[brightness]);
queue_push(&uart_send_queue, 15); // set contrast
queue_push(&uart_send_queue, values[brightness]);

uart_start_transmit(!queue_empty(&data_send_queue));
uart_start_transmit(!queue_empty(&uart_send_queue));

msleep(10);

Expand Down Expand Up @@ -173,30 +173,30 @@ irom bool_t display_cfa634_show(void)
if(y >= display_common_buffer_rows)
return(false);

queue_push(&data_send_queue, 3); // restore blanked display
queue_push(&data_send_queue, 20); // scroll off
queue_push(&data_send_queue, 24); // wrap off
queue_push(&uart_send_queue, 3); // restore blanked display
queue_push(&uart_send_queue, 20); // scroll off
queue_push(&uart_send_queue, 24); // wrap off

queue_push(&data_send_queue, 17); // goto column,row
queue_push(&data_send_queue, 0);
queue_push(&data_send_queue, y);
queue_push(&uart_send_queue, 17); // goto column,row
queue_push(&uart_send_queue, 0);
queue_push(&uart_send_queue, y);

for(x = 0; x < display_common_buffer_columns; x++)
{
c = display_common_buffer[y][x];

if((c < 32) || ((c > 128) && (c < 136)))
{
queue_push(&data_send_queue, 30); // send data directly to LCD controller
queue_push(&data_send_queue, 1);
queue_push(&uart_send_queue, 30); // send data directly to LCD controller
queue_push(&uart_send_queue, 1);
}

queue_push(&data_send_queue, c);
queue_push(&uart_send_queue, c);
}

display_common_row_status.row[y].dirty = 0;

uart_start_transmit(!queue_empty(&data_send_queue));
uart_start_transmit(!queue_empty(&uart_send_queue));

msleep(10);

Expand Down
17 changes: 13 additions & 4 deletions otapush.c
Expand Up @@ -19,7 +19,7 @@ enum

static void crc32_init(void);
static uint32_t crc32(int length, const char *src);
static unsigned int verbose, timeout, dontcommit, chunk_size;
static unsigned int verbose, timeout, dontcommit, chunk_size, udp;

static void usage(void)
{
Expand All @@ -31,6 +31,7 @@ static void usage(void)
fprintf(stderr, "-p|--port set command port (default 24)\n");
fprintf(stderr, "-s|--chunk-size set chunk size (256 / 512 or 1024 bytes, default is 1024 bytes)\n");
fprintf(stderr, "-t|--timeout ms set communication timeout (default = 30000 = 30s)\n");
fprintf(stderr, "-u|--udp use udp instead of tcp\n");
fprintf(stderr, "-V|--verify verify (instead of write)\n");
fprintf(stderr, "-v|--verbose verbose\n");
}
Expand Down Expand Up @@ -72,7 +73,7 @@ static int resolve(const char * hostname, int port, struct sockaddr_in6 *saddr)
memset(&hints, 0, sizeof(hints));

hints.ai_family = AF_INET6;
hints.ai_socktype = SOCK_STREAM;
hints.ai_socktype = udp ? SOCK_DGRAM : SOCK_STREAM;
hints.ai_flags = AI_NUMERICSERV | AI_V4MAPPED;

if((s = getaddrinfo(hostname, service, &hints, &res)))
Expand Down Expand Up @@ -626,13 +627,14 @@ typedef enum

int main(int argc, char * const *argv)
{
static const char *shortopts = "np:s:t:v";
static const char *shortopts = "np:s:t:uv";
static const struct option longopts[] =
{
{ "dont-commmit", no_argument, 0, 'c' },
{ "port", required_argument, 0, 'p' },
{ "chunk-size", required_argument, 0, 's' },
{ "timeout", required_argument, 0, 't' },
{ "udp", no_argument, 0, 'u' },
{ "verbose", no_argument, 0, 'v' },
{ 0, 0, 0, 0 }
};
Expand All @@ -650,6 +652,7 @@ int main(int argc, char * const *argv)
chunk_size = 1024;
timeout = 30000;
verbose = 0;
udp = 0;

while((arg = getopt_long(argc, argv, shortopts, longopts, 0)) != -1)
{
Expand Down Expand Up @@ -679,6 +682,12 @@ int main(int argc, char * const *argv)
break;
}

case('u'):
{
udp = 1;
break;
}

case('v'):
{
verbose = 1;
Expand Down Expand Up @@ -722,7 +731,7 @@ int main(int argc, char * const *argv)
return(-1);
}

if((socket_fd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
if((socket_fd = socket(AF_INET6, udp ? SOCK_DGRAM : SOCK_STREAM, 0)) < 0)
{
fprintf(stderr, "socket failed: %m\n");
goto error;
Expand Down

0 comments on commit ec64a4a

Please sign in to comment.