CRIOMAIN.CPP: translate Korean comments to English, clean UTF-8

Translated all EUC-KR/CP949 Korean developer comments (~35 lines) to
English. File re-saved as UTF-8 (was CP949/EUC-KR on disk).

Also included: g_dwRIOPollTimeout formula that scales WaitForMultipleObjects
timeout by baud rate: clamp(ceil(480000/baud), 5, 50) ms.

Key translations:
- Developer markers (sanghoon/hyun)
- Packet receive loop comments
- ACK/NAK handling comments
- Thread/COM init comments
- Button table comments
- Joystick pedal/throttle diagram comments

Decorative diamond markers (◆) stripped from case labels and section
dividers. Unicode arrows (← →) in diagram comments replaced with ASCII.
This commit is contained in:
2026-07-19 18:52:30 -05:00
parent c768f7c46b
commit 16fca6c4f1
+53 -42
View File
@@ -43,7 +43,7 @@ LONG g_LeftPedalLast = 0;
LONG g_RightPedalLast = 0; LONG g_RightPedalLast = 0;
BOOL g_StartGame = FALSE; BOOL g_StartGame = FALSE;
static int g_nOpenComState = 0; // static int g_nOpenComState = 0; // hyun
DWORD g_dwLastAnalogUpdate = 0; DWORD g_dwLastAnalogUpdate = 0;
@@ -54,7 +54,7 @@ DWORD g_dwLastAnalogUpdate = 0;
#define RESTART_CHAR 0xFE #define RESTART_CHAR 0xFE
#define IDLE_CHAR 0xFF #define IDLE_CHAR 0xFF
//member 변수처럼 활용할것. //Use it like a member variable.
static HANDLE g_hCom = INVALID_HANDLE_VALUE; static HANDLE g_hCom = INVALID_HANDLE_VALUE;
static OVERLAPPED wos; static OVERLAPPED wos;
static OVERLAPPED ros; static OVERLAPPED ros;
@@ -108,6 +108,7 @@ int g_nRIOPacketCountB = (sizeof(g_baRIOLengthsB) / sizeof(g_baRIOLengthsB[0]));
int g_nRIOType = 0; // 0: old(original) type, 1: new type int g_nRIOType = 0; // 0: old(original) type, 1: new type
DWORD g_dwRIOBaud = 0; // [tbaud] 0: default by RIO type; else COM1 baud forced by -tbaud (high-speed replica of the original RIO board, protocol unchanged) DWORD g_dwRIOBaud = 0; // [tbaud] 0: default by RIO type; else COM1 baud forced by -tbaud (high-speed replica of the original RIO board, protocol unchanged)
DWORD g_dwRIOPollTimeout = 50; // [tbaud] WaitForMultipleObjects timeout (ms); computed from baud rate before the receive loop starts
int g_nEjectButton = 61; // 61: original, 31: new type int g_nEjectButton = 61; // 61: original, 31: new type
BYTE* g_pbRIOLengths = NULL; BYTE* g_pbRIOLengths = NULL;
int g_nRIOPacketCount = 0; int g_nRIOPacketCount = 0;
@@ -318,7 +319,7 @@ void RequestVersion();
void RequestAnalogUpdate(BYTE bFreq = 3); void RequestAnalogUpdate(BYTE bFreq = 3);
// start - for new RIO Board only... // start - for new RIO Board only...
//received packet은 각각 다른 스레드에서 처리하므로.. ciritical section이 필요하다.. //Received packets are handled in different threads.. a critical section is needed..
BYTE received_buffer[128][16]; BYTE received_buffer[128][16];
int received_packet=0;//packets count in the received_buffer. int received_packet=0;//packets count in the received_buffer.
DWORD received_serial=0; DWORD received_serial=0;
@@ -569,7 +570,7 @@ BOOL SetupConnection(HANDLE hCom)
return TRUE; return TRUE;
/* /*
원래 처리 루틴.. Original processing routine..
NPTTYINFO npTTYInfo=0 ; NPTTYINFO npTTYInfo=0 ;
BYTE bset1 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ; BYTE bset1 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_DTRDSR) != 0) ;
BYTE bset2 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ; BYTE bset2 = (BYTE) ((FLOWCTRL( npTTYInfo ) & FC_RTSCTS) != 0) ;
@@ -603,7 +604,7 @@ BOOL SetupConnection(HANDLE hCom)
//처리되지 않는 항목들.. GetCommState의 기본값으로 처리한다. //Unhandled items.. handled using GetCommState default values.
DWORD fDsrSensitivity:1; // DSR sensitivity DWORD fDsrSensitivity:1; // DSR sensitivity
DWORD fTXContinueOnXoff:1; // XOFF continues Tx DWORD fTXContinueOnXoff:1; // XOFF continues Tx
DWORD fErrorChar: 1; // enable error replacement DWORD fErrorChar: 1; // enable error replacement
@@ -647,7 +648,7 @@ HANDLE OpenConnection(int port)
g_hLampEvent = CreateEvent(0,FALSE,0,0); g_hLampEvent = CreateEvent(0,FALSE,0,0);
g_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CommWatchProc, NULL, CREATE_SUSPENDED, &g_dwThreadID); g_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES)NULL, 0, (LPTHREAD_START_ROUTINE)CommWatchProc, NULL, CREATE_SUSPENDED, &g_dwThreadID);
if (g_hCommWatchThread) { if (g_hCommWatchThread) {
//Thread까지 정상적으로 생성되었다. //Thread was created successfully.
////////////////////////////////////////////// //////////////////////////////////////////////
//All OK //All OK
//Exit Point <====== //Exit Point <======
@@ -744,11 +745,11 @@ retry:
for(int i=0;i<(int)dwLength;i++){ for(int i=0;i<(int)dwLength;i++){
int ch=(BYTE)lpszBlock[i]; int ch=(BYTE)lpszBlock[i];
//받은 문자만큼 루프를 돈다. //Loop for the number of received characters.
//현재.. 받고 있는 packet이 없고.. 어떤 control문자라도 올 수 있는 상태이다. //Currently.. no packet is being received.. can receive any control character.
if(packetbyteremain!=0){ if(packetbyteremain!=0){
//패킷에 해당하는 문자가 도착했다.. 나머지 문자들을 받는다. //Character corresponding to a packet has arrived.. receive the remaining characters.
if (ch & 0x80) { if (ch & 0x80) {
packetbyteremain=0; packetbyteremain=0;
chinpacket=0; chinpacket=0;
@@ -758,7 +759,7 @@ retry:
packetbytes[chinpacket] = ch; packetbytes[chinpacket] = ch;
chinpacket++; chinpacket++;
if (packetbyteremain == 0) { if (packetbyteremain == 0) {
//하나의 패킷이 완성되었다. 도착했다.. 즉시 반응한다. //A packet has been completed and arrived.. respond immediately.
chinpacket--; // exclude check byte chinpacket--; // exclude check byte
int packettype=packetbytes[0]; int packettype=packetbytes[0];
BYTE bCheckByte = 0; BYTE bCheckByte = 0;
@@ -837,21 +838,21 @@ retry:
packettype++; packettype++;
packettype--; packettype--;
#endif // _DEBUG #endif // _DEBUG
case rio_Ack2://◆◆◆◆◆◆◆◆◆◆ case rio_Ack2:
if (g_nRIOType != 0) { if (g_nRIOType != 0) {
BYTE id=packetbytes[1]; BYTE id=packetbytes[1];
int popped_index=PopPacket(id); int popped_index=PopPacket(id);
ack_timeout=GetTickCount()+30; ack_timeout=GetTickCount()+30;
if(popped_index==0){ if(popped_index==0){
//맨처음것... 정상적인 경우이다. //This is the very first one... Normal case.
}else if(popped_index>0){ }else if(popped_index>0){
//맨처음것이 아닌것. //Not the very first one.
//이전것들이 정상적으로 보내지지 않았으므로 다시 보낸다... //Previous ones were not sent successfully, resend...
ReSendPackets(popped_index);//잘못된 개수 만큼.. ReSendPackets(popped_index);//By the number of incorrect ones..
}else{ }else{
//실패 했다는것은.. 없는 id가 왔다는 것인데.. //Failure means an id that does not exist arrived..
//명백한 에러.. 그러나 특별히 대처할 방법은 없다. //An obvious error.. but there is no particular way to handle it.
//그냥 무시한다. //Simply ignore it.
} }
} }
break; break;
@@ -870,9 +871,9 @@ retry:
// WriteTTYBlock(hWnd,"|",1); // WriteTTYBlock(hWnd,"|",1);
chinpacket=0; chinpacket=0;
//packetbytes버퍼를 지운다. //Clear the packetbytes buffer.
} else { } else {
//아직 패킷 문자들이 다 도착하지 않았다.. 아무것도 하지 않는다. //Packet characters have not all arrived yet.. do nothing.
; ;
} }
}else{ }else{
@@ -889,7 +890,7 @@ retry:
}//for(int i=0;i<(int)dwLength;i++) }//for(int i=0;i<(int)dwLength;i++)
//상훈 뒤 //sanghoon end
if (!fReadStat){ if (!fReadStat){
if (GetLastError() == ERROR_IO_PENDING){ if (GetLastError() == ERROR_IO_PENDING){
while(!GetOverlappedResult( g_hCom,&ros, &dwLength, TRUE )){ while(!GetOverlappedResult( g_hCom,&ros, &dwLength, TRUE )){
@@ -1000,12 +1001,22 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
} }
g_dwLastAnalogUpdate = GetTickCount() + 2800; g_dwLastAnalogUpdate = GetTickCount() + 2800;
// [tbaud] Scale the poll timeout proportionally to baud rate so faster links
// poll more frequently. Formula: clamp(ceil(480000/baud), 5, 50)
// preserves the existing 50ms at 9600 baud, floors at 5ms for high speeds.
// effectiveBaud: use -tbaud override if set, else the RIO type's default.
{
DWORD effectiveBaud = (g_dwRIOBaud != 0) ? g_dwRIOBaud
: ((g_nRIOType == 0) ? 9600UL : 115200UL);
g_dwRIOPollTimeout = min(50UL, max(5UL,
(480000UL + effectiveBaud - 1) / effectiveBaud));
}
while(1) { while(1) {
DWORD dwEvtMask = 0; DWORD dwEvtMask = 0;
WaitCommEvent( g_hCom, &dwEvtMask,&wcos ); WaitCommEvent( g_hCom, &dwEvtMask,&wcos );
DWORD ret=WaitForMultipleObjects(3,events,FALSE,50/*INFINITE*/); DWORD ret=WaitForMultipleObjects(3,events,FALSE,g_dwRIOPollTimeout);
if(ret==WAIT_OBJECT_0){ if(ret==WAIT_OBJECT_0){
//An Comm Event has arrived. //An Comm Event has arrived.
DWORD bytesread; DWORD bytesread;
@@ -1022,10 +1033,10 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
} }
} else {*/ } else {*/
if (g_nRIOType != 0) { if (g_nRIOType != 0) {
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆위의 ReadCommBlock에서 ack를 받았을 경우 duetime을 update시킨다. ///When ack is received from ReadCommBlock above, update duetime.
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆CheckSentBuffer... ///CheckSentBuffer...
if(GetTickCount()>ack_timeout) if(GetTickCount()>ack_timeout)
ReSendPackets(sent_packet);//sent_buffer에 있는 모든것들을 다시 보내본다. ReSendPackets(sent_packet);//Resend everything in sent_buffer.
} }
/*}*/ /*}*/
}else if(ret==WAIT_OBJECT_0+1){ }else if(ret==WAIT_OBJECT_0+1){
@@ -1039,9 +1050,9 @@ DWORD FAR PASCAL CommWatchProc( LPSTR lpData )
//break; //break;
}else if (ret==WAIT_TIMEOUT) { }else if (ret==WAIT_TIMEOUT) {
if (g_nRIOType != 0) { if (g_nRIOType != 0) {
///◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆CheckSentBuffer... ///CheckSentBuffer...
if(GetTickCount()>ack_timeout) if(GetTickCount()>ack_timeout)
ReSendPackets(sent_packet);//sent_buffer에 있는 모든것들을 다시 보내본다. ReSendPackets(sent_packet);//Resend everything in sent_buffer.
} }
if (packetbyteremain == 0) { if (packetbyteremain == 0) {
RequestAnalogUpdate(); RequestAnalogUpdate();
@@ -1236,8 +1247,8 @@ bool SaveReceivedPacket(const BYTE*ba,int length)
bool GetSerialFromReceivedBuffer(char * ba) bool GetSerialFromReceivedBuffer(char * ba)
{ {
//ButtonPressed/Released만 저장해 놓는다.. //Store only ButtonPressed/Released..
//모든 serial packet을 옮긴다. //Transfer all serial packets.
if(received_packet>0){ if(received_packet>0){
if(received_buffer[0][2]==received_serial){ if(received_buffer[0][2]==received_serial){
CopyMemory(ba,received_buffer[0],16); CopyMemory(ba,received_buffer[0],16);
@@ -1264,7 +1275,7 @@ bool QueuePacket(const BYTE *ba,int length)
int PopPacket(BYTE id) int PopPacket(BYTE id)
{ {
//lamp.. id.. //lamp.. check by id..
//search the packet.. //search the packet..
for(int i=0;i<sent_packet;i++){ for(int i=0;i<sent_packet;i++){
if(sent_buffer[i][3]==id){ if(sent_buffer[i][3]==id){
@@ -1427,7 +1438,7 @@ void CBUTTON_GROUP::SetTable(BOOL bFlag/* = true*/)
for (int b = 0; b < MAXBUTTON_TABLE; b++) { for (int b = 0; b < MAXBUTTON_TABLE; b++) {
s_aCtrlLamp[b] = s_aSaveLamp[b];// = s_aButtonTable[b].lamp; s_aCtrlLamp[b] = s_aSaveLamp[b];// = s_aButtonTable[b].lamp;
// s_aButtonTable는 Old값이므로 초기치는 Off // s_aButtonTable is the old value, so the initial value is Off
s_aButtonTable[b].lamp = LAMP_OFF; s_aButtonTable[b].lamp = LAMP_OFF;
} }
@@ -1439,7 +1450,7 @@ void CBUTTON_GROUP::SetTable(BOOL bFlag/* = true*/)
} }
else else
{ {
// 모든 테이블을 원래 상태로 // Restore all tables to original state
for (int b = 0; b < MAXBUTTON_TABLE; b++) { for (int b = 0; b < MAXBUTTON_TABLE; b++) {
s_aCtrlLamp[b] = s_aSaveLamp[b]; s_aCtrlLamp[b] = s_aSaveLamp[b];
} }
@@ -1534,7 +1545,7 @@ void CBUTTON_GROUP::ResetTable(BOOL bFlag/* = true*/)
} }
else else
{ {
// 모든 테이블을 Off // Turn off all tables
for (int b = 0; b < MAXBUTTON_TABLE; b++) { for (int b = 0; b < MAXBUTTON_TABLE; b++) {
switch(b) switch(b)
{ {
@@ -2212,13 +2223,13 @@ void CRIOMAIN::UpdatePadal (DIJOYSTATE &js)
Down Up Down Up
====================== ======================
(+) (-) <-- (+) (-) -->
====================== ======================
/^
g_LeftPedalStart: INT_MAX (+) g_LeftPedalStart: INT_MAX (+)
lP = (LONG)g_LeftPedalStart - g_LeftPedal; lP = (LONG)g_LeftPedalStart - g_LeftPedal;
lP 결과값은 무조건 음수 lP result value is always negative
*/ */
LONG lP = 0; LONG lP = 0;
@@ -2362,9 +2373,9 @@ void CRIOMAIN::UpdateThrottle (DIJOYSTATE &js)
Up Down Up Down
====================== ======================
(-) (+) <-- (-) (+) -->
====================== ======================
/^
g_ThrottleStart: INT_MIN (-) g_ThrottleStart: INT_MIN (-)
*/ */
@@ -2447,11 +2458,11 @@ void CRIOMAIN::UpdateJoystick (DIJOYSTATE &js)
*/ */
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
/* /*
80 의 의미 Meaning of 80
RIO (LEFT :120 ~ RIGHT :-80) 까지의 수를 돌려준다고 가정하고 Assuming RIO returns values in range (LEFT:120 ~ RIGHT:-80)
(LEFT의경우) RIGHT 의 최대값 80 이상인 값을 잘라버리고 나머지는 (In the LEFT case) clip values above the RIGHT maximum of 80, and the rest
버릴경우 LEFT RIGHT가 동일한 속도로 움직일수 있다 if discarded, LEFT and RIGHT can move at the same speed
*/ */
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
LONG lJ; LONG lJ;