SERCOM.C 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. /*
  2. Copyright (C) 1994-1995 Apogee Software, Ltd.
  3. This program is free software; you can redistribute it and/or
  4. modify it under the terms of the GNU General Public License
  5. as published by the Free Software Foundation; either version 2
  6. of the License, or (at your option) any later version.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. See the GNU General Public License for more details.
  11. You should have received a copy of the GNU General Public License
  12. along with this program; if not, write to the Free Software
  13. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  14. */
  15. #include "global.h"
  16. #include "sermodem.h"
  17. #include "sersetup.h"
  18. #include "port.h"
  19. #include "..\rottnet.h"
  20. #include <time.h>
  21. #include <conio.h>
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <string.h>
  25. #include <ctype.h>
  26. #include <process.h>
  27. #include <stdarg.h>
  28. #include <bios.h>
  29. #include <ctype.h>
  30. #define FRAMECHAR 0x70
  31. #define MAXPACKET (MAXPACKETSIZE)
  32. time_t starttime = 0;
  33. time_t endtime = 0;
  34. time_t playtime = 0;
  35. /* showReadStats() counters. */
  36. unsigned long writeBufferOverruns = 0;
  37. unsigned long bytesRead = 0;
  38. unsigned long packetsRead = 0;
  39. unsigned long largestReadPacket = 0;
  40. unsigned long smallestReadPacket = 0xFFFFFFFFl;
  41. unsigned long readBufferOverruns = 0;
  42. unsigned long totalReadPacketBytes = 0;
  43. unsigned long oversizeReadPackets = 0;
  44. unsigned long largestOversizeReadPacket = 0;
  45. unsigned long overReadPacketLen = 0;
  46. /* showWriteStats() counters. */
  47. unsigned long bytesWritten = 0;
  48. unsigned long packetsWrite = 0;
  49. unsigned long largestWritePacket = 0;
  50. unsigned long smallestWritePacket = 0xFFFFFFFFl;
  51. unsigned long totalWritePacketBytes = 0;
  52. unsigned long oversizeWritePackets = 0;
  53. unsigned long largestOversizeWritePacket = 0;
  54. /* showUartErrors() counters. */
  55. unsigned long numBreak = 0;
  56. unsigned long numFramingError = 0;
  57. unsigned long numParityError = 0;
  58. unsigned long numOverrunError = 0;
  59. unsigned long numTxInterrupts = 0;
  60. unsigned long numRxInterrupts = 0;
  61. char packet[MAXPACKET];
  62. char localbuffer[MAXPACKET*2+2];
  63. int packetlen;
  64. int inescape;
  65. int newpacket;
  66. void showReadStats( void );
  67. void showWriteStats( void );
  68. void showUartErrors( void );
  69. /*
  70. ================
  71. =
  72. = ReadPacket
  73. =
  74. ================
  75. */
  76. boolean ReadPacket (void)
  77. {
  78. int c;
  79. // if the buffer has overflowed, throw everything out
  80. if (inque.size > QUESIZE - 4) // check for buffer overflow
  81. {
  82. ++readBufferOverruns; /* Count read overruns */
  83. inque.tail = inque.head;
  84. inque.size = 0;
  85. newpacket = true;
  86. return false;
  87. }
  88. if (newpacket)
  89. {
  90. packetlen = 0;
  91. newpacket = 0;
  92. overReadPacketLen = 0;
  93. }
  94. do
  95. {
  96. if ((c = read_byte ()) < 0)
  97. return false; // haven't read a complete packet
  98. if (inescape)
  99. {
  100. inescape = false;
  101. if (c!=FRAMECHAR)
  102. {
  103. newpacket = 1;
  104. ++packetsRead; /* Count packets read */
  105. if ( packetlen > largestReadPacket ) /* Track largest packet */
  106. largestReadPacket = packetlen;
  107. if ( packetlen < smallestReadPacket ) /* Track smallest packet */
  108. smallestReadPacket = packetlen;
  109. totalReadPacketBytes += packetlen; /* Count total packet bytes */
  110. return true; // got a good packet
  111. }
  112. }
  113. else if (c==FRAMECHAR)
  114. {
  115. inescape = true;
  116. continue; // don't know yet if it is a terminator
  117. } // or a literal FRAMECHAR
  118. if (packetlen >= MAXPACKET)
  119. {
  120. ++overReadPacketLen; /* Keep track of size of oversize packet */
  121. oversizeReadPackets++; /* Count oversize packets */
  122. if ( overReadPacketLen > largestOversizeReadPacket )
  123. largestOversizeReadPacket = overReadPacketLen;
  124. continue; // oversize packet
  125. }
  126. packet[packetlen] = c;
  127. packetlen++;
  128. } while (1);
  129. }
  130. /*
  131. =============
  132. =
  133. = WritePacket
  134. =
  135. =============
  136. */
  137. void WritePacket (char *buffer, int len)
  138. {
  139. int b;
  140. b = 0;
  141. if (len > MAXPACKET)
  142. {
  143. ++oversizeWritePackets; /* Count oversize write packets */
  144. if ( len > largestOversizeWritePacket )
  145. ++largestOversizeWritePacket;
  146. return;
  147. }
  148. if ( len > largestWritePacket )
  149. largestWritePacket = len;
  150. if ( len < smallestWritePacket )
  151. smallestWritePacket = len;
  152. totalWritePacketBytes += len;
  153. ++packetsWrite;
  154. while (len--)
  155. {
  156. if (*buffer == FRAMECHAR)
  157. localbuffer[b++] = FRAMECHAR; // escape it for literal
  158. localbuffer[b++] = *buffer++;
  159. }
  160. localbuffer[b++] = FRAMECHAR;
  161. localbuffer[b++] = 0;
  162. write_buffer (localbuffer, b);
  163. }
  164. /*
  165. =============
  166. =
  167. = NetISR
  168. =
  169. =============
  170. */
  171. void NetISR ( void )
  172. {
  173. if (rottcom.command == CMD_SEND)
  174. {
  175. WritePacket ((char *)&rottcom.data, rottcom.datalength);
  176. }
  177. else if (rottcom.command == CMD_GET)
  178. {
  179. if (ReadPacket () && packetlen <= sizeof(rottcom.data) )
  180. {
  181. rottcom.remotenode = 1;
  182. rottcom.datalength = packetlen;
  183. memcpy (&rottcom.data, &packet, packetlen);
  184. }
  185. else
  186. rottcom.remotenode = -1;
  187. }
  188. }
  189. /*
  190. =================
  191. =
  192. = Connect
  193. =
  194. = Figures out who is player 0 or 1
  195. =================
  196. */
  197. int Connect ( void )
  198. {
  199. struct time time;
  200. int oldsec;
  201. int localstage, remotestage;
  202. int player;
  203. char str[20];
  204. // Check for player specified
  205. if (CheckParm("-player")!=0)
  206. {
  207. player=1;
  208. }
  209. else if (CheckParm("-answer"))
  210. {
  211. player=1;
  212. }
  213. else
  214. {
  215. player=0;
  216. }
  217. //
  218. // wait for a good packet
  219. //
  220. printf ("Attempting to connect across serial link, press escape to abort.\n");
  221. rottcom.consoleplayer = player;
  222. oldsec = -1;
  223. localstage = remotestage = 0;
  224. do
  225. {
  226. while ( bioskey(1) )
  227. {
  228. if ( (bioskey (0) & 0xff) == ESC)
  229. {
  230. // Error ("\n\nNetwork game synchronization aborted.");
  231. printf ("\n\nNetwork game synchronization aborted.\n");
  232. while (read_byte () != -1)
  233. ;
  234. return FALSE;
  235. }
  236. }
  237. while (ReadPacket ())
  238. {
  239. packet[packetlen] = 0;
  240. printf ("read: '%s'\n", packet);
  241. if (packetlen != 7)
  242. {
  243. printf ("bad packet len = %d (should be 7)\n", packetlen);
  244. goto badpacket;
  245. }
  246. if (strncmp(packet,"ROTT",4) )
  247. {
  248. printf ("error: first 4 char's aren't 'ROTT'\n");
  249. goto badpacket;
  250. }
  251. remotestage = packet[6] - '0';
  252. localstage = remotestage+1;
  253. if (packet[4] == '0'+rottcom.consoleplayer)
  254. {
  255. rottcom.consoleplayer ^= 1;
  256. localstage = remotestage = 0;
  257. }
  258. oldsec = -1;
  259. }
  260. badpacket:
  261. gettime (&time);
  262. if (time.ti_sec != oldsec)
  263. {
  264. oldsec = time.ti_sec;
  265. sprintf (str,"ROTT%i_%i",rottcom.consoleplayer,localstage);
  266. WritePacket (str,strlen(str));
  267. printf ("wrote: '%s'\n",str);
  268. }
  269. } while (remotestage < 1);
  270. //
  271. // flush out any extras
  272. //
  273. while (ReadPacket ())
  274. ;
  275. delay(20);
  276. while (ReadPacket ())
  277. ;
  278. return TRUE;
  279. }
  280. void StartTime( void )
  281. {
  282. time (&starttime);
  283. }
  284. void EndTime( void )
  285. {
  286. time (&endtime);
  287. }
  288. void stats (void)
  289. {
  290. time_t hrs;
  291. time_t mins;
  292. time_t secs;
  293. clrscr ();
  294. if (starttime != 0)
  295. {
  296. printf ("Start Time: %s", ctime (&starttime));
  297. playtime = endtime - starttime;
  298. hrs = playtime / 3600;
  299. mins = (playtime - (hrs * 3600)) / 60;
  300. secs = playtime - (hrs * 3600) - (mins * 60);
  301. printf ("Playing Time: %d:%02d:%02d\n\n",
  302. (int) hrs, (int) mins, (int) secs);
  303. }
  304. showReadStats();
  305. showWriteStats();
  306. showUartErrors();
  307. printf ("\n");
  308. }
  309. void reset_counters (void)
  310. {
  311. /* showReadStats() counters. */
  312. writeBufferOverruns = 0;
  313. bytesRead = 0;
  314. packetsRead = 0;
  315. largestReadPacket = 0;
  316. smallestReadPacket = 0xFFFFFFFFl;
  317. readBufferOverruns = 0;
  318. totalReadPacketBytes = 0;
  319. oversizeReadPackets = 0;
  320. largestOversizeReadPacket = 0;
  321. overReadPacketLen = 0;
  322. /* showWriteStats() counters. */
  323. bytesWritten = 0;
  324. packetsWrite = 0;
  325. largestWritePacket = 0;
  326. smallestWritePacket = 0xFFFFFFFFl;
  327. totalWritePacketBytes = 0;
  328. oversizeWritePackets = 0;
  329. largestOversizeWritePacket = 0;
  330. /* showUartErrors() counters. */
  331. numBreak = 0;
  332. numFramingError = 0;
  333. numParityError = 0;
  334. numOverrunError = 0;
  335. numTxInterrupts = 0;
  336. numRxInterrupts = 0;
  337. }
  338. void showReadStats()
  339. {
  340. if ( smallestReadPacket == 0xFFFFFFFFl )
  341. smallestReadPacket = 0;
  342. printf ("Read statistics:\n");
  343. printf ("%9lu Largest packet %9lu Smallest packet\n",
  344. largestReadPacket, smallestReadPacket);
  345. printf ("%9lu Oversize packets %9lu Largest oversize packet\n",
  346. oversizeReadPackets, largestOversizeReadPacket);
  347. printf ("%9lu Total packets %9lu Buffer overruns\n",
  348. packetsRead, readBufferOverruns);
  349. printf ("%9lu Total bytes %9lu Average bytes/minute\n",
  350. totalReadPacketBytes,
  351. starttime == 0 || playtime == 0 ? 0 :
  352. ( ( 60 * totalReadPacketBytes ) / playtime) );
  353. printf ("%9lu Receive interrupts %9lu Average bytes/interrupt\n",
  354. numRxInterrupts,
  355. numRxInterrupts == 0 ? 0 :
  356. ( totalReadPacketBytes / numRxInterrupts ) );
  357. printf ("\n");
  358. }
  359. void showWriteStats()
  360. {
  361. if ( smallestWritePacket == 0xFFFFFFFFl )
  362. smallestWritePacket = 0;
  363. printf ("Write statistics:\n");
  364. printf ("%9lu Largest packet %9lu Smallest packet\n",
  365. largestWritePacket, smallestWritePacket);
  366. printf ("%9lu Oversize packets %9lu Largest oversize packet\n",
  367. oversizeWritePackets, largestOversizeWritePacket);
  368. printf ("%9lu Total packets %9lu Buffer overruns\n",
  369. packetsWrite, writeBufferOverruns);
  370. printf ("%9lu Total bytes %9lu Average bytes/minute\n",
  371. totalWritePacketBytes,
  372. starttime == 0 || playtime == 0 ? 0 :
  373. ( ( 60 * totalReadPacketBytes ) / playtime) );
  374. printf ("%9lu Transmit interrupts %9lu Average bytes/interrupt\n",
  375. numTxInterrupts,
  376. numTxInterrupts == 0 ? 0 :
  377. ( totalReadPacketBytes / numRxInterrupts ) );
  378. printf ("\n");
  379. }
  380. void showUartErrors()
  381. {
  382. puts ("UART line status");
  383. printf ("%9lu Breaks detected %9lu Framing errors\n",
  384. numBreak, numFramingError);
  385. printf ("%9lu Parity errors %9lu Overrun errors\n",
  386. numParityError, numOverrunError);
  387. }