annotate HardwareOperations.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 e30f00f760d3
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 HardwareOperations.cpp
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
3 /// \brief Abstract operations for HW dive computers.
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 /// \sa OSTC3Operations.cpp
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
6 ///
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
7 /// \copyright (c) 2011-2016 JD Gascuel. All rights reserved.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
8 /// $Id$
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 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
11 // BSD 2-Clause License:
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
12 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
13 // 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
14 // modification, are permitted provided that the following conditions
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
15 // are met:
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
16 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
17 // 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
18 // this list of conditions and the following disclaimer.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
19 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
20 // 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
21 // 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
22 // and/or other materials provided with the distribution.
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
23 //
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
24 // 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
25 // 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
26 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
27 // 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
28 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
29 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
30 // 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
31 // 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
32 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
33 // 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
34 // THE POSSIBILITY OF SUCH DAMAGE.
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
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
38 #include "HardwareOperations.h"
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
39 #include <QSerialPortInfo>
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
40 #include "MainWindow.h"
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
41 #include "Utils/Log.h"
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
42
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
43 #include <QRegularExpression>
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
44
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
45 #ifdef WIN32
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
46 #include <winreg.h>
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
47 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
48
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
49 #include <QDir>
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
50
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
51 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
52
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
53 unsigned char HardwareOperations::retryCommand(Serial &serial, unsigned char cmd, int retries)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
54 {
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
55 for (int retry = 0; retry < retries; ++retry) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
56 serial.writeByte(cmd); // Send command
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
57 serial.sleep(25); // Allow 25msec lag.
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
58
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
59 try {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
60 unsigned char echo = serial.readByte();
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
61 if (echo == cmd || echo == 'M' || echo == 'L')
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
62 return echo; // Got it, or unknown command...
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
63 } catch (const ReadTimeout &) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
64 continue;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
65 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
66
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
67 serial.sleep(100); // Cleanup any pending stuff,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
68 serial.purge(); // and retry...
1
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 return 0xFF;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
72 }
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
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
76 HardwareOperations::HardwareDescriptor HardwareOperations::hardwareDescriptor()
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
77 {
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
78 unsigned char echo = 0;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
79 unsigned int hardFeatures = 0xFF; // timeout response...
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
80 unsigned int softFeatures = 0;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
81 unsigned int model = 0;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
82 unsigned char ok = 0;
1
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 try {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
85 //---- First: try the new extended hardware query --------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
86 echo = retryCommand(_serial, 0x60, 1); // BACKQUOTE char
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
87 if (echo == 0x60) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
88 uchar extendedDescriptor[6];
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
89 _serial.readBlock(extendedDescriptor, sizeof extendedDescriptor);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
90
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
91 hardFeatures = extendedDescriptor[0] * 256 + extendedDescriptor[1];
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
92 softFeatures = extendedDescriptor[2] * 256 + extendedDescriptor[3];
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
93 model = extendedDescriptor[4];
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
94 ok = extendedDescriptor[5];
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
95 } else {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
96 // Did we have a timeout ?
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
97 // In that case, some hwOS versions fails and need a reset of
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
98 // the connection mode...
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
99 if (echo == 0xFF) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
100 echo = retryCommand(_serial, 0xBB); // Try to reconnect
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
101 if (echo == 0xBB)
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
102 echo = _serial.readByte(); // Eat 4d prompt
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
103 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
104
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
105 // Then try the OLD hardware descriptor command...
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
106 echo = retryCommand(_serial, 'j'); // 0x6A
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
107 if (echo == 'j') {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
108 hardFeatures = _serial.readByte();
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
109 ok = _serial.readByte();
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
110 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
111 }
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
112 } catch (const ReadTimeout &) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
113 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
114
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
115 if ((echo != 0x60 && echo != 'j') || (ok != 'M' && ok != 'L')) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
116 LOG_TRACE("Old OSTC not responding...");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
117 return HW_UNKNOWN_OSTC;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
118 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
119
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
120 switch (hardFeatures) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
121 case HW_Frog:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
122 LOG_TRACE("Frog found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
123 break;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
124 case HW_OSTCSport_a:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
125 LOG_TRACE("OSTC Sport found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
126 break;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
127 case HW_OSTC2c:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
128 LOG_TRACE("OSTC 2c found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
129 break;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
130 case HW_OSTC2_a:
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
131 case HW_OSTC2_c:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
132 LOG_TRACE("OSTC 2 found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
133 break;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
134 case HW_OSTCcR_a:
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
135 case HW_OSTCcR_b:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
136 LOG_TRACE("OSTC cR found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
137 break;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
138 case HW_OSTC3:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
139 LOG_TRACE("OSTC 3 found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
140 break;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
141 case HW_OSTC3p_a:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
142 LOG_TRACE("OSTC 3+ found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
143 break;
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
144 case HW_OSTC4:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
145 LOG_TRACE("OSTC 4/5 found");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
146 break;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
147
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
148 case HW_OSTCSport_b:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
149 LOG_TRACE("OSTC Sport, OSTC 2 or OSTC 3 found.");
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
150 break;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
151
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
152 case 0xFF:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
153 case 0x4C:
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
154 case 0x4D:
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
155 LOG_TRACE("old OSTC not responding...");
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
156 return HW_UNKNOWN_OSTC;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
157
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
158 default:
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
159 // LOG_TRACE("Unknown hardware feature =" << QString().sprintf("0x%04x", hardFeatures));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
160 LOG_TRACE("Unknown hardware feature =" << QString::asprintf("0x%04x", hardFeatures));
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
161 break;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
162 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
163
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
164 if (echo == 0x60) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
165 LOG_TRACE(" software feature = " << QString::asprintf("0x%04x", softFeatures));
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
166 LOG_TRACE(" model = " << QString::asprintf("0x%02x", model));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
167 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
168
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
169 return (HardwareDescriptor) hardFeatures;
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
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
172 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
173
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
174 QStringList HardwareOperations::listBluetoothPorts() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
175 {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
176 assert(supported() & BLUETOOTH);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
177 QStringList list;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
178 QString PortDesc;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
179 const auto serialPortInfos = QSerialPortInfo::availablePorts();
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
180
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
181 #if defined(Q_OS_MAC) || defined(Q_OS_LINUX)
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
182 // TODO: Linux USB search...
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
183 QRegularExpression pTemplate = portTemplate();
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
184 QDir dev("/dev");
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
185 QStringList all = dev.entryList(QStringList() << "rfcomm*" << "tty.*",
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
186 QDir::NoDotAndDotDot | QDir::Files | QDir::System | QDir::Writable,
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
187 QDir::Name);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
188
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
189 for (int i = 0; i < all.count(); ++i) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
190 QRegularExpressionMatch match = pTemplate.match(all[i]);
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
191
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
192 if (match.hasMatch()) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
193 LOG_TRACE("Port " << all[i]);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
194 list += all[i];
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
195 } else {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
196 LOG_DEBUG("... " << all[i]);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
197 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
198 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
199 #else
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
200 /* Check the descriptors of the available COMs for Bluetooth tag */
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
201 for (const QSerialPortInfo &serialPortInfo : serialPortInfos) {
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
202 PortDesc = serialPortInfo.description();
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
203 if (PortDesc.contains("Bluetooth"))
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
204 list += serialPortInfo.portName();
1
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
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
207 if (list.isEmpty()) /* no port identified => fallback to old detection function */
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
208 {
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
209 for (int i = 1; i < 300; ++i) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
210 QString port = QString("COM%1").arg(i);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
211
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
212 // First: try to read default configuration...
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
213 COMMCONFIG config = {0};
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
214 config.dwSize = sizeof config;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
215 config.wVersion = 1;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
216 DWORD len = sizeof config;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
217
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
218 QByteArray fixed = "\\\\.\\" + port.toLocal8Bit();
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
219 if (GetDefaultCommConfigA(fixed.constData(), &config, &len)) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
220 if (config.dwProviderSubType == PST_RS232)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
221 list += port;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
222 }
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
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
225 //---- Second chance
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
226 // overide usual MS bug, by looking into the registry for more
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
227 // BLUETOOTH ports...
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 HKEY key;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
230 const char registryPath[] = "HARDWARE\\DEVICEMAP\\SERIALCOMM";
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
231 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, // PWD
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
232 registryPath, // "SOFTWARE\Intel\PSIB"
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
233 0, // Options
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
234 KEY_READ, // Desired SAM: See 32bits view.
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
235 &key)
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
236 == ERROR_SUCCESS) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
237 for (DWORD i = 0; ++i;) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
238 char nameBuffer[128] = {0};
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
239 DWORD nameLen = sizeof nameBuffer;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
240 unsigned char dataBuffer[128] = {0};
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
241 DWORD dataLen = sizeof dataBuffer;
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
242 long rc = RegEnumValueA(key,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
243 i,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
244 nameBuffer,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
245 &nameLen,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
246 nullptr,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
247 nullptr,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
248 dataBuffer,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
249 &dataLen);
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
250 if (rc != ERROR_SUCCESS)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
251 break;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
252
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
253 QString name = QString(nameBuffer);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
254 QString port = QString((char *) dataBuffer);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
255 LOG_TRACE("Resource " << i << ": " << name << ", " << port);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
256 if (name.contains("\\BtModem") || name.contains("\\BthModem")
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
257 || name.contains("\\BtPort")) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
258 list += port + " (Bluetooth)";
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
259 LOG_TRACE("Port " << name);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
260 } else
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
261 LOG_DEBUG("... " << name);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
262 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
263 RegCloseKey(key);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
264 }
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 #endif
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 return list;
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
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
272 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
273
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
274 QStringList HardwareOperations::listUSBPorts() const
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
275 {
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
276 assert(!(supported() & BLUETOOTH));
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
277 QStringList list;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
278
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
279 #if defined(Q_OS_MAC) || defined(Q_OS_LINUX)
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
280 // TODO: Linux USB search...
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
281 QDir dev("/dev");
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
282 QRegularExpression pTemplate = portTemplate(); // Hier bleibt alles gleich
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
283 QStringList all = dev.entryList(QStringList() << "tty.*",
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
284 QDir::System | QDir::Writable | QDir::NoDotAndDotDot,
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
285 QDir::Name);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
286
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
287 for (int i = 0; i < all.count(); ++i) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
288 // Verwende QRegularExpression::match anstelle von indexIn
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
289 QRegularExpressionMatch match = pTemplate.match(all[i]);
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
290
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
291 if (match.hasMatch()) { // Überprüfe, ob eine Übereinstimmung gefunden wurde
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
292 LOG_TRACE("Port " << all[i]);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
293 list += all[i];
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
294 } else {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
295 LOG_TRACE("... " << all[i]);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
296 }
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 #else
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
299 //---- First chance: Try the normal port list:
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
300 for (int i = 1; i < 300; ++i) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
301 QString port = QString("COM%1").arg(i);
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 // First: try to read default configuration...
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
304 COMMCONFIG config;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
305 memset(&config, 0, sizeof config);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
306 config.dwSize = sizeof config;
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
307 config.wVersion = 1;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
308 DWORD len = sizeof config;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
309
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
310 QByteArray fixed = "\\\\.\\" + port.toLocal8Bit();
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
311 if (GetDefaultCommConfigA(fixed.constData(), &config, &len)) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
312 LOG_TRACE("Port " << port << " subtype=" << int(config.dwProviderSubType));
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
313 if (config.dwProviderSubType == PST_RS232)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
314 list += port;
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
315 } else if (len != sizeof config)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
316 LOG_THROW("Required " << len << " bytes.");
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
317 else if (HRESULT rc = GetLastError())
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
318 if (rc != 87)
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
319 LOG_TRACE("Port " << port << " error=" << rc);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
320 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
321 //---- Second chance
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
322 // overide usual MS bug, by looking into the registry for more
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
323 // USB serial ports...
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 HKEY key;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
326 const char registryPath[] = "HARDWARE\\DEVICEMAP\\SERIALCOMM";
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
327 if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, // PWD
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
328 registryPath, // path
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
329 0, // Options
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
330 KEY_READ, // Desired SAM: See 32bits view.
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
331 &key)
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
332 == ERROR_SUCCESS) {
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
333 for (DWORD i = 0;; ++i) {
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
334 char nameBuffer[128] = {0};
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
335 DWORD nameLen = sizeof nameBuffer;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
336 unsigned char dataBuffer[128] = {0};
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
337 DWORD dataLen = sizeof dataBuffer;
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
338 long rc = RegEnumValueA(key,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
339 i,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
340 nameBuffer,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
341 &nameLen,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
342 nullptr,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
343 nullptr,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
344 dataBuffer,
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
345 &dataLen);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
346
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
347 if (rc == ERROR_NO_MORE_ITEMS)
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
348 break;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
349
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
350 if (rc != ERROR_SUCCESS)
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
351 LOG_THROW("Enumeration error");
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
352
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
353 QString name = QString(nameBuffer);
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
354 QString port = QString((char *) dataBuffer);
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
355 LOG_TRACE("Resource " << i << ": " << name << ", " << port);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
356
12
ac837fe1d590 Switch implementation for reqex class and added RFCOMM as label for Bluetooth based connection by Linux
Ideenmodellierer
parents: 4
diff changeset
357 if (name.contains("\\VCP"))
1
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
358 list += port + " (USB)";
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
359 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
360 RegCloseKey(key);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
361 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
362 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
363 #endif
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
364
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
365 return list;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
366 }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
367
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
368 //////////////////////////////////////////////////////////////////////////////
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
369
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
370 //QString HardwareOperations::scanNewPort()
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
371 //{
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
372 // static QStringList oldPorts;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
373
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
374 // //---- Get current ports, type-less (ie. strip (USB) or (Bluetooth) ------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
375 // QStringList newPorts;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
376 // foreach(QString port, listPorts())
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
377 // newPorts += port.section(" ", 0, 0);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
378
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
379 // //---- Simplify all ports not in the list anymore -----------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
380 // for(int p=0; p<oldPorts.count(); ++p) {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
381 // QString port = oldPorts[p];
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
382 // if( ! newPorts.contains(port) )
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
383 // oldPorts.removeAll(port);
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
384 // }
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 // //---- Check for new port in the list -----------------------------------
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
387 // for(int p=0; p<newPorts.count(); ++p) {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
388 // QString port = newPorts[p];
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
389 // // Did we find a new port ?
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
390 // if( ! oldPorts.contains(port) ) {
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
391 // oldPorts += port;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
392 // return port;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
393 // }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
394 // }
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
395
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
396 // return QString::null;
0b3630a29ad8 Initial version based on previous repository.
Ideenmodellierer <tiefenrauscher@web.de>
parents:
diff changeset
397 //}