OSCEval.Mod 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  1. MODULE OSCEval;
  2. IMPORT OSC, OSCNet, OSCService, OSCRegistry, IP, UDP, TCP, KernelLog, Strings, TCPServices,
  3. Network;
  4. CONST
  5. ServerIP = "129.132.134.164";
  6. ServerPort = 1234;
  7. VAR
  8. registry: OSCRegistry.OSCRegistry;
  9. sampleservice: OSCService.OSCService;
  10. udps: OSCNet.OSCUDPServer;
  11. tcps: OSCNet.OSCTCPServer;
  12. ackmessage: OSC.OSCMessage;
  13. nackmessage: OSC.OSCMessage;
  14. udpclient: OSCNet.OSCUDPClient;
  15. tcpclient: OSCNet.OSCTCPClient;
  16. TYPE
  17. udpread = OBJECT
  18. VAR
  19. stopping: BOOLEAN;
  20. s: UDP.Socket;
  21. buffer: POINTER TO ARRAY OF CHAR;
  22. receivefip: IP.Adr;
  23. receivefport: LONGINT;
  24. got: LONGINT;
  25. res: WORD;
  26. fip: IP.Adr;
  27. PROCEDURE &Init*;
  28. VAR
  29. res: WORD;
  30. BEGIN
  31. stopping := FALSE;
  32. NEW(buffer, 10000H);
  33. NEW(s, ServerPort, res);
  34. IF(res # UDP.Ok) THEN stopping := TRUE; END;
  35. fip := IP.StrToAdr(ServerIP);
  36. END Init;
  37. PROCEDURE Stop;
  38. BEGIN
  39. stopping := TRUE;
  40. END Stop;
  41. BEGIN {ACTIVE}
  42. WHILE ~ stopping DO
  43. s.Receive(buffer^, 0, LEN(buffer), 1000, receivefip, receivefport, got, res);
  44. IF res = UDP.Ok THEN
  45. s.Send(fip, receivefport, buffer^, 0, 8, res);
  46. END;
  47. END;
  48. s.Close;
  49. END udpread;
  50. tcpagent = OBJECT(TCPServices.Agent);
  51. VAR
  52. newpacket: OSC.OSCPacket;
  53. res: WORD;
  54. len: LONGINT;
  55. buffer: POINTER TO ARRAY OF CHAR;
  56. sizebuf: ARRAY 4 OF CHAR;
  57. packetsize: LONGINT;
  58. PROCEDURE &StartOSCAgent*(c: TCP.Connection; s: TCPServices.Service);
  59. BEGIN
  60. Start(c,s);
  61. END StartOSCAgent;
  62. BEGIN { ACTIVE }
  63. client.Receive(sizebuf, 0, LEN(sizebuf), 4, len, res);
  64. IF res # TCP.Ok THEN Terminate; RETURN; END;
  65. ASSERT(len = 4);
  66. packetsize := Network.GetNet4(sizebuf, 0);
  67. (* allocate new buffer *)
  68. IF (packetsize < 0) OR (packetsize > 10000H) THEN
  69. KernelLog.String('OSCTCPAgent: Packet too big: '); KernelLog.Hex(packetsize, 10); KernelLog.Ln;
  70. Terminate; RETURN;
  71. END;
  72. NEW(buffer, packetsize);
  73. client.Receive(buffer^, 0, packetsize, packetsize, len, res);
  74. IF res # TCP.Ok THEN Terminate; RETURN; END;
  75. client.Send(buffer^, 0, 8, FALSE, res);
  76. Terminate;
  77. END tcpagent;
  78. tcpread = OBJECT
  79. VAR
  80. tcpservice: TCPServices.Service;
  81. (* starts the server: registers the OSCService s and creates the TCPServices.Service, which listens for connections *)
  82. PROCEDURE &InitTCPServer*;
  83. VAR
  84. res: WORD;
  85. BEGIN
  86. NEW(tcpservice, ServerPort, newAgent, res);
  87. END InitTCPServer;
  88. (* This function is called by tcpservice to create a new agent *)
  89. PROCEDURE newAgent(c: TCP.Connection; s: TCPServices.Service): TCPServices.Agent;
  90. VAR agent: tcpagent;
  91. BEGIN
  92. NEW(agent, c, s);
  93. RETURN agent;
  94. END newAgent;
  95. (* Stops the OSCTCPServer. Closes the listening socket and all established connections *)
  96. PROCEDURE Stop;
  97. BEGIN
  98. tcpservice.Stop;
  99. END Stop;
  100. END tcpread;
  101. VAR
  102. udpr: udpread;
  103. tcpr: tcpread;
  104. PROCEDURE StartUDPRead*;
  105. BEGIN
  106. NEW(udpr);
  107. END StartUDPRead;
  108. PROCEDURE StopUDPRead*;
  109. BEGIN
  110. IF udpr # NIL THEN udpr.Stop; udpr := NIL; END;
  111. END StopUDPRead;
  112. PROCEDURE StartTCPRead*;
  113. BEGIN
  114. NEW(tcpr);
  115. END StartTCPRead;
  116. PROCEDURE StopTCPRead*;
  117. BEGIN
  118. IF udpr # NIL THEN tcpr.Stop; tcpr := NIL; END;
  119. END StopTCPRead;
  120. PROCEDURE MessageTest1(m: OSC.OSCMessage);
  121. VAR
  122. res: WORD;
  123. BEGIN
  124. (* This Test should receive an empty OSC message *)
  125. IF (m.argumentcount = 0) & (~ m.noTypeTagString) THEN
  126. KernelLog.String('MessageTest1: success'); KernelLog.Ln;
  127. res := m.Return(ackmessage);
  128. RETURN;
  129. END;
  130. res := m.Return(nackmessage);
  131. KernelLog.String('MessageTest1: failed'); KernelLog.Ln;
  132. END MessageTest1;
  133. PROCEDURE SendMsg1*;
  134. VAR
  135. m: OSC.OSCMessage;
  136. res: WORD;
  137. BEGIN
  138. NEW(m, Strings.NewString('/tests/M1'));
  139. IF udpclient # NIL THEN res := udpclient.Send(m); END;
  140. IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
  141. KernelLog.String('Sent message1'); KernelLog.Ln;
  142. END SendMsg1;
  143. PROCEDURE MessageTest2(m: OSC.OSCMessage);
  144. VAR
  145. res: WORD;
  146. param: OSC.OSCParamObject;
  147. BEGIN
  148. (* This Test should receive an OSC message with one Integer (47) *)
  149. IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
  150. IF m.arguments[0] IS OSC.OSCParamInteger THEN
  151. param := m.arguments[0];
  152. WITH param: OSC.OSCParamInteger DO
  153. IF param.integer = 47 THEN
  154. KernelLog.String('MessageTest2: success'); KernelLog.Ln;
  155. res := m.Return(ackmessage);
  156. RETURN;
  157. END;
  158. END;
  159. END;
  160. END;
  161. res := m.Return(nackmessage);
  162. KernelLog.String('MessageTest2: failed'); KernelLog.Ln;
  163. END MessageTest2;
  164. PROCEDURE SendMsg2*;
  165. VAR
  166. m: OSC.OSCMessage;
  167. i: OSC.OSCParamInteger;
  168. res: WORD;
  169. BEGIN
  170. NEW(m, Strings.NewString('/tests/M2'));
  171. NEW(i, 47); m.AddArgument(i);
  172. IF udpclient # NIL THEN res := udpclient.Send(m); END;
  173. IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
  174. KernelLog.String('Sent message2'); KernelLog.Ln;
  175. END SendMsg2;
  176. PROCEDURE MessageTest3(m: OSC.OSCMessage);
  177. VAR
  178. res: WORD;
  179. param: OSC.OSCParamObject;
  180. BEGIN
  181. (* This Test should receive an OSC message with one Float (8.25) *)
  182. IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
  183. IF m.arguments[0] IS OSC.OSCParamFloat THEN
  184. param := m.arguments[0];
  185. WITH param: OSC.OSCParamFloat DO
  186. IF param.float = 8.25 THEN
  187. KernelLog.String('MessageTest3: success'); KernelLog.Ln;
  188. res := m.Return(ackmessage);
  189. RETURN;
  190. END;
  191. END;
  192. END;
  193. END;
  194. res := m.Return(nackmessage);
  195. KernelLog.String('MessageTest3: failed'); KernelLog.Ln;
  196. END MessageTest3;
  197. PROCEDURE SendMsg3*;
  198. VAR
  199. m: OSC.OSCMessage;
  200. p: OSC.OSCParamFloat;
  201. res: WORD;
  202. BEGIN
  203. NEW(m, Strings.NewString('/tests/M3'));
  204. NEW(p, 8.25); m.AddArgument(p);
  205. IF udpclient # NIL THEN res := udpclient.Send(m); END;
  206. IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
  207. KernelLog.String('Sent message3'); KernelLog.Ln;
  208. END SendMsg3;
  209. PROCEDURE MessageTest4(m: OSC.OSCMessage);
  210. VAR
  211. res: WORD;
  212. param: OSC.OSCParamObject;
  213. ok: BOOLEAN; i: LONGINT;
  214. BEGIN
  215. (* This Test should receive an OSC message with one Blob (01 02 03 ... 20) *)
  216. IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
  217. IF m.arguments[0] IS OSC.OSCParamBlob THEN
  218. param := m.arguments[0];
  219. WITH param: OSC.OSCParamBlob DO
  220. IF param.size = 32 THEN
  221. ok := TRUE;
  222. FOR i:=0 TO 31 DO
  223. IF param.blob[i] # CHR(i+1) THEN ok := FALSE; END;
  224. END;
  225. IF ok THEN
  226. KernelLog.String('MessageTest4: success'); KernelLog.Ln;
  227. res := m.Return(ackmessage);
  228. RETURN;
  229. END;
  230. END;
  231. END;
  232. END;
  233. END;
  234. res := m.Return(nackmessage);
  235. KernelLog.String('MessageTest5: failed'); KernelLog.Ln;
  236. END MessageTest4;
  237. PROCEDURE SendMsg4*;
  238. VAR
  239. m: OSC.OSCMessage;
  240. p: OSC.OSCParamBlob;
  241. data: OSC.Blob; i: LONGINT;
  242. res: WORD;
  243. BEGIN
  244. NEW(data, 32);
  245. FOR i:=0 TO 31 DO data[i] := CHR(i+1); END;
  246. NEW(m, Strings.NewString('/tests/M4'));
  247. NEW(p, data, 32); m.AddArgument(p);
  248. IF udpclient # NIL THEN res := udpclient.Send(m); END;
  249. IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
  250. KernelLog.String('Sent message4'); KernelLog.Ln;
  251. END SendMsg4;
  252. PROCEDURE MessageTest5(m: OSC.OSCMessage);
  253. VAR
  254. res: WORD;
  255. param: OSC.OSCParamObject;
  256. BEGIN
  257. (* This Test should receive an OSC message with one String (TEST5)^5 *)
  258. IF (m.argumentcount = 1) & (~ m.noTypeTagString) THEN
  259. IF m.arguments[0] IS OSC.OSCParamString THEN
  260. param := m.arguments[0];
  261. WITH param: OSC.OSCParamString DO
  262. IF param.string^ = 'TEST5TEST5TEST5TEST5TEST5' THEN
  263. KernelLog.String('MessageTest5: success'); KernelLog.Ln;
  264. res := m.Return(ackmessage);
  265. RETURN;
  266. END;
  267. END;
  268. END;
  269. END;
  270. res := m.Return(nackmessage);
  271. KernelLog.String('MessageTest5: failed'); KernelLog.Ln;
  272. END MessageTest5;
  273. PROCEDURE SendMsg5*;
  274. VAR
  275. m: OSC.OSCMessage;
  276. p: OSC.OSCParamString;
  277. res: WORD;
  278. BEGIN
  279. NEW(m, Strings.NewString('/tests/M5'));
  280. NEW(p, Strings.NewString('TEST5TEST5TEST5TEST5TEST5')); m.AddArgument(p);
  281. m.dump(0); KernelLog.Ln;
  282. IF udpclient # NIL THEN res := udpclient.Send(m); END;
  283. IF tcpclient # NIL THEN res := tcpclient.Send(m); END;
  284. KernelLog.String('Sent message5'); KernelLog.Ln;
  285. END SendMsg5;
  286. PROCEDURE SendBundle1*;
  287. VAR
  288. b: OSC.OSCBundle;
  289. tt: OSC.OSCTimeTag;
  290. res: WORD;
  291. BEGIN
  292. NEW(tt); tt.SetImmediately;
  293. NEW(b, tt, NIL, 0);
  294. IF udpclient # NIL THEN res := udpclient.Send(b); END;
  295. IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
  296. KernelLog.String('Sent bundle1'); KernelLog.Ln;
  297. END SendBundle1;
  298. PROCEDURE SendBundle2*;
  299. VAR
  300. m: OSC.OSCMessage;
  301. b: OSC.OSCBundle;
  302. tt: OSC.OSCTimeTag;
  303. i: OSC.OSCParamInteger;
  304. res: WORD;
  305. BEGIN
  306. NEW(tt); tt.SetImmediately;
  307. NEW(m, Strings.NewString('/tests/M2'));
  308. NEW(i, 47); m.AddArgument(i);
  309. NEW(b, tt, NIL, 0); b.AddPacket(m);
  310. IF udpclient # NIL THEN res := udpclient.Send(b); END;
  311. IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
  312. KernelLog.String('Sent bundle2'); KernelLog.Ln;
  313. END SendBundle2;
  314. PROCEDURE SendBundle3*;
  315. VAR
  316. m: OSC.OSCMessage;
  317. b: OSC.OSCBundle;
  318. tt: OSC.OSCTimeTag;
  319. i: OSC.OSCParamInteger;
  320. res: WORD;
  321. BEGIN
  322. NEW(tt); tt.SetImmediately;
  323. NEW(m, Strings.NewString('/tests/M2'));
  324. NEW(i, 47); m.AddArgument(i);
  325. NEW(b, tt, NIL, 0);
  326. FOR res:=0 TO 49 DO
  327. b.AddPacket(m);
  328. END;
  329. IF udpclient # NIL THEN res := udpclient.Send(b); END;
  330. IF tcpclient # NIL THEN res := tcpclient.Send(b); END;
  331. KernelLog.String('Sent bundle3'); KernelLog.Ln;
  332. END SendBundle3;
  333. PROCEDURE Echo(m: OSC.OSCMessage);
  334. VAR
  335. res: WORD;
  336. BEGIN
  337. IF ~ m.noTypeTagString THEN
  338. res := m.Return(ackmessage);
  339. ELSE
  340. res := m.Return(nackmessage);
  341. END;
  342. END Echo;
  343. PROCEDURE Ret(m: OSC.OSCMessage);
  344. VAR
  345. res: WORD;
  346. BEGIN
  347. IF ~ m.noTypeTagString THEN
  348. res := m.Return(m);
  349. ELSE
  350. res := m.Return(nackmessage);
  351. END;
  352. END Ret;
  353. PROCEDURE StartEvalService*;
  354. VAR
  355. res: WORD;
  356. BEGIN
  357. NEW(registry);
  358. registry.AddMethod(Strings.NewString('/tests/M1'), MessageTest1);
  359. registry.AddMethod(Strings.NewString('/tests/M2'), MessageTest2);
  360. registry.AddMethod(Strings.NewString('/tests/M3'), MessageTest3);
  361. registry.AddMethod(Strings.NewString('/tests/M4'), MessageTest4);
  362. registry.AddMethod(Strings.NewString('/tests/M5'), MessageTest5);
  363. registry.AddMethod(Strings.NewString('/echo'), Echo);
  364. registry.AddMethod(Strings.NewString('/ret'), Ret);
  365. NEW(sampleservice, registry);
  366. NEW(tcps, sampleservice, ServerPort, res);
  367. NEW(udps, sampleservice, ServerPort, res);
  368. END StartEvalService;
  369. PROCEDURE StopEvalService*;
  370. BEGIN
  371. KernelLog.String('Stopping OSCTCP ');
  372. tcps.Stop;
  373. KernelLog.String('Stopping OSCUDP ');
  374. udps.Stop;
  375. KernelLog.String('Stopping OSCService ');
  376. sampleservice.Stop;
  377. KernelLog.String(' done'); KernelLog.Ln;
  378. END StopEvalService;
  379. PROCEDURE StartUDPClient*;
  380. VAR
  381. res: WORD;
  382. BEGIN
  383. NEW(udpclient, IP.StrToAdr(ServerIP), ServerPort, UDP.NilPort, res);
  384. IF res # UDP.Ok THEN
  385. KernelLog.String('creation failed'); KernelLog.Ln;
  386. udpclient := NIL;
  387. RETURN
  388. END;
  389. KernelLog.String('Started UDP client'); KernelLog.Ln;
  390. END StartUDPClient;
  391. PROCEDURE StopUDPClient*;
  392. BEGIN
  393. IF udpclient # NIL THEN
  394. udpclient.Close;
  395. udpclient := NIL;
  396. KernelLog.String('Stopped UDP client'); KernelLog.Ln;
  397. END;
  398. END StopUDPClient;
  399. PROCEDURE StartTCPClient*;
  400. VAR
  401. res: WORD;
  402. BEGIN
  403. NEW(tcpclient, IP.StrToAdr(ServerIP), ServerPort, TCP.NilPort, res);
  404. IF res # TCP.Ok THEN
  405. KernelLog.String('creation failed'); KernelLog.Ln;
  406. udpclient := NIL;
  407. RETURN
  408. END;
  409. KernelLog.String('Started TCP client'); KernelLog.Ln;
  410. END StartTCPClient;
  411. PROCEDURE StopTCPClient*;
  412. BEGIN
  413. IF tcpclient # NIL THEN
  414. tcpclient.Close;
  415. tcpclient := NIL;
  416. KernelLog.String('Stopped TCP client'); KernelLog.Ln;
  417. END;
  418. END StopTCPClient;
  419. BEGIN
  420. NEW(ackmessage, Strings.NewString('/OK'));
  421. NEW(nackmessage, Strings.NewString('/NOK'));
  422. END OSCEval.
  423. PC.Compile OSCStrings.Mod OSC.Mod OSCRegistry.Mod OSCQueue.Mod OSCService.Mod OSCNet.Mod OSCEval.Mod ~
  424. System.Free OSCEval OSCTest OSCNet OSCService OSCQueue OSCRegistry OSC OSCUtilities ~
  425. OSCEval.StartEvalService ~
  426. OSCEval.StopEvalService ~
  427. OSCEval.StartUDPClient ~
  428. OSCEval.StopUDPClient ~
  429. OSCEval.StartTCPClient ~
  430. OSCEval.StopTCPClient ~
  431. OSCEval.SendMsg1 ~
  432. OSCEval.SendMsg2 ~
  433. OSCEval.SendMsg3 ~
  434. OSCEval.SendMsg4 ~
  435. OSCEval.SendMsg5 ~
  436. OSCEval.SendBundle1 ~
  437. OSCEval.SendBundle2 ~
  438. OSCEval.SendBundle3 ~
  439. OSCEval.StartUDPRead ~
  440. OSCEval.StopUDPRead ~
  441. OSCEval.StartTCPRead ~
  442. OSCEval.StopTCPRead ~