edge / Mbed 2 deprecated testReed

Dependencies:   libmDot mbed-rtos mbed

Revision:
3:23fae3efa1c0
Parent:
2:5318600ca0fe
Child:
4:0fb159501a04
--- a/main.cpp	Mon May 16 20:16:37 2016 +0000
+++ b/main.cpp	Thu May 19 07:42:49 2016 +0000
@@ -1,4 +1,5 @@
 #include "mbed.h"
+#include "rtos.h"
 #include "mDot.h"
 #include "MTSLog.h"
 #include "MTSText.h"
@@ -8,40 +9,37 @@
 #define MIN(a,b) (((a)<(b))?(a):(b))
 #define MAX(a,b) (((a)>(b))?(a):(b))
 
-#define REED_PORT   PA_3
+// http://www.multitech.net/developer/forums/topic/mdot-pinout-associate-and-onsleep/
+// Keep in mind that if you want to put the device in deepsleep mode
+// and wake up with an interrupt, pin D3/XBEE_CTS/XBEE_DIO7/PA_0 is
+// the only pin that can be used.
+
+#define REED_PORT   PA_0
 #define MINIMAL_SECONDS_BETEEN_CONTACT      10
 #define MAXIMAL_SECONDS_BETEEN_CONTACT      60
 
-//Serial pc(USBTX,USBRX);
-RawSerial pc(USBTX,USBRX);
+// https://developer.mbed.org/users/mbed_official/code/mbed/docs/252557024ec3/classmbed_1_1RawSerial.html
+RawSerial pc(PA_2,NC);
+//RawSerial pc(USBTX,USBRX);
 DigitalIn reed_gpio(REED_PORT);
 
 
-int reed_lock_write = 0;
-int reed_lock_read = 0;
-int reed_has_changed = 0;
+
+volatile int reed_has_changed = 0;
 int reed_value_to_send = 0;
 int reed_value_last_sent = 0;
 int reed_gpio_value = 0;
 
  void isr_reed_sensor_change(void) {
-
-    while(reed_lock_read) {}
-    reed_lock_write = 1;
-    reed_has_changed = 1;
-    reed_lock_write = 0;
+    reed_has_changed++;
 }
 
 int has_reed_changed(void) {
     
     int change;
     
-    while(reed_lock_write) {}
-    reed_lock_read = 1;
     change = reed_has_changed;
     reed_has_changed = 0;
-    reed_lock_read = 0;
-
     reed_gpio_value = reed_gpio.read();
 
     return(change);
@@ -52,7 +50,6 @@
     int change;
 
     has_reed_changed();
-    reed_gpio_value = reed_gpio.read();
     
     change = reed_gpio_value != reed_value_last_sent;
     
@@ -63,7 +60,7 @@
 
 void send_reed(void) {
     
-    reed_value_last_sent = reed_gpio_value;
+    reed_value_last_sent = reed_gpio.read();
     
     pc.printf("%d: Sending REED = %d\r\n",time(NULL),reed_value_last_sent);
     
@@ -86,14 +83,32 @@
     pc.printf(        "* Build: " __DATE__ ", " __TIME__" *\r\n");
     pc.printf(        "********************************\r\n\r\n");
 
+    reed_gpio.mode(PullUp);
+
+    for(int i=0;i<10;i++) {
+        pc.printf("before mdot: %d (%d)\r\n",reed_gpio.read(),reed_has_changed);
+        Thread::wait(1000);
+    }
+        
     dot = mDot::getInstance();
     dot->setLogLevel(MTSLog::TRACE_LEVEL);
 
+    for(int i=0;i<10;i++) {
+        pc.printf("after mdot %d (%d)\r\n",reed_gpio.read(),reed_has_changed);
+        Thread::wait(1000);
+    }
+    
     InterruptIn *reed_sensor_change;
     reed_sensor_change = new InterruptIn(REED_PORT);
     reed_sensor_change->fall(&isr_reed_sensor_change);
     reed_sensor_change->rise(&isr_reed_sensor_change);
+    reed_sensor_change->mode(PullUp);
      
+    for(int i=0;i<10;i++) {
+        pc.printf("after int %d (%d)\r\n",reed_gpio.read(),reed_has_changed);
+        Thread::wait(1000);
+    }
+        
     while (true) {
         
         int wakeup_time = last_sent + MAXIMAL_SECONDS_BETEEN_CONTACT;
@@ -149,7 +164,7 @@
         
         Thread::wait(10);
         
-        dot->sleep(sleep_time, mDot::RTC_ALARM_OR_INTERRUPT, false);
+        dot->sleep(sleep_time, mDot::RTC_ALARM_OR_INTERRUPT, true);
         
         pc.printf("%d: Woke up\r\n",time(NULL));
     }