#include <p33EV256GM102.h>


_FOSCSEL(FNOSC_PRIPLL & IESO_ON); //FNOSC_LPRC debugg:PRIPLL Start with internal fsc and low-power osc. !!!!2bytos adatok konverziója!!!!
_FOSC(POSCMD_HS & OSCIOFNC_OFF & IOL1WAY_OFF & FCKSM_CSECMD); // HS OSC., osc2 clock-out, multiple pps, Clock switching is enabled, Fail-Safe Clock Monitor is disabled
_FWDT(FWDTEN_OFF & WDTPRE_PR32 & WDTPOST_PS1024); //WDT off

#define uInt unsigned int

#define LED_0 LATBbits.LATB0
#define LED_1 LATBbits.LATB1
#define LED_2 LATBbits.LATB2
#define LED_3 LATBbits.LATB3
#define LED_4 LATBbits.LATB4
#define LED_5 LATBbits.LATB5
#define LED_6 LATBbits.LATB6
#define LED_7 LATBbits.LATB7

#define SW_1 PORTBbits.RB12
#define SW_2 PORTBbits.RB12
//#define SW_3 PORTFbits.RF3
#define SW_4 PORTBbits.RB15
#define SW_5 PORTBbits.RB14
#define SW_6 PORTBbits.RB13

#define Trig LATBbits.LATB1
#define SecT LATBbits.LATB0
#define ScopeTr LATBbits.LATB3 


uInt PR2_peiod = 0;
uInt time1ms = 0;
uInt config = 0; // Ehhet nem nyúlhatunk!
uInt configReq = 0; //ezt változhat bárhol
uInt countSW1 = 0;
uInt countSW3 = 0;
uInt countSW4 = 0;
uInt countSW5 = 0;

uInt Miss = 0; //
        // !
uInt MissThDeg3 = 0;
uInt MissThotNum = 0; //
uInt TriggOff = 0;
uInt TriggOffScope = 0;
uInt ms1 = 0;
uInt InpCount = 0;
uInt FirstThothDeg = 0;

void main()
{
    // 120 MHz
    PLLFBD = 58; /* M  = 60  */
    CLKDIVbits.PLLPOST = 0; /* N1 = 2   */
    CLKDIVbits.PLLPRE = 0; /* N2 = 2   */
    OSCTUN = 0;

    /*	Initiate Clock Switch to Primary
        Oscillator with PLL (NOSC= 0x3)*/
    __builtin_write_OSCCONH(0x03);
    __builtin_write_OSCCONL(0x01);

    while (OSCCONbits.COSC != 0x3);

       // PPS - Unlock
    __builtin_write_OSCCONL(0x46);
    __builtin_write_OSCCONL(0x57);
    __builtin_write_OSCCONL(OSCCON & ~(1 << 6));

    RPINR3bits.T2CKR = 30; //RPI30

        // PPS - Lock
    __builtin_write_OSCCONL(0x46);
    __builtin_write_OSCCONL(0x57);
    __builtin_write_OSCCONL(OSCCON | (1 << 6));


    ANSELA = 0x0000;
    ANSELB = 0x0000;

    // pull-up beallitasa a kapcsolora kotott labakon

    CNPUBbits.CNPUB12 = 1;
    CNPUBbits.CNPUB13 = 1;
    CNPUBbits.CNPUB14 = 1;
    CNPUBbits.CNPUB15 = 1;
    TRISB = 0b1111010011000000; //SV 1,2,3

    LED_4 = 0;
    LED_3 = 0;
    LED_2 = 0;
    LED_1 = 0;
    LED_0 = 0;

    //T1
    T1CON = 0;              // Timer reset
    IFS0bits.T1IF = 0;      // Reset Timer1 interrupt flag
    IPC0bits.T1IP = 4;      // Timer1 Interrupt priority level=4
    IEC0bits.T1IE = 1;      // Enable Timer1 interrupt
    PR1 = 7500;             // 60MHz / 8 / 7500 = 1000 1ms.
    T1CONbits.TCS = 0;      // Timer1 Clock= Internal
    T1CONbits.TCKPS = 1;    // 1:8
    T1CONbits.TON = 1;      // Enable Timer1 and start the counter

    //**** T2: ***
    T2CON = 0;              // Timer reset
    IFS0bits.T2IF = 0;      // Reset Timer1 interrupt flag
    IPC1bits.T2IP = 5;      // Timer1 Interrupt priority level=4
    IEC0bits.T2IE = 1;      // Enable Timer1 interrupt

    PR2 = 540;

    T2CONbits.TCS = 1;      // Timer1 Clock= External
    T2CONbits.TCKPS = 0;    // 1:1
    T2CONbits.TON = 1;      // Enable Timer1 and start the counter
   //*************

    //******************************-
    while (1)
    {

        switch (config)
        {
            case 1: PR2_peiod = 8; FirstThothDeg = 0;  break; // 5 fog:  8 lépésenként fog
            case 2: PR2_peiod = 18; FirstThothDeg = 0; break; // 60 fog:    18 lépésenként fog
            case 3: PR2_peiod = 30; FirstThothDeg = 0; break; // 6 fog:    30 lépésenként fog
            case 4: PR2_peiod = 45; FirstThothDeg = 0; break; // 2 fog:    45 lépésenként fog
            case 5: PR2_peiod = 90; FirstThothDeg = 0; break; // 1 fog:    90 lépésenként fog

        }

        //Validálni kell 
        MissThDeg3 = ((Miss * 3) / PR2_peiod) * PR2_peiod;

        if (ms1 == 1)
        {
            ms1 = 0;
            if (SW_4 == 0)
            {
                countSW3++;
                if (countSW3 == 100)
                {
                    countSW3 = 0;
                    if (configReq < 6) configReq++;
                    else configReq = 0;
                }
            }
            else countSW3 = 0;
            if (SW_2 == 0)
            {
                countSW1++;
                if (countSW1 > 100)
                {
                    countSW1 = 0;
                    if (configReq > 0) configReq--;
                    else configReq = 6;
                }
            }
            else countSW1 = 0;

             if (SW_4 == 0)
            {
                countSW4++;
                if (countSW4 == 100)
                {
                    countSW4 = 0;
                    if (MissThotNum < 2) MissThotNum++;
                    else MissThotNum = 0;
                }
            }
            else countSW4 = 0;
            if (SW_5 == 0)
            {
                countSW5++;
                if (countSW5 > 100)
                {
                    countSW5 = 0;
                    if (MissThotNum > 0) MissThotNum--;
                    else MissThotNum = 2;
                }
            }
            else countSW5 = 0;

            //***********************************
            if (time1ms >= 999)
            {
                LED_7 = !LED_7;
                time1ms = 0;
            }
        }
        //***

        //************ 
        int i = 0;
        for (i=0; i<2; i++)
        {
            uInt TMR_Ref = TMR2 - i;
            switch (config)  
            {
                case 0: //
                    if (TMR_Ref == 1770) SecT = 1; // 590°
                break;
                case 1:// 
                    if (TMR_Ref == 1944) SecT = 0; //2160 - 186 - 30
                    if (TMR_Ref == 2004) SecT = 1; //  2160 - 186 + 30
                break;
                case 2:// 6 fog:    1 lépésenként fog
                case 3:// 3 fog:    30 lépésenként fog
                case 4:// 4 fog:     lépésenként fog
                case 5:// 2 fog:    0 lépésenként fog
                break;
                case 6:// 2 fog:      540 lépésenként fog EVO trigger
                    if ((TMR_Ref == 150) || (TMR_Ref == 960)) SecT = 0; //
                    if ((TMR_Ref == 1770) || (TMR_Ref == 495)) SecT = 1; //
                break;
            }
        }

        


    }//main vége
}
//******************************
void __attribute__ ((interrupt, no_auto_psv)) _T1Interrupt (void)
{
    IFS0bits.T1IF = 0;
    time1ms++;
    ms1 = 1; //Jelzés mainnak
}

//******************************
void __attribute__ ((interrupt, no_auto_psv)) _T2Interrupt (void)
{
    IFS0bits.T2IF = 0;
    uInt PRSave = PR2; //Mentjük, hogy ennyin állt TMR2 megszakításkor
    static uInt FHP_Flag = 0;
    //megszüntetni az egyezést!!!Ez alatt ne lépjen TMR2 ??

    if ((PR2 >= 2160) || (FHP_Flag == 1)) //Ha már elértük a 2 kört..
    {
        config = configReq; //
        PR2 = PR2_peiod - (FirstThothDeg * 3);

        TMR2 = 0xFFFF; //törlés

        TriggOffScope = 1080; //
        InpCount = 0;
        if (FHP_Flag == 1)
        {
            FHP_Flag = 0;
            return;
        }
    }
    else
    {
        PR2 = PR2 + PR2_peiod;
        if (PR2 > 2160)
        {
            PR2 = 2160;
            FHP_Flag = 1; //
        }
    }

    //***
    static uInt MissingOccurt = 0;

    if (MissThotNum > 0)
    {
        uInt num = (PR2_peiod * MissThotNum) + MissThDeg3;
        uInt Missing1 = 1080 - num; // 
        uInt Missing2 = 2160 - num;
        if ((PRSave == Missing1) || (PRSave == Missing2)) //
        {
            MissingOccurt = MissThotNum; //
        }
    }

    if (MissingOccurt > 0)
    {
        MissingOccurt--;
    }
    else
    {
        InpCount++;
        switch (config)
        {
            case 0:
                TriggOff = TMR2 + 15; //
            break;
            case 6:
                TriggOff = TMR2 + 210; //
            break;
            default:
                TriggOff = (TMR2 + PR2) / 2; //
            break;
        }
    }
}
//****************************** OTP: ************************************************
const uInt __attribute__((address(0x800F80))) EngineMapFlash1 [64] =
{0,1,2,3,4,5,6,7,8,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
