Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: m3piExpandedCommandSet mbed
main.cpp@2:a73f6db7efef, 2018-05-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |