This program illustrates the use of the FirstTime() function and the use of persistent variables. Note that after fussing with the FirstTime() function for the BX24 for over an hour, I contacted Net Media and they indicated there was a problem with the command in Version 1.43. Frank Manning (Net Media) provided a work around which is included in this routine.
Note that this work around consists of testing location 30. If, non zero, it is the first time and the location is set to zero. If zero, it is not the first time after download.
' FirstTime.Bas
'
' If program is run the first time after download, two counters (long)
' are set to zero. On each boot thereafter the BootCounter is
' incremented.
'
' Each time a pushbutton (PB0) on Pin12 is set to zero, ButtonCounter is
' incremented.
'
' Note that both counters are implemented as persistent variables
' and are thus, not affected by loss of power.
'
' This type of program might be used to determine the number of times
' a unit is reset and the number of times an action is performed.
'
' Note that persistent variables may only be used in one module and must
' first be used in the same order as they are declared.
'
' Illustrates the use of FirstTime, Persistent variables and Do -
' Loop Until.
'
' Build project with serial routines.
'
' copyright, Peter H. Anderson, Baltimore, MD, Nov, '99
Const PB0 as Byte = 12 ' push button on terminal 12
Dim BootCounter as New PersistentLong
Dim ButtonCounter as New PersistentLong
Sub Main()
Dim str as String
If (FirstTime()) then
BootCounter = 0
ButtonCounter = 0
Else
BootCounter = BootCounter + 1
End If
Call OpenSerialPort(1, 19200)
str = "BootCounter=" ' display the boot counter
Call PutStr(str)
Call PutL(BootCounter)
Call NewLine()
Do
If (Button_Depressed(PB0)= 1) Then
ButtonCounter = ButtonCounter + 1
str = "ButtonCounter="
Call PutStr(str)
Call PutL(ButtonCounter)
Call NewLine()
End If
Loop
End Sub
Function Button_Depressed(ByVal Pin as Byte) as Byte
Dim RetVal as Byte
Dim Y as Byte
Call PutPin(Pin, 3)
If (GetPin(Pin) = 1) then
RetVal = 0
Else
RetVal = 1 ' true
End if
Do
Call PutPin(Pin, 3) ' now, wait for it to go back to a one
Y = GetPin(Pin)
Loop Until (Y=1)
Call Sleep(0.1)
Button_Depressed = RetVal
End Function
'-------------------------------------------------------
Public Function FirstTime() As Boolean
'
' Provided by Frank Manning at NetMedia
' This function applies to BX-24 systems ONLY, compiler
' version 1.43 or earlier. This function should NOT be
' use on BX-01 systems.
'
' The returned value signifies whether this program is
' running for the first time since it was downloaded.
'
' The first call returns true. All subsequent calls
' return false, even if the system reboots in the
' meantime.
Const FtAddress As Integer = 30
If (PersistentPeek(FtAddress) = 0) Then
FirstTime = False
Else ' location 30 is non zero
Call Sleep(100)
Call PersistentPoke(0, FtAddress) ' make it zero
FirstTime = True
End If
End Function
'-------------------------------------------------------