/******************************************************************************/ /* Copyright 2004 MBARI - Monterey Bay Aquarium Research Institute */ /******************************************************************************/ /******************************************************************************/ /* Summary : Routines to access */ /* Filename : SERIAL.C */ /* Author : Luke Coletti */ /* Project : */ /* Version : 1.0 */ /* Compiler : Aztec C68k/ROM v5.2D */ /* Created : 03/14/05 */ /* Archived : */ /******************************************************************************/ /* Modification History: */ /* */ /******************************************************************************/ #include /* Tattletale Model 8 Definitions */ #include /* definitions and prototypes for Model 8 library */ #include #include #include #include #include #include #include #include "lobo.h" static char staticbuf[RXBUFSIZE]; short InstrumentConnect(ushort chan) { uchar baud_change; int inchar, outchar; ushort tpuch_rx, tpuch_tx; ulong tpu_baud, tcr1_clock, match_rate; long connect_baud; long freq_sav, baud_sav, baud_new; time_t start_time, current_time; if( tserIsOpen( chan ) == FALSE ) return( ERROR ); if( tserGetTpuChs(chan, &tpuch_rx, &tpuch_tx ) == FALSE ) return( ERROR ); // Calculate Instrument (TPU UART) Baud Rate tcr1_clock = TPUGetTCR1(); match_rate = PRAM[tpuch_rx][1]; tpu_baud = tcr1_clock / match_rate; connect_baud = MatchToStandardBaud((long)tpu_baud); baud_change = FALSE; if( MatchToStandardBaud(SerGetBaud(0L, 0L)) != connect_baud ){ printf("\n\nSwitching Console Baud Rate to: %ld!\n", connect_baud); freq_sav = SimGetFSys(); //save current sys freq baud_sav = SerGetBaud(0L, 0L); //save current sys baud switch( connect_baud ) { case 9600L: case 19200L: case 38400L: //assume we're operating at 16MHz, default SysFreq baud_new = SerSetBaud(connect_baud, 0L); case 57600L: case 115200L: SimSetFSys(14720000L); baud_new = SerSetBaud(connect_baud, 0L); break; default: printf("\n ERROR in InstrumentConnect() - Invalid Baud Rate!\n"); return( FALSE ); } baud_change = TRUE; } SerAllocBuffer(); SerInFlush(); tserInFlush( chan ); time(&start_time); for ( inchar = 0; inchar != CTRL_D; ) { if ( SerByteAvail() ){ inchar = SerGetByte(); tserPutc( chan, inchar); time(&start_time); //reset timeout starting point } outchar = tserGetcTmoutTicks( chan, TICKS_PER_SECOND/100 ); if ( outchar != ERROR ) SerPutByte( outchar ); time(¤t_time); if( difftime(current_time, start_time) >= 120.0 ){ // 2min timeout printf("\n Input Timeout, Exiting!\n"); break; } } if(baud_change == TRUE){ SimSetFSys(freq_sav); baud_new = SerSetBaud(baud_sav, 0L); Sleep(0); Sleep(TICKS_PER_SECOND); printf("\n Restored Console Baud Rate = %ld\n", baud_new ); } SerFreeBuffer(); SerInFlush(); return( TRUE ); } long MatchToStandardBaud(long baud) { char *standard_bauds[]={"9600", "19200", "38400", "57600", "115200"}; int i; long std_baud; for (i=0; i <= 4; i++) { std_baud = atol(standard_bauds[i]); if( fabs( ((double)std_baud - (double)baud) ) < 1000 ) return(std_baud); } return(ERROR); } ushort SerGetsTmout(char *buf, ushort buflen, ushort seconds) { register int c; register ushort nchars; StopWatchStart(); nchars = 0; buf[0] = '\0'; while( StopWatchTime() < (1000000L * seconds) ){ if ( SerByteAvail() ){ switch( c = SerGetByte() ){ case '\n': case '\r': if(nchars > 0) return( nchars ); else break; default: buf[nchars++] = (char)c; buf[nchars] = '\0'; if ( nchars >= (buflen-1) ) return( nchars ); break; } // end switch } // end if } // end while return( nchars ); } int SerPuts(char *str) { while (*str){ if (*str == '\n') SerPutByte('\r'); SerPutByte(*str++); } return( TRUE ); } int SerAllocBuffer(void) { // Bit5 in SCCR1 Register indicates whether SCI port is enabled // for interrupt driven buffered input. Has Bit 5 in SCCR1 been SET ? if( ( GetCPURegData((ulong)SCI_SCCR1_ADDR) & 0x0020 ) == FALSE){ SerSetInBuf(staticbuf, (long)RXBUFSIZE); SerInFlush(); } return( TRUE ); } int SerFreeBuffer(void) { // Has Rx Int Enable (Bit 5, RIE in SCCR1) been Set? if( (GetCPURegData((ulong)SCI_SCCR1_ADDR) & 0x0020) != FALSE){ SerSetInBuf(staticbuf, 0L); // force back to polled operation SerInFlush(); } return( TRUE ); }