restorecommunication.cpp
Go to the documentation of this file.
1 
2 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
3 // All rights reserved.
4 //
5 // Redistribution and use in source and binary forms, with or without modification,
6 // are permitted provided that the following conditions are met:
7 //
8 // 1. Redistributions of source code must retain the above copyright notice,
9 // this list of conditions, and the following disclaimer.
10 //
11 // 2. Redistributions in binary form must reproduce the above copyright notice,
12 // this list of conditions, and the following disclaimer in the documentation
13 // and/or other materials provided with the distribution.
14 //
15 // 3. Neither the names of the copyright holders nor the names of their contributors
16 // may be used to endorse or promote products derived from this software without
17 // specific prior written permission.
18 //
19 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
20 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
21 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
22 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
24 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
26 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
28 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
29 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
30 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
31 //
32 
33 
34 // Copyright (c) 2003-2021 Xsens Technologies B.V. or subsidiaries worldwide.
35 // All rights reserved.
36 //
37 // Redistribution and use in source and binary forms, with or without modification,
38 // are permitted provided that the following conditions are met:
39 //
40 // 1. Redistributions of source code must retain the above copyright notice,
41 // this list of conditions, and the following disclaimer.
42 //
43 // 2. Redistributions in binary form must reproduce the above copyright notice,
44 // this list of conditions, and the following disclaimer in the documentation
45 // and/or other materials provided with the distribution.
46 //
47 // 3. Neither the names of the copyright holders nor the names of their contributors
48 // may be used to endorse or promote products derived from this software without
49 // specific prior written permission.
50 //
51 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
52 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
53 // MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
54 // THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
55 // SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
56 // OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57 // HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY OR
58 // TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
59 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.THE LAWS OF THE NETHERLANDS
60 // SHALL BE EXCLUSIVELY APPLICABLE AND ANY DISPUTES SHALL BE FINALLY SETTLED UNDER THE RULES
61 // OF ARBITRATION OF THE INTERNATIONAL CHAMBER OF COMMERCE IN THE HAGUE BY ONE OR MORE
62 // ARBITRATORS APPOINTED IN ACCORDANCE WITH SAID RULES.
63 //
64 
65 #include "restorecommunication.h"
66 #include "xscontrol_def.h"
67 #include "serialinterface.h"
68 #include <xstypes/xsportinfo.h>
69 
70 
82  : m_control(control)
83  , m_serialInterface(new SerialInterface())
84  , m_isRestoring(false)
85 {
86 }
87 
92 {
93  try
94  {
95  stop();
96  }
97  catch (...)
98  {
99  }
100  delete m_serialInterface;
101 }
102 
109 {
110  m_portName = portName;
111  XsPortInfo portInfo(portName, XBR_115k2);
112  XsResultValue result;
113  if (!m_isRestoring)
114  {
115  result = openComPort(portInfo);
116  if (result == XRV_OK)
117  {
118  if (!startThread("RestoreCommunication"))
119  result = XRV_ERROR;
120  else
121  m_isRestoring = true;
122  }
123  }
124  else
125  {
126  result = XRV_ERROR;
127  stop();
128  }
129  return result;
130 }
131 
136 {
137  m_isRestoring = false;
139 }
140 
145 {
147 
148  bool success = false;
149  const size_t readDataSize = 4;
150  unsigned char resetByte = (unsigned char)0xDE; // reset byte
151  unsigned char preambleBuf[1] = { 0 };
152  unsigned char readBuf[readDataSize] = { 0, 0, 0, 0 };
153 
154 
155  XsByteArray resetByteArray(1, &resetByte);
156  XsByteArray preambleArray(1, &preambleBuf[0]);
157  XsByteArray readArray(readDataSize, &readBuf[0]);
158 
159  while (!success && m_isRestoring)
160  {
161  XsResultValue writeResult = m_serialInterface->writeData(resetByteArray);
162  XsResultValue readResult = m_serialInterface->readData(1, preambleArray);
163 
164  if (writeResult == XRV_OK && readResult == XRV_OK)
165  {
166  if (preambleArray[0] == XS_PREAMBLE)
167  success = true;
168  }
169 
170  XsTime::udelay(100);
171  }
172 
173  bool stoppedByUser = !success;
174 
175  if (!stoppedByUser)
176  {
178  m_serialInterface->readData((XsFilePos) readDataSize, readArray);
179  bool restoreOk = (preambleArray[0] == XS_PREAMBLE && readArray[0] == 0xFF && readArray[1] == 0x3E && readArray[2] == 0x00 && readArray[3] == 0xC3);
180 
183  }
184  else
186 
187  m_isRestoring = false;
188  stopThread();
189  return 0;
190 }
191 
198 {
199  XsResultValue result = m_serialInterface->open(portInfo);
200  if (result == XRV_ALREADYOPEN)
201  {
202  result = m_serialInterface->close();
203  if (result == XRV_OK)
204  result = m_serialInterface->open(portInfo);
205  }
206  return result;
207 }
restorecommunication.h
RestoreCommunication::innerFunction
int32_t innerFunction(void) override
Inner function for an execution on a thread.
Definition: restorecommunication.cpp:144
RestoreCommunication::stop
void stop()
Stops the restore communication procedure.
Definition: restorecommunication.cpp:135
XsByteArray
A list of uint8_t values.
XBR_115k2
XBR_115k2
115k2 (115200 bps)
Definition: xsbaudrate.h:136
SerialInterface::setTimeout
XsResultValue setTimeout(uint32_t ms)
Set the default timeout value to use in blocking operations.
Definition: serialinterface.cpp:697
SerialInterface::close
XsResultValue close(void) override
Close the serial communication port.
Definition: serialinterface.cpp:128
RestoreCommunication::openComPort
XsResultValue openComPort(const XsPortInfo &portInfo)
Tries to open COM port.
Definition: restorecommunication.cpp:197
RestoreCommunication::m_serialInterface
SerialInterface * m_serialInterface
Definition: restorecommunication.h:91
XsControl
High level Motion Tracker (MT) management class.
Definition: xscontrol_def.h:131
XRV_ALREADYOPEN
@ XRV_ALREADYOPEN
269: An I/O device is already opened with this object
Definition: xsresultvalue.h:139
xsportinfo.h
XRV_ERROR
@ XRV_ERROR
256: A generic error occurred
Definition: xsresultvalue.h:126
SerialInterface::readData
XsResultValue readData(XsFilePos maxLength, XsByteArray &data) override
Read data from the serial port and put it into the data buffer.
Definition: serialinterface.cpp:573
XRV_OK
@ XRV_OK
0: Operation was performed successfully
Definition: xsresultvalue.h:85
xsens::StandardThread::startThread
bool startThread(const char *name=NULL)
Starts the thread.
Definition: threading.cpp:281
XsResultValue
XsResultValue
Xsens result values.
Definition: xsresultvalue.h:82
xscontrol_def.h
RestoreCommunication::m_isRestoring
volatile std::atomic< bool > m_isRestoring
Definition: restorecommunication.h:94
RestoreCommunication::start
XsResultValue start(const XsString &portName)
Starts the restore communication procedure.
Definition: restorecommunication.cpp:108
XsPortInfo
Contains a descriptor for opening a communication port to an Xsens device.
Definition: xsportinfo.h:128
XRV_RESTORE_COMMUNICATION_STOPPED
@ XRV_RESTORE_COMMUNICATION_STOPPED
319: Restore communication was stopped
Definition: xsresultvalue.h:195
CallbackManagerXda::onRestoreCommunication
void onRestoreCommunication(const XsString *portName, XsResultValue result) override
The Xscallback::onRestoreCommunication callback forwarding function.
Definition: callbackmanagerxda.cpp:637
serialinterface.h
SerialInterface::open
XsResultValue open(const XsPortInfo &portInfo, XsFilePos readBufSize=XS_DEFAULT_READ_BUFFER_SIZE, XsFilePos writeBufSize=XS_DEFAULT_WRITE_BUFFER_SIZE, PortOptions options=PO_XsensDefaults) override
Open a communication channel to the given port info.
Definition: serialinterface.cpp:342
RestoreCommunication::RestoreCommunication
RestoreCommunication(XsControl *control)
Constructor.
Definition: restorecommunication.cpp:81
RestoreCommunication::m_control
XsControl * m_control
Definition: restorecommunication.h:90
XRV_RESTORE_COMMUNICATION_FAILED
@ XRV_RESTORE_COMMUNICATION_FAILED
318: Restore communication failed
Definition: xsresultvalue.h:194
SerialInterface
The low-level serial communication class.
Definition: serialinterface.h:82
SerialInterface::writeData
XsResultValue writeData(const XsByteArray &data, XsFilePos *written=0) override
Write the data contained in data to the device.
Definition: serialinterface.cpp:782
xsens::StandardThread::stopThread
void stopThread(void) noexcept
Tells the thread to stop and waits for it to end.
Definition: threading.cpp:334
int32_t
signed int int32_t
Definition: pstdint.h:515
RestoreCommunication::~RestoreCommunication
~RestoreCommunication()
Destructor.
Definition: restorecommunication.cpp:91
XS_PREAMBLE
#define XS_PREAMBLE
Definition: xsmessage.h:144
XsFilePos
int64_t XsFilePos
The type that is used for positioning inside a file.
Definition: xsfilepos.h:102
XsString
A 0-terminated managed string of characters.
RestoreCommunication::m_portName
XsString m_portName
Definition: restorecommunication.h:92


xsens_mti_driver
Author(s):
autogenerated on Sun Sep 3 2023 02:43:20