mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-06-26 20:37:50 +02:00
Major bugfix in server
This commit is contained in:
@ -10,6 +10,7 @@
|
||||
#include <options.h>
|
||||
#include <gui/widgets/stepped_slider.h>
|
||||
#include <utils/optionlist.h>
|
||||
#include <gui/dialogs/dialog_box.h>
|
||||
|
||||
#define CONCAT(a, b) ((std::string(a) + b).c_str())
|
||||
|
||||
@ -142,6 +143,10 @@ private:
|
||||
bool connected = (_this->client && _this->client->isOpen());
|
||||
gui::mainWindow.playButtonLocked = !connected;
|
||||
|
||||
ImGui::GenericDialog("##sdrpp_srv_src_err_dialog", _this->serverBusy, GENERIC_DIALOG_BUTTONS_OK, [=](){
|
||||
ImGui::Text("This server is already in use.");
|
||||
});
|
||||
|
||||
if (connected) { style::beginDisabled(); }
|
||||
if (ImGui::InputText(CONCAT("##sdrpp_srv_srv_host_", _this->name), _this->hostname, 1023)) {
|
||||
config.acquire();
|
||||
@ -166,6 +171,7 @@ private:
|
||||
}
|
||||
catch (std::exception e) {
|
||||
spdlog::error("Could not connect to SDR: {0}", e.what());
|
||||
if (!strcmp(e.what(), "Server busy")) { _this->serverBusy = true; }
|
||||
}
|
||||
}
|
||||
else if (connected && ImGui::Button("Disconnect##sdrpp_srv_source", ImVec2(menuWidth, 0))) {
|
||||
@ -238,6 +244,7 @@ private:
|
||||
bool running = false;
|
||||
|
||||
double freq;
|
||||
bool serverBusy = false;
|
||||
|
||||
float datarate = 0;
|
||||
float frametimeCounter = 0;
|
||||
|
@ -35,11 +35,10 @@ namespace server {
|
||||
// Start readers
|
||||
client->readAsync(sizeof(PacketHeader), rbuffer, tcpHandler, this);
|
||||
|
||||
// Default configuration
|
||||
stop();
|
||||
|
||||
// Ask for a UI
|
||||
getUI();
|
||||
int res = getUI();
|
||||
if (res == -1) { throw std::runtime_error("Timed out"); }
|
||||
else if (res == -2) { throw std::runtime_error("Server busy"); }
|
||||
}
|
||||
|
||||
ClientClass::~ClientClass() {
|
||||
@ -153,6 +152,23 @@ namespace server {
|
||||
_this->currentSampleRate = *(double*)_this->r_cmd_data;
|
||||
core::setInputSampleRate(_this->currentSampleRate);
|
||||
}
|
||||
else if (_this->r_cmd_hdr->cmd == COMMAND_DISCONNECT) {
|
||||
spdlog::error("Asked to disconnect by the server");
|
||||
_this->serverBusy = true;
|
||||
|
||||
// Cancel waiters
|
||||
std::vector<PacketWaiter*> toBeRemoved;
|
||||
for (auto& [waiter, cmd] : _this->commandAckWaiters) {
|
||||
waiter->cancel();
|
||||
toBeRemoved.push_back(waiter);
|
||||
}
|
||||
|
||||
// Remove handled waiters
|
||||
for (auto& waiter : toBeRemoved) {
|
||||
_this->commandAckWaiters.erase(waiter);
|
||||
delete waiter;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (_this->r_pkt_hdr->type == PACKET_TYPE_COMMAND_ACK) {
|
||||
// Notify waiters
|
||||
@ -184,7 +200,7 @@ namespace server {
|
||||
_this->client->readAsync(sizeof(PacketHeader), _this->rbuffer, tcpHandler, _this);
|
||||
}
|
||||
|
||||
void ClientClass::getUI() {
|
||||
int ClientClass::getUI() {
|
||||
auto waiter = awaitCommandAck(COMMAND_GET_UI);
|
||||
sendCommand(COMMAND_GET_UI, 0);
|
||||
if (waiter->await(PROTOCOL_TIMEOUT_MS)) {
|
||||
@ -192,9 +208,12 @@ namespace server {
|
||||
dl.load(r_cmd_data, r_pkt_hdr->size - sizeof(PacketHeader) - sizeof(CommandHeader));
|
||||
}
|
||||
else {
|
||||
spdlog::error("Timeout out after asking for UI");
|
||||
if (!serverBusy) { spdlog::error("Timeout out after asking for UI"); };
|
||||
waiter->handled();
|
||||
return serverBusy ? -2 : -1;
|
||||
}
|
||||
waiter->handled();
|
||||
return 0;
|
||||
}
|
||||
|
||||
void ClientClass::sendPacket(PacketType type, int len) {
|
||||
|
@ -23,7 +23,7 @@ namespace server {
|
||||
public:
|
||||
bool await(int timeout) {
|
||||
std::unique_lock lck(readyMtx);
|
||||
return readyCnd.wait_for(lck, std::chrono::milliseconds(timeout), [=](){ return dataReady; });
|
||||
return readyCnd.wait_for(lck, std::chrono::milliseconds(timeout), [=](){ return dataReady || canceled; }) && !canceled;
|
||||
}
|
||||
|
||||
void handled() {
|
||||
@ -49,16 +49,23 @@ namespace server {
|
||||
}
|
||||
}
|
||||
|
||||
void cancel() {
|
||||
canceled = true;
|
||||
notify();
|
||||
}
|
||||
|
||||
void reset() {
|
||||
std::lock_guard lck1(readyMtx);
|
||||
std::lock_guard lck2(handledMtx);
|
||||
dataReady = false;
|
||||
dataHandled = false;
|
||||
canceled = false;
|
||||
}
|
||||
|
||||
private:
|
||||
bool dataReady = false;
|
||||
bool dataHandled = false;
|
||||
bool canceled = 0;
|
||||
|
||||
std::condition_variable readyCnd;
|
||||
std::condition_variable handledCnd;
|
||||
@ -86,11 +93,12 @@ namespace server {
|
||||
bool isOpen();
|
||||
|
||||
int bytes = 0;
|
||||
bool serverBusy = false;
|
||||
|
||||
private:
|
||||
static void tcpHandler(int count, uint8_t* buf, void* ctx);
|
||||
|
||||
void getUI();
|
||||
int getUI();
|
||||
|
||||
void sendPacket(PacketType type, int len);
|
||||
void sendCommand(Command cmd, int len);
|
||||
|
Reference in New Issue
Block a user