Masterman / Mbed 2 deprecated mbed_3pi_bluefruit

Dependencies:   m3piExpandedCommandSet mbed

Committer:
kkillebrew
Date:
Sun May 27 22:06:26 2018 +0000
Revision:
1:5fc064b4c942
Parent:
0:25cb75cafbb8
Child:
2:a73f6db7efef
Add command set for controlling m3pi via bluetooth.

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 0:25cb75cafbb8 6 Serial 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 1:5fc064b4c942 23 char cmd = (char)rx_buf[0];
kkillebrew 1:5fc064b4c942 24 int right = (int)rx_buf[1];
kkillebrew 1:5fc064b4c942 25 int left = (int)rx_buf[2];
kkillebrew 1:5fc064b4c942 26
kkillebrew 1:5fc064b4c942 27 switch(cmd) {
kkillebrew 1:5fc064b4c942 28 case 'f': {
kkillebrew 1:5fc064b4c942 29 // forward
kkillebrew 1:5fc064b4c942 30 m3pi.left_motor(left);
kkillebrew 1:5fc064b4c942 31 m3pi.right_motor(right);
kkillebrew 1:5fc064b4c942 32 break;
kkillebrew 1:5fc064b4c942 33 } case 'r': {
kkillebrew 1:5fc064b4c942 34 // reverse
kkillebrew 1:5fc064b4c942 35 m3pi.left_motor(-left);
kkillebrew 1:5fc064b4c942 36 m3pi.right_motor(-right);
kkillebrew 1:5fc064b4c942 37 break;
kkillebrew 1:5fc064b4c942 38 } case 'b': {
kkillebrew 1:5fc064b4c942 39 // return battery level as 8-character string repr of float
kkillebrew 1:5fc064b4c942 40 sprintf(battery, "%f", m3pi.battery());
kkillebrew 1:5fc064b4c942 41 int len = strlen(battery);
kkillebrew 1:5fc064b4c942 42 for (int i = 0; i < len; i++) {
kkillebrew 1:5fc064b4c942 43 dev.putc(battery[i]);
kkillebrew 1:5fc064b4c942 44 }
kkillebrew 1:5fc064b4c942 45 break;
kkillebrew 1:5fc064b4c942 46 } case 's': {
kkillebrew 1:5fc064b4c942 47 m3pi.stop();
kkillebrew 1:5fc064b4c942 48 m3pi.printf("stop");
kkillebrew 1:5fc064b4c942 49 break;
kkillebrew 1:5fc064b4c942 50 } case 'z': {
kkillebrew 1:5fc064b4c942 51 // spin left
kkillebrew 1:5fc064b4c942 52 m3pi.left(0.2);
kkillebrew 1:5fc064b4c942 53 break;
kkillebrew 1:5fc064b4c942 54 } case 'y': {
kkillebrew 1:5fc064b4c942 55 // spin right
kkillebrew 1:5fc064b4c942 56 m3pi.right(0.2);
kkillebrew 1:5fc064b4c942 57 break;
kkillebrew 1:5fc064b4c942 58 } default: {
kkillebrew 1:5fc064b4c942 59 m3pi.stop();
kkillebrew 1:5fc064b4c942 60 m3pi.printf("?");
kkillebrew 1:5fc064b4c942 61 }
kkillebrew 1:5fc064b4c942 62 }
kkillebrew 1:5fc064b4c942 63 }
kkillebrew 0:25cb75cafbb8 64
kkillebrew 0:25cb75cafbb8 65 void dev_recv() {
kkillebrew 0:25cb75cafbb8 66
kkillebrew 0:25cb75cafbb8 67 // toggle the LED whenever a data transmission is received
kkillebrew 0:25cb75cafbb8 68 led1 = !led1;
kkillebrew 0:25cb75cafbb8 69
kkillebrew 0:25cb75cafbb8 70 int i = 0;
kkillebrew 0:25cb75cafbb8 71 for (i=0; i < BUFF_LENGTH; i++) {
kkillebrew 0:25cb75cafbb8 72 // let buffer empty if it's not ready to be read yet
kkillebrew 0:25cb75cafbb8 73 if (!dev.readable()) {
kkillebrew 0:25cb75cafbb8 74 wait(0.1f);
kkillebrew 0:25cb75cafbb8 75 }
kkillebrew 0:25cb75cafbb8 76
kkillebrew 0:25cb75cafbb8 77 // if still nothing to read after waiting, must have received
kkillebrew 0:25cb75cafbb8 78 // less than BUFF_LENGTH bytes
kkillebrew 0:25cb75cafbb8 79 if (!dev.readable()) {
kkillebrew 0:25cb75cafbb8 80 break;
kkillebrew 0:25cb75cafbb8 81 }
kkillebrew 0:25cb75cafbb8 82
kkillebrew 0:25cb75cafbb8 83 uint8_t b = dev.getc();
kkillebrew 0:25cb75cafbb8 84 rx_buf[i] = b;
kkillebrew 0:25cb75cafbb8 85 str_buf[i] = (char)b;
kkillebrew 0:25cb75cafbb8 86 }
kkillebrew 0:25cb75cafbb8 87
kkillebrew 0:25cb75cafbb8 88 m3pi.cls();
kkillebrew 0:25cb75cafbb8 89 m3pi.locate(0,0);
kkillebrew 0:25cb75cafbb8 90
kkillebrew 0:25cb75cafbb8 91 // print the buffer contents as ASCII on the first line
kkillebrew 0:25cb75cafbb8 92 m3pi.print(str_buf, i);
kkillebrew 0:25cb75cafbb8 93
kkillebrew 1:5fc064b4c942 94 m3pi.locate(0, 1);
kkillebrew 1:5fc064b4c942 95
kkillebrew 1:5fc064b4c942 96 /*
kkillebrew 0:25cb75cafbb8 97 // print the buffer length on the second line
kkillebrew 0:25cb75cafbb8 98 sprintf(str, "%d", i);
kkillebrew 0:25cb75cafbb8 99 m3pi.printf(str);
kkillebrew 1:5fc064b4c942 100 */
kkillebrew 1:5fc064b4c942 101 process_cmd();
kkillebrew 0:25cb75cafbb8 102 }
kkillebrew 0:25cb75cafbb8 103
kkillebrew 0:25cb75cafbb8 104 int main() {
kkillebrew 0:25cb75cafbb8 105 dev.baud(9600);
kkillebrew 1:5fc064b4c942 106 // use CTS-only flow control
kkillebrew 1:5fc064b4c942 107 dev.set_flow_control(Serial::CTS, p26);
kkillebrew 0:25cb75cafbb8 108 dev.attach(&dev_recv, Serial::RxIrq);
kkillebrew 0:25cb75cafbb8 109 m3pi.locate(0, 1);
kkillebrew 0:25cb75cafbb8 110 m3pi.printf("BT LE");
kkillebrew 0:25cb75cafbb8 111
kkillebrew 0:25cb75cafbb8 112 while(1) {
kkillebrew 0:25cb75cafbb8 113 sleep();
kkillebrew 0:25cb75cafbb8 114 }
kkillebrew 0:25cb75cafbb8 115 }