Skip to content

Commit aadf049

Browse files
[WIP] introducing ping feature
1 parent 83a9a1f commit aadf049

File tree

4 files changed

+142
-77
lines changed

4 files changed

+142
-77
lines changed

UNOR4USBBridge/cmds_esp_generic.h

Lines changed: 38 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@
22
#define CMDS_ESP_GENERIC_H
33

44
#include "at_handler.h"
5-
#include "ESPping.h"
6-
char rsl[5]; // ping time
5+
#include "ping.h"
76

87
extern "C" {
98
#include "esp32-hal-tinyusb.h"
@@ -362,91 +361,53 @@ void CAtHandler::add_cmds_esp_generic() {
362361
return chAT::CommandStatus::ERROR;
363362
}
364363
};
365-
364+
366365
/* ....................................................................... */
367-
command_table[_PINGIP] = [this](auto & srv, auto & parser) {
366+
command_table[_PING] = [this](auto & srv, auto & parser) {
368367
/* ....................................................................... */
369-
switch (parser.cmd_mode) {
370-
case chAT::CommandMode::Write: {
371-
372-
if (parser.args.size() != 3) {
373-
return chAT::CommandStatus::ERROR;
374-
}
375-
376-
// get IP
377-
auto &hostip = parser.args[1];
378-
if (hostip.empty()) {
379-
return chAT::CommandStatus::ERROR;
380-
}
381-
382-
IPAddress address;
383-
if(!address.fromString(hostip.c_str())) {
384-
return chAT::CommandStatus::ERROR;
385-
}
386-
387-
// get count
388-
auto &cnt = parser.args[2];
389-
if (cnt.empty()) {
368+
switch (parser.cmd_mode) {
369+
case chAT::CommandMode::Write: {
370+
if (parser.args.size() != 3) {
390371
return chAT::CommandStatus::ERROR;
391-
}
392-
unsigned int count = atoi(cnt.c_str());
393-
394-
auto res = Ping.ping(address, count);
395-
if (res) { // ping was succesfull
396-
srv.write_response_prompt();
397-
sprintf(rsl,"%.2f", Ping.averageTime());
398-
srv.write_cstr((const char *) rsl);
399-
srv.write_line_end();
400-
return chAT::CommandStatus::OK;
401-
}
402-
srv.write_response_prompt();
403-
srv.write_error();
404-
srv.write_line_end();
405-
return chAT::CommandStatus::ERROR;
406372
}
407-
default:
408-
return chAT::CommandStatus::ERROR;
409-
}
410-
};
411373

412-
/* ....................................................................... */
413-
command_table[_PINGNAME] = [this](auto & srv, auto & parser) {
414-
/* ....................................................................... */
415-
switch (parser.cmd_mode) {
416-
case chAT::CommandMode::Write: {
417-
418-
if (parser.args.size() != 3) {
374+
// get IP
375+
auto &target = parser.args[1];
376+
if (target.empty()) {
419377
return chAT::CommandStatus::ERROR;
420-
}
378+
}
421379

422-
// get host name
423-
auto &host = parser.args[1];
424-
if (host.empty()) {
425-
return chAT::CommandStatus::ERROR;
426-
}
380+
// IPAddress address;
381+
// if(!address.fromString(hostip.c_str())) {
382+
// return chAT::CommandStatus::ERROR;
383+
// }
427384

428-
// get count
429-
auto &cnt = parser.args[2];
430-
if (cnt.empty()) {
385+
// get count
386+
auto &cnt = parser.args[2];
387+
if (cnt.empty()) {
431388
return chAT::CommandStatus::ERROR;
432-
}
433-
unsigned int count = atoi(cnt.c_str());
434-
435-
auto res = Ping.ping((const char* ) host.c_str(), count);
436-
if (res) { // ping was succesfull
437-
srv.write_response_prompt();
438-
sprintf(rsl,"%.2f", Ping.averageTime());
439-
srv.write_cstr((const char *) rsl);
440-
srv.write_line_end();
441-
return chAT::CommandStatus::OK;
442-
}
443-
srv.write_response_prompt();
444-
srv.write_error();
445-
srv.write_line_end();
446-
return chAT::CommandStatus::ERROR;
447389
}
448-
default:
449-
return chAT::CommandStatus::ERROR;
390+
unsigned int count = atoi(cnt.c_str());
391+
392+
auto ping_res = execute_ping(target.c_str(), count);
393+
394+
log_e("ping result %d %d %f", ping_res.success_count, ping_res.timedout_count, ping_res.averagertt);
395+
396+
// auto res = Ping.ping(address, count);
397+
// if (res) { // ping was succesfull
398+
// srv.write_response_prompt();
399+
// sprintf(rsl,"%.2f", Ping.averageTime());
400+
// srv.write_cstr((const char *) rsl);
401+
// srv.write_line_end();
402+
// return chAT::CommandStatus::OK;
403+
// }
404+
srv.write_response_prompt();
405+
srv.write_error();
406+
srv.write_line_end();
407+
return chAT::CommandStatus::ERROR;
408+
}
409+
default:
410+
return chAT::CommandStatus::ERROR;
450411
}
451412
};
452413
}

UNOR4USBBridge/commands.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,8 @@ enum file_op {
104104
#define _UDPREMOTEPORT "+UDPREMOTEPORT"
105105
#define _UDPSTOP "+UDPSTOP"
106106

107+
#define _PING "+PING"
108+
107109
#define _FWVERSION "+FWVERSION"
108110
#define _FWVERSION_U32 "+FWVERSION_U32"
109111

UNOR4USBBridge/ping.cpp

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
#include "ping.h"
2+
#include <string.h>
3+
#include <Arduino.h>
4+
#include <lwip/inet.h>
5+
#include <lwip/ip_addr.h>
6+
#include <lwip/netdb.h>
7+
#include "ping/ping_sock.h"
8+
9+
// we are assuming that ping is a blocking call that returns the results of a ping session
10+
// async operations are not taken into account as of now
11+
// one ping session can be performed
12+
13+
static ping_statistics _stats;
14+
15+
void ping_success(esp_ping_handle_t hdl, void *args) {
16+
uint32_t elapsed_time;
17+
esp_ping_get_profile(hdl, ESP_PING_PROF_TIMEGAP, &elapsed_time, sizeof(elapsed_time));
18+
// streaming average on rtt
19+
_stats.averagertt = _stats.averagertt + ((elapsed_time-_stats.averagertt)/++_stats.success_count);
20+
}
21+
22+
void ping_timeout(esp_ping_handle_t hdl, void *args) {
23+
_stats.timedout_count++;
24+
25+
}
26+
27+
void ping_end(esp_ping_handle_t hdl, void *args) {
28+
_stats.error = SUCCESS;
29+
}
30+
31+
32+
ping_statistics execute_ping(const char* address, uint8_t count) { // FIXME verify that I cann pass an ip addr as string
33+
34+
ip_addr_t target_addr;
35+
struct addrinfo hint;
36+
struct addrinfo *res = NULL;
37+
memset(&hint, 0, sizeof(hint));
38+
memset(&target_addr, 0, sizeof(target_addr));
39+
40+
log_e("resolving \"%s\"", address);
41+
42+
if(getaddrinfo(address, NULL, &hint, &res) != 0) {
43+
log_e("resolution error");
44+
_stats.error = DNS_RESOLUTION_ERROR;
45+
return _stats;
46+
}
47+
48+
struct in_addr addr4 = ((struct sockaddr_in *) (res->ai_addr))->sin_addr;
49+
inet_addr_to_ip4addr(ip_2_ip4(&target_addr), &addr4);
50+
freeaddrinfo(res);
51+
52+
53+
//FIXME check that the address is resolved
54+
esp_ping_config_t ping_config = ESP_PING_DEFAULT_CONFIG();
55+
ping_config.target_addr = target_addr; // target IP address
56+
57+
// for simplification we are not pinging indefinetly
58+
ping_config.count = count > 0? count : 10;
59+
60+
/* set callback functions */
61+
esp_ping_callbacks_t cbs;
62+
cbs.on_ping_success = ping_success;
63+
cbs.on_ping_timeout = ping_timeout;
64+
cbs.on_ping_end = ping_end;
65+
cbs.cb_args = NULL;
66+
67+
memset(&_stats, 0, sizeof(_stats));
68+
_stats.error = RUNNING;
69+
70+
esp_ping_handle_t ping; // FIXME do I need this?
71+
esp_ping_new_session(&ping_config, &cbs, &ping);
72+
esp_ping_start(ping);
73+
74+
// wait for the end of ping session
75+
while(_stats.error != RUNNING) {
76+
delay(10);
77+
}
78+
79+
return _stats;
80+
}
81+
82+
83+

UNOR4USBBridge/ping.h

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#pragma once
2+
3+
#include <stdint.h>
4+
5+
enum ping_error: uint8_t {
6+
RUNNING,
7+
SUCCESS,
8+
ERROR,
9+
DNS_RESOLUTION_ERROR,
10+
};
11+
12+
struct ping_statistics {
13+
uint8_t success_count;
14+
uint8_t timedout_count;
15+
float averagertt; // measured in ms
16+
volatile ping_error error;
17+
};
18+
19+
ping_statistics execute_ping(const char* address, uint8_t count=3);

0 commit comments

Comments
 (0)