Torchtopher
Member
Hello, I am interested in adding more POV hats to the "extreme joystick", it currently supports 4 and I would like it to support 12. I am using a teensy 4.0. As you can see below, I have removed 2 sliders which I do not need that take up 4 bytes and added 8 pov hats. I think that this descriptor should be correct? Although I have a feeling something is wrong.
I have also changed the hat function as follows but I am fairly sure that I have done something wrong. As I understand it usb_joystick_data is an array with 16 elements of 32 bits each. So in the hat function I (think) am using the first 16 bits of the 13th,14th and 15th set of 32 bits. This seems wrong but I am not sure how to structure it. Any advice at all would be apricated as there is a decent chance I am completely forgetting something I need to do.
Code:
// extreme joystick (to use this, edit JOYSTICK_SIZE to 64 in usb_desc.h)
// In usb_desc.c
// 128 buttons 16
// 6 axes 12
// 15 sliders 30
// 12 pov 6
static uint8_t joystick_report_desc[] = {
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x04, // Usage (Joystick)
0xA1, 0x01, // Collection (Application)
0x15, 0x00, // Logical Minimum (0)
0x25, 0x01, // Logical Maximum (1)
0x75, 0x01, // Report Size (1)
0x95, 0x80, // Report Count (128)
0x05, 0x09, // Usage Page (Button)
0x19, 0x01, // Usage Minimum (Button #1)
0x29, 0x80, // Usage Maximum (Button #128)
0x81, 0x02, // Input (variable,absolute)
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x01, // Usage (Pointer)
0xA1, 0x00, // Collection ()
0x15, 0x00, // Logical Minimum (0)
0x27, 0xFF, 0xFF, 0, 0, // Logical Maximum (65535)
0x75, 0x10, // Report Size (16)
0x95, 23, // Report Count (23)
0x09, 0x30, // Usage (X)
0x09, 0x31, // Usage (Y)
0x09, 0x32, // Usage (Z)
0x09, 0x33, // Usage (Rx)
0x09, 0x34, // Usage (Ry)
0x09, 0x35, // Usage (Rz)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x09, 0x36, // Usage (Slider)
0x81, 0x02, // Input (variable,absolute)
0xC0, // End Collection
0x15, 0x00, // Logical Minimum (0)
0x25, 0x07, // Logical Maximum (7)
0x35, 0x00, // Physical Minimum (0)
0x46, 0x3B, 0x01, // Physical Maximum (315)
0x75, 0x04, // Report Size (4)
0x95, 0xC, // Report Count (12)
0x65, 0x14, // Unit (20)
0x05, 0x01, // Usage Page (Generic Desktop)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x09, 0x39, // Usage (Hat switch)
0x81, 0x42, // Input (variable,absolute,null_state)
0xC0 // End Collection
};
#endif // JOYSTICK_SIZE
#endif // JOYSTICK_INTERFACE
Code:
//in usb_joystick.h
inline void hat(unsigned int num, int angle) {
uint32_t val=angle;
uint32_t *p = usb_joystick_data;
switch(num) {
case 1:
p[13] = (p[13] & 0xFFF0FFFF) | (val << 16); break;
case 2:
p[13] = (p[13] & 0xFF0FFFFF) | (val << 20); break;
case 3:
p[13] = (p[13] & 0xF0FFFFFF) | (val << 24); break;
case 4:
p[13] = (p[13] & 0x0FFFFFFF) | (val << 28); break;
case 5:
p[14] = (p[14] & 0xFFF0FFFF) | (val << 16); break;
case 6:
p[14] = (p[14] & 0xFF0FFFFF) | (val << 20); break;
case 7:
p[14] = (p[14] & 0xF0FFFFFF) | (val << 24); break;
case 8:
p[14] = (p[15] & 0x0FFFFFFF) | (val << 28); break;
case 9:
p[15] = (p[15] & 0xFFF0FFFF) | (val << 16); break;
case 10:
p[15] = (p[15] & 0xFF0FFFFF) | (val << 20); break;
case 11:
p[15] = (p[15] & 0xF0FFFFFF) | (val << 24); break;
case 12:
p[15] = (p[15] & 0x0FFFFFFF) | (val << 28); break;
default:
return;
}
if (!manual_mode) usb_joystick_send();
}
Last edited: