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

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"
        !            16: #include "statusBar.h"
        !            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.