Commit b8ce53db authored by Adam Wujek's avatar Adam Wujek 💬

userspace/tools: use add using ppsi's shmem to wr_mon

Double values printed by ipc with shmem to verify readings. IPC to be removed
soon.
No need do update snmp's part of wr_mon since it will be removed (snmp will
use shmem directly).
Include implementation of shmem locks for read.

It was seen that phase setpoint read via shmem sometimes differs from value
read via ipc. However it shmem's value is more recent. Assignment of ipc's
cur_setpoint in ppsi's servo is done before setting to new value.
Signed-off-by: Adam Wujek's avatarAdam Wujek <adam.wujek@cern.ch>
parent 73e010f1
......@@ -26,6 +26,11 @@ static struct hal_port_state *hal_ports;
/* local copy of port state */
static struct hal_port_state hal_ports_local_copy[HAL_MAX_PORTS];
static int hal_nports_local;
static struct wrs_shm_head *ppsi_head;
static struct pp_globals *ppg;
struct wr_servo_state_t *ppsi_servo;
struct wr_servo_state_t ppsi_servo_local; /* local copy of servo status */
int read_ports(void){
unsigned ii;
......@@ -47,6 +52,26 @@ int read_ports(void){
return 0;
}
int read_servo(void){
unsigned ii;
unsigned retries = 0;
/* read data, with the sequential lock to have all data consistent */
while (1) {
ii = wrs_shm_seqbegin(ppsi_head);
memcpy(&ppsi_servo_local, ppsi_servo, sizeof(*ppsi_servo));
retries++;
if (retries > 100)
return -1;
if (!wrs_shm_seqretry(ppsi_head, ii))
break; /* consistent read */
usleep(1000);
}
return 0;
}
void init_shm(void)
{
struct hal_shmem_header *h;
......@@ -58,7 +83,7 @@ void init_shm(void)
}
/* check hal's shm version */
if (hal_head->version != HAL_SHMEM_VERSION) {
fprintf(stderr, "wr_mon: unknown hal's shm version %i "
fprintf(stderr, "wr_mon: unknown HAL's shm version %i "
"(known is %i)\n",
hal_head->version, HAL_SHMEM_VERSION);
exit(-1);
......@@ -76,6 +101,27 @@ void init_shm(void)
exit(-1);
}
ppsi_head = wrs_shm_get(wrs_shm_ptp, "", WRS_SHM_READ);
if (!ppsi_head) {
fprintf(stderr, "unable to open shm for PPSI!\n");
exit(-1);
}
/* check hal's shm version */
if (ppsi_head->version != WRS_PPSI_SHMEM_VERSION) {
fprintf(stderr, "wr_mon: unknown PPSI's shm version %i "
"(known is %i)\n",
ppsi_head->version, WRS_PPSI_SHMEM_VERSION);
exit(-1);
}
ppg = (void *)ppsi_head + ppsi_head->data_off;
ppsi_servo = wrs_shm_follow(ppsi_head, ppg->global_ext_data);
if (!ppsi_servo) {
fprintf(stderr, "Cannot follow ppsi_servo in shmem.\n");
exit(-1);
}
ptp_ch = minipc_client_create("ptpd", 0);
if (!ptp_ch)
{
......@@ -201,8 +247,17 @@ void show_servo(void)
{
ptpdexp_sync_state_t ss;
int64_t total_asymmetry;
int64_t crtt;
minipc_call(ptp_ch, 2000, &__rpcdef_get_sync_state, &ss);
total_asymmetry = ppsi_servo_local.picos_mu -
2LL * ppsi_servo_local.delta_ms;
crtt = ppsi_servo_local.picos_mu - ppsi_servo_local.delta_tx_m -
ppsi_servo_local.delta_rx_m - ppsi_servo_local.delta_tx_s -
ppsi_servo_local.delta_rx_s;
if(mode == SHOW_GUI) {
term_cprintf(C_BLUE, "Synchronization status:\n");
......@@ -214,12 +269,20 @@ void show_servo(void)
term_cprintf(C_GREY, "Servo state: ");
term_cprintf(C_WHITE, "%s\n", ss.slave_servo_state);
term_cprintf(C_GREY, "Servo state: ");
term_cprintf(C_WHITE, "%s\n",
ppsi_servo_local.servo_state_name);
term_cprintf(C_GREY, "Phase tracking: ");
if(ss.tracking_enabled)
term_cprintf(C_GREEN, "ON\n");
else
term_cprintf(C_RED,"OFF\n");
term_cprintf(C_GREY, "Phase tracking: ");
if (ppsi_servo_local.tracking_enabled)
term_cprintf(C_GREEN, "ON\n");
else
term_cprintf(C_RED, "OFF\n");
term_cprintf(C_GREY, "Synchronization source: ");
term_cprintf(C_WHITE, "%s\n", ss.sync_source);
......@@ -228,24 +291,43 @@ void show_servo(void)
term_cprintf(C_GREY, "Round-trip time (mu): ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.mu/1000.0);
term_cprintf(C_GREY, "Round-trip time (mu): ");
term_cprintf(C_WHITE, "%.3f nsec\n",
ppsi_servo_local.picos_mu/1000.0);
term_cprintf(C_GREY, "Master-slave delay: ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.delay_ms/1000.0);
term_cprintf(C_GREY, "Master-slave delay: ");
term_cprintf(C_WHITE, "%.3f nsec\n",
ppsi_servo_local.delta_ms/1000.0);
term_cprintf(C_GREY, "Link length: ");
term_cprintf(C_WHITE, "%.0f meters \n",
ss.delay_ms/1e12 * 300e6 / 1.55);
term_cprintf(C_GREY, "Link length: ");
term_cprintf(C_WHITE, "%.0f meters\n",
ppsi_servo_local.delta_ms/1e12 * 300e6 / 1.55);
term_cprintf(C_GREY, "Master PHY delays: ");
term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ss.delta_tx_m/1000.0, ss.delta_rx_m/1000.0);
term_cprintf(C_GREY, "Master PHY delays: ");
term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ppsi_servo_local.delta_tx_m/1000.0,
ppsi_servo_local.delta_rx_m/1000.0);
term_cprintf(C_GREY, "Slave PHY delays: ");
term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ss.delta_tx_s/1000.0, ss.delta_rx_s/1000.0);
term_cprintf(C_GREY, "Slave PHY delays: ");
term_cprintf(C_WHITE, "TX: %.3f nsec, RX: %.3f nsec\n",
ppsi_servo_local.delta_tx_s/1000.0,
ppsi_servo_local.delta_rx_s/1000.0);
term_cprintf(C_GREY, "Total link asymmetry: ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.total_asymmetry/1000.0);
term_cprintf(C_GREY, "Total link asymmetry: ");
term_cprintf(C_WHITE, "%.3f nsec\n", total_asymmetry/1000.0);
if (0) {
term_cprintf(C_GREY, "Fiber asymmetry: ");
......@@ -254,18 +336,30 @@ void show_servo(void)
term_cprintf(C_GREY, "Clock offset: ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_offset/1000.0);
term_cprintf(C_GREY, "Clock offset: ");
term_cprintf(C_WHITE, "%.3f nsec\n",
ppsi_servo_local.offset/1000.0);
term_cprintf(C_GREY, "Phase setpoint: ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_setpoint/1000.0);
term_cprintf(C_GREY, "Phase setpoint: ");
term_cprintf(C_WHITE, "%.3f nsec\n",
ppsi_servo_local.cur_setpoint/1000.0);
term_cprintf(C_GREY, "Skew: ");
term_cprintf(C_WHITE, "%.3f nsec\n", ss.cur_skew/1000.0);
term_cprintf(C_GREY, "Skew: ");
term_cprintf(C_WHITE, "%.3f nsec\n",
ppsi_servo_local.skew/1000.0);
term_cprintf(C_GREY, "Servo update counter: ");
term_cprintf(C_WHITE, "%lld times\n", ss.update_count);
term_cprintf(C_GREY, "Servo update counter: ");
term_cprintf(C_WHITE, "%u times\n",
ppsi_servo_local.update_count);
}
else if(mode == SHOW_STATS) {
printf("SERVO ");
printf("SERVO ");
printf("sv:%d ", ss.valid ? 1:0);
printf("ss:'%s' ", ss.slave_servo_state);
printf("mu:%llu ", ss.mu);
......@@ -279,6 +373,22 @@ void show_servo(void)
printf("setp:%lld ", ss.cur_setpoint);
printf("ucnt:%llu ", ss.update_count);
printf("\n");
printf("SERVO shm");
printf("sv:%d ", ppsi_servo_local.valid ? 1 : 0);
printf("ss:'%s' ", ppsi_servo_local.servo_state_name);
printf("mu:%llu ", ppsi_servo_local.picos_mu);
printf("dms:%llu ", ppsi_servo_local.delta_ms);
printf("dtxm:%d drxm:%d ", ppsi_servo_local.delta_tx_m,
ppsi_servo_local.delta_rx_m);
printf("dtxs:%d drxs:%d ", ppsi_servo_local.delta_tx_s,
ppsi_servo_local.delta_rx_s);
printf("asym:%lld ", total_asymmetry);
printf("crtt:%llu ", crtt);
printf("cko:%lld ", ppsi_servo_local.offset);
printf("setp:%d ", ppsi_servo_local.cur_setpoint);
printf("ucnt:%u ", ppsi_servo_local.update_count);
printf("\n");
} else if (mode == SHOW_SNMP_GLOBALS) {
if(!ss.valid)
return;
......@@ -329,10 +439,12 @@ int main(int argc, char *argv[])
case 'g':
mode = SHOW_SNMP_GLOBALS;
read_ports();
read_servo();
show_all();
exit(0);
case 'w': /* for the web interface */
read_ports();
read_servo();
show_unadorned_ports();
exit(0);
default:
......@@ -361,6 +473,7 @@ int main(int argc, char *argv[])
}
}
read_ports();
read_servo();
show_all();
/* If we got broken pipe or anything, exit */
if (ferror(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