diff --git a/communication/multichannelcommunication.cpp b/communication/multichannelcommunication.cpp index e8da7c9..4445a93 100644 --- a/communication/multichannelcommunication.cpp +++ b/communication/multichannelcommunication.cpp @@ -5,8 +5,16 @@ using namespace icsneo; +MultiChannelCommunication::MultiChannelCommunication(device_eventhandler_t err, std::unique_ptr com, + std::function()> makeConfiguredPacketizer, std::unique_ptr e, + std::unique_ptr md, size_t vnetCount) : + Communication(err, std::move(com), makeConfiguredPacketizer, std::move(e), std::move(md)), numVnets(vnetCount) { + vnetThreads.resize(numVnets); + vnetQueues.resize(numVnets); +} + void MultiChannelCommunication::spawnThreads() { - for(size_t i = 0; i < NUM_SUPPORTED_VNETS; i++) { + for(size_t i = 0; i < numVnets; i++) { while(vnetQueues[i].pop()) {} // Ensure the queue is empty vnetThreads[i] = std::thread(&MultiChannelCommunication::vnetReadTask, this, i); } @@ -119,11 +127,11 @@ void MultiChannelCommunication::hidReadTask() { currentQueue = &vnetQueues[0]; break; case CommandType::Vnet2_to_HostPC: - if(NUM_SUPPORTED_VNETS >= 2) + if(numVnets >= 2) currentQueue = &vnetQueues[1]; break; case CommandType::Vnet3_to_HostPC: - if(NUM_SUPPORTED_VNETS >= 3) + if(numVnets >= 3) currentQueue = &vnetQueues[2]; break; } diff --git a/include/icsneo/communication/multichannelcommunication.h b/include/icsneo/communication/multichannelcommunication.h index abfd283..8428573 100644 --- a/include/icsneo/communication/multichannelcommunication.h +++ b/include/icsneo/communication/multichannelcommunication.h @@ -18,7 +18,8 @@ public: std::unique_ptr com, std::function()> makeConfiguredPacketizer, std::unique_ptr e, - std::unique_ptr md) : Communication(err, std::move(com), makeConfiguredPacketizer, std::move(e), std::move(md)) {} + std::unique_ptr md, + size_t vnetCount); void spawnThreads() override; void joinThreads() override; bool sendPacket(std::vector& bytes) override; @@ -27,8 +28,6 @@ protected: bool preprocessPacket(std::deque& usbReadFifo); private: - static constexpr const size_t NUM_SUPPORTED_VNETS = 1; - enum class CommandType : uint8_t { PlasmaReadRequest = 0x10, // Status read request to HSC PlasmaStatusResponse = 0x11, // Status response by HSC @@ -106,9 +105,10 @@ private: CommandType currentCommandType; size_t currentReadIndex = 0; + const size_t numVnets; std::thread hidReadThread; - std::array vnetThreads; - std::array >, NUM_SUPPORTED_VNETS> vnetQueues; + std::vector vnetThreads; + std::vector< moodycamel::BlockingReaderWriterQueue< std::vector > > vnetQueues; void hidReadTask(); void vnetReadTask(size_t vnetIndex); }; diff --git a/include/icsneo/device/tree/plasion/neoviion.h b/include/icsneo/device/tree/plasion/neoviion.h index 15946d3..d03d9e0 100644 --- a/include/icsneo/device/tree/plasion/neoviion.h +++ b/include/icsneo/device/tree/plasion/neoviion.h @@ -28,6 +28,22 @@ private: getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual std::shared_ptr makeCommunication( + std::unique_ptr transport, + std::function()> makeConfiguredPacketizer, + std::unique_ptr encoder, + std::unique_ptr decoder + ) override { + return std::make_shared( + report, + std::move(transport), + makeConfiguredPacketizer, + std::move(encoder), + std::move(decoder), + 1 // 2 + ); + } }; } diff --git a/include/icsneo/device/tree/plasion/neoviplasma.h b/include/icsneo/device/tree/plasion/neoviplasma.h index c1b099c..a09c05e 100644 --- a/include/icsneo/device/tree/plasion/neoviplasma.h +++ b/include/icsneo/device/tree/plasion/neoviplasma.h @@ -28,6 +28,22 @@ private: getWritableNeoDevice().type = DEVICE_TYPE; productId = PRODUCT_ID; } + + virtual std::shared_ptr makeCommunication( + std::unique_ptr transport, + std::function()> makeConfiguredPacketizer, + std::unique_ptr encoder, + std::unique_ptr decoder + ) override { + return std::make_shared( + report, + std::move(transport), + makeConfiguredPacketizer, + std::move(encoder), + std::move(decoder), + 1 // 3 + ); + } }; } diff --git a/include/icsneo/device/tree/plasion/plasion.h b/include/icsneo/device/tree/plasion/plasion.h index 254539b..3355a3e 100644 --- a/include/icsneo/device/tree/plasion/plasion.h +++ b/include/icsneo/device/tree/plasion/plasion.h @@ -45,21 +45,6 @@ public: size_t getEthernetActivationLineCount() const override { return 1; } protected: - virtual std::shared_ptr makeCommunication( - std::unique_ptr transport, - std::function()> makeConfiguredPacketizer, - std::unique_ptr encoder, - std::unique_ptr decoder - ) override { - return std::make_shared( - report, - std::move(transport), - makeConfiguredPacketizer, - std::move(encoder), - std::move(decoder) - ); - } - // TODO This is done so that Plasion can still transmit it's basic networks, awaiting slave VNET support virtual bool isSupportedRXNetwork(const Network&) const override { return true; } virtual bool isSupportedTXNetwork(const Network&) const override { return true; }