Annotation of hatari/src/rs232.c, revision 1.1.1.2

1.1       root        1: /*
                      2:   Hatari
                      3: 
                      4:   RS-232 Communications
                      5: 
                      6:   This is similar to the Printing functions, we open a direct file to the COM port and send bytes over it.
                      7:   Using such method mimicks the ST exactly, and even allows us to connect to an actual ST! To wait for
                      8:   incoming data, we create a thread which copies the bytes into an input buffer. This method fits in with
                      9:   the internet code which also reads data into a buffer.
                     10: */
                     11: 
                     12: #include "main.h"
                     13: #include "debug.h"
                     14: #include "dialog.h"
                     15: #include "rs232.h"
1.1.1.2 ! root       16: 
1.1       root       17: 
                     18: BOOL bConnectedRS232=FALSE;          // Connection to RS232?
                     19: //HANDLE hCom=NULL;                  // Handle to file
                     20: //HANDLE RS232Thread=NULL;           // Thread handle for reading incoming data
                     21: long RS232ThreadID;
                     22: //DCB dcb;                           // Control block
                     23: unsigned char TempRS232InputBuffer[MAX_TEMP_RS232INPUT_BUFFER];
                     24: unsigned char InputBuffer_RS232[MAX_RS232INPUT_BUFFER];
                     25: int InputBuffer_Head=0,InputBuffer_Tail=0;
                     26: 
                     27: //-----------------------------------------------------------------------
                     28: /*
                     29:   Initialize RS-232, start thread to wait for incoming data (we will open a connection when first bytes are sent)
                     30: */
                     31: void RS232_Init(void)
                     32: {
                     33:   // Create thread to wait for incoming bytes over RS-232
                     34: //FIXME   RS232Thread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)RS232_ThreadFunc,0,NULL,&RS232ThreadID);
                     35: }
                     36: 
                     37: //-----------------------------------------------------------------------
                     38: /*
                     39:   Close RS-232 connection and stop checking for incoming data
                     40: */
                     41: void RS232_UnInit(void)
                     42: {
                     43:   // Close, kill thread and free resource
                     44: /* FIXME */
                     45: /*
                     46:   if (RS232Thread) {
                     47:     TerminateThread(RS232Thread,FALSE);
                     48:     CloseHandle(RS232Thread);
                     49:   }
                     50:   RS232_CloseCOMPort();
                     51: */
                     52: }
                     53: 
                     54: //-----------------------------------------------------------------------
                     55: /*
                     56:   Open file on COM port
                     57: */
                     58: BOOL RS232_OpenCOMPort(void)
                     59: {
                     60:   char szString[32];
                     61: /* FIXME */
                     62: /*
                     63:   // Generate correct filename for COM port
                     64:   sprintf(szString,"COM%d",ConfigureParams.RS232.nCOMPort+1);  // 1,2...
                     65: 
                     66:   // Create our COM file for input/output
                     67:   bConnectedRS232 = FALSE;
                     68:   hCom = CreateFile(szString,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL ); 
                     69:   if (hCom!=INVALID_HANDLE_VALUE) {
                     70:     // Get any early notifications, for thread
                     71:     SetCommMask(hCom,EV_RXCHAR);
                     72:     // Create input/output buffers
                     73:     SetupComm(hCom,4096,4096);
                     74:     // Purge buffers
                     75:     PurgeComm(hCom,PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
                     76: 
                     77:     // Set defaults
                     78:     RS232_SetConfig(9600,0,UCR_1STOPBIT|UCR_PARITY|UCR_ODDPARITY);
                     79: 
                     80:     // Set all OK
                     81:     bConnectedRS232 = TRUE;
                     82:   }
                     83: */
                     84:   return(bConnectedRS232);
                     85: }
                     86: 
                     87: //-----------------------------------------------------------------------
                     88: /*
                     89:   Close file on COM port
                     90: */
                     91: void RS232_CloseCOMPort(void)
                     92: {
                     93: /* FIXME */
                     94: /*
                     95:   // Do have file open?
                     96:   if (bConnectedRS232) {
                     97:     // Close
                     98:     CloseHandle(hCom);
                     99:     hCom=NULL;
                    100: 
                    101:     bConnectedRS232 = FALSE;
                    102:   }
                    103: */
                    104: }
                    105: 
                    106: //-----------------------------------------------------------------------
                    107: /*
                    108:   Set hardware configuration of RS-232
                    109: 
                    110:   Ctrl:Communications parameters, (default 0)No handshake
                    111:     Bit 0: XOn/XOff
                    112:     Bit 1: RTS/CTS
                    113: 
                    114:   Ucr: USART Control Register
                    115:     Bit 1:0-Odd Parity, 1-Even Parity
                    116:     Bit 2:0-No Parity, 1-Parity
                    117:     Bits 3,4: Start/Stop bits
                    118:       0 0 0-Start, 0-Stop    Synchronous
                    119:       0 1 0-Start, 1-Stop    Asynchronous
                    120:       1 0 1-Start, 1.5-Stop  Asynchronous
                    121:       1 1 1-Start, 2-Stop    Asynchronous
                    122:     Bits 5,6: 'WordLength'
                    123:       0 0 ,8 Bits
                    124:       0 1 ,7 Bits
                    125:       1 0 ,6 Bits
                    126:       1 1 ,5 Bits
                    127:     Bit 7: Frequency from TC and RC
                    128: */
                    129: void RS232_SetConfig(int Baud,short int Ctrl,short int Ucr)
                    130: {
                    131: /* FIXME */
                    132: /*  
                    133:   // Get current config
                    134:   memset(&dcb,0x0,sizeof(DCB));
                    135:   GetCommState(hCom, &dcb);
                    136:   // Set defaults
                    137:   BuildCommDCB("baud=9600 parity=N data=8 stop=1",&dcb);
                    138:   
                    139:   // Need XOn/XOff?
                    140:   if (Ctrl&CTRL_XON_XOFF) {
                    141:     dcb.fOutX = TRUE;
                    142:     dcb.fInX = TRUE;
                    143:   }
                    144:   // And RTS/CTS?
                    145:   if (Ctrl&CTRL_RTS_CTS)
                    146:     dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
                    147: 
                    148:   // Type of parity(if enabled)
                    149:   if (Ucr&UCR_EVENPARITY)
                    150:     dcb.Parity = EVENPARITY;
                    151:   else
                    152:     dcb.Parity = ODDPARITY;
                    153:   // Need parity?
                    154:   if (Ucr&UCR_PARITY)
                    155:     dcb.fParity = TRUE;
                    156:   // Number of stop bits
                    157:   switch(Ucr&UCR_STARTSTOP) {
                    158:     case UCR_0STOPBIT:        // PC doesn't appear to have no stop bits? Eh?
                    159:     case UCR_1STOPBIT:
                    160:       dcb.StopBits = ONESTOPBIT;
                    161:       break;
                    162:     case UCR_15STOPBIT:
                    163:       dcb.StopBits = ONE5STOPBITS;
                    164:       break;
                    165:     case UCR_2STOPBIT:
                    166:       dcb.StopBits = TWOSTOPBITS;
                    167:       break;
                    168:   }
                    169: 
                    170:   // And set
                    171:   SetCommState(hCom, &dcb);
                    172: */
                    173: }
                    174: 
                    175: //-----------------------------------------------------------------------
                    176: /*
                    177:   Pass bytes from emulator to RS-232
                    178: */
                    179: BOOL RS232_TransferBytesTo(unsigned char *pBytes, int nBytes)
                    180: {
                    181: /* FIXME */
                    182: /*
                    183:   DWORD BytesWritten;
                    184: 
                    185:   // Do need to open a connection to RS232?
                    186:   if (!bConnectedRS232) {
                    187:     // Do have RS-232 enabled?
                    188:     if (ConfigureParams.RS232.bEnableRS232)
                    189:       bConnectedRS232 = RS232_OpenCOMPort();
                    190:   }
                    191: 
                    192:   // Have we connected to the RS232?
                    193:   if (bConnectedRS232) {
                    194:     // Send bytes directly to COM port
                    195:     if (WriteFile(hCom,pBytes,nBytes,&BytesWritten,NULL)) {
                    196:       FlushFileBuffers(hCom);
                    197:     }
                    198: 
                    199:     // Show icon on status bar
                    200:     StatusBar_SetIcon(STATUS_ICON_RS232,ICONSTATE_UPDATE);
                    201: 
                    202:     return(TRUE);  //OK
                    203:   }
                    204:   else
                    205: */    return(FALSE);  //Failed
                    206: 
                    207: }
                    208: 
                    209: //-----------------------------------------------------------------------
                    210: /*
                    211:   Read characters from our internal input buffer(bytes from other machine)
                    212: */
                    213: BOOL RS232_ReadBytes(unsigned char *pBytes, int nBytes)
                    214: {
                    215: /* FIXME */
                    216: /*
                    217:   int i;
                    218: 
                    219:   // Connected?
                    220:   if (bConnectedRS232) {
                    221:     // Read bytes out of input buffer
                    222:     for(i=0; i<nBytes; i++) {
                    223:       *pBytes++ = InputBuffer_RS232[InputBuffer_Head];
                    224:       InputBuffer_Head = (InputBuffer_Head+1)&MAX_RS232INPUT_BUFFER_MASK;
                    225:     }
                    226:     return(TRUE);
                    227:   }
                    228: */
                    229:   return(FALSE);
                    230: 
                    231: }
                    232: 
                    233: //-----------------------------------------------------------------------
                    234: /*
                    235:   Return TRUE if bytes waiting!
                    236: */
                    237: BOOL RS232_GetStatus(void)
                    238: {
                    239: /* FIXME */
                    240: /*
                    241:   // Connected?
                    242:   if (bConnectedRS232) {
                    243:     // Do we have bytes in the input buffer?
                    244:     if (InputBuffer_Head!=InputBuffer_Tail)
                    245:       return(TRUE);
                    246:   }
                    247: */
                    248:   // No, none
                    249:   return(FALSE);
                    250: }
                    251: 
                    252: //-----------------------------------------------------------------------
                    253: /*
                    254:   Add incoming bytes from other machine into our input buffer
                    255: */
                    256: void RS232_AddBytesToInputBuffer(unsigned char *pBytes, int nBytes)
                    257: {
                    258:   int i;
                    259: 
                    260:   // Copy bytes into input buffer
                    261:   for(i=0; i<nBytes; i++) {
                    262:     InputBuffer_RS232[InputBuffer_Tail] = *pBytes++;
                    263:     InputBuffer_Tail = (InputBuffer_Tail+1)&MAX_RS232INPUT_BUFFER_MASK;
                    264:   }
                    265: }
                    266: 
                    267: //-----------------------------------------------------------------------
                    268: /*
                    269:   Thread to read incoming RS-232 data, and pass to emulator input buffer
                    270: */
                    271: /* FIXME */
                    272: /*
                    273: DWORD FAR PASCAL RS232_ThreadFunc(LPSTR lpData)
                    274: {
                    275:   COMSTAT ComStat;
                    276:   DWORD dwErrorFlags;
                    277:   DWORD dwEvtMask;
                    278:   DWORD dwLength;
                    279: 
                    280:   SetCommMask(hCom,EV_RXCHAR);
                    281: 
                    282:   // Check for any RS-232 incoming data
                    283:   while(TRUE) {
                    284:     if (hCom) {
                    285:       // Halt here until we find some data coming through the RS-232
                    286:       dwEvtMask = 0;
                    287:       WaitCommEvent(hCom,&dwEvtMask,NULL);
                    288: 
                    289:       // Chars awaiting? Read them in
                    290:       if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR) {
                    291:         // Only try to read number of bytes in queue - don't read more than our buffer allows
                    292:         ClearCommError(hCom, &dwErrorFlags, &ComStat );
                    293:         dwLength = min(MAX_TEMP_RS232INPUT_BUFFER, ComStat.cbInQue);
                    294:         // Read the bytes in, if we have any
                    295:         if (dwLength!=0) {
                    296:           // Read into temporary buffer
                    297:           ReadFile(hCom,TempRS232InputBuffer,dwLength,&dwLength,NULL);
                    298:           // And copy into our internal queue
                    299:           RS232_AddBytesToInputBuffer(TempRS232InputBuffer,dwLength);
                    300:         }
                    301:       }
                    302: 
                    303:       // Sleep or a while
                    304:       Sleep(2);
                    305:     }
                    306:     else {
                    307:       // No RS-232 connection, sleep for 20ms
                    308:       Sleep(20);
                    309:     }
                    310:   }
                    311: 
                    312:   return(TRUE);
                    313: }
                    314: */

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.