Преглед на файлове

add test code & implement
- hidh_mouse_open
- tusbh_hid_mouse_status
- tusbh_hid_mouse_get_report

hathach преди 13 години
родител
ревизия
058e2a9837
променени са 2 файла, в които са добавени 76 реда и са изтрити 12 реда
  1. 54 1
      tests/test/host/hid/test_hidh_mouse.c
  2. 22 11
      tinyusb/class/hid_host.c

+ 54 - 1
tests/test/host/hid/test_hidh_mouse.c

@@ -47,6 +47,7 @@
 
 extern hidh_interface_info_t mouse_data[TUSB_CFG_HOST_DEVICE_MAX];
 hidh_interface_info_t *p_hidh_mouse;
+tusb_mouse_report_t report;
 
 tusb_descriptor_interface_t const *p_mouse_interface_desc = &desc_configuration.mouse_interface;
 tusb_descriptor_endpoint_t  const *p_mouse_endpoint_desc  = &desc_configuration.mouse_endpoint;
@@ -57,6 +58,7 @@ void setUp(void)
 {
   hidh_init();
 
+  memclr_(&report, sizeof(tusb_mouse_report_t));
   dev_addr = RANDOM(TUSB_CFG_HOST_DEVICE_MAX)+1;
 
   p_hidh_mouse = &mouse_data[dev_addr-1];
@@ -119,10 +121,61 @@ void test_mouse_open_ok(void)
                     length);
 
   tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
-  TEST_ASSERT_TRUE( tusbh_hid_keyboard_is_supported(dev_addr) );
+  TEST_ASSERT_TRUE( tusbh_hid_mouse_is_supported(dev_addr) );
   TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_READY, p_hidh_mouse->status);
 
 }
 
+//--------------------------------------------------------------------+
+// mouse_get
+//--------------------------------------------------------------------+
+void test_mouse_get_invalid_address(void)
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  TEST_ASSERT_EQUAL(TUSB_ERROR_INVALID_PARA, tusbh_hid_mouse_get_report(0, 0, NULL)); // invalid address
+}
+
+void test_mouse_get_invalid_buffer(void)
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  TEST_ASSERT_EQUAL(TUSB_ERROR_INVALID_PARA, tusbh_hid_mouse_get_report(dev_addr, 0, NULL)); // invalid buffer
+}
+
+void test_mouse_get_device_not_ready(void)
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_UNPLUG);
+  TEST_ASSERT_EQUAL(TUSB_ERROR_DEVICE_NOT_READY, tusbh_hid_mouse_get_report(dev_addr, 0, &report)); // device not mounted
+}
+
+void test_mouse_get_report_xfer_failed()
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  hcd_pipe_xfer_ExpectAndReturn(p_hidh_mouse->pipe_hdl, (uint8_t*) &report, p_hidh_mouse->report_size, true, TUSB_ERROR_INVALID_PARA);
+
+  //------------- Code Under TEST -------------//
+  TEST_ASSERT_EQUAL(TUSB_ERROR_INVALID_PARA, tusbh_hid_mouse_get_report(dev_addr, 0, &report));
+}
+
+void test_mouse_get_report_xfer_failed_busy()
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  p_hidh_mouse->status = TUSB_INTERFACE_STATUS_BUSY;
+  TEST_ASSERT_EQUAL(TUSB_ERROR_INTERFACE_IS_BUSY, tusbh_hid_mouse_get_report(dev_addr, 0, &report));
+}
+
+void test_mouse_get_ok()
+{
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_READY, tusbh_hid_mouse_status(dev_addr, 0));
+
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  hcd_pipe_xfer_ExpectAndReturn(p_hidh_mouse->pipe_hdl, (uint8_t*) &report, p_hidh_mouse->report_size, true, TUSB_ERROR_NONE);
+
+  //------------- Code Under TEST -------------//
+  TEST_ASSERT_EQUAL(TUSB_ERROR_NONE, tusbh_hid_mouse_get_report(dev_addr, 0, &report));
+
+  tusbh_device_get_state_IgnoreAndReturn(TUSB_DEVICE_STATE_CONFIGURED);
+  TEST_ASSERT_EQUAL(TUSB_INTERFACE_STATUS_BUSY, tusbh_hid_mouse_status(dev_addr, 0));
+}
 
 

+ 22 - 11
tinyusb/class/hid_host.c

@@ -151,28 +151,39 @@ bool tusbh_hid_mouse_is_supported(uint8_t dev_addr)
 
 tusb_error_t tusbh_hid_mouse_get_report(uint8_t dev_addr, uint8_t instance_num, uint8_t * const report)
 {
+  //------------- parameters validation -------------//
+  ASSERT_INT(TUSB_DEVICE_STATE_CONFIGURED, tusbh_device_get_state(dev_addr), TUSB_ERROR_DEVICE_NOT_READY);
+  ASSERT_PTR(report, TUSB_ERROR_INVALID_PARA);
+
+  (void) instance_num;
+
+  hidh_interface_info_t *p_mouse = &mouse_data[dev_addr-1];
+
+  ASSERT(TUSB_INTERFACE_STATUS_BUSY != p_mouse->status, TUSB_ERROR_INTERFACE_IS_BUSY);
+
+  // TODO abstract to use hidh service
+  ASSERT_STATUS( hcd_pipe_xfer(p_mouse->pipe_hdl, report, p_mouse->report_size, true) ) ;
+
+  p_mouse->status = TUSB_INTERFACE_STATUS_BUSY;
+
   return TUSB_ERROR_NONE;
 }
 
 tusb_interface_status_t tusbh_hid_mouse_status(uint8_t dev_addr, uint8_t instance_num)
 {
- /* switch( tusbh_device_get_state(dev_addr) )
-  {
-    case TUSB_DEVICE_STATE_UNPLUG:
-    case TUSB_DEVICE_STATE_INVALID_PARAMETER:
-      return TUSB_INTERFACE_STATUS_INVALID_PARA;
-
-    default:
-      return mouse_data[dev_addr-1].status;
-  }*/
-
-  return TUSB_INTERFACE_STATUS_INVALID_PARA;
+  return hidh_interface_status(dev_addr, &mouse_data[dev_addr-1]);
 }
 
 //------------- Internal API -------------//
 static inline tusb_error_t hidh_mouse_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const *p_endpoint_desc) ATTR_ALWAYS_INLINE;
 static inline tusb_error_t hidh_mouse_open(uint8_t dev_addr, tusb_descriptor_endpoint_t const *p_endpoint_desc)
 {
+  hidh_interface_info_t *p_mouse = &mouse_data[dev_addr-1];
+
+  p_mouse->pipe_hdl    = hcd_pipe_open(dev_addr, p_endpoint_desc, TUSB_CLASS_HID);
+  p_mouse->report_size = p_endpoint_desc->wMaxPacketSize.size; // TODO get size from report descriptor
+
+  ASSERT (pipehandle_is_valid(p_mouse->pipe_hdl), TUSB_ERROR_HCD_FAILED);
 
   return TUSB_ERROR_NONE;
 }