#Region  Project Attributes 
	#ApplicationLabel: EFIS
	#VersionCode: 1
	#VersionName: 
	'SupportedOrientations possible values: unspecified, landscape or portrait.
	#SupportedOrientations: landscape				
	#CanInstallToExternalStorage: False
#End Region

#Region  Activity Attributes 
	#FullScreen: True
	#IncludeTitle: False
#End Region

Sub Process_Globals
	Private Timer1 As Timer
	Dim usocket As UDPSocket
	Dim datos(15) As Float
	
	Dim red=False  As Boolean		'Para simulacion red=false
	
End Sub

Sub Globals
	Private xui As XUI
	Dim stu As StringUtils
	Dim Pitch=0,Roll=0,Ball=-150,Heading=0,Vapp=0,Alt=0,Vario=-3500 As Float
	Dim QNH=1036 As Int
	Dim AP=0 As Int
	Dim AP_Heading, AP_Alt As Float
	Dim Vso=70,Vs=82,Vfe=140,Vno=218,Vne=280 As Float  'Vso=38,Vs=44,Vfe=75,Vno=118,Vne=164 en nudos
'	Dim Vso=65,Vs=80,Vfe=140,Vno=170,Vne=220 As Float  'B:70-140 V:82-218 A:218-300 R:300-
	Dim QNH_Enter=False As Boolean
'	Dim AP_State=False As Boolean
	
	Private pnHB As B4XView				'El horizonte
	Private cvsHB As B4XCanvas
	Private recHB As B4XRect
	Private bmpHB As B4XBitmap
	
	Private	pnSB As B4XView				'La barra del anemometro
	Private cvsSB As B4XCanvas
	Private recSB As B4XRect
	Private bmpSB As B4XBitmap
	
	Private pnSN As B4XView				'El numero del anemometro
	Private lblSN As Label

	Private pnARCB As B4XView			'Los Arcos del anemometro
	Private pnARCV As B4XView
	Private pnARCA As B4XView
	Private pnARCR As B4XView

	Private pnHEN As B4XView			'El numero del rumbo
	Private lblHEN As Label

	Private pnALT As B4XView			'El numero del altimetro
	Private lblALT As Label

	Private pnVAR As B4XView			'El arco del Vario
	Private pnVARESC As B4XView			'El panel sobre el que pintar la escala del vario
	Private cvsVARESC As B4XCanvas
		
	Private pnQNH As B4XView			'El numero del QNH
	Private lblQNH As Label
	Private btnQNH As Button			'El boton para cambiar
	Private btnQNHMAS As Button			'El boton para subir
	Private btnQNHMENOS As Button		'El boton para bajar

	Private pnBALLESC As B4XView		'La Bola
	Private cvsBALLESC As B4XCanvas		'la escala de fondo
	Private pnBALL As B4XView			'La Bola en si
		
	Private pnAP As B4XView				'Panel para el boton y texto del AP
	Private lblAP As Label				'El texto "AP"
	Private btnAP As B4XView			'El Boton del AP
			
	Dim MaxSize , Grueso As Float		'La dimension maxima y el grosor de lineas
	Dim CentroX, CentroY, X0,X1,Y0,Y1 As Float	
	
End Sub

Sub Activity_Create(FirstTime As Boolean)
	Activity.LoadLayout("1")
	Create
	QNH_Enter=False
	For i=0 To 9
		datos(i)=0	
	Next
	If FirstTime Then				'Inicializar el socket para recibir datos
		usocket.Initialize("usocket", 10000, 500)
	End If
End Sub

Sub Resize 'ignore
	cvsHB.Resize(pnHB.Width, pnHB.Height)
	cvsHB.ClearRect(cvsHB.TargetRect)
	cvsHB.Invalidate
End Sub

Sub Create
	MaxSize=Max(100%x,100%y)
	Grueso = MaxSize/300 
	CentroX=100%x/2
	CentroY=100%y/2

' HORIZONTE: El BMP
	X0=CentroX-MaxSize
	Y0=CentroY-MaxSize
	X1=CentroX+MaxSize
	Y1=CentroY+MaxSize
	bmpHB = xui.LoadBitmap(File.DirAssets, "horizonte.gif")
	recHB.Initialize(X0,Y0,X1,Y1)
	cvsHB.Initialize(pnHB)
	
' VELOCIDAD: El BMP (La escala movil)
	pnSB.Top=0%y
	pnSB.Height=100%y
	pnSB.Width=13%x
	bmpSB=xui.LoadBitmap(File.DirAssets, "pru2.gif")
	recSB.Initialize(-2%x, -453%x*(270-Vapp)/300   , 11%x, 453%x*(Vapp+5)/300+50%y  )
	cvsSB.Initialize(pnSB)
	cvsSB.DrawBitmap(bmpSB , recSB)
	
' VELOCIDAD: El NUMERO	
	pnSN.Top=45%y		'El Panel
	pnSN.Left=0%x
	pnSN.Width=10%x
	pnSN.Height=10%y
	lblSN.Top=0%y		'La Etiqueta
	lblSN.Left=0%x
	lblSN.Width=9%x
	lblSN.Height=10%y
	SetTextSize(lblSN, "000")
	
' LOS ARCOS DE COLOR DEL ANEMOMETRO
	pnARCB.Top=40%y		
	pnARCB.Left=10%x
	pnARCB.Width=1.5%x
	pnARCB.Height=453%x*(Vfe-Vso)/300

	pnARCV.Top=30%y
	pnARCV.Left=11%x
	pnARCV.Width=2%x
	pnARCV.Height=453%x*(Vno-Vs)/300

	pnARCA.Top=20%y
	pnARCA.Left=11%x
	pnARCA.Width=2%x
	pnARCA.Height=453%x*(Vne-Vno)/300

	pnARCR.Top=10%y
	pnARCR.Left=11%x
	pnARCR.Width=2%x
	pnARCR.Height=453%x*(300-Vne)/300


' RUMBO: El NUMERO
	pnHEN.Top=0%y		'El Panel
	pnHEN.Left=45%x
	pnHEN.Width=10%x
	pnHEN.Height=10%y
	lblHEN.Top=0%y		'La Etiqueta
	lblHEN.Left=0%x
	lblHEN.Width=9%x
	lblHEN.Height=10%y
	SetTextSize(lblHEN, "000")
		
		
' ALTIMETRO: El NUMERO
	pnALT.Top=45%y		'El Panel
	pnALT.Left=84%x
	pnALT.Width=14%x
	pnALT.Height=10%y
	lblALT.Top=0%y		'La Etiqueta
	lblALT.Left=0%x
	lblALT.Width=13%x
	lblALT.Height=10%y
	SetTextSize(lblALT, "00000")
		
' EL ARCO DEL VARIO
	pnVAR.Top=40%y
	pnVAR.Left=98%x
	pnVAR.Width=2%x
	pnVAR.Height=10%y
		
' EL PANEL PARA LA ESCALA DEL VARIO
	pnVARESC.Top=0%y
	pnVARESC.Left=98%x
	pnVARESC.Width=2%x
	pnVARESC.Height=100%y
	cvsVARESC.Initialize(pnVARESC)
	

'Dibujar la Escala del Vario	
	For i=0 To 8
		cvsVARESC.DrawLine(0%x,i*12.5%y,2%x,i*12.5%y,Colors.White,0.7%y)
	Next
		
' QNH: El NUMERO
	pnQNH.Top=90%y		'El Panel
	pnQNH.Left=85%x
	pnQNH.Width=9%x
	pnQNH.Height=8%y
	lblQNH.Top=1%y		'La Etiqueta
	lblQNH.Left=1%x
	lblQNH.Width=7%x
	lblQNH.Height=6%y
	SetTextSize(lblQNH, "1021")
	btnQNH.Top=90%y		'Boton para introducir el QNH
	btnQNH.Left=85%x
	btnQNH.Width=9%x
	btnQNH.Height=8%y
	btnQNH.Color=Colors.ARGB(0,255,0,0)
	btnQNHMAS.Top=90%y		'Boton + para subir el QNH
	btnQNHMAS.Left=95%x
	btnQNHMAS.Width=4%x
	btnQNHMAS.Height=8%y
	btnQNHMENOS.Top=90%y		'Boton - para bajar el QNH
	btnQNHMENOS.Left=80%x
	btnQNHMENOS.Width=4%x
	btnQNHMENOS.Height=8%y
	
' EL PANEL PARA LA BOLA
	pnBALLESC.Top=92%y
	pnBALLESC.Left=37%x
	pnBALLESC.Width=26%x
	pnBALLESC.Height=7%y
	cvsBALLESC.Initialize(pnBALLESC)
	cvsBALLESC.DrawLine(13%x-3.5%y,0%y,13%x-3.5%y,7%y,Colors.Black,0.3%y) 'Dibujar la Escala de la Bola
	cvsBALLESC.DrawLine(13%x+3.5%y,0%y,13%x+3.5%y,7%y,Colors.Black,0.3%y)
	pnBALL.Top=92%y
	pnBALL.Left=50%x-3.5%y
	pnBALL.Width=7%y
	pnBALL.Height=7%y
	
	
' AP: El boton para activarlo
	pnAP.Top=85%y			'El Panel
	pnAP.Left=15%x
	pnAP.Width=8%x
	pnAP.Height=8%x
	lblAP.Top=0.5%x			'La Etiqueta'
	lblAP.Left=0.5%x
	lblAP.Width=7%x
	lblAP.Height=7%x
	SetTextSize(lblAP, "AP")
	lblAP.Text="AP"
	btnAP.Top=85%y			'Boton para activarlo
	btnAP.Left=15%x
	btnAP.Width=8%x
	btnAP.Height=8%x
	btnAP.Color=Colors.ARGB(0,255,0,0)
	
' TEMPORIZADOR
	Timer1.Initialize("Timer1", 30)
	Timer1.Enabled = True
End Sub

Sub Timer1_Tick
	If red=False Then			'Para la version simulada
		Pitch=Pitch+1
		Roll=Roll+1
		Vapp=Vapp+0.2
		Heading=Heading+1
		Alt=Alt+7
		Vario=Vario+50
		Ball=Ball+1
	End If
	
	Dim A0,A1,B0,B1 As Int
	Dim px,py As Int
	Dim a As Float
	Dim lpitch As Float

'HORIZONTE EL BMP
	lpitch=MaxSize*(Pitch/10)/300
	px=lpitch*Sin( (Roll/10) *0.0174533)
	py=lpitch*Cos( (Roll/10) *0.0174533)
	A0=X0+px
	A1=X1+px
	B0=Y0-py
	B1=Y1-py
	recHB.Left=A0
	recHB.Top=B0
	recHB.Right=A1
	recHB.Bottom=B1
	cvsHB.DrawBitmapRotated(bmpHB , recHB, Roll/10 )
	cvsHB.DrawLine(30%x,100%y/2,70%x,100%y/2,Colors.Gray,MaxSize*0.003)	'linea horizontal
	cvsHB.DrawLine(50%x,40%y,50%x,60%y,Colors.Gray ,MaxSize*0.003)  'linea vertical

'VELOCIDAD EL NUMERO
	lblSN.Text= Round(Vapp)

'VELOCIDAD LA ESCALA
	'recSB.Bottom=453%x*(Vapp+5)/300+50%y  debiera de ser asi pero como el GIF no es exacto hay que ajustarlo:
	'recSB.Top=recSB.Bottom-453%x
	recSB.Bottom=453%x*(Vapp+4)/300+50%y			' sumar 4 kmh en vez de 5
	recSB.Top=recSB.Bottom-451%x					' restar 451%x en vez de 453%x

'	cvsSB.ClearRect(cvsSB.TargetRect)
	cvsSB.drawRect(cvsSB.TargetRect, Colors.ARGB(128,0,0,0), True, 0) 'no sirve exactamente. No respeta capas ni transpaencias
	cvsSB.DrawBitmap(bmpSB , recSB)

'RUMBO EL NUMERO
	lblHEN.Text= Round(Heading)

'LOS ARCOS DEL ANEMOMETRO
	'aQUI hay que meter ahora el recalculo de las posiciones de los arcos.
	'Probablemente haya que calcular los "heights" en funcion de las velocidades de los arcos y ponerlos en el initialize
	pnARCB.Top=453%x*(Vapp-Vfe)/300+50%y
	pnARCV.Top=453%x*(Vapp-Vno)/300+50%y
	pnARCA.Top=453%x*(Vapp-Vne)/300+50%y
	pnARCR.Top=453%x*(Vapp-300)/300+50%y

'RUMBO EL NUMERO
	lblALT.Text= 10*Round(Alt/10)

'VARIO EL ARCO ROSA
	Dim VarioMax=4000 As Float
		
	If Vario>0 Then
		If Vario>VarioMax Then Vario=VarioMax
		pnVAR.Top=50%y-Vario/VarioMax*50%y
		pnVAR.Height=Vario/VarioMax*50%y
	Else
		If Vario< -VarioMax Then Vario=-VarioMax
		pnVAR.Top=50%y
		pnVAR.Height=-Vario/VarioMax*50%y
	End If
	
'QNH el numero.
	lblQNH.Text=QNH
	
'LA BOLA DE RESBALE
	If Ball > 150 Then Ball=150
	If Ball < -150 Then Ball=-150
	pnBALL.Left=50%x-3.5%y+(13%x-3.5%y)*(Ball)/150

'El Boton del AP
	If AP=1 Then
		btnAP.Color=Colors.ARGB(255,255,0,0)
	Else	
		btnAP.Color=Colors.ARGB(0,255,0,0)
	End If
	
	Activity.Invalidate
	
End Sub

Sub usocket_PacketArrived (Packet As UDPPacket)
	red=True	'Para parar la simulacion
	Dim s As String
	s = BytesToString(Packet.Data, Packet.Offset, Packet.Length, "UTF8")
	Dim i,inic,l,d As Int			'Extraemos los datos del paquete UDP
	s=s.Replace("@","")
	s=s.Replace("#",";")
	l=s.Length
	inic=0
	d=0
	For i=0 To l-1
		If s.CharAt(i)=";" Then
			datos(d)= s.SubString2(inic,i)
			inic=i+1
			d=d+1
		End If
	Next
	Pitch=datos(0)
	Roll=datos(1)
	Ball=datos(2)
	Heading=datos(3)/10
	Vapp=datos(4)/10
	If Vapp<10 Then Vapp=0    'Si es menor de 10 Kmh no mostrar la velocidad
	Alt=datos(5)
	Vario=datos(6)
	QNH=datos(7)
	AP=datos(8)
	AP_Heading=datos(9)/10
	AP_Alt=datos(10)
End Sub

Sub SetTextSize(lbl As Label, txt As String)
  Dim dt As Float
  Dim limit = 0.5 As Float
  Dim h As Int

  lbl.Text = txt
  lbl.TextSize = 72
  dt = lbl.TextSize
  h = stu.MeasureMultilineTextHeight(lbl, txt)
  Do While dt > limit Or h > lbl.Height
    dt = dt / 2
    h = stu.MeasureMultilineTextHeight(lbl, txt)
    If h > lbl.Height Then
      lbl.TextSize = lbl.TextSize - dt
    Else
      lbl.TextSize = lbl.TextSize + dt
    End If
  Loop
End Sub


Sub btnQNH_Click
	If QNH_Enter=False Then
		QNH_Enter=True
		btnQNH.Color=Colors.ARGB(255,255,0,0)        '		btnQNH.Color=Colors.ARGB(50,255,0,0)
		btnQNHMAS.Color=Colors.ARGB(255,255,0,0)
		btnQNHMENOS.Color=Colors.ARGB(255,255,0,0)
		btnQNHMAS.Text="+"
		btnQNHMENOS.Text="-"
	Else
		QNH_Enter=False
		btnQNH.Color=Colors.ARGB(0,255,0,0)
		btnQNHMAS.Color=Colors.ARGB(0,255,0,0)
		btnQNHMENOS.Color=Colors.ARGB(0,255,0,0)
		btnQNHMAS.Text=""
		btnQNHMENOS.Text=""
	End If
End Sub

Sub btnQNHMAS_Click
	If QNH_Enter=True Then
		Dim u As UDPPacket
		Dim s As String
		s="QNH+"
'		u.Initialize(s.GetBytes("UTF8"),"192.168.137.255",10000)
		u.Initialize(s.GetBytes("UTF8"),"255.255.255.255",10000)

		usocket.Send(u)
	End If
End Sub

Sub btnQNHMENOS_Click
	If QNH_Enter=True Then
		Dim u As UDPPacket
		Dim s As String
		s="QNH-"

'		u.Initialize(s.GetBytes("UTF8"),"192.168.137.255",10000)
		u.Initialize(s.GetBytes("UTF8"),"255.255.255.255",10000)

		usocket.Send(u)
	End If
End Sub


Sub btnAP_Click
	Dim u As UDPPacket
	Dim s As String
	s="APSet"
'	u.Initialize(s.GetBytes("UTF8"),"192.168.137.255",10000)
	u.Initialize(s.GetBytes("UTF8"),"255.255.255.255",10000)
	usocket.Send(u)
End Sub
