/** \file
 *
 *  Contains the I2C class implementation.
 *
 *  Copyright (c) 2009 MBARI
 *  MBARI Proprietary Information.  All Rights Reserved
 *
 */

#include "I2C.h"

#include <cstdlib>
#include <ctype.h>

#include <sys/ioctl.h>
#include <errno.h>

#include "data/Slate.h"
#include "units/Units.h"

I2C::I2C( const ConfigURI& i2cCfg, const ConfigURI& i2cAddr, bool useHardware, Logger& logger )
    : useHardware_( useHardware ),
      io_( i2cCfg, useHardware, logger ),
      logger_( logger ),
      address_( ReadAddress( i2cAddr, logger ) )
{}

I2C::~I2C() {}


bool I2C::readBytes( char* bytes, size_t numBytes )
{
    if( io_.read( bytes, numBytes ).bytesRead() != numBytes )
    {
        // i2c transaction failed
        logger_.syslog( Str( "I2C read error. Can't read " ) + numBytes + " bytes.", Syslog::ERROR );
        return false;
    }
    return true;
}


void I2C::writeBytes( char * bytes )
{
    if( ( ioctl( io_.getFile(), 0x0703, address_ ) ) < 0 )
    {
        logger_.syslog( Str( "Error setting ioctl. errno is:" ) + errno, Syslog::ERROR );  // *** DEBUG
    }
    io_.write( bytes, sizeof( bytes ) );
}


void I2C::writeBytes( char * bytes, size_t numBytes )
{
    if( ( ioctl( io_.getFile(), 0x0703, address_ ) ) < 0 )
    {
        logger_.syslog( Str( "Error setting ioctl. errno is:" ) + errno, Syslog::ERROR );  // *** DEBUG
    }
    io_.write( bytes, numBytes );
}


int I2C::ReadAddress( const ConfigURI& addressUri, Logger& logger )
{
    int address = 0;
    Slate::ReadOnce( addressUri, Units::COUNT, address, logger );
    return address;
}

