Home Contact us


MX2 GPSLog

//-----------------------------------------------------------------------------
// MX2GPSLog.vpl, created 2006-05-31 13:15
//
// The application takes the GPS 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 File system and power management features of the
// MX2 unit, and can only be used with a MX2 unit
//-----------------------------------------------------------------------------
INCLUDE rtcu.inc
INCLUDE
 x32.inc

VAR_INPUT
   dipEject   : BOOL R_EDGE;
END_VAR;

VAR_OUTPUT
   gw_conn : BOOL;
   gps_pos :
 BOOL;
END_VAR
;


VAR
   log        :
 logWrite;
   clock      :
 clockLinsecToTime;
   gps        :
 gpsFix;
   gps_linsec :
 DINT;
   gps_pwr    :
 BOOL;
   gsm_pwr    :
 BOOL;
   
media_open : BOOL;
   fd         : FILE;
   rc         :
 INT;
   str        :
 STRING;
   tSleep     :
 TON;
END_VAR
;

PROGRAM
 MX2GPSLog;

// Use battery if power fails
pmPowerFail(bat:=TRUE);

// Set timer
tSleep.pt := 300000; // 5 min. delay

// Open media
fsMediaOpen();
fsStatusLEDEnable(enable:=ON);
   
// Initialize datalogger system
IF NOT logIsInitialized(key:=4712) THEN
    
logInitialize(key:=4712numlogvalues:=2numlogrecords:=0);
END_IF;


BEGIN

   // LED
   gw_conn := gwConnected();

   // Open log file
   IF fsMediaPresent() AND NOT media_open THEN
      media_open := TRUE;
   ELSE
      media_open := FALSE;
   END_IF;

   // Eject media
   IF dipEject THEN
      fsMediaEject
();
      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 GPS and/or GSM
   IF
 NOT gps_pwr THEN
      DebugMsg
(message:="Start GPS");
      gpsPower
(power:=ON);
      gps_pwr :=
 ON;
   END_IF
;
   IF
 NOT gsm_pwr THEN
      DebugMsg
(message:="Start GSM");
      gsmPower(power:=ON);
      gprsOpen
();
      gsm_pwr  :=
 ON;
   END_IF
;

   // Get GPS position

   gps();

   // GPS position valid?

   IF
 gps.mode > 1 THEN
      // Toggle led
      gps_pos   := NOT gps_pos;
      // log position

      IF
 clockNow() > gps_linsec THEN
         // Save to datalog

         log(
value[1]:=gps.latitude,value[2]:=gps.longitude);
         // Save to file
         IF fsFileStatus(fd:=fd) = 0 THEN
            clock(
linsec:=gps.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
 gps.latsouth THEN str := str + "-"; END_IF;
            str :=
 str + strFormat(format:="\1*\2.\3, ",v1:=gps.latdeg,v2:=gps.latmin,v3:=gps.latdecmin);
            IF
 gps.lonwest THEN str := str + "-"; END_IF;
            str :=
 str + strFormat(format:="\1*\2.\3, ",v1:=gps.londeg,v2:=gps.lonmin,v3:=gps.londecmin);
            fsFileWriteStringNL
(fd:=fd,str:=str);
         END_IF
;
         // Set time for next logging
         gps_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.q THEN
      IF
 NOT batIsCharging() THEN
         // Debug to file

         IF
 fsFileStatus(fd:=fd) = 0 THEN
            fsFileWriteStringNL
(fd:=fd,str:="--- Enter pmWaitEvent ---");
         END_IF;
         // Stop GPS and/or GSM
         IF gps_pwr THEN
            DebugMsg
(message:="Stop GPS");
            gpsPower
(power:=OFF);
            gps_pwr :=
 OFF;
         END_IF
;
         IF
 gsm_pwr THEN
            DebugMsg
(message:="Stop GSM");
            gprsClose();
            gsmPower
(power:=OFF);
            gsm_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
;