﻿B4A=true
Group=Default Group
ModulesStructureVersion=1
Type=Service
Version=10.2
@EndOfDesignText@
#Region  Service Attributes 
	#StartAtBoot: False
	
#End Region

Sub Process_Globals
	'These global variables will be declared once when the application starts.
	'These variables can be accessed from all modules.
	Private wshRx As WebSocketHandler
	Private timerWebSRx As Timer
	
	Private wshTx As WebSocketHandler
	Private timerWebSTx As Timer
	
	Private timerWaitRx As Timer
	
	Private timerProvaGiada As Timer
	
	Private Const DURATA_TIMER_TX_RX As Int = 500
	Private Const TEMPO_ATTESA_RX As Int = 1000
	
	Private stato_webs_rx As Int = 0
	Private stato_webs_tx As Int = 0
	Private Const WEBS_CONNECT As Int = 0
	Private Const WEBS_CONNECTED As Int = 1
	Private Const WEBS_ATTESA_RX As Int = 2
	Private Const WEBS_CLOSE As Int = 3
	
	Public Const C_OP_OK As Int = 1
	Public Const C_OP_KO As Int = 2
	Public Const C_OP_CALL_JITSI_MEET As Int = 3
	Public Const C_OP_WRITE_APPUNTAMENTI As Int = 4
	Public Const C_OP_TESTO As Int = 5
	Public Const C_OP_OPEN_JITSI_MEET As Int = 6
	Public Const C_OP_BUSY As Int = 7
	Public Const C_OP_REQ_RANDOM As Int = 8
	Public Const C_OP_SET_SOGLIE As Int = 9
	Public Const C_OP_READ_APPUNTAMENTI As Int = 10
	Public Const C_OP_OLD_WRITE_APPUNTAMENTI As Int = 11
	Public Const C_OP_SEND_LOG As Int = 12
	Public Const C_OP_KEEP_ALIVE As Int = 99 
	
	Private flagRxMsg As Boolean = False
	Private dataRxMsg As String = ""
	Private MittenteRx As String = ""
	Public DestinatarioRx As String = ""
	Private COpRx As Int = 0
	Public ProgrRx As Int = 1
	Private DataRx As Map 
	Private retryTx As Int = 0
	Private retryRun As Int = 0
	Private flagTimerScaduto As Boolean = False
	Private flagRxOk As Boolean = False
	Private dataRxMsg As String = ""
	Private attesaRisposta As Boolean = False
	Private msgToTx As WebMessage
	'Dim customSslMgr As CustomTrustManager
	'Dim customSslMgr2 As CustomTrustManager
	Public MittVideocallOld As String = ""
	Private Const DELTA_KEEP_ALIVE As Int = 120 '60s in unità da 500ms
	Private counterKeepAlive As Int = DELTA_KEEP_ALIVE
	Private SetTxKeepAlive As Boolean = False
	Private Const ATTESA_COPIA_KEEP_ALIVE As Int = 10 '5s in unità da 500ms
	Private TimerAttesaKeepAlive As Int = 0
	Private TimerWaitReconnect As Int = 0
	Public AttivaKeepAlive As Boolean = True
End Sub

Sub Service_Create
	InitWebsRx
	'Service.AutomaticForegroundMode = Service.AUTOMATIC_FOREGROUND_ALWAYS
End Sub

Sub Service_Start (StartingIntent As Intent)
	'Service.StopAutomaticForeground 'Call this when the background task completes (if there is one)
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"service websocket start")
End Sub

Sub Service_Destroy
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"service websocket destroy")
End Sub

Sub InitWebsRx
	'inizializzo la websocket
	If wshRx.IsInitialized = True Then
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"servizio webs già attivo")
	Else
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"servizio webs NON attivo ----------------------> LO ATTIVO")
		wshRx.Initialize(Me, "wshRx")
		'GIADA x certificati su wss
		'customSslMgr.InitializeAcceptAll
		'wsh.ws.SetCustomSSLTrustManager(customSslMgr)
		'END GIADA
	End If
	'inizializzo il timer
	If timerWebSRx.IsInitialized = True Then
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer webs già inizializzato")
		timerWebSRx.Interval = 100
	Else
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer webs da inizializzare")
		timerWebSRx.Initialize("timerWebSRx",100)
	End If
	timerWebSRx.Enabled = True
	stato_webs_rx = WEBS_CONNECT
	ProgrRx = 1
End Sub

'****************************************************
'Timer gestione websocket sul mio id
'****************************************************
Sub timerWebSRx_Tick
	timerWebSRx.Enabled = False
	
	'B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato automa wshRx: " & stato_webs_rx & " stato wsh: " & wshRx.ws.Connected & " TimerWaitReconnect " & TimerWaitReconnect)
	
	'la gestione della keep alive è sotto variabile definita nel menu rotella
	If AttivaKeepAlive = True Then
		'gestione contatore x keep alive
		If counterKeepAlive > 0 Then
			counterKeepAlive = counterKeepAlive - 1
			If counterKeepAlive = 0 Then
				'stampa debug
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato automa wshRx: " & stato_webs_rx & " stato wsh: " & wshRx.ws.Connected & " TimerWaitReconnect " & TimerWaitReconnect)
				'genero msg di keep alive di cui devo vedere copia, altrimenti meccanismo di reinit
				counterKeepAlive = DELTA_KEEP_ALIVE
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Msg di keep alive")
				SetTxKeepAlive = True
				stato_webs_rx = WEBS_CONNECTED
			End If
		End If
		
		'gestione timeout x copia keep alive
		If TimerAttesaKeepAlive > 0 Then
			TimerAttesaKeepAlive = TimerAttesaKeepAlive - 1
			If TimerAttesaKeepAlive = 0 Then
				'se sono arrivato qui vuol dire che qualcosa non va: chiudo la webs, reinit e connect
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"NON HO RICEVUTO COPIA DELLA KEEP ALIVE, CHIUDO E RINIZIALIZZO")
				CloseWebsRx
				InitWebsRx
				'TEST GIADA
				'provo a lanciare un timer da 1min che al termine forza una connect e va nello stato di connected
				If timerProvaGiada.IsInitialized = False Then
					timerProvaGiada.Initialize("timerProvaGiada",60000)
					timerProvaGiada.Enabled = True
					B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"++++++++++++++LANCIO TIMER X PROBLEMA WEBS++++++++++++++")
				Else	
					If timerProvaGiada.Enabled = True Then
						B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Problema webs ma ho già fatto quel che potevo")
					Else	
						timerProvaGiada.Interval = 60000
						timerProvaGiada.Enabled = True
						B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"++++++++++++++LANCIO TIMER X PROBLEMA WEBS++++++++++++++")
					End If
				End If
				'TEST GIADA
				Return
			End If
		End If
	Else
		'se nn ho keep alive metto solo stampa di debug
		If DateTime.GetSecond(DateTime.Now) Mod 10 = 0 Then
			B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato automa wshRx: " & stato_webs_rx & " stato wsh: " & wshRx.ws.Connected & " TimerWaitReconnect " & TimerWaitReconnect)
		End If
	End If	
	
	'gestione timeout x attesa reconnect
	If TimerWaitReconnect > 0 Then
		TimerWaitReconnect = TimerWaitReconnect - 1
	End If
	
	Select stato_webs_rx
		Case WEBS_CONNECT
			If wshRx.ws.Connected = False And TimerWaitReconnect = 0 Then
				wshRx.Connect("wss://servicetelecare.beghelli.it/ws/Room_" & B4XPages.MainPage.IdTablet)
				stato_webs_rx = WEBS_CONNECTED
				B4XPages.MainPage.Mylog(Main.LIVELLO_DEBUG_WEBSOCKET,"RIAPRO LA WEBS IN RX--------------------------------------")
			else if wshRx.ws.Connected = True Then
				stato_webs_rx = WEBS_CONNECTED
			End If
			
		Case WEBS_CONNECTED
			If wshRx.ws.Connected = False Then
				stato_webs_rx = WEBS_CONNECT
				TimerWaitReconnect = 80 '40s in unità da 500ms
			else if flagRxMsg = True Then
				TimerAttesaKeepAlive = 0
				If GestisciMessaggi Then
					B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Rispondo sulla mia webs")
					'vuol dire che devo rispondere  sulla mia webs
					wshRx.SendEventToServer(msgToTx.mitt,msgToTx.dest,msgToTx.cop,msgToTx.progr,msgToTx.data)
				End If
				flagRxMsg = False
			End If	
			'provo a fare la keep alive indip dal fatto che mi dica correttamente connesso
			If SetTxKeepAlive = True Then
				SetTxKeepAlive = False
				Dim mp As Map
				mp.Initialize
				If ProgrRx = 999 Then
					ProgrRx = 1
				Else
					ProgrRx = ProgrRx + 1
				End If
				wshRx.SendEventToServer(B4XPages.MainPage.IdTablet,B4XPages.MainPage.IdTablet,C_OP_KEEP_ALIVE,ProgrRx,mp)
				'aspetto la copia della tx entro 5s
				TimerAttesaKeepAlive = ATTESA_COPIA_KEEP_ALIVE
				TimerWaitReconnect = 10
			End If
			
	End Select
	
	timerWebSRx.Interval = DURATA_TIMER_TX_RX
	timerWebSRx.Enabled = True
End Sub

'****************************************************
'
'****************************************************
Private Sub wshRx_TextMessage(msg As String)
	flagRxMsg = True
	dataRxMsg = msg
	counterKeepAlive = DELTA_KEEP_ALIVE
	timerProvaGiada.Enabled = False
	timerProvaGiada.Interval = 0
End Sub

'****************************************************
'Automa gestione codici operativi rx
'****************************************************
Sub GestisciMessaggi As Boolean
	Dim webM As WebMessage
	Dim jp As JSONParser
	Dim mp As Map
	jp.Initialize(dataRxMsg)
	Dim m As Map = jp.NextObject
	Dim mitt As String = m.get("mitt")
	Dim cOp As Int = m.get("cop")
	Dim dest As String = m.Get("dest")
	Dim progr As Int = m.Get("progr")
	Dim rispondi As Boolean = False
	
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Analisi msg ricevuto")
	
	Select cOp
		
		Case C_OP_CALL_JITSI_MEET
			If B4XPages.MainPage.VideocallInCorso = True Then
				'se il mitt è sempre lo stesso dico answered se no busy
				If mitt = MittVideocallOld Then
					'rispondo answered
					mp.Initialize
					mp.Put("action","answered")
					webM.dest = mitt
					webM.mitt = dest
					webM.cop = C_OP_OPEN_JITSI_MEET
					webM.progr = progr
					webM.data = mp
					webM.retry = 0
					If mitt = "" Or mitt.Contains("&") Then
						msgToTx = webM
						rispondi = True
					Else
						Trasmetti(webM)
					End If
				Else
					'rispondo busy
					mp.Initialize
					webM.dest = mitt
					webM.mitt = dest
					webM.cop = C_OP_OPEN_JITSI_MEET
					webM.progr = progr
					mp.Put("action","busy")
					webM.data = mp
					webM.retry = 0
					If mitt = "" Or mitt.Contains("&") Then
						msgToTx = webM
						rispondi = True
					Else
						Trasmetti(webM)
					End If	
				End If	
			Else
				Dim s As String
				s = m.Get("room")
				EstraiDatiVideocall(s)				
				'mi salvo con chi faccio la call
				MittVideocallOld = mitt
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Ricevuta richiesta videocall da " & MittVideocallOld)				
				'cerco se c'è campo testo e campo play
				Dim testo As String = ""
				Dim play As String = ""
				Try
					testo = m.Get("testo")
					Log("testo da scrivere")
				Catch
					Log(LastException)
				End Try
				Try
					play = m.Get("play")
					Log("testo da riprodurre")
				Catch
					Log(LastException)
				End Try				
				'faccio apparire la schermata di precall PROVARE SE AVENDO CAMBIATO LE RIGHE SOTTO SE PREMI SUBITO RISPONDI NON ARRIVAVA IL MSG SU WEBS
				CallSubDelayed3(B4XPages.MainPage,"StartPreCallPanel",testo,play)
				'B4XPages.MainPage.StartPreCallPanel(testo,play)
				'rispondo ok
				mp.Initialize
				webM.dest = mitt
				webM.mitt = dest
				webM.cop = C_OP_OK
				webM.progr = progr
				webM.data = mp
				webM.retry = 0
				If mitt = "" Or mitt.Contains("&") Then
					msgToTx = webM
					rispondi = True
				Else
					Trasmetti(webM)
				End If
			End If	
			
		Case C_OP_WRITE_APPUNTAMENTI
			Dim ListaAppuntamenti As List
			ListaAppuntamenti.Initialize
			ListaAppuntamenti = m.Get("appuntamenti")
			B4XPages.MainPage.WriteAppuntamenti3(ListaAppuntamenti)
			B4XPages.MainPage.PreparaAppuntamentiGiornalieri
			'rispondo ok
			mp.Initialize
			'appuntamenti
			Dim l,l1 As List
			Dim s As String
			Dim a As Appuntamento
			l.Initialize
			For i = 0 To B4XPages.MainPage.Appuntamenti.Size-1
				s = B4XPages.MainPage.Appuntamenti.Get(i)
				a = B4XPages.MainPage.ConvertiStringaToAppuntamento(s)
				l1.Initialize
				l1.Add(a.data)
				l1.Add(a.ora)
				l1.Add(a.utente)
				l1.Add(a.descrizione)
				l1.Add(a.periodicita)
				l1.Add(a.tipo)
				l1.Add(a.sottoTipo)
				l1.Add(a.id)
				l.add(l1)
				'Log(l1)
			Next
			'Log(l)
			mp.Put("appuntamenti",l)
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_OK
			webM.progr = progr
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If

		Case C_OP_OK
			'questo è un c_op di rx, devo verificare se è la rx al mio msg e poi fermo retry e setto flagRxOk = True
			If attesaRisposta = True Then
				attesaRisposta = False
				'DEVO CONTROLLARE PROGR
				flagRxOk = True
			End If	
			
		Case C_OP_TESTO
			'questo è un c_op di rx, devo verificare se è la rx al mio msg e poi fermo retry e setto flagRxOk = True
			If attesaRisposta = True Then
				attesaRisposta = False
				'devo controllare il progressivo!!!!!!!!!!!!!!!!!!!!
				Dim testo As String = m.Get("testo")
				Log("testo " & testo & " progr " & progr & " ProgrRx " & ProgrRx)
				If testo.ToLowerCase = "ok" And progr = ProgrRx Then
					flagRxOk = True
				End If
			End If
			'rispondo ok
			mp.Initialize
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_OK
			webM.progr = progr
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If
			
		Case C_OP_OPEN_JITSI_MEET
			'questo può essere anche un cop di rx ATTENZIONE
			If attesaRisposta = True Then
				attesaRisposta = False
			End If	
			'devo controllare il progressivo!!!!!!!!!!!!!!!!!!!!
			Dim testo As String = m.Get("action")
			Log("action " & testo & " progr " & progr & " ProgrRx " & ProgrRx)
			'If testo.ToLowerCase = "hangup" And progr = ProgrRx Then 'VA RIMESSO MA TOSELLI ANCORA NON PRONTO
			If testo.ToLowerCase = "hangup" Then
				'vuol dire che hanno messo giù la call --> devo chiudere anch'io
				B4XPages.MainPage.TerminaCallJitsi
				flagRxOk = True
				MittVideocallOld = "" 'azzero il mittente della call
			else if testo.ToLowerCase = "end" Then
				B4XPages.MainPage.EsciPreCall
				flagRxOk = True
				MittVideocallOld = "" 'azzero il mittente della call
				B4XPages.MainPage.VideocallInCorso = False
			else if testo.ToLowerCase = "rejected" Then
				B4XPages.MainPage.TerminaCallJitsi
				flagRxOk = True
				MittVideocallOld = "" 'azzero il mittente della call
			End If
			
		Case C_OP_REQ_RANDOM
			'genero un random, mando su i dati e rispondo --> il random è fisso
			'QUI SENDDATA NN E' BLOCCANTE!!!!!!!!!!!!!!!!!(non so come farlo)
			B4XPages.MainPage.SendDataToDb
			'Starter.Delay(2000)
			'registro l'accesso ai dati
			B4XPages.MainPage.RegistraAccesso(mitt,"dati")
			mp.Initialize
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_REQ_RANDOM
			webM.progr = progr
			mp.Put("random",B4XPages.MainPage.RandCode)
			'appuntamenti
			Dim l,l1 As List
			Dim s As String
			Dim a As Appuntamento
			l.Initialize
			For i = 0 To B4XPages.MainPage.Appuntamenti.Size-1
				s = B4XPages.MainPage.Appuntamenti.Get(i)
				a = B4XPages.MainPage.ConvertiStringaToAppuntamento(s)
				l1.Initialize
				l1.Add(a.data)
				l1.Add(a.ora)
				l1.Add(a.utente)
				l1.Add(a.descrizione)
				l1.Add(a.periodicita)
				l1.Add(a.tipo)
				l1.Add(a.sottoTipo)
				l1.Add(a.id)
				l.add(l1)
				'Log(l1)
			Next
			'Log(l)
			mp.Put("appuntamenti",l)
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If
			
		Case C_OP_SET_SOGLIE
			'estraggo le soglie, le salvo nel file e nella lista
			Dim js As JSONParser
			Dim li As List
			li.Initialize
			js.Initialize(m.Get("config"))
			li = js.NextArray
			Dim config As String = m.Get("config")
			Dim s As String
			s = "S," & DateTime.Now & ",{""config"":" & config & "}"
			B4XPages.MainPage.EstraiSoglie(s)
			B4XPages.MainPage.SoglieList.Add(s)
			Starter.Writer.Initialize(File.OpenOutput(File.DirInternal, Starter.filenameSoglie, True))
			Starter.Writer.WriteLine(s)
			Starter.Writer.Close
			'aggiunta una senddata così rimando su dati e soglie aggiornati
			B4XPages.MainPage.SendDataToDb
			'rispondo ok
			mp.Initialize
			mp.Put("config",li)
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_OK
			webM.progr = progr
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If
			
		Case C_OP_READ_APPUNTAMENTI
			mp.Initialize
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_READ_APPUNTAMENTI
			webM.progr = progr
			'appuntamenti
			Dim l,l1 As List
			Dim s As String
			Dim a As Appuntamento
			l.Initialize
			For i = 0 To B4XPages.MainPage.Appuntamenti.Size-1
				s = B4XPages.MainPage.Appuntamenti.Get(i)
				a = B4XPages.MainPage.ConvertiStringaToAppuntamento(s)
				l1.Initialize
				l1.Add(a.data)
				l1.Add(a.ora)
				l1.Add(a.utente)
				l1.Add(a.descrizione)
				l1.Add(a.periodicita)
				l1.Add(a.tipo)
				l1.Add(a.sottoTipo)
				l1.Add(a.id)
				l.add(l1)
				'Log(l1)
			Next
			'Log(l)
			mp.Put("appuntamenti",l)
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If
			
'		Case C_OP_OLD_WRITE_APPUNTAMENTI
'			B4XPages.MainPage.InitAppuntamenti
'			B4XPages.MainPage.Appuntamenti = m.Get("appuntamenti")
'			'salvo la lista in un file
'			If File.Exists(File.DirInternal,Starter.ListaAppuntamentiFile) Then
'				File.Delete(File.DirInternal,Starter.ListaAppuntamentiFile)
'			End If
'			Starter.Writer.Initialize(File.OpenOutput(File.DirInternal, Starter.ListaAppuntamentiFile, False))
'			Starter.Writer.WriteList(B4XPages.MainPage.Appuntamenti)
'			Starter.Writer.Close
'			B4XPages.MainPage.PreparaAppuntamentiGiornalieri
'			'rispondo ok
'			mp.Initialize
'			webM.dest = mitt
'			webM.mitt = dest
'			webM.cop = C_OP_OK
'			webM.progr = progr
'			'appuntamenti
'			Dim l,l1 As List
'			Dim s As String
'			Dim a As Appuntamento
'			l.Initialize
'			For i = 0 To B4XPages.MainPage.Appuntamenti.Size-1
'				s = B4XPages.MainPage.Appuntamenti.Get(i)
'				a = B4XPages.MainPage.ConvertiStringaToAppuntamento(s)
'				l1.Initialize
'				l1.Add(a.data)
'				l1.Add(a.ora)
'				l1.Add(a.utente)
'				l1.Add(a.descrizione)
'				l1.Add(a.periodicita)
'				l1.Add(a.tipo)
'				l1.Add(a.sottoTipo)
'				l1.Add(a.id)
'				l.add(l1)
'				'Log(l1)
'			Next
'			'Log(l)
'			mp.Put("appuntamenti",l)
'			webM.data = mp
'			webM.retry = 0
'			If mitt = "" Or mitt.Contains("&") Then
'				msgToTx = webM
'				rispondi = True
'			Else
'				Trasmetti(webM)
'			End If
			
		Case C_OP_SEND_LOG
			B4XPages.MainPage.InviaLogZippati
			'rispondo ok
			mp.Initialize
			webM.dest = mitt
			webM.mitt = dest
			webM.cop = C_OP_OK
			webM.progr = progr
			webM.data = mp
			webM.retry = 0
			If mitt = "" Or mitt.Contains("&") Then
				msgToTx = webM
				rispondi = True
			Else
				Trasmetti(webM)
			End If
			
	End Select
	Return rispondi
End Sub

'****************************************************
'Funzione di trasmissione
'****************************************************
Sub Trasmetti(msg As WebMessage)
	'inizializzo la websocket
''''''''''''	COSI NN VA BENE SE NO HO 2 OGGETTI 	
''''''''''''	Dim wshTx As WebSocketHandler
''''''''''''	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"init webs tx")
	''''''''''''	wshTx.Initialize(Me, "wshTx")
	If wshTx.IsInitialized = True Then
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"servizio webs_rx già attivo")
	Else
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"servizio webs_rx NON attivo ----------------------> LO ATTIVO")
		wshTx.Initialize(Me, "wshTx")
		'GIADA x certificati su wss
		'customSslMgr2.InitializeAcceptAll
		'wshTx.ws.SetCustomSSLTrustManager(customSslMgr2)
		'END GIADA
	End If
	'inizializzo il timer
	If timerWebSTx.IsInitialized = True Then
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer websRx già inizializzato")
		timerWebSTx.Interval = 100
	Else
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer websRx da inizializzare")
		timerWebSTx.Initialize("timerWebSTx",100)
	End If
	timerWebSTx.Enabled = True
	'copio i dati x la risposta su variabili visibili da altri
	MittenteRx = msg.mitt
	DestinatarioRx = msg.dest
	COpRx = msg.cop
	DataRx.Initialize
	DataRx = msg.data
	retryTx = msg.retry
	If msg.retry = 0 Then
		'identifico così un msg di risposta secco
		attesaRisposta = False
		ProgrRx = msg.progr
	Else
		'identifico così una mia tx su cui quindi parte un meccanismo di retry e controllo risposta	
		attesaRisposta = True
		retryRun = retryTx
		If ProgrRx = 999 Then
			ProgrRx = 1
		Else	
			ProgrRx = ProgrRx + 1
		End If
	End If
End Sub

'****************************************************
'Timer gestione websocket x le risposte
'****************************************************
Sub timerWebSTx_Tick
	timerWebSTx.Enabled = False
	
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato automa timerWebSTx_Tick: " & stato_webs_tx)
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato wshTx: " & wshTx.ws.Connected)
	
	Select stato_webs_tx
		Case WEBS_CONNECT
			If DestinatarioRx.Contains("&") Or DestinatarioRx = "" Then
				wshTx.Connect("wss://servicetelecare.beghelli.it/ws/Room_" & B4XPages.MainPage.IdTablet)
			Else	
				wshTx.Connect("wss://servicetelecare.beghelli.it/ws/Room_" & DestinatarioRx)
			End If
			stato_webs_tx = WEBS_CONNECTED
			
		Case WEBS_CONNECTED
			If wshTx.ws.Connected = False Then
				stato_webs_tx = WEBS_CONNECT
			Else
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Trasmetto Messaggio " & MittenteRx & " " & DestinatarioRx & " " & COpRx & " " & DataRx)
				wshTx.SendEventToServer(MittenteRx,DestinatarioRx,COpRx,ProgrRx,DataRx)
				If retryTx = 0 Then
					'retry nulli tx e chiudo
					stato_webs_tx = WEBS_CLOSE
				Else
					'gestione retry
					StartTimerWaitRx
					stato_webs_tx = WEBS_ATTESA_RX
					flagTimerScaduto = False
				End If	
			End If
			
		Case WEBS_ATTESA_RX
			If flagRxOk = True Then
				'risposta ok
				flagRxOk = False
				B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Risposta ok")
				'pensare se devo fare un callback x gestire situazioni pù complicate
				stato_webs_tx = WEBS_CLOSE
			else If flagTimerScaduto = True Then
				'risposta non arrivata o errata
				flagTimerScaduto = False
				retryRun = retryRun - 1
				If retryRun = 0 Then
					B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"Messaggio senza risposta")
					'pensare se devo fare un callback x gestire situazioni pù complicate
					stato_webs_tx = WEBS_CLOSE
				Else	
					If wshTx.ws.Connected = True Then
					'If websTxConnected = True Then
						B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"retry ............................ "& MittenteRx & " " & DestinatarioRx & " " & COpRx & " " & DataRx)
						wshTx.SendEventToServer(MittenteRx,DestinatarioRx,COpRx,ProgrRx,DataRx)
						StartTimerWaitRx
					Else
						'se ho perso la connessione devo rifare tutto il giro
						stato_webs_tx = WEBS_CONNECT
					End If		
				End If
			End If
			
		Case WEBS_CLOSE
			'B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato wshTx: " & wshTx.ws.Connected & " mia variabile websTxConnected " & websTxConnected)
			B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"stato wshTx: " & wshTx.ws.Connected)
			wshTx.Close
			stato_webs_tx = WEBS_CONNECT
			Return
			
	End Select
	
	timerWebSTx.Interval = DURATA_TIMER_TX_RX
	timerWebSTx.Enabled = True
End Sub

'****************************************************
'
'****************************************************
Sub StartTimerWaitRx
	'inizializzo il timer
	If timerWaitRx.IsInitialized = True Then
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer timerWaitRx già inizializzato")
		timerWaitRx.Interval = TEMPO_ATTESA_RX
	Else
		B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"timer timerWaitRx da inizializzare")
		timerWaitRx.Initialize("timerWaitRx",TEMPO_ATTESA_RX)
	End If
	timerWaitRx.Enabled = True
End Sub

'****************************************************
'
'****************************************************
Sub timerWaitRx_Tick
	timerWaitRx.Enabled = False
	flagTimerScaduto = True
End Sub

'****************************************************
'
'****************************************************
Private Sub wshRx_Connected
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"**************************************************************wshRx_Connected")
End Sub

'****************************************************
'
'****************************************************
Private Sub wshRx_Closed (Reason As String)
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"**************************************************************wshRx_Closed " & Reason)
End Sub

'****************************************************
'
'****************************************************
Private Sub wshTx_Connected
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"wshTx_Connected")
End Sub

'****************************************************
'
'****************************************************
Private Sub wshTx_Closed (Reason As String)
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"wshTx_Closed " & Reason)
End Sub

'****************************************************
'Funzione che estrae da una stringa server,room,pin
'****************************************************
Sub EstraiDatiVideocall(s As String)
	Dim i As Int
	If s.Contains("_") Then
		i = s.IndexOf("_")
		s1.serverVideocall = s.SubString2(0,i)
		Log("server " & s1.serverVideocall)
		s = s.SubString(i+1)
		If s.Contains("_") Then
			i = s.IndexOf("_")
			s1.room = s.SubString2(0,i)
			Log("room " & s1.room)
			s = s.SubString(i+1)
			s1.password = s
			Log("pin " & s1.password)
		End If
	End If
End Sub

'****************************************************
'
'****************************************************
Sub CloseWebsRx
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"CHIUDO wshRx")
	wshRx.Close
End Sub

'****************************************************

'****************************************************
Sub timerProvaGiada_Tick
	Dim wshRx As WebSocketHandler
	timerProvaGiada.Enabled = False
	B4XPages.MainPage.MyLog(Main.LIVELLO_DEBUG_WEBSOCKET,"...........................PROVO UNA CONNECT...........................")
	wshRx.Initialize(Me, "wshRx")
	wshRx.Connect("wss://servicetelecare.beghelli.it/ws/Room_" & B4XPages.MainPage.IdTablet)
	stato_webs_rx = WEBS_CONNECTED	
End Sub