Microcontroller firmware that uses a simple, yet powerful scripting language to control the timing of input and output events with high temporal resolution. Written by Mattias Karlsson

Dependencies:   SMARTWAV mbed

hardwareInterface.h

Committer:
mkarlsso
Date:
2017-02-07
Revision:
7:5fe7329751d4
Parent:
3:d7b0a0890d96
Child:
8:872b843a3053

File content as of revision 7:5fe7329751d4:

#ifndef HARDWARWEINTERFACE_H
#define HARDWARWEINTERFACE_H

#include <stdint.h>
#include <string>
#include <cstdlib>
#include <string.h>

#define PENDINGTRIGGERBUFFERSIZE 10

//#define NUMPORTS 8 //the number of ports available on the hardware

using namespace std;

//for debugging output
//#define DEBUGOUTPUT

//used to organize digital change events
struct changeEvent {
    uint32_t timeStamp;
    bool triggered;
};

class sDigitalOut
{
public:
    sDigitalOut();

    virtual void init(int pin) = 0;
    virtual void write(int value) = 0;
    virtual int read() = 0;
protected:

};

class sAnalogIn
{
public:
    sAnalogIn();

    virtual void init(int pin) = 0;
    virtual int read() = 0;


protected:


};

class sAnalogOut
{
public:
    sAnalogOut();

    virtual void init(int pin) = 0;
    virtual void write(int value) = 0;
    virtual int read() = 0;
protected:

};



class sDigitalIn
{
public:
    sDigitalIn();

    virtual void init(int pin) = 0;
    virtual int read() = 0;
    virtual void interrupt_up_callback() = 0;
    virtual void interrupt_down_callback() = 0;
    void setUpdate(bool);

    changeEvent lastUpEvent;
    changeEvent lastDownEvent;

protected:

    bool updating;
    changeEvent bufferedUpEvent;
    changeEvent bufferedDownEvent;
    void addStateChange(int newState, uint32_t timeStamp);

};

class sSerialPort
{
public:
    sSerialPort();

    virtual void init() = 0;
    virtual bool readable() = 0;
    virtual char readChar() = 0;
    virtual void writeChar(char s)= 0;
    virtual int  requestToWriteString(char *s, int numBytes) = 0;

protected:


};

class sSound
{
public:
    sSound();
    void setFile(string fileNameIn);
    void setVolume(int* volumeIn);
    void setVolume(int volumeIn);
    void setPlayback(bool playIn);
    void setReset();
    virtual void execute() = 0;

protected:
    char fileName[21];
    bool fileNameExists;
    int* volumePtr;
    int volume;
    bool play;
    bool reset;
};

class sSystem
{
public:
    sSystem();
    virtual void timerinit() = 0;
    virtual void setStandAloneClock() = 0;
    virtual void setSlaveClock() = 0;
    virtual sDigitalOut* getDigitalOutPtr(int portNum) = 0;
    virtual sDigitalIn* getDigitalInPtr(int portNum) = 0;
    virtual sAnalogOut* getAnalogOutPtr(int portNum) = 0;
    virtual sAnalogIn* getAnalogInPtr(int portNum) = 0;
    virtual sSound* createNewSoundAction() = 0;
    virtual void externalClockReset() = 0; //needs to reset harware timer before calling immediateClockReset();
    virtual void incrementClock() = 0;
    virtual void mainLoopToDo();
    virtual void pauseInterrupts();
    virtual void resumeInterrupts();
    virtual void reset();
    virtual int getPendingFunctionTriggers(uint16_t *bufferPtr); //Returns the number of pending shortcut triggers
    virtual uint32_t getDigitalOutputChangeFlags();
    virtual uint32_t getDigitalInputChangeFlags();
    void setPortUpdatesOn(int portNum);
    void setPortUpdatesOff(int portNum);
    bool* getIgnoreUpdates();



protected:

    //virtual void timerInterrupt() = 0;

    void immediateClockReset();   
    int currentDINPin;
    int currentDOUTPin;
    uint32_t currentDigitalOuputStates;
    uint32_t currentDigitalInputStates;
    bool ignorePortUpdates[32];




};


//Used to buffer output text. Used mainly for 'display' commands within the script,
//and alloed the reset of the block to execute quickly instead.  The text is then streamed out
//slowly via serial (one character per main loop execution). outputStream is a simple circular
//buffer that cannot be resized after initiation.
class outputStream {

public:
    outputStream(int bufferSizeIn);
    ~outputStream();
    void setSerial(sSerialPort *s);
    void send(const string &outputString);
    void send(const char* s);
    void debug(const char* s);
    outputStream &operator<<(const string &outputString);
    outputStream &operator<<(int outputNum);
    outputStream &operator<<(uint32_t outputNum);
    outputStream &operator<<(const char* s);
    char getNextChar();
    bool unsentData;
    void flush();

private:
    int readHead;
    int writeHead;
    int totalWriteHead;
    int totalReadHead;
    int bufferSize;
    char tmpOut;
    char* outputBuffer;
    sSerialPort* serialPtr;
};



#endif // HARDWARWEINTERFACE_H