diff options
Diffstat (limited to 'device.cc')
| -rw-r--r-- | device.cc | 97 | 
1 files changed, 69 insertions, 28 deletions
@@ -1,52 +1,93 @@  #include <chrono>  #include <thread>  #include <cstddef> +#include <stdexcept>  #include <hidapi/hidapi.h>  #include "device.h" +#include "log.h" +#include "misc.h" -using namespace device; +using namespace nitrokey::device; +using namespace nitrokey::log;  Device::Device() -: m_vid(0), m_pid(0), -  m_retry_count(4), -  m_retry_timeout(50), -  mp_devhandle(NULL) {} +    : m_vid(0), +      m_pid(0), +      m_retry_count(40), +      m_retry_timeout(50), +      mp_devhandle(NULL) {} +bool Device::disconnect() { +  Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2); + +  hid_exit(); +  mp_devhandle = NULL; +  return true; +}  bool Device::connect() { -	hid_init(); +  Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2); -	mp_devhandle = hid_open(m_vid, m_pid, NULL); -	return mp_devhandle != NULL; +  // hid_init(); +  mp_devhandle = hid_open(m_vid, m_pid, NULL); +  // hid_init(); +  return mp_devhandle != NULL;  }  CommError Device::send(const void *packet) { -	return (CommError)( -		hid_send_feature_report(mp_devhandle, (const unsigned char *)(packet), -			HID_REPORT_SIZE)); +  Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2); + +  if (mp_devhandle == NULL) +    throw std::runtime_error("Attempted HID send on an invalid descriptor."); + +  return (CommError)(hid_send_feature_report( +      mp_devhandle, (const unsigned char *)(packet), HID_REPORT_SIZE));  }  CommError Device::recv(void *packet) { -	CommError status; -	int retry_count = 0; - -	for(;;) { -		status = (CommError)( -			hid_get_feature_report(mp_devhandle, (unsigned char *)(packet), -				HID_REPORT_SIZE)); -		if (status == CommError::ERR_NO_ERROR || retry_count++ >= m_retry_count) -			break; -		std::this_thread::sleep_for(m_retry_timeout); -	} - -	return status; +  // FIXME change CommError return value to int (return value of +  // hid_get_feature_report) +  int status; +  int retry_count = 0; + +  Log::instance()(__PRETTY_FUNCTION__, Loglevel::DEBUG_L2); + +  if (mp_devhandle == NULL) +    throw std::runtime_error("Attempted HID receive on an invalid descriptor."); + +  // FIXME extract error handling and repeating to parent function in +  // device_proto:192 +  for (;;) { +    status = (hid_get_feature_report(mp_devhandle, (unsigned char *)(packet), +                                     HID_REPORT_SIZE)); + +    // FIXME handle getting libhid error message somewhere else +    auto pwherr = hid_error(mp_devhandle); +    std::wstring wherr = (pwherr != NULL) ? pwherr : L"No error message"; +    std::string herr(wherr.begin(), wherr.end()); +    Log::instance()(std::string("libhid error message: ") + herr, +                    Loglevel::DEBUG_L2); + +    if (status > 0) break;  // success +    if (retry_count++ >= m_retry_count) { +      Log::instance()( +          "Maximum retry count reached" + std::to_string(retry_count), +          Loglevel::WARNING); +      break; +    } +    Log::instance()("Retrying... " + std::to_string(retry_count), +                    Loglevel::DEBUG); +    std::this_thread::sleep_for(m_retry_timeout); +  } + +  return (CommError)status;  }  Stick10::Stick10() { -	m_vid = 0x20a0; -	m_pid = 0x4108; +  m_vid = 0x20a0; +  m_pid = 0x4108;  }  Stick20::Stick20() { -	m_vid = 0x20a0; -	m_pid = 0x4109; +  m_vid = 0x20a0; +  m_pid = 0x4109;  }  | 
