@@ -16,6 +16,8 @@ extern "C" {
1616#include " timer.h"
1717#include " trace.h"
1818#include " usb_report_updater.h"
19+ #include " usb_semaphore.h"
20+ #include " usb_scheduler.h"
1921#include " led_display.h"
2022#include " jitter_test.h"
2123#include " usb_state.h"
@@ -32,83 +34,25 @@ extern "C" {
3234 #error "Either CONFIG_DEBUG or NDEBUG must be defined"
3335#endif
3436
35- typedef enum {
36- ReportSink_Invalid,
37- ReportSink_Usb,
38- ReportSink_BleHid,
39- ReportSink_Dongle,
40- ReportSink_TestSuite,
41- } report_sink_t ;
37+ #ifdef __ZEPHYR__
38+ #include < zephyr/logging/log.h>
39+ LOG_MODULE_REGISTER (Transport, LOG_LEVEL_INF );
40+ #endif
41+ // On mcux, logger.h provides the LOG_WRN / LOG_ERR / ... redirects.
4242
4343// Exponential moving average (alpha=1/8) of the measured delay between a
4444// BLE HID report being handed to the stack and the corresponding sent callback
45- // firing. Populated when DEBUG_BLE_LATENCY_STATS is enabled; useful for
46- // observing whether the send pipeline is saturated.
45+ // firing. Populated when DEBUG_BLE_LATENCY_STATS is enabled (in usb_report_sender.c);
46+ // useful for observing whether the send pipeline is saturated.
4747extern " C" {
4848float HidReportBleLatencyAvgMs = 0 ;
4949}
50- static uint32_t dispatchTimeMs = 0 ;
51-
52- // Approximate transport window intervals (ms) used by the report-construction
53- // throttle. After dispatch we estimate the next free window at "now + 2 *
54- // interval" (worst case: we just missed a window). The send-completion
55- // callback then reduces the estimate to "now + interval".
56- static constexpr uint32_t USB_REPORT_INTERVAL_MS = 1 ;
5750
5851bool UnreliableTransportTestMode = false ;
5952
60- static uint32_t reportIntervalForSink (report_sink_t sink)
61- {
62- switch (sink) {
63- case ReportSink_Usb:
64- return USB_REPORT_INTERVAL_MS ;
65- case ReportSink_BleHid:
66- case ReportSink_Dongle:
67- #if DEVICE_IS_UHK80_RIGHT
68- return BtConn_GetReportIntervalMs (ActiveHostConnectionId);
69- #else
70- return 11 ;
71- #endif
72- default :
73- return 1 ;
74- }
75- }
76-
77- static void noteReportDispatched (report_sink_t sink)
78- {
79- if (DEBUG_BLE_LATENCY_STATS ) {
80- if (dispatchTimeMs == 0 ) {
81- dispatchTimeMs = Timer_GetCurrentTime ();
82- }
83- }
84- UsbReportWindowEstimate = UsbReportWindowEstimateLast + 2 * reportIntervalForSink (sink);
85- }
86-
87- static void noteReportSent (report_sink_t transport)
88- {
89- if (DEBUG_BLE_LATENCY_STATS ) {
90- if (dispatchTimeMs != 0 ) {
91- uint32_t delta = Timer_GetCurrentTime () - dispatchTimeMs;
92- HidReportBleLatencyAvgMs = (HidReportBleLatencyAvgMs * 7 + delta) / 8 ;
93- dispatchTimeMs = 0 ;
94- }
95- }
96- uint32_t reportInterval = reportIntervalForSink (transport);
97- uint32_t currentTime = Timer_GetCurrentTime ();
98- int16_t jitterGuess = (currentTime - UsbReportWindowEstimateLast - reportInterval + 1 ) / 2 ;
99- jitterGuess = MAX (0 , jitterGuess);
100- UsbReportWindowEstimateLast = currentTime - jitterGuess;
101- UsbReportWindowEstimate = currentTime - jitterGuess + reportInterval;
102- uint32_t nextIn = UsbReportWindowEstimate - USB_REPORT_WINDOW_LOOKAHEAD_MS ;
103-
104- if (DEVICE_IS_UHK80_RIGHT ) {
105- EventScheduler_Schedule (nextIn, EventSchedulerEvent_Postponer, " Report sent. Recalculate report throttles" );
106- }
107- }
108-
10953extern " C" void HidTransport_NoteNusReportSent (void )
11054{
111- noteReportSent (ReportSink_Dongle);
55+ UsbScheduler_ReportDelivered (ReportSink_Dongle);
11256}
11357
11458static report_sink_t determineSink ()
@@ -180,7 +124,7 @@ extern "C" void Hid_TransportStateChanged(
180124extern " C" errno_t Hid_SendKeyboardReport (const hid_keyboard_report_t *report)
181125{
182126 report_sink_t sink = determineSink ();
183- noteReportDispatched (sink);
127+ UsbScheduler_ReportAcceptedByTransport (sink);
184128 Trace_Printf (" z11,%d" , sink);
185129 errno_t err;
186130 if (UnreliableTransportTestMode && Utils_Random () % 7 == 0 ) {
@@ -201,7 +145,7 @@ extern "C" errno_t Hid_SendKeyboardReport(const hid_keyboard_report_t *report)
201145 if (err != 0 ) {
202146 printk (" Failed to send keyboard report to dongle: %d\n " , err);
203147 } else {
204- UsbReportUpdater_ConfirmKeyboardReportSent ( );
148+ UsbSemaphore_Release (&UsbSemaphore. keyboard );
205149 }
206150 break ;
207151#endif
@@ -226,8 +170,8 @@ extern "C" void Hid_KeyboardReportSentCallback(hid_transport_t transport)
226170 if (UnreliableTransportTestMode && Utils_Random () % 7 == 0 ) {
227171 return ;
228172 }
229- UsbReportUpdater_ConfirmKeyboardReportSent ( );
230- noteReportSent (transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
173+ UsbSemaphore_Release (&UsbSemaphore. keyboard );
174+ UsbScheduler_ReportDelivered (transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
231175#if DEVICE_IS_UHK_DONGLE
232176 Dongle_SignalUsbReportSent ();
233177#endif
@@ -236,7 +180,7 @@ extern "C" void Hid_KeyboardReportSentCallback(hid_transport_t transport)
236180extern " C" errno_t Hid_SendMouseReport (const hid_mouse_report_t *report)
237181{
238182 report_sink_t sink = determineSink ();
239- noteReportDispatched (sink);
183+ UsbScheduler_ReportAcceptedByTransport (sink);
240184 Trace_Printf (" z21,%d" , sink);
241185 errno_t err;
242186 switch (sink) {
@@ -254,7 +198,7 @@ extern "C" errno_t Hid_SendMouseReport(const hid_mouse_report_t *report)
254198 if (err != 0 ) {
255199 printk (" Failed to send mouse report to dongle: %d\n " , err);
256200 } else {
257- UsbReportUpdater_ConfirmMouseReportSent ( );
201+ UsbSemaphore_Release (&UsbSemaphore. mouse );
258202 }
259203 break ;
260204#endif
@@ -274,8 +218,8 @@ extern "C" errno_t Hid_SendMouseReport(const hid_mouse_report_t *report)
274218
275219extern " C" void Hid_MouseReportSentCallback (hid_transport_t transport)
276220{
277- UsbReportUpdater_ConfirmMouseReportSent ( );
278- noteReportSent ( transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
221+ UsbSemaphore_Release (&UsbSemaphore. mouse );
222+ UsbScheduler_ReportDelivered ( transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
279223#if DEVICE_IS_UHK_DONGLE
280224 Dongle_SignalUsbReportSent ();
281225#endif
@@ -284,7 +228,7 @@ extern "C" void Hid_MouseReportSentCallback(hid_transport_t transport)
284228extern " C" errno_t Hid_SendControlsReport (const hid_controls_report_t *report)
285229{
286230 report_sink_t sink = determineSink ();
287- noteReportDispatched (sink);
231+ UsbScheduler_ReportAcceptedByTransport (sink);
288232 Trace_Printf (" z31,%d" , sink);
289233 errno_t err;
290234 switch (sink) {
@@ -302,7 +246,7 @@ extern "C" errno_t Hid_SendControlsReport(const hid_controls_report_t *report)
302246 if (err != 0 ) {
303247 printk (" Failed to send controls report to dongle: %d\n " , err);
304248 } else {
305- UsbReportUpdater_ConfirmControlsReportSent ( );
249+ UsbSemaphore_Release (&UsbSemaphore. controls );
306250 }
307251 break ;
308252#endif
@@ -319,8 +263,8 @@ extern "C" errno_t Hid_SendControlsReport(const hid_controls_report_t *report)
319263
320264extern " C" void Hid_ControlsReportSentCallback (hid_transport_t transport)
321265{
322- UsbReportUpdater_ConfirmControlsReportSent ( );
323- noteReportSent ( transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
266+ UsbSemaphore_Release (&UsbSemaphore. controls );
267+ UsbScheduler_ReportDelivered ( transport == HID_TRANSPORT_USB ? ReportSink_Usb : ReportSink_BleHid);
324268#if DEVICE_IS_UHK_DONGLE
325269 Dongle_SignalUsbReportSent ();
326270#endif
0 commit comments