AsebaMarxbot.h
Go to the documentation of this file.
00001 /*
00002         Aseba - an event-based framework for distributed robot control
00003         Copyright (C) 2007--2012:
00004                 Stephane Magnenat <stephane at magnenat dot net>
00005                 (http://stephane.magnenat.net)
00006                 and other contributors, see authors.txt for details
00007         
00008         This program is free software: you can redistribute it and/or modify
00009         it under the terms of the GNU Lesser General Public License as published
00010         by the Free Software Foundation, version 3 of the License.
00011         
00012         This program is distributed in the hope that it will be useful,
00013         but WITHOUT ANY WARRANTY; without even the implied warranty of
00014         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00015         GNU Lesser General Public License for more details.
00016         
00017         You should have received a copy of the GNU Lesser General Public License
00018         along with this program. If not, see <http://www.gnu.org/licenses/>.
00019 */
00020 
00021 #ifndef __ENKI_ASEBA_MARXBOT_H
00022 #define __ENKI_ASEBA_MARXBOT_H
00023 
00024 #include <enki/robots/marxbot/Marxbot.h>
00025 #ifndef ASEBA_ASSERT
00026 #define ASEBA_ASSERT
00027 #endif
00028 #include "../../vm/vm.h"
00029 #include "../../common/consts.h"
00030 #include <dashel/dashel.h>
00031 #include <deque>
00032 #include <string.h>
00033 
00038 namespace Enki
00039 {
00040         
00042 
00050         class AsebaMarxbot : public Marxbot, public Dashel::Hub
00051         {
00052         public:
00053                 struct Event
00054                 {
00055                         unsigned short source;
00056                         std::valarray<unsigned char> data;
00057                         
00058                         Event(unsigned short source, const uint8* data, uint16 length) :
00059                                 source(source),
00060                                 data(length)
00061                         {
00062                                 memcpy(&this->data[0], data, length);
00063                         }
00064                         
00065                         Event(Dashel::Stream* stream)
00066                         {
00067                                 uint16 temp;
00068                                 uint16 len;
00069                                 stream->read(&temp, 2);
00070                                 len = bswap16(temp);
00071                                 stream->read(&temp, 2);
00072                                 source = bswap16(temp);
00073                                 data.resize(len + 2);
00074                                 stream->read(&data[0], data.size());
00075                         }
00076                 };
00077                 
00078                 struct Module
00079                 {
00080                         Module();
00081                         
00082                         AsebaVMState vm;
00083                         std::valarray<unsigned short> bytecode;
00084                         std::valarray<signed short> stack;
00085                         //std::deque<Event> events;
00086                         
00087                         std::deque<Event> events;
00088                 };
00089                 
00090         private:
00091                 struct BaseVariables
00092                 {
00093                         sint16 id;
00094                         sint16 source;
00095                         sint16 args[32];
00096                 };
00097                 
00098                 struct MotorVariables
00099                 {
00100                         sint16 id;
00101                         sint16 source;
00102                         sint16 args[32];
00103                         sint16 speed;
00104                         sint16 odo[2];
00105                         sint16 user[220];
00106                 };
00107                 
00108                 struct ProximitySensorVariables
00109                 {
00110                         sint16 id;
00111                         sint16 source;
00112                         sint16 args[32];
00113                         sint16 bumpers[24];
00114                         sint16 ground[12];
00115                         sint16 user[188];
00116                 };
00117                 
00118                 struct DistanceSensorVariables
00119                 {
00120                         sint16 id;
00121                         sint16 source;
00122                         sint16 args[32];
00123                         sint16 distances[180];
00124                         sint16 user[44];
00125                 };
00126                 
00127                 MotorVariables leftMotorVariables;
00128                 MotorVariables rightMotorVariables;
00129                 ProximitySensorVariables proximitySensorVariables;
00130                 DistanceSensorVariables distanceSensorVariables;
00131                 
00132                 Module leftMotor;
00133                 Module rightMotor;
00134                 Module proximitySensors;
00135                 Module distanceSensors;
00136                 
00137         public:
00138                 // public because accessed from a glue function
00139                 std::vector<Module *> modules;
00140                 static int marxbotNumber;
00141                 
00142         public:
00143                 
00145                 AsebaMarxbot();
00147                 virtual ~AsebaMarxbot();
00149                 virtual void controlStep(double dt);
00150                 
00151                 virtual void connectionCreated(Dashel::Stream *stream);
00152                 virtual void incomingData(Dashel::Stream *stream);
00153                 virtual void connectionClosed(Dashel::Stream *stream, bool abnormal);
00154                 
00155                 // this must be public because of bindings to C functions
00156                 Dashel::Stream* stream;
00157         };
00158 
00159 }
00160 #endif
00161 


aseba
Author(s): Stéphane Magnenat
autogenerated on Thu Jan 2 2014 11:17:16