Commit | Line | Data |
---|---|---|
cdf448f6 TJ |
1 | /*************************************************************************** |
2 | ftdi.hpp - C++ wrapper for libftdi | |
3 | ------------------- | |
4 | begin : Mon Oct 13 2008 | |
5 | copyright : (C) 2008 by Marek VavruĊĦa | |
6 | email : opensource@intra2net.com and marek@vavrusa.com | |
7 | ***************************************************************************/ | |
8 | ||
9 | /*************************************************************************** | |
10 | * * | |
11 | * This program is free software; you can redistribute it and/or modify * | |
12 | * it under the terms of the GNU Lesser General Public License * | |
13 | * version 2.1 as published by the Free Software Foundation; * | |
14 | * * | |
15 | ***************************************************************************/ | |
16 | ||
17 | #ifndef __libftdi_hpp__ | |
18 | #define __libftdi_hpp__ | |
20b1459a TJ |
19 | |
20 | #include <list> | |
21 | #include <string> | |
cfceadbc | 22 | #include <boost/shared_ptr.hpp> |
20b1459a TJ |
23 | #include "ftdi.h" |
24 | ||
25 | namespace Ftdi | |
26 | { | |
27 | ||
28 | /* Forward declarations*/ | |
29 | class List; | |
30 | class Eeprom; | |
31 | ||
32 | /*! \brief FTDI device context. | |
33 | * Represents single FTDI device context. | |
34 | */ | |
35 | class Context | |
36 | { | |
cdf448f6 TJ |
37 | /* Friends */ |
38 | friend class Eeprom; | |
39 | friend class List; | |
40 | ||
41 | public: | |
42 | /*! \brief Direction flags for flush(). | |
43 | */ | |
44 | enum Direction | |
45 | { | |
46 | Input, | |
47 | Output | |
48 | }; | |
49 | ||
50 | /*! \brief Modem control flags. | |
51 | */ | |
52 | enum ModemCtl | |
53 | { | |
54 | Dtr, | |
55 | Rts | |
56 | }; | |
57 | ||
58 | /* Constructor, Destructor */ | |
59 | Context(); | |
60 | ~Context(); | |
61 | ||
62 | /* Properties */ | |
63 | Eeprom* eeprom(); | |
64 | const std::string& vendor(); | |
65 | const std::string& description(); | |
66 | const std::string& serial(); | |
67 | ||
68 | /* Device manipulators */ | |
69 | bool is_open(); | |
70 | int open(struct usb_device *dev = 0); | |
71 | int open(int vendor, int product, const std::string& description = std::string(), const std::string& serial = std::string()); | |
72 | int close(); | |
73 | int reset(); | |
74 | int flush(int mask = Input|Output); | |
75 | int set_interface(enum ftdi_interface interface); | |
76 | void set_usb_device(struct usb_dev_handle *dev); | |
77 | ||
78 | /* Line manipulators */ | |
79 | int set_baud_rate(int baudrate); | |
80 | int set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity); | |
81 | int set_line_property(enum ftdi_bits_type bits, enum ftdi_stopbits_type sbit, enum ftdi_parity_type parity, enum ftdi_break_type break_type); | |
82 | ||
83 | /* I/O */ | |
84 | int read(unsigned char *buf, int size); | |
85 | int write(unsigned char *buf, int size); | |
86 | int set_read_chunk_size(unsigned int chunksize); | |
87 | int set_write_chunk_size(unsigned int chunksize); | |
88 | int read_chunk_size(); | |
89 | int write_chunk_size(); | |
90 | ||
91 | /* Async IO | |
92 | TODO: should wrap? | |
93 | int writeAsync(unsigned char *buf, int size); | |
94 | void asyncComplete(int wait_for_more); | |
95 | */ | |
96 | ||
97 | /* Flow control */ | |
98 | int set_event_char(unsigned char eventch, unsigned char enable); | |
99 | int set_error_char(unsigned char errorch, unsigned char enable); | |
100 | int set_flow_control(int flowctrl); | |
101 | int set_modem_control(int mask = Dtr|Rts); | |
102 | int set_latency(unsigned char latency); | |
103 | int set_dtr(bool state); | |
104 | int set_rts(bool state); | |
105 | ||
106 | unsigned short poll_modem_status(); | |
107 | unsigned latency(); | |
108 | ||
109 | /* BitBang mode */ | |
110 | int set_bitmode(unsigned char bitmask, unsigned char mode); | |
111 | int bitbang_enable(unsigned char bitmask); | |
112 | int bitbang_disable(); | |
113 | int read_pins(unsigned char *pins); | |
114 | ||
115 | /* Misc */ | |
116 | char* error_string(); | |
117 | ||
118 | protected: | |
119 | int get_strings(); | |
120 | ||
121 | /* Properties */ | |
122 | struct ftdi_context* context(); | |
123 | void set_context(struct ftdi_context* context); | |
124 | void set_usb_device(struct usb_device *dev); | |
125 | ||
126 | private: | |
127 | class Private; | |
cfceadbc | 128 | boost::shared_ptr<Private> d; |
20b1459a TJ |
129 | }; |
130 | ||
131 | /*! \brief Device EEPROM. | |
132 | */ | |
133 | class Eeprom | |
134 | { | |
cdf448f6 TJ |
135 | public: |
136 | Eeprom(Context* parent); | |
137 | ~Eeprom(); | |
138 | ||
139 | void init_defaults(); | |
140 | void set_size(int size); | |
141 | int size(unsigned char *eeprom, int maxsize); | |
142 | int chip_id(unsigned int *chipid); | |
143 | int build(unsigned char *output); | |
144 | int read(unsigned char *eeprom); | |
145 | int write(unsigned char *eeprom); | |
146 | int erase(); | |
147 | ||
148 | private: | |
149 | class Private; | |
cfceadbc | 150 | boost::shared_ptr<Private> d; |
20b1459a TJ |
151 | }; |
152 | ||
cfceadbc | 153 | typedef std::list<Context> ListBase; |
20b1459a TJ |
154 | |
155 | /*! \brief Device list. | |
156 | */ | |
157 | class List : public ListBase | |
158 | { | |
cdf448f6 TJ |
159 | public: |
160 | List(struct ftdi_device_list* devlist = 0); | |
161 | ~List(); | |
20b1459a | 162 | |
cdf448f6 | 163 | static List* find_all(int vendor, int product); |
20b1459a | 164 | |
cdf448f6 TJ |
165 | private: |
166 | class Private; | |
cfceadbc | 167 | boost::shared_ptr<Private> d; |
20b1459a TJ |
168 | }; |
169 | ||
170 | } | |
171 | ||
172 | #endif |