/*
 * init.c
 *
 *  Created on: 17-Nov-2025
 *      Author: muntaha.nazir
 */
#include <can_com.h>
#include "driverlib.h"
#include "device.h"
#include "board.h"
#include "init_buffer.h"
#include <stdint.h>
#include "init_adc.h"
#include "isr.h"
#include "init.h"
#include "i2cLib_FIFO_polling.h"
#define nodeid 0x10174000U
#define nodeid1 0x10274000U
uint32_t ui_d;
uint32_t id_1;
uint32_t id_2;
uint16_t AvailableI2C_targets[20];
uint32_t ControlAddr = 0U;
struct I2CHandle EEPROM;
uint16_t TX_MsgBuffer[MAX_BUFFER_SIZE];
uint16_t  RX_MsgBuffer[MAX_BUFFER_SIZE];
uint16_t fg_EEPROM_Calibrated=1;
float    TX_MsgBuffer_f[MAX_BUFFER_SIZE];
//uint16_t status = 0;
uint16_t on_comand;
   void init_sys(void);
void init_sys(void){

    uint16_t i;
    unitID = ( (GPIO_readPin(myGPIO31) & 0x1) << 0 ) |  // weight 1
             ( (GPIO_readPin(myGPIO34) & 0x1) << 1 ) |  // weight 2
             ( (GPIO_readPin(myGPIO35) & 0x1) << 2 ) |  // weight 4
             ( (GPIO_readPin(myGPIO30) & 0x1) << 3 );   // weight 8
    //unitID=0x4;

    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANRXA);
    GPIO_setPinConfig(DEVICE_GPIO_CFG_CANTXA);
    I2C_GPIO_init();
    // Initialize CAN module
    CAN_initModule(CANA_BASE);
    CAN_setBitRate(CANA_BASE, DEVICE_SYSCLK_FREQ, 500000, 20);
    CAN_startModule(CANA_BASE);
    uid = (unitID & 0x0F);

    id_1 =nodeid | uid ;
    id_2 =(0x10274000U) | uid ;
    CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID1, id_1,
                           CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0,
                           CAN_MSG_OBJ_NO_FLAGS, MSG_DATA_LENGTH);
    CAN_setupMessageObject(CANA_BASE, RX_MSG_OBJ_ID2,id_2 ,
                           CAN_MSG_FRAME_EXT, CAN_MSG_OBJ_TYPE_RX, 0,
                           CAN_MSG_OBJ_NO_FLAGS, MSG_DATA_LENGTH);
    // Register Timer0 ISR
    on_comand = 2;
//    Interrupt_register(INT_TIMER0, &cpuTimer0ISR);
//
//    // Initialize and configure CPU Timer0 for 1 second period
//
//    initCPUTimers();
//    configCPUTimer(CPUTIMER0_BASE, DEVICE_SYSCLK_FREQ, 1000000);
//
//    // Enable Timer0 interrupt
//    CPUTimer_enableInterrupt(CPUTIMER0_BASE);
//    Interrupt_enable(INT_TIMER0);

    //
    // Configure EPWM1 ADC SOCA trigger
    //
    initEPWM();

    // Enable ADC interrupt
    //
    Interrupt_enable(INT_ADCA1);
    // Start Timer0
  //  CPUTimer_startTimer(CPUTIMER0_BASE);

    // Enable global interrupts
    EINT;
    ERTM;
    EPWM_enableADCTrigger(EPWM1_BASE, EPWM_SOC_A);
    EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP);

    I2Cinit();


          // Set EEPROM handle fields (kept same as your code)
          EEPROM.TargetAddr            = 0x50;          // 7-bit EEPROM address
          EEPROM.base                  = I2CA_BASE;
          EEPROM.pControlAddr          = &ControlAddr;
          EEPROM.NumOfAddrBytes        = 2;
          EEPROM.pTX_MsgBuffer         = TX_MsgBuffer;
          EEPROM.pRX_MsgBuffer         = RX_MsgBuffer;
          EEPROM.NumOfAttempts         = 5;
          EEPROM.Delay_us              = 10;
          EEPROM.WriteCycleTime_in_us  = 6000;
            {
                  uint16_t *pAvailableI2C_targets = AvailableI2C_targets;
                  status = I2CBusScan(I2CA_BASE, pAvailableI2C_targets);
              }

              // Clear buffers
              for(i = 0; i < MAX_BUFFER_SIZE; i++)
              {
                  TX_MsgBuffer[i] = 0U;
                  RX_MsgBuffer[i] = 0U;
              }


    }
    void I2C_GPIO_init(void)
    {
        GPIO_setDirectionMode(DEVICE_GPIO_PIN_SDAA, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(DEVICE_GPIO_PIN_SDAA, GPIO_PIN_TYPE_PULLUP);
        GPIO_setQualificationMode(DEVICE_GPIO_PIN_SDAA, GPIO_QUAL_ASYNC);

        GPIO_setDirectionMode(DEVICE_GPIO_PIN_SCLA, GPIO_DIR_MODE_IN);
        GPIO_setPadConfig(DEVICE_GPIO_PIN_SCLA, GPIO_PIN_TYPE_PULLUP);
        GPIO_setQualificationMode(DEVICE_GPIO_PIN_SCLA, GPIO_QUAL_ASYNC);

        GPIO_setPinConfig(DEVICE_GPIO_CFG_SDAA);
        GPIO_setPinConfig(DEVICE_GPIO_CFG_SCLA);
    }

    // I2C peripheral init (kept same style as your code)
    void I2Cinit(void)
    {
        I2C_disableModule(I2CA_BASE);
        I2C_initController(I2CA_BASE, DEVICE_SYSCLK_FREQ, 100000, I2C_DUTYCYCLE_50);
        I2C_setConfig(I2CA_BASE, I2C_CONTROLLER_SEND_MODE);
        I2C_setTargetAddress(I2CA_BASE, 80);     // 0x50 as 7-bit target
        I2C_setOwnAddress(I2CA_BASE, 96);        // I2CA own address
        I2C_disableLoopback(I2CA_BASE);
        I2C_setBitCount(I2CA_BASE, I2C_BITCOUNT_8);
        I2C_setDataCount(I2CA_BASE, 2);
        I2C_setAddressMode(I2CA_BASE, I2C_ADDR_MODE_7BITS);
        I2C_enableFIFO(I2CA_BASE);
        I2C_clearInterruptStatus(I2CA_BASE, I2C_INT_ARB_LOST | I2C_INT_NO_ACK);
        I2C_setFIFOInterruptLevel(I2CA_BASE, I2C_FIFO_TXEMPTY, I2C_FIFO_RX2);
        I2C_enableInterrupt(I2CA_BASE,
                            I2C_INT_ADDR_TARGET | I2C_INT_ARB_LOST |
                            I2C_INT_NO_ACK | I2C_INT_STOP_CONDITION);
        I2C_setEmulationMode(I2CA_BASE, I2C_EMULATION_FREE_RUN);
        I2C_enableModule(I2CA_BASE);
    }
