A nice BLE demo program which allows remote switch of an LED via GATT interface.
Dependencies: BLE_API mbed nRF51822
Fork of BLE_Button by
Diff: bricks/blinker.cpp
- Revision:
- 12:0d0ca44397dd
diff -r 80f2c19ecbce -r 0d0ca44397dd bricks/blinker.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/bricks/blinker.cpp Sat Oct 21 19:55:47 2017 +0000 @@ -0,0 +1,88 @@ +// blinker.cpp - send a morse pattern to LED1 +// +// Function morse() is one way for running LED1 with a blinking sequence using +// a busy wait, until the sequence is completed. +// +// Blinker b; +// b.morse(" x xxx x "); send one time morse sequence, interval = 0.2 +// b.morse(" x xxx x ",0.5); send one time morse sequence, interval = 0.5 +// +// Function morse(o) got the additional feature to stop an ongoing timer based +// blinking sequence. +// +// The alternative is to setup an ever repeating blink sequence via LED1 using +// function blink(), which is non waiting. +// +// Blinker b; +// b.blink(" x xxx x "); repeating blink sequence, interval = 0.2 +// b.blink(" x xxx x ",0.5); repeating blink sequence, interval = 0.5 +// b.blink(); stops blinking sequence +// + +#include "bricks/target.h" +#include "bricks/blinker.h" + +#ifndef LED_INVERTED +# define LED_ON 1 +# define LED_OFF 0 +#else +# define LED_ON 0 +# define LED_OFF 1 +#endif + +#ifndef BLINK_LED +# define BLINK_LED LED1 +#endif + + static DigitalOut led(BLINK_LED); // being used for morse sequence + static Ticker ticker; // triggers periodic callbacks + static const char *pointer = 0; // 0 means morse activity disabled + static const char *sequence = 0; // next morse sequence for repeats + + void Blinker::morse(const char *pattern, double interval) + { + pointer = 0; // disable ticker based blinking + sequence = 0; // set also empty sequence + + for (; *pattern; pattern++) + { + led = (*pattern == ' ') ? LED_OFF : LED_ON; + wait(interval); // busy waiting for interval time + } + } + +// callback for LED1 ticker controlled blinking + + static void cbBlinker(void) // blinker callback + { + if (pointer != 0) + { + if (*pointer == 0) + { + pointer = sequence; // reset pointer to followup sequence + } + + if (*pointer) + { + led = (*pointer++ == ' ') ? LED_OFF : LED_ON; + } + } + } + + void Blinker::blink(const char *pattern, const char* next, double interval) + { + pointer = 0; // stop current activities + led = LED_OFF; // reset led with LED_OFF + + sequence = next; // init morse sequence + + ticker.attach(cbBlinker,interval);// next LED state after every interval + pointer = pattern; // enable callback activty + } + + void Blinker::blink(const char *pattern, double interval) + { + blink(pattern,pattern,interval); + } + + \ No newline at end of file