trick/trick_source/sim_services/RealtimeInjector/include/RtiEvent.hh
Alex Lin 14a75508a3 Cleaning up once include variables and copyright cleanup.
Changed all header file once include variables to follow the same naming
convention and not start with any underscores.  Also deleted old
incorrect copyright notices.  Also removed $Id: tags from all files.

Fixes #14.  Fixes #22.
2015-03-23 16:03:14 -05:00

172 lines
6.7 KiB
C++

#ifndef RTIEVENT_H
#define RTIEVENT_H
#include <string>
#include <sstream>
#include <stdlib.h>
#include "sim_services/MemoryManager/include/reference.h"
#include "sim_services/MemoryManager/include/bitfield_proto.h"
#include "sim_services/MemoryManager/include/memorymanager_c_intf.h"
#include "sim_services/Message/include/message_proto.h"
#include "sim_services/Message/include/message_type.h"
namespace Trick {
class RtiEventBase {
public:
RtiEventBase(REF2 * in_ref): ref(in_ref) {} ;
virtual ~RtiEventBase() { free(ref) ; }
virtual void do_assignment(void) = 0 ;
virtual std::string print_val(void) = 0 ;
void print_rti(void) ;
void check_address(void) ;
REF2 *ref ;
} ;
template <class T>
class RtiEventInfo : public RtiEventBase {
public:
RtiEventInfo( REF2 * in_ref, T in_val ) : RtiEventBase(in_ref) , value(in_val) {} ;
virtual void do_assignment(void) {
check_address() ;
if ( ref->address != NULL ) {
*(T *)ref->address = value ;
}
} ;
virtual std::string print_val() { std::stringstream temp ; temp << value ; return temp.str() ; } ;
T value ;
} ;
template <class T>
class RtiBitfieldEventInfo : public RtiEventBase {
public:
RtiBitfieldEventInfo( REF2 * in_ref, T in_val ) : RtiEventBase(in_ref) , value(in_val) {} ;
virtual void do_assignment(void) {
check_address() ;
if ( ref->address != NULL ) {
PUT_BITFIELD( ref->address , (int)value, sizeof(T) , ref->attr->index[0].start , ref->attr->index[0].size ) ;
}
} ;
virtual std::string print_val() { std::stringstream temp ; temp << value ; return temp.str() ; } ;
T value ;
} ;
template <class T>
RtiEventBase * createRtiEvent (char *variable, T value ) {
Trick::RtiEventBase *rei = NULL ;
REF2 *ref;
ref = ref_attributes(variable);
if (ref != NULL ) {
//TODO: Ensure we have a scalar value here!
switch(ref->attr->type) {
case TRICK_CHARACTER:
rei = new Trick::RtiEventInfo< char >( ref , (char)value);
break;
case TRICK_UNSIGNED_CHARACTER:
rei = new Trick::RtiEventInfo< unsigned char >( ref , (unsigned char)value);
break;
case TRICK_SHORT:
rei = new Trick::RtiEventInfo< short >( ref , (short)value);
break;
case TRICK_UNSIGNED_SHORT:
rei = new Trick::RtiEventInfo< unsigned short >( ref , (unsigned short)value);
break;
case TRICK_INTEGER:
rei = new Trick::RtiEventInfo< int >( ref , (int)value);
break;
case TRICK_UNSIGNED_INTEGER:
rei = new Trick::RtiEventInfo< unsigned int >( ref , (unsigned int)value);
break;
case TRICK_LONG:
rei = new Trick::RtiEventInfo< long >( ref , (long)value);
break;
case TRICK_UNSIGNED_LONG:
rei = new Trick::RtiEventInfo< unsigned long >( ref , (unsigned long)value);
break;
case TRICK_LONG_LONG:
rei = new Trick::RtiEventInfo< long long >( ref , (long long)value);
break;
case TRICK_UNSIGNED_LONG_LONG:
rei = new Trick::RtiEventInfo< unsigned long long >( ref , (unsigned long long)value);
break;
case TRICK_FLOAT:
rei = new Trick::RtiEventInfo< float >( ref , (float)value);
break;
case TRICK_DOUBLE:
rei = new Trick::RtiEventInfo< double >( ref , (double)value);
break;
case TRICK_BOOLEAN:
rei = new Trick::RtiEventInfo< bool >( ref , (bool)value);
break;
case TRICK_BITFIELD:
switch (ref->attr->size) {
case sizeof(char):
rei = new Trick::RtiBitfieldEventInfo< char >( ref , (char)value);
break ;
case sizeof(short):
rei = new Trick::RtiBitfieldEventInfo< short >( ref , (short)value);
break ;
case sizeof(int):
default:
rei = new Trick::RtiBitfieldEventInfo< int >( ref , (int)value);
break ;
case sizeof(long long):
rei = new Trick::RtiBitfieldEventInfo< long long >( ref , (long long)value);
break ;
}
break;
case TRICK_UNSIGNED_BITFIELD:
switch (ref->attr->size) {
case sizeof(unsigned char):
rei = new Trick::RtiBitfieldEventInfo< unsigned char >( ref , (unsigned char)value);
break ;
case sizeof(unsigned short):
rei = new Trick::RtiBitfieldEventInfo< unsigned short >( ref , (unsigned short)value);
break ;
case sizeof(unsigned int):
default:
rei = new Trick::RtiBitfieldEventInfo< unsigned int >( ref , (unsigned int)value);
break ;
case sizeof(unsigned long long):
rei = new Trick::RtiBitfieldEventInfo< unsigned long long >( ref , (unsigned long long)value);
break ;
}
break;
case TRICK_ENUMERATED:
switch (ref->attr->size) {
case sizeof(char):
rei = new Trick::RtiEventInfo< char >( ref , (char)value);
break ;
case sizeof(short):
rei = new Trick::RtiEventInfo< short >( ref , (short)value);
break ;
case sizeof(int):
default:
rei = new Trick::RtiEventInfo< int >( ref , (int)value);
break ;
case sizeof(long long):
rei = new Trick::RtiEventInfo< long long >( ref , (long long)value);
break ;
}
break;
default:
message_publish(MSG_ERROR, "%s:%s:%d unsupported type %d \n",
__FILE__, __func__, __LINE__, ref->attr->type);
break;
}
} else {
message_publish(MSG_ERROR, "%s:%s:%d Variable Not Found <%s>\n",
__FILE__, __func__, __LINE__, variable);
}
return rei;
}
}
#endif