Lancaster University's (short term!) clone of mbed-src for micro:bit. This is a copy of the github branch https://github.com/lancaster-university/mbed-classic

Fork of mbed-src by mbed official

Revision:
15:4892fe388435
Parent:
13:0645d8841f51
Child:
35:371630885ad6
--- a/common/InterruptIn.cpp	Mon Aug 05 14:54:27 2013 +0000
+++ b/common/InterruptIn.cpp	Wed Aug 07 16:43:59 2013 +0300
@@ -36,22 +36,58 @@
     gpio_mode(&gpio, pull);
 }
 
-void InterruptIn::rise(void (*fptr)(void)) {
+pFunctionPointer_t InterruptIn::rise(void (*fptr)(void)) {
+    pFunctionPointer_t pf = NULL;
+    _rise.clear();
     if (fptr) {
-        _rise.attach(fptr);
+        pf = _rise.add(fptr);
         gpio_irq_set(&gpio_irq, IRQ_RISE, 1);
     } else {
         gpio_irq_set(&gpio_irq, IRQ_RISE, 0);
     }
+    return pf;
+}
+
+pFunctionPointer_t InterruptIn::rise_add_common(void (*fptr)(void), bool front) {
+    if (NULL == fptr)
+        return NULL;
+    pFunctionPointer_t pf = front ? _rise.add_front(fptr) : _rise.add(fptr);
+    gpio_irq_set(&gpio_irq, IRQ_RISE, 1);
+    return pf;
 }
 
-void InterruptIn::fall(void (*fptr)(void)) {
+bool InterruptIn::rise_remove(pFunctionPointer_t pf) {
+    bool res = _rise.remove(pf);
+    if (res && _rise.size() == 0)
+        gpio_irq_set(&gpio_irq, IRQ_RISE, 0);
+    return res;
+}
+
+pFunctionPointer_t InterruptIn::fall(void (*fptr)(void)) {
+    pFunctionPointer_t pf = NULL;
+    _fall.clear();
     if (fptr) {
-        _fall.attach(fptr);
+        pf = _fall.add(fptr);
         gpio_irq_set(&gpio_irq, IRQ_FALL, 1);
     } else {
         gpio_irq_set(&gpio_irq, IRQ_FALL, 0);
     }
+    return pf;
+}
+
+pFunctionPointer_t InterruptIn::fall_add_common(void (*fptr)(void), bool front) {
+    if (NULL == fptr)
+        return NULL;
+    pFunctionPointer_t pf = front ? _fall.add_front(fptr) : _fall.add(fptr);
+    gpio_irq_set(&gpio_irq, IRQ_FALL, 1);
+    return pf;
+}
+
+bool InterruptIn::fall_remove(pFunctionPointer_t pf) {
+    bool res = _fall.remove(pf);
+    if (res && _fall.size() == 0)
+        gpio_irq_set(&gpio_irq, IRQ_FALL, 0);
+    return res;
 }
 
 void InterruptIn::_irq_handler(uint32_t id, gpio_irq_event event) {