📄 init.c
字号:
LFTTYFONT( TTYInfo ).lfCharSet = OEM_CHARSET ;
LFTTYFONT( TTYInfo ).lfOutPrecision = OUT_DEFAULT_PRECIS ;
LFTTYFONT( TTYInfo ).lfClipPrecision = CLIP_DEFAULT_PRECIS ;
LFTTYFONT( TTYInfo ).lfQuality = DEFAULT_QUALITY ;
LFTTYFONT( TTYInfo ).lfPitchAndFamily = FIXED_PITCH | FF_MODERN ;
strcpy( LFTTYFONT( TTYInfo ).lfFaceName, "FixedSys" ) ;
InitNewFont( LFTTYFONT(TTYInfo), RGB(0,0,0));
ClearTTYContents();
return ( TRUE ) ;
}
/*-----------------------------------------------------------------------------
FUNCTION: DestroyTTYInfo
PURPOSE: Frees objects associated with the TTYInfo structure
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
2/14/96 AllenD Removed npTTYInfo
-----------------------------------------------------------------------------*/
void DestroyTTYInfo()
{
DeleteObject(HTTYFONT(TTYInfo));
}
/*-----------------------------------------------------------------------------
FUNCTION: StartThreads
PURPOSE: Creates the Reader/Status and Writer threads
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
-----------------------------------------------------------------------------*/
void StartThreads(void)
{
DWORD dwReadStatId;
DWORD dwWriterId;
READSTATTHREAD(TTYInfo) =
CreateThread( NULL,
0,
(LPTHREAD_START_ROUTINE) ReaderAndStatusProc,
(LPVOID) ghWndTTY,
0,
&dwReadStatId);
if (READSTATTHREAD(TTYInfo) == NULL)
ErrorInComm("CreateThread(Reader/Status)");
WRITERTHREAD(TTYInfo) =
CreateThread( NULL,
0,
(LPTHREAD_START_ROUTINE) WriterProc,
(LPVOID) NULL,
0,
&dwWriterId );
if (WRITERTHREAD(TTYInfo) == NULL)
ErrorInComm("CreateThread (Writer)");
return;
}
/*-----------------------------------------------------------------------------
FUNCTION: SetupCommPort( void )
PURPOSE: Setup Communication Port with our settings
RETURN:
Handle of comm port is successful
NULL is error occurs
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
-----------------------------------------------------------------------------*/
HANDLE SetupCommPort()
{
//
// get tty settings from settings dialog
//
UpdateTTYInfo();
//
// open communication port handle
//
COMDEV( TTYInfo ) = CreateFile( gszPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
0);
if (COMDEV(TTYInfo) == INVALID_HANDLE_VALUE) {
ErrorReporter("CreateFile");
return NULL;
}
//
// Save original comm timeouts and set new ones
//
if (!GetCommTimeouts( COMDEV(TTYInfo), &(TIMEOUTSORIG(TTYInfo))))
ErrorReporter("GetCommTimeouts");
//
// Set port state
//
UpdateConnection();
//
// set comm buffer sizes
//
SetupComm(COMDEV(TTYInfo), MAX_READ_BUFFER, MAX_WRITE_BUFFER);
//
// raise DTR
//
if (!EscapeCommFunction(COMDEV(TTYInfo), SETDTR))
ErrorReporter("EscapeCommFunction (SETDTR)");
//
// start threads and set initial thread state to not done
//
StartThreads();
//
// set overall connect flag
//
CONNECTED( TTYInfo ) = TRUE ;
return COMDEV(TTYInfo);
}
/*-----------------------------------------------------------------------------
FUNCTION: WaitForThreads(DWORD)
PURPOSE: Waits a specified time for the worker threads to exit
PARAMETERS:
dwTimeout - milliseconds to wait until timeout
RETURN:
WAIT_OBJECT_0 - successful wait, threads are not running
WAIT_TIMEOUT - at least one thread is still running
WAIT_FAILED - failure in WaitForMultipleObjects
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
----------------------------------------------------------------------------*/
DWORD WaitForThreads(DWORD dwTimeout)
{
HANDLE hThreads[2];
DWORD dwRes;
hThreads[0] = READSTATTHREAD(TTYInfo);
hThreads[1] = WRITERTHREAD(TTYInfo);
//
// set thread exit event here
//
SetEvent(ghThreadExitEvent);
dwRes = WaitForMultipleObjects(2, hThreads, TRUE, dwTimeout);
switch(dwRes)
{
case WAIT_OBJECT_0:
case WAIT_OBJECT_0 + 1:
dwRes = WAIT_OBJECT_0;
break;
case WAIT_TIMEOUT:
if (WaitForSingleObject(READSTATTHREAD(TTYInfo), 0) == WAIT_TIMEOUT)
OutputDebugString("Reader/Status Thread didn't exit.\n\r");
if (WaitForSingleObject(WRITERTHREAD(TTYInfo), 0) == WAIT_TIMEOUT)
OutputDebugString("Writer Thread didn't exit.\n\r");
break;
default:
ErrorReporter("WaitForMultipleObjects");
break;
}
//
// reset thread exit event here
//
ResetEvent(ghThreadExitEvent);
return dwRes;
}
/*-----------------------------------------------------------------------------
FUNCTION: BreakDownCommPort
PURPOSE: Closes a connection to a comm port
RETURN:
TRUE - successful breakdown of port
FALSE - port isn't connected
COMMENTS: Waits for threads to exit,
clears DTR, restores comm port timeouts, purges any i/o
and closes all pertinent handles
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
-----------------------------------------------------------------------------*/
BOOL BreakDownCommPort()
{
if (!CONNECTED(TTYInfo))
return FALSE;
CONNECTED( TTYInfo ) = FALSE;
//
// wait for the threads for a small period
//
if (WaitForThreads(20000) != WAIT_OBJECT_0)
/*
if threads haven't exited, then they will
interfere with a new connection. I must abort
the entire program.
*/
ErrorHandler("Error closing port.");
//
// lower DTR
//
if (!EscapeCommFunction(COMDEV(TTYInfo), CLRDTR))
ErrorReporter("EscapeCommFunction(CLRDTR)");
//
// restore original comm timeouts
//
if (!SetCommTimeouts(COMDEV(TTYInfo), &(TIMEOUTSORIG(TTYInfo))))
ErrorReporter("SetCommTimeouts (Restoration to original)");
//
// Purge reads/writes, input buffer and output buffer
//
if (!PurgeComm(COMDEV(TTYInfo), PURGE_FLAGS))
ErrorReporter("PurgeComm");
CloseHandle(COMDEV(TTYInfo));
CloseHandle(READSTATTHREAD(TTYInfo));
CloseHandle(WRITERTHREAD(TTYInfo));
return TRUE;
}
/*-----------------------------------------------------------------------------
FUNCTION: DisconnectOK
PURPOSE: Asks user if it is OK to disconnect
RETURN:
TRUE - OK to disconnect
FALSE - Disconnect not OK
HISTORY: Date: Author: Comment:
10/27/95 AllenD Wrote it
-----------------------------------------------------------------------------*/
BOOL DisconnectOK()
{
if (!CONNECTED(TTYInfo))
return TRUE;
return ((MessageBox(ghwndMain, "OK to Disconnect?", gszPort, MB_YESNO)) == IDYES);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -