diff service/busyboxArduino/LiquidCrystal_V1.2.1/LiquidCrystal/I2CIO.cpp @ 154:58c47bfe0ce5

add LiquidCrystal_V1.2.1 lib Ignore-this: ddfe8b0c1d6e19f210684520859d5a57
author drewp@bigasterisk.com
date Sat, 03 Jan 2015 23:35:16 -0800
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/service/busyboxArduino/LiquidCrystal_V1.2.1/LiquidCrystal/I2CIO.cpp	Sat Jan 03 23:35:16 2015 -0800
@@ -0,0 +1,198 @@
+// ---------------------------------------------------------------------------
+// Created by Francisco Malpartida on 20/08/11.
+// Copyright 2011 - Under creative commons license 3.0:
+//        Attribution-ShareAlike CC BY-SA
+//
+// This software is furnished "as is", without technical support, and with no 
+// warranty, express or implied, as to its usefulness for any purpose.
+//
+// Thread Safe: No
+// Extendable: Yes
+//
+// @file I2CIO.h
+// This file implements a basic IO library using the PCF8574 I2C IO Expander
+// chip.
+// 
+// @brief 
+// Implement a basic IO library to drive the PCF8574* I2C IO Expander ASIC.
+// The library implements basic IO general methods to configure IO pin direction
+// read and write uint8_t operations and basic pin level routines to set or read
+// a particular IO port.
+//
+//
+// @version API 1.0.0
+//
+// @author F. Malpartida - fmalpartida@gmail.com
+// ---------------------------------------------------------------------------
+#if (ARDUINO <  100)
+#include <WProgram.h>
+#else
+#include <Arduino.h>
+#endif
+
+#include <inttypes.h>
+
+#include <../Wire/Wire.h>
+#include "I2CIO.h"
+
+// CLASS VARIABLES
+// ---------------------------------------------------------------------------
+
+
+// CONSTRUCTOR
+// ---------------------------------------------------------------------------
+I2CIO::I2CIO ( )
+{
+   _i2cAddr     = 0x0;
+   _dirMask     = 0xFF;    // mark all as INPUTs
+   _shadow      = 0x0;     // no values set
+   _initialised = false;
+}
+
+// PUBLIC METHODS
+// ---------------------------------------------------------------------------
+
+//
+// begin
+int I2CIO::begin (  uint8_t i2cAddr )
+{
+   _i2cAddr = i2cAddr;
+   
+   Wire.begin ( );
+      
+   _initialised = Wire.requestFrom ( _i2cAddr, (uint8_t)1 );
+
+#if (ARDUINO <  100)
+   _shadow = Wire.receive ();
+#else
+   _shadow = Wire.read (); // Remove the byte read don't need it.
+#endif
+   
+   return ( _initialised );
+}
+
+//
+// pinMode
+void I2CIO::pinMode ( uint8_t pin, uint8_t dir )
+{
+   if ( _initialised )
+   {
+      if ( OUTPUT == dir )
+      {
+         _dirMask &= ~( 1 << pin );
+      }
+      else 
+      {
+         _dirMask |= ( 1 << pin );
+      }
+   }
+}
+
+//
+// portMode
+void I2CIO::portMode ( uint8_t dir )
+{
+   
+   if ( _initialised )
+   {
+      if ( dir == INPUT )
+      {
+         _dirMask = 0xFF;
+      }
+      else
+      {
+         _dirMask = 0x00;
+      }
+   }
+}
+
+//
+// read
+uint8_t I2CIO::read ( void )
+{
+   uint8_t retVal = 0;
+   
+   if ( _initialised )
+   {
+      Wire.requestFrom ( _i2cAddr, (uint8_t)1 );
+#if (ARDUINO <  100)
+      retVal = ( _dirMask & Wire.receive ( ) );
+#else
+      retVal = ( _dirMask & Wire.read ( ) );
+#endif      
+      
+   }
+   return ( retVal );
+}
+
+//
+// write
+int I2CIO::write ( uint8_t value )
+{
+   int status = 0;
+   
+   if ( _initialised )
+   {
+      // Only write HIGH the values of the ports that have been initialised as
+      // outputs updating the output shadow of the device
+      _shadow = ( value & ~(_dirMask) );
+   
+      Wire.beginTransmission ( _i2cAddr );
+#if (ARDUINO <  100)
+      Wire.send ( _shadow );
+#else
+      Wire.write ( _shadow );
+#endif  
+      status = Wire.endTransmission ();
+   }
+   return ( (status == 0) );
+}
+
+//
+// digitalRead
+uint8_t I2CIO::digitalRead ( uint8_t pin )
+{
+   uint8_t pinVal = 0;
+   
+   // Check if initialised and that the pin is within range of the device
+   // -------------------------------------------------------------------
+   if ( ( _initialised ) && ( pin <= 7 ) )
+   {
+      // Remove the values which are not inputs and get the value of the pin
+      pinVal = this->read() & _dirMask;
+      pinVal = ( pinVal >> pin ) & 0x01; // Get the pin value
+   }
+   return (pinVal);
+}
+
+//
+// digitalWrite
+int I2CIO::digitalWrite ( uint8_t pin, uint8_t level )
+{
+   uint8_t writeVal;
+   int status = 0;
+   
+   // Check if initialised and that the pin is within range of the device
+   // -------------------------------------------------------------------
+   if ( ( _initialised ) && ( pin <= 7 ) )
+   {
+      // Only write to HIGH the port if the port has been configured as
+      // an OUTPUT pin. Add the new state of the pin to the shadow
+      writeVal = ( 1 << pin ) & ~_dirMask;
+      if ( level == HIGH )
+      {
+         _shadow |= writeVal;
+                                                      
+      }
+      else 
+      {
+         _shadow &= ~writeVal;
+      }
+      status = this->write ( _shadow );
+   }
+   return ( status );
+}
+
+//
+// PRIVATE METHODS
+// ---------------------------------------------------------------------------