mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-06-28 21:37:50 +02:00
Major bugfix in server
This commit is contained in:
@ -75,7 +75,7 @@ void MainWindow::init() {
|
||||
gui::menu.order.push_back(opt);
|
||||
}
|
||||
|
||||
gui::menu.registerEntry("Source", sourecmenu::draw, NULL);
|
||||
gui::menu.registerEntry("Source", sourcemenu::draw, NULL);
|
||||
gui::menu.registerEntry("Sinks", sinkmenu::draw, NULL);
|
||||
gui::menu.registerEntry("Band Plan", bandplanmenu::draw, NULL);
|
||||
gui::menu.registerEntry("Display", displaymenu::draw, NULL);
|
||||
@ -164,7 +164,7 @@ void MainWindow::init() {
|
||||
|
||||
gui::waterfall.updatePalletteFromArray(colormaps::maps["Turbo"].map, colormaps::maps["Turbo"].entryCount);
|
||||
|
||||
sourecmenu::init();
|
||||
sourcemenu::init();
|
||||
sinkmenu::init();
|
||||
bandplanmenu::init();
|
||||
displaymenu::init();
|
||||
|
@ -6,7 +6,7 @@
|
||||
#include <gui/style.h>
|
||||
#include <signal_path/signal_path.h>
|
||||
|
||||
namespace sourecmenu {
|
||||
namespace sourcemenu {
|
||||
int offsetMode = 0;
|
||||
int sourceId = 0;
|
||||
double customOffset = 0.0;
|
||||
|
@ -1,6 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
namespace sourecmenu {
|
||||
namespace sourcemenu {
|
||||
void init();
|
||||
void draw(void* ctx);
|
||||
}
|
@ -290,6 +290,7 @@ namespace SmGui {
|
||||
// Validate and clear if invalid
|
||||
if (!validate()) {
|
||||
spdlog::error("Drawlist validation failed");
|
||||
//elements.clear();
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -376,7 +377,10 @@ namespace SmGui {
|
||||
va_start(args, n);
|
||||
|
||||
// Check if enough elements are left
|
||||
if (elements.size() - firstId < n) { return false; }
|
||||
if (firstId + n > elements.size()) {
|
||||
va_end(args);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Check the type of each element
|
||||
for (int i = 0; i < n; i++) {
|
||||
@ -400,29 +404,46 @@ namespace SmGui {
|
||||
DrawStep step = elements[i++].step;
|
||||
|
||||
VALIDATE_WIDGET(4, DRAW_STEP_COMBO, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(3, DRAW_STEP_BUTTON, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT)
|
||||
|
||||
E_VALIDATE_WIDGET(3, DRAW_STEP_COLUMNS, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_BOOL)
|
||||
|
||||
E_VALIDATE_WIDGET(2, DRAW_STEP_RADIO_BUTTON, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_BOOL)
|
||||
|
||||
E_VALIDATE_WIDGET(1, DRAW_STEP_LEFT_LABEL, DRAW_LIST_ELEM_TYPE_STRING)
|
||||
|
||||
E_VALIDATE_WIDGET(6, DRAW_STEP_SLIDER_INT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT,
|
||||
DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(6, DRAW_STEP_SLIDER_FLOAT_WITH_STEPS, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT,
|
||||
DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(5, DRAW_STEP_INPUT_INT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT,
|
||||
DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(2, DRAW_STEP_CHECKBOX, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_BOOL)
|
||||
|
||||
E_VALIDATE_WIDGET(6, DRAW_STEP_SLIDER_FLOAT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT,
|
||||
DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(4, DRAW_STEP_INPUT_TEXT, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(1, DRAW_STEP_TEXT, DRAW_LIST_ELEM_TYPE_STRING)
|
||||
|
||||
E_VALIDATE_WIDGET(5, DRAW_STEP_TEXT_COLORED, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT,
|
||||
DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_STRING)
|
||||
|
||||
E_VALIDATE_WIDGET(2, DRAW_STEP_OPEN_POPUP, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(2, DRAW_STEP_BEGIN_POPUP, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(6, DRAW_STEP_BEGIN_TABLE, DRAW_LIST_ELEM_TYPE_STRING, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_INT,
|
||||
DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT, DRAW_LIST_ELEM_TYPE_FLOAT)
|
||||
E_VALIDATE_WIDGET(2, DRAW_STEP_TABLE_NEXT_ROW, DRAW_LIST_ELEM_TYPE_INT, DRAW_LIST_ELEM_TYPE_FLOAT)
|
||||
|
||||
E_VALIDATE_WIDGET(1, DRAW_STEP_TABLE_SET_COLUMN_INDEX, DRAW_LIST_ELEM_TYPE_INT)
|
||||
|
||||
E_VALIDATE_WIDGET(1, DRAW_STEP_SET_NEXT_ITEM_WIDTH, DRAW_LIST_ELEM_TYPE_FLOAT)
|
||||
}
|
||||
|
||||
|
@ -76,6 +76,7 @@ namespace server {
|
||||
std::string modulesDir = core::configManager.conf["modulesDirectory"];
|
||||
std::vector<std::string> modules = core::configManager.conf["modules"];
|
||||
auto modList = core::configManager.conf["moduleInstances"].items();
|
||||
std::string sourceName = core::configManager.conf["source"];
|
||||
core::configManager.release();
|
||||
modulesDir = std::filesystem::absolute(modulesDir).string();
|
||||
|
||||
@ -136,8 +137,9 @@ namespace server {
|
||||
sourceList.define(name, name);
|
||||
}
|
||||
|
||||
// TODO: Load sourceId from config
|
||||
|
||||
// Load sourceId from config
|
||||
sourceId = 0;
|
||||
if (sourceList.keyExists(sourceName)) { sourceId = sourceList.keyId(sourceName); }
|
||||
sigpath::sourceManager.selectSource(sourceList[sourceId]);
|
||||
|
||||
// TODO: Use command line option
|
||||
@ -151,6 +153,29 @@ namespace server {
|
||||
}
|
||||
|
||||
void _clientHandler(net::Conn conn, void* ctx) {
|
||||
// Reject if someone else is already connected
|
||||
if (client && client->isOpen()) {
|
||||
spdlog::info("REJECTED Connection from {0}:{1}, another client is already connected.", "TODO", "TODO");
|
||||
|
||||
// Issue a disconnect command to the client
|
||||
uint8_t buf[sizeof(PacketHeader) + sizeof(CommandHeader)];
|
||||
PacketHeader* tmp_phdr = (PacketHeader*)buf;
|
||||
CommandHeader* tmp_chdr = (CommandHeader*)&buf[sizeof(PacketHeader)];
|
||||
tmp_phdr->size = sizeof(PacketHeader) + sizeof(CommandHeader);
|
||||
tmp_phdr->type = PACKET_TYPE_COMMAND;
|
||||
tmp_chdr->cmd = COMMAND_DISCONNECT;
|
||||
conn->write(tmp_phdr->size, buf);
|
||||
|
||||
// TODO: Find something cleaner
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(100));
|
||||
|
||||
conn->close();
|
||||
|
||||
// Start another async accept
|
||||
listener->acceptAsync(_clientHandler, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
spdlog::info("Connection from {0}:{1}", "TODO", "TODO");
|
||||
client = std::move(conn);
|
||||
client->readAsync(sizeof(PacketHeader), rbuf, _packetHandler, NULL);
|
||||
@ -192,17 +217,6 @@ namespace server {
|
||||
client->readAsync(sizeof(PacketHeader), rbuf, _packetHandler, NULL);
|
||||
}
|
||||
|
||||
// void _testServerHandler(dsp::complex_t* data, int count, void* ctx) {
|
||||
// // Build data packet
|
||||
// PacketHeader* hdr = (PacketHeader*)bbuf;
|
||||
// hdr->type = PACKET_TYPE_BASEBAND;
|
||||
// hdr->size = sizeof(PacketHeader) + (count * sizeof(dsp::complex_t));
|
||||
// memcpy(&bbuf[sizeof(PacketHeader)], data, count * sizeof(dsp::complex_t));
|
||||
|
||||
// // Write to network
|
||||
// if (client && client->isOpen()) { client->write(hdr->size, bbuf); }
|
||||
// }
|
||||
|
||||
void _testServerHandler(uint8_t* data, int count, void* ctx) {
|
||||
// Build data packet
|
||||
PacketHeader* hdr = (PacketHeader*)bbuf;
|
||||
@ -279,7 +293,9 @@ namespace server {
|
||||
SmGui::ForceSync();
|
||||
if (SmGui::Combo("##sdrpp_server_src_sel", &sourceId, sourceList.txt)) {
|
||||
sigpath::sourceManager.selectSource(sourceList[sourceId]);
|
||||
// TODO: Save config
|
||||
core::configManager.acquire();
|
||||
core::configManager.conf["source"] = sourceList.key(sourceId);
|
||||
core::configManager.release(true);
|
||||
}
|
||||
if (running) { SmGui::EndDisabled(); }
|
||||
|
||||
|
@ -27,7 +27,8 @@ namespace server {
|
||||
COMMAND_SET_SAMPLE_TYPE,
|
||||
|
||||
// Server to client
|
||||
COMMAND_SET_SAMPLERATE = 0x80
|
||||
COMMAND_SET_SAMPLERATE = 0x80,
|
||||
COMMAND_DISCONNECT
|
||||
};
|
||||
|
||||
enum Error {
|
||||
@ -37,7 +38,7 @@ namespace server {
|
||||
ERROR_INVALID_ARGUMENT
|
||||
};
|
||||
|
||||
// TODO: Pack
|
||||
#pragma pack(push, 1)
|
||||
struct PacketHeader {
|
||||
uint32_t type;
|
||||
uint32_t size;
|
||||
@ -46,4 +47,5 @@ namespace server {
|
||||
struct CommandHeader {
|
||||
uint32_t cmd;
|
||||
};
|
||||
#pragma pack(pop)
|
||||
}
|
Reference in New Issue
Block a user