JoysticksTest.Mod 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. MODULE JoysticksTest; (** AUTHOR "staubesv"; PURPOSE "Joystick simulator for testing purposes"; *)
  2. (**
  3. * Usage:
  4. *
  5. * JoysticksTest.CreateJoystick [nbrOfButtons] ~ creates a new simulated joystick
  6. * System.Free JoysticksTest ~ unload module, unregisters all simulated joysticks at Joysticks.registry
  7. *
  8. * History:
  9. *
  10. * 28.11.2006 First release (staubesv)
  11. *)
  12. IMPORT
  13. KernelLog, Modules, Kernel, Plugins, Commands, Random, Joysticks;
  14. CONST
  15. DefaultNbrOfButtons = 2;
  16. MaxSimulatedJoysticks = 16;
  17. MinAxisValueX = -255;
  18. MaxAxisValueX = 255;
  19. MinAxisValueY = 0;
  20. MaxAxisValueY = 1024;
  21. MinAxisValueSlider1 = -16384;
  22. MaxAxisValueSlider1 = 16384;
  23. MinAxisDefaultValue = -1024;
  24. MaxAxisDefaultValue = 1024;
  25. MinSleepTime = 200;
  26. MaxSleepTime = 1500;
  27. TYPE
  28. SimulatedJoystick = OBJECT(Joysticks.Joystick)
  29. VAR
  30. msg : Joysticks.JoystickDataMessage;
  31. random : Random.Generator;
  32. timer : Kernel.Timer;
  33. alive, dead : BOOLEAN;
  34. i, minValue, maxValue : LONGINT;
  35. PROCEDURE Stop;
  36. BEGIN {EXCLUSIVE}
  37. alive := FALSE; timer.Wakeup;
  38. AWAIT(dead);
  39. END Stop;
  40. PROCEDURE &Init*(nbrOfButtons : LONGINT);
  41. BEGIN
  42. Init^(nbrOfButtons);
  43. alive := TRUE; dead := FALSE;
  44. NEW(timer);
  45. NEW(random);
  46. END Init;
  47. BEGIN {ACTIVE}
  48. WHILE alive DO
  49. FOR i := 0 TO nbrOfButtons-1 DO
  50. IF random.Dice(2) = 1 THEN
  51. INCL(msg.buttons, i);
  52. ELSE
  53. EXCL(msg.buttons, i);
  54. END;
  55. END;
  56. FOR i := 0 TO Joysticks.MaxNbrOfAxis - 1 DO
  57. IF i IN implementedAxis THEN
  58. CASE i OF
  59. | Joysticks.AxisX: minValue := MinAxisValueX; maxValue := MaxAxisValueX;
  60. | Joysticks.AxisY: minValue := MinAxisValueY; maxValue := MaxAxisValueY;
  61. | Joysticks.Slider1: minValue := MinAxisValueSlider1; maxValue := MaxAxisValueSlider1;
  62. ELSE
  63. minValue := MinAxisDefaultValue; maxValue := MaxAxisDefaultValue;
  64. END;
  65. msg.axis[i] := random.Dice(maxValue - minValue) + 1 + minValue;
  66. END;
  67. END;
  68. FOR i := 0 TO nbrOfCoolieHats-1 DO
  69. EXCL(msg.coolieHat[i], random.Dice(4));
  70. EXCL(msg.coolieHat[i], random.Dice(4));
  71. INCL(msg.coolieHat[i], random.Dice(4));
  72. END;
  73. Handle(msg);
  74. timer.Sleep(random.Dice(MaxSleepTime - MinSleepTime) + MinSleepTime);
  75. END;
  76. BEGIN {EXCLUSIVE} dead := TRUE; END;
  77. END SimulatedJoystick;
  78. VAR
  79. joysticks : ARRAY MaxSimulatedJoysticks OF SimulatedJoystick;
  80. nbrOfJoysticks : LONGINT;
  81. PROCEDURE CreateJoystick*(context : Commands.Context); (* [nbrOfButtons] ~ *)
  82. VAR joystick : SimulatedJoystick; nbrOfButtons, nbrOfAxis: LONGINT; res : WORD;
  83. BEGIN
  84. context.arg.SkipWhitespace; context.arg.Int(nbrOfButtons, FALSE);
  85. context.arg.SkipWhitespace; context.arg.Int(nbrOfAxis, FALSE);
  86. IF nbrOfButtons <= 0 THEN nbrOfButtons := DefaultNbrOfButtons; END;
  87. IF nbrOfJoysticks < LEN(joysticks) THEN
  88. NEW(joystick, nbrOfButtons);
  89. joystick.AddAxis(Joysticks.AxisX, MinAxisValueX, MaxAxisValueX);
  90. joystick.AddAxis(Joysticks.AxisY, MinAxisValueY, MaxAxisValueY);
  91. joystick.AddAxis(Joysticks.Slider1, MinAxisValueSlider1, MaxAxisValueSlider1);
  92. joystick.AddCoolieHat;
  93. joystick.AddCoolieHat;
  94. joystick.desc := "Simulated Joystick";
  95. joysticks[nbrOfJoysticks] := joystick;
  96. INC(nbrOfJoysticks);
  97. Joysticks.registry.Add(joystick, res);
  98. IF res = Plugins.Ok THEN
  99. context.out.String("Joystick created."); KernelLog.Ln;
  100. ELSE
  101. context.error.String("Could not add joystick to registry, res: "); context.error.Int(res, 0); context.error.Ln;
  102. END;
  103. ELSE
  104. context.error.String("Maximum number of joysticks exceeded."); context.error.Ln;
  105. END;
  106. END CreateJoystick;
  107. PROCEDURE Cleanup;
  108. VAR i : LONGINT;
  109. BEGIN
  110. FOR i := 0 TO MaxSimulatedJoysticks - 1 DO
  111. IF joysticks[i] # NIL THEN
  112. joysticks[i].Stop;
  113. Joysticks.registry.Remove(joysticks[i]);
  114. joysticks[i] := NIL;
  115. END;
  116. END;
  117. END Cleanup;
  118. BEGIN
  119. Modules.InstallTermHandler(Cleanup);
  120. END JoysticksTest.
  121. Joysticks.Show ~
  122. JoysticksTest.CreateJoystick ~
  123. System.Free WMJoysticks JoysticksTest Joysticks ~
  124. WMJoysticks.Open ~