This is a demo for controlling your ShieldBot using your mobile phone
Dependencies: BLE_API ShieldBot_v12 mbed nRF51822
Fork of BLE_LoopbackUART by
main.cpp@12:900318ccf3ae, 2015-09-15 (annotated)
- Committer:
- Kevin_Lee
- Date:
- Tue Sep 15 13:42:59 2015 +0000
- Revision:
- 12:900318ccf3ae
- Parent:
- 10:633cec718bf4
This is a demo to control the ShieldBot using your mobile phone
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Kevin_Lee | 12:900318ccf3ae | 1 | /* |
Kevin_Lee | 12:900318ccf3ae | 2 | * main.cpp |
Kevin_Lee | 12:900318ccf3ae | 3 | * A Demo for ShieldBot |
Kevin_Lee | 12:900318ccf3ae | 4 | * |
Kevin_Lee | 12:900318ccf3ae | 5 | * Copyright (c) 2015 seeed technology inc. |
Kevin_Lee | 12:900318ccf3ae | 6 | * Author : Jiankai.li |
Kevin_Lee | 12:900318ccf3ae | 7 | * Create Time: Sep 2015 |
Kevin_Lee | 12:900318ccf3ae | 8 | * Change Log : |
yihui | 0:e910d9bb040f | 9 | * |
Kevin_Lee | 12:900318ccf3ae | 10 | * The MIT License (MIT) |
yihui | 0:e910d9bb040f | 11 | * |
Kevin_Lee | 12:900318ccf3ae | 12 | * Permission is hereby granted, free of charge, to any person obtaining a copy |
Kevin_Lee | 12:900318ccf3ae | 13 | * of this software and associated documentation files (the "Software"), to deal |
Kevin_Lee | 12:900318ccf3ae | 14 | * in the Software without restriction, including without limitation the rights |
Kevin_Lee | 12:900318ccf3ae | 15 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
Kevin_Lee | 12:900318ccf3ae | 16 | * copies of the Software, and to permit persons to whom the Software is |
Kevin_Lee | 12:900318ccf3ae | 17 | * furnished to do so, subject to the following conditions: |
Kevin_Lee | 12:900318ccf3ae | 18 | * |
Kevin_Lee | 12:900318ccf3ae | 19 | * The above copyright notice and this permission notice shall be included in |
Kevin_Lee | 12:900318ccf3ae | 20 | * all copies or substantial portions of the Software. |
Kevin_Lee | 12:900318ccf3ae | 21 | * |
Kevin_Lee | 12:900318ccf3ae | 22 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
Kevin_Lee | 12:900318ccf3ae | 23 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
Kevin_Lee | 12:900318ccf3ae | 24 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
Kevin_Lee | 12:900318ccf3ae | 25 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
Kevin_Lee | 12:900318ccf3ae | 26 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
Kevin_Lee | 12:900318ccf3ae | 27 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
Kevin_Lee | 12:900318ccf3ae | 28 | * THE SOFTWARE. |
yihui | 0:e910d9bb040f | 29 | */ |
yihui | 0:e910d9bb040f | 30 | |
Kevin_Lee | 12:900318ccf3ae | 31 | |
yihui | 0:e910d9bb040f | 32 | #include "mbed.h" |
Rohit Grover |
2:e060367b9024 | 33 | #include "BLEDevice.h" |
yihui | 0:e910d9bb040f | 34 | |
rgrover1 | 6:e0fc9072e853 | 35 | #include "UARTService.h" |
Kevin_Lee | 12:900318ccf3ae | 36 | #include "ShieldBot_v12.h" |
Kevin_Lee | 12:900318ccf3ae | 37 | #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console; |
Rohit Grover |
2:e060367b9024 | 38 | * it will have an impact on code-size and power consumption. */ |
yihui | 0:e910d9bb040f | 39 | |
Rohit Grover |
2:e060367b9024 | 40 | #if NEED_CONSOLE_OUTPUT |
rgrover1 | 6:e0fc9072e853 | 41 | #define DEBUG(...) { printf(__VA_ARGS__); } |
yihui | 0:e910d9bb040f | 42 | #else |
Rohit Grover |
2:e060367b9024 | 43 | #define DEBUG(...) /* nothing */ |
Rohit Grover |
2:e060367b9024 | 44 | #endif /* #if NEED_CONSOLE_OUTPUT */ |
yihui | 0:e910d9bb040f | 45 | |
Rohit Grover |
2:e060367b9024 | 46 | BLEDevice ble; |
Rohit Grover |
2:e060367b9024 | 47 | DigitalOut led1(LED1); |
yihui | 0:e910d9bb040f | 48 | |
rgrover1 | 6:e0fc9072e853 | 49 | UARTService *uartServicePtr; |
Kevin_Lee | 12:900318ccf3ae | 50 | Shieldbot shieldbot = Shieldbot(); |
Kevin_Lee | 12:900318ccf3ae | 51 | |
Kevin_Lee | 12:900318ccf3ae | 52 | void turnLeft() |
Kevin_Lee | 12:900318ccf3ae | 53 | { |
Kevin_Lee | 12:900318ccf3ae | 54 | shieldbot.drive(-127,127); //turn left on a dime |
Kevin_Lee | 12:900318ccf3ae | 55 | wait(0.4); |
Kevin_Lee | 12:900318ccf3ae | 56 | shieldbot.stop(); |
Kevin_Lee | 12:900318ccf3ae | 57 | } |
Kevin_Lee | 12:900318ccf3ae | 58 | |
Kevin_Lee | 12:900318ccf3ae | 59 | void turnRight() |
Kevin_Lee | 12:900318ccf3ae | 60 | { |
Kevin_Lee | 12:900318ccf3ae | 61 | shieldbot.drive(127,-127); //turn left on a dime |
Kevin_Lee | 12:900318ccf3ae | 62 | wait(0.4); |
Kevin_Lee | 12:900318ccf3ae | 63 | shieldbot.stop(); |
Kevin_Lee | 12:900318ccf3ae | 64 | } |
Kevin_Lee | 12:900318ccf3ae | 65 | |
Kevin_Lee | 12:900318ccf3ae | 66 | |
Kevin_Lee | 12:900318ccf3ae | 67 | void processPacket(uint8_t *packet) |
Kevin_Lee | 12:900318ccf3ae | 68 | { |
Kevin_Lee | 12:900318ccf3ae | 69 | static int16_t speed = 255; |
Kevin_Lee | 12:900318ccf3ae | 70 | uint8_t cmd = packet[0]; |
Kevin_Lee | 12:900318ccf3ae | 71 | DEBUG("comand: %c\n\r", cmd); |
Kevin_Lee | 12:900318ccf3ae | 72 | switch(cmd) { |
Kevin_Lee | 12:900318ccf3ae | 73 | case 'a': |
Kevin_Lee | 12:900318ccf3ae | 74 | turnLeft(); |
Kevin_Lee | 12:900318ccf3ae | 75 | break; |
Kevin_Lee | 12:900318ccf3ae | 76 | case 'd': |
Kevin_Lee | 12:900318ccf3ae | 77 | turnRight(); |
Kevin_Lee | 12:900318ccf3ae | 78 | break; |
Kevin_Lee | 12:900318ccf3ae | 79 | case 's': |
Kevin_Lee | 12:900318ccf3ae | 80 | shieldbot.backward(); |
Kevin_Lee | 12:900318ccf3ae | 81 | break; |
Kevin_Lee | 12:900318ccf3ae | 82 | case 'w': |
Kevin_Lee | 12:900318ccf3ae | 83 | shieldbot.forward(); |
Kevin_Lee | 12:900318ccf3ae | 84 | break; |
Kevin_Lee | 12:900318ccf3ae | 85 | case ' ': |
Kevin_Lee | 12:900318ccf3ae | 86 | shieldbot.stop(); |
Kevin_Lee | 12:900318ccf3ae | 87 | break; |
Kevin_Lee | 12:900318ccf3ae | 88 | case '-': |
Kevin_Lee | 12:900318ccf3ae | 89 | speed -= 50; |
Kevin_Lee | 12:900318ccf3ae | 90 | if(speed <= 5){ |
Kevin_Lee | 12:900318ccf3ae | 91 | speed = 5; |
Kevin_Lee | 12:900318ccf3ae | 92 | } |
Kevin_Lee | 12:900318ccf3ae | 93 | shieldbot.setMaxSpeed(speed); |
Kevin_Lee | 12:900318ccf3ae | 94 | break; |
Kevin_Lee | 12:900318ccf3ae | 95 | case '+': |
Kevin_Lee | 12:900318ccf3ae | 96 | speed += 50; |
Kevin_Lee | 12:900318ccf3ae | 97 | if(speed >= 255) { |
Kevin_Lee | 12:900318ccf3ae | 98 | speed = 255; |
Kevin_Lee | 12:900318ccf3ae | 99 | } |
Kevin_Lee | 12:900318ccf3ae | 100 | shieldbot.setMaxSpeed(speed); |
Kevin_Lee | 12:900318ccf3ae | 101 | break; |
Kevin_Lee | 12:900318ccf3ae | 102 | default: |
Kevin_Lee | 12:900318ccf3ae | 103 | break; |
Kevin_Lee | 12:900318ccf3ae | 104 | } |
Kevin_Lee | 12:900318ccf3ae | 105 | } |
yihui | 0:e910d9bb040f | 106 | |
rgrover1 | 5:4bc41267a03a | 107 | void disconnectionCallback(Gap::Handle_t handle, Gap::DisconnectionReason_t reason) |
yihui | 0:e910d9bb040f | 108 | { |
Rohit Grover |
2:e060367b9024 | 109 | DEBUG("Disconnected!\n\r"); |
Rohit Grover |
2:e060367b9024 | 110 | DEBUG("Restarting the advertising process\n\r"); |
Rohit Grover |
2:e060367b9024 | 111 | ble.startAdvertising(); |
Rohit Grover |
2:e060367b9024 | 112 | } |
yihui | 0:e910d9bb040f | 113 | |
rgrover1 | 6:e0fc9072e853 | 114 | void onDataWritten(const GattCharacteristicWriteCBParams *params) |
yihui | 0:e910d9bb040f | 115 | { |
rgrover1 | 6:e0fc9072e853 | 116 | if ((uartServicePtr != NULL) && (params->charHandle == uartServicePtr->getTXCharacteristicHandle())) { |
rgrover1 | 5:4bc41267a03a | 117 | uint16_t bytesRead = params->len; |
rgrover1 | 5:4bc41267a03a | 118 | DEBUG("received %u bytes\n\r", bytesRead); |
rgrover1 | 6:e0fc9072e853 | 119 | ble.updateCharacteristicValue(uartServicePtr->getRXCharacteristicHandle(), params->data, bytesRead); |
Kevin_Lee | 12:900318ccf3ae | 120 | processPacket((uint8_t *)params->data); |
yihui | 0:e910d9bb040f | 121 | } |
Rohit Grover |
2:e060367b9024 | 122 | } |
yihui | 0:e910d9bb040f | 123 | |
Rohit Grover |
2:e060367b9024 | 124 | void periodicCallback(void) |
Rohit Grover |
2:e060367b9024 | 125 | { |
rgrover1 | 6:e0fc9072e853 | 126 | led1 = !led1; |
Rohit Grover |
2:e060367b9024 | 127 | } |
yihui | 0:e910d9bb040f | 128 | |
yihui | 0:e910d9bb040f | 129 | int main(void) |
yihui | 0:e910d9bb040f | 130 | { |
Rohit Grover |
2:e060367b9024 | 131 | led1 = 1; |
Rohit Grover |
2:e060367b9024 | 132 | Ticker ticker; |
Rohit Grover |
2:e060367b9024 | 133 | ticker.attach(periodicCallback, 1); |
yihui | 0:e910d9bb040f | 134 | |
Rohit Grover |
2:e060367b9024 | 135 | DEBUG("Initialising the nRF51822\n\r"); |
Rohit Grover |
2:e060367b9024 | 136 | ble.init(); |
Rohit Grover |
2:e060367b9024 | 137 | ble.onDisconnection(disconnectionCallback); |
Rohit Grover |
2:e060367b9024 | 138 | ble.onDataWritten(onDataWritten); |
yihui | 0:e910d9bb040f | 139 | |
Rohit Grover |
2:e060367b9024 | 140 | /* setup advertising */ |
Rohit Grover |
2:e060367b9024 | 141 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
Rohit Grover |
2:e060367b9024 | 142 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
Rohit Grover |
2:e060367b9024 | 143 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
Kevin_Lee | 12:900318ccf3ae | 144 | (const uint8_t *)"ShieldBot", sizeof("ShieldBot") - 1); |
Rohit Grover |
2:e060367b9024 | 145 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, |
rgrover1 | 6:e0fc9072e853 | 146 | (const uint8_t *)UARTServiceUUID_reversed, sizeof(UARTServiceUUID_reversed)); |
yihui | 0:e910d9bb040f | 147 | |
rgrover1 | 10:633cec718bf4 | 148 | ble.setAdvertisingInterval(Gap::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(1000)); |
Rohit Grover |
2:e060367b9024 | 149 | ble.startAdvertising(); |
yihui | 0:e910d9bb040f | 150 | |
rgrover1 | 6:e0fc9072e853 | 151 | UARTService uartService(ble); |
rgrover1 | 6:e0fc9072e853 | 152 | uartServicePtr = &uartService; |
yihui | 0:e910d9bb040f | 153 | |
Rohit Grover |
2:e060367b9024 | 154 | while (true) { |
Rohit Grover |
2:e060367b9024 | 155 | ble.waitForEvent(); |
yihui | 0:e910d9bb040f | 156 | } |
yihui | 0:e910d9bb040f | 157 | } |