Test Program for Multi Adapter

Dependencies:   mbed

Committer:
Rhyme
Date:
Tue Jan 16 07:40:34 2018 +0000
Revision:
3:8038e02a72df
Parent:
2:9f4eff106f89
printf bug fixed

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