The PCAL6416A is a low-voltage 16-bit general purpose I/O (GPIO) expander with interrupt. This component library is compatible to basic operation as GPIO expanders: PCAL6416A, PCAL9555, PCA9555, PCA9535, PCA9539, PCAL9554, PCA9554 and PCA9538. On addition to this, this library is including mbed-SDK-style APIs. APIs that similar to DigitaiInOut, DigitalOut, DigitalIn, BusInOUt, BusOut and BusIn are available.

This is a copy of the PCA9555 library by Akifumi "Tedd" OKANO, which is compatible with PCAL6416A chip.

Revision:
0:035111d3d631
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/base_classes/CompGpioExp/GpioBus/GpioBusInOut.cpp	Wed Feb 15 10:07:59 2017 +0000
@@ -0,0 +1,89 @@
+#include    "GpioBusInOut.h"
+
+GpioBusInOut::GpioBusInOut(
+    CompGpioExp &gpiop,
+    GpioPinName p0,  GpioPinName p1,  GpioPinName p2,  GpioPinName p3,
+    GpioPinName p4,  GpioPinName p5,  GpioPinName p6,  GpioPinName p7,
+    GpioPinName p8,  GpioPinName p9,  GpioPinName p10, GpioPinName p11,
+    GpioPinName p12, GpioPinName p13, GpioPinName p14, GpioPinName p15  )
+    : gpio_p( &gpiop )
+{
+    GpioPinName pins[16] = { p0, p1, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12, p13, p14, p15 };
+    init( gpiop, pins );
+}
+
+GpioBusInOut::GpioBusInOut( CompGpioExp &gpiop, GpioPinName pins[16] )
+{
+    init( gpiop, pins );
+}
+
+void GpioBusInOut::init( CompGpioExp &gpiop, GpioPinName pins[16] )
+{
+    for ( int i = 0; i < 16; i++ )
+        pin_list[ i ]   = pins[ i ];
+
+    mask_bits    = ~(make_bitpattern( 0xFFFF ));
+}
+
+GpioBusInOut::~GpioBusInOut()
+{
+}
+
+void GpioBusInOut::write( int value )
+{
+    int bitpattern;
+
+    bitpattern  = make_bitpattern( value );
+    gpio_p->write_with_mask( bitpattern, mask_bits );
+}
+
+int GpioBusInOut::make_bitpattern( int value )
+{
+    int bit_pattern = 0;
+
+    for ( int i = 0; i < 16; i++ )
+        bit_pattern     |= (pin_list[ i ] != X_NC) ? ((value >> i) & 0x1) << pin_list[ i ] : 0x0;
+
+    return ( bit_pattern );
+}
+
+int GpioBusInOut::read( void )
+{
+    int r;
+    int v   = 0;
+
+    r   = gpio_p->read();
+
+    for ( int i = 0; i < 16; i++ )
+        v   |= (pin_list[ i ] != X_NC) ? ((r >> pin_list[ i ]) & 0x1) << i : 0x0;
+    
+    return v;
+}
+
+void GpioBusInOut::output( void )
+{
+    gpio_p->configure_with_mask( 0x0, mask_bits );
+}
+
+void GpioBusInOut::input( void )
+{
+    gpio_p->configure_with_mask( ~0x0, mask_bits );
+}
+
+GpioBusInOut& GpioBusInOut::operator=( int rhs )
+{
+    write( rhs );
+    return *this;
+}
+
+GpioBusInOut& GpioBusInOut::operator=( GpioBusInOut& rhs )
+{
+    write(rhs.read());
+    return *this;
+}
+
+
+GpioBusInOut::operator int( void )
+{
+    return( read() );
+}