00001
00002 #ifndef INCLUDED_CreateDriver_h_
00003 #define INCLUDED_CreateDriver_h_
00004
00005 #include "local/DeviceDriver.h"
00006 #include "local/MotionHook.h"
00007 #include "local/DataSource.h"
00008 #include "local/CommPort.h"
00009 #include "Shared/plist.h"
00010 #include <iostream>
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064 typedef struct CreateStatus_t{
00065 unsigned char bumpsWheelDrops;
00066 unsigned char wall;
00067 unsigned char cliffLeft;
00068 unsigned char cliffFrontLeft;
00069 unsigned char cliffFrontRight;
00070 unsigned char cliffRight;
00071 unsigned char virtualWall;
00072 unsigned char overcurrents;
00073 unsigned char ir;
00074 unsigned char buttons;
00075 short distance;
00076 short angle;
00077 unsigned char chargingState;
00078 short voltage;
00079 short current;
00080 unsigned char batteryTemperature;
00081 short batteryCharge;
00082 short batteryCapacity;
00083 short wallSignal;
00084 short cliffLeftSignal;
00085 short cliffFrontLeftSignal;
00086 short cliffFrontRightSignal;
00087 short cliffRightSignal;
00088 unsigned char userDigitalInputs;
00089 short userAnalogInput;
00090 unsigned char chargingSourcesAvailable;
00091 unsigned char oiMode;
00092 unsigned char songNumber;
00093 unsigned char songPlay;
00094 short velocity;
00095 short radius;
00096 short rightVelocity;
00097 short leftVelocity;
00098 } CreateStatus;
00099
00100
00101 class CreateDriver : public virtual DeviceDriver, public MotionHook, public DataSource, public virtual plist::PrimitiveListener {
00102 public:
00103 explicit CreateDriver(const std::string& name)
00104 : DeviceDriver(autoRegisterCreateDriver,name), MotionHook(), DataSource(),
00105 commName(), motionActive(false), sensorsActive(false), lastSensor(), frameNumber(0), createStatus()
00106 {
00107 addEntry("CommPort",commName,"The name of the comm port where output will be sent");
00108 }
00109 virtual ~CreateDriver() {}
00110
00111 virtual std::string getClassName() const { return autoRegisterCreateDriver; }
00112
00113 virtual MotionHook* getMotionSink() { return dynamic_cast<MotionHook*>(this); }
00114 virtual void getSensorSources(std::map<std::string,DataSource*>& sources) {
00115 sources.clear();
00116 sources["Sensors"]=dynamic_cast<DataSource*>(this);
00117 }
00118
00119 virtual void motionStarting();
00120 virtual void motionStopping();
00121 virtual void motionCheck(const float outputs[][NumOutputs]);
00122
00123 virtual unsigned int nextTimestamp();
00124 virtual const std::string& nextName() { return instanceName; }
00125 virtual unsigned int getData(const char *& payload, unsigned int& payloadSize, unsigned int& timestamp, std::string& name);
00126 virtual void setDataSourceThread(LoadDataThread* th);
00127
00128 virtual void plistValueChanged(const plist::PrimitiveBase& pl);
00129
00130 plist::Primitive<std::string> commName;
00131
00132 protected:
00133 virtual void connect();
00134
00135 virtual unsigned char readChar(std::istream &is);
00136 virtual short readShort(std::istream &is);
00137 virtual int readPacket(std::istream &is, const char &type);
00138
00139
00140 void provideOutput(unsigned int idx) { if(idx<NumOutputs) providingOutput(idx); }
00141
00142 void ignoreOutput(unsigned int idx) { if(idx<NumOutputs) ignoringOutput(idx); }
00143
00144
00145 virtual float getAnalog(unsigned int inputIdx, unsigned char s);
00146
00147 virtual float getDigital(unsigned int inputIdx, unsigned char cur, unsigned char latch);
00148
00149 bool motionActive;
00150 bool sensorsActive;
00151 std::string lastSensor;
00152 unsigned int frameNumber;
00153
00154 private:
00155
00156 static const std::string autoRegisterCreateDriver;
00157
00158 CreateStatus createStatus;
00159 };
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 #endif