#ifndef RTCONDITIONEDOBSERVER_H
#define RTCONDITIONEDOBSERVER_H

/******************************************************************************/
/******************************************************************************/
/*****************     Copyright 2004, 2005 Chronolytics Inc.   ***************/
/*****************     All Right Reserved                       ***************/
/******************************************************************************/
/******************************************************************************/

#include <RTClock.h>
#include <RTTimer.h>
#include <RTMagic.h>
#include <RTReactiveTask.h>

static volatile const char __attribute__ ((unused)) rcsid_RTCONDITIONEDOBSERVER_H[] = "$Id: RTConditionedObserver.h,v 1.4 2005/07/08 03:10:52 dave Exp $";

typedef void  RTConditionedObserver;  /* opaque type */

int RTConditionedObserver_Validate_Fails(RTConditionedObserver *cond_obp);

#define RTConditionedObserver_MAGIC MAGIC("CdOb")

INLINE_VALIDATE(RTConditionedObserver, RTConditionedObserver_Validate_Fails);

typedef int (*RTPredicate_fp)(RTRegister *regp);  /* predicate to test */

enum ob_cond_state {  
   UNINITIALIZED = 0,
   BREAK,
   BREAKING,
   MAKE,
   MAKING,
   LAST_STATE = MAKING };



RTConditionedObserver *RTConditionedObserver_Constructor(
   char               *register_name, /* name of register of interest */
   RTClockMicroSecs    usec_response,    /* response should be < MIN(pred_delays) */
   RTEvent_fp          assert_make_efp,  /* Event function for conditioned make */
   RTEvent_fp          assert_break_efp,  /* Event function for conditioned break */
   RTPredicate_fp      make_pred_pfp,  /* predicate for make == true */
   RTPredicate_fp      break_pred_pfp,  /* predicate for make == true */
   RTClockMicroSecs    make_pred_delay,  /* time at make for make asserted */
   RTClockMicroSecs    break_pred_delay,  /* time at break for make asserted */
   void                *event_arg);  /*  arg passed to assert events */


const char *RTConditionedObserver_RegisterName(RTConditionedObserver *cond_obp);
  /* return bound register name */
void RTConditionedObserver_Free(RTConditionedObserver *cond_obp);

#endif /* RTCONDITIONEDOBSERVER_H */


