#include <leds.h>
#include <stdbool.h>
#include <xc.h>

#define LED_D1_LAT LATCbits.LATC0
#define LED_D2_LAT LATCbits.LATC1
#define LED_D3_LAT LATCbits.LATC2
#define LED_D4_LAT LATCbits.LATC3

#define LED_D1_TRIS TRISCbits.TRISC0
#define LED_D2_TRIS TRISCbits.TRISC1
#define LED_D3_TRIS TRISCbits.TRISC2
#define LED_D4_TRIS TRISCbits.TRISC3

#define LED_ON  1
#define LED_OFF 0

#define PIN_INPUT  1
#define PIN_OUTPUT 0

void LED_On(LED led)
{
    switch(led)
    {
        case LED_D1:
            LED_D1_LAT = LED_ON;
            break;

        case LED_D2:
            LED_D2_LAT = LED_ON;
            break;
			
        case LED_D3:
            LED_D3_LAT = LED_ON;
            break;
			
        case LED_D4:
            LED_D4_LAT = LED_ON;
            break;

        case LED_NONE:
            break;
    }
}

void LED_Off(LED led)
{
    switch(led)
    {
        case LED_D1:
            LED_D1_LAT = LED_OFF;
            break;

        case LED_D2:
            LED_D2_LAT = LED_OFF;
            break;
			
        case LED_D3:
            LED_D3_LAT = LED_OFF;
            break;
			
        case LED_D4:
            LED_D4_LAT = LED_OFF;
            break;

        case LED_NONE:
            break;
    }
}

void LED_Toggle(LED led)
{
    switch(led)
    {
        case LED_D1:
            LED_D1_LAT ^= 1;
            break;

        case LED_D2:
            LED_D2_LAT ^= 1;
            break;
			
        case LED_D3:
            LED_D3_LAT ^= 1;
            break;
			
        case LED_D4:
            LED_D4_LAT ^= 1;
            break;

        case LED_NONE:
            break;
    }
}

bool LED_Get(LED led)
{
    switch(led)
    {
        case LED_D1:
            return ( (LED_D1_LAT == LED_ON) ? true : false );

        case LED_D2:
            return ( (LED_D2_LAT == LED_ON) ? true : false );
			
        case LED_D3:
            return ( (LED_D3_LAT == LED_ON) ? true : false );
			
        case LED_D4:
            return ( (LED_D4_LAT == LED_ON) ? true : false );

        case LED_NONE:
            return false;
    }
    
    return false;
}

void LED_Enable(LED led)
{
    switch(led)
    {
        case LED_D1:
            LED_D1_TRIS = PIN_OUTPUT;
            break;

        case LED_D2:
            LED_D2_TRIS = PIN_OUTPUT;
            break;
			
        case LED_D3:
            LED_D3_TRIS = PIN_OUTPUT;
            break;
			
        case LED_D4:
            LED_D4_TRIS = PIN_OUTPUT;
            break;

        case LED_NONE:
            break;
    }
}
