network/udp_client/main.c
/*
* EVALUATION AND USE OF THIS SOFTWARE IS SUBJECT TO THE TERMS AND
* CONDITIONS OF THE CONTROLLING LICENSE AGREEMENT FOUND AT LICENSE.md
* IN THIS SDK. IF YOU DO NOT AGREE TO THE LICENSE TERMS AND CONDITIONS,
* PLEASE RETURN ALL SOURCE FILES TO SILICON LABORATORIES.
* (c) Copyright 2018, Silicon Laboratories Inc. All rights reserved.
*/
/* Documentation for this app is available online.
* See https://docs.silabs.com/gecko-os/4/standard/latest/sdk/examples/network/udp-client
*/
#include "gos.h"
#include "example_app_util.h"
#define UDP_HOST "test.zentri.com"
#define UDP_PORT 50007
#define UDP_TRANSMIT_PERIOD_MS 2000
#define NETWORK_UP_PERIOD_MS 7000
#define ATTEMPT_CONNECT_PERIOD 5000
#define APPLICATION_START_LINE "\r\nUDP Client example starting ..."
uint32_t packet_counter;
/*************************************************************************************************/
void gos_app_init(void)
{
gos_result_t result;
GOS_LOG(APPLICATION_START_LINE);
if (GOS_FAILED(result, example_app_util_network_up(GOS_INTERFACE_ANY, false, network_event_handler)))
{
}
}
/*************************************************************************************************/
static void network_event_handler(bool is_up)
{
if (is_up == true)
{
GOS_LOG("Network up");
gos_event_issue(udp_attempt_connect_handler, NULL, 0);
}
else
{
GOS_LOG("Network down.");
gos_event_unregister(udp_transmit_handler, NULL);
gos_event_unregister(udp_attempt_connect_handler, NULL);
gos_event_issue(network_up_handler, NULL, 0);
}
}
/*************************************************************************************************/
static void network_up_handler(void *arg)
{
gos_result_t result;
GOS_LOG("Attempting to bring network up ...");
gos_event_unregister(network_up_handler, NULL);
{
GOS_LOG("Failed to bring network up, err:%d", result);
GOS_LOG("Trying again in %d seconds", NETWORK_UP_PERIOD_MS/1000);
gos_event_register_timed(network_up_handler, NULL, NETWORK_UP_PERIOD_MS, 0);
}
}
/*************************************************************************************************/
static void udp_attempt_connect_handler(void *arg)
{
gos_result_t result;
gos_handle_t stream_handle;
{
network_event_handler(false);
return;
}
GOS_LOG("Connecting to remote UDP server %s:%u", UDP_HOST, UDP_PORT);
{
GOS_LOG("Failed to connect. Trying again in %d seconds", ATTEMPT_CONNECT_PERIOD/1000);
gos_event_register_timed(udp_attempt_connect_handler, NULL, ATTEMPT_CONNECT_PERIOD, 0);
return;
}
packet_counter = 0;
GOS_LOG("Connected!");
gos_udp_register_receive_event_handler(stream_handle, udp_receive_handler);
GOS_LOG("Transmitting data every %ums", UDP_TRANSMIT_PERIOD_MS);
gos_event_register_periodic(udp_transmit_handler, (void*)stream_handle, UDP_TRANSMIT_PERIOD_MS, GOS_EVENT_FLAGS1(RUN_NOW));
}
/*************************************************************************************************/
{
gos_result_t result;
{
GOS_LOG("Failed to poll UDP stream, err:%d", result);
return;
}
{
return;
}
{
GOS_LOG("Failed to read data, err:%d", result);
return;
}
}
/*************************************************************************************************/
static void udp_transmit_handler(void *arg)
{
gos_result_t result;
char buffer[128];
uint32_t gpio_values;
gos_iso8601_str_t time_str;
gpio_values = gos_gpio_mask_get(0xFFFF);
const int len = sprintf(buffer, "%3u: time:%s, gpios:%04X\r\n", (unsigned int)packet_counter, (const char*)&time_str, (unsigned int)gpio_values);
packet_counter++;
{
GOS_LOG("Failed to transmit data, err:%d", result);
}
}