Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

198 lines
5.3 KiB
C++

#ifdef TEST_RIO
#include "stdafx.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
#else // !TEST_RIO
//mech
#endif // TEST_RIO
const char g_szPortFormat[] = "\\\\.\\com%d";
C232Comm::C232Comm()
: m_hCom(INVALID_HANDLE_VALUE), m_nPort(0)
{
}
C232Comm::~C232Comm()
{
Close();
}
BOOL C232Comm::Open(int nPort, DWORD dwBaudRate/* = CBR_9600*/, BYTE byParity/* = NOPARITY*/, BYTE bByteSize/* = 8*/, BYTE byStopBits/* = ONESTOPBIT*/)
{
m_nPort = nPort;
char sz[32];
sprintf(sz, g_szPortFormat, m_nPort);
m_hCom = CreateFile(sz, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (IsValid()) {
m_cp.wPacketLength = sizeof(COMMPROP); /* get comm properties */
if (GetCommProperties(m_hCom, &m_cp)) {
if (GetCommState(m_hCom, &m_dcb)) {
m_dcb.BaudRate = (DWORD)dwBaudRate;
m_dcb.ByteSize = bByteSize; // ONESTOPBIT TWOSTOPBITS
m_dcb.Parity = byParity; // NOPARITY EVENPARITY ODDPARITY
m_dcb.StopBits = byStopBits;
m_dcb.fOutxCtsFlow = 0;
m_dcb.fOutxDsrFlow = 0;
m_dcb.fRtsControl = 0;
m_dcb.fDtrControl = DTR_CONTROL_ENABLE; // HANDSHAKE; // 9;
m_dcb.fOutX = 0;
m_dcb.fInX = 0;
if (SetCommState(m_hCom, &m_dcb)) {
memset(&m_commTimeOuts, 0, sizeof(m_commTimeOuts));
m_commTimeOuts.ReadIntervalTimeout = MAXDWORD;
m_commTimeOuts.ReadTotalTimeoutMultiplier = 0;
m_commTimeOuts.ReadTotalTimeoutConstant = 0;
m_commTimeOuts.WriteTotalTimeoutMultiplier = 5;
m_commTimeOuts.WriteTotalTimeoutConstant = 5;
if (SetupComm(m_hCom, 2048*5, 1024)) {
if (SetCommTimeouts(m_hCom , &m_commTimeOuts)) {
if (GetCommTimeouts(m_hCom , &m_commTimeOuts)) {
if (GetCommState(m_hCom, &m_dcb)) {
m_dcb.fDtrControl = DTR_CONTROL_DISABLE;
Sleep(10);
SetCommState(m_hCom, &m_dcb);
return TRUE;
}
}
}
} else {
}
} else {
}
} else {
}
} else {
}
locProcessCommError();
Close();
} else {
#ifdef _DEBUG
char errBuf[256];
wsprintf(errBuf, "Error: CreateFile(%s, ...) = %08x\n", sz, GetLastError());
OutputDebugString(errBuf);
#endif
}
return FALSE;
}
void C232Comm::Close()
{
if (IsValid()) {
CloseHandle(m_hCom);
m_hCom = INVALID_HANDLE_VALUE;
}
}
int C232Comm::rxCom(void* pData, int nLen)
{
if (!ReadFile(m_hCom, pData, (DWORD)nLen, (LPDWORD)&nLen, (LPOVERLAPPED)NULL)) {
locProcessCommError();
return -1;
}
/* clean out any pending bytes in the receive buffer */
// PurgeComm(m_hCom, PURGE_RXCLEAR);
return nLen;
}
BOOL C232Comm::rxComLoop(void* pData, int nLen)
{
while(nLen > 0) {
int nRead = rxCom(pData, nLen);
if (nRead == -1)
return FALSE;
nLen -= nRead;
pData = &((BYTE*)pData)[nRead];
}
gosASSERT(nLen == 0);
return TRUE;
}
int C232Comm::txCom(const void* pData, int nLen)
{
gosASSERT(IsValid());
if (!WriteFile(m_hCom, pData, (DWORD)nLen, (LPDWORD)&nLen, NULL)) {
locProcessCommError();
return -1;
}
return nLen;
}
int C232Comm::txComLoop(const void* pData, int nLen)
{
gosASSERT(IsValid());
while(nLen > 0) {
int nSent = txCom(pData, nLen);
if (nSent == -1)
return FALSE;
nLen -= nSent;
pData = &((BYTE*)pData)[nSent];
}
gosASSERT(nLen == 0);
return TRUE;
}
void C232Comm::locProcessCommError()
{
gosASSERT(IsValid());
#ifdef _DEBUG
char buf[512];
wsprintf(buf, "Port=%d, ErrorCode=%08x\n", m_nPort, GetLastError());
#endif
DWORD dwError;
COMSTAT cs;
/* clear error */
ClearCommError(m_hCom, &dwError, &cs);
#ifdef _DEBUG
OutputDebugString(buf);
#endif
}
int C232Comm::CommunicationConfig(HWND hWndParent)
{
if (IsValid()) {
DWORD dwCC = sizeof(m_cc);
m_cc.dwSize = dwCC;
if (GetCommConfig(m_hCom, &m_cc, &dwCC)) {
char sz[32];
sprintf(sz, g_szPortFormat, m_nPort);
if (CommConfigDialog(sz, hWndParent, &m_cc)) {
if (SetCommState(m_hCom, &m_cc.dcb)) {
// write new settings
return +1;
}
locProcessCommError();
return 0;
}
locProcessCommError();
return -1;
} else {
locProcessCommError();
return -2;
}
} else {
gosASSERT(!"error: C232Comm::Open() must be called before\n");
return -3;
}
}