Test Program for Multi Adapter
edge.cpp
- Committer:
- Rhyme
- Date:
- 2018-01-16
- Revision:
- 2:9f4eff106f89
- Parent:
- 1:b97b4f4e5adb
- Child:
- 3:8038e02a72df
File content as of revision 2:9f4eff106f89:
/**
* 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 '~'
#define CR '\r'
#define DOT '.'
#define SPACE ' '
// 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 = CR ;
printf("Knocking on the host's door\n") ;
printf("Sending 0x%02X\n", c) ;
tty->putc(c) ;
wait(0.5) ;
}
int wait_ack(void)
{
char c = 0xFF ;
printf("Waiting for ACK ") ;
for (int i = 0 ; i < 10 ; i++ ) {
if (tty->readable()) {
c = tty->getc() ;
} else {
tty->putc(DOT) ;
}
wait(1) ;
}
tty->putc(SPACE) ;
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() ;
// printf("AN[%d] = %.2f\n",n, f) ;
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 = (int)(100.0 * temp[i] + 0.5) ;
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) ;
}
}