Masterman / Mbed 2 deprecated mbed_3pi_bluefruit

Dependencies:   m3piExpandedCommandSet mbed

Committer:
kkillebrew
Date:
Mon May 28 18:26:42 2018 +0000
Revision:
3:add27c286be9
Parent:
2:a73f6db7efef
Child:
4:bb9c8df5bef9
Slow spin speeds

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 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 3:add27c286be9 41 // FIXME: this does not get sent as a singe byte,
kkillebrew 3:add27c286be9 42 // but sometimes several
kkillebrew 2:a73f6db7efef 43 dev.puts(battery);
kkillebrew 1:5fc064b4c942 44 break;
kkillebrew 1:5fc064b4c942 45 } case 's': {
kkillebrew 1:5fc064b4c942 46 m3pi.stop();
kkillebrew 3:add27c286be9 47 //m3pi.printf("stop");
kkillebrew 1:5fc064b4c942 48 break;
kkillebrew 1:5fc064b4c942 49 } case 'z': {
kkillebrew 1:5fc064b4c942 50 // spin left
kkillebrew 3:add27c286be9 51 m3pi.left(0.1);
kkillebrew 1:5fc064b4c942 52 break;
kkillebrew 1:5fc064b4c942 53 } case 'y': {
kkillebrew 1:5fc064b4c942 54 // spin right
kkillebrew 3:add27c286be9 55 m3pi.right(0.1);
kkillebrew 1:5fc064b4c942 56 break;
kkillebrew 1:5fc064b4c942 57 } default: {
kkillebrew 1:5fc064b4c942 58 m3pi.stop();
kkillebrew 3:add27c286be9 59 m3pi.cls();
kkillebrew 3:add27c286be9 60 m3pi.locate(0, 0);
kkillebrew 3:add27c286be9 61 // print the buffer contents as ASCII on the first line
kkillebrew 3:add27c286be9 62 m3pi.printf(str_buf);
kkillebrew 3:add27c286be9 63 m3pi.locate(0, 1);
kkillebrew 1:5fc064b4c942 64 m3pi.printf("?");
kkillebrew 1:5fc064b4c942 65 }
kkillebrew 1:5fc064b4c942 66 }
kkillebrew 1:5fc064b4c942 67 }
kkillebrew 0:25cb75cafbb8 68
kkillebrew 0:25cb75cafbb8 69 void dev_recv() {
kkillebrew 0:25cb75cafbb8 70
kkillebrew 0:25cb75cafbb8 71 // toggle the LED whenever a data transmission is received
kkillebrew 0:25cb75cafbb8 72 led1 = !led1;
kkillebrew 0:25cb75cafbb8 73
kkillebrew 0:25cb75cafbb8 74 int i = 0;
kkillebrew 0:25cb75cafbb8 75 for (i=0; i < BUFF_LENGTH; i++) {
kkillebrew 0:25cb75cafbb8 76 // let buffer empty if it's not ready to be read yet
kkillebrew 2:a73f6db7efef 77 int count = 0;
kkillebrew 2:a73f6db7efef 78 while (count <= 10) {
kkillebrew 2:a73f6db7efef 79 if (dev.readable())
kkillebrew 2:a73f6db7efef 80 break;
kkillebrew 2:a73f6db7efef 81 wait(0.01f);
kkillebrew 2:a73f6db7efef 82 count++;
kkillebrew 0:25cb75cafbb8 83 }
kkillebrew 0:25cb75cafbb8 84
kkillebrew 0:25cb75cafbb8 85 // if still nothing to read after waiting, must have received
kkillebrew 0:25cb75cafbb8 86 // less than BUFF_LENGTH bytes
kkillebrew 0:25cb75cafbb8 87 if (!dev.readable()) {
kkillebrew 0:25cb75cafbb8 88 break;
kkillebrew 0:25cb75cafbb8 89 }
kkillebrew 0:25cb75cafbb8 90
kkillebrew 0:25cb75cafbb8 91 uint8_t b = dev.getc();
kkillebrew 0:25cb75cafbb8 92 rx_buf[i] = b;
kkillebrew 0:25cb75cafbb8 93 str_buf[i] = (char)b;
kkillebrew 0:25cb75cafbb8 94 }
kkillebrew 0:25cb75cafbb8 95
kkillebrew 1:5fc064b4c942 96 process_cmd();
kkillebrew 0:25cb75cafbb8 97 }
kkillebrew 0:25cb75cafbb8 98
kkillebrew 0:25cb75cafbb8 99 int main() {
kkillebrew 0:25cb75cafbb8 100 dev.baud(9600);
kkillebrew 1:5fc064b4c942 101 // use CTS-only flow control
kkillebrew 1:5fc064b4c942 102 dev.set_flow_control(Serial::CTS, p26);
kkillebrew 0:25cb75cafbb8 103 dev.attach(&dev_recv, Serial::RxIrq);
kkillebrew 0:25cb75cafbb8 104 m3pi.locate(0, 1);
kkillebrew 0:25cb75cafbb8 105 m3pi.printf("BT LE");
kkillebrew 0:25cb75cafbb8 106
kkillebrew 0:25cb75cafbb8 107 while(1) {
kkillebrew 0:25cb75cafbb8 108 sleep();
kkillebrew 0:25cb75cafbb8 109 }
kkillebrew 0:25cb75cafbb8 110 }