//Stores returned configuration data
//rx_cfg[n][0] = CFGR0
//rx_cfg[n][1] = CFGR1
//rx_cfg[n][2] = CFGR2
//rx_cfg[n][3] = CFGR3
//rx_cfg[n][4] = CFGR4
//rx_cfg[n][5] = CFGR5
//rx_cfg[n][6] = PEC HIGH
//rx_cfg[n][7] = PEC LOW
uint8_t rx_cfg[TOTAL_IC][8];




/////////////////////////////////////////////////////////////////////////////////////////

//set all LTC6804 cell voltage registers to 0xFF
void LTC6804_clrcell()
{
    uint8_t cmd[4];
    uint16_t cmd_pec;

    //load clrcell command into cmd array
    cmd[0] = 0x07;
    cmd[1] = 0x11;

    //calculate PEC
    cmd_pec = LTC68042configure_calcPEC15(2, cmd);
    cmd[2] = (uint8_t)(cmd_pec >> 8);
    cmd[3] = (uint8_t)(cmd_pec );

    LTC68042configure_spiWriteRead(cmd,4,0,0);
}

/////////////////////////////////////////////////////////////////////////////////////////

/*!******************************************************
 \brief Reads configuration registers of a LTC6804 pack

@param[out] uint8_t *r_config: array that the function will write configuration data to. The configuration data for each IC
is stored in blocks of 8 bytes with the configuration data of the lowest IC on the pack in the first 8 bytes
of the array, the second IC in the second 8 byte etc. Below is an table illustrating the array organization:

|r_config[0]|r_config[1]|r_config[2]|r_config[3]|r_config[4]|r_config[5]|r_config[6]  |r_config[7] |r_config[8]|r_config[9]|  .....    |
|-----------|-----------|-----------|-----------|-----------|-----------|-------------|------------|-----------|-----------|-----------|
|IC1 CFGR0  |IC1 CFGR1  |IC1 CFGR2  |IC1 CFGR3  |IC1 CFGR4  |IC1 CFGR5  |IC1 PEC High |IC1 PEC Low |IC2 CFGR0  |IC2 CFGR1  |  .....    |

returns
   0: Data read back has matching PEC
  -1: Data read back has incorrect PEC
********************************************************/
int8_t LTC6804_rdcfg(uint8_t total_ic, uint8_t r_config[][8], uint8_t addr_first_ic)
{
    const uint8_t BYTES_IN_REG = 8;

    uint8_t cmd[4];
    uint8_t *rx_data;
    int8_t pec_error = 0;
    uint16_t data_pec;
    uint16_t received_pec;
    rx_data = (uint8_t *) malloc((8*total_ic)*sizeof(uint8_t));
  
    //Load cmd array with the write configuration command and PEC
    cmd[0] = 0x00;
    cmd[1] = 0x02;
    cmd[2] = 0x2b;
    cmd[3] = 0x0A;
  
    //read configuration of each LTC6804 on the pack
    for (int current_ic = 0; current_ic<total_ic; current_ic++)
    {
        cmd[0] = 0x80 + ( (current_ic + addr_first_ic) <<3); //Setting address
        data_pec = LTC68042configure_calcPEC15(2, cmd);
        cmd[2] = (uint8_t)(data_pec >> 8);
        cmd[3] = (uint8_t)(data_pec);

        LTC68042configure_spiWriteRead(cmd,4,&rx_data[current_ic*8],8);
    }

    for (uint8_t current_ic = 0; current_ic < total_ic; current_ic++) //executes for each LTC6804 in the pack
    {
        //load configuration data into r_config array
        for (uint8_t current_byte = 0; current_byte < BYTES_IN_REG; current_byte++)
        {
            r_config[current_ic][current_byte] = rx_data[current_byte + (current_ic*BYTES_IN_REG)];
        }

        //calculate PEC of received data and compare against calculated PEC
        received_pec = (r_config[current_ic][6]<<8) + r_config[current_ic][7];
        data_pec = LTC68042configure_calcPEC15(6, &r_config[current_ic][0]);
        if (received_pec != data_pec) { pec_error = 1; }
    }
    free(rx_data);

    return(pec_error);
}

/////////////////////////////////////////////////////////////////////////////////////////
