Wiselib
|
00001 // vim: set noexpandtab ts=4 sw=4: 00002 00003 #ifndef ROOMBA_IR_DISTANCE_SENSORS_H 00004 #define ROOMBA_IR_DISTANCE_SENSORS_H 00005 00006 template<typename OsModel_P, typename Roomba_P> 00007 class RoombaIRDistanceSensors { 00008 public: 00009 typedef OsModel_P OsModel; 00010 typedef Roomba_P Roomba; 00011 typedef typename Roomba::Math_P Math; 00012 typedef typename OsModel::size_t size_t; 00013 typedef uint16_t value_t; 00014 00015 typedef double angle_t; 00016 typedef double length_t; 00017 00018 RoombaIRDistanceSensors(Roomba& roomba) : roomba_(&roomba) { 00019 } 00020 00021 size_t number() { return 6; } 00022 00023 inline angle_t angle(size_t n) { 00024 // TODO: Measure actual values 00025 static const double a[6] = { 00026 Math::PI_2, Math::PI_3, Math::PI_6, 00027 -Math::PI_6, -Math::PI_3, -Math::PI_2 00028 }; 00029 return a[n]; 00030 } // angle() 00031 00032 size_t nearest(angle_t radians) { 00033 // TODO: Measure actual values 00034 double angle = Math::radians_to_degrees(radians); 00035 if(angle <= -75.0) { return 5; } 00036 else if(angle <= -45.0) { return 4; } 00037 else if(angle <= 0.0) { return 3; } 00038 else if(angle <= 45.0) { return 2; } 00039 else if(angle <= 75.0) { return 1; } 00040 else { return 0; } 00041 } 00042 00043 inline length_t distance(size_t n) { 00044 return 50.0; // TODO: Replace with actual value 00045 } 00046 00047 value_t operator()(size_t n) { 00048 typename Roomba::value_t data = (*roomba_)(); 00049 switch(n) { 00050 case 0: return data.light_bump_left_signal; 00051 case 1: return data.light_bump_front_left_signal; 00052 case 2: return data.light_bump_center_left_signal; 00053 case 3: return data.light_bump_center_right_signal; 00054 case 4: return data.light_bump_front_right_signal; 00055 case 5: return data.light_bump_right_signal; 00056 default: 00057 assert(false); 00058 } 00059 } // operator() 00060 00061 value_t max_value(size_t n) { return 4095; } // according to ROI spec 00062 00063 private: 00064 Roomba* roomba_; 00065 }; 00066 00067 #endif // ROOMBA_IR_DISTANCE_SENSORS_H 00068