home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / windows / winterm / term_io.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-02-21  |  3.1 KB  |  160 lines

  1. /*** TERM_IO.C ***/
  2.  
  3. #include "windows.h"
  4. #include <stdio.h>
  5. #include <string.h>
  6. #include "pcl4w.h"
  7. #include "term.h"
  8. #include "ascii.h"
  9. #include "sioerror.h"
  10. #include "term_io.h"
  11. #include "paint.h"
  12.  
  13. #define CAPTURE 0
  14. #define DEBUG   0
  15.  
  16. void Delay(int);
  17.  
  18. #if CAPTURE
  19. #define CAPTURESIZE 4400
  20. WORD CaptureBuffer[CAPTURESIZE+1];
  21. WORD Tail=0;
  22. #endif
  23.  
  24. #if DEBUG
  25. int DebugHandle;
  26. #endif
  27.  
  28. static char Temp[256];
  29. static int  GetCharWait = 0;
  30.  
  31. void TermInit(void)
  32. {
  33. #if DEBUG
  34.  DebugHandle = _lcreat("debug.dat",0);
  35. #endif
  36. }
  37.  
  38. /*** write capture buffer to disk ***/
  39.  
  40. void TermDone(void)
  41. {
  42. #if DEBUG
  43.  _lclose(DebugHandle);
  44. #endif
  45. #if CAPTURE
  46.  int  Handle;
  47.  char hi, lo;
  48.  int  i;
  49.  char Temp[40];
  50.  char *Ptr;
  51.  Handle = _lcreat("capture.dat",0);
  52.  _lwrite(Handle,"CAPTURE\n",9);
  53.  sprintf(Temp,"Tail=%d\n",Tail);
  54.  _lwrite(Handle,Temp,strlen(Temp));
  55.  for(i=0;i<Tail;i++)
  56.    {hi = (char) (CaptureBuffer[i]>>8);
  57.     lo = (char) (CaptureBuffer[i]&0x00ff);
  58.     if((hi>=' ')&&(hi<='~')) sprintf(Temp,"%4d: '%c'  %c\n",i,hi,lo);
  59.     else
  60.       {sprintf(Temp,"%4d: %2xh  %c\n",i,0x00ff&hi,lo);
  61.        Ptr = &Temp[6];
  62.        if(*Ptr==' ') *Ptr = '0';
  63.       }
  64.     _lwrite(Handle,Temp,strlen(Temp));
  65.    }
  66.  _lclose(Handle);
  67. #endif
  68. #if DEBUG
  69.  _lclose(DebugHandle);
  70. #endif
  71. } /* end TermDone */
  72.  
  73.  
  74. /*** output character to serial port ***/
  75.  
  76. int PutChar(int Port, char ch)
  77. {int rc;
  78.  /* transmit character */
  79. #if CAPTURE
  80.  /* capture transmit */
  81.  CaptureBuffer[Tail] = (WORD)(ch<<8) | (WORD)('T');
  82.  if(Tail<CAPTURESIZE) Tail++;
  83. #endif
  84.  rc = SioPutc(Port,ch);
  85.  if(rc<0)
  86.      {/* error */
  87.       SioError(rc,"SioPutc");
  88.       SioDone(Port);
  89.      }
  90.  return(rc);
  91. } /* end PutChar */
  92.  
  93. /*** set wait before re-try for timeout in GetChar() ***/
  94.  
  95. void SetCharWait(int Wait)
  96. {/* set GetChar() wait */
  97.  GetCharWait = Wait;
  98. } /* end SetCharWait */
  99.  
  100. /*** read character from serial port ***/
  101.  
  102. int GetChar(int Port)
  103. {int rc;
  104.  int i;
  105.  /* make at most 2 attempts */
  106.  for(i=1;i<2;i++)
  107.    {rc = SioGetc(Port);
  108.     if(rc>=0) break;
  109.     if(rc<-1)
  110.       {/* error */
  111.        SioError(rc,"SioGetc");
  112.        SioDone(Port);
  113.       }
  114.     /* rc == -1 (timeout) */
  115.     if(GetCharWait>0) Delay(GetCharWait);
  116.     else break;
  117.    }
  118. #if CAPTURE
  119.  if(rc>-1)
  120.      {/* capture receive (if not t/o) */
  121.       CaptureBuffer[Tail] = (WORD)(rc<<8) | (WORD)('R');
  122.       if(Tail<CAPTURESIZE) Tail++;
  123.      }
  124. #endif
  125.  return(rc);
  126. } /* end GetChar */
  127.  
  128. /*** display the error text ***/
  129.  
  130. void SayError(int Port, char *ptr)
  131. {char temp[81];
  132.  sprintf(temp,"ERROR! COM%d : %s",1+Port,ptr);
  133.  DisplayLine(temp);
  134.  /* cancel remote */
  135.  PutChar(Port,CAN);
  136.  PutChar(Port,CAN);
  137.  PutChar(Port,CAN);
  138. } /* end SayError */
  139.  
  140. /*** display line on TERM client area ***/
  141.  
  142. char CRLF[2] = {CR,LF};
  143.  
  144. void DisplayLine(char *Ptr)
  145. {
  146.  WriteTheString("<",1);
  147.  WriteTheString(Ptr,strlen(Ptr));
  148.  WriteTheString(">",1);
  149.  WriteTheString(CRLF,2);
  150. #if DEBUG
  151.  _lwrite(DebugHandle,Ptr,strlen(Ptr));
  152.  _lwrite(DebugHandle,CRLF,2);
  153. #endif
  154. } /* end DisplayLine */
  155.  
  156. void Delay(int Wait)
  157. {long TimeMark;
  158.  TimeMark = GetTickCount() + (long)Wait;
  159.  while(GetTickCount()<TimeMark);
  160. }