From d417394ae791e9972fede0665587aa612f93bca0 Mon Sep 17 00:00:00 2001 From: marwik15 Date: Mon, 2 May 2022 11:30:54 +0200 Subject: Add sine wave generator --- CMakeLists.txt | 1 + daemon/CMakeLists.txt | 1 + daemon/src/Sinewave.cpp | 59 ++++++++++++++++++++++++++++++++++ daemon/src/Sinewave.h | 33 +++++++++++++++++++ daemon/src/daemon.cpp | 4 +++ examples/CMakeLists.txt | 1 + examples/sinewave/CMakeLists.txt | 7 ++++ examples/sinewave/sinewave_example.cpp | 20 ++++++++++++ library/CMakeLists.txt | 1 + library/include/hwd.h | 11 +++++++ library/src/sinewave.cpp | 44 +++++++++++++++++++++++++ 11 files changed, 182 insertions(+) create mode 100644 daemon/src/Sinewave.cpp create mode 100644 daemon/src/Sinewave.h create mode 100644 examples/CMakeLists.txt create mode 100644 examples/sinewave/CMakeLists.txt create mode 100644 examples/sinewave/sinewave_example.cpp create mode 100644 library/src/sinewave.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 5629c67..20d0f18 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,3 +9,4 @@ find_package(rpclib 2 REQUIRED) add_subdirectory(common) add_subdirectory(daemon) add_subdirectory(library) +add_subdirectory(examples) diff --git a/daemon/CMakeLists.txt b/daemon/CMakeLists.txt index 54d3950..6a01e15 100644 --- a/daemon/CMakeLists.txt +++ b/daemon/CMakeLists.txt @@ -4,6 +4,7 @@ add_executable(${PROJECT_NAME} src/daemon.cpp src/Gpio.cpp src/Memory.cpp + src/Sinewave.cpp ) target_link_libraries(${PROJECT_NAME} PRIVATE rpclib::rpc diff --git a/daemon/src/Sinewave.cpp b/daemon/src/Sinewave.cpp new file mode 100644 index 0000000..de63553 --- /dev/null +++ b/daemon/src/Sinewave.cpp @@ -0,0 +1,59 @@ +#include "Sinewave.h" + +Sinewave::Sinewave() +{ + m_start_time = std::chrono::high_resolution_clock::now(); + + m_amplitude = 11; + m_frequency = 10; + m_phase = 30; +} + +void Sinewave::apply(AssemblyContext ctx) +{ + ctx.bind("/set_amplitude", [&](double amplitude) { set_amplitude(amplitude); }); + ctx.bind("/set_frequency", [&](double frequency) { set_frequency(frequency); }); + ctx.bind("/set_phase", [&](double phase) { set_phase(phase); }); + ctx.bind("/get_amplitude", [&]() -> double { return get_amplitude(); }); + ctx.bind("/get_frequency", [&]() -> double { return get_frequency(); }); + ctx.bind("/get_phase", [&]() -> double { return get_phase(); }); + ctx.bind("/get_point", [&]() -> double { return get_point(); }); +} + +void Sinewave::set_amplitude(double amplitude) +{ + m_amplitude = amplitude; +} + +void Sinewave::set_frequency(double frequency) +{ + m_frequency = frequency; +} + +void Sinewave::set_phase(double phase) +{ + m_phase = phase; +} + +double Sinewave::get_amplitude() const +{ + return m_amplitude; +} + +double Sinewave::get_frequency() const +{ + return m_frequency; +} + +double Sinewave::get_phase() const +{ + return m_phase; +} + +double Sinewave::get_point() +{ + m_current_time = std::chrono::high_resolution_clock::now(); + m_duration_time = m_current_time - m_start_time; + + return m_amplitude * sin(2 * 3.14 * m_frequency * m_duration_time.count() + m_phase); +} diff --git a/daemon/src/Sinewave.h b/daemon/src/Sinewave.h new file mode 100644 index 0000000..d8988ad --- /dev/null +++ b/daemon/src/Sinewave.h @@ -0,0 +1,33 @@ +#pragma once + +#include +#include +#include + +#include "Assembly.h" + +class Sinewave { + +public: + Sinewave(); + + void apply(AssemblyContext ctx); + + void set_amplitude(double amplitude); + void set_frequency(double frequency); + void set_phase(double phase); + + double get_amplitude() const; + double get_frequency() const; + double get_phase() const; + +private: + std::chrono::time_point m_start_time, m_current_time; + std::chrono::duration m_duration_time; + + double m_amplitude; + double m_frequency; + double m_phase; + + double get_point(); +}; diff --git a/daemon/src/daemon.cpp b/daemon/src/daemon.cpp index 28b95a4..1b9dcab 100644 --- a/daemon/src/daemon.cpp +++ b/daemon/src/daemon.cpp @@ -6,10 +6,12 @@ #include "Assembly.h" #include "Gpio.h" #include "Memory.h" +#include "Sinewave.h" static Gpio gpio; static Memory memory; +static Sinewave sinewave; int main(int, char **) @@ -18,5 +20,7 @@ int main(int, char **) Assembly assembly {server}; assembly.add("gpio", gpio); assembly.add("memory", memory); + assembly.add("sinewave", sinewave); + server.run(); } diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..931a91e --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(sinewave) diff --git a/examples/sinewave/CMakeLists.txt b/examples/sinewave/CMakeLists.txt new file mode 100644 index 0000000..6c83399 --- /dev/null +++ b/examples/sinewave/CMakeLists.txt @@ -0,0 +1,7 @@ +project(sinewave_example CXX) + +add_executable(sinewave_example "sinewave_example.cpp") + +target_link_libraries(sinewave_example library) + +#${CMAKE_INSTALL_DOCDIR}/examples diff --git a/examples/sinewave/sinewave_example.cpp b/examples/sinewave/sinewave_example.cpp new file mode 100644 index 0000000..e6583d6 --- /dev/null +++ b/examples/sinewave/sinewave_example.cpp @@ -0,0 +1,20 @@ +#include +#include + +#include +#include +#include + +int main() { + + hwd::sinewave::set_amplitude(11); + hwd::sinewave::set_frequency(10); + hwd::sinewave::set_phase(30); + + for (int i = 1; i < 1200; i++) { + std::cout << hwd::sinewave::get_point() << std::endl; + + } + + return 0; +} diff --git a/library/CMakeLists.txt b/library/CMakeLists.txt index 28ccbb1..a454186 100644 --- a/library/CMakeLists.txt +++ b/library/CMakeLists.txt @@ -3,6 +3,7 @@ add_library(${PROJECT_NAME} SHARED src/client.cpp src/gpio.cpp src/memory.cpp + src/sinewave.cpp ) target_link_libraries(${PROJECT_NAME} PUBLIC rpclib::rpc diff --git a/library/include/hwd.h b/library/include/hwd.h index fbd2fef..4ea75fa 100644 --- a/library/include/hwd.h +++ b/library/include/hwd.h @@ -20,4 +20,15 @@ std::vector read(std::size_t len, std::size_t off); bool write(const std::vector data, std::size_t off); } // namespace memory +namespace sinewave +{ + void set_amplitude(double); + void set_frequency(double); + void set_phase(double); + double get_amplitude(); + double get_frequency(); + double get_phase(); + double get_point(); +} // namespace sinewave + } // namespace hwd diff --git a/library/src/sinewave.cpp b/library/src/sinewave.cpp new file mode 100644 index 0000000..3a1d8ec --- /dev/null +++ b/library/src/sinewave.cpp @@ -0,0 +1,44 @@ +#include "hwd.h" + +#include "client.h" + +namespace hwd +{ +namespace sinewave +{ + void set_amplitude(double amplitude) + { + get_client().call("sinewave/set_amplitude", amplitude); + } + + void set_frequency(double frequency) + { + get_client().call("sinewave/set_frequency", frequency); + } + + void set_phase(double phase) + { + get_client().call("sinewave/set_phase", phase); + } + + double get_amplitude() + { + return get_client().call("sinewave/get_amplitude").as(); + } + + double get_frequency() + { + return get_client().call("sinewave/get_frequency").as(); + } + + double get_phase() + { + return get_client().call("sinewave/get_phase").as(); + } + + double get_point() { + return get_client().call("sinewave/get_point").as(); + } + +} // namespace sinewave +} // namespace hwd -- cgit v1.1