|
//-----------------------------------------------------------------------------
// 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.q 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;
|