Motoo Tanaka
/
KL25Z_UART_EDGE_180116
Test Program for Multi Adapter
edge.cpp@2:9f4eff106f89, 2018-01-16 (annotated)
- Committer:
- Rhyme
- Date:
- Tue Jan 16 07:05:47 2018 +0000
- Revision:
- 2:9f4eff106f89
- Parent:
- 1:b97b4f4e5adb
- Child:
- 3:8038e02a72df
Ack timeout added
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:b97b4f4e5adb | 73 | for (int i = 0 ; i < 10 ; i++ ) { |
Rhyme | 1:b97b4f4e5adb | 74 | if (tty->readable()) { |
Rhyme | 1:b97b4f4e5adb | 75 | c = tty->getc() ; |
Rhyme | 1:b97b4f4e5adb | 76 | } else { |
Rhyme | 2:9f4eff106f89 | 77 | tty->putc(DOT) ; |
Rhyme | 1:b97b4f4e5adb | 78 | } |
Rhyme | 1:b97b4f4e5adb | 79 | wait(1) ; |
Rhyme | 1:b97b4f4e5adb | 80 | } |
Rhyme | 2:9f4eff106f89 | 81 | tty->putc(SPACE) ; |
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 | } |