/* * demoApp.cc * * Created on: Jun 9, 2016 * Author: Martin Hierholzer */ #include <ControlSystemAdapter-DoocsAdapter/DoocsAdapter.h> #include <iostream> #include "Application.h" #include "ScalarAccessor.h" #include "ApplicationModule.h" namespace ctk = ChimeraTK; class MyFirstModule : public ctk::ApplicationModule { public: SCALAR_ACCESSOR(int, setpoint, ctk::VariableDirection::input, "MV/m", ctk::UpdateMode::push); SCALAR_ACCESSOR(int, feedforward, ctk::VariableDirection::output, "MV/m", ctk::UpdateMode::push); void mainLoop() { feedforward = 100; feedforward.write(); while(true) { setpoint.read(); feedforward = 42*setpoint; std::cout << "FirstModule: feedforward = " << feedforward << std::endl; usleep(200000); feedforward.write(); } } }; class MySecondModule : public ctk::ApplicationModule { public: SCALAR_ACCESSOR(int, feedforward, ctk::VariableDirection::input, "MV/m", ctk::UpdateMode::push); SCALAR_ACCESSOR(int, readback, ctk::VariableDirection::output, "MV/m", ctk::UpdateMode::push); void mainLoop() { while(true) { feedforward.read(); std::cout << "SecondModule: feedforward = " << feedforward << std::endl; readback = feedforward/21; usleep(200000); readback.write(); } } }; class MyApp : public ctk::Application { public: MyFirstModule firstModule; MySecondModule secondModule; constexpr static char unit_Field[] = "MV/m"; void initialise() { firstModule.feedforward.connectTo(secondModule.feedforward); //firstModule.setpoint.connectTo(secondModule.readback); firstModule.setpoint.publish("MyLocation/setpoint"); secondModule.readback.publish("MyLocation/readback"); } virtual ~MyApp() {}; }; BEGIN_DOOCS_SERVER("Cosade server", 10) // Create static instances for all applications cores. They must not have overlapping // process variable names ("location/protery" must be unique). static MyApp myApp; myApp.setPVManager(doocsAdapter.getDevicePVManager()); myApp.run(); END_DOOCS_SERVER()