Basic Image AlgorithmS Library  2.8.0
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
DPPanTiltControl.cpp
1 #include "DPPanTiltControl.hh"
2 #include "Base/Common/W32Compat.hh"
3 #include "Base/Common/BIASpragma.hh"
4 #include <math.h>
5 #include <string.h>
6 #include <time.h>
7 #include <sstream>
8 
9 using namespace std;
10 using namespace BIAS;
11 
12 DPPanTiltControl::DPPanTiltControl()
13 {
14  COMstream_ = PORT_NOT_OPENED;
15  bDefaultOrientation_ = true;
16  maxSpeed_ = DPPTU_MAXSPEED;
17  panResolution_ = tiltResolution_ = DPPTU_DEF_RES;
18 }
19 
20 DPPanTiltControl::~DPPanTiltControl()
21 {
22 }
23 
24 int DPPanTiltControl::SetMode(int nMode)
25 {
26  char status;
27  int ret = 0;
28  set_mode(POSITION_LIMITS_MODE, ON_MODE);
29  if (nMode == SPEEDMODE)
30  {
31  status = set_mode(SPEED_CONTROL_MODE,PTU_PURE_VELOCITY_SPEED_CONTROL_MODE);
32  if (status == TRUE) {
33  std::cout << "Error : Set SPEED_CONTROL_MODE failed!" << std::endl;
34  ret = 1;
35  } else {
36  std::cout << "DPPanTiltControl : SPEED_CONTROL_MODE set" << std::endl;
37  }
38  }
39  else if(nMode == ABSOLUTEMODE)
40  {
41  status = set_mode(COMMAND_EXECUTION_MODE,EXECUTE_IMMEDIATELY);
42  if (status == TRUE) {
43  std::cout << "Error : Set COMMAND_EXECUTION_MODE/EXECUTE IMMEDIATELY failed!" << std::endl;
44  ret = 1;
45  } else {
46  std::cout << "DPPanTiltControl : COMMAND_EXECUTION_MODE/EXECUTE IMMEDIATELY set" << std::endl;
47  }
48  } else {
49  std::cout << "Error : Wrong mode set for DPPanTiltControl!" << endl;
50  }
51  return ret;
52 }
53 
54 bool DPPanTiltControl::ResetPanTiltUnit()
55 {
56  int steps[2];
57  steps[0] = 0;
58  steps[1] = 0;
59  bool bRet = false;
60  switch (reset_PTU_parser(5000))
61  {
62  case PTU_OK:
63  SetMode(SPEEDMODE);
64  set_desired(PAN,SPEED, (PTU_PARM_PTR *) &maxSpeed_, ABSOLUTE);
65  set_desired(TILT,SPEED, (PTU_PARM_PTR *) &maxSpeed_, ABSOLUTE);
66  await_completion();
67  SetMode(ABSOLUTEMODE);
68  set_desired(PAN, POSITION, (PTU_PARM_PTR *) &steps[0], ABSOLUTE);
69  set_desired(TILT, POSITION, (PTU_PARM_PTR *) &steps[1], ABSOLUTE);
70  await_completion();
71  bRet = true;
72  break;
73  case PTU_FIRMWARE_VERSION_TOO_LOW:
74  bRet = false;
75  return bRet;
76  case PTU_NOT_RESPONDING:
77  bRet = false;
78  return bRet;
79  }
80  return bRet;
81 }
82 
83 void DPPanTiltControl::StopPanTiltUnit()
84 {
85  int speed = 0;
86  set_desired(PAN,SPEED, (PTU_PARM_PTR *) &speed, ABSOLUTE);
87  set_desired(TILT,SPEED, (PTU_PARM_PTR *) &speed, ABSOLUTE);
88 }
89 
90 void DPPanTiltControl::AwaitCompletion()
91 {
92  await_completion();
93 }
94 
95 bool DPPanTiltControl::InitPanTiltUnit(int nPort, bool bUSB)
96 {
97  std::string portPrefix;
98 #ifdef WIN32
99  if (bUSB)
100  portPrefix = "USB";
101  else
102  portPrefix = "COM";
103 #else
104  if (bUSB)
105  portPrefix = "/dev/ttyUSB";
106  else
107  portPrefix = "/dev/ttyS";
108 #endif
109  char portName[32];
110  sprintf(portName, "%s%d", portPrefix.c_str(), nPort);
111  return InitPanTiltUnit(portName);
112 }
113 
114 bool DPPanTiltControl::InitPanTiltUnit(const char *portName)
115 {
116  //reset_ptu();
117  bool bRet = false;
118  std::cout << "DPPanTiltControl : Opening port " << portName << std::endl;
119  biasusleep(500);
120  COMstream_ = open_host_port((char*)portName);
121  if (COMstream_ == PORT_NOT_OPENED) {
122  return bRet;
123  }
124  set_mode(DEFAULTS, RESTORE_FACTORY_SETTINGS);
125  switch (reset_PTU_parser(5000))
126  {
127  case PTU_OK:
128  bRet = true;
129  break;
130  case PTU_FIRMWARE_VERSION_TOO_LOW:
131  std::cout << "Error : PTU firmware version is too low!" << std::endl;
132  bRet = false;
133  break;
134  case PTU_NOT_RESPONDING:
135  std::cout << "Error : PTU is not responding!" << std::endl;
136  bRet = false;
137  break;
138  }
139  if (bRet) {
140  char *fw = firmware_version();
141  char ok = firmware_version_OK();
142  bRet = (ok == TRUE);
143  if (!bRet) {
144  std::cout << "Error : PTU firmware version is not OK!" << std::endl;
145  }
146  }
147  if (!bRet) {
148  close_host_port(COMstream_);
149  } else {
150  double a,b;
151  QueryResolution(a,b,true);
152  }
153  return bRet;
154 }
155 
156 void DPPanTiltControl::ClosePanTiltUnit()
157 {
158  int nPanPos = 0;
159  int nTiltPos = 0;
160  set_desired(PAN,POSITION,(PTU_PARM_PTR *) &nPanPos, ABSOLUTE);
161  set_desired(TILT,POSITION,(PTU_PARM_PTR *) &nTiltPos, ABSOLUTE);
162  set_desired(PAN,SPEED,(PTU_PARM_PTR *) &nPanPos, ABSOLUTE);
163  set_desired(TILT,SPEED,(PTU_PARM_PTR *) &nTiltPos, ABSOLUTE);
164  await_completion();
165  close_host_port(COMstream_);
166 }
167 
168 char DPPanTiltControl::SetSpeed(int nPanSpeed, int nTiltSpeed)
169 {
170  char status;
171  status = set_desired(PAN,SPEED,(PTU_PARM_PTR *) &nPanSpeed, ABSOLUTE);
172  status = set_desired(TILT,SPEED,(PTU_PARM_PTR *) &nTiltSpeed, ABSOLUTE);
173  return status;
174 }
175 
176 void DPPanTiltControl::GetSpeed(long &panSpeed, long &tiltSpeed)
177 {
178  panSpeed = get_current(PAN, SPEED);
179  tiltSpeed = get_current(TILT, SPEED);
180 }
181 
182 char DPPanTiltControl::SetAcceleration(int nPanAcc, int nTiltAcc)
183 {
184  char status = set_desired(PAN,ACCELERATION,(PTU_PARM_PTR *) &nPanAcc, ABSOLUTE);
185  if(status == PTU_OK)
186  status = set_desired(TILT,ACCELERATION,(PTU_PARM_PTR *) &nTiltAcc, ABSOLUTE);
187  return status;
188 }
189 
190 void DPPanTiltControl::GetAcceleration(long &panAcc, long &tiltAcc)
191 {
192  panAcc = get_current(PAN, ACCELERATION);
193  tiltAcc = get_current(TILT, ACCELERATION);
194 }
195 
196 void DPPanTiltControl::MoveUp(int nValue)
197 {
198  if (!bDefaultOrientation_)
199  nValue = -nValue;
200  set_desired(TILT,POSITION,(PTU_PARM_PTR *) &nValue, RELATIVE);
201  await_completion();
202 }
203 
204 void DPPanTiltControl::MoveDown(int nValue)
205 {
206  if (bDefaultOrientation_)
207  nValue = -nValue;
208  set_desired(TILT,POSITION,(PTU_PARM_PTR *) &nValue, RELATIVE);
209  await_completion();
210 }
211 
212 void DPPanTiltControl::MoveLeft(int nValue)
213 {
214  if (!bDefaultOrientation_)
215  nValue = -nValue;
216  set_desired(PAN,POSITION,(PTU_PARM_PTR *) &nValue, RELATIVE);
217  await_completion();
218 }
219 
220 void DPPanTiltControl::MoveRight(int nValue)
221 {
222  if (bDefaultOrientation_)
223  nValue = -nValue;
224  set_desired(PAN,POSITION,(PTU_PARM_PTR *) &nValue, RELATIVE);
225  await_completion();
226 }
227 
228 void DPPanTiltControl::
229 GetCurrentPosition(long &lPanPos, long &lTiltPos)
230 {
231  lPanPos = get_current(PAN,POSITION);
232  lTiltPos = get_current(TILT,POSITION);
233 }
234 
235 void DPPanTiltControl::
236 GetCurrentPositionDegrees(double &dPanDeg, double &dTiltDeg)
237 {
238  dPanDeg = get_current(PAN,POSITION) * panResolution_;
239  dTiltDeg = get_current(TILT,POSITION) * tiltResolution_;
240 }
241 
242 void DPPanTiltControl::
243 GetCurrentPositionRadians(double &dPanRad, double &dTiltRad)
244 {
245  dPanRad = get_current(PAN,POSITION) * panResolution_ * M_PI / 180.0;
246  dTiltRad = get_current(TILT,POSITION) * tiltResolution_ * M_PI / 180.0;
247 }
248 
249 void DPPanTiltControl::
250 SetPosition(int nPanPos, int nTiltPos, bool bWaitComplete)
251 {
252  char status = set_desired(PAN,POSITION,(PTU_PARM_PTR *) &nPanPos, ABSOLUTE);
253  if (status != PTU_OK)
254  std::cout << "DPPanTiltControl : Setting pan position failed!" << std::endl;
255 
256  status = set_desired(TILT,POSITION,(PTU_PARM_PTR *) &nTiltPos, ABSOLUTE);
257  if (status != PTU_OK)
258  std::cout << "DPPanTiltControl : Setting tilt position failed!" << std::endl;
259 
260  if (bWaitComplete)
261  await_completion();
262 }
263 
264 void DPPanTiltControl::SendRawCommand(string cmd)
265 {
266  SerialStringOut(COMstream_, (unsigned char*) cmd.c_str());
267 }
268 
269 int DPPanTiltControl::ReadRawLine(string &cmd)
270 {
271  char result[256];
272  int len = 0;
273  ReadSerialLine(COMstream_, (unsigned char*)result, 1, &len);
274  cmd = string(result, len);
275  return len;
276 }
277 
278 int DPPanTiltControl::
279 SetMotorStepping(int panStepping, int tiltStepping)
280 {
281  int ret = 0;
282  std::string command = "";
283  string s;
284  SendRawCommand("PR\n");
285  ReadRawLine(s);
286  ReadRawLine(s);
287  switch (panStepping) {
288  case AUTO:
289  if (s.find("A")!=string::npos) {
290  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
291  panStepping = -1;
292  } else {
293  command="WPA\n";
294  }
295  break;
296  case FULL:
297  if (s.find("F")!=string::npos) {
298  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
299  panStepping = -1;
300  } else {
301  command="WPF\n";
302  }
303  break;
304  case HALF:
305  if (s.find("H")!=string::npos) {
306  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
307  panStepping = -1;
308  } else {
309  command="WPH\n";
310  }
311  break;
312  case QUARTER:
313  if (s.find("Q")!=string::npos) {
314  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
315  panStepping = -1;
316  } else {
317  command="WPQ\n";
318  }
319  break;
320  case EIGHTH:
321  if (s.find("E")!=string::npos) {
322  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
323  panStepping = -1;
324  } else {
325  ret = -1;
326  command="WPE\n";
327  }
328  break;
329  default:
330  ret = -1;
331  break;
332  }
333  if (ret != 0)
334  return ret;
335 
336  if (panStepping != -1)
337  {
338  SendRawCommand(command);
339  // TODO When switching stepping mode, pan tilt recalibrates.
340  // "Await completion" does not work here. Wait until finished.
341  while (true) {
342  if (ReadRawLine(s) != 0) {
343  std::cout << "DPPanTiltControl : Read " << s << std::endl;
344  if (s.find("*") != string::npos) {
345  break;
346  }
347  }
348  std::cout << "DPPanTiltControl : Sleeping for 1 second" << std::endl;
349  biassleep(1);
350  }
351  }
352 
353  SendRawCommand("TR\n");
354  ReadRawLine(s);
355  ReadRawLine(s);
356  switch (tiltStepping) {
357  case AUTO:
358  if (s.find("A")!=string::npos) {
359  std::cout << "DPPanTiltControl : Tilt stepping is already set!" << std::endl;
360  tiltStepping = -1;
361  } else {
362  command="WTA\n";
363  }
364  break;
365  case FULL:
366  if (s.find("F")!=string::npos) {
367  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
368  tiltStepping = -1;
369  } else {
370  command="WTF\n";
371  }
372  break;
373  case HALF:
374  if (s.find("H")!=string::npos) {
375  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
376  tiltStepping = -1;
377  } else {
378  command="WTH\n";
379  }
380  break;
381  case QUARTER:
382  if (s.find("Q")!=string::npos) {
383  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
384  tiltStepping = -1;
385  } else {
386  command="WTQ\n";
387  }
388  break;
389  case EIGHTH:
390  if (s.find("E")!=string::npos) {
391  std::cout << "DPPanTiltControl : Pan stepping is already set!" << std::endl;
392  tiltStepping = -1;
393  } else {
394  command="WTE\n";
395  }
396  break;
397  default:
398  ret = -1;
399  break;
400 
401  }
402  if (ret != 0)
403  return ret;
404 
405  if (tiltStepping != -1)
406  {
407  SendRawCommand(command);
408  // TODO See above!
409  while (true)
410  {
411  if (ReadRawLine(s) != 0) {
412  std::cout << "DPPanTiltControl : Read " << s << std::endl;
413  if (s.find("*") != string::npos) {
414  break;
415  }
416  }
417  std::cout << "DPPanTiltControl : Sleeping for 1 second" << std::endl;
418  biassleep(1);
419  }
420  }
421 
422  double a, b;
423  std::cout << "DPPanTiltControl : Sleeping for 1 second" << std::endl;
424  biassleep(1);
425  QueryResolution(a, b, true);
426  return ret;
427 }
428 
429 void DPPanTiltControl::
430 QueryResolution(double &panResolution, double &tiltResolution, bool updateInternal)
431 {
432  if (updateInternal) {
433  string s, tmp;
434  double argsec;
435  SendRawCommand("PR\n");
436  ReadRawLine(s); // this is the command
437  ReadRawLine(s); // this is the answer
438  stringstream ss1;
439  ss1 << s;
440  ss1 >> tmp;
441  ss1 >> argsec;
442  //std::cout << argsec << std::endl;
443  panResolution_ = argsec / 3600.0;
444  SendRawCommand("TR\n");
445  ReadRawLine(s); // this is the command
446  ReadRawLine(s); // this is the answer
447  stringstream ss2;
448  ss2 << s;
449  ss2 >> tmp;
450  ss2 >> argsec;
451  //std::cout << argsec << std::endl;
452  tiltResolution_ = argsec / 3600.0;
453  }
454  panResolution = panResolution_;
455  tiltResolution = tiltResolution_;
456 }