GNSS Logger

Top  Previous  Next

//-----------------------------------------------------------------------------

// GNSSLogger.vpl, created 2006-05-31 13:15

//

// The application takes the GNSS position every 15 seconds and saves it to both

// the datalogger, and to a file. The file media must be ejected with

// dipswitch 1 before it is removed from the RTCU, otherwise the file will be

// corrupted. The status of the media is shown on the LED on the RTCU.

// When the unit is no longer moving it goes into a power saving mode and waits

// for movement.

// This example demonstrates the Filesystem and powermanagement features.

//-----------------------------------------------------------------------------

INCLUDE rtcu.inc
 
VAR_INPUT
   dipEject   : BOOL R_EDGE;
END_VAR;
 
VAR_OUTPUT
   gw_conn    : BOOL;
   gnss_pos    : BOOL;
END_VAR;
 
VAR
   log         : logWrite;
   clock       : clockLinsecToTime;
   gnss        : gpsFix;
   gnss_linsec : DINT;
   gnss_pwr    : BOOL;
   cellular_pwr: BOOL;
   media_open  : BOOL;
   fd          : FILE;
   rc          : INT;
   str         : STRING;
   tSleep      : TON;
END_VAR;
 
PROGRAM GNSSLogger;
 
   // Use battery if power fails
   pmPowerFail(bat:=TRUE);
 
   // Set timer
   tSleep.pt := 300000; // 5 min. delay
 
   fsMediaOpen(media := 0);
   fsStatusLEDEnable(enable:=ON);
   
   // Initialize datalogger system
   IF NOT logIsInitialized(key:=4712) THEN
      logInitialize(key:=4712, numlogvalues:=2, numlogrecords:=0);
   END_IF;
 
BEGIN
   // LED
   gw_conn := gwConnected();
 
   // Wait for card insertion
   IF fsMediaPresent(media := 0) AND NOT media_open THEN
      media_open := TRUE;
   ELSIF NOT fsMediaPresent(media := 0) AND media_open THEN
      media_open := FALSE;
   END_IF;
 
   // Eject media
   IF dipEject THEN
      fsMediaEject(media := 0);
      media_open := FALSE;
   END_IF;
   
   // Open log file   
   IF media_open AND fsFileStatus(fd:=fd) <> 0 THEN
      IF fsFileExists(name:="\datalog.txt") THEN
         DebugMsg(message:="Open File");
         fd := fsFileOpen(name:="\datalog.txt");
      ELSE
         DebugMsg(message:="File Create");
         fd := fsFileCreate(name:="\datalog.txt");
      END_IF;
   END_IF;
   
   // Start GNSS and/or Cellular
   IF NOT gnss_pwr THEN
      DebugMsg(message:="Start GNSS");
      gpsPower(power:=ON);
      gnss_pwr := ON;
   END_IF;
   IF NOT cellular_pwr THEN
      DebugMsg(message:="Start Cellular");
      gsmPower(power:=ON);
      netOpen(iface:=_NET_IFACE_CELLULAR);
      cellular_pwr  := ON;
   END_IF;
 
   // Get GNSS position
   gnss();
   // GNSS position valid?
   IF gnss.mode > 1 THEN
      // Toggle led
      gnss_pos   := NOT gnss_pos;
      // log position
      IF clockNow() > gnss_linsec THEN
         // Save to datalog
         log(value[1]:=gnss.latitude,value[2]:=gnss.longitude);
         // Save to file
         IF fsFileStatus(fd:=fd) = 0 THEN
            clock(linsec:=gnss.linsec);
            str := strFormat(format:="\1.\2.\3, ",v1:=clock.year,v2:=clock.month,v3:=clock.day) +
                   strFormat(format:="\1:\2:\3, ",v1:=clock.hour,v2:=clock.minute,v3:=clock.second);
            IF gnss.latsouth THEN str := str + "-"; END_IF;
            str := str + strFormat(format:="\1*\2.\3, ",v1:=gnss.latdeg,v2:=gnss.latmin,v3:=gnss.latdecmin);
            IF gnss.lonwest THEN str := str + "-"; END_IF;
            str := str + strFormat(format:="\1*\2.\3, ",v1:=gnss.londeg,v2:=gnss.lonmin,v3:=gnss.londecmin);
            fsFileWriteStringNL(fd:=fd,str:=str);
         END_IF;
         // Set time for next logging
         gnss_linsec := clockNow() + 15;
      END_IF;
   END_IF;
 
   // Has there been any movement?
   IF pmVibration() THEN
      tSleep(trig:=FALSE);
   ELSE
      tSleep(trig:=TRUE);
   END_IF;
 
   // No movement detected in 5 minutes
   IF tSleep.THEN
      IF NOT batIsCharging() THEN
         // Debug to file
         IF fsFileStatus(fd:=fd) = 0 THEN
            fsFileWriteStringNL(fd:=fd,str:="--- Enter pmWaitEvent ---");
         END_IF;
         // Stop GNSS and/or Cellular
         IF gnss_pwr THEN
            DebugMsg(message:="Stop GNSS");
            gpsPower(power:=OFF);
            gnss_pwr := OFF;
         END_IF;
         IF cellular_pwr THEN
            DebugMsg(message:="Stop Cellular");
            netClose(iface:=_NET_IFACE_CELLULAR);
            gsmPower(power:=OFF);
            cellular_pwr := OFF;
         END_IF;
         // Wait for movement (vibration)
         rc := pmWaitEvent(vibration:=ON);
         DebugMsg(message:="pmWaitEvent - Movement");
         // Debug to file
         IF fsFileStatus(fd:=fd) = 0 THEN
            str := strFormat(format:="--- Exit pmWaitEvent (rc=\1) ---",v1:=rc);
            fsFileWriteStringNL(fd:=fd,str:=str);
         END_IF;
         // Wait for 5 minutes before Power down again
         tSleep(trig:=FALSE);
      END_IF;
   END_IF;
END;
 
END_PROGRAM;