Commit 39bb6cba authored by Grzegorz Daniluk's avatar Grzegorz Daniluk Committed by Alessandro Rubini

add -s option to wr_mon to produce logs that are easy to parse

parent 4876da8b
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <getopt.h>
#include <minipc.h> #include <minipc.h>
...@@ -10,6 +11,10 @@ ...@@ -10,6 +11,10 @@
#include "hal_client.h" #include "hal_client.h"
#define SHOW_GUI 0
#define SHOW_STATS 1
hexp_port_list_t port_list; hexp_port_list_t port_list;
static struct minipc_ch *ptp_ch; static struct minipc_ch *ptp_ch;
...@@ -31,127 +36,167 @@ void init(int usecolor) ...@@ -31,127 +36,167 @@ void init(int usecolor)
halexp_query_ports(&port_list); halexp_query_ports(&port_list);
} }
void show_ports() void show_ports(int mode)
{ {
int i, j; int i, j;
time_t t; time_t t;
struct tm *tm; struct tm *tm;
char datestr[32]; char datestr[32];
time(&t); if(mode == SHOW_GUI) {
tm = localtime(&t); time(&t);
strftime(datestr, sizeof(datestr), "%Y-%m-%d %H:%M:%S", tm); tm = localtime(&t);
term_pcprintf(3, 1, C_BLUE, "Switch ports at %s\n", datestr); strftime(datestr, sizeof(datestr), "%Y-%m-%d %H:%M:%S", tm);
term_pcprintf(3, 1, C_BLUE, "Switch ports at %s\n", datestr);
for(i=0; i<18;i++) for(i=0; i<18;i++)
{ {
char if_name[10], found = 0; char if_name[10], found = 0;
hexp_port_state_t state; hexp_port_state_t state;
snprintf(if_name, 10, "wr%d", i); snprintf(if_name, 10, "wr%d", i);
for(j=0;j<port_list.num_ports;j++)
if(!strcmp(port_list.port_names[j], if_name)) { found = 1; break; }
if(!found) continue; for(j=0;j<port_list.num_ports;j++)
if(!strcmp(port_list.port_names[j], if_name)) { found = 1; break; }
halexp_get_port_state(&state, if_name);
if(!found) continue;
term_cprintf(C_WHITE, " %05s: ", if_name);
if(state.up) halexp_get_port_state(&state, if_name);
term_cprintf(C_GREEN, "Link up ");
else term_cprintf(C_WHITE, " %-5s: ", if_name);
term_cprintf(C_RED, "Link down "); if(state.up)
term_cprintf(C_GREEN, "Link up ");
else
term_cprintf(C_RED, "Link down ");
term_cprintf(C_GREY, "mode: ");
switch(state.mode)
{
case HEXP_PORT_MODE_WR_MASTER:
term_cprintf(C_WHITE, "WR Master ");
break;
case HEXP_PORT_MODE_WR_SLAVE:
term_cprintf(C_WHITE, "WR Slave ");
break;
}
term_cprintf(C_GREY, "mode: "); if(state.is_locked)
term_cprintf(C_GREEN, "Locked ");
else
term_cprintf(C_RED, "NoLock ");
switch(state.mode) if(state.rx_calibrated && state.tx_calibrated)
{ term_cprintf(C_GREEN, "Calibrated \n");
case HEXP_PORT_MODE_WR_MASTER: else
term_cprintf(C_WHITE, "WR Master "); term_cprintf(C_RED, "Uncalibrated \n");
break;
case HEXP_PORT_MODE_WR_SLAVE:
term_cprintf(C_WHITE, "WR Slave ");
break;
} }
}
if(state.is_locked) else if(mode == SHOW_STATS) {
term_cprintf(C_GREEN, "Locked "); printf("PORTS ");
else for(i=0; i<18; ++i) {
term_cprintf(C_RED, "NoLock "); char if_name[10], found = 0;
hexp_port_state_t state;
if(state.rx_calibrated && state.tx_calibrated)
term_cprintf(C_GREEN, "Calibrated \n"); snprintf(if_name, 10, "wr%d", i);
else for(j=0;j<port_list.num_ports;j++)
term_cprintf(C_RED, "Uncalibrated \n"); if(!strcmp(port_list.port_names[j], if_name)) { found = 1; break; }
if(!found) continue;
halexp_get_port_state(&state, if_name);
printf("port:%s ", if_name);
printf("lnk:%d ", state.up ? 1:0);
printf("mode:%s ", state.mode==HEXP_PORT_MODE_WR_SLAVE ? "S":"M");
printf("lock:%d ", state.is_locked ? 1:0);
}
printf("\n");
} }
} }
void show_servo() void show_servo(int mode)
{ {
ptpdexp_sync_state_t ss; ptpdexp_sync_state_t ss;
minipc_call(ptp_ch, 2000, &__rpcdef_get_sync_state, &ss); minipc_call(ptp_ch, 2000, &__rpcdef_get_sync_state, &ss);
term_cprintf(C_BLUE, "Synchronization status:\n"); if(mode == SHOW_GUI) {
term_cprintf(C_BLUE, "Synchronization status:\n");
if(!ss.valid) if(!ss.valid)
{ {
term_cprintf(C_RED, "Master mode or sync info not valid\n"); term_cprintf(C_RED, "Master mode or sync info not valid\n");
return; return;
} }
term_cprintf(C_GREY, "Servo state: "); term_cprintf(C_GREY, "Servo state: ");
term_cprintf(C_WHITE, "%s\n", ss.slave_servo_state); term_cprintf(C_WHITE, "%s\n", ss.slave_servo_state);
term_cprintf(C_GREY, "Phase tracking: "); term_cprintf(C_GREY, "Phase tracking: ");
if(ss.tracking_enabled) if(ss.tracking_enabled)
term_cprintf(C_GREEN, "ON\n"); term_cprintf(C_GREEN, "ON\n");
else else
term_cprintf(C_RED,"OFF\n"); term_cprintf(C_RED,"OFF\n");
term_cprintf(C_GREY, "Synchronization source: "); term_cprintf(C_GREY, "Synchronization source: ");
term_cprintf(C_WHITE, "%s\n", ss.sync_source); term_cprintf(C_WHITE, "%s\n", ss.sync_source);
term_cprintf(C_BLUE, "\nTiming parameters:\n\n"); term_cprintf(C_BLUE, "\nTiming parameters:\n\n");
term_cprintf(C_GREY, "Round-trip time (mu): "); term_cprintf(C_GREY, "Round-trip time (mu): ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.mu/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.mu/1000.0);
term_cprintf(C_GREY, "Master-slave delay: "); term_cprintf(C_GREY, "Master-slave delay: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.delay_ms/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.delay_ms/1000.0);
term_cprintf(C_GREY, "Link length: "); term_cprintf(C_GREY, "Link length: ");
term_cprintf(C_WHITE, "%.0f meters \n", term_cprintf(C_WHITE, "%.0f meters \n",
ss.delay_ms/1e12 * 300e6 / 1.55); ss.delay_ms/1e12 * 300e6 / 1.55);
term_cprintf(C_GREY, "Master PHY delays: "); term_cprintf(C_GREY, "Master PHY delays: ");
term_cprintf(C_WHITE, "TX: %.2f nsec, RX: %.2f nsec\n", term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ss.delta_tx_m/1000.0, ss.delta_rx_m/1000.0); ss.delta_tx_m/1000.0, ss.delta_rx_m/1000.0);
term_cprintf(C_GREY, "Slave PHY delays: "); term_cprintf(C_GREY, "Slave PHY delays: ");
term_cprintf(C_WHITE, "TX: %.2f nsec, RX: %.2f nsec\n", term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ss.delta_tx_s/1000.0, ss.delta_rx_s/1000.0); ss.delta_tx_s/1000.0, ss.delta_rx_s/1000.0);
term_cprintf(C_GREY, "Total link asymmetry: "); term_cprintf(C_GREY, "Total link asymmetry: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.total_asymmetry/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.total_asymmetry/1000.0);
if (0) { if (0) {
term_cprintf(C_GREY, "Fiber asymmetry: "); term_cprintf(C_GREY, "Fiber asymmetry: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.fiber_asymmetry/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.fiber_asymmetry/1000.0);
} }
term_cprintf(C_GREY, "Clock offset: "); term_cprintf(C_GREY, "Clock offset: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.cur_offset/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_offset/1000.0);
term_cprintf(C_GREY, "Phase setpoint: "); term_cprintf(C_GREY, "Phase setpoint: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.cur_setpoint/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_setpoint/1000.0);
term_cprintf(C_GREY, "Skew: "); term_cprintf(C_GREY, "Skew: ");
term_cprintf(C_WHITE, "%.2f nsec\n", ss.cur_skew/1000.0); term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_skew/1000.0);
term_cprintf(C_GREY, "Servo update counter: "); term_cprintf(C_GREY, "Servo update counter: ");
term_cprintf(C_WHITE, "%lld times\n", ss.update_count); term_cprintf(C_WHITE, "%lld times\n", ss.update_count);
}
else if(mode == SHOW_STATS) {
printf("SERVO ");
printf("sv:%d ", ss.valid ? 1:0);
printf("ss:'%s' ", ss.slave_servo_state);
printf("mu:%llu ", ss.mu);
printf("dms:%llu ", ss.delay_ms);
printf("dtxm:%llu drxm:%llu ", ss.delta_tx_m, ss.delta_rx_m);
printf("dtxs:%llu drxs:%llu ", ss.delta_tx_s, ss.delta_rx_s);
printf("asym:%lld ", ss.total_asymmetry);
printf("crtt:%llu ", ss.mu - ss.delta_tx_m - ss.delta_rx_m -
ss.delta_tx_s - ss.delta_rx_s);
printf("cko:%lld ", ss.cur_offset);
printf("setp:%lld ", ss.cur_setpoint);
printf("ucnt:%llu ", ss.update_count);
printf("\n");
}
} }
int track_onoff = 1; int track_onoff = 1;
...@@ -161,17 +206,40 @@ void show_screen() ...@@ -161,17 +206,40 @@ void show_screen()
term_clear(); term_clear();
term_pcprintf(1, 1, C_BLUE, "WR Switch Sync Monitor v 1.0 [q = quit]"); term_pcprintf(1, 1, C_BLUE, "WR Switch Sync Monitor v 1.0 [q = quit]");
show_ports(); show_ports(SHOW_GUI);
show_servo(); show_servo(SHOW_GUI);
fflush(stdout); fflush(stdout);
} }
int main(int argc, char **argv) void show_stats()
{ {
show_ports(SHOW_STATS);
show_servo(SHOW_STATS);
fflush(stdout);
}
int main(int argc, char *argv[])
{
int opt;
int stats = 0;
int usecolor = 1; int usecolor = 1;
if (argc > 1 && !strcmp(argv[1], "-b")) while((opt=getopt(argc, argv, "sb")) != -1)
usecolor = 0; {
switch(opt)
{
case 's':
stats = 1;
break;
case 'b':
usecolor = 0;
break;
default:
fprintf(stderr, "Unrecognized option.\n");
break;
}
}
init(usecolor); init(usecolor);
setvbuf(stdout, NULL, _IOFBF, 4096); setvbuf(stdout, NULL, _IOFBF, 4096);
...@@ -192,7 +260,8 @@ int main(int argc, char **argv) ...@@ -192,7 +260,8 @@ int main(int argc, char **argv)
track_onoff); track_onoff);
} }
} }
show_screen(); if(stats) show_stats();
else show_screen();
} }
term_restore(); term_restore();
setlinebuf(stdout); setlinebuf(stdout);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment