123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495 |
- MODULE OSCEval;
- IMPORT OSC, OSCNet, OSCService, OSCRegistry, IP, UDP, TCP, KernelLog, Strings, TCPServices,
- Network;
- CONST
- ServerIP = "129.132.134.164";
- ServerPort = 1234;
- VAR
- registry: OSCRegistry.OSCRegistry;
- sampleservice: OSCService.OSCService;
- udps: OSCNet.OSCUDPServer;
- tcps: OSCNet.OSCTCPServer;
- ackmessage: OSC.OSCMessage;
- nackmessage: OSC.OSCMessage;
- udpclient: OSCNet.OSCUDPClient;
- tcpclient: OSCNet.OSCTCPClient;
- TYPE
- udpread = OBJECT
- VAR
- stopping: BOOLEAN;
- s: UDP.Socket;
- buffer: POINTER TO ARRAY OF CHAR;
- receivefip: IP.Adr;
- receivefport: LONGINT;
- got: LONGINT;
- res: WORD;
- fip: IP.Adr;
- PROCEDURE &Init*;
- VAR
- res: WORD;
- BEGIN
- stopping := FALSE;
- NEW(buffer, 10000H);
- NEW(s, ServerPort, res);
- IF(res # UDP.Ok) THEN stopping := TRUE; END;
- fip := IP.StrToAdr(ServerIP);
- END Init;
- PROCEDURE Stop;
- BEGIN
- stopping := TRUE;
- END Stop;
- BEGIN {ACTIVE}
- WHILE ~ stopping DO
- s.Receive(buffer^, 0, LEN(buffer), 1000, receivefip, receivefport, got, res);
- IF res = UDP.Ok THEN
- s.Send(fip, receivefport, buffer^, 0, 8, res);
- END;
- END;
- s.Close;
- END udpread;
- tcpagent = OBJECT(TCPServices.Agent);
- VAR
- newpacket: OSC.OSCPacket;
- res: WORD;
- len: LONGINT;
- buffer: POINTER TO ARRAY OF CHAR;
- sizebuf: ARRAY 4 OF CHAR;
- packetsize: LONGINT;
- PROCEDURE &StartOSCAgent*(c: TCP.Connection; s: TCPServices.Service);
- BEGIN
- Start(c,s);
- END StartOSCAgent;
- BEGIN { ACTIVE }
- client.Receive(sizebuf, 0, LEN(sizebuf), 4, len, res);
- IF res # TCP.Ok THEN Terminate; RETURN; END;
- ASSERT(len = 4);
- packetsize := Network.GetNet4(sizebuf, 0);
- (* allocate new buffer *)
- IF (packetsize < 0) OR (packetsize > 10000H) THEN
- KernelLog.String('OSCTCPAgent: Packet too big: '); KernelLog.Hex(packetsize, 10); KernelLog.Ln;
- Terminate; RETURN;
- END;
- NEW(buffer, packetsize);
- client.Receive(buffer^, 0, packetsize, packetsize, len, res);
- IF res # TCP.Ok THEN Terminate; RETURN; END;
- client.Send(buffer^, 0, 8, FALSE, res);
- Terminate;
- END tcpagent;
- tcpread = OBJECT
- VAR
- tcpservice: TCPServices.Service;
- (* starts the server: registers the OSCService s and creates the TCPServices.Service, which listens for connections *)
- PROCEDURE &InitTCPServer*;
- VAR
- res: WORD;
- BEGIN
- NEW(tcpservice, ServerPort, newAgent, res);
- END InitTCPServer;
- (* This function is called by tcpservice to create a new agent *)
- PROCEDURE newAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
- VAR agent: tcpagent;
- BEGIN
- NEW(agent, c, s);
- RETURN agent;
- END newAgent;
- (* Stops the OSCTCPServer. Closes the listening socket and all established connections *)
- PROCEDURE Stop;
- BEGIN
- tcpservice.Stop;
- END Stop;
- END tcpread;
- VAR
- udpr: udpread;
- tcpr: tcpread;
- PROCEDURE StartUDPRead*;
- BEGIN
- NEW(udpr);
- END StartUDPRead;
- PROCEDURE StopUDPRead*;
- BEGIN
- IF udpr # NIL THEN udpr.Stop; udpr := NIL; END;
- END StopUDPRead;
- PROCEDURE StartTCPRead*;
- BEGIN
- NEW(tcpr);
- END StartTCPRead;
- PROCEDURE StopTCPRead*;
- BEGIN
- IF udpr # NIL THEN tcpr.Stop; tcpr := NIL; END;
- END StopTCPRead;
- PROCEDURE MessageTest1(m: OSC.OSCMessage);
- VAR
- res: WORD;
- BEGIN
- (* This Test should receive an empty OSC message *)
- IF (m.argumentcount = 0) & (~ m.noTypeTagString) THEN
- KernelLog.String('MessageTest1: success'); KernelLog.Ln;
- res := m.Return(ackmessage);
- RETURN;
- END;
- res := m.Return(nackmessage);
- KernelLog.String('MessageTest1: failed'); KernelLog.Ln;
- END MessageTest1;
- PROCEDURE SendMsg1*;
- VAR
- m: OSC.OSCMessage;
- res: WORD;
- BEGIN
- NEW(m, Strings.NewString('/tests/M1'));
- IF udpclient # NIL THEN res := udpclient.Send(m); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
- KernelLog.String('Sent message1'); KernelLog.Ln;
- END SendMsg1;
- PROCEDURE MessageTest2(m: OSC.OSCMessage);
- VAR
- res: WORD;
- param: OSC.OSCParamObject;
- BEGIN
- (* This Test should receive an OSC message with one Integer (47) *)
- IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
- IF m.arguments[0] IS OSC.OSCParamInteger THEN
- param := m.arguments[0];
- WITH param: OSC.OSCParamInteger DO
- IF param.integer = 47 THEN
- KernelLog.String('MessageTest2: success'); KernelLog.Ln;
- res := m.Return(ackmessage);
- RETURN;
- END;
- END;
- END;
- END;
- res := m.Return(nackmessage);
- KernelLog.String('MessageTest2: failed'); KernelLog.Ln;
- END MessageTest2;
- PROCEDURE SendMsg2*;
- VAR
- m: OSC.OSCMessage;
- i: OSC.OSCParamInteger;
- res: WORD;
- BEGIN
- NEW(m, Strings.NewString('/tests/M2'));
- NEW(i, 47); m.AddArgument(i);
- IF udpclient # NIL THEN res := udpclient.Send(m); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
- KernelLog.String('Sent message2'); KernelLog.Ln;
- END SendMsg2;
- PROCEDURE MessageTest3(m: OSC.OSCMessage);
- VAR
- res: WORD;
- param: OSC.OSCParamObject;
- BEGIN
- (* This Test should receive an OSC message with one Float (8.25) *)
- IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
- IF m.arguments[0] IS OSC.OSCParamFloat THEN
- param := m.arguments[0];
- WITH param: OSC.OSCParamFloat DO
- IF param.float = 8.25 THEN
- KernelLog.String('MessageTest3: success'); KernelLog.Ln;
- res := m.Return(ackmessage);
- RETURN;
- END;
- END;
- END;
- END;
- res := m.Return(nackmessage);
- KernelLog.String('MessageTest3: failed'); KernelLog.Ln;
- END MessageTest3;
- PROCEDURE SendMsg3*;
- VAR
- m: OSC.OSCMessage;
- p: OSC.OSCParamFloat;
- res: WORD;
- BEGIN
- NEW(m, Strings.NewString('/tests/M3'));
- NEW(p, 8.25); m.AddArgument(p);
- IF udpclient # NIL THEN res := udpclient.Send(m); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
- KernelLog.String('Sent message3'); KernelLog.Ln;
- END SendMsg3;
- PROCEDURE MessageTest4(m: OSC.OSCMessage);
- VAR
- res: WORD;
- param: OSC.OSCParamObject;
- ok: BOOLEAN; i: LONGINT;
- BEGIN
- (* This Test should receive an OSC message with one Blob (01 02 03 ... 20) *)
- IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
- IF m.arguments[0] IS OSC.OSCParamBlob THEN
- param := m.arguments[0];
- WITH param: OSC.OSCParamBlob DO
- IF param.size = 32 THEN
- ok := TRUE;
- FOR i:=0 TO 31 DO
- IF param.blob[i] # CHR(i+1) THEN ok := FALSE; END;
- END;
- IF ok THEN
- KernelLog.String('MessageTest4: success'); KernelLog.Ln;
- res := m.Return(ackmessage);
- RETURN;
- END;
- END;
- END;
- END;
- END;
- res := m.Return(nackmessage);
- KernelLog.String('MessageTest5: failed'); KernelLog.Ln;
- END MessageTest4;
- PROCEDURE SendMsg4*;
- VAR
- m: OSC.OSCMessage;
- p: OSC.OSCParamBlob;
- data: OSC.Blob; i: LONGINT;
- res: WORD;
- BEGIN
- NEW(data, 32);
- FOR i:=0 TO 31 DO data[i] := CHR(i+1); END;
- NEW(m, Strings.NewString('/tests/M4'));
- NEW(p, data, 32); m.AddArgument(p);
- IF udpclient # NIL THEN res := udpclient.Send(m); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
- KernelLog.String('Sent message4'); KernelLog.Ln;
- END SendMsg4;
- PROCEDURE MessageTest5(m: OSC.OSCMessage);
- VAR
- res: WORD;
- param: OSC.OSCParamObject;
- BEGIN
- (* This Test should receive an OSC message with one String (TEST5)^5 *)
- IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
- IF m.arguments[0] IS OSC.OSCParamString THEN
- param := m.arguments[0];
- WITH param: OSC.OSCParamString DO
- IF param.string^ = 'TEST5TEST5TEST5TEST5TEST5' THEN
- KernelLog.String('MessageTest5: success'); KernelLog.Ln;
- res := m.Return(ackmessage);
- RETURN;
- END;
- END;
- END;
- END;
- res := m.Return(nackmessage);
- KernelLog.String('MessageTest5: failed'); KernelLog.Ln;
- END MessageTest5;
- PROCEDURE SendMsg5*;
- VAR
- m: OSC.OSCMessage;
- p: OSC.OSCParamString;
- res: WORD;
- BEGIN
- NEW(m, Strings.NewString('/tests/M5'));
- NEW(p, Strings.NewString('TEST5TEST5TEST5TEST5TEST5')); m.AddArgument(p);
- m.dump(0); KernelLog.Ln;
- IF udpclient # NIL THEN res := udpclient.Send(m); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
- KernelLog.String('Sent message5'); KernelLog.Ln;
- END SendMsg5;
- PROCEDURE SendBundle1*;
- VAR
- b: OSC.OSCBundle;
- tt: OSC.OSCTimeTag;
- res: WORD;
- BEGIN
- NEW(tt); tt.SetImmediately;
- NEW(b, tt, NIL, 0);
- IF udpclient # NIL THEN res := udpclient.Send(b); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
- KernelLog.String('Sent bundle1'); KernelLog.Ln;
- END SendBundle1;
- PROCEDURE SendBundle2*;
- VAR
- m: OSC.OSCMessage;
- b: OSC.OSCBundle;
- tt: OSC.OSCTimeTag;
- i: OSC.OSCParamInteger;
- res: WORD;
- BEGIN
- NEW(tt); tt.SetImmediately;
- NEW(m, Strings.NewString('/tests/M2'));
- NEW(i, 47); m.AddArgument(i);
- NEW(b, tt, NIL, 0); b.AddPacket(m);
- IF udpclient # NIL THEN res := udpclient.Send(b); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
- KernelLog.String('Sent bundle2'); KernelLog.Ln;
- END SendBundle2;
- PROCEDURE SendBundle3*;
- VAR
- m: OSC.OSCMessage;
- b: OSC.OSCBundle;
- tt: OSC.OSCTimeTag;
- i: OSC.OSCParamInteger;
- res: WORD;
- BEGIN
- NEW(tt); tt.SetImmediately;
- NEW(m, Strings.NewString('/tests/M2'));
- NEW(i, 47); m.AddArgument(i);
- NEW(b, tt, NIL, 0);
- FOR res:=0 TO 49 DO
- b.AddPacket(m);
- END;
- IF udpclient # NIL THEN res := udpclient.Send(b); END;
- IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
- KernelLog.String('Sent bundle3'); KernelLog.Ln;
- END SendBundle3;
- PROCEDURE Echo(m: OSC.OSCMessage);
- VAR
- res: WORD;
- BEGIN
- IF ~ m.noTypeTagString THEN
- res := m.Return(ackmessage);
- ELSE
- res := m.Return(nackmessage);
- END;
- END Echo;
- PROCEDURE Ret(m: OSC.OSCMessage);
- VAR
- res: WORD;
- BEGIN
- IF ~ m.noTypeTagString THEN
- res := m.Return(m);
- ELSE
- res := m.Return(nackmessage);
- END;
- END Ret;
- PROCEDURE StartEvalService*;
- VAR
- res: WORD;
- BEGIN
- NEW(registry);
- registry.AddMethod(Strings.NewString('/tests/M1'), MessageTest1);
- registry.AddMethod(Strings.NewString('/tests/M2'), MessageTest2);
- registry.AddMethod(Strings.NewString('/tests/M3'), MessageTest3);
- registry.AddMethod(Strings.NewString('/tests/M4'), MessageTest4);
- registry.AddMethod(Strings.NewString('/tests/M5'), MessageTest5);
- registry.AddMethod(Strings.NewString('/echo'), Echo);
- registry.AddMethod(Strings.NewString('/ret'), Ret);
- NEW(sampleservice, registry);
- NEW(tcps, sampleservice, ServerPort, res);
- NEW(udps, sampleservice, ServerPort, res);
- END StartEvalService;
- PROCEDURE StopEvalService*;
- BEGIN
- KernelLog.String('Stopping OSCTCP ');
- tcps.Stop;
- KernelLog.String('Stopping OSCUDP ');
- udps.Stop;
- KernelLog.String('Stopping OSCService ');
- sampleservice.Stop;
- KernelLog.String(' done'); KernelLog.Ln;
- END StopEvalService;
- PROCEDURE StartUDPClient*;
- VAR
- res: WORD;
- BEGIN
- NEW(udpclient, IP.StrToAdr(ServerIP), ServerPort, UDP.NilPort, res);
- IF res # UDP.Ok THEN
- KernelLog.String('creation failed'); KernelLog.Ln;
- udpclient := NIL;
- RETURN
- END;
- KernelLog.String('Started UDP client'); KernelLog.Ln;
- END StartUDPClient;
- PROCEDURE StopUDPClient*;
- BEGIN
- IF udpclient # NIL THEN
- udpclient.Close;
- udpclient := NIL;
- KernelLog.String('Stopped UDP client'); KernelLog.Ln;
- END;
- END StopUDPClient;
- PROCEDURE StartTCPClient*;
- VAR
- res: WORD;
- BEGIN
- NEW(tcpclient, IP.StrToAdr(ServerIP), ServerPort, TCP.NilPort, res);
- IF res # TCP.Ok THEN
- KernelLog.String('creation failed'); KernelLog.Ln;
- udpclient := NIL;
- RETURN
- END;
- KernelLog.String('Started TCP client'); KernelLog.Ln;
- END StartTCPClient;
- PROCEDURE StopTCPClient*;
- BEGIN
- IF tcpclient # NIL THEN
- tcpclient.Close;
- tcpclient := NIL;
- KernelLog.String('Stopped TCP client'); KernelLog.Ln;
- END;
- END StopTCPClient;
- BEGIN
- NEW(ackmessage, Strings.NewString('/OK'));
- NEW(nackmessage, Strings.NewString('/NOK'));
- END OSCEval.
- PC.Compile OSCStrings.Mod OSC.Mod OSCRegistry.Mod OSCQueue.Mod OSCService.Mod OSCNet.Mod OSCEval.Mod ~
- System.Free OSCEval OSCTest OSCNet OSCService OSCQueue OSCRegistry OSC OSCUtilities ~
- OSCEval.StartEvalService ~
- OSCEval.StopEvalService ~
- OSCEval.StartUDPClient ~
- OSCEval.StopUDPClient ~
- OSCEval.StartTCPClient ~
- OSCEval.StopTCPClient ~
- OSCEval.SendMsg1 ~
- OSCEval.SendMsg2 ~
- OSCEval.SendMsg3 ~
- OSCEval.SendMsg4 ~
- OSCEval.SendMsg5 ~
- OSCEval.SendBundle1 ~
- OSCEval.SendBundle2 ~
- OSCEval.SendBundle3 ~
- OSCEval.StartUDPRead ~
- OSCEval.StopUDPRead ~
- OSCEval.StartTCPRead ~
- OSCEval.StopTCPRead ~
|