#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 long g_cmd_buf[CMD_BUF_LEN] = {0};
unsigned long 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 = 582UL << 16;
    // Ԥģֵ
    sim_adc_ch1 = 20000;
    sim_adc_ch2 = 30000;

    unsigned long i;

    // ===== ϵͳʼ =====
//    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();        // ߳ʼ
    // ԤCMDʼֵ
    g_cmd_buf[8] = 1;
    // ԤָЧѹ5V
    g_cmd_buf[10] = (1UL << 31) | (1UL << 30) | 5;
    Pubit_RunAll();    // ϵԼ

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

    while(1)
    {
        // ʱģ15msڣ滷רãӰҵ߼
        for(i = 0; i < 30000; i++);
        CycleTask_Run();
    }
}
