2016-11-08 120 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'; 
}