Test Program for Multi Adapter

Dependencies:   mbed

edge.cpp

Committer:
Rhyme
Date:
2018-01-15
Revision:
0:4c6961cb6ccf
Child:
1:b97b4f4e5adb

File content as of revision 0:4c6961cb6ccf:

/**
 * 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 '~'

// 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 = '\r' ;
    printf("Knocking on the host's door\n") ;
    printf("Sending 0x%02X\n", c) ;
//    tty->putc('A') ;
    tty->putc(c) ;
    wait(0.5) ;
}

int wait_ack(void)
{
    char c ;
    printf("Waiting for ACK\n") ;
    c = tty->getc() ;
    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() ;
        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 = 100 * temp[i] ;
        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) ;
    }
}