;/* DeviceUse.c - Execute me to compile me with SAS C 5.10
LC -b1 -cfistq -v -y -j73 DeviceUse.c
Blink FROM LIB:c.o,DeviceUse.o TO DeviceUse LIBRARY LIB:LC.lib,LIB:Amiga.lib
quit
/* The following short example demonstrates use of an Amiga device. The */
/* example opens the serial.device and then demonstrates both */
/* synchronous (DoIO()) and asynchronous (SendIO()) use of the serial */
/* command SDCMD_QUERY. This command is used to determine the status of */
/* the serial device lines and registers. The example uses the backward */
/* compatible amiga.lib functions for creation and deletion of the */
/* message port and I/O request. */
/* DeviceUse.c - an example of using an Amiga device (here, serial device) */
/* - attempt to create a message port with CreatePort() (from amiga.lib) */
/* - attempt to create the I/O request with CreateExtIO() (from amiga.lib) */
/* - attempt to open the serial device with Exec OpenDevice() */
/* */
/* If successful, use the serial command SDCMD_QUERY, then reverse our steps. */
/* If we encounter an error at any time, we will gracefully exit. Note that */
/* applications which require at least V37 OS should use the Exec functions */
/* CreateMsgPort()/DeleteMsgPort() and CreateIORequest()/DeleteIORequest() */
/* instead of the similar amiga.lib functions which are used in this example. */
#include <exec/types.h>
#include <exec/memory.h>
#include <exec/io.h>
#include <devices/serial.h>
#include <clib/exec_protos.h> /* Prototypes for Exec library functions */
#include <clib/alib_protos.h> /* Prototypes for amiga.lib functions */
#include <stdio.h>
#ifdef LATTICE
int CXBRK(void) { return(0); } /* Disable SAS CTRL/C handling */
int chkabort(void) { return(0); } /* really */
#endif
void main(void)
{
struct MsgPort *serialMP; /* for pointer to our message port */
struct IOExtSer *serialIO; /* for pointer to our I/O request */
struct IOExtSer *reply; /* for use with GetMsg */
if (serialMP=CreatePort(NULL,NULL)) /* Create the message port. */
{
/* Create the I/O request. Note that <devices/serial.h> defines the type */
/* of IORequest required by the serial device--an IOExtSer. Many devices */
/* require specialized extended IO requests which start with an embedded */
/* struct IORequest. The generic Exec and amiga.lib device IO functions */
/* are prototyped for IORequest, so some pointer casting is necessary. */
if (serialIO = (struct IOExtSer *)CreateExtIO(serialMP,sizeof(struct IOExtSer)))
{
/* Open the serial device (non-zero return value means failure here). */
if (OpenDevice( SERIALNAME, 0, (struct IORequest *)serialIO, 0L))
printf("Error: %s did not open\n",SERIALNAME);
else
{
/* Device is open */ /* DoIO - demonstrates synchronous */
serialIO->IOSer.io_Command = SDCMD_QUERY; /* device use, returns error or 0. */
if (DoIO((struct IORequest *)serialIO))
printf("Query failed. Error - %d\n",serialIO->IOSer.io_Error);
else
/* Print serial device status - see include file for meaning */
/* Note that with DoIO, the Wait and GetMsg are done by Exec */
printf("Serial device status: $%x\n\n",serialIO->io_Status);
serialIO->IOSer.io_Command = SDCMD_QUERY; /* SendIO - demonstrates asynchronous */
SendIO((struct IORequest *)serialIO); /* device use (returns immediately). */
/* We could do other things here while the query is being done. */
/* And to manage our asynchronous device IO: */
/* - we can CheckIO(serialIO) to check for completion */
/* - we can AbortIO(serialIO) to abort the command */
/* - we can WaitPort(serialMP) to wait for any serial port reply */
/* OR we can WaitIO(serialIO) to wait for this specific IO request */
/* OR we can Wait(1L << serialMP_>mp_SigBit) for reply port signal */
Wait(1L << serialMP->mp_SigBit);
while(reply = (struct IOExtSer *)GetMsg(serialMP))
{ /* Since we sent out only one serialIO request the while loop is */
/* not really needed--we only expect one reply to our one query */
/* command, and the reply message pointer returned by GetMsg() */
/* will just be another pointer to our one serialIO request. */
/* With Wait() or WaitPort(), you must GetMsg() the message. */
if(reply->IOSer.io_Error)
printf("Query failed. Error - %d\n",reply->IOSer.io_Error);
else
printf("Serial device status: $%x\n\n",reply->io_Status);
}
CloseDevice((struct IORequest *)serialIO); /* Close the serial device. */
}
DeleteExtIO(serialIO); /* Delete the I/O request. */
}
else printf("Error: Could create I/O request\n"); /* Inform user that the I/O */
/* request could be created. */
DeletePort(serialMP); /* Delete the message port. */
}
else printf("Error: Could not create message port\n"); /* Inform user that the message*/
} /* port could not be created. */