
/*
 *  MODEM.C
 *
 *  (C) Copyright 1989-1990 by Matthew Dillon,  All Rights Reserved.
 *
 */

#include "includes.h"
#include "uucp.h"
#include "sysdep.h"
#include "modem.h"
#include "log.h"

/*
 *  NOTE:   modem stuff pretty much ignored if we are run from
 *	    a getty.
 */

#define MULTIMODEM	/*  I have a multi-modem    */

extern int Getty;
extern int IgnoreCD;

int twrite();
int instr();

void set_baud();

void
openline()
{
    signal(SIGINT,sigint);
    IgnoreCD |= 4;
start_again:
    chkabort();
    if (instr("CONNECT", 7))
	goto start_again;


#ifdef MULTIMODEM

#else
    set_baud(get_baud());
#endif
    Delay(120); /* sleep 2 seconds */

    IgnoreCD &= ~4;
}

#ifndef MULTIMODEM

int
get_baud()
{
/* We've seen the CONNECT message, now we must see what baud rate
   we've connected with */
/* gather input until \r then see if it's 300, 1200, or 2400 */
/* this is for hayes compatibles */

	int data;
	char rate[10];
	int rate_inx = 0;

	DEBUG(2,"looking for baud rate\n",0);

	while ( ((data = xgetc(BYTE_TO)) != EOF) && ((char)data != '\r')) {
	    if ((char)data == ' ') continue;
	    rate[rate_inx++] = (char)data;
	}
	DEBUG(2, "found baud rate of %s\n", rate);
	if (strncmp(rate,"1200",4) == 0) return 1200;
	if (strncmp(rate,"2400",4) == 0) return 2400;
	if (rate_inx == 0) return 300;
	return 1200;  /* default */
}

#endif

void
modem_init()
{
    reset_modem();
}

/*
 * Simple dialer routine.  Needs replacement with a full blown
 * script driven dialer.  Next week maybe :-).	FIXME.
 */

int
dial_nbr(nbr)
char  *nbr;
{
    char  dial[30];
    int   i;

    IgnoreCD |= 4;

    sprintf(dial, "%s%s\r", "ATDT", nbr);

    DEBUG(2,"dialing %s\n", dial);

    twrite(dial, strlen(dial));

    i = instr("CONNECT", 7);

    if (i == 0)     /*  for those modems which don't bring CD up */
	Delay(50);  /*  immediately                              */

    IgnoreCD &= ~4;

    return (i);
}

/*
 *  RESET_MODEM()
 *
 *  If run from a Getty we do NOT reset the modem, which would
 *  disconnect an already connected connection.
 *
 *  Note that the delay between CloseSerial() and OpenSerial() only
 *  serves to give the Getty, if running, time to lock the port and
 *  begin a disconnect sequence.
 */

void
reset_modem()
{
    if (Getty)          /*  called from a getty             */
	return;
    DEBUG(4, "Beg-Reset\n", 0);
    CloseSerial();      /*  drop dtr            */
    Delay(50*3);        /*  delay 3 seconds     */
    DEBUG(4, "End-Reset-1\n", 0);
    OpenSerial();       /*  re-open serial      */
    DEBUG(4, "End-Reset-2\n", 0);
}

#ifdef NOTDEF

    if (GettyCmd(DeviceName, DeviceUnit, '0', NULL) == 0)
	return;

    /*
     *	Getty doesn't exist, we have to reset the modem ourselves!
     */

    IgnoreCD |= 4;

#ifdef MULTIMODEM
    set_baud(19200);

    if (CheckCarrier()) {
	Delay(60);
	twrite("+++", 3);
	Delay(120);
    }
    twrite("ATH0\r", 5);
    instr("OK\r\n", 4);
    twrite("ATZ\r", 4);
    instr("OK\r\n", 4);
    twrite("ATZ\r", 4);
    instr("OK\r\n", 4);

    /*amiga_closeopen();*/
    sprintf(init, "%s\r", "ATM0S0=2X4$BA0");
    if (debug > 0)
	init[3] = '1';
    twrite(init, strlen(init));
    instr("OK\r\n",4);
#else
    twrite("+++", 3);
    Delay(60);
    twrite("ATH0\r", 5);
    Delay(120);
    twrite("ATZ\r", 4);
    Delay(60);
    twrite("ATZ\r", 4);
    Delay(60);
    sprintf(init, "%s\r", "ATS2");
    twrite(init, strlen(init));
    Delay(60);
#endif
    IgnoreCD &= ~4;
}

#endif

