Commit 816db7dd authored by baujc's avatar baujc Committed by Adam Wujek

New time to string conversion library for tools

This library is used by wr_mon and wrs_dump_shmem to avoid duplication
of code.
parent 68f47b7a
......@@ -69,10 +69,10 @@ check:
$(CC) $*.o $(LDFLAGS) -o $*
VPATH+=../ppsi/tools
wrs_dump_shmem: wrs_dump_shmem.o wrs_dump_shmem_ppsi.o
wrs_dump_shmem: wrs_dump_shmem.o wrs_dump_shmem_ppsi.o time_lib.o
${CC} -o $@ $^ $(LDFLAGS)
wr_mon: wr_mon.o term.o
wr_mon: wr_mon.o term.o time_lib.o
${CC} -o $@ $^ $(LDFLAGS)
wr_management: wr_management.o term.o
......
/**
* Time to string conversion functions
*/
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <inttypes.h>
#include <ppsi/ppsi.h>
char * timeIntervalToString(TimeInterval time,char *buf) {
int64_t sign,nanos,picos;
if ( time<0 && time !=INT64_MIN) {
sign=-1;
time=-time;
} else {
sign=1;
}
nanos = time >> TIME_INTERVAL_FRACBITS;
picos = (((time & TIME_INTERVAL_FRACMASK) * 1000) + TIME_INTERVAL_ROUNDING_VALUE ) >> TIME_INTERVAL_FRACBITS;
sprintf(buf,"%" PRId64 ".%03" PRId64, sign*nanos,picos);
return buf;
}
char * timeToString(struct pp_time *time, char *buf) {
char sign = '+';
int64_t scaled_nsecs = time->scaled_nsecs;
int64_t secs = time->secs, nanos, picos;
if (!is_incorrect(time)) {
if (scaled_nsecs < 0 || secs < 0) {
sign = '-';
scaled_nsecs = -scaled_nsecs;
secs = -secs;
}
nanos = scaled_nsecs >> TIME_FRACBITS;
picos = ((scaled_nsecs & TIME_FRACMASK) * 1000 + TIME_ROUNDING_VALUE)
>> TIME_INTERVAL_FRACBITS;
sprintf(buf,"%c%" PRId64 ".%09" PRId64 "%03" PRId64,
sign,secs,nanos,picos);
} else {
sprintf(buf, "--Incorrect--");
}
return buf;
}
char * timestampToString(struct Timestamp *time,char *buf){
uint64_t sec=(time->secondsField.msb << sizeof(time->secondsField.msb)) + time->secondsField.lsb;
sprintf(buf,"%" PRIu64 ".%09" PRIu32 "000",
sec, (uint32_t)time->nanosecondsField);
return buf;
}
char * relativeDifferenceToString(RelativeDifference time, char *buf ) {
int32_t nsecs=time >> REL_DIFF_FRACBITS;
uint64_t sub_yocto=0;
int64_t fraction;
uint64_t bitWeight=500000000000000000;
uint64_t mask;
fraction=time & REL_DIFF_FRACMASK;
for (mask=(uint64_t) 1<< (REL_DIFF_FRACBITS-1);mask!=0; mask>>=1 ) {
if ( mask & fraction )
sub_yocto+=bitWeight;
bitWeight/=2;
}
sprintf(buf,"%"PRId32".%018"PRIu64, nsecs, sub_yocto);
return buf;
}
#include <ppsi/ppsi.h>
/* Prototypes */
char * timeIntervalToString(TimeInterval time,char *buf);
char * timeToString(struct pp_time *time,char *buf);
char * timestampToString(struct Timestamp *time,char *buf);
char * relativeDifferenceToString(RelativeDifference time, char *buf );
......@@ -17,6 +17,7 @@
#include <signal.h>
#include "term.h"
#include <time_lib.h>
#define PTP_EXPORT_STRUCTURES
#include "ptpd_exports.h"
......@@ -200,40 +201,6 @@ int64_t pp_time_to_picos(struct pp_time *ts)
+ ((ts->scaled_nsecs * 1000 + 0x8000) >> TIME_INTERVAL_FRACBITS);
}
static double pp_time_to_double (struct pp_time *ts) {
return (double) (ts->secs * PP_NSEC_PER_SEC
+ (ts->scaled_nsecs >> TIME_INTERVAL_FRACBITS));
}
static double interval_to_double (TimeInterval interval) {
double f ;
int neg = interval<0;
if(neg) interval= ~interval+1;
f= (double)interval/(double)(1LL<<TIME_INTERVAL_FRACBITS);
return neg ? -f : f;
}
#define REL_DIFF_FRACBITS 62
#define REL_DIFF_FRACMASK 0x3fffffffffffffff
/* We cannot use double for calculation as it is less precise than the RelativeDifference type */
void decode_relative_difference(RelativeDifference rd, int32_t *nsecs, uint64_t *sub_yocto) {
int64_t fraction;
uint64_t bitWeight=500000000000000000;
uint64_t mask;
*sub_yocto=0;
*nsecs = (int32_t)(rd >> REL_DIFF_FRACBITS);
fraction=(int64_t)rd & REL_DIFF_FRACMASK;
for (mask=(uint64_t) 1<< (REL_DIFF_FRACBITS-1);mask!=0; mask>>=1 ) {
if ( mask & fraction )
*sub_yocto+=bitWeight;
bitWeight/=2;
}
}
static double alpha_to_double(int32_t alpha) {
double f ;
int neg = alpha<0;
......@@ -753,8 +720,7 @@ void show_servo(struct inst_servo_t *servo, int alive)
{
struct wr_servo_state * wr_servo;
int32_t nsecs;
uint64_t sub_yocto;
char buf[128];
struct l1e_servo_state * l1e_servo;
int proto_extension=servo->ppi->protocol_extension;
struct proto_ext_info_t *pe_info= IS_PROTO_EXT_INFO_AVAILABLE(proto_extension) ? &proto_ext_info[proto_extension] : &proto_ext_info[0] ;
......@@ -800,10 +766,10 @@ void show_servo(struct inst_servo_t *servo, int alive)
term_cprintf(C_CYAN, "\n +- Timing parameters ---------------------------------------------------------\n");
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "meanDelay : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double(servo->meanDelay) );
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString(servo->meanDelay,buf) );
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "delayMS : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", pp_time_to_double(&servo->servo_snapshot.delayMS));
term_cprintf(C_WHITE, "%16s sec\n",timeToString(&servo->servo_snapshot.delayMS,buf));
//term_cprintf(C_BLUE, "Estimated link length: ");
/* (RTT - deltas) / 2 * c / ri
......@@ -817,21 +783,20 @@ void show_servo(struct inst_servo_t *servo, int alive)
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "delayAsymmetry : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double(servo->delayAsymmetry));
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString(servo->delayAsymmetry,buf));
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "scaledDelayCoef : ");
decode_relative_difference(servo->scaledDelayCoefficient, &nsecs, &sub_yocto);
term_cprintf(C_WHITE, "%"PRId32".%018"PRIu64" fpa(%" PRIu64 ")", nsecs, sub_yocto, (uint64_t)servo->scaledDelayCoefficient);
term_cprintf(C_WHITE, "%s", relativeDifferenceToString(servo->scaledDelayCoefficient,buf));
if ( wr_servo ) {
term_cprintf(C_BLUE, " Fixed Alpha : ");
term_cprintf(C_WHITE, "%.9f fpa(%d)", alpha_to_double(wr_servo->fiber_fix_alpha), wr_servo->fiber_fix_alpha);
}
term_cprintf(C_WHITE, "\n");
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "ingressLatency : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double(servo->ingressLatency));
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString(servo->ingressLatency,buf));
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "egressLatency : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double(servo->egressLatency));
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString(servo->egressLatency,buf));
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "semistaticLatency: ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double(servo->semistaticLatency));
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString(servo->semistaticLatency,buf));
/*if (0) {
term_cprintf(C_BLUE, "Fiber asymmetry: ");
......@@ -840,7 +805,7 @@ void show_servo(struct inst_servo_t *servo, int alive)
}*/
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "offsetFromMaster : ");
term_cprintf(C_WHITE, "%15.3f nsec\n", interval_to_double (servo->offsetFromMaster));
term_cprintf(C_WHITE, "%16s nsec\n", timeIntervalToString (servo->offsetFromMaster,buf));
if ( wr_servo ) {
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "Phase setpoint : ");
......@@ -852,13 +817,13 @@ void show_servo(struct inst_servo_t *servo, int alive)
if ( l1e_servo ) {
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "Phase setpoint : ");
term_cprintf(C_WHITE, "%15.3f nsec\n",l1e_servo->cur_setpoint_ps/1000.0);
term_cprintf(C_WHITE, "%16.3f nsec\n",l1e_servo->cur_setpoint_ps/1000.0);
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "Skew : ");
term_cprintf(C_WHITE, "%15.3f nsec\n",l1e_servo->skew_ps/1000.0);
term_cprintf(C_WHITE, "%16.3f nsec\n",l1e_servo->skew_ps/1000.0);
}
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "Update counter : ");
term_cprintf(C_WHITE, "%15u times\n", servo->servo_snapshot.update_count);
term_cprintf(C_CYAN," | ");term_cprintf(C_BLUE, "Update counter : ");
term_cprintf(C_WHITE, "%16u times\n", servo->servo_snapshot.update_count);
if (servo->servo_snapshot.update_count != pe_info->last_count) {
pe_info->lastt = time(NULL);
pe_info->last_count = servo->servo_snapshot.update_count;
......@@ -888,8 +853,8 @@ void show_servo(struct inst_servo_t *servo, int alive)
printf("sv:%d ", servo->servo_snapshot.flags & PP_SERVO_FLAG_VALID ? 1 : 0);
printf("ss:'%s' ", servo->servo_snapshot.servo_state_name);
/* printf("aux:");*/
printf("md:%llu ", interval_to_picos(servo->meanDelay));
printf("dms:%llu ", pp_time_to_picos(&servo->servo_snapshot.delayMS));
printf("md:%s ", timeIntervalToString(servo->meanDelay,buf));
printf("dms:%s ", timeToString(&servo->servo_snapshot.delayMS,buf));
if ( wr_servo ) {
int64_t crtt= wr_servo->delayMM_ps - wr_servo->delta_txm_ps -
wr_servo->delta_rxm_ps - wr_servo->delta_txs_ps -
......@@ -913,8 +878,8 @@ void show_servo(struct inst_servo_t *servo, int alive)
printf("lock:%i ", l1e_servo->tracking_enabled);
printf("setp:%d ", l1e_servo->cur_setpoint_ps);
}
printf("asym:%lld ", interval_to_picos(servo->delayAsymmetry));
printf("cko:%lld ", interval_to_picos(servo->offsetFromMaster));
printf("asym:%s ", timeIntervalToString(servo->delayAsymmetry,buf));
printf("cko:%s ", timeIntervalToString(servo->offsetFromMaster,buf));
/* printf("hd:");*/
/* printf("md:");*/
/* printf("ad:");*/
......
......@@ -17,6 +17,7 @@
#include <libwr/util.h>
#include <ppsi/ppsi.h>
#include <ppsi-wrs.h>
#include "time_lib.h"
/* be safe, in case some other header had them slightly differently */
#undef container_of
......@@ -100,6 +101,7 @@ void decode_relative_difference(RelativeDifference rd, int32_t *nsecs, uint64_t
void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
{
void *p = addr + info->offset;
char buf[128];
struct pp_time *t = p;
RelativeDifference *rd=p;
Timestamp *ts=p;
......@@ -107,7 +109,6 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
struct PortIdentity *pi = p;
struct ClockQuality *cq = p;
char format[16];
uint64_t sec, nano, pico, femto;
int i;
char pname[128];
......@@ -185,71 +186,20 @@ void dump_one_field(void *addr, struct dump_info *info, char *info_prefix)
printf("%i\n", *(short *)p);
break;
#define TIME_FRACBITS 16
#define TIME_FRACMASK 0xFFFF
#define TIME_SIGNMASK 0x8000000000000000
case dump_type_time:
{
char sign='+';
uint64_t scaled_nsecs=t->scaled_nsecs;
int64_t secs=t->secs;
if ( (scaled_nsecs & TIME_SIGNMASK) || secs<0) {
sign='-';
scaled_nsecs= ~scaled_nsecs+1;
secs=-secs;
}
nano = scaled_nsecs >> TIME_FRACBITS;
femto = scaled_nsecs & TIME_FRACMASK;
femto = (femto * 1000 * 1000 ) >> TIME_FRACBITS;
pico= (femto/1000);
if ((femto % 1000)>500) {
pico++; // rounding
}
printf("correct=%i, value=%10c%lli.%09"PRIu64".%03"PRIu64"\n",
!is_incorrect(t),sign, t->secs, nano,pico);
}
printf("%s\n",timeToString(t,buf));
break;
case dump_type_Timestamp:
sec=(ts->secondsField.msb << sizeof(ts->secondsField.msb)) + ts->secondsField.lsb;
printf("%10"PRIu64".%09"PRIu32".000\n",
sec, (uint32_t)ts->nanosecondsField);
printf("%s\n",timestampToString(ts,buf));
break;
#define TIME_INTERVAL_FRACBITS 16
#define TIME_INTERVAL_FRACMASK 0xFFFF
#define TIME_INTERVAL_SIGNMASK 0x8000000000000000
case dump_type_TimeInterval:
{
char sign='+';
uint64_t scaled_nsecs=*ti;
if ( scaled_nsecs & TIME_INTERVAL_SIGNMASK) {
sign='-';
scaled_nsecs= ~scaled_nsecs+1;
}
nano = scaled_nsecs >> TIME_INTERVAL_FRACBITS;
femto = scaled_nsecs & TIME_INTERVAL_FRACMASK;
femto = (femto * 1000 * 1000 ) >> TIME_INTERVAL_FRACBITS;
pico= (femto/1000);
if ((femto % 1000)>500) {
pico++; // rounding
}
printf("%10c%"PRId64".%03"PRIu64"\n", sign,nano,pico);
}
printf("%s\n",timeIntervalToString(*ti,buf));
break;
case dump_type_RelativeDifference:
{
int32_t nsecs;
uint64_t sub_yocto;
decode_relative_difference(*rd, &nsecs, &sub_yocto);
printf("%"PRId32".%018"PRIu64"\n", nsecs, sub_yocto);
}
printf("%s\n",relativeDifferenceToString(*rd,buf));
break;
case dump_type_ip_address:
for (i = 0; i < 4; i++)
......
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