Masterman / Mbed 2 deprecated mbed_3pi_bluefruit

Dependencies:   m3piExpandedCommandSet mbed

Committer:
kkillebrew
Date:
Tue May 29 14:29:12 2018 +0000
Revision:
4:bb9c8df5bef9
Parent:
3:add27c286be9
First published version.

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