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:
66:2fc7d7c2fffc
Parent:
65:f7ebabf23e15
--- a/source/drivers/MicroBitPin.cpp	Wed Jul 13 12:18:45 2016 +0100
+++ b/source/drivers/MicroBitPin.cpp	Wed Jul 13 12:18:46 2016 +0100
@@ -57,6 +57,7 @@
     this->id = id;
     this->name = name;
     this->capability = capability;
+    this->pullMode = MICROBIT_DEFAULT_PULLMODE;
 
     // Power up in a disconnected, low power state.
     // If we're unused, this is how it will stay...
@@ -159,7 +160,7 @@
     if (!(status & (IO_STATUS_DIGITAL_IN | IO_STATUS_EVENT_ON_EDGE | IO_STATUS_EVENT_PULSE_ON_EDGE)))
     {
         disconnect();
-        pin = new DigitalIn(name,PullDown);
+        pin = new DigitalIn(name, (PinMode)pullMode);
         status |= IO_STATUS_DIGITAL_IN;
     }
 
@@ -169,6 +170,25 @@
     return ((DigitalIn *)pin)->read();
 }
 
+/**
+ * Configures this IO pin as a digital input with the specified internal pull-up/pull-down configuraiton (if necessary) and tests its current value.
+ *
+ * @param pull one of the mbed pull configurations: PullUp, PullDown, PullNone
+ *
+ * @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.
+ *
+ * @code
+ * MicroBitPin P0(MICROBIT_ID_IO_P0, MICROBIT_PIN_P0, PIN_CAPABILITY_BOTH);
+ * P0.getDigitalValue(PullUp); // P0 is either 0 or 1;
+ * @endcode
+ */
+int MicroBitPin::getDigitalValue(PinMode pull)
+{
+    setPull(pull);
+    return getDigitalValue();
+}
+
 int MicroBitPin::obtainAnalogChannel()
 {
     // Move into an analogue input state if necessary, if we are no longer the focus of a DynamicPWM instance, allocate ourselves again!
@@ -451,6 +471,8 @@
   */
 int MicroBitPin::setPull(PinMode pull)
 {
+    pullMode = pull;
+
     if ((status & IO_STATUS_DIGITAL_IN))
     {
         ((DigitalIn *)pin)->mode(pull);
@@ -528,7 +550,7 @@
         disconnect();
         pin = new TimedInterruptIn(name);
 
-        ((TimedInterruptIn *)pin)->mode(PullDown);
+        ((TimedInterruptIn *)pin)->mode((PinMode)pullMode);
         ((TimedInterruptIn *)pin)->rise(this, &MicroBitPin::onRise);
         ((TimedInterruptIn *)pin)->fall(this, &MicroBitPin::onFall);
     }