2016-11-08 85 views
1

设置系统时间的GPS timestamp_t结构与GPS在Linux的设置系统时间与在Linux中

timestamp_t结构

大家好,

我想,一旦我得到一个succesfull GPS锁定(写代码Adafruit Ultimate GPS w/GPSD)我设置了系统时间。现在,我可以看到'timestamp_t':

typedef double timestamp_t; /* Unix time in seconds with fractional part */ 

是我的“gps_data_t *”结构的一部分。这是一个良好的开端,但是,功能我计划使用任何设置Linux系统时间为:

int settimeofday(const struct timeval *tv, const struct timezone *tz); 

我已经找到了如何转换的time_t为* timeval中的信息,但是我应该怎么处理这双重将其转换为* timeval?

代码:

gpsmm gps_rec("localhost", DEFAULT_GPSD_PORT); 

if (gps_rec.stream(WATCH_ENABLE|WATCH_JSON) == NULL) { 
    std::cout << "No GPSD running. exiting GPS thread." << std::endl; 
    return; 
} 

//Data structure 
struct gps_data_t* newdata; 

//Loop until first GPS lock to set system time 
while ((newdata = gps_rec.read()) == NULL) { 
    //Wait for a valid read 
} 

//Set system time - timestamp_t vs timeval? 
timeval *tv{?? newdata->time ??}; 
timezone *tz{ timezone(300, DST_USA)}; 
settimeofday(tv, tz); 

一些评论和链接帮助我。混淆是区分timeval,time_t和timestamp_t。据我了解这里的差别,请大家指正,如果情况并非如此:

全部是1970年1月1日以后秒的时间,但是......

的timeval是(2)长值的结构, tv_sec是1970年1月1日之后的秒,tv_usec在那之后是微秒。

time_t是一个长?这也是1970年1月1日以后的秒数

timestamp_t是在1970年1月1日之后的两倍,所以小数部分可以计算微秒以获得大致相同的timeval精度。

所以所有的人之间的转换可以去这样:

timeval time; 
time_t timet; 
timestamp_t timestampt; 

timet = time.tv_sec; //usec dropped 
timet = timestampt; //usec dropped 
timestampt = timet; //usec not given 
timestampt = time.tv_sec; 
timestampt += (time.tv_usec/1000000) //Denominator may be off by a few 0's 

是这幅画更清晰的画面?


要走向相反的方向,这是什么是需要我的应用程序:

//Convert gps_data_t* member 'time' to timeval 
timeval tv; 
double wholeseconds, decimalseconds; 
decimalseconds = modf(newdata->time, &wholeseconds); 
tv.sec = static_cast<int32_t>(wholeseconds); 
tv.usec = static_cast<int32_t>(decimalseconds * 1000000.0); 

//Create timezone 
timezone tz{ timezone(300, DST_USA)}; 

//Set system time 
settimeofday(&tv, &tz); 
+1

首先,仅仅因为一个函数需要一个指针到结构并不意味着你必须声明变量是一个指针。你必须已经阅读过有关运算符“&”的地址。 –

+1

至于你的问题,你甚至试过[阅读'settimeofday'手册页](http://man7.org/linux/man-pages/man2/settimeofday.2.html)?它告诉你什么结构看起来像。 –

+0

是的,我不认为混淆的是settimeofday函数需要什么,它在timeval的结构上很清楚。它来自gps数据的timestamp_t结构,我不太明白。但是,我只是发现[这](http://stackoverflow.com/questions/26709107/how-to-convert-a-timestamp-t-to-a-real-time)链接这是非常有益的,我会尝试。我猜timestamp_t和time_t很相似,但是它有一个小数部分相当于秒的小数部分,这在这个应用中并不重要。这可能是缺失的一块。 – DrTarr

回答

0

这就是:

//Get first data to set system time 
struct gps_data_t* firstdata; 

//Loop until first GPS lock to set system time 
while (((firstdata = gps_rec.read()) == NULL) || 
     (firstdata->fix.mode < 1)) { 
    //Do nothing 
} 

//Convert gps_data_t* member 'time' to timeval 
timeval tv; 
double wholeseconds, decimalseconds, offsettime; 
offsettime = firstdata->fix.time - (5.0 * 3600.0); //5hr offset from GMT 
decimalseconds = modf(offsettime, &wholeseconds); 
tv.tv_sec = static_cast<int32_t>(wholeseconds); 
tv.tv_usec = static_cast<int32_t>(decimalseconds * 1000000.0); 

//Set system time 
if (settimeofday(&tv, NULL) >= 0) { 
    std::cout << "Time set succesful!" << '\n'; 
} else { 
    std::cout << "Time set failure!" << '\n'; 
}