[prev in list] [next in list] [prev in thread] [next in thread] 

List:       orocos-announce
Subject:    [Orocos] :: mykernel.loadController problem ::
From:       xorocox () wp ! pl (Patrycjusz Szczepaniak)
Date:       2004-11-01 19:34:00
Message-ID: 41868031.8060609 () wp ! pl
[Download RAW message or body]

Hello,

I am trying to write a simple kernel to understand how Orocos works. I 
wrote my generator, sensor and cotroller. Everything would be ok, but 
when I am trying to load anything (controller, sensor...) to a kernel I 
have lots of errors.

1) Could you tell me what is wrong?
2) Could you have a look at the code and tell me is there anything that 
I should write in a different way?

I am using Orocos from SVN.

Patrycjusz Szczepaniak

P.S. INPUT is supposed to generate inputs for MySensor.

["firstkernel.cxx" (text/x-c++src)]

#include <corelib/TaskPreemptible.hpp>


#include <control_kernel/StandardControlKernel.hpp>
#include <control_kernel/BaseComponents.hpp>
#include <control_kernel/ExtensionComposition.hpp>

#include <os/main.h>
#include <control_kernel/DataServer.hpp>
#include <control_kernel/PortInterfaces.hpp>

#include <corelib/TaskPreemptible.hpp>

using namespace std;
using namespace ORO_CoreLib;
using namespace ORO_ControlKernel;

// Simulating sensor
class INPUTtype{
  double internalVal;
public:
  INPUTtype():internalVal(0){};
  void Get(double in){
    in=internalVal++;
  }
} INPUT;


//typedef StardardControlKernel<KernelBaseFunction> MyKernel;


// Structures
struct MG_InputData
  : public ServedTypes<double>
{ 
  MG_InputData() { 
    this->insert( make_pair(0, "Number")); 
  } 
};

struct MG_SetPointData
  : public ServedTypes<double>
{
  MG_SetPointData() { 
    this->insert( make_pair(0, "Number")); 
  } 
};


/**********************************
***           Generator         ***
***********************************/
typedef Generator<
  Expects<MG_InputData>,
  Expects<NoModel>,
  Expects<NoCommand>,
  Writes<MG_SetPointData>
  //  ,MakeAspect<KernelBaseFunction>::Result
>GenType;

class MyGenerator
  :GenType
{


  double input;
  double setpoint;

  DataObjectInterface<double>* input_dobj;
  DataObjectInterface<double>* setpoint_dobj;
  
public:
  bool componentLoaded(){
    // Early resolving of write data objects
    if(! GenType::SetPoint::dObj()->Get("Number",setpoint_dobj) ){
      return false;
    }
    return true;
  }

  bool componentStartup(){ 
    // Early resolving of read data objects;
    if ( !GenType::Input::dObj()->Get("Number", input_dobj)){
      return false; 
    } 
    return true; 
  }

  MyGenerator(const std::string& name="MyGeneratorName")
  :GenType(name){}

  void pull(){
    input_dobj->Get(input);
  }

  void calculate(){
    input++;
  }
  void push(){
    setpoint_dobj->Set(setpoint);
  }

};

/******************************************
 ****    Controller ***********************
 *****************************************/

typedef Controller<
  Expects<NoInput>,
  Expects<NoModel>,
  Expects<MG_SetPointData>,
  Writes<NoOutput>
> ConType;

class MyController:ConType{
 
  double setpoint;
  
  DataObjectInterface<double>* setpoint_dobj;

public:
  MyController(const std::string& name="MyController")
    :ConType(name){}

  bool componentLoaded(){
    return true;
  }

  bool componentStartup(){
    if ( !ConType::SetPoint::dObj()->Get("Number",setpoint_dobj)){
      return false;
    }
    return true;
  }

  void pull(){
    setpoint_dobj->Get(setpoint);
  }

  void calcuate(){}
  void push(){}
};


/******************************************
 **********     Sensor     ***************
 *****************************************/
typedef Sensor<
  Writes<MG_InputData>
// ,  MakeAspect<KernelBaseFunction>::Result
> SenType;

class MySensor:SenType
{
  double input;

  DataObjectInterface<double>* input_dobj;

public:
  MySensor(const std::string& name="MySensorName")
    :SenType(name){}

  bool componentLoaded(){
    if ( !SenType::Input::dObj()->Get("Number", input_dobj)){
      return false; 
    } 
    return true;     
  }

  bool componentStartup(){return true;}

  void pull(){
    INPUT.Get(input);
  }

  void calculate(){}

  void push(){
    input_dobj->Set(input);
  }
};

/******************************************
 ****    Main    **************************
 *****************************************/

typedef StandardControlKernel<> myKernelType;

int ORO_main(int argc, const char **argv){

  myKernelType my_kernel("MyKernel");

  MyGenerator my_gen;
  MyController my_con;
  MySensor my_sen;

  // my_kernel.loadGenerator(&my_gen);
  // my_kernel.loadController(&my_con);
  // my_kernel.loadSensor(&my_sen);

  return 0;
}



["Makefile" (text/plain)]

CC = g++
LD = ld

OROFLAGS=-Wall

all: firstkernel
	@echo -e "\nType make all-lxrt if you want to compile for lxrt.\n"

all-lxrt: firstkernel-lxrt

firstkernel.o: firstkernel.cxx  orocos/include
	${CC} ${OROFLAGS} -c $< -o $@ -I orocos/include

firstkernel: firstkernel.o orocos/lib/libtarget.a
	${CC} -o $@ $@.o -L orocos/lib -ltarget -lm -lxerces-c -lpthread -lboost_signals

clean:
	rm -f *.o
	rm -f cartkernel-lxrt cartkernel


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic