aboutsummaryrefslogtreecommitdiffstats
path: root/examples
diff options
context:
space:
mode:
Diffstat (limited to 'examples')
-rw-r--r--examples/blinky.cpp9
-rw-r--r--examples/exti-interrupt-callback.cpp87
-rw-r--r--examples/exti-interrupt.cpp50
3 files changed, 138 insertions, 8 deletions
diff --git a/examples/blinky.cpp b/examples/blinky.cpp
index fad71f8..751475e 100644
--- a/examples/blinky.cpp
+++ b/examples/blinky.cpp
@@ -6,18 +6,11 @@ void setup() {
pinMode(BOARD_LED_PIN, OUTPUT);
}
-int toggle = 1;
-
void loop() {
- // You could just use toggleLED() instead, but this illustrates
- // the use of digitalWrite():
- digitalWrite(BOARD_LED_PIN, toggle);
- toggle ^= 1;
+ togglePin(BOARD_LED_PIN);
delay(100);
}
-// Force init to be called *first*, i.e. before static object allocation.
-// Otherwise, statically allocated objects that need libmaple may fail.
__attribute__((constructor)) void premain() {
init();
}
diff --git a/examples/exti-interrupt-callback.cpp b/examples/exti-interrupt-callback.cpp
new file mode 100644
index 0000000..c87c064
--- /dev/null
+++ b/examples/exti-interrupt-callback.cpp
@@ -0,0 +1,87 @@
+// Toggles the built-in LED when the built in button
+// on the Maple is pushed in. This uses the attachInterrupt function to
+// setup the interrupt handler for the button being pressed.
+//
+// This is similar to the exti-interrupt example, but shows the use of a class
+// method to handle interrupts.
+//
+// More about attachInterrupt:
+// http://leaflabs.com/docs/lang/api/attachinterrupt.html
+//
+
+
+#include <wirish/wirish.h>
+
+class MyAwesomeClass {
+public:
+ // Setup the interrupt handler
+ void initialize() {
+ // LED is off by default
+ this->isLEDOn = false;
+
+ // Attach interrupt to class method handler
+ attachInterrupt(BOARD_BUTTON_PIN, buttonInterruptHandler, this, RISING);
+ }
+
+private:
+
+ bool isLEDOn;
+
+ // Static event handler takes a void * argument that was originally
+ // passed to the attachInterrupt call. If the argument in question is an
+ // instance of the class (MyAwesomeClass in this case), the static function
+ // get access to that instance's data (even private data).
+ //
+ // In other words, this setup allows the Maple to have class method
+ // interrupt handlers (albeit with a work around).
+ //
+ // However, as you might imagine, this argument can be anything (if you
+ // don't need instance data access).
+ //
+ static void buttonInterruptHandler(void *arg) {
+ // Cast the "generic" void argument to the class instance.
+ MyAwesomeClass *instance = (MyAwesomeClass *)arg;
+
+ // Accessing private instance data
+ instance->isLEDOn = !(instance->isLEDOn);
+
+ // Set LED
+ digitalWrite(BOARD_LED_PIN, instance->isLEDOn);
+
+ // Delay slightly for switch de-bouncing
+ delay(20);
+ }
+};
+
+MyAwesomeClass myClass;
+
+// Setup pin modes and the interrupt handler class
+void setup() {
+ pinMode(BOARD_BUTTON_PIN, INPUT);
+ pinMode(BOARD_LED_PIN, OUTPUT);
+
+ // The initialize method sets up the event handler to the private method
+ // in MyAwesomeClass. There is however, nothing stopping you from setting
+ // up event handlers which are public methods in classes.
+ myClass.initialize();
+}
+
+// Loop. Does nothing in this example.
+void loop() {
+
+}
+
+// Force init to be called *first*, i.e. before static object allocation.
+// Otherwise, statically allocated objects that need libmaple may fail.
+__attribute__((constructor)) void premain() {
+ init();
+}
+
+int main(void) {
+ setup();
+
+ while (true) {
+ loop();
+ }
+ return 0;
+}
diff --git a/examples/exti-interrupt.cpp b/examples/exti-interrupt.cpp
new file mode 100644
index 0000000..89382d7
--- /dev/null
+++ b/examples/exti-interrupt.cpp
@@ -0,0 +1,50 @@
+// Toggles the built-in LED when the built in button
+// on the Maple is pushed in. This uses the attachInterrupt function to
+// setup the interrupt handler for the button being pressed.
+//
+// More about attachInterrupt:
+// http://leaflabs.com/docs/lang/api/attachinterrupt.html
+//
+
+#include <wirish/wirish.h>
+
+// LED is off by default
+bool isLEDOn = false;
+
+// Interrupt handler takes in nothing and returns nothing.
+void interruptHandler() {
+ // Set LED
+ isLEDOn = !isLEDOn;
+ digitalWrite(BOARD_LED_PIN, isLEDOn);
+
+ // Delay slightly for switch debouncing.
+ delay(20);
+}
+
+// Setup pin modes and the interrupt handler
+void setup() {
+ pinMode(BOARD_BUTTON_PIN, INPUT);
+ pinMode(BOARD_LED_PIN, OUTPUT);
+
+ attachInterrupt(BOARD_BUTTON_PIN, interruptHandler, RISING);
+}
+
+// Loop. Does nothing in this example.
+void loop() {
+
+}
+
+// Force init to be called *first*, i.e. before static object allocation.
+// Otherwise, statically allocated objects that need libmaple may fail.
+__attribute__((constructor)) void premain() {
+ init();
+}
+
+int main(void) {
+ setup();
+
+ while (true) {
+ loop();
+ }
+ return 0;
+}