


' Gambas class file

Private CurrentProtocol As Integer
Private CurrentHost As Integer

Public Sub Form_Open()
  FMain.Center
  FMain.Resizable = False  
  cmbHost.Text = cmbHost.List[cmbHost.Index]  
  lblStatus.Foreground = Color.Gray
  lblStatus.Caption = "Verbindung zum Zeit-Server ist geschlossen."  
End ' Form_Open

Public Sub TCPIP_Socket_Ready()
  TimeOut.Enabled = False
  lblStatus.Text = "Verbunden zum Pfad " & TCPIP_Socket.Path
  FMain.Enabled = True
  Set_Interface(True)
End ' TCPIP_Socket_Ready()

Public Sub TCPIP_Socket_Closed()
  lblStatus.Foreground = Color.Gray
  lblStatus.Caption = "Verbindung zum Zeit-Server ist geschlossen."
  FMain.Enabled = True
  Set_Interface(False)
End ' TCPIP_Socket_Closed

Public Sub TCPIP_Socket_Found()
  lblStatus.Caption = "Verbindung zum Zeit-Server wird aufgebaut ..."
End ' TCPIP_Socket_Found

Public Sub TCPIP_Socket_Read()
  Dim sResult, sDatum, sZeit As String
  Dim i As Integer
  Dim iNTPSekunden, mys, mys2 As Long
  Dim iCurrentSekunden As Integer
  Dim iSekunden19001970 As Long
  Dim dDate1970, dCurrentDateGMT As Date
  
  
' Die Zeitstempel im NTP sind 64 Bits lang. 
' 32 Bits kodieren die iNTPSekunden seit dem 1. Januar 1900 00:00:00 Uhr (!)
  
' mys = DateDiff("01/01/1900", "01/01/1935", gb.Second) 
' mys2 = DateDiff("01/01/1935", "01/01/1970 ", gb.Second)
' Print mys;;mys2
' Anzahl der Sekunden zwischen 1900-01-01 und 1970-01-01 = 2208988800.
  
  If TCPIP_Socket.Status = Net.Connected Then
'      txaErgebnisse.Text &= "Anzahl Daten-Bytes = " & Lof(TCPIP_Socket) & Chr(10)
     Read #TCPIP_Socket, sResult, Lof(TCPIP_Socket)

   ' Umwandlung des übermittelten 32-Bit-Datenwortes in eine ganze Zahl
     For i = 1 To Len(sResult)
'          txaErgebnisse.Text &= "Byte_" & CStr(i) & " = " & String.Chr(Asc(Mid$(sResult, i, 1))) & " | " & Asc(Mid$(sResult, i, 1)) & Chr(10)
         iNTPSekunden = iNTPSekunden * 256 + Asc(Mid$(sResult, i, 1))
     Next ' i-Zähler
  Endif ' TCPIP_Socket.Status = Net.Connected?  
 ' Alternative: Anzahl der Sekunden = b3*256³ + b2*256² + b1*256 + b0
  
  iSekunden19001970 = DateDiff("01/01/1900", "01/01/1935", gb.Second) + DateDiff("01/01/1935", "01/01/1970 ", gb.Second)
  iCurrentSekunden = iNTPSekunden - iSekunden19001970
 ' Print iCurrentSekunden
  
  dDate1970 = Date(1970, 01, 01, 0, 0, 0)
  dCurrentDateGMT = DateAdd(dDate1970, gb.Second, iCurrentSekunden + 3600)
   
  ' txaErgebnisse.Text &= "Datum und (Server-)Zeit: " & dCurrentDateGMT & Chr(10)
  ' txaErgebnisse.Text &= "Datum: " & Date(CFloat(dCurrentDateGMT)) & Chr(10)
  ' txaErgebnisse.Text &= "Heute ist " & Format$(dCurrentDateGMT, "dddd dd. mmmm yyyy") & Chr(10)
  ' 'txaErgebnisse.Text &= "Heute ist " & Format$(dCurrentDateGMT, "dddd") & ", der " & Format$(dCurrentDateGMT, "dd. mmmm yyyy") & Chr(10)
  ' sDatum = "Heute ist " & Format$(dCurrentDateGMT, "dddd") & ", der " & Format$(dCurrentDateGMT, "d. mmmm yyyy") & Chr(10)
  ' sZeit = Format$(Time(dCurrentDateGMT), "hh:nn:ss") & Chr(10)
  sDatum = Format$(dCurrentDateGMT, "dddd") & ", " & Format$(dCurrentDateGMT, "d. mmmm yyyy")
  sZeit = Format$(Time(dCurrentDateGMT), "hh:nn:ss")
  txbDateTime.Text = sDatum & " - " & sZeit


End ' TCPIP_Socket_Read

Public Sub TCPIP_Socket_Error()
  Select Case TCPIP_Socket.Status
    Case Net.CannotCreateSocket
      lblStatus.Text = "Das System verbietet das Generieren einer IP-Schnittstelle zum Zeit-Server."
    Case Net.HostNotFound
      lblStatus.Text = "Zeit-Server nicht gefunden."
    Case Net.ConnectionRefused
      lblStatus.Text = "Verbindung zum Zeit-Server nicht möglich."
    Case Net.CannotRead
      lblStatus.Text = "Fehler beim Lesen der Daten vom Zeit-Server."
    Case Net.CannotWrite
      lblStatus.Text = "Fehler beim Schreiben der Daten vom Zeit-Server."
  End Select
  Set_Interface(False)
End ' TCPIP_Socket_Error

Private Sub Set_Interface(bState As Boolean)
  btnConnect.Enabled = Not bState
  TextBox2.Enabled = Not bState
  btnDisconnect.Enabled = bState
  TimeOut.Enabled = bState
End ' Set_Interface(...)

Public Sub btnConnect_Click()
  txbDateTime.Clear
  lblStatus.Foreground = Color.Black
  btnConnect.Enabled = False
' TCP-Verbindung
  TCPIP_Socket.Host = cmbHost.Text
  TCPIP_Socket.Port = Val(TextBox2.Text)
  TCPIP_Socket.Connect()

  If TCPIP_Socket.Status > Net.Inactive Then
     btnDisconnect.Enabled = True
     lblStatus.Text = "Verbindung zum Zeit-Server wird aufgebaut ..."
     TimeOut.Delay = 5000 ' TimeOut = 5 Sekunden
     TimeOut.Enabled = True
  Endif ' TCPIP_Socket.Status > Net.Inactive ?
  btnConnect.SetFocus
End ' btnConnect_Click

Public Sub TimeOut_Timer()
' *****************************
' TIMEOUT
' *****************************
  Me.Enabled = True
  TimeOut.Enabled = False
  If TCPIP_Socket.Status <> Net.Connected Then
     Close TCPIP_Socket
     Set_Interface(False)
     lblStatus.Text = "T I M E O U T"
  Endif ' TCPIP_Socket.Status <> Net.Connected ?
End ' Timer1_Timer

Public Sub btnDisconnect_Click()
  Close TCPIP_Socket
  Set_Interface(False)
  lblStatus.Text = "Die Verbindung wurde vom User abgebrochen!"
End ' btnDisconnect_Click()

Public Sub cmbHost_Click()
  CurrentHost = cmbHost.Index
End ' cmbHost_Click()

Public Sub cmbHost_Change()
  If TCPIP_Socket.Status > 0 Then Close #TCPIP_Socket
  lblStatus.Foreground = Color.Gray
  lblStatus.Caption = "Verbindung zum Zeit-Server ist geschlossen."  
  txbDateTime.Clear
End ' cmbHost_Change()

Public Sub Form_Close()
  If TCPIP_Socket.Status > 0 Then Close #TCPIP_Socket
End ' Form_Close

Public Sub btnProgrammEnde_Click()
  FMain.Close
End ' btnProgrammEnde_Click()

