Add MPSSEChip class for handling communication with MPSSE-supporting devices
Overview
This MR adds two new classes to libDevCom
: MPSSEChip
and FT232H.h
.
The class MPSSEChip
essentially wraps the C library libmpsse
which handles the communication with
the MPSSE devices connected to the host PC over USB. Note that libmpsse
is an abstraction over libftdi
,
and provides methods for handling I2C and SPI communication using libftdi
. The idea is that any new device we wish to support in libDevCom
that has an MPSSE engine to support PC host-to-device communication, that it's implementation should inherit from MPSSEChip
. In this way, the MPSSEChip
instance will represent the primary on the serial communication bus that performs reads and writes from/to the secondary devices on the bus.
The idea is that MPSSEChip
supports the basic MPSSE communication methods, and those devices inheriting from MPSSEChip
implement their specific functionality within their own class methods. For example, an inheriting class would provide specific pin mappings and purpose for the GPIO pins on the MPSSE chip package being used, and implement specific behavior/functions related to those.
The class FT232H
is an implementation of an MPSSEChip
. Right now it has no methods of its own.
I2CFTDICom
Update ofThe I2CFTDICom
class no longer exposes the C library libmpsse
, but instead holds an std::shared_ptr<MPSSEChip>
instance
that gets set to the specific one in its constructor.
The I2C
communication methods I2CFTDICom::write_block
and I2CFTDICom::read_block
then use the MPSSEChip
instance to handle the MPSSE commands.
This fixes the issues referenced in !127 (closed), in which it is noticed that the previous instance of I2CFTDICom
prevented interfacing to an I2C bus containing multiple I2C secondary devices since in that case I2CFTDICom
represented both the I2C primary (via it's ownership of the MPSSE device) and the I2C secondary (via it's ownership of the I2C secondary bus address).
Example Usage
Here is an example of setting up an FT232H
instance, for communication over an I2C bus on which there are multiple (two) I2C secondaries with bus addresses 0x1
and 0x2
,
#include "I2CFTDICom.h"
#include "FT232H.h"
...
std::shared_ptr<FT232H> ft232( new FT232H( MPSSEChip::Protocol::I2C, MPSSEChip::Speed::FOUR_HUNDRED_KHZ, MPSSEChip::Endianness::MSBFirst) );
std::unique_ptr<I2CFTDICom> i2c_com0( new I2CFTDICom(ft232, 0x1) );
std::unique_ptr<I2CFTDICom> i2c_com1( new I2CFTDICom(ft232, 0x2) );
...
This would then be followed by using the I2CFTDICom
instances for specific devices (e.g. ADCs).
Example Programs
An additional example is added under src/libDevCom/examples/ftdi_adc_example.cpp, which provides a complete example illustrating the usage with AD7998 devices.
The example src/libDevCom/examples/tempsensor_monitor.cpp has also been modified to reflect the updated FTDI interface.
Documentation
Doxygen doc strings are added to the MPSSEChip
declaration.