"#if defined(USBCON) " ? How do I use the Arduino USBAPI?

At the beginning of the USBAPI.h file is this:

#ifndef __USBAPI__
#define __USBAPI__

#include <inttypes.h>
#include <avr/pgmspace.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include <util/delay.h>

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned long u32;

#include "Arduino.h"

#if defined(USBCON)

#include "USBDesc.h"
#include "USBCore.h"

//================================================================================
//================================================================================
// USB

class USBDevice_
{
public:
 USBDevice_();
 bool configured();

 void attach();
 void detach(); // Serial port goes down too...
 void poll();
};
extern USBDevice_ USBDevice;

I am trying to create my own USBDevice subclass so I can use the USBAPI functions like, USB_Send as well as the HID functions defined in HID.cpp. But no matter what I do it wont let me call the class USBDevice and I think it’s because I need to define USBCON as ‘something’… but I have no idea what.

Here is my current .ino but ive tried so many different things to get access to the USBAPI. I also Have my HID report file below.

Gotta BUMP… im stumped.

I don't know anything about usbapi. Is google broken in your country ? A 2 minute consultation with Dr Google seems to suggest that there are quite a few examples out there.

The code you posted seems to be invalid. There is no #endif matching the #if defined(USBCON)

The exact purpose of that USBCON eludes me.

However, as a general concept, it isn't necessarily necessary to give these #define'd parameters an actual value. Merely adding the statement

define USBCON

will cause that parameter to be defined, and then the following code will be included. It doesn't actually have to have a "value".

I have already tried the adding the obvious #define USBCON to my .ino but to no avail. One of the reasons I was thinking that this function needs to be defined as ‘something’ is because it isnt the usual #ifdef function… That kind of threw me off even though everything I’ve read says that the two are basically the same function. THe other reason I think that USBCON needs to be defined as something is because when I trace the definition (‘right click’ > ‘go to definition’ via the STINO plugin with simple text 3) it takes me to the file iom16u2.h. Which I have no idea wtf that header is about. And in that header is defined:

#define USBCON _SFR_MEM8(0xD8)
#define FRZCLK 5
#define USBE 7

The other reason I think USBCON needs to be defined as something is because some of the functions that I want to use, which are defined in the USBCore.cpp file, like:

int USB_Send(u8 ep, const void* d, int len)
{
	if (!_usbConfiguration)
		return -1;

	int r = len;
	const u8* data = (const u8*)d;
	u8 timeout = 250;		// 250ms timeout on send? TODO
	while (len)
	{
		u8 n = USB_SendSpace(ep);
		if (n == 0)
		{
			if (!(--timeout))
				return -1;
			delay(1);
			continue;
		}

		if (n > len)
			n = len;
		{
			LockEP lock(ep);
			// Frame may have been released by the SOF interrupt handler
			if (!ReadWriteAllowed())
				continue;
			len -= n;
			if (ep & TRANSFER_ZERO)
			{
				while (n--)
					Send8(0);
			}
			else if (ep & TRANSFER_PGM)
			{
				while (n--)
					Send8(pgm_read_byte(data++));
			}
			else
			{
				while (n--)
					Send8(*data++);
			}
			if (!ReadWriteAllowed() || ((len == 0) && (ep & TRANSFER_RELEASE)))	// Release full buffer
				ReleaseTX();
		}
	}
	TXLED1;					// light the TX LED
	TxLEDPulse = TX_RX_LED_PULSE_MS;
	return r;
}

extern const u8 _initEndpoints[] PROGMEM;
const u8 _initEndpoints[] = 
{
	0,
	
#ifdef CDC_ENABLED
	EP_TYPE_INTERRUPT_IN,		// CDC_ENDPOINT_ACM
	EP_TYPE_BULK_OUT,			// CDC_ENDPOINT_OUT
	EP_TYPE_BULK_IN,			// CDC_ENDPOINT_IN
#endif

#ifdef HID_ENABLED
	EP_TYPE_INTERRUPT_IN		// HID_ENDPOINT_INT
#endif
};

#define EP_SINGLE_64 0x32	// EP0
#define EP_DOUBLE_64 0x36	// Other endpoints

static
void InitEP(u8 index, u8 type, u8 size)
{
	UENUM = index;
	UECONX = 1;
	UECFG0X = type;
	UECFG1X = size;
}

static
void InitEndpoints()
{
	for (u8 i = 1; i < sizeof(_initEndpoints); i++)
	{
		UENUM = i;
		UECONX = 1;
		UECFG0X = pgm_read_byte(_initEndpoints+i);
		UECFG1X = EP_DOUBLE_64;
	}
	UERST = 0x7E;	// And reset them
	UERST = 0;
}

//	Handle CLASS_INTERFACE requests
static
bool ClassInterfaceRequest(Setup& setup)
{
	u8 i = setup.wIndex;

#ifdef CDC_ENABLED
	if (CDC_ACM_INTERFACE == i)
		return CDC_Setup(setup);
#endif

#ifdef HID_ENABLED
	if (HID_INTERFACE == i)
		return HID_Setup(setup);
#endif
	return false;
}

int _cmark;
int _cend;

call and declare variables which are inside that iom16u2.h file, the purpose of which confuses me.

#define UECONX _SFR_MEM8(0xEB)
#define EPEN 0
#define RSTDT 3
#define STALLRQC 4
#define STALLRQ 5

And no google is not broken in my country but as I said I’ve done my research said im still stumped. Thanks for the snark :-\

Also, the #endif is in the USBAPI.h file which I didnt post to github. I will post it now just for convenience of anyone willing to help me.

https://gist.github.com/jarmerfohn/66a4e49757d6683295f0

USBCON will be defined in the mcu header file if the mcu has USB hardware. It is a register to configure the USB hardware, the definition is the register address. Without the mcu hardware I doubt the USB API will be of much use.

I suggest get started by trying out in the Arduino IDE, under File, Examples, 09.USB there are several sketches which use USB. Then you can build on that. A typical processor for those programs in Arduino land is the ATmega32U4 which is on board the Arduino Leonardo, Pro Micro, Micro, and a few other models. I have heard trying to implement USB on a processor without native USB hardware is difficult.