aboutsummaryrefslogtreecommitdiff
path: root/include/device.h
blob: 943fe1a78a141f54662b4e4a2358d29844437063 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#ifndef DEVICE_H
#define DEVICE_H
#include <chrono>
#include <hidapi/hidapi.h>
#include "inttypes.h"

#define HID_REPORT_SIZE 65

// TODO !! SEMAPHORE

namespace nitrokey {
namespace device {

enum class CommError 
{
	ERR_NO_ERROR = 0,
	ERR_NOT_CONNECTED = -1,
	ERR_WRONG_RESPONSE_CRC = -2,
	ERR_SENDING = -3,
	ERR_STATUS_NOT_OK = -4
};

class Device {
public:
	Device();

	// lack of device is not actually an error,
	// so it doesn't throw
	virtual bool connect(); 
	virtual bool disconnect(); 

	/*
	 *	Sends packet of HID_REPORT_SIZE.
	 */
	virtual CommError send(const void *packet);

	/*
	 *	Gets packet of HID_REPORT_SIZE.
	 *	Can sleep. See below.
	 */
	virtual CommError recv(void *packet);

protected:
	uint16_t m_vid;
	uint16_t m_pid;

	/*
	 *	While the project uses Signal11 portable HIDAPI
	 *	library, there's no way of doing it asynchronously,
	 *	hence polling.
	 */
	int m_retry_count;
	std::chrono::milliseconds m_retry_timeout;

	hid_device *mp_devhandle;
};

class Stick10 : public Device {
public:
	Stick10();
};

class Stick20 : public Device {
public:
	Stick20();
};

}
}
#endif