// MODEM.C
//

#include <stdio.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 "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];  // телефонный номер


static boolean    getmodem( const char *brand);
static boolean    sendlist( char **list, int timeout, int lasttimeout);
static boolean    sendalt( char *string, int timeout);

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( r_count_pending() > 0 ) {

		sread(str, i = r_count_pending(), 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( 3 );
				flag = 0;
				break;
			}

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

			putch(key);

			swrite( &key, 1);
		}

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

		if( r_count_pending() > 0 ) {

			delay(100);

			sread(str, i = r_count_pending(), 0);
			str[i] = '\0';

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



