' Gambas class file Private Waiting As Boolean Private $iId As Integer Private povel As String 'Tato proměnná obsahuje serverem přijatý povel a bude dekódována Private usb As String 'Sériový port TTY0, USB0, atd. pouze jeden znak 0 až 8 Private preamb As String 'Bajt adresy čipu do preambule Private b0 As String 'Bajt do portu B.0 až B.7 Private b1 As String 'Bajt do portu C ' Program používá algoritmů ServerSocketu, které byly popsány a komentovány v předchozím článku. ' Router přijme tzv. povel z TCP sítě. ' Pokud má povel tvar "Zap1" a "Vyp1", obarví se čtvereček Label1 ' Pokud má povel deset znaků, např. 0118255255, pak první znak je číslo sériového portu, ' znaky 118 znamenají tzv. preambuli, která adresuje konkrétní čipy PICAXE a ' znaky 255 a 255 jsou maximální hodnoty bajtů, které řídí výstupy špiček portů B a C na PICAXE. Public Sub btnListen_Click() If cmbType.Index = 0 Then 'TCP MyServerSocket.Type = Net.Internet ' The port to listen to MyServerSocket.Port = Val(txtPort.Text) ' we start listening MyServerSocket.Listen(cmbMaxClient.Index) Else ' UNIX MyServerSocket.Type = Net.Local ' You could also use Net.Unix MyServerSocket.Path = txtPath.Text MyServerSocket.Listen(cmbMaxClient.Index) End If If MyServerSocket.Status = Net.Active Then ' listening btnListen.Enabled = False btnClose.Enabled = True cmbMaxClient.Enabled = False cmbType.Enabled = False txtPath.Enabled = False End If End Public Sub MyServerSocket_Error() Message.Error("Unable to bind socket") End Public Sub MyServerSocket_Connection(sHost As String) Dim Obj As Socket If MyServerSocket.Status <= Net.Inactive Then Return If cmbType.Index = 0 Then txtLog.Text = txtLog.Text & "Connection request from : " & sHost & Chr(13) & Chr(10) Else txtLog.Text = txtLog.Text & "Connection request accepted" & Chr(13) & Chr(10) End If Obj = MyServerSocket.Accept() Obj.Blocking = False Inc $iId Obj.Tag = [$iId, 0, ""] If Obj.Status = Net.Connected And cmbType.Index = 0 Then txtLog.Text = txtLog.Text & "Connection from " & Obj.RemoteHost & ":" & Obj.RemotePort & " accepted (local port " & Obj.LocalPort & ")" & Chr(13) & Chr(10) End If End Public Sub Socket_Write() Dim hSocket As Socket = Last Dim iInd As Integer 'Debug hSocket;; hSocket.Tag iInd = hSocket.Tag[1] If iInd < 0 Then Return Do Inc iInd If iInd > 1 Then hSocket.Tag[1] = -1 Return Endif 'Debug iInd Try Print #hSocket, iInd & ":" & hSocket.Tag[2] & Space$(512) & "\n"; If Error Then Debug Error.Text Break Endif Loop hSocket.Tag[1] = iInd Catch End Public Sub Socket_Read() Dim sBuf As String Dim iInd As Integer If Last.Status <> Net.Connected Then Return Read #Last, sBuf, Lof(Last) povel = sBuf 'povelu se přiřadí právě vyčtený obsah bufferu Server Socketu Dekoduj_povel() 'jde se do procedury, která dekóduje povel txtLog.Text = "Socket #" & Last.Tag[0] & " --> " & sBuf & "\n" Last.Tag[1] = 0 Last.Tag[2] = sBuf Socket_Write End Public Sub Socket_Ready() txtLog.Text &= "-- Client working --\n" End Public Sub Socket_Closed() txtLog.Text &= "Client #" & Last.Tag[0] & " Closed\n" End Public Sub Form_Open() txtPath.Text = Application.Path & "/" & "gambas" txtPath.Enabled = False cmbType.Index = 0 'cmbType je neviditelný, při startu se nastaví natvrdo volba systémů Linux btnListen_Click() 'Spusti naslouchani ' Přiřadí se hodnoty při otevření Form: usb = "0" preamb = "118" b0 = "0" b1 = "0" ' Přiřadí se hodnoty Baud rychlostí: SP0.Speed = "2400" SP1.Speed = "2400" SP2.Speed = "2400" SP3.Speed = "2400" Try SP0.Open() If Error Then Message("Mas zarizeni v portu?") Endif Try SP1.Open() If Error Then ' Message("Mas zarizeni v portu?") Endif Try SP2.Open() If Error Then ' Message("Mas zarizeni v portu?") Endif Try SP3.Open() If Error Then ' Message("Mas zarizeni v portu?") Endif End Public Sub btnClose_Click() MyServerSocket.Close() btnClose.Enabled = False btnListen.Enabled = True cmbMaxClient.Enabled = True cmbType.Enabled = True cmbType_Click() End Public Sub Form_Close() ' Zavře ServerSocket a sériové porty před zavřením Form: ' MyServerSocket.Close() SP0.Close() SP1.Close() SP2.Close() SP3.Close() End Public Sub btnPause_Click() If Waiting Then MyServerSocket.Resume() btnPause.Text = "Pause" Else MyServerSocket.Pause() btnPause.Text = "Resume" End If Waiting = Not Waiting End Public Sub cmbType_Click() If cmbType.Index = 0 Then txtPort.Enabled = True txtPath.Enabled = False Else txtPort.Enabled = False txtPath.Enabled = True End If End Public Sub Dekoduj_povel() 'Procedura dekóduje povel usb = Left$(povel) preamb = Mid$(povel, 2, 3) b0 = Mid$(povel, 5, 3) b1 = Right$(povel, 3) If povel = "Zap1" Then Label1.Background = &H00FF00 If povel = "Vyp1" Then Label1.Background = &HFF0000 If usb = "0" Then Serial0 If usb = "1" Then Serial1 If usb = "2" Then Serial2 If usb = "3" Then Serial3 End Public Sub Serial0() SP0.Begin() SP0_Write_byte Try SP0.Send() If Error Then Message("Zkontroluj zarizeni na portu!") Endif End Public Sub Serial1() SP1.Begin() SP1_Write_byte Try SP1.Send() If Error Then Message("Zkontroluj zarizeni na portu!") Endif End Public Sub Serial2() SP2.Begin() SP2_Write_byte Try SP2.Send() If Error Then Message("Zkontroluj zarizeni na portu!") Endif End Public Sub Serial3() SP3.Begin() SP3_Write_byte Try SP3.Send() If Error Then Message("Zkontroluj zarizeni na portu!") Endif End Public Sub SP0_Write_byte() ' zapise prvni 4 byty, tedy celou preambuli protokolu po bytech 254,254,preamb,224: Write #SP0, 254 As Byte Write #SP0, 254 As Byte Write #SP0, preamb As Byte ' tento bajt preamb adresuje čip PICAXE desky Write #SP0, 224 As Byte Write #SP0, b0 As Byte ' zapise prvni bajt dat Write #SP0, b1 As Byte ' zapise druhy bajt dat End Public Sub SP1_Write_byte() ' zapise prvni 4 byty, tedy celou preambuli protokolu po bytech 254,254,preamb,224: Write #SP1, 254 As Byte Write #SP1, 254 As Byte Write #SP1, preamb As Byte ' tento bajt preamb adresuje čip PICAXE desky Write #SP1, 224 As Byte Write #SP1, b0 As Byte ' zapise prvni bajt dat Write #SP1, b1 As Byte ' zapise druhy bajt dat End Public Sub SP2_Write_byte() ' zapise prvni 4 byty, tedy celou preambuli protokolu po bytech 254,254,preamb,224: Write #SP2, 254 As Byte Write #SP2, 254 As Byte Write #SP2, preamb As Byte ' tento bajt preamb adresuje čip PICAXE desky Write #SP2, 224 As Byte Write #SP2, b0 As Byte ' zapise prvni bajt dat Write #SP2, b1 As Byte ' zapise druhy bajt dat End Public Sub SP3_Write_byte() ' zapise prvni 4 byty, tedy celou preambuli protokolu po bytech 254,254,preamb,224: Write #SP3, 254 As Byte Write #SP3, 254 As Byte Write #SP3, preamb As Byte ' tento bajt preamb adresuje čip PICAXE desky Write #SP3, 224 As Byte Write #SP3, b0 As Byte ' zapise prvni bajt dat Write #SP3, b1 As Byte ' zapise druhy bajt dat End