internal void GetHidFeatureReport(byte[] featureReport)
 {
     // NOTE: Keep this method internal for a while.
     if (featureReport == null || featureReport.Length >= 256)
     {
         throw new ArgumentException("featureReport is null or too large.", "featureReport");
     }
     // TODO: It can be important to wait before Get.
     if (WaitTimeInMillisecondsBeforeGetFeatureReport > 0)
     {
         while (HidStopwatch.ElapsedMilliseconds <= WaitTimeInMillisecondsBeforeGetFeatureReport)
         {
             System.Threading.Thread.Sleep(1);
         }
     }
     // NOTE: Exceptions can occur.  But this method does NOT catch them here.
     Win32HidSimpleAccess.GetFeatureReport(HidDeviceDevicePath, featureReport);
     if (WaitTimeInMillisecondsBeforeGetFeatureReport > 0)
     {
         HidStopwatch.Reset(); HidStopwatch.Start();
     }
 }
 internal void SetHidFeatureReport(byte[] featureReport)
 {
     // NOTE: Keep this method internal for a while.
     if (featureReport == null || featureReport.Length >= 256)
     {
         throw new ArgumentException("featureReport is null or too large.", "featureReport");
     }
     // TODO (en): I'm not sure this waiting is unnecessary or not.  If this function fails once, it continues to fail after waiting 100[ms], 10[sec].
     // TODO (ja): Setの前の待機は関係ないかも?!一度この関数が失敗すると、100ミリ秒とか10秒とか待機しても失敗している。
     if (WaitTimeInMillisecondsBeforeSetFeatureReport > 0)
     {
         while (HidStopwatch.ElapsedMilliseconds <= WaitTimeInMillisecondsBeforeSetFeatureReport)
         {
             System.Threading.Thread.Sleep(1);
         }
     }
     // NOTE: Exceptions can occur.  But this method does NOT catch them here.
     Win32HidSimpleAccess.SetFeatureReport(HidDeviceDevicePath, featureReport);
     if (WaitTimeInMillisecondsBeforeSetFeatureReport > 0)
     {
         HidStopwatch.Reset(); HidStopwatch.Start();
     }
 }