edge / Mbed 2 deprecated testReed

Dependencies:   libmDot mbed-rtos mbed

Committer:
boddeke
Date:
Thu May 12 13:46:17 2016 +0000
Revision:
0:208bd045dd31
Child:
1:3348d15fefdb
initial checkin

Who changed what in which revision?

UserRevisionLine numberNew contents of line
boddeke 0:208bd045dd31 1 #include "mbed.h"
boddeke 0:208bd045dd31 2 #include "mDot.h"
boddeke 0:208bd045dd31 3 #include "MTSLog.h"
boddeke 0:208bd045dd31 4 #include "MTSText.h"
boddeke 0:208bd045dd31 5
boddeke 0:208bd045dd31 6 using namespace mts;
boddeke 0:208bd045dd31 7
boddeke 0:208bd045dd31 8 #define REED_PORT PA_3
boddeke 0:208bd045dd31 9 Serial pc(USBTX,USBRX);
boddeke 0:208bd045dd31 10 DigitalIn reed_gpio(REED_PORT);
boddeke 0:208bd045dd31 11
boddeke 0:208bd045dd31 12
boddeke 0:208bd045dd31 13 int reed_lock_write = 0;
boddeke 0:208bd045dd31 14 int reed_lock_read = 0;
boddeke 0:208bd045dd31 15 int reed_has_changed = 0;
boddeke 0:208bd045dd31 16 int reed_value = 0;
boddeke 0:208bd045dd31 17 int reed_value_to_send = 0;
boddeke 0:208bd045dd31 18 int reed_value_last_sent = 0;
boddeke 0:208bd045dd31 19
boddeke 0:208bd045dd31 20 void isr_reed_sensor_change(void) {
boddeke 0:208bd045dd31 21
boddeke 0:208bd045dd31 22 while(reed_lock_read) {}
boddeke 0:208bd045dd31 23 reed_lock_write = 1;
boddeke 0:208bd045dd31 24
boddeke 0:208bd045dd31 25 reed_has_changed = 1;
boddeke 0:208bd045dd31 26 reed_value = reed_gpio;
boddeke 0:208bd045dd31 27
boddeke 0:208bd045dd31 28 reed_lock_write = 0;
boddeke 0:208bd045dd31 29 }
boddeke 0:208bd045dd31 30
boddeke 0:208bd045dd31 31 int has_reed_changed(void) {
boddeke 0:208bd045dd31 32
boddeke 0:208bd045dd31 33 int change;
boddeke 0:208bd045dd31 34
boddeke 0:208bd045dd31 35 while(reed_lock_write) {}
boddeke 0:208bd045dd31 36 reed_lock_read = 1;
boddeke 0:208bd045dd31 37
boddeke 0:208bd045dd31 38 change = reed_value_last_sent != reed_value;
boddeke 0:208bd045dd31 39 reed_value_to_send = reed_value;
boddeke 0:208bd045dd31 40 reed_has_changed = 0;
boddeke 0:208bd045dd31 41
boddeke 0:208bd045dd31 42 reed_lock_read = 0;
boddeke 0:208bd045dd31 43
boddeke 0:208bd045dd31 44 return(change);
boddeke 0:208bd045dd31 45 }
boddeke 0:208bd045dd31 46
boddeke 0:208bd045dd31 47 void has_reed_changed_since_last_sent(void) {
boddeke 0:208bd045dd31 48
boddeke 0:208bd045dd31 49 int change;
boddeke 0:208bd045dd31 50
boddeke 0:208bd045dd31 51 has_reed_changed();
boddeke 0:208bd045dd31 52
boddeke 0:208bd045dd31 53 change = reed_value_to_send != reed_value_last_sent;
boddeke 0:208bd045dd31 54
boddeke 0:208bd045dd31 55 return(change);
boddeke 0:208bd045dd31 56 }
boddeke 0:208bd045dd31 57
boddeke 0:208bd045dd31 58 void send_reed(void) {
boddeke 0:208bd045dd31 59
boddeke 0:208bd045dd31 60 reed_value_last_sent = reed_value_to_send;
boddeke 0:208bd045dd31 61
boddeke 0:208bd045dd31 62 pc.printf("Sending REED = %d\r\n",reed_value_to_send);
boddeke 0:208bd045dd31 63 }
boddeke 0:208bd045dd31 64
boddeke 0:208bd045dd31 65
boddeke 0:208bd045dd31 66 int main() {
boddeke 0:208bd045dd31 67
boddeke 0:208bd045dd31 68 mDot* dot;
boddeke 0:208bd045dd31 69 long last_sent = 0;
boddeke 0:208bd045dd31 70
boddeke 0:208bd045dd31 71 pc.attach(&callback,RawSerial::RxIrq);
boddeke 0:208bd045dd31 72 pc.baud(115200);
boddeke 0:208bd045dd31 73
boddeke 0:208bd045dd31 74 pc.printf("\r\n\r\n********************************\r\n");
boddeke 0:208bd045dd31 75 pc.printf( "* *\r\n");
boddeke 0:208bd045dd31 76 pc.printf( "* Edge Reed *\r\n");
boddeke 0:208bd045dd31 77 pc.printf( "* *\r\n");
boddeke 0:208bd045dd31 78 pc.printf( "* Build: " __DATE__ ", " __TIME__" *\r\n");
boddeke 0:208bd045dd31 79 pc.printf( "********************************\r\n\r\n");
boddeke 0:208bd045dd31 80
boddeke 0:208bd045dd31 81 dot = mDot::getInstance();
boddeke 0:208bd045dd31 82
boddeke 0:208bd045dd31 83 InterruptIn *reed_sensor_change;
boddeke 0:208bd045dd31 84 reed_sensor_change = new InterruptIn(REED_PORT);
boddeke 0:208bd045dd31 85 reed_sensor_change->fall(&isr_reed_sensor_change);
boddeke 0:208bd045dd31 86 reed_sensor_change->rise(&isr_reed_sensor_change);
boddeke 0:208bd045dd31 87
boddeke 0:208bd045dd31 88 while (true) {
boddeke 0:208bd045dd31 89
boddeke 0:208bd045dd31 90 int time_since_last_sent = time(NULL) - last_sent;
boddeke 0:208bd045dd31 91
boddeke 0:208bd045dd31 92 if(time_since_last_sent > 60) {
boddeke 0:208bd045dd31 93
boddeke 0:208bd045dd31 94 has_reed_changed();
boddeke 0:208bd045dd31 95 send_reed();
boddeke 0:208bd045dd31 96 last_sent = time(NULL);
boddeke 0:208bd045dd31 97 }
boddeke 0:208bd045dd31 98
boddeke 0:208bd045dd31 99 if(has_reed_changed() && time_since_last_sent>10) {
boddeke 0:208bd045dd31 100
boddeke 0:208bd045dd31 101 Thread::wait(100);
boddeke 0:208bd045dd31 102
boddeke 0:208bd045dd31 103 if(has_reed_changed_since_last_sent()) {
boddeke 0:208bd045dd31 104
boddeke 0:208bd045dd31 105 send_reed();
boddeke 0:208bd045dd31 106 last_sent = time(NULL);
boddeke 0:208bd045dd31 107 }
boddeke 0:208bd045dd31 108 }
boddeke 0:208bd045dd31 109
boddeke 0:208bd045dd31 110 dot->sleep(sleep_time, mDot::RTC_ALARM_OR_INTERRUPT, true);
boddeke 0:208bd045dd31 111 }
boddeke 0:208bd045dd31 112 }