#include "I2cPWM.h"

// Constructor
I2cPWM::I2cPWM(int handle, int low, int high, int pwm, int delay)
{
  i2cHandle = handle;
  bottomValue = low;
  topValue = high;
  pwmNum = pwm;
  pulseDelay = delay;
  avrAddr = 0x0b; // address of avr chip on the I2C bus
  i2cBusWait = 10;

  midValue = (low + high) / 2;
  rangeValue = (high - low) / 2;

  //setup packet header
  packet_header.i2c_addr = avrAddr;
  packet_header.flags = 0;
  packet_header.len = sizeof(packet_data) + 2;
  packet_header.packet = (char *)&buf[0];

  packet.addr = &packet_header;
  packet.packet_count = 1;

  packet_data.pwm_no = pwmNum;
  packet_data.pulseDelay = pulseDelay;

  middle();
} // I2cPwm

void I2cPWM::sendPacket()
{
  if(ioctl(i2cHandle, I2C_SLAVE, avrAddr))
    cout << "Error slaving avr" << endl;
  usleep(i2cBusWait);

  buf[0] = 0;
  buf[1] = sizeof(packet_data);
  memcpy(&buf[2], (void *)&packet_data, sizeof(packet_data));

  if (ioctl(i2cHandle, I2C_RDWR, &packet) < 0)
  {
    cout << "Error writing to avr" << endl;
  }
  usleep(i2cBusWait);

} // sendPacket

void I2cPWM::middle()
{
  packet_data.pulse_value = midValue;

  sendPacket();
} // middle

void I2cPWM::increase(int percent)
{
  if(percent > 100)
    percent = 100;
  else
    if(percent < 0)
      percent = 0;

  newValue = midValue + (percent * rangeValue / 100);

  packet_data.pulse_value = newValue;

  sendPacket();
} // increase

void I2cPWM::decrease(int percent)
{
  if(percent > 100)
    percent = 100;
  else
    if(percent < 0)
      percent = 0;

  newValue = midValue - (percent * rangeValue / 100);

  packet_data.pulse_value = newValue;

  sendPacket();
} // decrease
