Masterman / Mbed 2 deprecated mbed_3pi_bluefruit

Dependencies:   m3piExpandedCommandSet mbed

Committer:
kkillebrew
Date:
Sun May 27 23:57:30 2018 +0000
Revision:
2:a73f6db7efef
Parent:
1:5fc064b4c942
Child:
3:add27c286be9
Use raw serial for `puts` to write.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kkillebrew 0:25cb75cafbb8 1 #include "mbed.h"
kkillebrew 0:25cb75cafbb8 2 #include "m3pi.h"
kkillebrew 0:25cb75cafbb8 3
kkillebrew 0:25cb75cafbb8 4 m3pi m3pi;
kkillebrew 0:25cb75cafbb8 5
kkillebrew 2:a73f6db7efef 6 RawSerial dev(p28,p27);
kkillebrew 0:25cb75cafbb8 7 DigitalOut led1(LED1);
kkillebrew 0:25cb75cafbb8 8
kkillebrew 1:5fc064b4c942 9 // default serial buffer length is 8 bytes
kkillebrew 0:25cb75cafbb8 10 const int BUFF_LENGTH = 8;
kkillebrew 0:25cb75cafbb8 11
kkillebrew 0:25cb75cafbb8 12 uint8_t rx_buf[BUFF_LENGTH];
kkillebrew 0:25cb75cafbb8 13 char str_buf[BUFF_LENGTH];
kkillebrew 1:5fc064b4c942 14 char battery[BUFF_LENGTH] = "";
kkillebrew 1:5fc064b4c942 15 char str[BUFF_LENGTH] = "";
kkillebrew 1:5fc064b4c942 16
kkillebrew 1:5fc064b4c942 17 /**
kkillebrew 1:5fc064b4c942 18 * Receive commands in the form of a one-character leading command,
kkillebrew 1:5fc064b4c942 19 * followed by two optional wheel speeds, if driving forwards or back.
kkillebrew 1:5fc064b4c942 20 * Wheel speeds are unsigned integers in the range of 0 (stop) to 255.
kkillebrew 1:5fc064b4c942 21 */
kkillebrew 1:5fc064b4c942 22 void process_cmd() {
kkillebrew 2:a73f6db7efef 23 /////////////////
kkillebrew 2:a73f6db7efef 24 m3pi.cls();
kkillebrew 2:a73f6db7efef 25 m3pi.locate(0,0);
kkillebrew 2:a73f6db7efef 26 // print the buffer contents as ASCII on the first line
kkillebrew 2:a73f6db7efef 27 m3pi.printf(str_buf);
kkillebrew 2:a73f6db7efef 28 m3pi.locate(0, 1);
kkillebrew 2:a73f6db7efef 29 ///////////////
kkillebrew 2:a73f6db7efef 30
kkillebrew 1:5fc064b4c942 31 char cmd = (char)rx_buf[0];
kkillebrew 1:5fc064b4c942 32 int right = (int)rx_buf[1];
kkillebrew 1:5fc064b4c942 33 int left = (int)rx_buf[2];
kkillebrew 1:5fc064b4c942 34
kkillebrew 1:5fc064b4c942 35 switch(cmd) {
kkillebrew 1:5fc064b4c942 36 case 'f': {
kkillebrew 1:5fc064b4c942 37 // forward
kkillebrew 1:5fc064b4c942 38 m3pi.left_motor(left);
kkillebrew 1:5fc064b4c942 39 m3pi.right_motor(right);
kkillebrew 1:5fc064b4c942 40 break;
kkillebrew 1:5fc064b4c942 41 } case 'r': {
kkillebrew 1:5fc064b4c942 42 // reverse
kkillebrew 1:5fc064b4c942 43 m3pi.left_motor(-left);
kkillebrew 1:5fc064b4c942 44 m3pi.right_motor(-right);
kkillebrew 1:5fc064b4c942 45 break;
kkillebrew 1:5fc064b4c942 46 } case 'b': {
kkillebrew 1:5fc064b4c942 47 // return battery level as 8-character string repr of float
kkillebrew 1:5fc064b4c942 48 sprintf(battery, "%f", m3pi.battery());
kkillebrew 2:a73f6db7efef 49 dev.puts(battery);
kkillebrew 1:5fc064b4c942 50 break;
kkillebrew 1:5fc064b4c942 51 } case 's': {
kkillebrew 1:5fc064b4c942 52 m3pi.stop();
kkillebrew 1:5fc064b4c942 53 m3pi.printf("stop");
kkillebrew 1:5fc064b4c942 54 break;
kkillebrew 1:5fc064b4c942 55 } case 'z': {
kkillebrew 1:5fc064b4c942 56 // spin left
kkillebrew 1:5fc064b4c942 57 m3pi.left(0.2);
kkillebrew 1:5fc064b4c942 58 break;
kkillebrew 1:5fc064b4c942 59 } case 'y': {
kkillebrew 1:5fc064b4c942 60 // spin right
kkillebrew 1:5fc064b4c942 61 m3pi.right(0.2);
kkillebrew 1:5fc064b4c942 62 break;
kkillebrew 1:5fc064b4c942 63 } default: {
kkillebrew 1:5fc064b4c942 64 m3pi.stop();
kkillebrew 1:5fc064b4c942 65 m3pi.printf("?");
kkillebrew 1:5fc064b4c942 66 }
kkillebrew 1:5fc064b4c942 67 }
kkillebrew 1:5fc064b4c942 68 }
kkillebrew 0:25cb75cafbb8 69
kkillebrew 0:25cb75cafbb8 70 void dev_recv() {
kkillebrew 0:25cb75cafbb8 71
kkillebrew 0:25cb75cafbb8 72 // toggle the LED whenever a data transmission is received
kkillebrew 0:25cb75cafbb8 73 led1 = !led1;
kkillebrew 0:25cb75cafbb8 74
kkillebrew 0:25cb75cafbb8 75 int i = 0;
kkillebrew 0:25cb75cafbb8 76 for (i=0; i < BUFF_LENGTH; i++) {
kkillebrew 0:25cb75cafbb8 77 // let buffer empty if it's not ready to be read yet
kkillebrew 2:a73f6db7efef 78 int count = 0;
kkillebrew 2:a73f6db7efef 79 while (count <= 10) {
kkillebrew 2:a73f6db7efef 80 if (dev.readable())
kkillebrew 2:a73f6db7efef 81 break;
kkillebrew 2:a73f6db7efef 82 wait(0.01f);
kkillebrew 2:a73f6db7efef 83 count++;
kkillebrew 0:25cb75cafbb8 84 }
kkillebrew 0:25cb75cafbb8 85
kkillebrew 0:25cb75cafbb8 86 // if still nothing to read after waiting, must have received
kkillebrew 0:25cb75cafbb8 87 // less than BUFF_LENGTH bytes
kkillebrew 0:25cb75cafbb8 88 if (!dev.readable()) {
kkillebrew 0:25cb75cafbb8 89 break;
kkillebrew 0:25cb75cafbb8 90 }
kkillebrew 0:25cb75cafbb8 91
kkillebrew 0:25cb75cafbb8 92 uint8_t b = dev.getc();
kkillebrew 0:25cb75cafbb8 93 rx_buf[i] = b;
kkillebrew 0:25cb75cafbb8 94 str_buf[i] = (char)b;
kkillebrew 0:25cb75cafbb8 95 }
kkillebrew 0:25cb75cafbb8 96
kkillebrew 1:5fc064b4c942 97 process_cmd();
kkillebrew 0:25cb75cafbb8 98 }
kkillebrew 0:25cb75cafbb8 99
kkillebrew 0:25cb75cafbb8 100 int main() {
kkillebrew 0:25cb75cafbb8 101 dev.baud(9600);
kkillebrew 1:5fc064b4c942 102 // use CTS-only flow control
kkillebrew 1:5fc064b4c942 103 dev.set_flow_control(Serial::CTS, p26);
kkillebrew 0:25cb75cafbb8 104 dev.attach(&dev_recv, Serial::RxIrq);
kkillebrew 0:25cb75cafbb8 105 m3pi.locate(0, 1);
kkillebrew 0:25cb75cafbb8 106 m3pi.printf("BT LE");
kkillebrew 0:25cb75cafbb8 107
kkillebrew 0:25cb75cafbb8 108 while(1) {
kkillebrew 0:25cb75cafbb8 109 sleep();
kkillebrew 0:25cb75cafbb8 110 }
kkillebrew 0:25cb75cafbb8 111 }