this demo shows a type, to handle sensor data & status ...
It shows a supposed Water-Heater operating on data which is:
- 1) user supplied (a const in the demo), setting target temperature etc.
2) a generated random value (here, supposed sensor reading)
3) generated delay times (for further heating periods)
- a regulator, to control *overshooting*, which is common, to such scenarios
- a ASCII to ANSI error, currently in the code (on WIN, unimportant detail here)
demo code:
Code: Select all
' sensor_type-test1.bas -- 2018-06-21, MrSwiss
'
' compile: -s console
'
' type definition start
Type sensor ' a type recording sensor data & status vs. a pre-set target value
Private: ' NO directt user access
As Single targ, curr, diff ' internal variables
As Boolean done = FALSE ' status variable
As UByte res(1 To 3) ' manual padding (unused currently, kept reserve)
Public: ' user interface (aka: abstaction)
Declare Constructor(ByVal As Single, ByVal As Single=22.0) ' ctor
Declare Function scurr(ByVal As Single) ByRef As Const Boolean ' setter (new curr), return: status
Declare Function gcurr() ByRef As Const Single ' getter (curr value)
Declare Function gdiff() ByRef As Const Single ' getter (diff value)
Declare Function gdone() ByRef As Const Boolean ' getter (status: done FALSE/TRUE)
End Type
Constructor sensor(ByVal nt As Single, ByVal nc As Single=22.0)
This.targ = nt ' initialize type's variables
This.curr = nc
This.diff = nt - nc
End Constructor
Function sensor.scurr(ByVal nc As Single) ByRef As Const Boolean
This.curr = nc ' set new current value
If nc = This.targ Then ' are we done yet?
This.diff = 0.0 ' yes, set vars. accordingly
This.done = TRUE
Else ' not done, just update 'diff'
This.diff = THis.targ - This.curr
End If
Return This.done ' return status of 'done'
End Function
Function sensor.gcurr() ByRef As Const Single
Return This.curr ' return current value
End Function
Function sensor.gdiff() ByRef As Const Single
Return This.diff ' return current difference
End Function
Function sensor.gdone() ByRef As Const Boolean
Return This.done ' return current status
End Function
' type definition end
' generate a random single from: within a given range
#Define SRange(l, h) ( CSng(Rnd * ((h) - (l)) + (l)) )
'prepare randomizing stuff ...
Randomize( , 5)
For i As UInteger = 1 To 50
Rnd() : Rnd() : Rnd() : Rnd() : Rnd() : Rnd()
Next
' ===== MAIN =====
Width 80, 25 ' standard console
Const As Single targtemp = 80.0 ' instead of user input (pre-set target)
Dim As Double ts, te ' timer variables
Var pt = New sensor(targtemp, 25.0) ' default ctor call (override default on second parameter)
Do
If pt->gdone Then Exit do ' target temp. reached? yes --> quit
If pt->gdiff > 0.0 Then ' get new difference
ts = Timer ' init/reinit timer start
Select Case pt->gdiff ' set new time to heat up (heating element)
Case Is < 10 ' close to target: do fine adjustment
Select Case As Const CULng(pt->gdiff) ' using a conversion to a imt type
Case 0 : te = ts + 0.25 ' allmost there, add minimal time to go
Case 1 : te = ts + 1
Case 2 : te = ts + 2 ' quite close
Case 3 : te = ts + 3
Case 4 : te = ts + 4
Case 5 : te = ts + 5 ' some distance to go
Case 6 : te = ts + 6
Case 7 : te = ts + 7 ' quite a distance to go
Case 8 : te = ts + 8
Case 9 : te = ts + 9 ' still quite far away
End Select
Case Is < 20 : te = ts + 10 ' different initial heating periods, _
Case Is < 30 : te = ts + 15 ' depending on temp. difference
Case Is < 40 : te = ts + 20
Case Else : te = ts + 30 ' aka: >= 40
End Select
Print "please wait for: "; Str(CSng(te - ts)); ' keep user informed
Print " Seconds -- current temp. "; Str(pt->gcurr())
While Timer < te : Sleep(10, 1) : Wend ' heating duration wait-loop
End If
If CsrLin = 25 Then Cls ' clear screen if bottom line reached
pt->scurr(SRange(pt->gcurr, targtemp)) ' setter of curr (new sensor value)
Loop
Print
Print "Target temp. "; Str(targtemp); " °C reached! press a key to exit ... ";
Sleep
' clean up: release allocated memory
Delete pt ' indirect defaut dtor call
' ===== END-MAIN ===== ' ----- EOF -----
please wait for: 30 Seconds -- current temp. 25
please wait for: 30 Seconds -- current temp. 35.75963
please wait for: 15 Seconds -- current temp. 55.08641
please wait for: 10 Seconds -- current temp. 65.05462
please wait for: 4 Seconds -- current temp. 75.5601
please wait for: 3 Seconds -- current temp. 77.13853
please wait for: 1 Seconds -- current temp. 79.06241
please wait for: 1 Seconds -- current temp. 79.23209
please wait for: 0.25 Seconds -- current temp. 79.55796
please wait for: 0.25 Seconds -- current temp. 79.87233
please wait for: 0.25 Seconds -- current temp. 79.96168
please wait for: 0.25 Seconds -- current temp. 79.97746
please wait for: 0.25 Seconds -- current temp. 79.98941
please wait for: 0.25 Seconds -- current temp. 79.99931
please wait for: 0.25 Seconds -- current temp. 79.99969
please wait for: 0.25 Seconds -- current temp. 79.99989
please wait for: 0.25 Seconds -- current temp. 79.99992
please wait for: 0.25 Seconds -- current temp. 79.99999
please wait for: 0.25 Seconds -- current temp. 79.99999
please wait for: 0.25 Seconds -- current temp. 79.99999
please wait for: 0.25 Seconds -- current temp. 79.99999
please wait for: 0.25 Seconds -- current temp. 79.99999
Target temp. 80 ¦C reached! press a key to exit ...
please wait for: 30 Seconds -- current temp. 25
please wait for: 30 Seconds -- current temp. 35.53243
please wait for: 10 Seconds -- current temp. 69.83836
please wait for: 3 Seconds -- current temp. 77.45357
please wait for: 0.25 Seconds -- current temp. 79.66068
please wait for: 0.25 Seconds -- current temp. 79.85067
please wait for: 0.25 Seconds -- current temp. 79.98853
please wait for: 0.25 Seconds -- current temp. 79.99329
please wait for: 0.25 Seconds -- current temp. 79.99638
please wait for: 0.25 Seconds -- current temp. 79.99653
please wait for: 0.25 Seconds -- current temp. 79.99696
please wait for: 0.25 Seconds -- current temp. 79.9983
please wait for: 0.25 Seconds -- current temp. 79.99844
please wait for: 0.25 Seconds -- current temp. 79.99899
please wait for: 0.25 Seconds -- current temp. 79.99975
please wait for: 0.25 Seconds -- current temp. 79.99975
please wait for: 0.25 Seconds -- current temp. 79.99994
Target temp. 80 ¦C reached! press a key to exit ...