//
// Hearsay II Magic Modem Driver 15/06/92
// Copyright  RISC Developments Limited 1992
//

int modemrxrate;
int modemtxrate;
int modembits;
int modemstop;
int modemparity;
int modemport;
int modemflow;
int modemlink;
int modemanswer;



// count or purge buffer

int modem_countpurge(int rxtx,int code)
{
 return(devcon(Device_CountPurge,modemport,rxtx,code));
}


// generate break for time cs

void modem_break(int time)
{
 devcon(Device_Break,modemport,time,0);
}


// tell modem to use a given sort of flow control

void modem_setflow(int flow)
{
 devcon(Device_Flow,modemport,flow,1);
 modemflow=flow;
}


// read flow control in use

int modem_readflow(void)
{
 modemflow=devcon(Device_Flow,modemport,0,0);
 return(modemflow);
}


// tell modem to use a given sort of link level protocol

int modem_link(int link)
{
 modemlink=internal_link(link);
 return(modemlink);
}


// read rx baud rate at which modem is talking to outside world

int modem_readrxrate(void)
{
 return(modemrxrate);
}


// set rx rate

void modem_setrxrate(int rate)
{
 devcon(Device_RxRate,modemport,rate,1);
 modemrxrate=devcon(Device_RxRate,modemport,0,0);
}


// read tx baud rate at which modem is talking to outside world

int modem_readtxrate(void)
{
 return(modemtxrate);
}


// set tx rate

void modem_settxrate(int rate)
{
 devcon(Device_TxRate,modemport,rate,1);
 modemtxrate=devcon(Device_TxRate,modemport,0,0);
}


// read number of data bits

int modem_readbits(void)
{
 return(modembits);
}


// set number of data bits

void modem_setbits(int bits)
{
 devcon(Device_DataBits,modemport,bits,1);

 modembits=devcon(Device_DataBits,modemport,0,0);
 modemparity=devcon(Device_ParityBits,modemport,0,0);
 modemstop=devcon(Device_StopBits,modemport,0,0);
}


// read parity bits

int modem_readparity(void)
{
 return(modemparity);
}


// set parity bits

void modem_setparity(int parity)
{
 devcon(Device_ParityBits,modemport,parity,1);

 modembits=devcon(Device_DataBits,modemport,0,0);
 modemparity=devcon(Device_ParityBits,modemport,0,0);
 modemstop=devcon(Device_StopBits,modemport,0,0);
}


int modem_readstop(void)
{
 return(modemstop);
}


// set stop bits

void modem_setstop(int stop)
{
 devcon(Device_StopBits,modemport,stop,1);

 modembits=devcon(Device_DataBits,modemport,0,0);
 modemparity=devcon(Device_ParityBits,modemport,0,0);
 modemstop=devcon(Device_StopBits,modemport,0,0);
}


// read answer/originate mode

int modem_readanswer(void)
{
 return(modemanswer);
}


// set answer/originate mode

void modem_setanswer(int answer)
{
 modemanswer=answer;
}


// is the modem on line ?

int magicofftime;

int modem_online(void)
{
 int temp;

 temp=devcon(Device_Status,modemport,0,-1);
 temp=!(temp & SERIAL_DSR);

 if(temp)
 {
  magicofftime=-1;
  return(1);
 }
 else
 {
  if(magicofftime==-1) magicofftime=clock()+500;
  else
  {
   if(clock()>magicofftime)
   {
    devcon(Device_Select,modemport,0,0);
    return(0);
   }
   else return(1);
  }
 }
}


void magipause(int time)
{
 time=clock()+time;

 while(clock()<time) sgetc(1);
}


void magicon(void)
{
 int ontime;
 int cdtime;
 int offtime;
 int time;
 int temp;

 tprints("|M|JAttempting to connect...|M|J");

 devcon(Device_Select,modemport,1,0);

 devcon(Device_CountPurge,modemport,1,0);
 devcon(Device_CountPurge,modemport,0,0);

 time=clock()+6000;
 ontime=-1;
 cdtime=100;
 offtime=clock();

 while(clock()<time)
 {
  temp=devcon(Device_Status,modemport,0,-1);

  if(temp & SERIAL_DSR)
  {
   ontime=-1;
   if((clock()-offtime)>3000) break;
   else
   {
    magipause(1);
    continue;
   }
  }
  
  offtime=clock();

  if(ontime==-1) ontime=clock();

  if((clock()-ontime)>cdtime) 
  {
   tprints("Connect|M|J");
   onlinechange(1);
   return;
  }
 }

 devcon(Device_Select,modemport,0,0);
 tprints("|M|JFailed to connect|M|J");
}


// dial a number and attempt to go on line

void modem_dial(string number)
{
 int i;
 int j;
 int k;
 int t;
 int len;

 devcon(Device_Select,modemport,1,0);
 devcon(Device_TxRate,modemport,19200,1);
 devcon(Device_RxRate,modemport,19200,1);


 magipause(400);

 len=slen(number);

 tprints("|M|JDialling:");

 for(i=0;i<len;i++)
 {
  t=schar(number,i);
  tputc(t);

  if(t==',') magipause(400);
  
  if(t>='0' && t<='9')
  {
   if((k=t-'0')==0) k=10;
   for(j=0;j<k;j++)
   {
    t=clock();
    devcon(Device_Select,modemport,0,0);              /* lo */
    while(clock()<=t+5);
    devcon(Device_Select,modemport,1,0);              /* hi */
    while(clock()<=t+9);
   }
   magipause(80);
  }
 }


 devcon(Device_TxRate,modemport,modemtxrate,1);
 devcon(Device_RxRate,modemport,modemrxrate,1);

 magicon();
}


// reconnect

void modem_reconnect(void)
{
}


// talk to modem

void modem_talk(void)
{
}


// put modem off line


void modem_disconnect(void)
{
 devcon(Device_Select,modemport,0,0);
 onlinechange(0);
}


// put modem on line

void modem_connect(void)
{
 devcon(Device_Select,modemport,1,0);
 magicon();
}


// called when Hearsay is about to terminate
// good time to hang up line etc.

void modem_terminate(void)
{
 devcon(Device_Select,modemport,0,0);
}


// cancel modem operation

void modem_interrupt(void)
{
 modem_disconnect();
}


// called when driver is installed
// will be followed by call to set baud rates/bits

int modem_initiate(int port)
{
 int code;

 modemport=port;

 if(!devcon(Device_Claim,modemport,0,0)) return(2);

 devcon(Device_Select,modemport,0,0);

 devcon(Device_Channel,modemport,0,0);

 return(0);
}


void main(void)
{


}
