Sample code on how to pass an optional function pointer to a library and set a single pin to either InterruptIn or DigitalOut.

Dependencies:   mbed

This code can be used as a template to create a library where a single pin can be set to either InterruptIn or DigitalOut.
There are 3 ways to instantiate the library (example using the KL25Z board):

// 2 parameters : Only SDA and SCL are declared.
DemoClass sensor(PTE0, PTE1);

// 3 parameters : SDA, SCL and a DigitalOut are declared.
DemoClass sensor(PTE0, PTE1, PTD7);               // SDA, SCL

// 4 parameters : SDA, SCL, InterruptIn and a user function pointer are declared.
DemoClass sensor(PTE0, PTE1, PTD7, &sensor_irq);       // ISR mode

Notice that the 3rd pin declaration switches from DigitalOut to InterruptIn when the user function pointer is added.

DemoClass/DemoClass.cpp

Committer:
frankvnk
Date:
2014-05-03
Revision:
0:0a6e921b085b

File content as of revision 0:0a6e921b085b:

#include "DemoClass.h"

InterruptIn *_irqpin;
DigitalOut *_syncpin;

// Depending on how the ctor is called, irqsync is either set to none, InterruptIn or DigitalOut
DemoClass::DemoClass(PinName sda, PinName scl, PinName irqsync, void (*fptr)(void)) : _i2c(sda, scl)
{
    // When both irqsync and fptr are nonzero, we use InterruptIn: irqsync pin is interrupt input and Attach ISR.
    if((irqsync != NC) && (fptr != NULL))
    {
        _irqpin = new InterruptIn(irqsync);             // Create InterruptIn pin
        _irqpin->fall(this, &DemoClass::_sensorISR);    // Attach falling interrupt to local ISR
        _fptr.attach(fptr);                             // Attach function pointer to user function
    }
    
    // When fptr is not defined, we use DigitalOut: irqsync pin is digital output.
    if((irqsync != NC) && (fptr == NULL))
    {
        _syncpin = new DigitalOut(irqsync);             // Create DigitalOut pin
        _syncpin->write(0);                             // Set pin to 0
    }
}

bool DemoClass::Status(void)
{
    return (1);
}

void DemoClass::_sensorISR(void)
{
   uint8_t statret = Status();        // Read a status register (eg : to clear an interrupt flag).
   _fptr.call();                      // Call the user-ISR
}