SerialLog.Mos 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. (* ported version of Minos to work with the ARM backend of the Fox Compiler Suite *)
  2. MODULE SerialLog;
  3. (*---------------------------------------------------------*
  4. * Copyright (c) ETH Zurich. All Rights Reserved.
  5. *---------------------------------------------------------*)
  6. (*@
  7. 009 2006-12-08 fof: inserted Disable procedure
  8. 008 2006-09-26 fof: inserted string end gaurd in Str
  9. 007 2006-08-07 tt: Removed WriteBytesNB
  10. 006 2006-07-19 tt: Introduced Device, removed Uart
  11. 005 2006-07-14 tt: Introduced Uart module
  12. 004 2006-07-13 tt: Introduced Platform dependend module
  13. 003 2006-06-29 tt: changed header format
  14. 002 2006-06-14 fof: added commands BlockingModeOn and BlockingModeOff
  15. 001 2006-06-15 tt: added commands UseHWUart UseBTUart, introduce variable dev
  16. *)
  17. IMPORT Device, Platform, Log, Uart, Trace;
  18. CONST
  19. (* PC commands *)
  20. Base = 4D5B9878H;
  21. LOG* = Base + 20H; FR* = Base + 21H; MS* = Base + 23H; FD* = Base + 24H; (* commands *)
  22. FS* = Base + 25H; BEEP* = Base + 26H; CMD* = Base + 27H;
  23. (*LogTypes*)
  24. LN* = 21X; STR* = 22X; CH* = 23X; INT* = 24X; HEX* = 25X; FLOAT* = 26X;
  25. SETS* = 27X; TIME* = 28X; CLEAR* = 29X; BUF* = 30X;
  26. VAR
  27. blocking: BOOLEAN;
  28. dev: Device.Device;
  29. trapMode : BOOLEAN;
  30. PROCEDURE Cmd (type: CHAR);
  31. BEGIN
  32. Device.WriteInt ( dev, LOG );
  33. Device.Write (dev, type);
  34. END Cmd;
  35. PROCEDURE Await (numberOfCharacters: LONGINT): BOOLEAN;
  36. BEGIN
  37. IF blocking THEN
  38. REPEAT UNTIL Device.Free( dev ) >= numberOfCharacters;
  39. END;
  40. RETURN (Device.Free(dev) >= numberOfCharacters);
  41. END Await;
  42. PROCEDURE Ch( ch: CHAR );
  43. BEGIN
  44. IF Await ( 6 ) THEN
  45. Cmd ( CH ); Device.Write( dev, ch )
  46. END;
  47. IF ( trapMode ) THEN
  48. Trace.C( ch );
  49. END;
  50. END Ch;
  51. PROCEDURE Hex( i: LONGINT );
  52. BEGIN
  53. IF Await ( 15 ) THEN
  54. Cmd ( HEX ); Device.WriteInt( dev, i );
  55. Cmd ( CH ); Device.Write( dev, 'H' );
  56. END;
  57. IF ( trapMode ) THEN
  58. Trace.Hex( i, -8 );
  59. END;
  60. END Hex;
  61. PROCEDURE Str( CONST str: ARRAY OF CHAR );
  62. VAR offset, len, size: LONGINT;
  63. BEGIN
  64. offset := 0; len := LEN( str ); size := 0;
  65. WHILE (size < len ) & (str[size] # 0X) DO INC( size );
  66. END;
  67. IF (size > 0) & Await (6 + size) THEN
  68. Cmd ( STR ); Device.WriteStr( dev, str );
  69. END;
  70. IF ( trapMode ) THEN
  71. Trace.String( str );
  72. END;
  73. END Str;
  74. PROCEDURE Int( i: LONGINT );
  75. BEGIN
  76. IF Await ( 9 ) THEN
  77. Cmd ( INT ); Device.WriteInt( dev, i );
  78. END;
  79. IF ( trapMode ) THEN
  80. Trace.Int( i, 12 );
  81. END;
  82. END Int;
  83. PROCEDURE Real( a: REAL );
  84. BEGIN
  85. IF Await ( 9 ) THEN
  86. Cmd ( FLOAT ); Device.WriteReal( dev, a );
  87. END;
  88. IF ( trapMode ) THEN
  89. Trace.Real( a, 12, 2 );
  90. END;
  91. END Real;
  92. PROCEDURE RealHex( a: REAL );
  93. BEGIN
  94. IF Await ( 15 ) THEN
  95. Cmd ( HEX ); Device.WriteReal( dev, a );
  96. Cmd ( CH ); Device.Write( dev, 'R' );
  97. END;
  98. END RealHex;
  99. PROCEDURE FReal( a: LONGINT );
  100. BEGIN
  101. IF Await ( 9 ) THEN
  102. Cmd ( FLOAT ); Device.WriteInt ( dev, a );
  103. END;
  104. END FReal;
  105. PROCEDURE Set( a: SET );
  106. BEGIN
  107. IF Await ( 9 ) THEN
  108. Cmd ( SETS ); Device.WriteSet ( dev, a );
  109. END;
  110. END Set;
  111. PROCEDURE Bool( b: BOOLEAN );
  112. BEGIN
  113. IF b THEN
  114. Str ("TRUE");
  115. ELSE
  116. Str ("FALSE");
  117. END;
  118. END Bool;
  119. PROCEDURE Ln;
  120. BEGIN
  121. IF Await (5) THEN
  122. Cmd ( LN );
  123. END;
  124. IF ( trapMode ) THEN
  125. Trace.Ln;
  126. END;
  127. END Ln;
  128. PROCEDURE Beep( freq, duration: LONGINT );
  129. BEGIN
  130. IF Await (12) THEN
  131. Device.WriteInt ( dev, BEEP ); Device.WriteInt( dev, freq );
  132. Device.WriteInt( dev, duration );
  133. END;
  134. END Beep;
  135. PROCEDURE Clear;
  136. BEGIN
  137. IF Await ( 5 ) THEN
  138. Cmd ( CLEAR );
  139. END;
  140. END Clear;
  141. PROCEDURE SetBlocking*( block: BOOLEAN );
  142. BEGIN
  143. blocking := block;
  144. END SetBlocking;
  145. PROCEDURE Flush;
  146. BEGIN
  147. Device.Flush( dev );
  148. END Flush;
  149. (* switch on blockign mode for messages sent via serial line *)
  150. PROCEDURE BlockingModeOn*;
  151. BEGIN
  152. blocking := TRUE;
  153. END BlockingModeOn;
  154. (* switch on blockign mode for messages sent via serial line *)
  155. PROCEDURE BlockingModeOff*;
  156. BEGIN
  157. blocking := FALSE;
  158. END BlockingModeOff;
  159. PROCEDURE Buffer( CONST buf: ARRAY OF CHAR; offset, len: LONGINT );
  160. VAR free: LONGINT;
  161. BEGIN
  162. IF (offset + len) > LEN( buf ) THEN len := LEN( buf ) - offset; END;
  163. IF (len > 0) & Await ( 9 + len) THEN
  164. Cmd ( BUF);
  165. Device.WriteInt( dev, len );
  166. Device.WriteChars( dev, buf, offset, len );
  167. END;
  168. END Buffer;
  169. PROCEDURE Disable*;
  170. BEGIN
  171. Flush(); Device.Close( dev ); dev := Device.GetDevice( "NULL" );
  172. Device.Open( dev );
  173. END Disable;
  174. PROCEDURE Trap( enable: BOOLEAN );
  175. BEGIN
  176. Trace.Ln;
  177. Trace.StringLn("*** TRAP MODE ENABLED ***");
  178. Trace.Ln;
  179. trapMode := TRUE;
  180. END Trap;
  181. PROCEDURE Install*;
  182. BEGIN
  183. Trace.StringLn("Serial Log Install().");
  184. dev := Device.GetDevice( Platform.MINOSCOMMAND );
  185. IF ( dev # NIL ) THEN
  186. Trace.StringLn("Redirecting Log to SerialLog.");
  187. Log.Redirect1( Str, Int, Hex, Set, Real, Bool );
  188. Log.Redirect2( Ch, Ln, Buffer, Clear, Flush, Beep, Trap );
  189. END;
  190. END Install;
  191. BEGIN
  192. blocking := FALSE;
  193. trapMode := FALSE;
  194. Uart.Install();
  195. Trace.StringLn("SerialLog Init().");
  196. END SerialLog.