/*
 * My_gpio.cpp
 *
 *  Created on: Nov 19, 2015
 *      Author: Jason
 */

#include "My_gpio.hpp"

void My_gpio::set_gpio_mode( uint8_t port, uint8_t pin, bool mode ) {
    if ( mode == OUTPUT ) {
        switch ( port ) {
            case 0 : LPC_GPIO0->FIODIR |= ( 1 << pin ); break;
            case 1 : LPC_GPIO1->FIODIR |= ( 1 << pin ); break;
            case 2 : LPC_GPIO2->FIODIR |= ( 1 << pin ); break;
        }
    }
    else if ( mode == INPUT ) {
        switch ( port ) {
            case 0 : LPC_GPIO0->FIODIR &= ~( 1 << pin ); break;
            case 1 : LPC_GPIO1->FIODIR &= ~( 1 << pin ); break;
            case 2 : LPC_GPIO2->FIODIR &= ~( 1 << pin ); break;
        }
    }
}

void My_gpio::digital_write( uint8_t port, uint8_t pin, bool state ) {
    if ( state == HIGH_V ) {
        switch ( port ) {
            case 0 : LPC_GPIO0->FIOSET |= ( 1 << pin ); break;
            case 1 : LPC_GPIO1->FIOSET |= ( 1 << pin ); break;
            case 2 : LPC_GPIO2->FIOSET |= ( 1 << pin ); break;
        }
    }
    if ( state == LOW_V ) {
        switch ( port ) {
            case 0 : LPC_GPIO0->FIOCLR |= ( 1 << pin ); break;
            case 1 : LPC_GPIO1->FIOCLR |= ( 1 << pin ); break;
            case 2 : LPC_GPIO2->FIOCLR |= ( 1 << pin ); break;
        }
    }
}

/* Assuming active high input */
bool My_gpio::digital_read( uint8_t port, uint8_t pin ) {
    bool active = false;
    switch ( port ) {
        case 0 : active = ( LPC_GPIO0->FIOPIN & ( 1 << pin ) ); break;
        case 1 : active = ( LPC_GPIO1->FIOPIN & ( 1 << pin ) ); break;
        case 2 : active = ( LPC_GPIO2->FIOPIN & ( 1 << pin ) ); break;
    }
    return active;
}


