@@ -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
10397CanReturnCode 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
171167CanDiagnostics 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