diff options
| -rw-r--r-- | cores/arduino/PluggableUSB.cpp | 8 | ||||
| -rw-r--r-- | cores/arduino/PluggableUSB.h | 5 | ||||
| -rw-r--r-- | cores/arduino/USBCore.cpp | 6 | ||||
| -rw-r--r-- | libraries/HID/HID.cpp | 8 | ||||
| -rw-r--r-- | libraries/HID/HID.h | 5 | 
5 files changed, 24 insertions, 8 deletions
| diff --git a/cores/arduino/PluggableUSB.cpp b/cores/arduino/PluggableUSB.cpp index acc6276..582379a 100644 --- a/cores/arduino/PluggableUSB.cpp +++ b/cores/arduino/PluggableUSB.cpp @@ -25,8 +25,6 @@  extern uint8_t _initEndpoints[]; -PluggableUSB_ PluggableUSB; -  int PluggableUSB_::getInterface(uint8_t* interfaceNum)  {  	int sent = 0; @@ -90,6 +88,12 @@ bool PluggableUSB_::plug(PUSBListNode *node)  	// restart USB layer???  } +PluggableUSB_& PluggableUSB() +{ +	static PluggableUSB_ obj; +	return obj; +} +  PluggableUSB_::PluggableUSB_() : lastIf(CDC_ACM_INTERFACE + CDC_INTERFACE_COUNT),                                   lastEp(CDC_FIRST_ENDPOINT + CDC_ENPOINT_COUNT),                                   rootNode(NULL) diff --git a/cores/arduino/PluggableUSB.h b/cores/arduino/PluggableUSB.h index 824440a..b0668f4 100644 --- a/cores/arduino/PluggableUSB.h +++ b/cores/arduino/PluggableUSB.h @@ -66,7 +66,10 @@ private:    PUSBListNode* rootNode;  }; -extern PluggableUSB_ PluggableUSB; +// Replacement for global singleton. +// This function prevents static-initialization-order-fiasco +// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use +PluggableUSB_& PluggableUSB();  #endif diff --git a/cores/arduino/USBCore.cpp b/cores/arduino/USBCore.cpp index ebdce36..5db9f52 100644 --- a/cores/arduino/USBCore.cpp +++ b/cores/arduino/USBCore.cpp @@ -362,7 +362,7 @@ bool ClassInterfaceRequest(USBSetup& setup)  		return CDC_Setup(setup);  #ifdef PLUGGABLE_USB_ENABLED -	return PluggableUSB.setup(setup, i); +	return PluggableUSB().setup(setup, i);  #endif  	return false;  } @@ -440,7 +440,7 @@ static u8 SendInterfaces()  	CDC_GetInterface(&interfaces);  #ifdef PLUGGABLE_USB_ENABLED -	PluggableUSB.getInterface(&interfaces); +	PluggableUSB().getInterface(&interfaces);  #endif  	return interfaces; @@ -476,7 +476,7 @@ bool SendDescriptor(USBSetup& setup)  	InitControl(setup.wLength);  #ifdef PLUGGABLE_USB_ENABLED -	ret = PluggableUSB.getDescriptor(t); +	ret = PluggableUSB().getDescriptor(t);  	if (ret != 0) {  		return (ret > 0 ? true : false);  	} diff --git a/libraries/HID/HID.cpp b/libraries/HID/HID.cpp index b7aab6c..ff8e67b 100644 --- a/libraries/HID/HID.cpp +++ b/libraries/HID/HID.cpp @@ -21,7 +21,11 @@  #if defined(USBCON) -HID_ HID; +HID_& HID() +{ +	static HID_ obj; +	return obj; +}  int HID_::getInterface(uint8_t* interfaceNum)  { @@ -113,7 +117,7 @@ HID_::HID_(void) : PUSBListNode(1, 1, epType),                     protocol(1), idle(1)  {  	epType[0] = EP_TYPE_INTERRUPT_IN; -	PluggableUSB.plug(this); +	PluggableUSB().plug(this);  }  int HID_::begin(void) diff --git a/libraries/HID/HID.h b/libraries/HID/HID.h index 2cd0f4a..a7f5c68 100644 --- a/libraries/HID/HID.h +++ b/libraries/HID/HID.h @@ -93,6 +93,11 @@ private:    uint8_t idle;  }; +// Replacement for global singleton. +// This function prevents static-initialization-order-fiasco +// https://isocpp.org/wiki/faq/ctors#static-init-order-on-first-use +HID_& HID(); +  #define D_HIDREPORT(length) { 9, 0x21, 0x01, 0x01, 0, 1, 0x22, lowByte(length), highByte(length) }  #endif // USBCON | 
