#include "AnT.hpp"

#define R     parameters[0]
#define Xt    delayState[0]

// system function
bool delayed_pll (const Array<real_t>& currentState,
	          const Array<real_t>& delayState,
	          const Array<real_t>& parameters,
	          Array<real_t>& rhs)
{
  rhs[0] = -R * sin (Xt);
  return true;
}

#define X   currentState[0]
#define X_l additionalParameters[0]
#define X_r additionalParameters[1]
// user defined Poincare condition
bool 
pll_poincare_condition (const Array<real_t>& currentState,
			const Array<real_t>& delayState,
			const Array<real_t>& parameters,
			const Array<real_t>& additionalParameters)
{
    static int sign_prev = 0;

    // factor '-R' is not realy interesting:
    real_t X_dot = sin (Xt);
    int sign = (X_dot >= 0? -1 : 1);

    bool ret = (sign * sign_prev == -1);
    
    sign_prev = sign;

    return ((X >= X_l) && (X <= X_r) && ret); 
}



#undef R
#undef Xt

extern "C" {

void connectSystem ()
{
  DDE_Proxy::systemFunction = delayed_pll;
  PoincareMapProxyWithUserDefinedConditionForDDEs::
      userDefinedConditionFunction = pll_poincare_condition;
}

}


