/*
 * demoApp.cc
 *
 *  Created on: Jun 9, 2016
 *      Author: Martin Hierholzer
 */

#include <iostream>

#include <mtca4u/BackendFactory.h>

#include "ApplicationCore.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;

    void initialise() {
      mtca4u::BackendFactory::getInstance().setDMapFilePath("dummy.dmap");

      firstModule.feedforward.connectToDevice("Dummy0","/MyModule/Variable", ctk::UpdateMode::poll);
      secondModule.feedforward.connectToDevice("Dummy0","/MyModule/Variable", ctk::UpdateMode::poll);
      //firstModule.feedforward.connectTo(secondModule.feedforward);

      firstModule.setpoint.publish("MyLocation/setpoint");
      secondModule.readback.publish("MyLocation/readback");
    }

    virtual ~MyApp() {};

};

MyApp myApp;