Mercurial > public > ostc_companion
annotate Serial.cpp @ 14:e47e0f59101d default tip
Enable OSTC 4/5 Icon option
The button for uploading the icon is now activated based on the first FW
version supporting this function
| author | Ideenmodellierer |
|---|---|
| date | Mon, 12 Jan 2026 18:47:00 +0100 |
| parents | 9a3c1a6f9833 |
| children |
| 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 } |
