Skip to content

Commit

Permalink
NodeArrayOutputOLA separate non-template class member definitions fro…
Browse files Browse the repository at this point in the history
…m header
  • Loading branch information
DaAwesomeP committed Nov 8, 2022
1 parent 7cfaabe commit b01aa0f
Show file tree
Hide file tree
Showing 7 changed files with 110 additions and 89 deletions.
7 changes: 3 additions & 4 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,9 @@ set_target_properties(

if(NOT ANIRAY_WITHOUT_OLA)
# Private to avoid double linking https://stackoverflow.com/a/34533415
target_sources(${CMAKE_PROJECT_NAME} PRIVATE include/aniray/NodeArrayOutputOLA.hpp)
target_sources(${CMAKE_PROJECT_NAME} PRIVATE
include/aniray/NodeArrayOutputOLA.hpp
src/NodeArrayOutputOLA.cpp)
endif()

if(ANIRAY_WITH_LINT)
Expand All @@ -85,9 +87,6 @@ if(ANIRAY_WITH_LINT)
src/lintHelpers/NodeArray.cpp
src/lintHelpers/NodeArrayOutput.cpp
src/lintHelpers/NodeArraySampler.cpp)
if(NOT ANIRAY_WITHOUT_OLA)
target_sources(${CMAKE_PROJECT_NAME} PRIVATE src/lintHelpers/NodeArrayOutputOLA.cpp)
endif()
set_target_properties(
${CMAKE_PROJECT_NAME}
PROPERTIES
Expand Down
7 changes: 2 additions & 5 deletions include/aniray/DMXAddr.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,9 @@

namespace aniray {

using std::uint32_t;
using std::uint8_t;

struct DMXAddr {
uint32_t mUniverse;
uint8_t mAddr;
std::uint32_t mUniverse;
std::uint8_t mAddr;
};

auto operator<<(std::ostream &out, const DMXAddr &d) -> std::ostream &;
Expand Down
2 changes: 0 additions & 2 deletions include/aniray/NodeArray.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@
#include <boost/geometry/algorithms/append.hpp>
#include <boost/geometry/algorithms/centroid.hpp>
#include <boost/geometry/algorithms/comparable_distance.hpp> // IWYU pragma: keep
#include <boost/geometry/algorithms/detail/comparable_distance/interface.hpp>
#include <boost/geometry/algorithms/detail/envelope/interface.hpp>
#include <boost/geometry/algorithms/envelope.hpp> // IWYU pragma: keep
#include <boost/geometry/algorithms/transform.hpp>
#include <boost/geometry/io/dsv/write.hpp>
Expand Down
6 changes: 2 additions & 4 deletions include/aniray/NodeArrayOutput.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,6 @@

namespace aniray {

using std::uint32_t;
using std::uint8_t;

template <typename NodeArrayT, auto DataToOutput> class NodeArrayOutput {
public:
using InnerNodeArrayT = NodeArrayT;
Expand Down Expand Up @@ -65,7 +62,8 @@ template <typename NodeArrayT, auto DataToOutput> class NodeArrayOutput {
}

protected:
virtual void setChannel(uint32_t universe, uint8_t channel, uint8_t data) {}
virtual void setChannel(std::uint32_t universe, std::uint8_t channel,
std::uint8_t data) {}
virtual auto sendData() -> bool { return false; }

private:
Expand Down
54 changes: 7 additions & 47 deletions include/aniray/NodeArrayOutputOLA.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,21 +33,17 @@
#include <mutex>
#include <stdexcept>
#include <unordered_map>
#include <utility>
#include <vector>

#include <boost/log/core/record.hpp>
#include <boost/log/sources/record_ostream.hpp>
#include <boost/log/trivial.hpp>
#include <boost/preprocessor/seq/enum.hpp>
#include <boost/preprocessor/seq/size.hpp>
#include <ola/Callback.h>
#include <ola/Clock.h>
#include <ola/DmxBuffer.h>
#include <ola/Logging.h>
#include <ola/client/ClientArgs.h>
#include <ola/client/ClientWrapper.h>
#include <ola/client/OlaClient.h>
#include <ola/io/SelectServer.h>
#include <ola/thread/Thread.h>

Expand All @@ -63,42 +59,16 @@ using std::uint8_t;

class NodeArrayOutputOLAThread : public ola::thread::Thread {
public:
NodeArrayOutputOLAThread(const Options &options)
: ola::thread::Thread(options) {}
NodeArrayOutputOLAThread(const Options &options);

auto Start(const ola::TimeInterval &period,
std::unordered_map<uint32_t, size_t> &universesToBuffers) -> bool {
mPeriod = period;
mUniversesToBuffers = universesToBuffers;
if (!mOLAClientWrapper.Setup()) {
return false;
}
return ola::thread::Thread::Start();
}

void Stop() {
mOLAClientWrapper.GetSelectServer()->Terminate();
}

auto GetSelectServer() -> ola::io::SelectServer* {
return mOLAClientWrapper.GetSelectServer();
}

void updateData(std::vector<ola::DmxBuffer> buffers) {
const std::lock_guard<std::mutex> lock(mUpdateMutex);
mBuffers = std::move(buffers);
}
std::unordered_map<uint32_t, size_t> &universesToBuffers) -> bool;
void Stop();
auto GetSelectServer() -> ola::io::SelectServer*;
void updateData(std::vector<ola::DmxBuffer> buffers);

protected:
auto Run() -> void* override {
mOLAClientWrapper.GetSelectServer()->RegisterRepeatingTimeout(
mPeriod,
ola::NewCallback(
this,
&NodeArrayOutputOLAThread::InternalSendUniverses));
mOLAClientWrapper.GetSelectServer()->Run();
return nullptr;
}
auto Run() -> void* override;

private:
ola::client::OlaClientWrapper mOLAClientWrapper;
Expand All @@ -107,17 +77,7 @@ class NodeArrayOutputOLAThread : public ola::thread::Thread {
std::vector<ola::DmxBuffer> mBuffers;
std::mutex mUpdateMutex;

auto InternalSendUniverses() -> bool {
auto *olaClient = mOLAClientWrapper.GetClient();
const std::lock_guard<std::mutex> lock(mUpdateMutex);
for (auto const &[universe, i] : mUniversesToBuffers) {
if (i >= mBuffers.size()) {
continue;
}
olaClient->SendDMX(universe, mBuffers[i], ola::client::SendDMXArgs());
}
return true;
}
auto InternalSendUniverses() -> bool;
};

template <typename NodeArrayT, auto DataToOutput>
Expand Down
96 changes: 96 additions & 0 deletions src/NodeArrayOutputOLA.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
/* NodeArrayOutputOLA.cpp: Aniray system OLA output
*
* Created by Perry Naseck on 2022-09-22.
*
* This file is a part of Aniray
* https://github.com/HypersonicED/aniray
*
* Copyright (c) 2022, Hypersonic
* Copyright (c) 2022, Perry Naseck
* All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* SPDX-License-Identifier: Apache-2.0
*/

#include <cstddef>
#include <cstdint>
#include <mutex>
#include <unordered_map>
#include <utility>
#include <vector>

#include <ola/Callback.h>
#include <ola/Clock.h>
#include <ola/DmxBuffer.h>
#include <ola/client/ClientArgs.h>
#include <ola/client/ClientWrapper.h>
#include <ola/client/OlaClient.h>
#include <ola/io/SelectServer.h>
#include <ola/thread/Thread.h>

#include <aniray/NodeArrayOutputOLA.hpp>

namespace aniray {

NodeArrayOutputOLAThread::NodeArrayOutputOLAThread(const Options &options)
: ola::thread::Thread(options) {}

auto NodeArrayOutputOLAThread::Start(const ola::TimeInterval &period,
std::unordered_map<std::uint32_t, std::size_t> &universesToBuffers) -> bool {
mPeriod = period;
mUniversesToBuffers = universesToBuffers;
if (!mOLAClientWrapper.Setup()) {
return false;
}
return ola::thread::Thread::Start();
}

void NodeArrayOutputOLAThread::Stop() {
mOLAClientWrapper.GetSelectServer()->Terminate();
}

auto NodeArrayOutputOLAThread::GetSelectServer() -> ola::io::SelectServer* {
return mOLAClientWrapper.GetSelectServer();
}

void NodeArrayOutputOLAThread::updateData(std::vector<ola::DmxBuffer> buffers) {
const std::lock_guard<std::mutex> lock(mUpdateMutex);
mBuffers = std::move(buffers);
}

auto NodeArrayOutputOLAThread::Run() -> void* {
mOLAClientWrapper.GetSelectServer()->RegisterRepeatingTimeout(
mPeriod,
ola::NewCallback(
this,
&NodeArrayOutputOLAThread::InternalSendUniverses));
mOLAClientWrapper.GetSelectServer()->Run();
return nullptr;
}

auto NodeArrayOutputOLAThread::InternalSendUniverses() -> bool {
auto *olaClient = mOLAClientWrapper.GetClient();
const std::lock_guard<std::mutex> lock(mUpdateMutex);
for (auto const &[universe, i] : mUniversesToBuffers) {
if (i >= mBuffers.size()) {
continue;
}
olaClient->SendDMX(universe, mBuffers[i], ola::client::SendDMXArgs());
}
return true;
}

} // namespace aniray

27 changes: 0 additions & 27 deletions src/lintHelpers/NodeArrayOutputOLA.cpp

This file was deleted.

0 comments on commit b01aa0f

Please sign in to comment.