Test Program for Multi Adapter

Dependencies:   mbed

Revision:
0:4c6961cb6ccf
Child:
1:b97b4f4e5adb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/edge.cpp	Mon Jan 15 07:53:03 2018 +0000
@@ -0,0 +1,159 @@
+/**
+ * KL25Z UART EDGE 
+ * Temp Sensor test for FRDM-KL25Z and SigFox
+ *****/
+ 
+#include "mbed.h"
+
+#define PIN_AN0 PTB0
+#define PIN_AN1 PTB1
+#define PIN_AN2 PTB2
+#define PIN_AN3 PTB3 
+
+#define PIN_LEDR PTB18
+#define PIN_LEDG PTB19
+#define PIN_LEDB PTD1
+
+#define UART_TX PTE0
+#define UART_RX PTE1
+#define BAUD_RATE 9600
+
+#define MODE_IDLE 0
+#define MODE_ALART 1
+#define MODE_DATA 2
+#define ACK (0x3E)
+// #define ACK (0x06)
+#define TILDE '~'
+
+// R0=5.0, float R1=4.95, float B=3324, float T0=298.15
+#define R0 5.0
+#define R1 4.95
+#define B 3324
+#define T0 298.15
+
+DigitalOut *led_r = 0 ;
+DigitalOut *led_g = 0 ;
+DigitalOut *led_b = 0 ;
+
+AnalogIn *an[4] = { 0, 0, 0, 0 } ;
+#define NUM_ANIN 4
+
+Serial *tty = 0 ;
+
+int mode = MODE_IDLE ;
+
+void init_hardware(void)
+{
+    tty = new Serial(UART_TX, UART_RX, BAUD_RATE) ;
+    led_r = new DigitalOut(PIN_LEDR, 1) ;
+    led_g = new DigitalOut(PIN_LEDG, 1) ;
+    led_b = new DigitalOut(PIN_LEDB, 1) ;
+    an[0] = new AnalogIn(PIN_AN0) ;
+    an[1] = new AnalogIn(PIN_AN1) ;
+    an[2] = new AnalogIn(PIN_AN2) ;
+    an[3] = new AnalogIn(PIN_AN3) ;
+}
+
+void knock(void)
+{
+    uint8_t c = '\r' ;
+    printf("Knocking on the host's door\n") ;
+    printf("Sending 0x%02X\n", c) ;
+//    tty->putc('A') ;
+    tty->putc(c) ;
+    wait(0.5) ;
+}
+
+int wait_ack(void)
+{
+    char c ;
+    printf("Waiting for ACK\n") ;
+    c = tty->getc() ;
+    if (c == ACK) {
+        printf("ACK received\n") ;
+    } else {
+        printf("Unexpected char [0x%02X] received\n", c) ;
+    }
+    return( c ) ;
+}
+
+float getTemp(int n)
+{
+    float result = 0.0 ;
+    float f, raw, rr1, t ;
+    if (an[n]) {
+        f = an[n]->read() ;
+        raw = f * 3.3 ;
+        rr1 = R1 * raw / (3.3 - raw) ;
+        t = 1.0 / (log(rr1 / R0) / B + (1/T0)) ;
+        result = t - 273.15 ;
+    }
+    return( result ) ;
+}
+
+void send_data(void)
+{
+    int i, dummy ;
+    float temp[4] ;
+    int8_t data[10] ;
+    data[0] = TILDE ;
+    for (i = 0 ; i < 4 ; i++ ) {
+        temp[i] = getTemp(i) ; 
+        printf("temp[%d] = %.2f\n", i, temp[i]) ;
+        dummy = 100 * temp[i] ;
+        data[i * 2+1] = (int8_t)(dummy / 100) ;
+        data[i * 2 + 2] = (int8_t)(dummy % 100) ;
+    }
+    data[9] = 0 ;
+    printf("Sending data ...") ;
+    for (i = 0 ; i < 10 ; i++ ) { /* data must be 10bytes including the header */
+        tty->putc(data[i]) ;
+        wait(0.1) ;
+    }
+    printf("Done\n") ;
+}
+
+void doLED(void)
+{
+    switch(mode) {
+    case MODE_IDLE:  *led_r = 1 ; *led_g = 1 ; *led_b = 0 ; break ;
+    case MODE_ALART: *led_r = 0 ; *led_g = 1 ; *led_b = 1 ; break ;
+    case MODE_DATA:  *led_r = 1 ; *led_g = 0 ; *led_b = 1 ; break ;
+    default:         *led_r = 1 ; *led_g = 1 ; *led_b = 1 ; break ;
+    }
+}
+
+int main() {
+    init_hardware() ;
+    printf("Edge Started\n") ;
+    while(1) {
+        doLED() ;
+        switch(mode) {
+        case MODE_IDLE:        
+            knock() ;
+            mode = MODE_ALART ;
+            break ;
+        case MODE_ALART:
+            if (wait_ack() == ACK) {
+                mode = MODE_DATA ;
+            } else {
+                mode = MODE_IDLE ;
+            }
+            break ;
+        case MODE_DATA:
+            send_data() ;
+            wait_ack() ;            
+            mode = MODE_IDLE ;
+            printf("Sleeping ...") ;
+            fflush(stdout) ;
+            wait(20.0) ; /* minimum 15 sec */
+            printf("Done\n") ;
+            break ;
+        default:
+            printf("Unexpected mode [%d]\n", mode) ;
+            mode = MODE_IDLE ;
+            break ;
+        }
+        wait(0.1) ;
+    }
+}