mirror of https://github.com/AxioDL/jbus.git
Add ability to change SI channel and detect disconnections
This commit is contained in:
parent
4699542f93
commit
0153e0ee6a
|
@ -176,7 +176,7 @@ class Endpoint
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** @brief Request stop of I/O thread and block until joined.
|
/** @brief Request stop of I/O thread and block until joined.
|
||||||
* Further use of this Endpoint is undefined behavior.
|
* Further use of this Endpoint will return GBA_NOT_READY.
|
||||||
* The destructor calls this implicitly. */
|
* The destructor calls this implicitly. */
|
||||||
void stop();
|
void stop();
|
||||||
|
|
||||||
|
@ -246,8 +246,21 @@ public:
|
||||||
FGBACallback&& callback);
|
FGBACallback&& callback);
|
||||||
|
|
||||||
/** @brief Get virtual SI channel assigned to this endpoint.
|
/** @brief Get virtual SI channel assigned to this endpoint.
|
||||||
* @return SI channel */
|
* @return SI channel [0,3] */
|
||||||
int GetChan() const { return m_chan; }
|
unsigned getChan() const { return m_chan; }
|
||||||
|
|
||||||
|
/** @brief Set virtual SI channel assigned to this endpoint.
|
||||||
|
* @param chan SI channel [0,3] */
|
||||||
|
void setChan(unsigned chan)
|
||||||
|
{
|
||||||
|
if (chan > 3)
|
||||||
|
chan = 3;
|
||||||
|
m_chan = chan;
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @brief Get connection status of this endpoint
|
||||||
|
* @return true if connected */
|
||||||
|
bool connected() const { return m_running; }
|
||||||
|
|
||||||
Endpoint(u8 chan, net::Socket&& data, net::Socket&& clock);
|
Endpoint(u8 chan, net::Socket&& data, net::Socket&& clock);
|
||||||
~Endpoint();
|
~Endpoint();
|
||||||
|
@ -291,7 +304,7 @@ public:
|
||||||
|
|
||||||
/** @brief Get virtual SI channel assigned to this endpoint.
|
/** @brief Get virtual SI channel assigned to this endpoint.
|
||||||
* @return SI channel */
|
* @return SI channel */
|
||||||
int GetChan() const { return m_ep.GetChan(); }
|
int getChan() const { return m_ep.getChan(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -177,7 +177,7 @@ void Endpoint::KawasedoChallenge::_4TransmitProgram(ThreadLocalEndpoint& endpoin
|
||||||
}
|
}
|
||||||
else if (x34_bytesSent == 0xc4)
|
else if (x34_bytesSent == 0xc4)
|
||||||
{
|
{
|
||||||
cryptWindow = endpoint.GetChan() << 0x8;
|
cryptWindow = endpoint.getChan() << 0x8;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (x34_bytesSent >= 0xc0)
|
if (x34_bytesSent >= 0xc0)
|
||||||
|
@ -569,6 +569,9 @@ void Endpoint::stop()
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAGetProcessStatus(u8& percentOut)
|
EJoyReturn Endpoint::GBAGetProcessStatus(u8& percentOut)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_joyBoot)
|
if (m_joyBoot)
|
||||||
{
|
{
|
||||||
|
@ -585,6 +588,9 @@ EJoyReturn Endpoint::GBAGetProcessStatus(u8& percentOut)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAGetStatusAsync(u8* status, FGBACallback&& callback)
|
EJoyReturn Endpoint::GBAGetStatusAsync(u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -601,6 +607,9 @@ EJoyReturn Endpoint::GBAGetStatusAsync(u8* status, FGBACallback&& callback)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAGetStatus(u8* status)
|
EJoyReturn Endpoint::GBAGetStatus(u8* status)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -618,6 +627,9 @@ EJoyReturn Endpoint::GBAGetStatus(u8* status)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAResetAsync(u8* status, FGBACallback&& callback)
|
EJoyReturn Endpoint::GBAResetAsync(u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -634,6 +646,9 @@ EJoyReturn Endpoint::GBAResetAsync(u8* status, FGBACallback&& callback)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAReset(u8* status)
|
EJoyReturn Endpoint::GBAReset(u8* status)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -651,6 +666,9 @@ EJoyReturn Endpoint::GBAReset(u8* status)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&& callback)
|
EJoyReturn Endpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -668,6 +686,9 @@ EJoyReturn Endpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&& callback)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBARead(u8* dst, u8* status)
|
EJoyReturn Endpoint::GBARead(u8* dst, u8* status)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -686,6 +707,9 @@ EJoyReturn Endpoint::GBARead(u8* dst, u8* status)
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAWriteAsync(const u8* src, u8* status, FGBACallback&& callback)
|
EJoyReturn Endpoint::GBAWriteAsync(const u8* src, u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -704,6 +728,9 @@ EJoyReturn Endpoint::GBAWriteAsync(const u8* src, u8* status, FGBACallback&& cal
|
||||||
|
|
||||||
EJoyReturn Endpoint::GBAWrite(const u8* src, u8* status)
|
EJoyReturn Endpoint::GBAWrite(const u8* src, u8* status)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
std::unique_lock<std::mutex> lk(m_syncLock);
|
std::unique_lock<std::mutex> lk(m_syncLock);
|
||||||
if (m_cmdIssued)
|
if (m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
@ -725,6 +752,9 @@ EJoyReturn Endpoint::GBAJoyBootAsync(s32 paletteColor, s32 paletteSpeed,
|
||||||
const u8* programp, s32 length, u8* status,
|
const u8* programp, s32 length, u8* status,
|
||||||
FGBACallback&& callback)
|
FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
|
if (!m_running)
|
||||||
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
if (m_chan > 3)
|
if (m_chan > 3)
|
||||||
return GBA_JOYBOOT_ERR_INVALID;
|
return GBA_JOYBOOT_ERR_INVALID;
|
||||||
|
|
||||||
|
@ -758,7 +788,7 @@ Endpoint::~Endpoint() { stop(); }
|
||||||
|
|
||||||
EJoyReturn ThreadLocalEndpoint::GBAGetStatusAsync(u8* status, FGBACallback&& callback)
|
EJoyReturn ThreadLocalEndpoint::GBAGetStatusAsync(u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
if (m_ep.m_cmdIssued)
|
if (!m_ep.m_running || m_ep.m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
m_ep.m_cmdIssued = true;
|
m_ep.m_cmdIssued = true;
|
||||||
|
@ -771,7 +801,7 @@ EJoyReturn ThreadLocalEndpoint::GBAGetStatusAsync(u8* status, FGBACallback&& cal
|
||||||
|
|
||||||
EJoyReturn ThreadLocalEndpoint::GBAResetAsync(u8* status, FGBACallback&& callback)
|
EJoyReturn ThreadLocalEndpoint::GBAResetAsync(u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
if (m_ep.m_cmdIssued)
|
if (!m_ep.m_running || m_ep.m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
m_ep.m_cmdIssued = true;
|
m_ep.m_cmdIssued = true;
|
||||||
|
@ -784,7 +814,7 @@ EJoyReturn ThreadLocalEndpoint::GBAResetAsync(u8* status, FGBACallback&& callbac
|
||||||
|
|
||||||
EJoyReturn ThreadLocalEndpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&& callback)
|
EJoyReturn ThreadLocalEndpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
if (m_ep.m_cmdIssued)
|
if (!m_ep.m_running || m_ep.m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
m_ep.m_cmdIssued = true;
|
m_ep.m_cmdIssued = true;
|
||||||
|
@ -798,7 +828,7 @@ EJoyReturn ThreadLocalEndpoint::GBAReadAsync(u8* dst, u8* status, FGBACallback&&
|
||||||
|
|
||||||
EJoyReturn ThreadLocalEndpoint::GBAWriteAsync(const u8* src, u8* status, FGBACallback&& callback)
|
EJoyReturn ThreadLocalEndpoint::GBAWriteAsync(const u8* src, u8* status, FGBACallback&& callback)
|
||||||
{
|
{
|
||||||
if (m_ep.m_cmdIssued)
|
if (!m_ep.m_running || m_ep.m_cmdIssued)
|
||||||
return GBA_NOT_READY;
|
return GBA_NOT_READY;
|
||||||
|
|
||||||
m_ep.m_cmdIssued = true;
|
m_ep.m_cmdIssued = true;
|
||||||
|
|
|
@ -57,8 +57,7 @@ void Listener::listenerProc()
|
||||||
net::Socket acceptData = {true};
|
net::Socket acceptData = {true};
|
||||||
net::Socket acceptClock = {true};
|
net::Socket acceptClock = {true};
|
||||||
std::string hostname;
|
std::string hostname;
|
||||||
u8 chan = 1;
|
while (m_running)
|
||||||
while (m_running && chan < 4)
|
|
||||||
{
|
{
|
||||||
if (m_dataServer.accept(acceptData, hostname) == net::Socket::EResult::OK)
|
if (m_dataServer.accept(acceptData, hostname) == net::Socket::EResult::OK)
|
||||||
{
|
{
|
||||||
|
@ -76,7 +75,7 @@ void Listener::listenerProc()
|
||||||
{
|
{
|
||||||
std::unique_lock<std::mutex> lk(m_queueLock);
|
std::unique_lock<std::mutex> lk(m_queueLock);
|
||||||
m_endpointQueue.push(std::make_unique<Endpoint>(
|
m_endpointQueue.push(std::make_unique<Endpoint>(
|
||||||
chan++, std::move(acceptData), std::move(acceptClock)));
|
0, std::move(acceptData), std::move(acceptClock)));
|
||||||
}
|
}
|
||||||
WaitGCTicks(GetGCTicksPerSec());
|
WaitGCTicks(GetGCTicksPerSec());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue