//##########################################
// Soft-PLC Demo
//##########################################
#include "rlthread.h"
#include "rlplc.h"
#include "rldataaquisition.h"
// Siehe:
// rlplc
// rldataaquisition 
// rllib

// definitions for PLC state variables
enum IndexForIntValues
{
  iiTest = 0,
  ioTest,
  MAX_INT
};

enum IndexForFloatValues
{
  fiTest = 0,
  MAX_FLOAT
};

enum IndexForDoubleValues
{
  diFest = 0,
  MAX_DOUBLE
};

// our objects
static rlPlcState state(MAX_INT, MAX_FLOAT, MAX_DOUBLE);
static rlDataAquisition *modbus;

//#######################################################################
// helper functions for writeing outputs
static void writeInt(int index, int slave, int adr)
{
  char buf[80];

  if(state.intChanged(index))
  {
    sprintf(buf,"coil(%d,%d)", slave, adr);
    modbus->writeIntValue(buf, state.i[index]);
  }  
}

//#######################################################################
static void init()
{
#ifdef _WIN32
  modbus = new rlDataAquisition("c:\\automation\\mbx\\modbus1.mbx",
                                "c:\\automation\\shm\\modbus1.shm",65536);
#else
  modbus = new rlDataAquisition("/srv/automation/mbx/modbus1.mbx",
                                "/srv/automation/shm/modbus1.shm",65536);
#endif
}

//#######################################################################
static void readInputs()
{
  state.i[iiTest] = modbus->intValue("coilStatus(1,0)");
}

//#######################################################################
static void writeOutputs()
{
  writeInt(ioTest, 1, 1000);
}

//#######################################################################
static void step()
{
  if(state.hasBeenSet(iiTest,BIT1)) state.clear(ioTest,BIT0);
  else                              state.set  (ioTest,BIT0);
}

//#######################################################################
int main()
{
  init();
  while(1)
  {
    readInputs();
    step();
    writeOutputs();
    state.rememberState();
    rlsleep(100);
  }
  return 0;
}