Test Program for Multi Adapter

Dependencies:   mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers edge.cpp Source File

edge.cpp

00001 /**
00002  * KL25Z UART EDGE 
00003  * Temp Sensor test for FRDM-KL25Z and SigFox
00004  *****/
00005  
00006 #include "mbed.h"
00007 
00008 #define PIN_AN0     PTB0
00009 #define PIN_AN1     PTB1
00010 #define PIN_AN2     PTB2
00011 #define PIN_AN3     PTB3 
00012 
00013 #define PIN_LEDR    PTB18
00014 #define PIN_LEDG    PTB19
00015 #define PIN_LEDB    PTD1
00016 
00017 #define UART_TX     PTE0
00018 #define UART_RX     PTE1
00019 #define BAUD_RATE   9600
00020 
00021 #define MODE_IDLE   0
00022 #define MODE_ALART  1
00023 #define MODE_DATA   2
00024 #define ACK         (0x3E)
00025 // #define ACK (0x06)
00026 #define TILDE       '~'
00027 #define CR          '\r'
00028 #define DOT         '.'
00029 #define SPACE       ' '
00030 
00031 // R0=5.0, float R1=4.95, float B=3324, float T0=298.15
00032 #define R0          5.0
00033 #define R1          4.95
00034 #define B           3324
00035 #define T0          298.15
00036 
00037 DigitalOut *led_r = 0 ;
00038 DigitalOut *led_g = 0 ;
00039 DigitalOut *led_b = 0 ;
00040 
00041 AnalogIn *an[4] = { 0, 0, 0, 0 } ;
00042 #define NUM_ANIN 4
00043 
00044 Serial *tty = 0 ;
00045 
00046 int mode = MODE_IDLE ;
00047 
00048 void init_hardware(void)
00049 {
00050     tty = new Serial(UART_TX, UART_RX, BAUD_RATE) ;
00051     led_r = new DigitalOut(PIN_LEDR, 1) ;
00052     led_g = new DigitalOut(PIN_LEDG, 1) ;
00053     led_b = new DigitalOut(PIN_LEDB, 1) ;
00054     an[0] = new AnalogIn(PIN_AN0) ;
00055     an[1] = new AnalogIn(PIN_AN1) ;
00056     an[2] = new AnalogIn(PIN_AN2) ;
00057     an[3] = new AnalogIn(PIN_AN3) ;
00058 }
00059 
00060 void knock(void)
00061 {
00062     uint8_t c = CR ;
00063     printf("Knocking on the host's door\n") ;
00064     printf("Sending 0x%02X\n", c) ;
00065     tty->putc(c) ;
00066     wait(0.5) ;
00067 }
00068 
00069 int wait_ack(void)
00070 {
00071     char c = 0xFF ;
00072     printf("Waiting for ACK ") ;
00073     for (int i = 0 ; i < 3 ; i++ ) {
00074         if (tty->readable()) {
00075             c = tty->getc() ;
00076         } else {
00077             printf(".") ;
00078         }
00079         wait(1) ;
00080     }
00081     printf(" ") ;
00082     if (c == ACK) {
00083         printf("ACK received\n") ;
00084     } else {
00085         printf("Unexpected char [0x%02X] received\n", c) ;
00086     }
00087     return( c ) ;
00088 }
00089 
00090 float getTemp(int n)
00091 {
00092     float result = 0.0 ;
00093     float f, raw, rr1, t ;
00094     if (an[n]) {
00095         f = an[n]->read() ;
00096  // printf("AN[%d] = %.2f\n",n, f) ;
00097         raw = f * 3.3 ;
00098         rr1 = R1 * raw / (3.3 - raw) ;
00099         t = 1.0 / (log(rr1 / R0) / B + (1/T0)) ;
00100         result = t - 273.15 ;
00101     }
00102     return( result ) ;
00103 }
00104 
00105 void send_data(void)
00106 {
00107     int i, dummy ;
00108     float temp[4] ;
00109     int8_t data[10] ;
00110     data[0] = TILDE ;
00111     for (i = 0 ; i < 4 ; i++ ) {
00112         temp[i] = getTemp(i) ; 
00113         printf("temp[%d] = %.2f\n", i, temp[i]) ;
00114         dummy = (int)(100.0 * temp[i] + 0.5)  ;
00115         data[i * 2 + 1] = (int8_t)(dummy / 100) ;
00116         data[i * 2 + 2] = (int8_t)(dummy % 100) ;
00117     }
00118     data[9] = 0 ;
00119     printf("Sending data ...") ;
00120     for (i = 0 ; i < 10 ; i++ ) { /* data must be 10bytes including the header */
00121         tty->putc(data[i]) ;
00122         wait(0.1) ;
00123     }
00124     printf("Done\n") ;
00125 }
00126 
00127 void doLED(void)
00128 {
00129     switch(mode) {
00130     case MODE_IDLE:  *led_r = 1 ; *led_g = 1 ; *led_b = 0 ; break ;
00131     case MODE_ALART: *led_r = 0 ; *led_g = 1 ; *led_b = 1 ; break ;
00132     case MODE_DATA:  *led_r = 1 ; *led_g = 0 ; *led_b = 1 ; break ;
00133     default:         *led_r = 1 ; *led_g = 1 ; *led_b = 1 ; break ;
00134     }
00135 }
00136 
00137 int main() {
00138     init_hardware() ;
00139     printf("Edge Started\n") ;
00140     while(1) {
00141         doLED() ;
00142         switch(mode) {
00143         case MODE_IDLE:        
00144             knock() ;
00145             mode = MODE_ALART ;
00146             break ;
00147         case MODE_ALART:
00148             if (wait_ack() == ACK) {
00149                 mode = MODE_DATA ;
00150             } else {
00151                 mode = MODE_IDLE ;
00152             }
00153             break ;
00154         case MODE_DATA:
00155             send_data() ;
00156             wait_ack() ;            
00157             mode = MODE_IDLE ;
00158             printf("Sleeping ...") ;
00159             fflush(stdout) ;
00160             wait(20.0) ; /* minimum 15 sec */
00161             printf("Done\n") ;
00162             break ;
00163         default:
00164             printf("Unexpected mode [%d]\n", mode) ;
00165             mode = MODE_IDLE ;
00166             break ;
00167         }
00168         wait(0.1) ;
00169     }
00170 }