I thought of this too.
Didn't make a difference.
Why did you add the extra 0x00 after 0xff by the way?
My Code, as it stands now.
Hid Descriptor
USB_Descriptor_HIDReport_Datatype_t PROGMEM JoystickReport[] =
{
0x05, 0x01, /* Usage Page (Generic Desktop) */
0x09, 0x04, /* Usage (Joystick) */
0xa1, 0x01, /* Collection (Application) */
0x09, 0x01, /* Usage (Pointer) */
0xa1, 0x00, /* Collection (Physical) */
0x05, 0x01, /* Usage Page (Generic Desktop) */
0x09, 0x30, /* Usage (X) */
0x09, 0x31, /* Usage (Y) */
0x09, 0x32, /* Usage (Z) */
0x09, 0x35, /* Usage (Rz) */
0x15, 0x00, /* Logical Minimum (0) */
0x26, 0xff, 0x00, /* Logical Maximum (255) */
0x75, 0x08, /* Report Size (8) */
0x95, 0x04, /* Report Count (4) */
0x81, 0x82, /* Input (Data, Variable, Absolute, Volatile) */
0xc0, /* End Collection */
0x05, 0x09, /* Usage Page (Button) */
0x09, 0x02, /* Usage (Button 2) */
0x09, 0x01, /* Usage (Button 1) */
0x15, 0x00, /* Logical Minimum (0) */
0x25, 0x01, /* Logical Maximum (1) */
0x75, 0x01, /* Report Size (1) */
0x95, 0x02, /* Report Count (2) */
0x81, 0x02, /* Input (Data, Variable, Absolute) */
0x75, 0x06, /* Report Size (6) */
0x95, 0x01, /* Report Count (1) */
0x81, 0x01, /* Input (Constant) */
0xc0 /* End Collection */
};
typedef struct
{
int8_t X; /**< Current absolute joystick X position, as a signed 8-bit integer */
int8_t Y; /**< Current absolute joystick Y position, as a signed 8-bit integer */
int8_t Z; /**< Current absolute joystick Z position, as a signed 8-bit integer */
int8_t Rz; /**< Current absolute joystick Rz position, as a signed 8-bit integer */
uint8_t Button; /**< Bit mask of the currently pressed joystick buttons */
} USB_JoystickReport_Data_t;
Data Holders
uint8_t dataIn;
uint8_t data[5];
uint8_t counter;
Main loop
int main(void)
{
SetupHardware();
//LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY);
sei();
for (;;)
{
HID_Device_USBTask(&Joystick_HID_Interface);
USB_USBTask();
if (counter==5){counter=0;}
if (Serial_IsCharReceived())
{
dataIn = Serial_RxByte();
if (dataIn == 0xFF){counter=0;}
data[counter]=dataIn;
counter+=1;
}
}
}
USB_JoystickReport_Data_t* JoystickReport = (USB_JoystickReport_Data_t*)ReportData;
JoystickReport->X = data[1];
JoystickReport->Y = data[2];
JoystickReport->Z = data[3];
JoystickReport->Rz = data[4];
JoystickReport->Button = 0;
*ReportSize = sizeof(USB_JoystickReport_Data_t);
return false;
And Arduino code:
int sensorBottom[] = {0, 0, 0, 0};
int sensorTop[] = {1024, 1024, 1024, 1024};
byte dataStart = 0xFF;
byte sensorValue;
void setup()
{
// initialize serial communications at 9600 bps:
Serial.begin(9600);
}
void loop() {
// Send start byte to 8u2
Serial.print(dataStart);
for (int i = 0; i < 4; i++)
{
sensorValue = analogRead(i);
sensorValue = map(sensorValue, sensorBottom[i], sensorTop[i], 0, 255);
sensorValue = constrain(sensorValue, 0, 255);
// print the results to the serial monitor:
Serial.print(sensorValue);
}
delay(40);
}
Problem: the values "wrap" around.
In the Windows 7 calibrate dialog I see the values ranging from 0 to 63 and then wrap around, a total of 4 time. (This makes sense in a way, it equals 256. I'm still not sure why though...)
Also, no matter what range (I tried 64 steps instead of 265), the values still "roll around" 4 times in a row.