Skip to content

Commit 077f37c

Browse files
committed
pbio/drv/usb_nxt: Implement serial number descriptor.
The browser needs this to automatically reconnect to a known device.
1 parent b39fffb commit 077f37c

2 files changed

Lines changed: 33 additions & 18 deletions

File tree

lib/pbio/drv/usb/usb_nxt.c

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,7 @@ enum {
9999
STRING_DESC_LANGID,
100100
STRING_DESC_MFG,
101101
STRING_DESC_PRODUCT,
102+
STRING_DESC_SERIAL,
102103
};
103104

104105
/* The following definitions are 'raw' USB setup packets. They are all
@@ -127,7 +128,7 @@ static const pbdrv_usb_dev_desc_t pbdrv_usb_nxt_device_descriptor = {
127128
.bcdDevice = 0x0200, /* Product revision: 2.0.0. */
128129
.iManufacturer = STRING_DESC_MFG,
129130
.iProduct = STRING_DESC_PRODUCT,
130-
.iSerialNumber = 0, // TODO: implement a serial number
131+
.iSerialNumber = STRING_DESC_SERIAL,
131132
.bNumConfigurations = 1,
132133
};
133134

@@ -188,6 +189,15 @@ static const pbdrv_usb_nxt_conf_t pbdrv_usb_nxt_full_config = {
188189
},
189190
};
190191

192+
// Serial number descriptor
193+
typedef struct PBDRV_PACKED {
194+
uint8_t bLength;
195+
uint8_t bDescriptorType;
196+
uint16_t wString[6 * 3]; // 6 hex bytes separated by ':' and ending in 0.
197+
} pbdrv_usb_serial_number_desc_t;
198+
199+
static pbdrv_usb_serial_number_desc_t pbdrv_usb_str_desc_serial;
200+
191201
typedef enum {
192202
USB_UNINITIALIZED,
193203
USB_READY,
@@ -441,6 +451,10 @@ static void pbdrv_usb_handle_std_request(pbdrv_usb_nxt_setup_packet_t *packet) {
441451
desc = &pbdrv_usb_str_desc_prod;
442452
size = sizeof(pbdrv_usb_str_desc_prod.s);
443453
break;
454+
case STRING_DESC_SERIAL:
455+
desc = &pbdrv_usb_str_desc_serial;
456+
size = sizeof(pbdrv_usb_str_desc_serial);
457+
break;
444458
}
445459

446460
if (desc) {
@@ -770,6 +784,14 @@ void pbdrv_usb_nxt_deinit(void) {
770784
}
771785

772786
void pbdrv_usb_init_device(void) {
787+
788+
extern char bluetooth_address_string[PBIO_ARRAY_SIZE(pbdrv_usb_str_desc_serial.wString)];
789+
for (uint8_t i = 0; i < PBIO_ARRAY_SIZE(pbdrv_usb_str_desc_serial.wString); i++) {
790+
pbdrv_usb_str_desc_serial.wString[i] = bluetooth_address_string[i];
791+
}
792+
pbdrv_usb_str_desc_serial.bLength = PBIO_ARRAY_SIZE(pbdrv_usb_str_desc_serial.wString) * 2;
793+
pbdrv_usb_str_desc_serial.bDescriptorType = USB_DESC_TYPE_STR,
794+
773795
pbdrv_usb_nxt_deinit();
774796
memset((void *)&pbdrv_usb_nxt_state, 0, sizeof(pbdrv_usb_nxt_state));
775797

lib/pbio/platform/nxt/platform.c

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include <stdbool.h>
77
#include <stdint.h>
8+
#include <stdio.h>
89
#include <string.h>
910

1011
#include <pbdrv/config.h>
@@ -111,31 +112,23 @@ const pbdrv_ioport_platform_data_t pbdrv_ioport_platform_data[PBDRV_CONFIG_IOPOR
111112
},
112113
};
113114

114-
const char *pin = "1234";
115+
char bluetooth_address_string[6 * 3]; // 6 hex bytes separated by ':' and ending in 0.
115116

116117
static void legacy_bluetooth_init_blocking(void) {
117118
nx_bt_init();
118119

119-
char *name = "Pybricks NXT";
120-
nx_bt_set_friendly_name(name);
120+
nx_bt_set_friendly_name("Pybricks NXT");
121121

122-
nx_display_string("Bluetooth name:\n");
123-
nx_display_string(name);
124-
nx_display_string("\n");
125122
uint8_t local_addr[7];
126123
if (nx_bt_get_local_addr(local_addr)) {
127-
for (int i = 0; i < 6; i++) {
128-
nx_display_hex(local_addr[i]);
129-
nx_display_string(i < 5 ? ":": "\n");
130-
}
124+
snprintf(bluetooth_address_string, sizeof(bluetooth_address_string),
125+
"%02X:%02X:%02X:%02X:%02X:%02X",
126+
local_addr[0], local_addr[1], local_addr[2],
127+
local_addr[3], local_addr[4], local_addr[5]);
131128
}
132-
nx_display_string("Pin: ");
133-
nx_display_string(pin);
134-
nx_display_string("\n\nConnect to me as BT serial port.\n");
135129

136-
nx_bt_set_discoverable(true);
137-
138-
nx_bt_open_port();
130+
nx_display_string(bluetooth_address_string);
131+
nx_display_string("\n");
139132
}
140133

141134
// REVISIT: This process waits for the user to connect to the NXT brick with
@@ -155,7 +148,7 @@ static pbio_error_t legacy_bluetooth_connect_process_thread(pbio_os_state_t *sta
155148
while (!nx_bt_stream_opened()) {
156149

157150
if (nx_bt_has_dev_waiting_for_pin()) {
158-
nx_bt_send_pin((char *)pin);
151+
nx_bt_send_pin("1234");
159152
nx_display_string("Please enter pin.\n");
160153
} else if (nx_bt_connection_pending()) {
161154
nx_display_string("Connecting ...\n");

0 commit comments

Comments
 (0)