Dependencies:   mbed

OpenBCI_32bit_Library.h

Committer:
akpc806a
Date:
2017-01-22
Revision:
1:4683702d7ad8

File content as of revision 1:4683702d7ad8:

/*
   insert header here

*/
#ifndef _____OpenBCI_32bit__
#define _____OpenBCI_32bit__


//#include <DSPI.h> // MBED: not needed
//#include <Arduino.h> // MBED: not needed
#include "PlatformDefs.h" // MBED: arduino hardware emulation
#include "Definitions.h"

void __USER_ISR ADS_DRDY_Service(void);
class OpenBCI_32bit_Library {

public:

    // Start up functions
    OpenBCI_32bit_Library();
    boolean accelHasNewData(void);
    void    accelUpdateAxisData(void);
    void    accelWriteAxisData(void);
    void    begin(void);
    void    beginDebug(void);
    boolean beginSecondarySerial(void);
    char    getCharSerial0(void);
    char    getCharSerial1(void);
    boolean hasDataSerial0(void);
    boolean hasDataSerial1(void);


    void    writeSerial(char *data, int len);

    boolean isADSDataAvailable(void);



    void writeTimeCurrent(void);
    void writeZeroAux(void);
    void activateAllChannelsToTestCondition(byte testInputCode, byte amplitudeCode, byte freqCode);

    void channelSettingsArraySetForAll(void);
    void channelSettingsArraySetForChannel(byte N);
    void channelSettingsSetForChannel(byte channelNumber, byte powerDown, byte gain, byte inputType, byte bias, byte srb2, byte srb1);

    void leadOffConfigureSignalForAll(byte amplitudeCode, byte freqCode);
    void leadOffConfigureSignalForTargetSS(byte targetSS, byte amplitudeCode, byte freqCode);

    void leadOffSetForAllChannels(void);
    void leadOffSetForChannel(byte channelNumber, byte pInput, byte nInput);

    boolean processChar(char character);
    void processIncomingBoardMode(char character);
    void processIncomingChannelSettings(char character);
    void processIncomingLeadOffSettings(char character);

    void resetChannelSettingsArrayToDefault(byte channelSettingsArray[][OPENBCI_NUMBER_OF_CHANNEL_SETTINGS]);
    void resetLeadOffArrayToDefault(byte leadOffArray[][OPENBCI_NUMBER_OF_LEAD_OFF_SETTINGS]);

    void sendChannelDataWithAccel(void);
    void sendChannelDataWithRawAux(void);
    void sendChannelDataWithTimeAndAccel(void);
    void sendChannelDataWithTimeAndRawAux(void);

    void streamSafeChannelDeactivate(byte channelNumber);
    void streamSafeChannelActivate(byte channelNumber);
    void streamSafeChannelSettingsForChannel(byte channelNumber, byte powerDown, byte gain, byte inputType, byte bias, byte srb2, byte srb1);
    void streamSafeSetAllChannelsToDefault(void);
    void streamSafeReportAllChannelDefaults(void);
    void streamSafeLeadOffSetForChannel(byte channelNumber, byte pInput, byte nInput);
    void streamSafeTimeSendSyncSetPacket(void);
    void streamStart(void);
    void streamStop(void);

    // OLD CODE REVERT
    void writeChannelSettings();
    void writeChannelSettings(byte N);
    void changeChannelLeadOffDetect();
    void changeChannelLeadOffDetect(byte N);
    void configureLeadOffDetection(byte amplitudeCode, byte freqCode);

    boolean waitForNewChannelData(void);

    // Variables
    boolean daisy;
    boolean sniffMode;
    boolean streaming;
    boolean timeSynced;
    boolean sendTimeSyncUpPacket;
    boolean isProcessingIncomingSettingsChannel;
    boolean isProcessingIncomingSettingsLeadOff;
    boolean settingBoardMode;
    volatile boolean channelDataAvailable;

    boolean isProcessingMultibyteMsg(void);
    boolean isValidBoardType(char c);

    uint8_t curBoardMode;

    int numberOfIncomingSettingsProcessedChannel;
    int numberOfIncomingSettingsProcessedLeadOff;
    char streamPacketType;
    char currentChannelSetting;

    // Getters
    char getChannelCommandForAsciiChar(char asciiChar);
    char getConstrainedChannelNumber(byte channelNumber);
    byte getDefaultChannelSettingForSetting(byte setting);
    char getDefaultChannelSettingForSettingAscii(byte setting);
    char getGainForAsciiChar(char asciiChar);
    char getNumberForAsciiChar(char asciiChar);
    char getTargetSSForConstrainedChannelNumber(byte channelNumber);
    char getYesOrNoForAsciiChar(char asciiChar);

    DSPI0 spi;  // use DSPI library

// BOARD
    boolean useAccel;
    boolean useAux;
    void initialize(void);
    void initializeVariables(void);
    void printAllRegisters(void);
    void sendChannelData(void); // send the current data with sample number


// ADS1299
    void initialize_ads(void);
    void setChannelsToDefault(void);
    void reportDefaultChannelSettings(void);
    void printADSregisters(int);
    void WAKEUP(int);  // get out of low power mode
    void STANDBY(int); // go into low power mode
    void RESET(int);   // set all register values to default
    void START(int);   // start data acquisition
    void STOP(int);    // stop data acquisition
    void RDATAC(int);  // go into read data continuous mode
    void SDATAC(int);  // get out of read data continuous mode
    void RDATA(int);   // read data one-shot
    byte RREG(byte,int);            // read one ADS register
    void RREGS(byte,byte,int);      // read multiple ADS registers
    void WREG(byte,byte,int);       // write one ADS register
    void WREGS(byte,byte,int);      // write multiple ADS registers
    byte ADS_getDeviceID(int);
    void printRegisterName(byte);   // used for verbosity
    void printHex(byte);            // used for verbosity
    void updateChannelData(void);   // retrieve data from ADS
    void updateBoardData(void);
    void updateDaisyData(void);
    byte xfer(byte);        // SPI Transfer function
    void resetADS(int);     // reset all the ADS1299's settings
    void startADS(void);
    void stopADS(void);
    void activateChannel(byte);                  // enable the selected channel
    void deactivateChannel(byte);                // disable given channel 1-8(16)
    void configureInternalTestSignal(byte,byte);

    void changeInputType(byte);

    void ADS_writeChannelData(void);
    // void ADS_printDeviceID(int);   //
    boolean smellDaisy(void);
    void removeDaisy(void);
    void attachDaisy(void);
    void writeAuxData(void);

    short auxData[3];           // This is user faceing
    byte regData[24];           // array is used to mirror register data
    byte lastBoardDataRaw[24];
    byte boardChannelDataRaw[24];    // array to hold raw channel data
    byte meanBoardDataRaw[24];
    byte lastDaisyDataRaw[24];
    byte daisyChannelDataRaw[24];
    byte meanDaisyDataRaw[24];
    int boardStat;           // used to hold the status register
    int daisyStat;
    int boardChannelDataInt[8];    // array used when reading channel data as ints
    int lastBoardChannelDataInt[8];
    int meanBoardChannelDataInt[8];
    int daisyChannelDataInt[8];    // array used when reading channel data as ints
    int lastDaisyChannelDataInt[8];
    int meanDaisyChannelDataInt[8];
    int numChannels;
    byte channelSettings[OPENBCI_NUMBER_OF_CHANNELS_DAISY][OPENBCI_NUMBER_OF_CHANNEL_SETTINGS];  // array to hold current channel settings
    byte defaultChannelSettings[OPENBCI_NUMBER_OF_CHANNEL_SETTINGS];  // default channel settings
    byte leadOffSettings[OPENBCI_NUMBER_OF_CHANNELS_DAISY][OPENBCI_NUMBER_OF_LEAD_OFF_SETTINGS];  // used to control on/off of impedance measure for P and N side of each channel
    boolean useInBias[OPENBCI_NUMBER_OF_CHANNELS_DAISY];        // used to remember if we were included in Bias before channel power down
    boolean useSRB2[OPENBCI_NUMBER_OF_CHANNELS_DAISY];
    boolean boardUseSRB1;             // used to keep track of if we are using SRB1
    boolean daisyUseSRB1;
    boolean verbosity;      // turn on/off Serial verbosity
    boolean daisyPresent;
    boolean firstDataPacket;
    byte sampleCounter;

// LIS3DH
    short axisData[3];
    void initialize_accel(byte);    // initialize
    void enable_accel(byte);  // start acceleromoeter with default settings
    void disable_accel(void); // stop data acquisition and go into low power mode
    byte LIS3DH_getDeviceID(void);
    byte LIS3DH_read(byte);     // read a register on LIS3DH
    void LIS3DH_write(byte,byte);   // write a register on LIS3DH
    int LIS3DH_read16(byte);    // read two bytes, used to get axis data
    int getX(void);
    int getY(void);
    int getZ(void);
    boolean LIS3DH_DataReady(void); // check LIS3DH_DRDY pin
    boolean LIS3DH_DataAvailable(void); // check LIS3DH STATUS_REG2
    void LIS3DH_readAllRegs(void);
    void LIS3DH_writeAxisData(void);
    void LIS3DH_writeAxisDataForAxis(uint8_t axis);
    void LIS3DH_updateAxisData(void);

    void csLow(int);
    void csHigh(int);

    //
    boolean boardBegin(void);
    boolean boardBeginDebug(void);
    boolean boardBeginDebug(int);
    void boardReset(void);
    void ledFlash(int numberOfFlashes);
    void sendEOT(void);

    char buffer[1];

// ADS1299
    boolean isRunning;
// LIS3DH
    int DRDYpinValue;
    int lastDRDYpinValue;

    // Time sync Variables
    unsigned long timeOffset;
    unsigned long timeSetCharArrived;
    unsigned long timeComputer;
    unsigned long timeCurrent;
    // Time sync Methods
    // unsigned long   timeGet(void);
    // void            timeSet(char character);
    void            timeSendSyncSetPacket(void);

};

// This let's us call into the class from within the library if necessary
extern OpenBCI_32bit_Library board;

#endif