Solution for Bluetooth SIG hands-on training course

Dependencies:   BLE_API mbed-dev-bin nRF51822-bluetooth-mdw

Dependents:   microbit

Fork of microbit-dal-bluetooth-mdw_starter by Martin Woolley

Revision:
37:b624ae5e94a5
Parent:
36:6837feb07da4
Child:
45:23b71960fe6c
--- a/source/drivers/MicroBitPin.cpp	Wed Jul 13 12:18:15 2016 +0100
+++ b/source/drivers/MicroBitPin.cpp	Wed Jul 13 12:18:16 2016 +0100
@@ -31,8 +31,6 @@
 #include "MicroBitConfig.h"
 #include "MicroBitPin.h"
 #include "MicroBitButton.h"
-#include "MicroBitSystemTimer.h"
-#include "TimedInterruptIn.h"
 #include "DynamicPwm.h"
 #include "ErrorNo.h"
 
@@ -94,11 +92,8 @@
     if (status & IO_STATUS_TOUCH_IN)
         delete ((MicroBitButton *)pin);
 
-    if ((status & IO_STATUS_EVENT_ON_EDGE) || (status & IO_STATUS_EVENT_PULSE_ON_EDGE))
-        delete ((TimedInterruptIn *)pin);
-
     this->pin = NULL;
-    this->status = 0;
+    this->status = status & IO_STATUS_EVENTBUS_ENABLED; //retain event bus status
 }
 
 /**
@@ -140,9 +135,8 @@
 /**
   * Configures this IO pin as a digital input (if necessary) and tests its current value.
   *
-  *
   * @return 1 if this input is high, 0 if input is LO, or MICROBIT_NOT_SUPPORTED
-  *         if the given pin does not have digital capability.
+  *         if the given pin does not have analog capability.
   *
   * @code
   * MicroBitPin P0(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_BOTH);
@@ -156,16 +150,12 @@
         return MICROBIT_NOT_SUPPORTED;
 
     // Move into a Digital input state if necessary.
-    if (!(status & (IO_STATUS_DIGITAL_IN | IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE)))
-    {
+    if (!(status & IO_STATUS_DIGITAL_IN)){
         disconnect();
         pin = new DigitalIn(name,PullDown);
         status |= IO_STATUS_DIGITAL_IN;
     }
 
-    if(status & (IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE))
-        return ((TimedInterruptIn *)pin)->read();
-
     return ((DigitalIn *)pin)->read();
 }
 
@@ -439,174 +429,4 @@
 int MicroBitPin::getAnalogPeriod()
 {
     return getAnalogPeriodUs()/1000;
-}
-
-/**
-  * Configures the pull of this pin.
-  *
-  * @param pull one of the mbed pull configurations: PullUp, PullDown, PullNone, OpenDrain
-  *
-  * @return MICROBIT_NOT_SUPPORTED if the current pin configuration is anything other
-  *         than a digital input, otherwise MICROBIT_OK.
-  */
-int MicroBitPin::setPull(PinMode pull)
-{
-    if ((status & IO_STATUS_DIGITAL_IN))
-    {
-        ((DigitalIn *)pin)->mode(pull);
-        return MICROBIT_OK;
-    }
-
-    if((status & IO_STATUS_EVENT_ON_EDGE) || (status & IO_STATUS_EVENT_PULSE_ON_EDGE))
-    {
-        ((TimedInterruptIn *)pin)->mode(pull);
-        return MICROBIT_OK;
-    }
-
-    return MICROBIT_NOT_SUPPORTED;
-}
-
-/**
-  * This member function manages the calculation of the timestamp of a pulse detected
-  * on a pin whilst in IO_STATUS_EVENT_PULSE_ON_EDGE or IO_STATUS_EVENT_ON_EDGE modes.
-  *
-  * @param eventValue the event value to distribute onto the message bus.
-  */
-void MicroBitPin::pulseWidthEvent(int eventValue)
-{
-    MicroBitEvent evt(id, eventValue, CREATE_ONLY);
-    uint64_t now = evt.timestamp;
-    uint64_t previous = ((TimedInterruptIn *)pin)->getTimestamp();
-
-    if (previous != 0)
-    {
-        evt.timestamp -= previous;
-        evt.fire();
-    }
-
-    ((TimedInterruptIn *)pin)->setTimestamp(now);
-}
-
-/**
-  * Interrupt handler for when an rise interrupt is triggered.
-  */
-void MicroBitPin::onRise()
-{
-    if(status & IO_STATUS_EVENT_PULSE_ON_EDGE)
-        pulseWidthEvent(MICROBIT_PIN_EVT_PULSE_LO);
-
-    if(status & IO_STATUS_EVENT_ON_EDGE)
-        MicroBitEvent(id, MICROBIT_PIN_EVT_RISE);
-}
-
-/**
-  * Interrupt handler for when an fall interrupt is triggered.
-  */
-void MicroBitPin::onFall()
-{
-    if(status & IO_STATUS_EVENT_PULSE_ON_EDGE)
-        pulseWidthEvent(MICROBIT_PIN_EVT_PULSE_HI);
-
-    if(status & IO_STATUS_EVENT_ON_EDGE)
-        MicroBitEvent(id, MICROBIT_PIN_EVT_FALL);
-}
-
-/**
-  * This member function will construct an TimedInterruptIn instance, and configure
-  * interrupts for rise and fall.
-  *
-  * @param eventType the specific mode used in interrupt context to determine how an
-  *                  edge/rise is processed.
-  *
-  * @return MICROBIT_OK on success
-  */
-int MicroBitPin::enableRiseFallEvents(int eventType)
-{
-    // if we are in neither of the two modes, configure pin as a TimedInterruptIn.
-    if (!(status & (IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE)))
-    {
-        disconnect();
-        pin = new TimedInterruptIn(name);
-
-        ((TimedInterruptIn *)pin)->mode(PullDown);
-        ((TimedInterruptIn *)pin)->rise(this, &MicroBitPin::onRise);
-        ((TimedInterruptIn *)pin)->fall(this, &MicroBitPin::onFall);
-    }
-
-    status &= ~(IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE);
-
-    // set our status bits accordingly.
-    if(eventType == MICROBIT_PIN_EVENT_ON_EDGE)
-        status |= IO_STATUS_EVENT_ON_EDGE;
-    else if(eventType == MICROBIT_PIN_EVENT_ON_PULSE)
-        status |= IO_STATUS_EVENT_PULSE_ON_EDGE;
-
-    return MICROBIT_OK;
-}
-
-/**
-  * If this pin is in a mode where the pin is generating events, it will destruct
-  * the current instance attached to this MicroBitPin instance.
-  *
-  * @return MICROBIT_OK on success.
-  */
-int MicroBitPin::disableEvents()
-{
-    if (status & (IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE | IO_STATUS_TOUCH_IN))
-        disconnect();
-
-    return MICROBIT_OK;
-}
-
-/**
-  * Configures the events generated by this MicroBitPin instance.
-  *
-  * MICROBIT_PIN_EVENT_ON_EDGE - Configures this pin to a digital input, and generates events whenever a rise/fall is detected on this pin. (MICROBIT_PIN_EVT_RISE, MICROBIT_PIN_EVT_FALL)
-  * MICROBIT_PIN_EVENT_ON_PULSE - Configures this pin to a digital input, and generates events where the timestamp is the duration that this pin was either HI or LO. (MICROBIT_PIN_EVT_PULSE_HI, MICROBIT_PIN_EVT_PULSE_LO)
-  * MICROBIT_PIN_EVENT_ON_TOUCH - Configures this pin as a makey makey style touch sensor, in the form of a MicroBitButton. Normal button events will be generated using the ID of this pin.
-  * MICROBIT_PIN_EVENT_NONE - Disables events for this pin.
-  *
-  * @param eventType One of: MICROBIT_PIN_EVENT_ON_EDGE, MICROBIT_PIN_EVENT_ON_PULSE, MICROBIT_PIN_EVENT_ON_TOUCH, MICROBIT_PIN_EVENT_NONE
-  *
-  * @code
-  * MicroBitMessageBus bus;
-  *
-  * MicroBitPin P0(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_BOTH);
-  * P0.eventOn(MICROBIT_PIN_EVENT_ON_PULSE);
-  *
-  * void onPulse(MicroBitEvent evt)
-  * {
-  *     int duration = evt.timestamp;
-  * }
-  *
-  * bus.listen(MICROBIT_ID_IO_P0, MICROBIT_PIN_EVT_PULSE_HI, onPulse, MESSAGE_BUS_LISTENER_IMMEDIATE)
-  * @endcode
-  *
-  * @return MICROBIT_OK on success, or MICROBIT_INVALID_PARAMETER if the given eventype does not match
-  *
-  * @note In the MICROBIT_PIN_EVENT_ON_PULSE mode, the smallest pulse that was reliably detected was 85us, around 5khz. If more precision is required,
-  *       please use the InterruptIn class supplied by ARM mbed.
-  */
-int MicroBitPin::eventOn(int eventType)
-{
-    switch(eventType)
-    {
-        case MICROBIT_PIN_EVENT_ON_EDGE:
-        case MICROBIT_PIN_EVENT_ON_PULSE:
-            enableRiseFallEvents(eventType);
-            break;
-
-        case MICROBIT_PIN_EVENT_ON_TOUCH:
-            isTouched();
-            break;
-
-        case MICROBIT_PIN_EVENT_NONE:
-            disableEvents();
-            break;
-
-        default:
-            return MICROBIT_INVALID_PARAMETER;
-    }
-
-    return MICROBIT_OK;
 }
\ No newline at end of file