diff --git a/flash/administra/admflash.spin b/flash/administra/admflash.spin index 9d86a70..2ca0f9d 100644 --- a/flash/administra/admflash.spin +++ b/flash/administra/admflash.spin @@ -2482,6 +2482,21 @@ DAT strNVRAMFile byte "nvram.sav",0 'contains the 56 bytes of NVRAM, if RTC is not available +PRI lan_txflush | handleidx +''funktionsgruppe : lan +''funktion : Warten, bis Sendepuffer geleert ist +''eingabe : - +''ausgabe : - +''busprotokoll : [070][get.handleidx][put.ok] +'' : handleidx - lfd. Nr. der Verbindung +'' : ok - Sendepuffer leer (Wert egal) + + handleidx := bus_getchar + + sock.flush(sockhandle[handleidx]) + + bus_putchar(TRUE) + PRI lan_start | hiveid, hivestr, strpos, macpos, i, a ''funktionsgruppe : lan ''funktion : Netzwerk starten @@ -2586,20 +2601,34 @@ PRI lan_connect | ipaddr, remoteport, handle, handleidx, i PRI lan_listen | port, handle, handleidx, i ''funktionsgruppe : lan ''funktion : Port für eingehende TCP-Verbindung öffnen +'' bei bereits bestehendem Socket nur handleidx zurücksenden ''eingabe : - ''ausgabe : - -''busprotokoll : [074][sub_getword.port][put.handleidx] +''busprotokoll : [074][get.handleidx][sub_getword.port][put.handleidx] +'' : handleidx - lfd. Nr. der bestehenden Verbindung ($FF wenn neu) '' : port - zu öffnende Portnummer '' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle) + handleidx := bus_getchar port := sub_getword - 'freien Pufferabschnitt suchen + if handleidx <> $FF 'bestehender (kein neuer) Socket + if sock.isValidHandle(sockhandle[handleidx]) 'Socket gültig + bus_putchar(handleidx) 'alten handleidx zurücksenden + return + i := 0 - repeat sock#sNumSockets - if bufidx[i] == $FF '0xFF: nicht zugewiesen - quit - i++ + if handleidx == $FF 'neue Verbindung + repeat sock#sNumSockets + 'freien Pufferabschnitt suchen + if bufidx[i] == $FF '0xFF: nicht zugewiesen + quit + i++ + else 'bereits aufgebaute, abgebrochende Verbindung + repeat sock#sNumSockets + if bufidx[i] == handleidx 'zum Handle gehörender Buffer + quit + i++ ifnot (handle := sock.listen(port, @bufmain[i*rxlen], rxlen, @buftx[i*txlen], txlen)) == -102 handleidx := handle.byte[0] 'extract the handle index from the lower 8 bits @@ -2642,9 +2671,10 @@ PRI lan_close | handleidx, i 'reservierten Pufferabschnitt freigeben i := 0 repeat sock#sNumSockets - if bufidx[i++] == handleidx '0xFF: nicht zugewiesen - bufidx[i++] := $FF + if bufidx[i] == handleidx '0xFF: nicht zugewiesen + bufidx[i] := $FF quit + i++ PRI lan_rxtime | handleidx, timeout, t, rxbyte diff --git a/lib/glob-con.spin b/lib/glob-con.spin index f9adb47..aa0c445 100644 --- a/lib/glob-con.spin +++ b/lib/glob-con.spin @@ -204,7 +204,8 @@ A_BLT = %00000000_00000000_00001000_00000000 a_DCF_GetYear '77 ' ---------------------------------------------- LAN-FUNKTIONEN -#81, a_lanStart 'Start Network +#80, a_lanTXFlush 'Warten, bis Sendepuffer geleert ist + a_lanStart 'Start Network a_lanStop 'Stop Network a_lanConnect 'ausgehende TCP-Verbindung öffnen a_lanListen 'auf eingehende TCP-Verbindung lauschen diff --git a/lib/reg-ios.spin b/lib/reg-ios.spin index 5ba7913..13b5531 100644 --- a/lib/reg-ios.spin +++ b/lib/reg-ios.spin @@ -1036,6 +1036,19 @@ PUB rtcTest: available 'Test if RTC Chip is ava CON ''------------------------------------------------- LAN_FUNKTIONEN +PUB lan_txflush(handleidx) +''funktionsgruppe : lan +''funktion : Warten, bis Sendepuffer geleert ist +''eingabe : - +''ausgabe : - +''busprotokoll : [070][put.handleidx][get.ok] +'' : handleidx - lfd. Nr. der Verbindung +'' : ok - Sendepuffer leer (Wert egal) + + bus_putchar1(gc#a_lanTXFlush) + bus_putchar1(handleidx) + bus_getchar1 + PUB lanstart 'LAN starten ''funktionsgruppe : lan ''funktion : Netzwerk starten @@ -1075,16 +1088,18 @@ PUB lan_connect(ipaddr, remoteport): handleidx bus_putword1(remoteport) handleidx := bus_getchar1 -PUB lan_listen(port): handleidx +PUB lan_listen(oldhandleidx, port): handleidx ''funktionsgruppe : lan ''funktion : Port für eingehende TCP-Verbindung öffnen ''eingabe : - ''ausgabe : - -''busprotokoll : [074][sub_putword.port][get.handleidx] -'' : port - zu öffnende Portnummer -'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle) +''busprotokoll : [074][put.handleidx][sub_putword.port][get.handleidx] +'' : oldhandleidx - lfd. Nr. der bestehenden Verbindung ($FF wenn neu) +'' : port - zu öffnende Portnummer +'' : handleidx - lfd. Nr. der Verbindung (index des kompletten handle) bus_putchar1(gc#a_lanListen) + bus_putchar1(oldhandleidx) bus_putword1(port) handleidx := bus_getchar1 diff --git a/system/regnatix/websrv.spin b/system/regnatix/websrv.spin index 5b79915..51f8bbc 100644 --- a/system/regnatix/websrv.spin +++ b/system/regnatix/websrv.spin @@ -33,42 +33,262 @@ Notizen : OBJ ios: "reg-ios" gc : "glob-con" + str: "glob-string" + num: "glob-numbers" CON _CLKMODE = XTAL1 + PLL16X _XINFREQ = 5_000_000 +#define __DEBUG + VAR + byte handleidx 'Handle web connection + + byte reqstr[32] ' request string + byte webbuff[128] ' incoming header buffer + + long cog, random_value PUB main + rr_start + ios.start ifnot (ios.admgetspec & gc#A_LAN) - ios.sddmset(ios#DM_USER) 'u-marker setzen - ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren - ios.admload(string("admnet.adm")) 'versuche, admnet zu laden - ios.sddmact(ios#DM_USER) 'u-marker aktivieren - ifnot (ios.admgetspec & gc#A_LAN) 'wenn Laden fehlgeschlagen + ios.sddmset(ios#DM_USER) 'u-marker setzen + ios.sddmact(ios#DM_SYSTEM) 's-marker aktivieren + ios.admload(string("admnet.adm")) 'versuche, admnet zu laden + ios.sddmact(ios#DM_USER) 'u-marker aktivieren + ifnot (ios.admgetspec & gc#A_LAN) 'wenn Laden fehlgeschlagen ios.print(@strNoNetwork) - ios.stop 'Ende + ios.stop 'Ende ios.printnl + ios.lanstart 'LAN-Treiber initialisieren (eigene IP-Adresse usw. setzen) + handleidx := $FF + +#ifdef __DEBUG + ios.print(@strWaitConnection) +#endif + repeat + if (handleidx := ios.lan_listen(handleidx,80)) == $FF 'Empfangs-Socket auf Port 80 öffnen + ios.print(@strErrorNoSock) + quit + if ios.lan_isconnected(handleidx) 'bei bestehender Verbindung... +#ifdef __DEBUG + ios.print(@strConnected) +#endif + if webThread == 0 + ios.lan_txflush(handleidx) + ios.lan_close(handleidx) + handleidx := $FF ios.stop +PRI webThread | i, j, uri, args + + if webReadLine == 0 ' read the first header, quit if it is empty + return 0 + + bytemove(@reqstr, @webbuff, 32) ' copy the header to a temporary request string for later processing + + ' obtain get arguments + if (i := indexOf(@reqstr, string(".cgi?"))) <> -1 ' was the request for a *.cgi script with arguments? + args := @reqstr[i + 5] ' extract the argument + if (j := indexOf(args, string("="))) <> -1 ' find the end of the argument + byte[args][j] := 0 ' string termination + + ' read the rest of the headers + repeat until webReadLine == 0 ' read the rest of the headers, throwing them away + + sendStr(string("HTTP/1.0 200 OK",13,10,13,10)) ' print the HTTP header + + if indexOf(@reqstr, string("ajax.js")) <> -1 ' ajax.js + sendStr(@ajaxjs) + elseif indexOf(@reqstr, string("rand.cgi")) <> -1 ' rand.cgi + sendStr(str.trimCharacters(num.ToStr(long[rr_random_ptr], num#DEC))) + elseif indexOf(@reqstr, string("img.bin")) <> -1 ' img.bin + ios.lan_txdata(handleidx, 0, 32768) + else + ' default page + sendStr(string("
It Works!