MNE-CPP  beta 1.0
serialport.cpp
Go to the documentation of this file.
1 //=============================================================================================================
37 //*************************************************************************************************************
38 //=============================================================================================================
39 // INCLUDES
40 //=============================================================================================================
41 
42 #include "serialport.h"
43 
44 #include <iostream>
45 
46 
47 //*************************************************************************************************************
48 //=============================================================================================================
49 // QT INCLUDES
50 //=============================================================================================================
51 
52 #include <QMessageBox>
53 #include <QDebug>
54 #include <QSerialPort>
55 #include <QSerialPortInfo>
56 
57 
58 //*************************************************************************************************************
59 //=============================================================================================================
60 // USED NAMESPACES
61 //=============================================================================================================
62 
63 using namespace TriggerControlPlugin;
64 
65 
66 //*************************************************************************************************************
67 //=============================================================================================================
68 // DEFINE MEMBER METHODS
69 //=============================================================================================================
70 
72 {
73  initSettings();
74  initPort();
75 
76  m_digchannel.resize(22);
77  for (int i = 0; i < m_digchannel.size(); i++)
78  {
79  m_digchannel.replace(i,0);
80  }
81 
82  m_motor = 1;
83  m_analval = 0;
84 
85  m_InAnChannelVal.resize(2);
86  for (int i = 0; i < m_InAnChannelVal.size(); i++)
87  {
88  m_InAnChannelVal.replace(i,0);
89  }
90 
91  m_InActiveDig.resize(4);
92  for (int i = 0; i < m_InActiveDig.size(); i++)
93  {
94  m_InActiveDig.replace(i,0);
95  }
96 
97  m_wiredChannel = 0;
98 
99  connect(&m_qSerialPort, &QSerialPort::readyRead, this, &SerialPort::readData);
100 
101 }
102 
103 
104 
105 //*************************************************************************************************************
106 
108 {
109 
110 }
111 
112 
113 //*************************************************************************************************************
114 
116 {
117  m_qSerialPort.close();
118  std::cout << "Port closed" << std::endl;
119 }
120 
121 //*************************************************************************************************************
122 
123 void SerialPort::decodeana(QByteArray &t_incomingArray)
124 {
125 
126  int AnChannel=0;
127  int AnValue=0;
128 
129  t_incomingArray[0]=t_incomingArray[0] << 2; // left shift to pop the type info (11)
130 
131  char cVal = t_incomingArray[0];
132  void* voidVal = (void*)&cVal;
133  unsigned char* ucVal = (unsigned char*)voidVal;
134 
135 
136 // decode channel
137  if (*ucVal== 0x00) {AnChannel=1;}
138  else if (*ucVal==0x10) {AnChannel=2;}
139  else if (*ucVal==0x20) {AnChannel=3;}
140  else if (*ucVal==0x40) {AnChannel=4;}
141  else if (*ucVal==0x80) {AnChannel=5;}
142  else if (*ucVal==0x30) {AnChannel=6;}
143  else if (*ucVal==0x50) {AnChannel=7;}
144  else if (*ucVal==0x90) {AnChannel=8;}
145  else if (*ucVal==0x60) {AnChannel=9;}
146  else if (*ucVal==0xA0) {AnChannel=10;}
147  else if (*ucVal==0xC0) {AnChannel=11;}
148  else if (*ucVal==0x70) {AnChannel=12;}
149  else if (*ucVal==0xB0) {AnChannel=13;}
150  else if (*ucVal==0xD0) {AnChannel=14;}
151  else if (*ucVal==0xE0) {AnChannel=15;}
152  else if (*ucVal==0xF0) {AnChannel=16;}
153  else {std::cout << "Error during analog channel selection" << std::endl;}
154 
155 
156 
158 // if (t_incomingArray.at(0) == 0x00) {AnChannel=1;}
159 // else if (t_incomingArray.at(0)==0x10) {AnChannel=2;}
160 // else if (t_incomingArray.at(0)==0x20) {AnChannel=3;}
161 // else if (t_incomingArray.at(0)==0x40) {AnChannel=4;}
162 // else if (t_incomingArray.at(0)==0x80) {AnChannel=5;}
163 // else if (t_incomingArray.at(0)==0x30) {AnChannel=6;}
164 // else if (t_incomingArray.at(0)==0x50) {AnChannel=7;}
165 // else if (t_incomingArray.at(0)==0x90) {AnChannel=8;}
166 // else if (t_incomingArray.at(0)==0x60) {AnChannel=9;}
167 // else if (t_incomingArray.at(0)==0xA0) {AnChannel=10;}
168 // else if (t_incomingArray.at(0)==0xC0) {AnChannel=11;}
169 // else if (t_incomingArray.at(0)==0x70) {AnChannel=12;}
170 // else if (t_incomingArray.at(0)==0xB0) {AnChannel=13;}
171 // else if (t_incomingArray.at(0)==0xD0) {AnChannel=14;}
172 // else if (t_incomingArray.at(0)==0xE0) {AnChannel=15;}
173 // else if (t_incomingArray.at(0)==0xF0) {AnChannel=16;}
174 // else {std::cout << "Error during analog channel selection" << std::endl;}
175 
176 
177 
178 // decode channel value
179  t_incomingArray[1]=t_incomingArray[1] >> 2;
180  t_incomingArray[2]=t_incomingArray[2] >> 2;
181  t_incomingArray[3]=t_incomingArray[3] >> 2;
182 
183  if ((t_incomingArray[1]&0x08) == 0x08) {AnValue=AnValue+32768;} // 0000 1000
184  if ((t_incomingArray[1]&0x04) == 0x04) {AnValue=AnValue+16384;} // 0000 0100
185  if ((t_incomingArray[1]&0x02) == 0x02) {AnValue=AnValue+8192;} // 0000 0010
186  if ((t_incomingArray[1]&0x01) == 0x01) {AnValue=AnValue+4096;} // 0000 0001
187  if ((t_incomingArray[2]&0x20) == 0x20) {AnValue=AnValue+2048;} // 0010 0000
188  if ((t_incomingArray[2]&0x10) == 0x10) {AnValue=AnValue+1024;} // 0001 0000
189  if ((t_incomingArray[2]&0x08) == 0x08) {AnValue=AnValue+512;} // 0000 1000
190  if ((t_incomingArray[2]&0x04) == 0x04) {AnValue=AnValue+256;} // 0000 0100
191  if ((t_incomingArray[2]&0x02) == 0x02) {AnValue=AnValue+128;} // 0000 0010
192  if ((t_incomingArray[2]&0x01) == 0x01) {AnValue=AnValue+64;}
193  if ((t_incomingArray[3]&0x20) == 0x20) {AnValue=AnValue+32;}
194  if ((t_incomingArray[3]&0x10) == 0x10) {AnValue=AnValue+16;}
195  if ((t_incomingArray[3]&0x08) == 0x08) {AnValue=AnValue+8;}
196  if ((t_incomingArray[3]&0x04) == 0x04) {AnValue=AnValue+4;}
197  if ((t_incomingArray[3]&0x02) == 0x02) {AnValue=AnValue+2;}
198  if ((t_incomingArray[3]&0x01) == 0x01) {AnValue=AnValue+1;}
199 
200  std::cout << "Analog channel: " << AnChannel << " | Value:" << AnValue << std::endl;
201 
202  m_InAnChannelVal[AnChannel-1] = AnValue;
203 
204 }
205 
206 //*************************************************************************************************************
207 
208 void SerialPort::decodedig(QByteArray &p_incomingArray)
209 {
210  std::cout << "Decode Digital" << std::endl;
211 
212 // decode channel 1-6
213 
214  if ((p_incomingArray.at(3)&0x04) == 0x04) m_InActiveDig[0] = 1; // 0000 0100
215  else m_InActiveDig[0] = 0;
216 
217  if ((p_incomingArray.at(3)&0x08) == 0x08) m_InActiveDig[1] = 1; // 0000 1000
218  else m_InActiveDig[1] = 0;
219 
220  if ((p_incomingArray.at(3)&0x10) == 0x10) m_InActiveDig[2] = 1; // 0001 0000
221  else m_InActiveDig[2] = 0;
222 
223  if ((p_incomingArray.at(3)&0x20) == 0x20) m_InActiveDig[3] = 1; // 0010 0000
224  else m_InActiveDig[3] = 0;
225 
226  for ( int i = 1; i<5;i++)
227  std::cout << "Channel " << i <<": " << m_InActiveDig[i-1] << std::endl;
228 }
229 
230 //*************************************************************************************************************
231 
233 {
234 
235 
236  m_data.clear();
237 
238 
239 //denote control bites
240  m_data[0] = m_data[0]|0x40;
241  m_data[1] = m_data[1]|0x01;
242  m_data[2] = m_data[2]|0x02;
243  m_data[3] = m_data[3]|0x03;
244 
245 
246 // Motorauswahl
247  //Channelkodierung
248  //1:0000 2:0001 3:0010 4:0100 5:1000 6:0011 7:0101 8:1001 9:0110 10:1010 11:1100 12:0111 13:1011 14:1101 15:1110 16:1111
249 
250  //m_data[0] = m_data[0]|0x04;
251 
252  if (m_motor == 1) {m_data[0] = m_data[0]|0x00;} // 0000 0000 1. Motor
253  else if (m_motor == 2){m_data[0] = m_data[0]|0x04;} // 0000 0100 2. Motor
254  else if (m_motor == 3){m_data[0] = m_data[0]|0x08;} // 0000 1000 3. Motor
255  else if (m_motor == 4){m_data[0] = m_data[0]|0x10;} // 0001 0000 4. Motor
256  else {std::cout << "Fehler bei Motorauswahl" << std::endl;}
257 
258 // Konvertierung analoger Wert
259 
260 
261  int i = 32768; //i=2^15
262  int j = 0; //Variable zur Kennzeichnung des entsprechenden Bytes in m_data
263  int k = 0; //Variable zur Positionierung des entsprechenden Bits
264  QByteArray posArray = 0; //Hilfsarray zum Ansprechen der Bits in m_data an der jeweiligen Position
265  posArray.resize(6);
266  posArray.clear();
267 
268  posArray [0]= posArray [0]|0x80;
269  posArray [1]= posArray [1]|0x40;
270  posArray [2]= posArray [2]|0x20;
271  posArray [3]= posArray [3]|0x10;
272  posArray [4]= posArray [4]|0x08;
273  posArray [5]= posArray [5]|0x04;
274 
275 
276 
277  while (i>=1) //Schleife zum Konvertieren des analogen Wertes
278  {
279  if (i>2048 && i<32769) {j=1; k=2;} else if (i>32 && i<2049) {j=2; k=0;} else {j=3;k=0;};
280  while (j==1)
281  {
282  if (m_analval/i >= 1){
283  m_data[j] = m_data[j]|posArray[k];
284  m_analval = m_analval-i;
285  i=i/2;}
286  else {i=i/2;}
287  if (i>2048 && i<32769) {j=1; k++;} else {j=0;}
288  }
289  while (j==2)
290  {
291  if (m_analval/i >= 1){
292  m_data[j] = m_data[j]|posArray[k];
293  m_analval = m_analval-i;
294  i=i/2;}
295  else {i=i/2;}
296  if (i>32 && i<2049) {j=2; k++;} else {j=0;}
297  }
298  while (j==3)
299  {
300  if (m_analval/i >= 1){
301  m_data[j] = m_data[j]|posArray[k];
302  m_analval = m_analval-i;
303  i=i/2;}
304  else {i=i/2;}
305  if (i>0 && i<33) {j=3; k++;} else {j=0;}
306  }
307  }
308 
309 
310 
311 }
312 
313 //*************************************************************************************************************
314 
316 {
317 
318  m_data.clear();
319 
320  //denote control bytes
321  m_data[0] = m_data[0]|0x00;
322  m_data[1] = m_data[1]|0x01;
323  m_data[2] = m_data[2]|0x02;
324  m_data[3] = m_data[3]|0x03;
325 
326 
327  // evaluate chosen digital channels
328  // 1 - 6
329 
330  if (m_digchannel.at(0) == 1) m_data[3] = m_data[3]|0x04; // 0000 0100
331  if (m_digchannel.at(1) == 1) m_data[3] = m_data[3]|0x08; // 0000 1000
332  if (m_digchannel.at(2) == 1) m_data[3] = m_data[3]|0x10; // 0001 0000
333  if (m_digchannel.at(3) == 1) m_data[3] = m_data[3]|0x20; // 0010 0000
334  if (m_digchannel.at(4) == 1) m_data[3] = m_data[3]|0x40; // 0100 0000
335  if (m_digchannel.at(5) == 1) m_data[3] = m_data[3]|0x80; // 1000 0000
336 
337  // 7 - 12
338  if (m_digchannel.at(6) == 1) m_data[2] = m_data[2]|0x04; // 0000 0100
339  if (m_digchannel.at(7) == 1) m_data[2] = m_data[2]|0x08; // 0000 1000
340  if (m_digchannel.at(8) == 1) m_data[2] = m_data[2]|0x10; // 0001 0000
341  if (m_digchannel.at(9) == 1) m_data[2] = m_data[2]|0x20; // 0010 0000
342  if (m_digchannel.at(10) == 1) m_data[2] = m_data[2]|0x40; // 0100 0000
343  if (m_digchannel.at(11) == 1) m_data[2] = m_data[2]|0x80; // 1000 0000
344 
345  // 13 - 18
346  if (m_digchannel.at(12) == 1) m_data[1] = m_data[1]|0x04; // 0000 0100
347  if (m_digchannel.at(13) == 1) m_data[1] = m_data[1]|0x08; // 0000 1000
348  if (m_digchannel.at(14) == 1) m_data[1] = m_data[1]|0x10; // 0001 0000
349  if (m_digchannel.at(15) == 1) m_data[1] = m_data[1]|0x20; // 0010 0000
350  if (m_digchannel.at(16) == 1) m_data[1] = m_data[1]|0x40; // 0100 0000
351  if (m_digchannel.at(17) == 1) m_data[1] = m_data[1]|0x80; // 1000 0000
352 
353  // 19 - 22
354  if (m_digchannel.at(18) == 1) m_data[0] = m_data[0]|0x04; // 0000 0100
355  if (m_digchannel.at(19) == 1) m_data[0] = m_data[0]|0x08; // 0000 1000
356  if (m_digchannel.at(20) == 1) m_data[0] = m_data[0]|0x10; // 0001 0000
357  if (m_digchannel.at(21) == 1) m_data[0] = m_data[0]|0x20; // 0010 0000
358 
359 
360 
361 
362 }
363 
364 //*************************************************************************************************************
366  {
367  if (m_retrievetyp == 0) // retrieve digital information
368  {
369  m_data.clear();
370 
371  //denote control bytes
372  m_data[0] = m_data[0]|0x80;
373  m_data[1] = m_data[1]|0x01;
374  m_data[2] = m_data[2]|0x02;
375  m_data[3] = m_data[3]|0x03;
376 
377 
378  }
379  else if(m_retrievetyp == 1) // retrieve analog information
380  {
381  m_data.clear();
382  //denote control bytes
383  m_data[0] = m_data[0]|0x90;
384  m_data[1] = m_data[1]|0x01;
385  m_data[2] = m_data[2]|0x02;
386  m_data[3] = m_data[3]|0x03;
387 
388  if (m_retrievechan == 1){m_data[1] = m_data[1]|0x00;} // 0000 0000 first analoge In-Channel
389  else if (m_retrievechan == 2){m_data[1] = m_data[1]|0x04;} // 0000 0100 second first analoge In-Channel
390 
391  else {std::cout << "Error while retrieving analog channel information" << std::endl;}
392  }
393  else std::cout << " Error while encoding retrieve data array" << std::endl;
394 
395  }
396 
397 
398 //*************************************************************************************************************
399 
401 {
402  m_currentSettings.name = "";
403  m_currentSettings.baudRate = QSerialPort::Baud115200;
404  m_currentSettings.stringBaudRate = "115200";
405  m_currentSettings.dataBits = QSerialPort::Data8;
406  m_currentSettings.stringDataBits = "8";
407  m_currentSettings.parity = QSerialPort::NoParity;
408  m_currentSettings.stringParity = "None";
409  m_currentSettings.stopBits = QSerialPort::OneStop;
410  m_currentSettings.stringStopBits = "1";
411  m_currentSettings.flowControl = QSerialPort::NoFlowControl;
412  m_currentSettings.stringFlowControl = "None";
413 }
414 
415 //*************************************************************************************************************
416 
418 {
419  QList<QSerialPortInfo> t_qListPortInfo = QSerialPortInfo::availablePorts();
420 
421  bool t_correctPort = false;
422 
423  for (int t_count = 0; t_count < t_qListPortInfo.size();t_count++)
424  {
425  if (t_qListPortInfo[t_count].description() == "Silicon Labs CP210x USB to UART Bridge")
426  {
427 
428  t_correctPort = true;
429  m_currentSettings.name = t_qListPortInfo[t_count].portName();
430  m_qSerialPort.setPortName( t_qListPortInfo[t_count].portName());
431  break;
432  }
433  }
434 
435  if(t_correctPort)
436  std::cout << "Correct port was found" << std::endl;
437  else
438  std::cout << "correct port was not found" << std::endl;
439 
440 }
441 
442 
443 //*************************************************************************************************************
445 {
446  QByteArray t_incomingArray = m_qSerialPort.readAll();
447 
448  if(((t_incomingArray[0]&0x03) == 0x00) && ((t_incomingArray[1]&0x03) == 0x01) && ((t_incomingArray[2]&0x03) == 0x02) && ((t_incomingArray[3]&0x03) == 0x03))
449  {
450  if ((t_incomingArray[0]&0xC0) == 0x00)
451  decodedig(t_incomingArray);
452 
453  else if ((t_incomingArray[0]&0xC0) == 0x40)
454  decodeana(t_incomingArray);
455 
456  else
457  std::cout << "Error while reading the data. Correct transfer protocol?" << std::endl;
458  }
459 
460 
461 }
462 
463 //*************************************************************************************************************
464 
466 {
467  bool success = false;
468 
469  // get current settings
470  m_qSerialPort.setPortName(m_currentSettings.name);
471 
472  if (m_qSerialPort.open(QIODevice::ReadWrite))
473  {
474  if (m_qSerialPort.setBaudRate(m_currentSettings.baudRate)
475  && m_qSerialPort.setDataBits(m_currentSettings.dataBits)
476  && m_qSerialPort.setParity(m_currentSettings.parity)
477  && m_qSerialPort.setStopBits(m_currentSettings.stopBits)
478  && m_qSerialPort.setFlowControl(m_currentSettings.flowControl))
479  {
480  std::cout << "Port opened, with:"
481  << "Name" << m_currentSettings.name.toLatin1().data()
482  << "BaudRat" << m_currentSettings.stringBaudRate.toLatin1().data()
483  << "Databits" << m_currentSettings.stringDataBits.toLatin1().data()
484  << "Parity" << m_currentSettings.stringParity.toLatin1().data()
485  << "FlowControl" << m_currentSettings.stringFlowControl.toLatin1().data() << std::endl;
486 // WARUM 3 MAL??
487  std::cout << "geöffnet, mit:"
488  << "Name" << m_currentSettings.name.toLatin1().data()
489  << "BaudRat" << m_currentSettings.stringBaudRate.toLatin1().data()
490  << "Databits" << m_currentSettings.stringDataBits.toLatin1().data()
491  << "Parity" << m_currentSettings.stringParity.toLatin1().data()
492  << "FlowControl" << m_currentSettings.stringFlowControl.toLatin1().data() << std::endl;
493  std::cout << "geöffnet, mit:"
494  << " Name: " << m_currentSettings.name.toLatin1().data()
495  << ", BaudRate: " << m_currentSettings.stringBaudRate.toLatin1().data()
496  << ", Databits: " << m_currentSettings.stringDataBits.toLatin1().data()
497  << ", Parity: " << m_currentSettings.stringParity.toLatin1().data()
498  << ", FlowControl: " << m_currentSettings.stringFlowControl.toLatin1().data() << std::endl;
499 
500  success = true;
501  }
502  else
503  { std::cout << "Port was not opened, configuration failed" << std::endl;
504  m_qSerialPort.close();
505 
506  success = false;
507  }
508 
509  }
510  else
511  {
512  std::cout << "Port could not be opened" << std::endl;
513 
514  success = false;
515  }
516 
517  return success;
518 }
519 
520 //*************************************************************************************************************
521 
522 void SerialPort::sendData(const QByteArray &data)
523 {
524  m_qSerialPort.write(data);
525 }
526 
527 
528 
529 
Contains the declaration of the SerialPort class.
void decodedig(QByteArray &t_incomingArray)
Definition: serialport.cpp:208
void decodeana(QByteArray &t_incomingArray)
Definition: serialport.cpp:123
void sendData(const QByteArray &data)
Definition: serialport.cpp:522