101 lines
2.2 KiB
C
101 lines
2.2 KiB
C
#include "FreeRTOS.h"
|
|
#include "task.h"
|
|
|
|
#include "lwip/netif.h"
|
|
|
|
#include "user_tasks.h"
|
|
|
|
#include "cli.h"
|
|
|
|
#include "netterm.h"
|
|
|
|
// ----- TASK PROPERTIES -----
|
|
static TaskHandle_t sTH; // task handle
|
|
static uint8_t sPrio = 5; // priority
|
|
static uint16_t sStkSize = 1024; // stack size
|
|
void task_eth(void * pParam); // task routine function
|
|
// ---------------------------
|
|
|
|
typedef union {
|
|
uint32_t qword;
|
|
uint8_t bytes[4];
|
|
} IPAddrUnion;
|
|
|
|
static struct {
|
|
IPAddrUnion ipAddr; // ip-address
|
|
bool isConnected; // are we connected to a network?
|
|
} sState;
|
|
|
|
|
|
#define PRINT_IP(ip) MSG("IP-address: %u.%u.%u.%u\r\n", (ip & 0xFF), ((ip >> 8) & 0xFF), ((ip >> 16) & 0xFF), ((ip >> 24) & 0xFF));
|
|
|
|
static int CB_ip(const CliToken_Type *ppArgs, uint8_t argc) {
|
|
PRINT_IP(netif_default->ip_addr.addr);
|
|
return 0;
|
|
}
|
|
|
|
// register task
|
|
void reg_task_eth() {
|
|
BaseType_t result = xTaskCreate(task_eth, "eth", sStkSize, NULL, sPrio, &sTH);
|
|
if (result != pdPASS) { // error handling
|
|
MSG("Failed to create task! (errcode: %ld)\n", result);
|
|
}
|
|
|
|
|
|
// register CLI commands
|
|
cli_register_command("ip \t\t\tPrint IP-address", 1, 0, CB_ip);
|
|
}
|
|
|
|
#define IP_ADDR_VALID(ip) (ip != 0 && ip != ~0)
|
|
|
|
void task_eth(void * pParam) {
|
|
uint32_t currentIP = 0; // current IP address
|
|
|
|
// MAIN LOOP
|
|
while (1) {
|
|
vTaskDelay(pdMS_TO_TICKS(500)); // delay between pollings
|
|
|
|
currentIP = netif_default->ip_addr.addr;
|
|
|
|
// if we were not up before but now we have received an IP address
|
|
if (sState.isConnected == false && IP_ADDR_VALID(currentIP) && netif_is_link_up(netif_default)) {
|
|
sState.isConnected = true;
|
|
|
|
// print IP address
|
|
MSG("Connected!\n");
|
|
PRINT_IP(currentIP);
|
|
|
|
// --------------------
|
|
|
|
vTaskDelay(pdMS_TO_TICKS(200));
|
|
|
|
// start PTP task
|
|
MSG("Starting PTP-task!\n");
|
|
reg_task_ptp();
|
|
|
|
// --------------------
|
|
|
|
MSG("Starting NETTERM!\n");
|
|
netterm_init();
|
|
|
|
} else if (sState.isConnected == true && !IP_ADDR_VALID(currentIP) && !netif_is_link_up(netif_default)) { // if we have disconnected from the network
|
|
|
|
MSG("Disconnected!\n");
|
|
|
|
sState.isConnected = false;
|
|
|
|
// stop PTP task
|
|
MSG("Stopping PTP-task!\n");
|
|
unreg_task_ptp();
|
|
|
|
// -------------------
|
|
|
|
MSG("Stopping NETTERM!\n");
|
|
netterm_deinit();
|
|
|
|
} else { // we are connected
|
|
// Todo ...
|
|
}
|
|
}
|
|
}
|