Pass the packet response to completion callbacks.

master
Glenn Maynard 6 years ago
parent 879df7152c
commit 48c75ba224
  1. 12
      sdk/Windows/SMXDevice.cpp
  2. 4
      sdk/Windows/SMXDevice.h
  3. 30
      sdk/Windows/SMXDeviceConnection.cpp
  4. 8
      sdk/Windows/SMXDeviceConnection.h
  5. 2
      sdk/Windows/SMXPanelAnimationUpload.cpp

@ -103,13 +103,13 @@ bool SMX::SMXDevice::IsConnectedLocked() const
return m_pConnection->IsConnectedWithDeviceInfo() && m_bHaveConfig; return m_pConnection->IsConnectedWithDeviceInfo() && m_bHaveConfig;
} }
void SMX::SMXDevice::SendCommand(string cmd, function<void()> pComplete) void SMX::SMXDevice::SendCommand(string cmd, function<void(string response)> pComplete)
{ {
LockMutex Lock(m_Lock); LockMutex Lock(m_Lock);
SendCommandLocked(cmd, pComplete); SendCommandLocked(cmd, pComplete);
} }
void SMX::SMXDevice::SendCommandLocked(string cmd, function<void()> pComplete) void SMX::SMXDevice::SendCommandLocked(string cmd, function<void(string response)> pComplete)
{ {
m_Lock.AssertLockedByCurrentThread(); m_Lock.AssertLockedByCurrentThread();
@ -117,7 +117,7 @@ void SMX::SMXDevice::SendCommandLocked(string cmd, function<void()> pComplete)
{ {
// If we're not connected, just call pComplete. // If we're not connected, just call pComplete.
if(pComplete) if(pComplete)
pComplete(); pComplete("");
return; return;
} }
@ -200,7 +200,7 @@ void SMX::SMXDevice::FactoryReset()
// Send a factory reset command, and then read the new configuration. // Send a factory reset command, and then read the new configuration.
LockMutex Lock(m_Lock); LockMutex Lock(m_Lock);
SendCommandLocked("f\n"); SendCommandLocked("f\n");
SendCommandLocked("g\n", [&] { SendCommandLocked("g\n", [&](string response) {
// We now have the new configuration. // We now have the new configuration.
m_Lock.AssertLockedByCurrentThread(); m_Lock.AssertLockedByCurrentThread();
CallUpdateCallback(SMXUpdateCallback_FactoryResetCommandComplete); CallUpdateCallback(SMXUpdateCallback_FactoryResetCommandComplete);
@ -319,7 +319,7 @@ void SMX::SMXDevice::SendConfig()
// Don't send another config packet until this one finishes, so if we get a bunch of // Don't send another config packet until this one finishes, so if we get a bunch of
// SetConfig calls quickly we won't spam the device, which can get slow. // SetConfig calls quickly we won't spam the device, which can get slow.
m_bSendingConfig = true; m_bSendingConfig = true;
SendCommandLocked(sData, [&] { SendCommandLocked(sData, [&](string response) {
m_bSendingConfig = false; m_bSendingConfig = false;
}); });
m_bSendConfig = false; m_bSendConfig = false;
@ -336,7 +336,7 @@ void SMX::SMXDevice::SendConfig()
// After we write the configuration, read back the updated configuration to // After we write the configuration, read back the updated configuration to
// verify it. // verify it.
SendCommandLocked("g\n", [this]() { SendCommandLocked("g\n", [this](string response) {
m_bWaitingForConfigResponse = false; m_bWaitingForConfigResponse = false;
}); });
} }

@ -41,8 +41,8 @@ public:
bool IsConnected() const; bool IsConnected() const;
// Send a raw command. // Send a raw command.
void SendCommand(string sCmd, function<void()> pComplete=nullptr); void SendCommand(string sCmd, function<void(string response)> pComplete=nullptr);
void SendCommandLocked(string sCmd, function<void()> pComplete=nullptr); void SendCommandLocked(string sCmd, function<void(string response)> pComplete=nullptr);
// Get basic info about the device. // Get basic info about the device.
void GetInfo(SMXInfo &info); void GetInfo(SMXInfo &info);

@ -41,7 +41,7 @@ bool SMX::SMXDeviceConnection::Open(shared_ptr<AutoCloseHandle> DeviceHandle, ws
BeginAsyncRead(sError); BeginAsyncRead(sError);
// Request device info. // Request device info.
RequestDeviceInfo([&] { RequestDeviceInfo([&](string response) {
Log(ssprintf("Received device info. Master version: %i, P%i", m_DeviceInfo.m_iFirmwareVersion, m_DeviceInfo.m_bP2+1)); Log(ssprintf("Received device info. Master version: %i, P%i", m_DeviceInfo.m_iFirmwareVersion, m_DeviceInfo.m_bP2+1));
m_bGotInfo = true; m_bGotInfo = true;
}); });
@ -59,14 +59,14 @@ void SMX::SMXDeviceConnection::Close()
// If we're being closed while a command was in progress, call its completion // If we're being closed while a command was in progress, call its completion
// callback, so it's guaranteed to always be called. // callback, so it's guaranteed to always be called.
if(m_pCurrentCommand && m_pCurrentCommand->m_pComplete) if(m_pCurrentCommand && m_pCurrentCommand->m_pComplete)
m_pCurrentCommand->m_pComplete(); m_pCurrentCommand->m_pComplete("");
// If any commands were queued with completion callbacks, call their completion // If any commands were queued with completion callbacks, call their completion
// callbacks. // callbacks.
for(auto &pendingCommand: m_aPendingCommands) for(auto &pendingCommand: m_aPendingCommands)
{ {
if(pendingCommand->m_pComplete) if(pendingCommand->m_pComplete)
pendingCommand->m_pComplete(); pendingCommand->m_pComplete("");
} }
m_hDevice.reset(); m_hDevice.reset();
@ -205,7 +205,7 @@ void SMX::SMXDeviceConnection::HandleUsbPacket(const string &buf)
memcpy(m_DeviceInfo.m_Serial, sHexSerial.c_str(), 33); memcpy(m_DeviceInfo.m_Serial, sHexSerial.c_str(), 33);
if(m_pCurrentCommand->m_pComplete) if(m_pCurrentCommand->m_pComplete)
m_pCurrentCommand->m_pComplete(); m_pCurrentCommand->m_pComplete(sPacket);
m_pCurrentCommand = nullptr; m_pCurrentCommand = nullptr;
break; break;
@ -230,22 +230,24 @@ void SMX::SMXDeviceConnection::HandleUsbPacket(const string &buf)
m_sCurrentReadBuffer.append(sPacket); m_sCurrentReadBuffer.append(sPacket);
if(cmd & PACKET_FLAG_END_OF_COMMAND) // Note that if PACKET_FLAG_HOST_CMD_FINISHED is set, PACKET_FLAG_END_OF_COMMAND
{ // will always also be set.
if(!m_sCurrentReadBuffer.empty())
m_sReadBuffers.push_back(m_sCurrentReadBuffer);
m_sCurrentReadBuffer.clear();
}
if(cmd & PACKET_FLAG_HOST_CMD_FINISHED) if(cmd & PACKET_FLAG_HOST_CMD_FINISHED)
{ {
// This tells us that a command we wrote to the device has finished executing, and // This tells us that a command we wrote to the device has finished executing, and
// it's safe to start writing another. // it's safe to start writing another.
if(m_pCurrentCommand && m_pCurrentCommand->m_pComplete) if(m_pCurrentCommand && m_pCurrentCommand->m_pComplete)
m_pCurrentCommand->m_pComplete(); m_pCurrentCommand->m_pComplete(m_sCurrentReadBuffer);
m_pCurrentCommand = nullptr; m_pCurrentCommand = nullptr;
} }
if(cmd & PACKET_FLAG_END_OF_COMMAND)
{
if(!m_sCurrentReadBuffer.empty())
m_sReadBuffers.push_back(m_sCurrentReadBuffer);
m_sCurrentReadBuffer.clear();
}
break; break;
} }
@ -341,7 +343,7 @@ void SMX::SMXDeviceConnection::CheckWrites(wstring &error)
// Request device info. This is the same as sending an 'i' command, but we can send it safely // Request device info. This is the same as sending an 'i' command, but we can send it safely
// at any time, even if another application is talking to the device, so we can do this during // at any time, even if another application is talking to the device, so we can do this during
// enumeration. // enumeration.
void SMX::SMXDeviceConnection::RequestDeviceInfo(function<void()> pComplete) void SMX::SMXDeviceConnection::RequestDeviceInfo(function<void(string response)> pComplete)
{ {
shared_ptr<PendingCommand> pPendingCommand = make_shared<PendingCommand>(); shared_ptr<PendingCommand> pPendingCommand = make_shared<PendingCommand>();
pPendingCommand->m_pComplete = pComplete; pPendingCommand->m_pComplete = pComplete;
@ -362,7 +364,7 @@ void SMX::SMXDeviceConnection::RequestDeviceInfo(function<void()> pComplete)
m_aPendingCommands.push_back(pPendingCommand); m_aPendingCommands.push_back(pPendingCommand);
} }
void SMX::SMXDeviceConnection::SendCommand(const string &cmd, function<void()> pComplete) void SMX::SMXDeviceConnection::SendCommand(const string &cmd, function<void(string response)> pComplete)
{ {
shared_ptr<PendingCommand> pPendingCommand = make_shared<PendingCommand>(); shared_ptr<PendingCommand> pPendingCommand = make_shared<PendingCommand>();
pPendingCommand->m_pComplete = pComplete; pPendingCommand->m_pComplete = pComplete;

@ -60,12 +60,12 @@ public:
// Send a command. This must be a single complete command: partial writes and multiple // Send a command. This must be a single complete command: partial writes and multiple
// commands in a call aren't allowed. // commands in a call aren't allowed.
void SendCommand(const string &cmd, function<void()> pComplete=nullptr); void SendCommand(const string &cmd, function<void(string response)> pComplete=nullptr);
uint16_t GetInputState() const { return m_iInputState; } uint16_t GetInputState() const { return m_iInputState; }
private: private:
void RequestDeviceInfo(function<void()> pComplete = nullptr); void RequestDeviceInfo(function<void(string response)> pComplete = nullptr);
void CheckReads(wstring &error); void CheckReads(wstring &error);
void BeginAsyncRead(wstring &error); void BeginAsyncRead(wstring &error);
@ -95,8 +95,8 @@ private:
list<shared_ptr<PendingCommandPacket>> m_Packets; list<shared_ptr<PendingCommandPacket>> m_Packets;
// This is only called if m_bWaitForResponse if true. Otherwise, we send the command // This is only called if m_bWaitForResponse if true. Otherwise, we send the command
// and forget about it. // and forget about it. If the command has a response, it'll be in buf.
function<void()> m_pComplete; function<void(string response)> m_pComplete;
// If true, once we send this command we won't send any other commands until we get // If true, once we send this command we won't send any other commands until we get
// a response. // a response.

@ -409,7 +409,7 @@ void SMX_LightsUpload_BeginUpload(int pad, SMX_LightsUploadCallback pCallback, v
for(int i = 0; i < asCommands.size(); ++i) for(int i = 0; i < asCommands.size(); ++i)
{ {
const string &sCommand = asCommands[i]; const string &sCommand = asCommands[i];
pDevice->SendCommand(sCommand, [i, iTotalCommands, pCallback, pUser]() { pDevice->SendCommand(sCommand, [i, iTotalCommands, pCallback, pUser](string response) {
// Command #i has finished being sent. // Command #i has finished being sent.
// //
// If this isn't the last command, make sure progress isn't 100. // If this isn't the last command, make sure progress isn't 100.

Loading…
Cancel
Save