Newer
Older
pyenergenie / src / energenie / drv / gpio_sim.c
@David Whale David Whale on 4 Apr 2016 2 KB gpio_sim working on Mac
/* gpio_sim.c  D.J.Whale  04/04/2016
 * 
 * A very simple interface to a simulated GPIO port with minimal platform dependencies.
 */

/***** INCLUDES *****/

#include <stdio.h> // OPTIONAL
#include "gpio.h"


/***** CONFIGURATION *****/

#define GPIO_MAX      20
#define GPIO_DEBUG
//#define GPIO_LOOPBACK


/* Printf is not available on some platforms, or not very efficient.
 * These macros make it possible to re-map I/O to more efficient functions.
 */

#define OUTS(s)  printf("%s", s)
#define OUTN(n)  printf("%d", (unsigned int)n)
#define OUTC(c)  putc(c, stdout)
#define NL()     OUTC('\n')


/***** VARIABLES *****/

static uint8_t gpio_out[GPIO_MAX] = {0};
static uint8_t gpio_in[GPIO_MAX]  = {0};


void gpio_init()
{
  // Nothing to do
}


void gpio_setin(uint8_t g)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:in:%d\n", g);
    OUTS("gpio:in");
    OUTN(g);
    NL();
#endif
}


void gpio_setout(uint8_t g)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:out:%d\n", g);
    OUTS("gpio:out:");
    OUTN(g);
    NL();
#endif
}


void gpio_high(uint8_t g)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:high:%d\n", g);
    OUTS("gpio:high:");
    OUTN(g);
    NL();
#endif

    gpio_out[g] = 1;

#if defined(GPIO_LOOPBACK)
    gpio_in[g] = 1;
#endif
}


void gpio_low(uint8_t g)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:low:%d\n", g);
    OUTS("gpio:low");
    OUTN(g);
    NL();
#endif

    gpio_out[g] = 0;

#if defined(GPIO_LOOPBACK)
    gpio_in[g] = 0;
#endif
}


void gpio_write(uint8_t g, uint8_t v)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:write:%d=%d\n", g, v);
    OUTS("gpio:write:");
    OUTN(g);
    OUTC('=');
    OUTN(v);
    NL();
#endif

    gpio_out[g] = v;

#if defined(GPIO_LOOPBACK)
    gpio_in[g] = v;
#endif
}


uint8_t gpio_read(uint8_t g)
{
#if defined(GPIO_DEBUG)
    //printf("gpio:read:%d=%d\n")
    OUTS("gpio:read:");
    OUTN(g);
    OUTC('=');
    OUTN(gpio_in[g]);
    NL();
#endif
    return gpio_in[g];
}


void gpio_finished(void)
{
    // Nothing to do
}


void gpio_mock_set_in(uint8_t g, uint8_t v)
{
    gpio_in[g] = v;
}


uint8_t gpio_mock_get_out(uint8_t g)
{
    return gpio_out[g];
}


/***** END OF FILE *****/