#Region Service Attributes
#StartAtBoot: False
#ExcludeFromLibrary: True
#End Region
' Data Objects:
' 0 = AirTemperature
' 1 = AirHumidity
' 2 = AirHeatIndex
' 3 = PoolTemperature
' 4 = HeatPumpRun (boolean)
Sub Process_Globals
Private sock As Socket
Private astream As AsyncStreams
Public connected As Boolean
'Private watchdog As Timer
'Private lastValueTime As Long
Private ser As B4RSerializator
Public BoardIP As String 'IP address of ESP board
Public BoardIPAPMode As String = "192.168.4.1" 'Default IP for ESP-12E
Public Mode As Int '1 = GETCONFIG, 2 = SETCONFIG, 3 = GETDATA, 4 = SETHEATON, 5 - SETHEATOFF
Type BoardData (AirTemp As String, AirHumidity As String, AirHeatIndex As String, PoolTemp As String, HeatPumpRun As Boolean, DandT As String)
Type BoardConfig (BoardName As String, SSID As String, Password As String)
Public rec As BoardConfig
Private dat As BoardData
End Sub
Sub Service_Create
'watchdog.Initialize("watchdog", 1000)
ser.Initialize
rec.Initialize
End Sub
Sub Service_Start (StartingIntent As Intent)
End Sub
Public Sub Connect (Get As Boolean)
If sock.IsInitialized = False Then sock.Initialize("sock")
' New
' If astream.IsInitialized Then
' astream.Close
' End If
' sock.Initialize("sock")
'------------------
Try
If sock.Connected = False Then
sock.Connect(BoardIP, 51041, 10000)
Wait For sock_Connected (Successful As Boolean)
If Successful = False Then
CallSub(Main, "HideProg") 'Hide the progress object
CallSub2(Main, "ShowMessage", "Failed to connect")
Log("Failed to connect!")
Return
Else
Log("Connected to board")
End If
astream.InitializePrefix(sock.InputStream, False, sock.OutputStream, "astream")
End If
Catch
Log(LastException)
If astream.IsInitialized Then astream.Close
sock.close
CallSub(Main, "HideProg") 'Hide the progress object
Return
End Try
If Get Then
Select Case Mode
Case 1 'GETCONFIG
Log ("Requesting Config...")
Dim HeaderObj As Object = Array ("GETCONFIG")
astream.Write(ser.ConvertArrayToBytes(HeaderObj))
Wait For astream_NewData (Buffer() As Byte)
If Buffer(0) = 0 Then
rec.BoardName = "PoolMinder"
Else
' We received a 1 as the first byte sent, which means it has been configured
Log ("Board appears to have been configured")
Wait For (astream) AStream_NewData(Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
Log (ObjectsReceived(0))
Select Case ObjectsReceived(0)
Case "GETCONFIG"
Log ("Config Header received")
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
For Each o As Object In ObjectsReceived
Log("Incoming Object: " & o)
Next
rec = ObjectsToRecord(ser.ConvertBytesToArray(Data))
Case Else
Log ("Data was received but without a header!")
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
For Each o As Object In ObjectsReceived
Log("Incoming Object: " & o)
Next
End Select
End If
CallSub2 (Main, "UpdateEditTexts", rec) 'UpdateEditTexts (rec) 'sheet.Set(rec, meta)
Case 3 'GETDATA
Log ("Requesting Data...")
Dim HeaderObj As Object = Array ("GETDATA")
astream.Write(ser.ConvertArrayToBytes(HeaderObj))
'Sleep(500)
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
If ObjectsReceived(0) = "GETDATA" Then
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
For Each o As Object In ObjectsReceived
Log("Incoming Object: " & o)
Next
dat = ObjectsToRecordDat(ser.ConvertBytesToArray(Data))
End If
CallSub2 (Main, "UpdateDataFields", dat) ' Update data labels
End Select
Else 'Put mode, so send Request header and anything else relevant
Select Case Mode
Case 2 'SETCONFIG
Log ("Sending Config...")
Dim HeaderObj As Object = Array ("SETCONFIG")
astream.Write(ser.ConvertArrayToBytes(HeaderObj))
'Sleep(250)
astream.Write(ser.ConvertArrayToBytes(RecordToObjects(rec)))
'Sleep(250)
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
If ObjectsReceived(0) = "SETCONFIG-SUCCESS" Then
CallSub2 (Main, "ShowToast", "Config settings saved!")
Log ("CONFIG command was successful")
End If
Case 4 'SETHEATON
Log ("Sending HEATON request...")
Dim HeaderObj As Object = Array ("SETHEATON")
astream.Write(ser.ConvertArrayToBytes(HeaderObj))
'Sleep(250)
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
If ObjectsReceived(0) = "SETHEAT-SUCCESS" Then
Log ("SETHEAT command was successful")
End If
'Disconnect
CallSub (Main, "btnRefresh_Click")
Case 5 'SETHEATOFF
Log ("Sending HEATOFF request...")
Dim HeaderObj As Object = Array ("SETHEATOFF")
astream.Write(ser.ConvertArrayToBytes(HeaderObj))
'Sleep(250)
Wait for astream_NewData (Data() As Byte)
Dim ObjectsReceived() As Object = (ser.ConvertBytesToArray(Data))
If ObjectsReceived(0) = "SETHEAT-SUCCESS" Then
Log ("SETHEAT command was successful")
End If
'Disconnect
CallSub (Main, "btnRefresh_Click")
End Select
End If
'Disconnect
CallSub (Main, "HideProg")
End Sub
Sub RecordToObjects (Record As BoardConfig) As Object()
' Return Array(Record.BoardName, Record.SSID, Record.Password, Record.AirTemp, Record.AirHumidity, Record.PoolTemp, Record.hpStatus, _
' Record.hpDay1, Record.hpDay2, Record.hpDay3, Record.hpDay4, Record.hpDay5)
Return Array(Record.BoardName, Record.SSID, Record.Password)
End Sub
Sub ObjectsToRecord(Objects() As Object) As BoardConfig
Dim r As BoardConfig
r.Initialize
r.BoardName = Objects(0)
r.SSID = Objects(1)
r.Password = Objects(2)
' r.hpDay1 = Objects(7)
' r.hpDay2 = Objects(8)
' r.hpDay3 = Objects(9)
' r.hpDay4 = Objects(10)
' r.hpDay5 = Objects(11)
' r.MQTTBroker = Objects(3)
' r.MQTTPort = Objects(4)
' r.MQTTUsername = Objects(5)
' r.MQTTPassword = Objects(6)
Return r
End Sub
Sub ObjectsToRecordDat(Objects() As Object) As BoardData
Dim r As BoardData
r.Initialize
' Data Objects:
' 0 = AirTemperature
' 1 = AirHumidity
' 2 = AirHeatIndex
' 3 = PoolTemperature
' 4 = HeatPumpRun (boolean)
' 5 = Date & Time
r.AirTemp = Objects(0)
r.AirHumidity = Objects(1)
r.AirHeatIndex = Objects(2)
r.PoolTemp = Objects(3)
r.HeatPumpRun = Objects (4)
r.DandT = Objects (5)
Return r
' r.hpDay1 = Objects(7)
' r.hpDay2 = Objects(8)
' r.hpDay3 = Objects(9)
' r.hpDay4 = Objects(10)
' r.hpDay5 = Objects(11)
End Sub
Sub AStream_Error
Log("Error")
CallSub(Main, "HideProg") 'Hide the progress object
If astream.IsInitialized Then astream.Close
sock.close
End Sub
Sub AStream_Terminated
Log("Terminated")
CallSub(Main, "HideProg") 'Hide the progress object
If astream.IsInitialized Then astream.Close
End Sub
Sub Disconnect
Log("Disconnect")
CallSub(Main, "HideProg") 'Hide the progress object
If astream.IsInitialized Then astream.Close
sock.Close
End Sub
'Return true to allow the default exceptions handler to handle the uncaught exception.
Sub Application_Error (Error As Exception, StackTrace As String) As Boolean
CallSub(Main, "HideProg") 'Hide the progress object
Return True
End Sub
Sub Service_Destroy
CallSub(Main, "HideProg") 'Hide the progress object
End Sub