/*
 *  PWM_control.h
 *
 *  Created on: 10.07.2024
 *      Author: Hamza
 */

#include <eeprom.h>

// TODO: test this
static I2C_HandleTypeDef* hi2c;
uint32_t write_address, read_address;

void eeprom_init(I2C_HandleTypeDef* handle) {
  hi2c = handle;
  write_address = 0;
  read_address = 0;
}

void eeprom_write_status(){
  uint8_t data_length = 62;
  uint8_t data[data_length] = {};
  
  // data 0-9
  data[0] = ((state.current_state << 4) | (current_powerground_status >> 4));
  data[1] = ((current_powerground_status << 4) | (state.error_source >> 4));        // 4 bit powerground | 4 bit error 
  data[2] = ((state.error_source << 4) | (0));                                      // 4 bit error | 4 bit state of charge
  data[3] = ((int) current_soc);                                                    // 8 bit state of charge
  data[4] = (RELAY_BAT_SIDE_VOLTAGE >> 8);                                          // 16 bit battery voltage
  data[5] = (RELAY_BAT_SIDE_VOLTAGE);                                      
  data[6] = (RELAY_ESC_SIDE_VOLTAGE >> 8);                                          // 16 bit Inverter voltage
  data[7] = (RELAY_ESC_SIDE_VOLTAGE);
  data[8] = (CURRENT_MEASUREMENT >> 8);                                             // 16 bit Inverter voltage
  data[9] = (CURRENT_MEASUREMENT);

  // data 10-35
  for (int i = 0; i < 13; i++) {
    data[(i*2)]  = ((int) module.auxVoltages[i]) >> 8;
    data[(i*2)+1]  = ((int) module.auxVoltages[i]);
  }

  // data 36-61
  for (int i = 0; i < 13; i++) {
    data[(i*2)] = (tmp1075_temps[i]) >> 8;
    data[(i*2)+1] = (tmp1075_temps[i]);
  }
  eeprom_write(data, 62);
  write_address++;
}

HAL_StatusTypeDef eeprom_read(uint8_t* data, uint16_t data_length){
  HAL_StatusTypeDef status = HAL_OK; 
  for (size_t i = 0; i < data_length; i++) {
    if (read_address > EEPROM_MEMORY_SIZE){
      read_address = 0;
      return HAL_BUSY;
    } else if (read_address <= 65535){
      status = HAL_I2C_Mem_Read(
        hi2c, EEPROM_I2C_ADDR,
        read_address, EERROM_MEMORY_ADDR_SIZE,
        &data[i], 1, 10);
    } else if (read_address > 65535) {
        status = HAL_I2C_Mem_Read(
        hi2c, EEPROM_I2C_ADDR + 2,
        read_address - 65535, EERROM_MEMORY_ADDR_SIZE,
        &data[i], 1, 10);
    }
    read_address++; 
  }
  return status;
}

HAL_StatusTypeDef eeprom_write(uint8_t* data, uint16_t data_length){
  HAL_StatusTypeDef status = HAL_OK; 
  HAL_GPIO_WritePin(EEPROM___WC__GPIO_Port, EEPROM___WC__Pin, GPIO_PIN_RESET);
  for (size_t i = 0; i < data_length; i++) {
    if (write_address > EEPROM_MEMORY_SIZE){
      write_address = 0;
      return HAL_BUSY;
    } else if (write_address <= 65535){
      status = HAL_I2C_Mem_Write(
        hi2c, EEPROM_I2C_ADDR,
        write_address, EERROM_MEMORY_ADDR_SIZE,
        &data[i], 1, 10);
      
    } else if (write_address > 65535) {
        status = HAL_I2C_Mem_Write(
        hi2c, EEPROM_I2C_ADDR + 2,
        write_address - 65535, EERROM_MEMORY_ADDR_SIZE,
        &data[i], 1, 10);
    }
    write_address++; 
  }
  HAL_GPIO_WritePin(EEPROM___WC__GPIO_Port, EEPROM___WC__Pin, GPIO_PIN_SET);
  return status;
}