// MODEM.C
//

// (C) Фролов Г.В., 1995
// Адрес E-mail: frolov@glas.apc.org


#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <sys/types.h>

#include "uart.h"
#include "common.h"
#include "modem.h"
#include "mod_link.h"
#include "get_word.h"
#include "timer.h"
#include "tools.h"
#include "conf.h"


char *device = "COM3";  // номер используемого порта в формате
								// COMn, где n от 1 до 4

unsigned  dialTimeout = 12,   // продолжительность ожидания соединения
			 chardelay = 0,      // задержка при передаче между символами
			 modemTimeout = 3,   // таймаут на получение ответа от модема
			 answerTimeout;      // ппродолжительность ожидания звонка


unsigned  speed = 2400;     // скорость обмена данными


char initialize[80];    // команда инициализации
char dropline[80];      // команда повесить трубку
char autoanswer[80];    // ответ на вызов в режиме автоответа

char dialPrefix[80];  // префикс номера
char dialSuffix[80];  // суффикс номера
char dialNumber[80];  // телефонный номер

void Exchange( void );


// Call
// вызов удаленного пользователя

int Call() {

	char str[80], buf[80];
	char *exp;
	int i,j;

	// определяем параметры связи (считываем файл конфигурации)

	GetConfig();

	// устанавливаем обработчик прерываний и инициализируем
	// регистры UART и контроллера прерываний

	if (OpenLine(device, speed))
		return FALSE;

	// очищаем приемный буфер

	while (SRead(buf,1,0));

	printf("инициализируем модем\n\n");

	// передаем модему строку инициализации
	// (строка инициализации определяется ключевым словом Initialize
	// в файле конфигурации setup.cfg)

	SendStr( initialize );

	// ожидаем ответа модема

	Sleep(modemTimeout);

	// считываем и отображаем на экране ответное сообщение модема

	if( RCountPending() > 0 ) {

		SRead(str, i = RCountPending(), 0);
		str[i] = '\0';

		for( j = 0; j < i; j++ )
			putch( str[j] );
	}

	// передаем модему команду наборра номера

	strcpy(buf, dialPrefix);
	strcat(buf, dialNumber);
	strcat(buf, dialSuffix);

	printf( "набираем номер\n\n");

	SendStr( buf );

	printf( "ожидаем соединение\n\n");

	// производим обмен данными с удаленным модемом,
	// пока не нажата клавиша "ESC"

	Exchange();

	return(0);
}

// ansver
// отвечает на звонок

int Ansver( void ) {

	char c;

	// определяем параметры связи

	GetConfig();

	// устанавливаем обработчик прерываний и инициализируем
	// регистры UART и контроллера прерываний

	if (OpenLine(device, speed))
		exit(-2);

	// очищаем приемный буфер

	while (SRead(&c ,1,0));

	printf("инициализируем модем\n\n");

	// передаем модему строку инициализации
	// (строка инициализации определяется ключевым словом Autoanswer
	// в файле конфигурации setup.cfg)

	SendStr( autoanswer );
	Sleep(modemTimeout);

	printf("ожидаем звонок\n");

	// производим обмен данными с удаленным модемом,
	// пока не нажата клавиша "ESC"

	Exchange();

	return(0);
}


// shutdown
// функция кладет телефонную трубку

void ShutDown( void ) {

	printf("\n\nсвязь окончена, освобождаем телефон\n");

	// передааем команду пположить трубку

	SendStr( dropline );

	// восстанавливаем старый обработчик прерываний

	CloseLine();
}


// SlowWrite
// передать символ модему с задержкой, определяемой ключевым
// словом CharDelay в файле конфигурации

void SlowWrite( char *s, int len) {

	SWrite( s , len );
	if (chardelay > 0) Delay(chardelay);
}


// Exchange
// функция выполняет диалог пользователя и удаленного модема

void Exchange( void ) {

	int flag = 1;

	while(flag) {

		unsigned char str[80];
		unsigned char key;
		unsigned i,j;

		// если пользователь нажал на клавиатуру, получаем код
		// нажатого символа и передаем его модему

		if( kbhit() ) {
			key =  getch();

			// по нажатию клавиши "ESC" выходим из программы

			if( key == 27 ) {
				SSendBrk( );
				flag = 0;
				break;
			}

			if( key == '\r' ) putch( '\n' );

			putch(key);

			SWrite( &key, 1);
		}

		// если получены данные от модема, отображаем их на экране

		if( RCountPending() > 0 ) {

			Delay(100);

			SRead(str, i = RCountPending(), 0);
			str[i] = '\0';

			for( j = 0; j < i; j++ )
				putch( str[j] );
		}
	}
}



