Skip to content

Commit 8aebd01

Browse files
committed
check return codes of open and close on systec reconnect
small cleanups
1 parent 73f136b commit 8aebd01

1 file changed

Lines changed: 27 additions & 32 deletions

File tree

src/main/CanVendorSystec.cpp

Lines changed: 27 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,12 @@ CanReturnCode CanVendorSystec::init_can_port() {
2828

2929
unsigned int baud_rate = USBCAN_BAUD_125kBit;
3030
switch (args().config.bitrate.value_or(0)) {
31-
case 50000: baud_rate = USBCAN_BAUD_50kBit; break;
32-
case 100000: baud_rate = USBCAN_BAUD_100kBit; break;
33-
case 125000: baud_rate = USBCAN_BAUD_125kBit; break;
34-
case 250000: baud_rate = USBCAN_BAUD_250kBit; break;
35-
case 500000: baud_rate = USBCAN_BAUD_500kBit; break;
36-
case 1000000: baud_rate = USBCAN_BAUD_1MBit; break;
31+
case 50000: baud_rate = USBCAN_BAUD_50kBit; break;
32+
case 100000: baud_rate = USBCAN_BAUD_100kBit; break;
33+
case 125000: baud_rate = USBCAN_BAUD_125kBit; break;
34+
case 250000: baud_rate = USBCAN_BAUD_250kBit; break;
35+
case 500000: baud_rate = USBCAN_BAUD_500kBit; break;
36+
case 1000000: baud_rate = USBCAN_BAUD_1MBit; break;
3737
default: {
3838
LOG(Log::WRN, CanLogIt::h()) << "baud rate illegal, taking default 125000 [" << baud_rate << "]";
3939
}
@@ -51,7 +51,7 @@ CanReturnCode CanVendorSystec::init_can_port() {
5151
initialization_parameters.m_wNrOfRxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
5252
initialization_parameters.m_wNrOfTxBufferEntries = USBCAN_DEFAULT_BUFFER_ENTRIES;
5353

54-
// check if USB-CANmodul already is initialized
54+
// check if USB-CANmodul is already initialized
5555
std::lock_guard<std::mutex> guard(CanVendorSystec::m_handles_lock);
5656
auto pos = m_handle_map.find(m_module_number);
5757
if (pos == m_handle_map.end()) { // module not in use
@@ -84,30 +84,26 @@ CanReturnCode CanVendorSystec::vendor_open() noexcept {
8484
auto returnCode = init_can_port();
8585
if (returnCode != CanReturnCode::success) return returnCode;
8686

87-
// TODO set time since opened equivalent...
88-
// m_statistics.setTimeSinceOpened();
89-
90-
// After the canboard is configured and started, we start the scan control thread
91-
m_receive_thread_flag = true;
92-
m_SystecRxThread = std::thread(&CanVendorSystec::SystecRxThread, this);
93-
94-
// todo reintroduce check here...
95-
// if (NULL == m_receive_thread_handle) {
96-
// LOG(Log::ERR, CanLogIt::h()) << "Error creating the canScanControl thread.";
97-
// return CanReturnCode::internal_api_error;
98-
// }
87+
try {
88+
m_receive_thread_flag = true;
89+
m_SystecRxThread = std::thread(&CanVendorSystec::SystecRxThread, this);
90+
} catch(...) {
91+
returnCode = CanReturnCode::internal_api_error;
92+
}
9993

10094
return returnCode;
10195
}
10296

10397
CanReturnCode CanVendorSystec::vendor_close() noexcept {
104-
// TODO what if the return code is not success?
105-
std::lock_guard<std::mutex> guard(CanVendorSystec::m_handles_lock);
106-
erase_module_handle(m_module_number);
107-
m_receive_thread_flag = false;
108-
if (m_SystecRxThread.joinable()) m_SystecRxThread.join();
109-
UcanDeinitCanEx (m_UcanHandle, (BYTE) m_channel_number);
110-
LOG(Log::DBG, CanLogIt::h()) << __FUNCTION__ << " closed successfully";
98+
try {
99+
m_receive_thread_flag = false;
100+
std::lock_guard<std::mutex> guard(CanVendorSystec::m_handles_lock);
101+
erase_module_handle(m_module_number);
102+
if (m_SystecRxThread.joinable()) m_SystecRxThread.join();
103+
UcanDeinitCanEx (m_UcanHandle, (BYTE) m_channel_number);
104+
} catch (...) {
105+
return CanReturnCode::unknown_close_error;
106+
}
111107
return CanReturnCode::success;
112108
};
113109

@@ -146,9 +142,11 @@ CanReturnCode CanVendorSystec::vendor_send(const CanFrame& frame) noexcept {
146142
<< UsbCanGetErrorText(Status);
147143

148144
// for now, just always reconnect on a failed send.
149-
vendor_close(); // TODO maybe we just call close instead of vendor_close
150-
// see how CanVendorSocketCanSystec does reconnects, it intercepts the receiver function and wraps it
151-
vendor_open();
145+
auto close_code = close();
146+
if (close_code != CanReturnCode::success) return close_code;
147+
148+
auto open_code = open();
149+
if (open_code != CanReturnCode::success) return open_code;
152150

153151
switch (Status) {
154152
case USBCAN_ERR_MAXINSTANCES: return CanReturnCode::too_many_connections;
@@ -162,15 +160,12 @@ CanReturnCode CanVendorSystec::vendor_send(const CanFrame& frame) noexcept {
162160
case USBCAN_WARN_FW_TXOVERRUN: [[ fallthrough ]];
163161
default: return CanReturnCode::unknown_send_error;
164162
}
165-
// m_statistics.onTransmit( can_msg_to_send.m_bDLC );
166-
// m_statistics.setTimeSinceTransmitted();
167163
}
168164
return CanReturnCode::success;
169165
};
170166

171167
CanDiagnostics CanVendorSystec::vendor_diagnostics() noexcept {
172168

173-
// TODO we can read the operating mode, either kUcanModeNormal, ListenOnly or TxEcho
174169
CanDiagnostics diagnostics{};
175170
tStatusStruct status;
176171
// TODO check return code of these functions...

0 commit comments

Comments
 (0)