﻿B4A=true
Group=Application\BlueTooth
ModulesStructureVersion=1
Type=Class
Version=12.2
@EndOfDesignText@
Sub Class_Globals
	
	Private SerialPort As Serial
	Private AStream As AsyncStreams

	Public DeviceConnection_Enabled As Boolean = False 'memorizza se i dispositivi sono connessi/disconnessi
				
	Private BufferData As String = "" 'memorizzo i dati di AStream_NewData

	Private ActRef As Object = Null 'activity di riferimento per i messaggi di attesa
	
	Public DeviceToConnect As DeviceProperty 'dispositivo attualmente connesso

	Private StartTime As Long = 0 
	Private StopTime As Long = 0 
	
	Public ConnectionERROR As Boolean = False 'per uscire dai loop se in attesa di connessione oppure in connessione
	
End Sub

'Initializes the object. You can add parameters to this method if needed.
Public Sub Initialize
	
	SerialPort.Initialize("SerialPort")

End Sub

'---------------------------------------------------------------------------------------------------------------------------------
'CONNESSIONE AL DISPOSITIVO BLUETOOTH REMOTO E RICEZIONE\INVIO DATI
'---------------------------------------------------------------------------------------------------------------------------------

'Connessione al dispositivo non memorizzato
Public Sub Connect_Device (Device As DeviceProperty,ActivityRef As Object)
		
	DeviceToConnect = Device
	ActRef = ActivityRef
	
	Functions.Write_Log("Connessione al dispositivo BT",False,False)
	
	If ActRef <> Null Then
		CallSub3(ActRef,"Initializing","Connessione dispositivo...",True)	
	End If
	
	ConnectionERROR = False
	
	Try
		SerialPort.Connect(DeviceToConnect.Mac)	
	Catch
		MsgboxAsync("Ci si stà connettendo a un dispositivo diverso dal selezionato oppure l'indirizzo MAC è errato.","Errore di connessione")
	End Try

End Sub

'Disconnette il dispositivo
Public Sub Disconnect_Device
	
	Functions.Write_Log("Disconnessione dispositivo BT",False,False)

	If AStream.IsInitialized = True Then 
		AStream.Close
	End If
	
	DeviceConnection_Enabled = False	
	BlueTooth.ECUIsInitialized = False

	SerialPort.Disconnect
	
	ToastMessageShow("Dispositivo disconnesso.",AppSettings.ToastMessageLongDuration)
	
	'aggiorno lo stato dei bottoni
	If ActRef = actMain Then	
		CallSub(actMain,"BTConnection_UpdateStatus")	
	End If
	
End Sub

'Richiamato da SerialPort.Connect quando connesso al dispositivo
Private Sub SerialPort_Connected (Success As Boolean)
	
	DeviceConnection_Enabled = Success

	If Success = False Then
		
		'resetto le variabili per dispositivo non connesso
		DeviceToConnect.MAC = ""
		DeviceToConnect.Name = ""	
		BlueTooth.BTAdapter.DeviceToConnect = DeviceToConnect

		If ActRef <> Null Then
			CallSub3(ActRef,"Initializing","",False)
		End If
	
		ConnectionERROR = True
		
		MsgboxAsync("Il dispositivo non risponde:" & CRLF & LastException.Message,"Errore di connessione")
		
		Functions.Write_Log("Errore connessione dispositivo BT",False,False)

	Else if Success = True Then
		
		If AStream.IsInitialized = True Then AStream.Close
		
		'memorizzo il dispositivo che stò cercando di connettere per poi salvarlo se si connette
		BlueTooth.BTAdapter.DeviceToConnect = DeviceToConnect

		'se non ho salvato il dispositivo lo salvo perchè connesso
		If BlueToothSettings.DeviceToAutoReconnect.MAC = "" Then
			
			'connetto il dispositivo automaticamente
			BlueToothSettings.AutoReconnectDevice = True
			BlueToothSettings.Set_BTSettingValue("AutoReconnectDevice",BlueToothSettings.AutoReconnectDevice)

			'se sono connesso al dispositivo salvo il dispositivo connesso per la connessione automatica
			BlueToothSettings.DeviceToAutoReconnect = BlueTooth.BTAdapter.DeviceToConnect
			
			'salvo le impostazioni
			BlueToothSettings.Set_BTSettingValue("DeviceName",BlueToothSettings.DeviceToAutoReconnect.Name)
			BlueToothSettings.Set_BTSettingValue("DeviceMAC",BlueToothSettings.DeviceToAutoReconnect.MAC)
			
		End If

		'prefix mode! Change to non-prefix mode if communicating with non-B4X device.
		'AStream.InitializePrefix(SerialPort.InputStream, False, SerialPort.OutputStream, "AStream")
		
		AStream.Initialize(SerialPort.InputStream, SerialPort.OutputStream, "AStream")
		
		ToastMessageShow("Connesso al dispositivo.", False)
		
		Functions.Write_Log("Connesso al dispositivo BT",False,False)
		
		'inizializzo la connessione alla ECU
		'wait for (BlueTooth.Initialize_ECU_Connection) complete (Initialized As Boolean)

        Functions.Write_Log("Chiamata sub BlueTooth.Initialize_ECU_Connection",False,False)
        
		CallSubDelayed(Me,"Initialize_ECU_Connection")
		
		If ActRef <> Null Then
			CallSub3(ActRef,"Initializing","",False)
		End If

	End If
	
	'aggiorno lo stato dei bottoni
	If ActRef = actMain Then
		CallSub(actMain,"BTConnection_UpdateStatus")	
	End If
	
End Sub

'Invia il comando a ELM327 (Usare PIDs.Send)
Public Sub Send (PID As String)
	
	Dim Code As String = PID & Chr(13) & Chr(10)
	
	Functions.Write_Log("Invio PID: " & PID,False,False)
	
	AStream.Write(Code.GetBytes(BlueToothSettings.ELMSelectedCharSet))
	
	StartTime = DateTime.Now
	
End Sub

public Sub AStream_NewData (Buffer() As Byte)
	
	Functions.Write_Log("Ricezione dati in AStream_NewData Buffer",False,False)

	'Buffer contenete i dati
	BufferData = BufferData & BytesToString(Buffer,0,Buffer.Length,BlueToothSettings.ELMSelectedCharSet)
	
	'se il Buffer contiene il terminatore > la stringa è completa e la passo al convertitore
	If BufferData.Contains(BlueToothSettings.StopSendDataChar) = True Then		
		
		Functions.Write_Log("Trovato carattere terminatore invio Buffer",False,False)

		ECUResponse_Time
		
		PIDs.Buffer_Receiver(BufferData)
	
		'svuoto il buffer
		BufferData = ""
		
	End If

End Sub

Sub ECUResponse_Time
	
	Sleep(0)
	
	StopTime = DateTime.Now
	DateTime.TimeFormat = "S"
	BlueTooth.ECUResponseTime = DateTime.Time(StopTime-StartTime)
	
	Functions.Write_Log("Tempo di risposta ECU: " & BlueTooth.ECUResponseTime,False,False)
	
	If BlueTooth.ECUResponseTime > BlueToothSettings.ECUResponseTime Or BlueToothSettings.ECUResponseTime = 0 Then
	
		Functions.Write_Log("Tempo di risposta ECU scritta in impostazioni: " & BlueTooth.ECUResponseTime,False,False)
		BlueToothSettings.ECUResponseTime = BlueTooth.ECUResponseTime
		BlueToothSettings.Set_BTSettingValue("ECUResponseTime",BlueToothSettings.ECUResponseTime)	
		
	End If
	
End Sub

Private Sub AStream_Error
	
	MsgboxAsync("Errore di connessione al dispositivo BT.","Errore di connessione")
	
	Functions.Write_Log("Errore di connessione al dispositivo BT",False,False)
	
	If AStream.IsInitialized = True Then AStream.Close

	DeviceConnection_Enabled = False
	BlueTooth.ECUIsInitialized = False
	
	ConnectionERROR = True
	
	'aggiorno lo stato dei bottoni
	If ActRef = actMain Then
		CallSub(actMain,"BTConnection_UpdateStatus")	
	End If

End Sub

Private Sub AStream_Terminated
	
	AStream_Error
	
End Sub

'---------------------------------------------------------------------------------------------------------------------------------
'ATTESA DI CONNESSIONI REMOTE
'---------------------------------------------------------------------------------------------------------------------------------

'Ricerca connessioni da attivare in caso di attesa connessione
Public Sub ListenForConnections
	
	Dim i As Intent
	
	i.Initialize("android.bluetooth.adapter.action.REQUEST_DISCOVERABLE", "")
	i.PutExtra("android.bluetooth.adapter.extra.DISCOVERABLE_DURATION", BlueToothSettings.ListenForConnTime)
	StartActivity(i)
	SerialPort.Listen
	
	Functions.Write_Log("Attesa di connessione di un dispositivo",False,False)
	
	ToastMessageShow("Il dispositivo rimarrà in attesa di connessioni per " & BlueToothSettings.ListenForConnTime & " sec.",AppSettings.ToastMessageLongDuration)
	
End Sub

'Inizializza la connessione all'ECU solo se connesso 
Sub Initialize_ECU_Connection
	
	'Dim PIDsToSend As List
	
	'PIDsToSend.Initialize
	
	'If ELM327Connection.DeviceConnection_Enabled = True Then
		
	Functions.Write_Log("Inizializzazione connessione ECU",False,False)
	
	If ActRef <> Null Then
		CallSub3(ActRef,"Initializing","Inizializzazione ECU...",True)
	End If
	
'		If BlueToothSettings.ELM327Reset = True Then PIDsToSend.Add(ELM327_Reset)
'		If BlueToothSettings.ELM327EchoOFF = True Then PIDsToSend.Add(ELM327_Echo_OFF)
'		If BlueToothSettings.ELM327SetProtocolAUTO = True Then PIDsToSend.Add(ELM327_SetProtocol_AUTO)
'		If BlueToothSettings.ELM327BUSFastInit = True Then PIDsToSend.Add(ELM327_BUS_FastInit)
	
	If BlueToothSettings.ELM327Reset = True Then
		PIDs.Send_PID(BlueTooth.ELM327_Reset,Null,"")
		'attesa invio comando
		Sleep(BlueToothSettings.PIDSendDelay)
	End If
		
	If BlueToothSettings.ELM327EchoOFF = True Then
		PIDs.Send_PID(BlueTooth.ELM327_Echo_OFF,Null,"")
		'attesa invio comando
		Sleep(BlueToothSettings.PIDSendDelay)
	End If
		
	If BlueToothSettings.ELM327SetProtocolAUTO = True Then
		PIDs.Send_PID(BlueTooth.ELM327_SetProtocol_AUTO,Null,"")
		'attesa invio comando
		Sleep(BlueToothSettings.PIDSendDelay)
	End If
		
	If BlueToothSettings.ELM327BUSFastInit = True Then
		PIDs.Send_PID(BlueTooth.ELM327_BUS_FastInit,Null,"")
		'attesa invio comando
		Sleep(BlueToothSettings.PIDSendDelay)
	End If

	BlueTooth.ECUIsInitialized = True
	
	'PIDs.Send_PIDs(PIDsToSend,Null,"")
		
	Functions.Write_Log("Fine inizializzazione connessione ECU",False,False)

	If ActRef <> Null Then
		CallSub3(ActRef,"Initializing","",False)
	End If
	
	'End If

End Sub