From 59802547c336d61aa7e950414a3f44180e211974 Mon Sep 17 00:00:00 2001 From: lonkaars Date: Sun, 29 May 2022 17:01:03 +0200 Subject: client ping working --- client/commands.c | 40 ++++++++++++++++++++++++++++++++++++++++ client/commands.h | 8 ++++++++ client/main.c | 2 ++ client/main.h | 1 + client/serial.c | 7 +++++-- client/setup.c | 4 ++++ client/time.c | 3 +++ client/time.h | 11 +++++++++++ client/time_linux.c | 21 +++++++++++++++++++++ 9 files changed, 95 insertions(+), 2 deletions(-) create mode 100644 client/commands.c create mode 100644 client/commands.h create mode 100644 client/time.c create mode 100644 client/time.h create mode 100644 client/time_linux.c diff --git a/client/commands.c b/client/commands.c new file mode 100644 index 0000000..67025f4 --- /dev/null +++ b/client/commands.c @@ -0,0 +1,40 @@ +#include + +#include "commands.h" +#include "time.h" +#include "main.h" +#include "../shared/bin.h" +#include "../shared/protocol.h" + +void w2_send_bin(w2_s_bin *data) { + w2_serial_write("\xff", 1); + for (uint8_t i = 0; i < data->bytes; i++) { + uint8_t byte = data->data[i]; + byte == 0xff ? w2_serial_write("\xff\xff", 2) : w2_serial_write((char *)&byte, 1); + } +} + +w2_s_bin* w2_send_info() { + size_t msg_size = sizeof(w2_s_cmd_info_rx); + w2_s_cmd_info_rx *msg = malloc(msg_size); + msg->opcode = W2_CMD_INFO | W2_CMDDIR_RX; + w2_s_bin *msg_bin = w2_bin_s_alloc(msg_size, (uint8_t *)msg); + w2_send_bin(msg_bin); + free(msg); + free(msg_bin); +} + +w2_s_bin* w2_send_ping() { + g_w2_state.ping_id = (uint8_t) rand(); + size_t msg_size = sizeof(w2_s_cmd_ping_rx); + w2_s_cmd_ping_rx *msg = malloc(msg_size); + msg->opcode = W2_CMD_PING | W2_CMDDIR_RX; + msg->id = g_w2_state.ping_id; + w2_s_bin *msg_bin = w2_bin_s_alloc(msg_size, (uint8_t *)msg); + w2_send_bin(msg_bin); + free(msg); + free(msg_bin); + + w2_timer_start(W2_TIMER_PING); +} + diff --git a/client/commands.h b/client/commands.h new file mode 100644 index 0000000..aa4b964 --- /dev/null +++ b/client/commands.h @@ -0,0 +1,8 @@ +#pragma once + +#include "serial.h" +#include "../shared/bin.h" + +w2_s_bin* w2_send_info(); +w2_s_bin* w2_send_ping(); + diff --git a/client/main.c b/client/main.c index 1060f7d..530af2a 100644 --- a/client/main.c +++ b/client/main.c @@ -4,6 +4,8 @@ #include "serial.h" #include "ui.h" +w2_s_client_state g_w2_state; + int main(int argc, char **argv) { w2_client_setup(argc, argv); diff --git a/client/main.h b/client/main.h index 7bb2173..f81e8ce 100644 --- a/client/main.h +++ b/client/main.h @@ -4,6 +4,7 @@ typedef struct { unsigned int ping; + uint8_t ping_id; w2_s_cmd_info_tx info; w2_s_cmd_sens_tx io; } w2_s_client_state; diff --git a/client/serial.c b/client/serial.c index 6f667a8..ec523cc 100644 --- a/client/serial.c +++ b/client/serial.c @@ -1,15 +1,18 @@ #include "serial.h" +#include "time.h" +#include "main.h" #include "../shared/protocol.h" #include "../shared/serial_parse.h" void w2_serial_main() { int temp; while ((temp = w2_serial_read()) != -1) w2_serial_parse(temp); - w2_serial_write("\xff\x14", 2); } void w2_cmd_ping_tx(w2_s_bin *data) { - printf("w2_cmd_ping_tx()\n"); + // TODO: check ping id + g_w2_state.ping = w2_timer_end(W2_TIMER_PING); + printf("ping measured, %ims\n", g_w2_state.ping); } void w2_cmd_expt_tx(w2_s_bin *data) { printf("w2_cmd_expt_tx()\n"); diff --git a/client/setup.c b/client/setup.c index d7314e8..35b761c 100644 --- a/client/setup.c +++ b/client/setup.c @@ -3,6 +3,7 @@ #include "serial.h" #include "setup.h" +#include "commands.h" #include "../shared/bin.h" #include "../shared/protocol.h" @@ -24,6 +25,9 @@ void w2_client_setup(int argc, char** argv) { w2_cmd_setup_handlers(); + w2_send_info(); + w2_send_ping(); + // check endianness g_w2_endianness = *_ptest; } diff --git a/client/time.c b/client/time.c new file mode 100644 index 0000000..d48be64 --- /dev/null +++ b/client/time.c @@ -0,0 +1,3 @@ +#include "time.h" + +unsigned long g_w2_client_timers[W2_CLIENT_TIMER_COUNT] = {0}; diff --git a/client/time.h b/client/time.h new file mode 100644 index 0000000..75b1f70 --- /dev/null +++ b/client/time.h @@ -0,0 +1,11 @@ +#pragma once + +/** amount of parallel timers */ +#define W2_CLIENT_TIMER_COUNT (4) +extern unsigned long g_w2_client_timers[W2_CLIENT_TIMER_COUNT]; +typedef enum { + W2_TIMER_PING = 0 +} w2_e_client_timers; + +void w2_timer_start(w2_e_client_timers label); +unsigned long w2_timer_end(w2_e_client_timers label); diff --git a/client/time_linux.c b/client/time_linux.c new file mode 100644 index 0000000..5b72838 --- /dev/null +++ b/client/time_linux.c @@ -0,0 +1,21 @@ +#ifdef W2_HOST_LINUX + +#include + +#include "time.h" + +unsigned long w2_get_time() { + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + return ((now.tv_sec * 1000) + (now.tv_nsec / 1000000)); +} + +void w2_timer_start(w2_e_client_timers label) { + g_w2_client_timers[label] = w2_get_time(); +} + +unsigned long w2_timer_end(w2_e_client_timers label) { + return w2_get_time() - g_w2_client_timers[label]; +} + +#endif -- cgit v1.2.3