Sample code on how to pass an optional function pointer to a library and set a single pin to either InterruptIn or DigitalOut.
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 }