Difference between revisions of "NaviTrack Tutorial:Creating module:Module structure"

From NAMIC Wiki
Jump to: navigation, search
Line 1: Line 1:
 
= Three types of nodes =
 
= Three types of nodes =
  
===Sink nodes   (XxxxSink.h, [XxxxSink.cxx])===
+
===Sink nodes (XxxxSink.h, [XxxxSink.cxx])===
 
Leaves in the graph and receive their data values from external sources, such as Polaris optraciking system, and send put the data into NaviTrack data flow graph.
 
Leaves in the graph and receive their data values from external sources, such as Polaris optraciking system, and send put the data into NaviTrack data flow graph.
  
Line 10: Line 10:
 
Intermediate nodes and modify the values received from other nodes.
 
Intermediate nodes and modify the values received from other nodes.
  
= Classes for module "MyTutorialModule" =
+
 
 +
= Two types of Modules =
 +
 
 +
===Normal Module===
 +
Each node of modules has event handling functions to put, pull and process data,
 +
and these are called whenever corresponding events occure.
 +
Therefore, the timing of processing is detemined only by NaviTrack events.
 +
 
 +
===Thread Module===
 +
In some application, a module has to call certain procedures
 +
with its own timing, e.g. monitoring hardware, acquiring data from a device.
 +
For this purpose, NaviTrack allows us to create a module with
 +
threading capability. The structure of thread module will be
 +
described later.
 +
 
 +
= Classes for module "MyTutorialModule" (w/o thread) =
 
== Module class (MyTutorialModule.h, MyTutorialModule.cxx) ==
 
== Module class (MyTutorialModule.h, MyTutorialModule.cxx) ==
  
Line 168: Line 183:
 
=== isEventGenerator() ===
 
=== isEventGenerator() ===
 
This is same as isEventGenerator() in Sink class.
 
This is same as isEventGenerator() in Sink class.
 +
 +
 +
= Classes for module "MyTutorialThreadModule" (w/ thread) =
 +
== Module class (MyTutorialThreadModule.h, MyTutorialThreadModule.cxx) ==
 +
In a thread module, the only difference from a normal module
 +
is a module class, where a thread is implemented.
 +
 +
MyTutorialThreadModule.h
 +
 +
 +
== Sink class (MyTutorialThreadSink.h, MyTutorialThreadSink.cxx) ==
 +
 +
== Source class (MyTutorialThreadSource.h, MyTutorialThreadSource.cxx) ==
  
  
 
Go back to [[NaviTrack_Tutorial:Creating_module|Creating module]].
 
Go back to [[NaviTrack_Tutorial:Creating_module|Creating module]].

Revision as of 21:57, 15 May 2007

Home < NaviTrack Tutorial:Creating module:Module structure

Three types of nodes

Sink nodes (XxxxSink.h, [XxxxSink.cxx])

Leaves in the graph and receive their data values from external sources, such as Polaris optraciking system, and send put the data into NaviTrack data flow graph.

Source nodes (XxxxSource.h, [XxxxSource.cxx])

Leaves to propagate their data values received from other nodes to external outputs.

Filter nodes (we don't use this in the tutorial)

Intermediate nodes and modify the values received from other nodes.


Two types of Modules

Normal Module

Each node of modules has event handling functions to put, pull and process data, and these are called whenever corresponding events occure. Therefore, the timing of processing is detemined only by NaviTrack events.

Thread Module

In some application, a module has to call certain procedures with its own timing, e.g. monitoring hardware, acquiring data from a device. For this purpose, NaviTrack allows us to create a module with threading capability. The structure of thread module will be described later.

Classes for module "MyTutorialModule" (w/o thread)

Module class (MyTutorialModule.h, MyTutorialModule.cxx)

This class is used to configure and manage source and sink nodes.

The following example class contains only essential functions for a NaviTrack module.

MyTutorialModule.h:

#ifndef __MY_TUTORIAL_MODULE_H__
#define __MY_TUTORIAL_MODULE_H__

#include <OpenTracker/OpenTracker.h>
#include <OpenTracker/dllinclude.h>
#include <OpenTracker/input/SPLModules.h>
#include <OpenTracker/input/MyTutorialSink.h>
#include <OpenTracker/input/MyTutorialSource.h>
#include <string>

namespace ot {

class OPENTRACKER_API MyTutorialModule : public Module, public NodeFactory
{   
 public:
 
  // Constructor and destructor
  MyTutorialModule();
  virtual ~MyTutorialModule();
  
  Node* createNode( const std::string& name,  ot::StringTable& attributes);
  void  pushEvent();
  void  pullEvent() {};
  void  init(StringTable&, ConfigNode *);
 
 private:
  MyTutorialSink*   sink;
  MyTutorialSource* source;
  
  friend class  MyTutorialSink;
  friend class  MyTutorialSource;
};

OT_MODULE(MyTutorialModule);

} // end of namespace ot
#endif // __MY_TUTORIAL_MODULE_H__

init()

Function init() is called when the NaviTrack detects MyTutorialConfig in configuration section of the XML file, during starting up. You can put codes to initialize the module into this function.

createNode()

When the NaviTrack detects either MyTutorialSource or MyTutorialSink in the XML file, function createNode is called. The code for this function might be as following:

ot::Node * MyTutorialModule::createNode( const std::string& name,  ot::StringTable& attributes)
{
  if( name.compare("MyTutorialSink") == 0 )
    {
      sink =  new MyTutorialSink();
      return sink;
    }
  if(name.compare("MyTutorialSource") == 0 )
    {
      std::string name=attributes.get("name");
      source = new MyTutorialSource();
      return source;
    }
  return NULL;
}

Note that the class in above example can have only one sink node and one source node. But you can manage more than two nodes with same type, by using array or vector, since createNode is called each time the NaviTrack detects the corresponding type of node.

You can get any parameters specified for a certain node in XML configuration file, by using ot::StringTable::get() function, as shown in above code.

pushEvent() and pullEvent()

These are a sort of event handling function. These are called whenever a push or pull event occurs.

Sink class (MyTutorialSink.h, MyTutorialSink.cxx)

This class is for a Sink node itself. The following example class contains only essential functions for a Sink node.

MyTutorialSink.h:

#ifndef __MY_TUTORIAL_SINK_H__
#define __MY_TUTORIAL_SINK_H__ 

#include <OpenTracker/OpenTracker.h>

namespace ot {
  
  class MyTutorialSink : public ot::Node
  {
  public:
    
    MyTutorialSink();
    ~MyTutorialSink();
    
  public:
    
    virtual int isEventGenerator() {return 1;};
    virtual void onEventGenerated(Event&, Node&);
    
  }; 

} // end of namespace ot
  1. endif // end of __MY_TUTORIAL_SINK_H

isEventGenerator()

This function lets NaviTrack know whether the node is event generating node.

It returns 1, if the node has event generator.

onEventGenerated()

This is an event handler for generated event.

Source class (MyTutorialSource.h, MyTutorialSource.cxx)

This class is a Source node itself. The following example class contains only essential functions for a Source node.

MyTutorialSource.h:

#ifndef __MY_TUTORIAL_SOURCE_H__
#define __MY_TUTORIAL_SOURCE_H__

#include <OpenTracker/OpenTracker.h>
#include <string>

namespace ot {

  class MyTutorialSource : public Node
  {
  private:
    
  public:
    
    std::string StationName;
    
  public:
    MyTutorialSource(std::string stationName) {};
    virtual int isEventGenerator() {return 1;};
    int changed;
    
    Event event;
  };
    
} // end of namespace ot

#endif // __MYTUTORIAL_SOURCE_H__

isEventGenerator()

This is same as isEventGenerator() in Sink class.


Classes for module "MyTutorialThreadModule" (w/ thread)

Module class (MyTutorialThreadModule.h, MyTutorialThreadModule.cxx)

In a thread module, the only difference from a normal module is a module class, where a thread is implemented.

MyTutorialThreadModule.h


Sink class (MyTutorialThreadSink.h, MyTutorialThreadSink.cxx)

Source class (MyTutorialThreadSource.h, MyTutorialThreadSource.cxx)

Go back to Creating module.