home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Frozen Fish 2: PC
/
frozenfish_august_1995.bin
/
bbs
/
d03xx
/
d0326.lha
/
MicroTerm
/
console.c
< prev
next >
Wrap
C/C++ Source or Header
|
1990-03-05
|
6KB
|
204 lines
/** console.c
Written by Stephen Vermeulen (403) 282-7990
PO Box 3295, Station B,
Calgary, Alberta, CANADA, T2M 4L8
this set of routines is all that is required to talk across
the serial line, including a console device attached to an
intuition window for user IO.
**/
/** opens up the console device window so that we can talk
to the modem...
**/
struct Window *cw; /* console talk window */
struct IOStdReq *cwread, *cwwrite; /** messages for console window **/
struct MsgPort *cwport; /** message port for console window **/
open_con()
{
cw = OpenWindow(&new_cw);
if (cw)
{
SetMenuStrip(cw, &term_menu);
cwport = CreatePort(NULL, 0L);
if (cwport)
{
cwread = CreateStdIO(cwport);
if (cwread)
{
cwwrite = CreateStdIO(cwport);
if (cwwrite)
{
cwwrite->io_Data = (APTR) cw;
cwwrite->io_Length = 4L;
if (OpenDevice("console.device", 0L, cwwrite, 0L))
{
/** failure **/
DeleteStdIO(cwwrite);
}
else
{
/** success **/
cwread->io_Device = cwwrite->io_Device;
CopyMem(cwwrite, cwread, (long) sizeof(struct IOStdReq));
return(TRUE);
}
}
DeleteStdIO(cwread);
}
DeletePort(cwport);
}
CloseWindow(cw);
}
return(FALSE);
}
close_con()
{
CloseDevice(cwwrite);
DeleteStdIO(cwwrite);
DeleteStdIO(cwread);
DeletePort(cwport);
ClearMenuStrip(cw);
CloseWindow(cw);
}
/** some buffers to hold data...
**/
UBYTE conbuf[256];
con_talk(ms)
struct MySer *ms;
{
short num, i, more;
long len;
struct Message *emsg;
struct IntuiMessage *msg;
if (open_con());
{
/** do our intial reads from the console and serial devices to
get the ball rolling...
**/
cwread->io_Command = CMD_READ;
cwread->io_Flags = 0;
cwread->io_Length = 255;
cwread->io_Data = (APTR) conbuf;
SendIO(cwread);
ms->readio->IOSer.io_Command = CMD_READ;
ms->readio->IOSer.io_Flags = 0;
ms->readio->IOSer.io_Length = 1;
ms->readio->IOSer.io_Data = (APTR) ms->readdata;
SendIO(ms->readio);
more = TRUE;
while(more)
{
Wait( (1L << cw->UserPort->mp_SigBit)
| (1L << cwport->mp_SigBit)
| (1L << ms->readport->mp_SigBit) );
if (emsg = GetMsg(cwport)) /** key(s) pressed, so send to ser **/
{
ms->writeio->IOSer.io_Command = CMD_WRITE;
ms->writeio->IOSer.io_Flags = 0;
ms->writeio->IOSer.io_Length = cwread->io_Actual;
CopyMem(conbuf, ms->writedata, (long) cwread->io_Actual);
ms->writeio->IOSer.io_Data = (APTR) ms->writedata;
DoIO(ms->writeio); /** wait till serial device has sent it **/
cwread->io_Command = CMD_READ;
cwread->io_Flags = 0;
cwread->io_Length = 255;
cwread->io_Data = (APTR) conbuf;
SendIO(cwread);
}
if (emsg = GetMsg(ms->readport)) /** serial info received, print it **/
{
/** first send the one lone byte we requested ages ago,
then request any additional stuff that may be queued up.
**/
cwwrite->io_Command = CMD_WRITE;
cwwrite->io_Flags = 0;
cwwrite->io_Length = 1;
cwwrite->io_Data = (APTR) ms->readdata;
DoIO(cwwrite);
/** ask for number of serial bytes queued up...
**/
ms->readio->IOSer.io_Command = SDCMD_QUERY;
ms->readio->IOSer.io_Length = 0;
DoIO(ms->readio);
if (ms->readio->IOSer.io_Actual)
{
/** there were some bytes queued up at the serial device,
so now ask for these...
**/
ms->readio->IOSer.io_Command = CMD_READ;
len = ms->readio->IOSer.io_Actual;
len = min(256L, len);
ms->readio->IOSer.io_Length = len;
ms->readio->IOSer.io_Flags = 0;
ms->readio->IOSer.io_Data = (APTR) ms->readdata;
ms->readio->IOSer.io_Error = 0;
DoIO(ms->readio);
cwwrite->io_Command = CMD_WRITE;
cwwrite->io_Flags = 0;
cwwrite->io_Length = len;
cwwrite->io_Data = (APTR) ms->readdata;
DoIO(cwwrite);
}
/** finally ask for another lone byte... **/
ms->readio->IOSer.io_Command = CMD_READ;
ms->readio->IOSer.io_Flags = 0;
ms->readio->IOSer.io_Length = 1;
ms->readio->IOSer.io_Data = (APTR) ms->readdata;
SendIO(ms->readio);
}
while (msg = (struct IntuiMessage *) GetMsg(cw->UserPort))
{
if (msg->Class == MENUPICK)
{
num = msg->Code;
while (num != MENUNULL)
{
switch (MENUNUM(num))
{
case 0:
switch (ITEMNUM(num))
{
case 0: /** does nothing **/
break;
case 1: /** about **/
break;
case 2: /** help **/
break;
case 3: /** quit **/
more = FALSE;
break;
}
default:
break;
}
num = ItemAddress(&term_menu, (long) num)->NextSelect;
}
}
ReplyMsg(msg);
}
} /** end while(more) do **/
done_term:
AbortIO(cwread);
AbortIO(ms->readio);
WaitIO(cwread);
WaitIO(ms->readio);
close_con();
}
}