PUD: do not read position file if it did not change
authorFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 9 May 2012 06:34:55 +0000 (08:34 +0200)
committerFerry Huberts <ferry.huberts@pelagic.nl>
Wed, 9 May 2012 07:20:04 +0000 (09:20 +0200)
To prepare for reading it off a timer.

Signed-off-by: Ferry Huberts <ferry.huberts@pelagic.nl>
lib/pud/src/posFile.c

index a3af08e..c11f11a 100644 (file)
@@ -10,6 +10,7 @@
 #include <stdio.h>
 #include <string.h>
 #include <regex.h>
+#include <sys/stat.h>
 
 #define LINE_LENGTH 256
 
@@ -22,6 +23,13 @@ static regex_t regexComment;
 static regex_t regexNameValue;
 static bool started = false;
 
+typedef struct _CachedStat {
+       struct timespec st_mtim; /* Time of last modification.  */
+} CachedStat;
+
+static CachedStat cachedStat;
+
+
 bool startPositionFile(void) {
        if (started) {
                return true;
@@ -37,6 +45,9 @@ bool startPositionFile(void) {
                return false;
        }
 
+       cachedStat.st_mtim.tv_sec = -1;
+       cachedStat.st_mtim.tv_nsec = -1;
+
        started = true;
        return true;
 }
@@ -74,10 +85,21 @@ static char value[LINE_LENGTH];
 
 bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
        bool retval = false;
+       struct stat statBuf;
        nmeaINFO result;
        FILE * fd = NULL;
        unsigned int lineNumber = 0;
 
+       if (stat(fileName, &statBuf)) {
+               /* could not access the file */
+               goto out;
+       }
+
+       if (!memcmp(&cachedStat.st_mtim, &statBuf.st_mtim, sizeof(cachedStat.st_mtim))) {
+               /* file did not change since last read */
+               goto out;
+       }
+
        nmea_zero_INFO(&result);
        result.sig = POSFILE_DEFAULT_SIG;
        result.fix = POSFILE_DEFAULT_FIX;
@@ -210,6 +232,7 @@ bool readPositionFile(char * fileName, nmeaINFO * nmeaInfo) {
                result.smask = POSFILE_DEFAULT_SMASK;
        }
 
+       memcpy(&cachedStat.st_mtim, &statBuf.st_mtim, sizeof(cachedStat.st_mtim));
        memcpy(nmeaInfo, &result, sizeof(result));
        retval = true;