The sample below works fully on V1, can see events on all the pins and switch between edge and pulse.
// This tests pin events on pins 0,1,2,8 and 12-16.
// Press A for pulse; B for edge.
// Pixels light in columns 3 and 4 when events are detected.
// The pull mode is UP, so connect pins to GND to trigger events.
#include "MicroBit.h"
#ifdef CODAL_CONFIG_H
#define MICROBIT_CODAL 1
#else
#define MICROBIT_CODAL 0
#endif
MicroBit uBit;
void event_init_pin( int eventOn, int pinNumber);
void event_init_on( int eventOn)
{
event_init_pin( eventOn, 0);
event_init_pin( eventOn, 1);
event_init_pin( eventOn, 2);
event_init_pin( eventOn, 8);
event_init_pin( eventOn, 12);
event_init_pin( eventOn, 13);
event_init_pin( eventOn, 14);
event_init_pin( eventOn, 15);
event_init_pin( eventOn, 16);
}
#if MICROBIT_CODAL
PullMode pullMode = PullMode::Up;
#else
PinMode pullMode = PullUp;
#endif
bool eventHigh = false;
bool eventLow = false;
bool eventRise = false;
bool eventFall = false;
void onRise(MicroBitEvent e)
{
eventRise = true;
}
void onFall(MicroBitEvent e)
{
eventFall = true;
}
void onHi(MicroBitEvent e)
{
eventHigh = true;
}
void onLo(MicroBitEvent e)
{
eventLow = true;
}
void onButtonA(MicroBitEvent e)
{
event_init_on( MICROBIT_PIN_EVENT_ON_PULSE);
}
void onButtonB(MicroBitEvent e)
{
event_init_on( MICROBIT_PIN_EVENT_ON_EDGE);
}
void event_init_pin( int eventOn, int pinNumber)
{
int pinID = MICROBIT_ID_IO_P0 + pinNumber;
uBit.io.pin[ pinNumber].setPull( pullMode);
uBit.io.pin[ pinNumber].eventOn( eventOn);
uBit.messageBus.listen( pinID, MICROBIT_PIN_EVT_PULSE_HI, onHi);
uBit.messageBus.listen( pinID, MICROBIT_PIN_EVT_PULSE_LO, onLo);
uBit.messageBus.listen( pinID, MICROBIT_PIN_EVT_RISE, onRise);
uBit.messageBus.listen( pinID, MICROBIT_PIN_EVT_FALL, onFall);
}
void event_init()
{
uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_BUTTON_EVT_CLICK, onButtonA);
uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_BUTTON_EVT_CLICK, onButtonB);
}
void event_fiber()
{
while (true)
{
uBit.display.image.setPixelValue( 3, 0, eventHigh ? 255 : 0);
uBit.display.image.setPixelValue( 3, 4, eventLow ? 255 : 0);
uBit.display.image.setPixelValue( 4, 0, eventRise ? 255 : 0);
uBit.display.image.setPixelValue( 4, 4, eventFall ? 255 : 0);
eventHigh = false;
eventLow = false;
eventRise = false;
eventFall = false;
uBit.sleep(200);
}
}
void togglePixel( int x, int y)
{
uBit.display.image.setPixelValue( x, y, uBit.display.image.getPixelValue( x, y) ? 0 : 255);
}
void forever()
{
while (true)
{
togglePixel( 0, 0);
uBit.sleep(1000);
}
}
int main()
{
// Initialise the micro:bit runtime.
uBit.init();
event_init();
create_fiber( event_fiber);
create_fiber( forever);
// If main exits, there may still be other fibers running or registered event handlers etc.
// Simply release this fiber, which will mean we enter the scheduler. Worse case, we then
// sit in the idle task forever, in a power efficient sleep.
release_fiber();
}