#include "archinc.h"
#include "cli.h"
#include "i2cmaster.h"
#include "i2cswitch.h"

#include <stdio.h>
#include <stdlib.h>

#if (defined(CONFIG_INCLUDE_LPC210X_I2C) && defined(CONFIG_INCLUDE_I2C_SWITCH))

static unsigned char slaveAddr;

static int i2cbusHandler(int argc, char * argv[], int flags);

int i2cswitchInit(unsigned char switchAddr)
{
  cliRegisterCommand("i2cbus",i2cbusHandler,"i2cbus [d(isable all)] [bus number 0-3 to enable]");
  slaveAddr = switchAddr;
  return i2cmasterProbe(slaveAddr);
}

int i2cswitchSetBus(int bus)
{
  unsigned char writeMask;

  if ((bus < 0) || (bus > 3))
    return -1;

  writeMask = (0x1 << bus);

  return i2cmasterSendOne(slaveAddr, writeMask, true);
}

int i2cswitchDisable(void)
{
  return i2cmasterSendOne(slaveAddr, 0x00, true);
}


static int i2cbusHandler(int argc, char * argv[], int flags)
{
  int retVal = -1;
  int busEntry;
  int bufLen;
  char * pOutBuf;

  pOutBuf = clicharGetOutputBuffer(&bufLen);
  
  if (argc < 2)
    return -1;

  if (*argv[1] == 'd') {
    if (i2cswitchDisable() == 0)
      sprintf(pOutBuf, "i2cbus: bus switch disabled\n");
    else
      sprintf(pOutBuf, "i2cbus: error disabling bus switch\n");
    }
  else {
    
    busEntry = atoi((const char *)argv[1]);

    if ((busEntry < 0) || (busEntry > 3))
      return -1;

    if (i2cswitchSetBus(busEntry) == 0)
      sprintf(pOutBuf, "i2cbus: bus set to [%d]\n", busEntry);
    else
      sprintf(pOutBuf, "i2cbus: error setting bus to [%d]\n", busEntry);

     retVal = 0;
    }
  
  clicharSendOutputBuffer(pOutBuf, bufLen);
    
  return retVal;
}

#endif /* (defined(CONFIG_INCLUDE_LPC210X_I2C) && defined(CONFIG_INCLUDE_I2C_SWITCH)) */
