// simulator.h
// Lets Arduino RadioHead sketches run within a simulator on Linux as a single process
// Copyright (C) 2014 Mike McCauley
// $Id: simulator.h,v 1.4 2015/08/13 02:45:47 mikem Exp mikem $

#ifndef simulator_h
#define simulator_h

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdint.h>

// Equivalent types for common Arduino types like uint8_t are in stdint.h

// Access to some globals
// Command line args passed to the process.
extern int    _simulator_argc;
extern char** _simulator_argv;

// Definitions for various Arduino functions
extern void delay(unsigned long ms);
extern unsigned long millis();
extern long random(long to);
extern long random(long from, long to);

// Equavalent to HardwareSerial in Arduino
// but outputs to stdout
class SerialSimulator {
  public:
#define DEC 10
#define HEX 16
#define OCT 8
#define BIN 2

    // TODO: move these from being inlined
    void begin(int baud) {}

    size_t println(const char* s) {
        print(s);
        return printf("\n");
    }
    size_t print(const char* s) {
        return printf("%s", s); // This style prevent warnings from [-Wformat-security]
    }
    size_t print(unsigned int n, int base = DEC) {
        if (base == DEC) {
            return printf("%d", n);
        } else if (base == HEX) {
            return printf("%02x", n);
        } else if (base == OCT) {
            return printf("%o", n);
        }
        // TODO: BIN
        else {
            return 0;
        }
    }
    size_t print(char ch) {
        return printf("%c", ch);
    }
    size_t println(char ch) {
        return printf("%c\n", ch);
    }
    size_t print(unsigned char ch, int base = DEC) {
        return print((unsigned int)ch, base);
    }
    size_t println(unsigned char ch, int base = DEC) {
        print((unsigned int)ch, base);
        return printf("\n");
    }

};

// Global instance of the Serial output
extern SerialSimulator Serial;

#endif
