#include "I2cPWM.h"

// Constructor

I2cPWM::I2cPWM(int handle, int low, int high, int pwm)
{

  i2cHandle = handle;
  bottomValue = low;
  topValue = high;
  pwmNum = pwm;
  avrAddr = 0x0b; // address ov avr chip on the I2C bus

  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;

  middle();

} // I2cPwm

void I2cPWM::sendPacket()
{
  ioctl(i2cHandle, I2C_SLAVE, avrAddr);
  buf[0] = 0;
  buf[1] = sizeof(packet_data);
  memcpy(&buf[2], (void *)&packet_data, sizeof(packet_data));

//cout << "Pulse: " << packet_data.pulse_value << endl;

  if (ioctl(i2cHandle, I2C_RDWR, &packet) < 0)
  {
    cout << "Error writing to avr" << endl;
    exit(1);
  }

} // sendPacket

void I2cPWM::middle()
{
  packet_data.pulse_value = midValue;

  sendPacket();

} // middle

void I2cPWM::increase(int percent)
{
  newValue = midValue + (percent * rangeValue / 100);

  packet_data.pulse_value = newValue;

  sendPacket();

} // increase

void I2cPWM::decrease(int percent)
{
  newValue = midValue - (percent * rangeValue / 100);

  packet_data.pulse_value = newValue;

  sendPacket();

} // decrease
