00001 // 00002 // 00003 // Generated by StarUML(tm) C++ Add-In 00004 // 00005 // @ Project : 3D printer driver 00006 // @ File Name : Space_t.h 00007 // @ Date : 6.10.2009 00008 // @ Author : Darius Kocar xkocar00@stud.fit.vutbr.cz 00009 // 00010 // 00011 00015 #if !defined(_SPACE_T_H) 00016 #define _SPACE_T_H 00017 00018 #include <iostream> 00019 #include <string> 00020 00021 #include <boost/serialization/nvp.hpp> 00022 #include <boost/array.hpp> 00023 00024 #include "error.h" 00025 #include "axe.h" 00026 #include "motor.h" 00027 #include "motors.h" 00028 00032 template <int Dimension> 00033 class Space_t { 00034 public: 00036 Space_t(); 00037 00039 ~Space_t(); 00040 00044 class Point_t { 00045 public: 00049 const double & operator[](int position) const; 00050 00054 double & operator[](int position); 00055 00056 Point_t() {}; 00057 00060 Point_t(const boost::array<double, Dimension> &_data): data(_data){}; 00061 00066 Point_t(const double &a, const double &b, const double &c); 00067 00071 bool operator==(const Space_t<Dimension>::Point_t &b) const; 00072 00076 bool operator!=(const Space_t<Dimension>::Point_t &b) const; 00077 00078 private: 00079 boost::array<double, Dimension> data; 00080 }; 00081 00084 void setAbs(Point_t point); 00085 00088 void setRel(Point_t point); 00089 00091 void init(); 00092 00096 void setMotorId(const int &AxeId, const boost::uint_value_t<16>::least newId); 00097 00100 Point_t getMax() const; 00101 00104 Point_t getMin() const; 00105 00108 Point_t getAct() const; 00109 protected: 00110 Axe_t axe[Dimension]; 00111 00112 private: 00114 friend class boost::serialization::access; 00115 00119 template<class archive> 00120 void serialize(archive& ar, const unsigned int version); 00121 }; 00122 00123 00124 00125 template <int Dimension> 00126 bool Space_t<Dimension>::Point_t::operator==(const Space_t<Dimension>::Point_t &b) const { 00127 00128 bool equal = true; 00129 for (int i = 0; i < Dimension; ++i) { 00130 if (this->data[i] != b[i]) { 00131 equal = false; 00132 break; 00133 } 00134 } 00135 00136 return equal; 00137 } 00138 00139 00140 template <int Dimension> 00141 bool Space_t<Dimension>::Point_t::operator!=(const Space_t<Dimension>::Point_t &b) const { 00142 00143 return !(*this == b); 00144 } 00145 00146 00147 template <int Dimension> 00148 void Space_t<Dimension>::setAbs(Space_t<Dimension>::Point_t point) { 00149 Motors::allUnits(); 00150 Motors::disable(); 00151 00152 for (int i = 0; i < Dimension; ++i) 00153 this->axe[i].goAbs(point[i]); 00154 00155 Motors::allUnits(); 00156 Motors::run(); 00157 Motors::enable(); 00158 }; 00159 00160 00161 template <int Dimension> 00162 void Space_t<Dimension>::setRel(Space_t<Dimension>::Point_t point) { 00163 Motors::allUnits(); 00164 Motors::disable(); 00165 00166 for (int i = 0; i < Dimension; ++i) 00167 this->axe[i].goRel(point[i]); 00168 00169 Motors::allUnits(); 00170 Motors::run(); 00171 Motors::enable(); 00172 }; 00173 00174 template <int Dimension> 00175 Space_t<Dimension>::Space_t(void) { 00176 }; 00177 00178 template <int Dimension> 00179 Space_t<Dimension>::~Space_t() { 00180 }; 00181 00182 00183 00184 00185 template <int Dimension> 00186 const double & Space_t<Dimension>::Point_t::operator[](int position) const { 00187 return this->data[position]; 00188 }; 00189 00190 00191 template <int Dimension> 00192 double & Space_t<Dimension>::Point_t::operator[](int position) { 00193 return this->data[position]; 00194 }; 00195 00196 00197 template <int Dimension> 00198 template<class archive> 00199 void Space_t<Dimension>::serialize(archive& ar, const unsigned int version) 00200 { 00201 using boost::serialization::make_nvp; 00202 for (unsigned int i = 0; i < Dimension; i++) { 00203 ar & make_nvp("Axe", this->axe[i]); 00204 } 00205 }; 00206 00207 00208 template <int Dimension> 00209 void Space_t<Dimension>::init() { 00210 Motors::allUnits(); 00211 Motors::disable(); 00212 Motors::reset(); 00213 Motors::turnOn(7); // Vypnout motor 00214 00215 for (int i = 0; i < Dimension; ++i) 00216 this->axe[i].init(); 00217 00218 Motors::allUnits(); 00219 Motors::clear(7); // Zapnuti motoru 00220 Motors::enable(); 00221 Motors::upload(20); // Pozadavek na zaslani stavu jednotky. 00222 }; 00223 00224 template <int Dimension> 00225 void Space_t<Dimension>::setMotorId(const int &AxeId, const boost::uint_value_t<16>::least newId) { 00226 if (AxeId < 0 || AxeId > Dimension) 00227 throw motor_error() << what("Neexistujici dimenze."); 00228 this->axe[AxeId].setId(newId); 00229 }; 00230 00231 00232 template <int Dimension> 00233 typename Space_t<Dimension>::Point_t Space_t<Dimension>::getMax() const { 00234 Point_t point; 00235 for (int i = 0; i < Dimension; ++i) 00236 point[i] = this->axe[i].getMax(); 00237 00238 return point; 00239 }; 00240 00241 template <int Dimension> 00242 typename Space_t<Dimension>::Point_t Space_t<Dimension>::getMin() const { 00243 Point_t point; 00244 for (int i = 0; i < Dimension; ++i) 00245 point[i] = this->axe[i].getMin(); 00246 00247 return point; 00248 }; 00249 00250 00251 template <int Dimension> 00252 typename Space_t<Dimension>::Point_t Space_t<Dimension>::getAct() const { 00253 Point_t point; 00254 for (int i = 0; i < Dimension; ++i) 00255 point[i] = this->axe[i].getAct(); 00256 00257 return point; 00258 }; 00259 00260 #endif //_SPACE_T_H
1.6.1