00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _ROBOT_AGGREGATECONTROLINTERFACE_
00026 #define _ROBOT_AGGREGATECONTROLINTERFACE_
00027
00028 #include <robot/robot>
00029 #include <robot/ControlInterface>
00030
00031
00032 namespace robot {
00033
00034
00035
00036
00037
00038 class AggregateControlInterface : public ControlInterface
00039 {
00040 public:
00041 AggregateControlInterface(const String& name, const String& type,
00042 array<ref<ControlInterface> > interfaces);
00043 AggregateControlInterface(const String& name, const String& type,
00044 ref<ControlInterface> interface1, ref<ControlInterface> interface2);
00045 AggregateControlInterface(const AggregateControlInterface& aci);
00046
00047 virtual String className() const { return String("AggregateControlInterface"); }
00048
00049 virtual Int inputSize() const
00050 { recomputeInputSize(); return numInputs; }
00051 virtual String inputName(Int i) const;
00052 virtual Real getInput(Int i) const;
00053 virtual const Vector& getInputs() const;
00054
00055 virtual Int outputSize() const
00056 { recomputeOutputSize(); return numOutputs; }
00057 virtual String outputName(Int i) const;
00058 virtual void setOutput(Int i, Real value);
00059 virtual void setOutputs(const Vector& values);
00060
00061 protected:
00062 void recomputeInputSize() const;
00063 void recomputeOutputSize() const;
00064
00065 void inputIndex(Int aindex, Int& interfaceIndex, Int& index) const;
00066 void outputIndex(Int aindex, Int& interfaceIndex, Int& index) const;
00067
00068 array< ref<ControlInterface> > interfaces;
00069
00070 mutable Int numInputs, numOutputs;
00071 mutable Vector lastInputs;
00072 mutable array<Int> inputOffsets;
00073 mutable array<Int> outputOffsets;
00074 };
00075
00076
00077 }
00078
00079 #endif