3838#include <pios_helpers.h>
3939
4040/* Rx/Tx status */
41- static uint8_t transfer_possible = 0 ;
41+ static volatile uint8_t transfer_possible = 0 ;
4242
4343#ifdef PIOS_INCLUDE_FREERTOS
4444static void (* disconnection_cb_list [3 ]) (void );
@@ -148,6 +148,9 @@ int32_t PIOS_USB_Init(uint32_t *usb_id, const struct pios_usb_cfg *cfg)
148148 */
149149int32_t PIOS_USB_ChangeConnectionState (bool connected )
150150{
151+ #ifdef PIOS_INCLUDE_FREERTOS
152+ static volatile uint8_t lastStatus = 2 ; // 2 is "no last status"
153+ #endif
151154 // In all cases: re-initialise USB HID driver
152155 if (connected ) {
153156 transfer_possible = 1 ;
@@ -168,6 +171,12 @@ int32_t PIOS_USB_ChangeConnectionState(bool connected)
168171
169172#ifdef PIOS_INCLUDE_FREERTOS
170173 raiseConnectionStateCallback (connected );
174+ if (lastStatus != transfer_possible ) {
175+ if (lastStatus == 1 ) {
176+ raiseDisconnectionCallbacks ();
177+ }
178+ lastStatus = transfer_possible ;
179+ }
171180#endif
172181
173182 return 0 ;
@@ -187,28 +196,19 @@ bool PIOS_USB_CheckAvailable(__attribute__((unused)) uint32_t id)
187196 return false;
188197 }
189198
190- usb_found = ((usb_dev -> cfg -> vsense .gpio -> IDR & usb_dev -> cfg -> vsense .init .GPIO_Pin ) != 0 ) ^ usb_dev -> cfg -> vsense_active_low ;
191- // Please note that checks of transfer_possible and the reconnection handling is
192- // suppressed for non freertos mode (aka bootloader) as this is causing problems detecting connection and
193- // broken communications.
194- #ifdef PIOS_INCLUDE_FREERTOS
195- static bool lastStatus = false;
196- bool status = usb_found != 0 && transfer_possible ? 1 : 0 ;
197- bool reconnect = false;
198- if (xSemaphoreTakeFromISR (usb_dev -> statusCheckSemaphore , NULL ) == pdTRUE ) {
199- reconnect = (lastStatus && !status );
200- lastStatus = status ;
201- xSemaphoreGiveFromISR (usb_dev -> statusCheckSemaphore , NULL );
202- }
203- if (reconnect ) {
204- raiseDisconnectionCallbacks ();
205- }
206- return status ;
199+ return transfer_possible ;
200+ }
207201
208- #else
209- return usb_found ;
202+ /**
203+ * This function returns wether a USB cable (5V pin) has been detected
204+ * \return true: cable connected
205+ * \return false: cable not detected (no cable or cable with no power)
206+ */
207+ bool PIOS_USB_CableConnected (__attribute__((unused )) uint8_t id )
208+ {
209+ struct pios_usb_dev * usb_dev = (struct pios_usb_dev * )pios_usb_id ;
210210
211- #endif
211+ return (( usb_dev -> cfg -> vsense . gpio -> IDR & usb_dev -> cfg -> vsense . init . GPIO_Pin ) != 0 ) ^ usb_dev -> cfg -> vsense_active_low ;
212212}
213213
214214/*
0 commit comments