#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <exec/libraries.h>
#include <devices/serial.h>

#include <clib/exec_protos.h>
#include <clib/alib_protos.h>
#include <clib/dos_protos.h>
#include <stdio.h>
#include <dos.h>
#include <string.h>
#include <time.h>

#include "async.h"


struct MsgPort *SerialMP;       /* pointer to our message port */
struct IOExtSer *SerialIO;      /* pointer to our IORequest */

void AsyncHand( int Handshake)
{
/* This Is NOT Needed (I Think) */
}

void AsyncSet( int Baud, int Control)
{
	 SerialIO->io_ExtFlags = Control;
         SerialIO->IOSer.io_Command  = SDCMD_SETPARAMS;
         DoIO((struct IORequest *)SerialIO);

/* This Has To Set The PARTIY!*/

}

int AsyncInStat( void )
{
         
         SerialIO->IOSer.io_Command  = SDCMD_QUERY;
         DoIO((struct IORequest *)SerialIO);
	 
	 return((int) SerialIO->IOSer.io_Actual );

/* Returns The NUmber of Characters In The INput Buffer */
}

unsigned int AsyncStat( void )
{

         SerialIO->IOSer.io_Command  = SDCMD_QUERY;
         DoIO((struct IORequest *)SerialIO);
	 if(SerialIO->io_Status == 4) 
		{
		 return(TRUE);
 		}
		else
		{
		 if(SerialIO->io_Status!=36)
		  {
		   printf("Status is %d\n",SerialIO->io_Status);
		  }
		 return(FALSE);
	    }



/* Returns The Values Of The Handshaking Lines */
}


int AsyncInit( int Port)
{
     
   SerialMP=CreateMsgPort();
	
	if (SerialIO = (struct IOExtSer *) CreateExtIO(SerialMP,sizeof(struct IOExtSer)))
	     {
		 /* Open the serial device */
      		if (OpenDevice(SERIALNAME,Port,(struct IORequest *)SerialIO,0L))
			{
		          printf("Error: %s did not open\n",SERIALNAME);
			  return(FALSE);
			}
			else
			{
			  printf("Serial Opened OK\n");
			}
		    }
   return(TRUE);
	  
}

void AsyncStop( void )
{
      CloseDevice((struct IORequest *)SerialIO);
	         DeleteExtIO((struct IORequest *)SerialIO);
        	 DeleteMsgPort(SerialMP);

}


void __regargs _CXBRK( void )
{
    AsyncClear();
    AsyncStop();
    printf("BREAK ***\n");
    exit(0);
}
void AsyncClear( void )
{
	SerialIO->IOSer.io_Command  = CMD_CLEAR;
	DoIO((struct IORequest *)SerialIO);

}

	   

void AsyncOut( int c)
{
         SerialIO->IOSer.io_Length   = 1;
         SerialIO->IOSer.io_Data     = c;
         SerialIO->IOSer.io_Command  = CMD_WRITE;
         DoIO((struct IORequest *)SerialIO);
	 printf("Sending \"%x\" ",c);
}

int AsyncIn( void ) 
{
	 int Single;
         SerialIO->IOSer.io_Length   = 1;
         SerialIO->IOSer.io_Data     = &Single;
         SerialIO->IOSer.io_Command  = CMD_READ;
         DoIO((struct IORequest *)SerialIO);
	 printf("Receiving \"%x\" ",Single);
	 return(Single);

}

