diff --git a/.gitignore b/.gitignore index 853503cee..ae1cde1dd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,4 +18,4 @@ env.ini .devcontainer *Dockerfile *docker-compose.yml -/www/src_gen/enums.js +www/src_gen/enums.ts diff --git a/headers/drivers/xbone/XBOneDescriptors.h b/headers/drivers/xbone/XBOneDescriptors.h index 99fa63fcf..d48f541b0 100644 --- a/headers/drivers/xbone/XBOneDescriptors.h +++ b/headers/drivers/xbone/XBOneDescriptors.h @@ -38,7 +38,9 @@ static const uint8_t * xbone_get_string_descriptor(int index) { // Generate a serial number from the pico's unique ID pico_unique_board_id_t id; pico_get_unique_board_id(&id); - memcpy(uniqueSerial, (uint8_t*)&id, PICO_UNIQUE_BOARD_ID_SIZE_BYTES); + for(int i = 0; i < PICO_UNIQUE_BOARD_ID_SIZE_BYTES; i++) { + uniqueSerial[i] = 'A' + (id.id[i]%25); // some alphanumeric from 'A' to 'Z' + } return uniqueSerial; } else if ( index == 4 ) { // security method used return xboxSecurityMethod; diff --git a/src/drivers/xbone/XBOneDriver.cpp b/src/drivers/xbone/XBOneDriver.cpp index e6904c632..365e8e940 100644 --- a/src/drivers/xbone/XBOneDriver.cpp +++ b/src/drivers/xbone/XBOneDriver.cpp @@ -31,10 +31,11 @@ typedef enum { WAIT_DESCRIPTOR_REQUEST, SEND_DESCRIPTOR, SETUP_AUTH, - AUTH_DONE + AUTH_DONE, + NOT_READY } XboxOneDriverState; -static XboxOneDriverState xboneDriverState; +static XboxOneDriverState xboneDriverState = NOT_READY; static uint8_t xb1_guide_on[] = { 0x01, 0x5b }; static uint8_t xb1_guide_off[] = { 0x00, 0x5b }; @@ -282,6 +283,14 @@ bool xbone_xfer_cb(uint8_t rhport, uint8_t ep_addr, xfer_result_t result, // Set all player LEDs to on report_led_mode = incomingXGIP->getData()[1]; // 1 - turn LEDs on report_led_brightness = incomingXGIP->getData()[2]; // 2 - brightness (ignored for now) + + // Send our descriptor if descriptor is waiting (Player 2) + if ( xboneDriverState == XboxOneDriverState::WAIT_DESCRIPTOR_REQUEST ) { + outgoingXGIP->reset(); // reset if anything was in there + outgoingXGIP->setAttributes(GIP_DEVICE_DESCRIPTOR, incomingXGIP->getSequence(), 1, 1, 0); + outgoingXGIP->setData(xboxOneDescriptor, sizeof(xboxOneDescriptor)); + xboneDriverState = XboxOneDriverState::SEND_DESCRIPTOR; + } } else if ( command == GIP_CMD_RUMBLE ) { // TO-DO } else if ( command == GIP_AUTH || command == GIP_FINAL_AUTH) { @@ -668,6 +677,7 @@ void XBOneDriver::update() { } break; case AUTH_DONE: + case NOT_READY: default: break; }; diff --git a/src/gp2040.cpp b/src/gp2040.cpp index 49c1cfe5c..d80f2b5c8 100644 --- a/src/gp2040.cpp +++ b/src/gp2040.cpp @@ -270,10 +270,10 @@ void GP2040::run() { Gamepad * processedGamepad = Storage::getInstance().GetProcessedGamepad(); bool configMode = Storage::getInstance().GetConfigMode(); GamepadState prevState; - + // Start the TinyUSB Device functionality tud_init(TUD_OPT_RHPORT); - + while (1) { // LOOP this->getReinitGamepad(gamepad);