Modernization of the legacy vJoy-based RIO cockpit interface for Win10/11, removing the vJoy dependency in favor of a custom VHF/UMDF HID driver, rewritten in C#/.NET 8 as a background tray app with per-game profiles. - Reorganize: legacy C++ -> legacy/, cockpit art -> docs/reference/ - RioJoy.sln: src/RioJoy.Core (lib) + src/RioJoy.Tray (tray app), net8.0-windows x64 - driver/ placeholder for the RioGamepad WDK driver - docs/PLAN.md (7-phase plan; profiles + serial-yield model) - docs/PROTOCOL.md (RIO wire format + iRIO input-map reference) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
135 lines
2.7 KiB
C++
135 lines
2.7 KiB
C++
#ifndef __RIO_H__
|
|
#define __RIO_H__
|
|
|
|
|
|
#define MSBON(B) {B |= 0x80;}
|
|
#define MSBOFF(B) {B &= ~0x80;}
|
|
#define MAXLENGTH 13
|
|
|
|
#define ACK_CHAR 0xFC
|
|
#define NAK_CHAR 0xFD
|
|
#define RESTART_CHAR 0xFE
|
|
#define IDLE_CHAR 0xFF
|
|
#define RX_ACK_BIT 0x0001
|
|
#define RX_NAK_BIT 0x0002
|
|
|
|
|
|
class CString
|
|
{
|
|
public:
|
|
char m_sz[256];
|
|
public:
|
|
CString()
|
|
{
|
|
m_sz[0] = '0';
|
|
};
|
|
~CString()
|
|
{
|
|
}
|
|
|
|
void _cdecl Format(const char* pcszFormat, ...)
|
|
{
|
|
va_list va_marker;
|
|
|
|
va_start(va_marker, pcszFormat);
|
|
vsprintf_s(m_sz, pcszFormat, va_marker);
|
|
va_end(va_marker);
|
|
}
|
|
|
|
operator const char* () const { return &m_sz[0]; }
|
|
CString& operator = (const char* pcszText)
|
|
{
|
|
strcpy_s(m_sz, pcszText);
|
|
return *this;
|
|
}
|
|
};
|
|
|
|
class CListBox
|
|
{
|
|
public:
|
|
public:
|
|
CListBox() {}
|
|
~CListBox() {}
|
|
int GetCount() const { return 0; }
|
|
void AddString(const char* pcszText) {}
|
|
void DeleteString(int nindex) {}
|
|
};
|
|
|
|
class CRIO : public C232Comm
|
|
{
|
|
public:
|
|
CListBox& m_ListBox;
|
|
BYTE m_ba[2048];
|
|
BYTE *m_pStart;
|
|
const BYTE *m_pEnd;
|
|
int m_nCount;
|
|
DWORD m_dwFlags;
|
|
BYTE m_baRead[128];
|
|
int m_nState;
|
|
int m_nRead;
|
|
int m_nLeft;
|
|
BYTE m_bCheck;
|
|
BYTE m_baReplies[32];
|
|
int m_nReplies;
|
|
int TestModeActive;
|
|
|
|
DWORD m_dwAnalogRequest;
|
|
public:
|
|
CRIO (CListBox& ListBox) : m_ListBox (ListBox) {
|
|
Init ();
|
|
}
|
|
virtual ~CRIO () {};
|
|
|
|
public:
|
|
void Init ();
|
|
void RIOBordState (BYTE ID);
|
|
void DoEventLoop();
|
|
void EventLoop (const BYTE *buf, int nLen);
|
|
void AddReply (BYTE bReply);
|
|
void CheckReplies ();
|
|
void CheckAnalogRequest();
|
|
void SendCommand (const BYTE* pbPacket);
|
|
void SendPacket (const BYTE* pbPacket, int nLen);
|
|
void SetLamp (int lampNumber, int state);
|
|
|
|
void GeneralReset();
|
|
void ResetThrottle ();
|
|
void RequestCheck();
|
|
void RequestVersion();
|
|
void RequestAnalogUpdate();
|
|
|
|
public:
|
|
enum RIOCommand {
|
|
rio_CheckRequest = 0x80, // 128
|
|
rio_VersionRequest, // 129
|
|
rio_AnalogRequest, // 130
|
|
rio_ResetRequest, // 131
|
|
rio_LampRequest, // 132
|
|
rio_CheckReply, // 133
|
|
rio_VersionReply, // 134
|
|
rio_AnalogReply, // 135
|
|
rio_ButtonPressed, // 136
|
|
rio_ButtonReleased, // 137
|
|
rio_KeyPressed, // 138
|
|
rio_KeyReleased, // 139
|
|
rio_TestModeChange // 140
|
|
};
|
|
|
|
enum RIOStatusType {
|
|
BoardOk, BoardMissing, BoardBad, LampBad, RestartCount, AbandonCount, FullBufferCount
|
|
};
|
|
|
|
enum LampState {
|
|
solid=0, flashSlow=1, flashMed=2, flashFast=3,
|
|
state1Off=0x00, state1Dim=0x04, state1Bright=0x0C,
|
|
state2Off=0x00, state2Dim=0x10, state2Bright=0x30,
|
|
};
|
|
|
|
enum {
|
|
LampSolidOff = solid + state1Off + state2Off,
|
|
LampSolidDim = solid + state1Dim + state2Dim,
|
|
LampSolidBright = solid + state1Bright + state2Bright
|
|
};
|
|
};
|
|
|
|
#endif |