Raw Thrills I/O: Minor code cleanup

This commit is contained in:
x0rbl
2019-09-19 00:18:39 -07:00
parent 9481834180
commit 6841d0574d
3 changed files with 97 additions and 40 deletions
@@ -27,7 +27,7 @@ InputHandler_Win32_RTIO::~InputHandler_Win32_RTIO()
shutdown_ = true;
LOG->Trace("RTIO: Shutting down RTIO thread");
input_thread_.Wait();
LOG->Info("RTIO: RTIO thread shut down.");
LOG->Info("RTIO: Thread shut down");
}
rtio_.Disconnect();
@@ -77,11 +77,13 @@ bool InputHandler_Win32_RTIO::Initialize() {
LOG->Trace("RTIO: Initialize: Cannot connect to COM1");
return false;
}
// The following messages are not required to receive game/operator inputs,
// but they replicate the initialization sequence in DDR. We'll use the
// response from the version message to determine that the board is good.
if (!rtio_.WriteMsg("C0000")) {
LOG->Trace("RTIO: Initialize: Cannot write init message");
return false;
}
// The following messages replicate the rest of the initialization sequence in DDR X2
if (!rtio_.WriteMsg("v")) {
LOG->Trace("RTIO: Initialize: Cannot write version message");
return false;
@@ -121,9 +123,9 @@ int InputHandler_Win32_RTIO::InputThread_Start(void *this_ptr)
void InputHandler_Win32_RTIO::InputThread()
{
RageTimer start_time;
std::vector<std::string> msgs;
int failures = 0;
LOG->Trace("RTIO: In Thread");
while (!shutdown_) {
if (!rtio_.ReadMsgs(&msgs)) {
@@ -137,6 +139,11 @@ void InputHandler_Win32_RTIO::InputThread()
RageTimer now;
if (!initialized_ && now - start_time > 10.0) {
LOG->Warn("RTIO: Device failed to initialize; exiting input loop");
return;
}
for (auto msg : msgs) {
if (msg.length() < 1) continue;
if (msg[0] == 'c') {
@@ -145,6 +152,7 @@ void InputHandler_Win32_RTIO::InputThread()
}
if (msg[0] == 'v') {
LOG->Trace("RTIO: Received version response: %s", msg.c_str());
initialized_ = true;
continue;
}
if (msg[0] == 'd') {
@@ -162,7 +170,6 @@ void InputHandler_Win32_RTIO::InputThread()
LOG->Warn("RTIO: Unrecognized response: %s", msg.c_str());
}
}
LOG->Trace("RTIO: Leaving Thread");
}
int HexToChar(char ch)
@@ -172,7 +179,7 @@ int HexToChar(char ch)
return ch - '0';
}
void InputHandler_Win32_RTIO::HandleGameInput(const std::string &msg, RageTimer &now)
void InputHandler_Win32_RTIO::HandleGameInput(const std::string &msg, const RageTimer &now)
{
InputDevice id = InputDevice(DEVICE_JOY1);
@@ -257,18 +264,19 @@ void InputHandler_Win32_RTIO::HandleGameInput(const std::string &msg, RageTimer
if (input_new.P2_MenuStart != last_game_input_.P2_MenuStart) {
ButtonPressed(DeviceInput(id, JOY_BUTTON_18, input_new.P2_MenuStart, now));
}
/*
if (memcmp(&last_game_input_, &input_new, sizeof(GAME_INPUT)) != 0) {
LOG->Trace("RTIO: P1:%d%d%d%d P2:%d%d%d%d M1:%d%d%d%d-%d M2:%d%d%d%d-%d", // TODO: Delete me
input_new.P1_PadLeft, input_new.P1_PadDown, input_new.P1_PadUp, input_new.P1_PadRight,
input_new.P2_PadLeft, input_new.P2_PadDown, input_new.P2_PadUp, input_new.P2_PadRight,
input_new.P1_MenuLeft, input_new.P1_MenuDown, input_new.P1_MenuUp, input_new.P1_MenuRight, input_new.P1_MenuStart,
input_new.P2_MenuLeft, input_new.P2_MenuDown, input_new.P2_MenuUp, input_new.P2_MenuRight, input_new.P2_MenuStart);
LOG->Trace("RTIO: P1:%d%d%d%d P2:%d%d%d%d M1:%d%d%d%d-%d M2:%d%d%d%d-%d",
input_new.P1_PadLeft, input_new.P1_PadDown, input_new.P1_PadUp, input_new.P1_PadRight,
input_new.P2_PadLeft, input_new.P2_PadDown, input_new.P2_PadUp, input_new.P2_PadRight,
input_new.P1_MenuLeft, input_new.P1_MenuDown, input_new.P1_MenuUp, input_new.P1_MenuRight, input_new.P1_MenuStart,
input_new.P2_MenuLeft, input_new.P2_MenuDown, input_new.P2_MenuUp, input_new.P2_MenuRight, input_new.P2_MenuStart);
}
*/
memcpy(&last_game_input_, &input_new, sizeof(GAME_INPUT));
}
void InputHandler_Win32_RTIO::HandleOperatorInput(const std::string &msg, RageTimer &now)
void InputHandler_Win32_RTIO::HandleOperatorInput(const std::string &msg, const RageTimer &now)
{
InputDevice id = InputDevice(DEVICE_JOY1);
@@ -305,11 +313,12 @@ void InputHandler_Win32_RTIO::HandleOperatorInput(const std::string &msg, RageTi
if (input_new.VolumeUp != last_operator_input_.VolumeUp) {
ButtonPressed(DeviceInput(id, JOY_BUTTON_24, input_new.VolumeUp, now));
}
/*
if (memcmp(&last_operator_input_, &input_new, sizeof(OPERATOR_INPUT)) != 0) {
LOG->Trace("RTIO: C:%d%d V:%d%d S:%d%d", // TODO: Remove me
input_new.P1_InsertCoin, input_new.P2_InsertCoin, input_new.VolumeUp, input_new.VolumeDown, input_new.TestSwitch, input_new.SelectSwitch);
LOG->Trace("RTIO: C:%d%d V:%d%d S:%d%d",
input_new.P1_InsertCoin, input_new.P2_InsertCoin, input_new.VolumeUp, input_new.VolumeDown, input_new.TestSwitch, input_new.SelectSwitch);
}
*/
memcpy(&last_operator_input_, &input_new, sizeof(OPERATOR_INPUT));
}
@@ -359,9 +368,13 @@ bool RtioDevice::ReadMsgs(std::vector<std::string> *msgs)
int msg_size = ParseMsg(&read_buffer_[pos], read_offset_ - pos);
if (msg_size < 0) {
LOG->Trace("RTIO: RtioDevice: Bad msg start at offset %d (got %d)", pos, read_buffer_[pos]);
read_offset_ = 0;
return false;
LOG->Warn("RTIO: RtioDevice: Bad msg start at offset %d (got %d); skipping invalid data", pos, read_buffer_[pos]);
while (pos < read_offset_) {
if (read_buffer_[pos] == '\n')
break;
pos++;
}
continue;
}
if (msg_size == 0) {
@@ -394,16 +407,10 @@ int RtioDevice::ParseMsg(char *buffer, int buffer_size)
return 0;
}
char IntToHex(int num)
{
if (num < 10) return num + '0';
return (num - 10) + 'A';
}
// Sends a message to the RTIO device. This function adds the necessary prefix
// and suffix ('\n' and '\r', respectively). Messages sent to RTIO also
// include a checksum, expressed in hex.
bool RtioDevice::WriteMsg(std::string const &msg)
bool RtioDevice::WriteMsg(const std::string &msg)
{
std::string buf;
buf = '\n';
@@ -441,12 +448,12 @@ bool SerialDevice::Connect(int com_number)
return false;
}
if (!SetupPort()) {
if (!Setup()) {
SetCommMask(com_handle_, 0);
return false;
}
LOG->Trace("RTIO: SerialDevice: Connect succeeded on %s", name.c_str());
LOG->Info("RTIO: SerialDevice: Connect succeeded on %s", name.c_str());
return true;
}
@@ -460,10 +467,9 @@ void SerialDevice::Disconnect()
}
}
bool SerialDevice::SetupPort()
bool SerialDevice::Setup()
{
// Set the com device to monitor the following event:
// EV_RXCHAR = "A character was received and placed in the input buffer."
// Set the serial device to monitor for characters in the input buffer
if (!SetCommMask(com_handle_, EV_RXCHAR)) {
LOG->Warn("RTIO: SerialDevice: SetCommMask failed: %d", GetLastError());
return false;
@@ -475,7 +481,7 @@ bool SerialDevice::SetupPort()
return false;
}
// Discard all characters from the buffers of the com resource
// Discard all characters from the internal buffers
if (!PurgeComm(com_handle_, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR)) {
LOG->Warn("RTIO: SerialDevice: PurgeComm failed: %d", GetLastError());
return false;
@@ -518,13 +524,13 @@ bool SerialDevice::SetupPort()
}
// Create a manually resettable events for the OVERLAPPED structures
read_overlapped_.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
read_overlapped_.hEvent = CreateEvent(nullptr, true, false, nullptr);
if (read_overlapped_.hEvent == nullptr) {
LOG->Warn("RTIO: SerialDevice: CreateEvent failed: %d", GetLastError());
return false;
}
write_overlapped_.hEvent = CreateEvent(nullptr, TRUE, FALSE, nullptr);
write_overlapped_.hEvent = CreateEvent(nullptr, true, false, nullptr);
if (write_overlapped_.hEvent == nullptr) {
LOG->Warn("RTIO: SerialDevice: CreateEvent failed: %d", GetLastError());
return false;
@@ -591,3 +597,28 @@ int SerialDevice::Write(const char *buffer, int buffer_size)
return bytes_transferred;
}
/*
* (c) 2003-2004 Glenn Maynard
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
@@ -47,7 +47,7 @@ public:
int Read(char *buffer, int buffer_size);
int Write(const char *buffer, int buffer_size);
private:
bool SetupPort();
bool Setup();
HANDLE com_handle_ = INVALID_HANDLE_VALUE;
int read_buffer_size_;
@@ -62,7 +62,7 @@ public:
bool Connect();
void Disconnect();
bool ReadMsgs(std::vector<std::string> *msgs);
bool WriteMsg(std::string const &msg);
bool WriteMsg(const std::string &msg);
private:
int ParseMsg(char *buffer, int buffer_size);
SerialDevice serial_;
@@ -82,14 +82,40 @@ public:
private:
bool Initialize();
void InputThread();
void HandleGameInput(const std::string &msg, RageTimer &now);
void HandleOperatorInput(const std::string &msg, RageTimer &now);
void HandleGameInput(const std::string &msg, const RageTimer &now);
void HandleOperatorInput(const std::string &msg, const RageTimer &now);
RtioDevice rtio_;
RageThread input_thread_;
bool shutdown_ = false;
GAME_INPUT last_game_input_;
OPERATOR_INPUT last_operator_input_;
GAME_INPUT last_game_input_ = {};
OPERATOR_INPUT last_operator_input_ = {};
bool initialized_ = false;
};
#endif
/*
* (c) 2003-2004 Glenn Maynard
* All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, and/or sell copies of the Software, and to permit persons to
* whom the Software is furnished to do so, provided that the above
* copyright notice(s) and this permission notice appear in all copies of
* the Software and that both the above copyright notice(s) and this
* permission notice appear in supporting documentation.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF
* THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS
* INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT
* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
* OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*/
+1 -1
View File
@@ -7,7 +7,7 @@
#include "LoadingWindow/LoadingWindow_Win32.h"
#include "LowLevelWindow/LowLevelWindow_Win32.h"
#include "MemoryCard/MemoryCardDriverThreaded_Windows.h"
#define DEFAULT_INPUT_DRIVER_LIST "DirectInput,Pump,Para,RTIO"
#define DEFAULT_INPUT_DRIVER_LIST "DirectInput,Pump,Para"
#define DEFAULT_MOVIE_DRIVER_LIST "FFMpeg,DShow,Null"
#define DEFAULT_SOUND_DRIVER_LIST "WaveOut,DirectSound-sw,WDMKS,Null"