#include "EPI_8S27P.h"

int epiSetState(int port, EPI_STATE state, EPI_BATTERY_DATA *battery)
{
  char cmd[4];

  switch (state)
    {
    case EPI_CHARGE :
      ret = sendStr(port,"@AC\0");
      break;
    case EPI_OFF :
      ret = sendStr(port,"@AF\0");
      break;
    case EPI_DISCHARGE :
      ret = sendStr(port,"@AD\0");
      break;
    case EPI_RESET_COULOMB_CNT :
      ret = sendStr(port,"@AH\0");
      break;
    default:
      fprintf(STDERR, "unknown battery state: %d\n", state);
      return -1;
    }
  if (ret) {
    battery->state = state;
  }
  return ret;
}

int epiQueryState (int port, EPI_BATTERY_DATA *batInfo)
{
  char response[80], *resp;
  short sval;
  char cval;
  int status;

  sendStr(batteryPort,"@RQ");
  status = recvStr(port, response, 80);
  if (status == NUM_STATUS_BYTES) {
    resp = response;

    //read gas guage
    sscanf(resp, "%4x", &sval);
    batInfo->gasGauge = (float)sval/100.0;
    resp +=4;

    //read cell voltage
    for (i=0; i<8; i++) {
      sscanf(resp, "%4x", &sval);
      batInfo->cellVoltage[i] = (float)sval/1000.0;
      resp +=4;
    }

    //read current
    sscanf(resp, "%4x", &sval);
    batInfo->current = (float)sval/100.0;
    resp +=4;

    //read temp sensors
    for (i=0; i<9; i++) {
      sscanf(resp, "%2x", &cval);
      batInfo->temp[i] = (float)cval;
      resp +=2;
    }

    //read humidity
    sscanf(resp, "%2x", &cval);
    batInfo->rH = (float)sval/100.0;
    resp +=2;

    //read balance register
    sscanf(resp, "%2x", &cval);
    batInfo->balance = (float)sval/100.0;
    resp +=2;

    //read temp alert register
    sscanf(resp, "%4x", &sval);
    batInfo->tempAlert = sval;
    resp +=4;

    //read voltage alert register
    sscanf(resp, "%4x", &sval);
    batInfo->voltAlert = sval;
    resp +=4;

    //read battery state register
    sscanf(resp, "%4x", &sval);
    batInfo->state = sval;
    resp +=4;

    //fill in stack voltage as sum of cell voltages
    batInfo->stackVoltage =
      batInfo->cellVoltage[0] + batInfo->cellVoltage[1] +
      batInfo->cellVoltage[2] + batInfo->cellVoltage[3] +
      batInfo->cellVoltage[4] + batInfo->cellVoltage[5] +
      batInfo->cellVoltage[6] + batInfo->cellVoltage[7];

    return 1;
  } else {
    printf("ERROR - readStr() call returned failure\n");
    return -3;
  }
}
