#include "DSP2833x_Device.h"
#include "DSP2833x_Examples.h"
#include "hal_sim.h"
#include "riu_common.h"
#include "pos_id.h"
#include "pubit.h"
#include "cycle_task.h"
#include <stdio.h>

// ===================== ȫֱ =====================
unsigned char g_riu_pos_no = 0;
unsigned char g_bus_set_val = 0;
unsigned char g_cpu_bit_result = 0;
unsigned char g_ram_bit_result = 0;
unsigned char g_cycle_flag = 0;
unsigned int g_cmd_buf[CMD_BUF_LEN] = {0};
unsigned int g_data1_buf[DATA1_BUF_LEN] = {0};
float g_analog_output_volt = 0.0f;

// ===================== ʱã30MHz  120MHzƵ =====================
void InitSysClock_120M(void)
{
    EALLOW;
    // PLLƵϵΪ8DIVSEL=2Ƶ  30*8/2 = 120MHz
    SysCtrlRegs.PLLCR.bit.DIV = 8;
    // ȴPLL
    while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1);
    // ÷ƵϵΪ2
    SysCtrlRegs.PLLSTS.bit.DIVSEL = 2;

    // ʱ = Ƶ/2 = 60MHz
    SysCtrlRegs.HISPCP.all = 0x0002;
    // ʱ = Ƶ/4 = 30MHz
    SysCtrlRegs.LOSPCP.all = 0x0004;

    // XINTFڲʱ = Ƶ/2ʱ = Ƶ/4
    XintfRegs.XINTCNF2.bit.XTIMCLK = 0;
    XintfRegs.XINTCNF2.bit.CLKMODE = 1;
    EDIS;
}

// ===================== ʱ0жϷ =====================
interrupt void cpu_timer0_isr(void)
{
    g_cycle_flag = 1;  // ־
    // PIEжӦһж
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP1;
}

// =====================  =====================
void main(void)
{
    // ===== 滷Ԥֵʱ޸ģ =====
    // Ԥλ룺581  RIU1Aλֵɣ
    sim_gpio_a_input = 581UL << 16;
    // Ԥģֵ
    sim_adc_ch1 = 20000;
    sim_adc_ch2 = 30000;
    // ԤCMDʼֵ
    g_cmd_buf[8] = 1;
    // ԤָЧѹ5V
    g_cmd_buf[10] = (1u << 31) | (1u << 30) | 5;

    // ===== ϵͳʼ =====
    InitSysCtrl();
//    InitSysClock_120M();  // Ϊ120MHzƵ
    InitGpio();
    InitPieCtrl();
    IER = 0x0000;
    IFR = 0x0000;
    InitPieVectTable();

    // ===== 󶨶ʱ0ж =====
    EALLOW;
    PieVectTable.TINT0 = &cpu_timer0_isr;
    EDIS;

    // ===== ʼʱ015msж =====
    InitCpuTimers();
    ConfigCpuTimer(&CpuTimer0, 30, 15000); // Ƶ120MHzʱ15000΢=15ms

    // ===== ʹж =====
    PieCtrlRegs.PIEIER1.bit.INTx7 = 1; // ʹPIE17жϣʱ0
    IER |= M_INT1;                     // ʹCPUINT1ж
    EINT;                              // ȫж
    ERTM;

    // ===== ҵ =====
//    printf("=== RIU ===\r\n");

    PosId_Init();      // λʶ
    Bus_Init();        // ߳ʼ
    Pubit_RunAll();    // ϵԼ

    // ===== ʱѭ =====
    StartCpuTimer0();
//    printf("15ms...\r\n");

    while(1)
    {
        // ⵽ڱ־ִһ
        if(g_cycle_flag == 1)
        {
            g_cycle_flag = 0;
            CycleTask_Run();
        }
    }
}
