annotate Serial.cpp @ 12:ac837fe1d590 default tip

Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
author Ideenmodellierer
date Mon, 12 Jan 2026 13:58:41 +0000
parents 9a3c1a6f9833
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
1 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
2 /// \file Serial.cpp
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
3 /// \brief RS232 serial i/o.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
4 /// \author JD Gascuel.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
5 ///
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
6 /// \copyright (c) 2011-2016 JD Gascuel. All rights reserved.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
7 /// $Id$
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
8 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
9 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
10 // BSD 2-Clause License:
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
11 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
12 // Redistribution and use in source and binary forms, with or without
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
13 // modification, are permitted provided that the following conditions
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
14 // are met:
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
15 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
16 // 1. Redistributions of source code must retain the above copyright notice,
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
17 // this list of conditions and the following disclaimer.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
18 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
19 // 2. Redistributions in binary form must reproduce the above copyright notice,
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
20 // this list of conditions and the following disclaimer in the documentation
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
21 // and/or other materials provided with the distribution.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
22 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
23 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
24 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
25 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
26 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
27 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
28 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
29 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
30 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
31 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
32 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
33 // THE POSSIBILITY OF SUCH DAMAGE.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
34 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
35 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
36
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
37 #include "Serial.h"
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
38
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
39 #include "Utils/Exception.h"
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
40 #include "Utils/Log.h"
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
41
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
42 #include <QString>
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
43
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
44 #ifdef Q_OS_LINUX
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
45 #include <termios.h>
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
46 #endif
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
47
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
48 #ifdef WIN32
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
49 #define S_WRITE(p, b, li, lo) WriteFile(p, b, li, &lo, NULL)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
50 #define S_READ(p, b, li, lo) ReadFile(p, b, li, &lo, NULL)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
51 #define S_LEN DWORD
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
52 #define S_FLUSH(p) FlushFileBuffers(p)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
53 #define S_PURGE(p) PurgeComm(p, PURGE_RXCLEAR | PURGE_TXCLEAR)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
54 #define S_CLOSE(p) CloseHandle(p)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
55 #else
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
56 #include <fcntl.h>
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
57 #include <sys/ioctl.h>
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
58 #include <termios.h>
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
59 #include <unistd.h>
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
60
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
61 #define INVALID_HANDLE_VALUE (-1)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
62 #define S_WRITE(p, b, li, lo) (lo = write(p, b, li))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
63 #define S_READ(p, b, li, lo) (lo = read(p, b, li))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
64 #define S_LEN ssize_t
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
65 #define S_FLUSH(p) tcdrain(p)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
66 #define S_PURGE(p) tcflush(p, TCIOFLUSH)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
67 #define S_CLOSE(p) ::close(p)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
68 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
69
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
70 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
71
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
72 Serial::~Serial() {}
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
73
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
74 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
75
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
76 void Serial::open(const QString &port, const QString &type)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
77 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
78 if (_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
79 return;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
80 LOG_TRACE("Open " << port << " ...");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
81
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
82 _hSerial = INVALID_HANDLE_VALUE;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
83
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
84 //------------------------------------------------------------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
85 // Sanity checks.
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
86 if (port.isEmpty())
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
87 LOG_THROW("Port is not defined.");
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
88 if (type.isEmpty())
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
89 LOG_THROW("Port type is not defined.");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
90
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
91 bool usbMode = type.contains("ostc2c", Qt::CaseInsensitive)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
92 || (type.contains("ostc3", Qt::CaseInsensitive)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
93 && !type.contains("ostc3p", Qt::CaseInsensitive))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
94 || type.contains("ostc_cr", Qt::CaseInsensitive);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
95 LOG_TRACE((usbMode ? "Fast USB" : "Slow Bluetooth") << " connection mode.");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
96
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
97 //------------------------------------------------------------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
98 #ifdef Q_OS_WIN
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
99 // BUGFIX: COM ports above COM9 are not automatically recognized,
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
100 // hence we have to prepend DEVICE NAMESPACE...
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
101 // http://msdn.microsoft.com/en-us/library/windows/desktop/aa365247(v=vs.85).aspx
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
102 QByteArray com = port.toLatin1() + "\0";
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
103 if (!com.startsWith("\\\\.\\"))
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
104 com = "\\\\.\\" + com;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
105
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
106 _hSerial = CreateFileA(com.data(),
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
107 GENERIC_READ | GENERIC_WRITE,
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
108 0, // Exclusive access.
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
109 NULL, // No security
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
110 OPEN_EXISTING,
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
111 FILE_ATTRIBUTE_DEVICE | FILE_FLAG_NO_BUFFERING,
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
112 0);
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
113 if (_hSerial == INVALID_HANDLE_VALUE) {
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
114 if (GetLastError() == ERROR_FILE_NOT_FOUND)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
115 LOG_THROW("Unknown port");
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
116 LOG_THROW("Unable to open port");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
117 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
118 S_PURGE(_hSerial);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
119
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
120 DCB dcbSerial = {sizeof(dcbSerial), 0};
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
121 if (!GetCommState(_hSerial, &dcbSerial))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
122 LOG_THROW("Unable to get COM port config");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
123
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
124 dcbSerial.BaudRate = CBR_115200;
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
125 dcbSerial.ByteSize = 8;
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
126 dcbSerial.Parity = NOPARITY;
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
127 dcbSerial.StopBits = ONESTOPBIT;
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
128 dcbSerial.fOutxCtsFlow = DTR_CONTROL_ENABLE; // NO HARDWARE FLOW CONTROL
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
129 dcbSerial.fRtsControl = RTS_CONTROL_ENABLE; //RTS_CONTROL_DISABLE; // NO HARDWARE FLOW CONTROL
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
130
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
131 if (!SetCommState(_hSerial, &dcbSerial))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
132 LOG_THROW("Unable to set COM port config");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
133
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
134 COMMTIMEOUTS timeouts = {0};
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
135 if (usbMode) {
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
136 timeouts.ReadTotalTimeoutConstant = 500; // 0.5 sec
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
137 timeouts.WriteTotalTimeoutConstant = 1000; // 1.0 sec
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
138 } else {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
139 timeouts.ReadTotalTimeoutConstant = 2000; // 2.0 sec timeout.
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
140 }
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
141 if (!SetCommTimeouts(_hSerial, &timeouts))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
142 LOG_THROW("Unable to configure port");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
143
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
144 LOG_TRACE("Connection:");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
145 LOG_TRACE(" " << dcbSerial.BaudRate << " bauds.");
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
146 LOG_TRACE(
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
147 " " << (int) dcbSerial.ByteSize << " bits, "
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
148 << (dcbSerial.Parity ? "+parity, " : "no parity, ")
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
149 << (dcbSerial.StopBits ? QString(" +%1").arg(dcbSerial.StopBits) : QString("no"))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
150 << " stops bits.");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
151 LOG_TRACE(" CTS is " << (dcbSerial.fOutxCtsFlow ? "ON." : "OFF."));
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
152 LOG_TRACE(" RTS is " << ((dcbSerial.fRtsControl == RTS_CONTROL_HANDSHAKE) ? "ON."
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
153 : (dcbSerial.fRtsControl == RTS_CONTROL_ENABLE) ? "FORCED."
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
154 : "OFF."));
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
155 LOG_TRACE(" Read timeout " << timeouts.ReadTotalTimeoutConstant << " msec.");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
156 LOG_TRACE(" Write timeout " << timeouts.WriteTotalTimeoutConstant << " msec.");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
157 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
158
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
159 //------------------------------------------------------------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
160 #if defined(Q_OS_MAC) || defined(Q_OS_LINUX)
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
161 QByteArray p = port.toLatin1();
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
162 if (!p.startsWith("/dev/"))
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
163 p = "/dev/" + p;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
164 _hSerial = ::open(p.constData(), O_RDWR | O_NOCTTY | O_NONBLOCK, 0);
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
165 if (_hSerial < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
166 LOG_THROW("Unable to open port " << p);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
167
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
168 if (ioctl(_hSerial, TIOCEXCL) < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
169 LOG_THROW("Port in use");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
170
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
171 // Once opened, clearing the O_NONBLOCK flag.
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
172 if (fcntl(_hSerial, F_SETFL, 0) < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
173 LOG_THROW("Can't reset non-blocking I/O");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
174
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
175 struct termios termios;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
176 tcgetattr(_hSerial, &termios);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
177
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
178 cfmakeraw(&termios);
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
179 if (cfsetspeed(&termios, B115200) < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
180 LOG_THROW("Bad port speed");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
181
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
182 termios.c_cflag |= CLOCAL | CS8 | CREAD; // No DTR/DSR/DCD, 8bit.
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
183 termios.c_cflag &= ~(PARENB | CSTOPB ); // No parity, one stop bit.
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
184 // | CCTS_OFLOW | CRTS_IFLOW); // No hardware flow control.
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
185
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
186 if (usbMode) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
187 // FAST USB: Fix timeout to 0.5 seconde:
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
188 termios.c_cc[VMIN] = 0; // Pure timout mode (no char needed).
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
189 termios.c_cc[VTIME] = 5; // 0.5s timeout after last received byte.
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
190 } else {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
191 // SLOW BLUETOOTH: Fix timeout to 2.0 sec:
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
192 termios.c_cc[VMIN] = 0; // Pure timout mode (no char needed).
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
193 termios.c_cc[VTIME] = 20; // 2.0sec timeout after last received byte.
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
194 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
195
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
196 if (tcsetattr(_hSerial, TCSANOW, &termios) < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
197 LOG_THROW("Unable to configure port");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
198 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
199
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
200 if (_hSerial == INVALID_HANDLE_VALUE)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
201 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
202
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
203 _isOpen = true;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
204 LOG_TRACE("Device open successfull.");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
205 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
206
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
207 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
208
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
209 void Serial::close()
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
210 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
211 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
212 return;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
213 LOG_TRACE("Device close ...");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
214
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
215 #ifdef Q_OS_MAC
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
216 if (ioctl(_hSerial, TIOCNXCL) < 0)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
217 LOG_THROW("Port in use");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
218 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
219
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
220 if (_hSerial == INVALID_HANDLE_VALUE)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
221 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
222 S_CLOSE(_hSerial);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
223
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
224 _hSerial = INVALID_HANDLE_VALUE;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
225 _isOpen = false;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
226 LOG_TRACE("Device close successfull.");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
227 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
228
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
229 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
230
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
231 unsigned char Serial::readByte() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
232 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
233 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
234 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
235
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
236 unsigned char byte = 0;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
237 S_LEN len = 0;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
238 S_READ(_hSerial, &byte, 1, len);
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
239 if (len != 1)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
240 LOG_THROW_E(ReadTimeout, "< timeout");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
241
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
242 if (isprint(byte))
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
243 LOG_DEBUG("< " << QString::asprintf("%02x '%c'", byte, byte));
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
244 else
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
245 LOG_DEBUG("< " << QString::asprintf("%02x", byte));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
246
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
247 return byte;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
248 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
249
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
250 void Serial::writeByte(unsigned char byte) const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
251 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
252 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
253 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
254
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
255 if (isprint(byte))
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
256 LOG_DEBUG("> " << QString::asprintf("%02x '%c'", byte, byte));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
257 else
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
258 LOG_DEBUG("> " << QString::asprintf("%02x", byte));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
259
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
260 S_LEN len = 0;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
261 S_WRITE(_hSerial, &byte, 1, len);
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
262 if (len != 1)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
263 // LOG_THROW_E(WriteTimeout, "> timeout");
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
264 LOG_THROW("> timeout");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
265 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
266
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
267 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
268
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
269 unsigned short Serial::readShort() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
270 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
271 unsigned char lo = readByte();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
272 unsigned char hi = readByte();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
273 return hi << 8 | lo;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
274 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
275
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
276 void Serial::writeShort(unsigned short word) const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
277 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
278 unsigned char lo = word & 0xFF;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
279 unsigned char hi = word >> 8;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
280 writeByte(lo);
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
281 writeByte(hi);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
282 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
283
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
284 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
285
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
286 void Serial::writeInt24(unsigned int int24) const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
287 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
288 unsigned char lo = int24 & 0xFF;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
289 unsigned char hi = (int24 >> 8) & 0xFF;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
290 unsigned char up = (int24 >> 16) & 0xFF;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
291 writeByte(lo);
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
292 writeByte(hi);
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
293 writeByte(up);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
294 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
295
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
296 unsigned int Serial::readInt24() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
297 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
298 unsigned char lo = readByte();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
299 unsigned char hi = readByte();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
300 unsigned char up = readByte();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
301 return up << 16 | hi << 8 | lo;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
302 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
303
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
304 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
305
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
306 unsigned int Serial::readBlock(unsigned char *ptr, unsigned int size) const
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
307 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
308 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
309 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
310
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
311 unsigned int bytes = 0;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
312
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
313 bool timeout = false;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
314 while (size > 0) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
315 // Allow up to 1.0sec for each 4K block.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
316 S_LEN todo = (size > 4096) ? 4096 : size;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
317 S_LEN done = 0;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
318 S_READ(_hSerial, ptr + bytes, todo, done);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
319
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
320 if (done == 0) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
321 timeout = true;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
322 break;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
323 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
324
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
325 size -= done;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
326 bytes += (unsigned int) done;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
327 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
328
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
329 if (Log::minLevel <= Log::LEVEL_DEBUG) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
330 const int DUMP_LINE = 16;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
331 const int DUMP_MAX = 3 * DUMP_LINE;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
332 const unsigned int length = (bytes < DUMP_MAX) ? bytes : DUMP_MAX;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
333 for (unsigned int i = 0; i < length; i += DUMP_LINE) {
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
334 LogAction logger(Log::LEVEL_DEBUG, __FILE__, __LINE__, "readBlock()");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
335 logger << "< ";
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
336 for (unsigned int j = i; j < bytes && j < (i + DUMP_LINE); ++j)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
337 logger << QString::asprintf("%02x ", ptr[j]);
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
338 for (unsigned int j = i; j < bytes && j < (i + DUMP_LINE); ++j)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
339 logger << (isprint(ptr[j]) ? ptr[j] : (unsigned char) '.');
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
340 }
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
341 if (length < bytes)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
342 LOG_DEBUG("< ... " << (bytes - length) << " more bytes.");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
343 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
344
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
345 if (timeout)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
346 LOG_THROW_E(ReadTimeout, "< block timeout (missing " << size << " bytes)");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
347
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
348 return bytes;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
349 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
350
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
351 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
352
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
353 void Serial::writeBlock(const unsigned char *ptr, unsigned int size) const
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
354 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
355 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
356 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
357
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
358 if (Log::minLevel <= Log::LEVEL_DEBUG) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
359 const int DUMP_LINE = 16;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
360 const int DUMP_MAX = 3 * DUMP_LINE;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
361 const unsigned int length = (size < DUMP_MAX) ? size : DUMP_MAX;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
362 for (unsigned int i = 0; i < length; i += DUMP_LINE) {
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
363 LogAction logger(Log::LEVEL_DEBUG, __FILE__, __LINE__, "writeBlock()");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
364 logger << "> ";
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
365 for (unsigned int j = i; j < size && j < (i + DUMP_LINE); ++j)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
366 logger << QString::asprintf("%02x ", ptr[j]);
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
367 for (unsigned int j = i; j < size && j < (i + DUMP_LINE); ++j)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
368 logger << (isprint(ptr[j]) ? ptr[j] : (unsigned char) '.');
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
369 }
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
370 if (length < size)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
371 LOG_DEBUG("> ... " << (size - length) << " more bytes.");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
372 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
373
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
374 while (size > 0) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
375 // Allow up to 1.0sec for each 4K block.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
376 S_LEN chunck = (size > 4096) ? 4096 : size;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
377 S_LEN len = 0;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
378 S_WRITE(_hSerial, ptr, chunck, len);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
379
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
380 if (len == 0)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
381 LOG_THROW_E(WriteTimeout, "> block timeout");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
382
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
383 size -= len;
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
384 ptr += len;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
385 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
386
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
387 // Auto-fluh on each write.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
388 flush();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
389 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
390
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
391 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
392
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
393 void Serial::purge()
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
394 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
395 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
396 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
397
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
398 // Empty incomming buffer
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
399 S_PURGE(_hSerial);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
400
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
401 LOG_TRACE("Device purged.");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
402 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
403
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
404 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
405
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
406 void Serial::flush() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
407 {
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
408 if (!_isOpen)
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
409 LOG_THROW("Port not open");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
410
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
411 S_FLUSH(_hSerial);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
412 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
413
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
414 ///////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
415
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
416 void Serial::sleep(int msec) const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
417 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
418 #ifdef WIN32
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
419 Sleep(msec);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
420 #else
10
9a3c1a6f9833 TODO: FIX HW flow control definitions in case of problem during communication. Background: Flags are not defined in terminos header
Ideenmodellierer
parents: 2
diff changeset
421 usleep(msec * 1000);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
422 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
423 }