Newer
Older
Martin Christoph Hierholzer
committed
/*
* demoApp.cc
*
* Created on: Jun 9, 2016
* Author: Martin Hierholzer
*/
#include <iostream>
Martin Christoph Hierholzer
committed
#include <mtca4u/BackendFactory.h>
Martin Christoph Hierholzer
committed
#include "ApplicationCore.h"
Martin Christoph Hierholzer
committed
namespace ctk = ChimeraTK;
class AutomationModule : public ctk::ApplicationModule {
Martin Christoph Hierholzer
committed
public:
Martin Christoph Hierholzer
committed
SCALAR_INPUT(double, operatorSetpoint, "MV/m", ctk::UpdateMode::poll);
SCALAR_OUTPUT(double, loopSetpoint, "MV/m");
Martin Christoph Hierholzer
committed
void mainLoop() {
loopSetpoint = 0;
loopSetpoint.write();
Martin Christoph Hierholzer
committed
while(true) {
operatorSetpoint.read();
if(operatorSetpoint > loopSetpoint) loopSetpoint++;
if(operatorSetpoint < loopSetpoint) loopSetpoint--;
std::cout << "AutomationModule: operatorSetpoint = " << operatorSetpoint << std::endl;
std::cout << "AutomationModule: loopSetpoint = " << loopSetpoint << std::endl;
loopSetpoint.write();
Martin Christoph Hierholzer
committed
usleep(200000);
}
}
};
class ControlLoopModule : public ctk::ApplicationModule {
Martin Christoph Hierholzer
committed
public:
Martin Christoph Hierholzer
committed
SCALAR_INPUT(double, setpoint, "MV/m", ctk::UpdateMode::push);
SCALAR_INPUT(double, readback, "MV/m", ctk::UpdateMode::push);
SCALAR_OUTPUT(double, actuator, "MV/m");
Martin Christoph Hierholzer
committed
void mainLoop() {
Martin Christoph Hierholzer
committed
actuator = 0;
actuator.write();
Martin Christoph Hierholzer
committed
while(true) {
readback.read();
setpoint.read();
actuator = 10.*(setpoint-readback);
std::cout << "ControlLoopModule: setpoint = " << setpoint << std::endl;
std::cout << "ControlLoopModule: readback = " << readback << std::endl;
std::cout << "ControlLoopModule: actuator = " << actuator << std::endl;
actuator.write();
Martin Christoph Hierholzer
committed
usleep(200000);
}
}
};
class SimulatorModule : public ctk::ApplicationModule {
public:
Martin Christoph Hierholzer
committed
SCALAR_INPUT(double, actuator, "MV/m", ctk::UpdateMode::push);
SCALAR_OUTPUT(double, readback, "MV/m");
double lastValue{0};
void mainLoop() {
while(true) {
actuator.read();
readback = (100*lastValue + actuator)/100.;
lastValue = readback;
std::cout << "SimulatorModule: actuator = " << actuator << std::endl;
std::cout << "SimulatorModule: readback = " << readback << std::endl;
readback.write();
usleep(200000);
}
}
};
Martin Christoph Hierholzer
committed
class MyApp : public ctk::Application {
public:
Martin Christoph Hierholzer
committed
MyApp() : Application("demoApp") {}
Martin Christoph Hierholzer
committed
AutomationModule automation;
ControlLoopModule controlLoop;
SimulatorModule simulator;
Martin Christoph Hierholzer
committed
ctk::DeviceModule dev{"Dummy0", "MyModule"};
Martin Christoph Hierholzer
committed
ctk::ControlSystemModule cs{"MyLocation"};
Martin Christoph Hierholzer
committed
void initialise() {
Martin Christoph Hierholzer
committed
mtca4u::BackendFactory::getInstance().setDMapFilePath("dummy.dmap");
Martin Christoph Hierholzer
committed
ctrlVar("MyLocation/setpoint") >> automation.operatorSetpoint;
Martin Christoph Hierholzer
committed
automation.loopSetpoint >> controlLoop.setpoint >> cs("setpoint_automation");
Martin Christoph Hierholzer
committed
Martin Christoph Hierholzer
committed
controlLoop.actuator >> dev("Variable") >> cs("actuatorLoop");
Martin Christoph Hierholzer
committed
dev("Variable") [ controlLoop.actuator ] >> simulator.actuator >> cs("actuatorSimulator");
Martin Christoph Hierholzer
committed
dev("Variable", typeid(double)) [ controlLoop.actuator ] >> cs("actuatorSimulator_direct");
Martin Christoph Hierholzer
committed
Martin Christoph Hierholzer
committed
simulator.readback >> controlLoop.readback >> cs("readback") >> cs("readback_another_time");
Martin Christoph Hierholzer
committed
dumpConnections();
Martin Christoph Hierholzer
committed
}
};
Martin Christoph Hierholzer
committed
MyApp myApp;