Test Program for Multi Adapter

Dependencies:   mbed

Committer:
Rhyme
Date:
Mon Jan 15 07:53:03 2018 +0000
Revision:
0:4c6961cb6ccf
Child:
1:b97b4f4e5adb
data[0] = TILDE, data[1]..data[9] = data

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Rhyme 0:4c6961cb6ccf 1 /**
Rhyme 0:4c6961cb6ccf 2 * KL25Z UART EDGE
Rhyme 0:4c6961cb6ccf 3 * Temp Sensor test for FRDM-KL25Z and SigFox
Rhyme 0:4c6961cb6ccf 4 *****/
Rhyme 0:4c6961cb6ccf 5
Rhyme 0:4c6961cb6ccf 6 #include "mbed.h"
Rhyme 0:4c6961cb6ccf 7
Rhyme 0:4c6961cb6ccf 8 #define PIN_AN0 PTB0
Rhyme 0:4c6961cb6ccf 9 #define PIN_AN1 PTB1
Rhyme 0:4c6961cb6ccf 10 #define PIN_AN2 PTB2
Rhyme 0:4c6961cb6ccf 11 #define PIN_AN3 PTB3
Rhyme 0:4c6961cb6ccf 12
Rhyme 0:4c6961cb6ccf 13 #define PIN_LEDR PTB18
Rhyme 0:4c6961cb6ccf 14 #define PIN_LEDG PTB19
Rhyme 0:4c6961cb6ccf 15 #define PIN_LEDB PTD1
Rhyme 0:4c6961cb6ccf 16
Rhyme 0:4c6961cb6ccf 17 #define UART_TX PTE0
Rhyme 0:4c6961cb6ccf 18 #define UART_RX PTE1
Rhyme 0:4c6961cb6ccf 19 #define BAUD_RATE 9600
Rhyme 0:4c6961cb6ccf 20
Rhyme 0:4c6961cb6ccf 21 #define MODE_IDLE 0
Rhyme 0:4c6961cb6ccf 22 #define MODE_ALART 1
Rhyme 0:4c6961cb6ccf 23 #define MODE_DATA 2
Rhyme 0:4c6961cb6ccf 24 #define ACK (0x3E)
Rhyme 0:4c6961cb6ccf 25 // #define ACK (0x06)
Rhyme 0:4c6961cb6ccf 26 #define TILDE '~'
Rhyme 0:4c6961cb6ccf 27
Rhyme 0:4c6961cb6ccf 28 // R0=5.0, float R1=4.95, float B=3324, float T0=298.15
Rhyme 0:4c6961cb6ccf 29 #define R0 5.0
Rhyme 0:4c6961cb6ccf 30 #define R1 4.95
Rhyme 0:4c6961cb6ccf 31 #define B 3324
Rhyme 0:4c6961cb6ccf 32 #define T0 298.15
Rhyme 0:4c6961cb6ccf 33
Rhyme 0:4c6961cb6ccf 34 DigitalOut *led_r = 0 ;
Rhyme 0:4c6961cb6ccf 35 DigitalOut *led_g = 0 ;
Rhyme 0:4c6961cb6ccf 36 DigitalOut *led_b = 0 ;
Rhyme 0:4c6961cb6ccf 37
Rhyme 0:4c6961cb6ccf 38 AnalogIn *an[4] = { 0, 0, 0, 0 } ;
Rhyme 0:4c6961cb6ccf 39 #define NUM_ANIN 4
Rhyme 0:4c6961cb6ccf 40
Rhyme 0:4c6961cb6ccf 41 Serial *tty = 0 ;
Rhyme 0:4c6961cb6ccf 42
Rhyme 0:4c6961cb6ccf 43 int mode = MODE_IDLE ;
Rhyme 0:4c6961cb6ccf 44
Rhyme 0:4c6961cb6ccf 45 void init_hardware(void)
Rhyme 0:4c6961cb6ccf 46 {
Rhyme 0:4c6961cb6ccf 47 tty = new Serial(UART_TX, UART_RX, BAUD_RATE) ;
Rhyme 0:4c6961cb6ccf 48 led_r = new DigitalOut(PIN_LEDR, 1) ;
Rhyme 0:4c6961cb6ccf 49 led_g = new DigitalOut(PIN_LEDG, 1) ;
Rhyme 0:4c6961cb6ccf 50 led_b = new DigitalOut(PIN_LEDB, 1) ;
Rhyme 0:4c6961cb6ccf 51 an[0] = new AnalogIn(PIN_AN0) ;
Rhyme 0:4c6961cb6ccf 52 an[1] = new AnalogIn(PIN_AN1) ;
Rhyme 0:4c6961cb6ccf 53 an[2] = new AnalogIn(PIN_AN2) ;
Rhyme 0:4c6961cb6ccf 54 an[3] = new AnalogIn(PIN_AN3) ;
Rhyme 0:4c6961cb6ccf 55 }
Rhyme 0:4c6961cb6ccf 56
Rhyme 0:4c6961cb6ccf 57 void knock(void)
Rhyme 0:4c6961cb6ccf 58 {
Rhyme 0:4c6961cb6ccf 59 uint8_t c = '\r' ;
Rhyme 0:4c6961cb6ccf 60 printf("Knocking on the host's door\n") ;
Rhyme 0:4c6961cb6ccf 61 printf("Sending 0x%02X\n", c) ;
Rhyme 0:4c6961cb6ccf 62 // tty->putc('A') ;
Rhyme 0:4c6961cb6ccf 63 tty->putc(c) ;
Rhyme 0:4c6961cb6ccf 64 wait(0.5) ;
Rhyme 0:4c6961cb6ccf 65 }
Rhyme 0:4c6961cb6ccf 66
Rhyme 0:4c6961cb6ccf 67 int wait_ack(void)
Rhyme 0:4c6961cb6ccf 68 {
Rhyme 0:4c6961cb6ccf 69 char c ;
Rhyme 0:4c6961cb6ccf 70 printf("Waiting for ACK\n") ;
Rhyme 0:4c6961cb6ccf 71 c = tty->getc() ;
Rhyme 0:4c6961cb6ccf 72 if (c == ACK) {
Rhyme 0:4c6961cb6ccf 73 printf("ACK received\n") ;
Rhyme 0:4c6961cb6ccf 74 } else {
Rhyme 0:4c6961cb6ccf 75 printf("Unexpected char [0x%02X] received\n", c) ;
Rhyme 0:4c6961cb6ccf 76 }
Rhyme 0:4c6961cb6ccf 77 return( c ) ;
Rhyme 0:4c6961cb6ccf 78 }
Rhyme 0:4c6961cb6ccf 79
Rhyme 0:4c6961cb6ccf 80 float getTemp(int n)
Rhyme 0:4c6961cb6ccf 81 {
Rhyme 0:4c6961cb6ccf 82 float result = 0.0 ;
Rhyme 0:4c6961cb6ccf 83 float f, raw, rr1, t ;
Rhyme 0:4c6961cb6ccf 84 if (an[n]) {
Rhyme 0:4c6961cb6ccf 85 f = an[n]->read() ;
Rhyme 0:4c6961cb6ccf 86 raw = f * 3.3 ;
Rhyme 0:4c6961cb6ccf 87 rr1 = R1 * raw / (3.3 - raw) ;
Rhyme 0:4c6961cb6ccf 88 t = 1.0 / (log(rr1 / R0) / B + (1/T0)) ;
Rhyme 0:4c6961cb6ccf 89 result = t - 273.15 ;
Rhyme 0:4c6961cb6ccf 90 }
Rhyme 0:4c6961cb6ccf 91 return( result ) ;
Rhyme 0:4c6961cb6ccf 92 }
Rhyme 0:4c6961cb6ccf 93
Rhyme 0:4c6961cb6ccf 94 void send_data(void)
Rhyme 0:4c6961cb6ccf 95 {
Rhyme 0:4c6961cb6ccf 96 int i, dummy ;
Rhyme 0:4c6961cb6ccf 97 float temp[4] ;
Rhyme 0:4c6961cb6ccf 98 int8_t data[10] ;
Rhyme 0:4c6961cb6ccf 99 data[0] = TILDE ;
Rhyme 0:4c6961cb6ccf 100 for (i = 0 ; i < 4 ; i++ ) {
Rhyme 0:4c6961cb6ccf 101 temp[i] = getTemp(i) ;
Rhyme 0:4c6961cb6ccf 102 printf("temp[%d] = %.2f\n", i, temp[i]) ;
Rhyme 0:4c6961cb6ccf 103 dummy = 100 * temp[i] ;
Rhyme 0:4c6961cb6ccf 104 data[i * 2+1] = (int8_t)(dummy / 100) ;
Rhyme 0:4c6961cb6ccf 105 data[i * 2 + 2] = (int8_t)(dummy % 100) ;
Rhyme 0:4c6961cb6ccf 106 }
Rhyme 0:4c6961cb6ccf 107 data[9] = 0 ;
Rhyme 0:4c6961cb6ccf 108 printf("Sending data ...") ;
Rhyme 0:4c6961cb6ccf 109 for (i = 0 ; i < 10 ; i++ ) { /* data must be 10bytes including the header */
Rhyme 0:4c6961cb6ccf 110 tty->putc(data[i]) ;
Rhyme 0:4c6961cb6ccf 111 wait(0.1) ;
Rhyme 0:4c6961cb6ccf 112 }
Rhyme 0:4c6961cb6ccf 113 printf("Done\n") ;
Rhyme 0:4c6961cb6ccf 114 }
Rhyme 0:4c6961cb6ccf 115
Rhyme 0:4c6961cb6ccf 116 void doLED(void)
Rhyme 0:4c6961cb6ccf 117 {
Rhyme 0:4c6961cb6ccf 118 switch(mode) {
Rhyme 0:4c6961cb6ccf 119 case MODE_IDLE: *led_r = 1 ; *led_g = 1 ; *led_b = 0 ; break ;
Rhyme 0:4c6961cb6ccf 120 case MODE_ALART: *led_r = 0 ; *led_g = 1 ; *led_b = 1 ; break ;
Rhyme 0:4c6961cb6ccf 121 case MODE_DATA: *led_r = 1 ; *led_g = 0 ; *led_b = 1 ; break ;
Rhyme 0:4c6961cb6ccf 122 default: *led_r = 1 ; *led_g = 1 ; *led_b = 1 ; break ;
Rhyme 0:4c6961cb6ccf 123 }
Rhyme 0:4c6961cb6ccf 124 }
Rhyme 0:4c6961cb6ccf 125
Rhyme 0:4c6961cb6ccf 126 int main() {
Rhyme 0:4c6961cb6ccf 127 init_hardware() ;
Rhyme 0:4c6961cb6ccf 128 printf("Edge Started\n") ;
Rhyme 0:4c6961cb6ccf 129 while(1) {
Rhyme 0:4c6961cb6ccf 130 doLED() ;
Rhyme 0:4c6961cb6ccf 131 switch(mode) {
Rhyme 0:4c6961cb6ccf 132 case MODE_IDLE:
Rhyme 0:4c6961cb6ccf 133 knock() ;
Rhyme 0:4c6961cb6ccf 134 mode = MODE_ALART ;
Rhyme 0:4c6961cb6ccf 135 break ;
Rhyme 0:4c6961cb6ccf 136 case MODE_ALART:
Rhyme 0:4c6961cb6ccf 137 if (wait_ack() == ACK) {
Rhyme 0:4c6961cb6ccf 138 mode = MODE_DATA ;
Rhyme 0:4c6961cb6ccf 139 } else {
Rhyme 0:4c6961cb6ccf 140 mode = MODE_IDLE ;
Rhyme 0:4c6961cb6ccf 141 }
Rhyme 0:4c6961cb6ccf 142 break ;
Rhyme 0:4c6961cb6ccf 143 case MODE_DATA:
Rhyme 0:4c6961cb6ccf 144 send_data() ;
Rhyme 0:4c6961cb6ccf 145 wait_ack() ;
Rhyme 0:4c6961cb6ccf 146 mode = MODE_IDLE ;
Rhyme 0:4c6961cb6ccf 147 printf("Sleeping ...") ;
Rhyme 0:4c6961cb6ccf 148 fflush(stdout) ;
Rhyme 0:4c6961cb6ccf 149 wait(20.0) ; /* minimum 15 sec */
Rhyme 0:4c6961cb6ccf 150 printf("Done\n") ;
Rhyme 0:4c6961cb6ccf 151 break ;
Rhyme 0:4c6961cb6ccf 152 default:
Rhyme 0:4c6961cb6ccf 153 printf("Unexpected mode [%d]\n", mode) ;
Rhyme 0:4c6961cb6ccf 154 mode = MODE_IDLE ;
Rhyme 0:4c6961cb6ccf 155 break ;
Rhyme 0:4c6961cb6ccf 156 }
Rhyme 0:4c6961cb6ccf 157 wait(0.1) ;
Rhyme 0:4c6961cb6ccf 158 }
Rhyme 0:4c6961cb6ccf 159 }