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

#include <windows.h>
#include "tele.h"

// ===================================================================
// Функция InitComPort
// ===================================================================
int InitCommPort(HWND hwnd)
{
	DCB	dcb;					// структура DCB
	int	idCommPort;			// идентификатор COM-порта

	char	szPort[6];			// имя порта
	char	szInitMode[40];	// режим работы

	int	nResult;				// временная переменная

	// Определяем режим работы COM-порта, для этого считываем
	// строку Mode из раздела Port файла phone.ini
	GetPrivateProfileString("Port", "Mode", "COM2:2400,n,8,1",
									szInitMode, sizeof(szInitMode), "teletype.ini");

	// Открываем COM-порт, заданный в строке szInitMode
	wsprintf( szPort, "COM%c", szInitMode[3] );

	idCommPort = OpenComm(szPort, INQUEUE, OUTQUEUE);
	if (idCommPort < 0)
		return idCommPort;

	// Заполняем структуру DCB в соответствии с szInitMode
	nResult = BuildCommDCB(szInitMode,&dcb);
	if (nResult < 0)
		return nResult;

	// Устанавливаем новый режим работы COM-порта
	nResult = SetCommState(&dcb);
	if (nResult < 0)
		return nResult;

	// Удаляем данные из входной и выходной очередей COM-порта
	FlushComm(idCommPort, 1);
	FlushComm(idCommPort, 0);

	// Разрешаем генерацию сообщения WM_COMMNOTIFY
	if(!EnableCommNotification(idCommPort,hwnd,32,-1))
		return -1;

	// Подаем сигнал DTR
	EscapeCommFunction(idCommPort, SETDTR);

	return idCommPort;
}

// ===================================================================
// Функция CloseComPort
// ===================================================================
int CloseCommPort(int idCommPort)
{
	// Сбрасываем сигнал DTR
	EscapeCommFunction(idCommPort, CLRDTR);

   // Закрываем COM-порт
	CloseComm(idCommPort);

	return 0;
}


// ===================================================================
// Функция ReadComPort
// ===================================================================
int ReadCommPort(int idComDev, LPSTR szDest, int nLength)
{

	COMSTAT ComStat;
	int nTotalRead = 0, nRead = 0;

	// Цикл чтения данных из входной очереди COM-порта
	while(nLength > nTotalRead)
	{
   	// Определяем есть ли данные во входной очереди
		GetCommError(idComDev,&ComStat);

		if (ComStat.cbInQue == 0)
			break;

		// Считываем данные из входной очереди COM-порта
		nRead = ReadComm(idComDev,&(szDest[nTotalRead]),
													nLength - nTotalRead);
		// Возникла ошибка 
		if(nRead < 0)
		{
			nTotalRead = -nTotalRead - nRead;
			break;
		}

		nTotalRead += nRead;
	}

	return nTotalRead;
}

