Test Program for Multi Adapter
Diff: edge.cpp
- Revision:
- 0:4c6961cb6ccf
- Child:
- 1:b97b4f4e5adb
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/edge.cpp Mon Jan 15 07:53:03 2018 +0000
@@ -0,0 +1,159 @@
+/**
+ * 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) ;
+ }
+}