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.
Fork of BLE_RCBController2_Motor by
main.cpp@8:7ab6a5b29812, 2017-10-11 (annotated)
- Committer:
- kenjiArai
- Date:
- Wed Oct 11 21:32:18 2017 +0000
- Revision:
- 8:7ab6a5b29812
- Parent:
- 7:45655ac58160
changed comment
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 6:1aff9f05d487 | 1 | /* |
| kenjiArai | 6:1aff9f05d487 | 2 | * December 31st, 2015 Modified by Kenji Arai |
| kenjiArai | 7:45655ac58160 | 3 | * January 19th, 2016 |
| kenjiArai | 8:7ab6a5b29812 | 4 | * October 12th, 2017 !! Run on Mbed-os5 |
| kenjiArai | 6:1aff9f05d487 | 5 | * http://www.page.sannet.ne.jp/kenjia/index.html |
| kenjiArai | 6:1aff9f05d487 | 6 | * http://mbed.org/users/kenjiArai/ |
| kenjiArai | 6:1aff9f05d487 | 7 | * -> Works well with latest Rev. |
| kenjiArai | 6:1aff9f05d487 | 8 | * |
| kenjiArai | 6:1aff9f05d487 | 9 | * Original: |
| kenjiArai | 6:1aff9f05d487 | 10 | * BLE_RCBController2_Motor |
| kenjiArai | 6:1aff9f05d487 | 11 | * https://developer.mbed.org/users/robo8080/code/BLE_RCBController2_Motor/ |
| kenjiArai | 6:1aff9f05d487 | 12 | * Tested Controller Device: |
| kenjiArai | 6:1aff9f05d487 | 13 | * iPhone6 RCBController (Ver1.4.0) |
| kenjiArai | 6:1aff9f05d487 | 14 | * https://itunes.apple.com/jp/app/rcbcontroller/id689724127?mt=8 |
| kenjiArai | 6:1aff9f05d487 | 15 | */ |
| jksoft | 0:8c643bfe55b7 | 16 | |
| kenjiArai | 6:1aff9f05d487 | 17 | // Include --------------------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 18 | #include "mbed.h" |
| kenjiArai | 6:1aff9f05d487 | 19 | #include "ble/BLE.h" |
| kenjiArai | 6:1aff9f05d487 | 20 | #include "RCBController.h" |
| kenjiArai | 6:1aff9f05d487 | 21 | #include "Servo.h" |
| kenjiArai | 6:1aff9f05d487 | 22 | |
| kenjiArai | 6:1aff9f05d487 | 23 | // Definition ------------------------------------------------------------------------------------ |
| kenjiArai | 6:1aff9f05d487 | 24 | #define NEED_CONSOLE_OUTPUT 1 // Set this if you need debug messages on the console |
| jksoft | 0:8c643bfe55b7 | 25 | |
| kenjiArai | 6:1aff9f05d487 | 26 | #if NEED_CONSOLE_OUTPUT |
| kenjiArai | 6:1aff9f05d487 | 27 | #define DEBUG(...) { printf(__VA_ARGS__); } |
| kenjiArai | 6:1aff9f05d487 | 28 | #else |
| kenjiArai | 6:1aff9f05d487 | 29 | #define DEBUG(...) |
| kenjiArai | 6:1aff9f05d487 | 30 | #endif |
| kenjiArai | 6:1aff9f05d487 | 31 | |
| kenjiArai | 7:45655ac58160 | 32 | #define LED_A_PIN P0_21 |
| kenjiArai | 7:45655ac58160 | 33 | #define LED_B_PIN P0_22 |
| kenjiArai | 7:45655ac58160 | 34 | #define LED_X_PIN P0_23 |
| kenjiArai | 7:45655ac58160 | 35 | #define LED_Y_PIN P0_24 |
| kenjiArai | 7:45655ac58160 | 36 | #define SERVO_0_PIN P0_18 |
| kenjiArai | 7:45655ac58160 | 37 | #define SERVO_1_PIN P0_16 |
| robo8080 | 5:1c04bd9f8457 | 38 | |
| kenjiArai | 6:1aff9f05d487 | 39 | // Object ---------------------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 40 | BLE ble; |
| kenjiArai | 6:1aff9f05d487 | 41 | Servo SERVO_0(SERVO_0_PIN); |
| kenjiArai | 7:45655ac58160 | 42 | Servo SERVO_1(SERVO_1_PIN); |
| kenjiArai | 7:45655ac58160 | 43 | DigitalOut LED_A(LED_A_PIN); |
| kenjiArai | 7:45655ac58160 | 44 | DigitalOut LED_B(LED_B_PIN); |
| kenjiArai | 7:45655ac58160 | 45 | DigitalOut LED_X(LED_X_PIN); |
| kenjiArai | 7:45655ac58160 | 46 | DigitalOut LED_Y(LED_Y_PIN); |
| kenjiArai | 6:1aff9f05d487 | 47 | |
| kenjiArai | 6:1aff9f05d487 | 48 | // RAM ------------------------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 49 | uint8_t RCBControllerPayload[10] = {0,}; |
| kenjiArai | 6:1aff9f05d487 | 50 | RCBController controller; |
| kenjiArai | 6:1aff9f05d487 | 51 | |
| kenjiArai | 6:1aff9f05d487 | 52 | // ROM / Constant data --------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 53 | // RCBController Service |
| kenjiArai | 6:1aff9f05d487 | 54 | static const uint16_t RCBController_service_uuid = 0xFFF0; |
| kenjiArai | 6:1aff9f05d487 | 55 | static const uint16_t RCBController_Characteristic_uuid = 0xFFF1; |
| kenjiArai | 6:1aff9f05d487 | 56 | const char *deviceName = "mbedBLE"; |
| robo8080 | 5:1c04bd9f8457 | 57 | |
| kenjiArai | 6:1aff9f05d487 | 58 | // Function prototypes --------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 59 | GattCharacteristic ControllerChar (RCBController_Characteristic_uuid,RCBControllerPayload,10, 10, |
| kenjiArai | 6:1aff9f05d487 | 60 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE | |
| kenjiArai | 6:1aff9f05d487 | 61 | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE); |
| kenjiArai | 6:1aff9f05d487 | 62 | GattCharacteristic *ControllerChars[] = {&ControllerChar}; |
| kenjiArai | 6:1aff9f05d487 | 63 | GattService RCBControllerService(RCBController_service_uuid, ControllerChars, |
| kenjiArai | 6:1aff9f05d487 | 64 | sizeof(ControllerChars) / sizeof(GattCharacteristic *)); |
| kenjiArai | 6:1aff9f05d487 | 65 | |
| kenjiArai | 6:1aff9f05d487 | 66 | //------------------------------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 67 | // Control Program |
| kenjiArai | 6:1aff9f05d487 | 68 | //------------------------------------------------------------------------------------------------- |
| kenjiArai | 6:1aff9f05d487 | 69 | void data_analysis(void){ |
| kenjiArai | 7:45655ac58160 | 70 | static uint8_t cont_flg_A = 0; |
| kenjiArai | 7:45655ac58160 | 71 | static uint8_t cont_flg_B = 0; |
| kenjiArai | 7:45655ac58160 | 72 | static uint8_t cont_flg_X = 0; |
| kenjiArai | 7:45655ac58160 | 73 | static uint8_t cont_flg_Y = 0; |
| kenjiArai | 6:1aff9f05d487 | 74 | float value; |
| kenjiArai | 6:1aff9f05d487 | 75 | |
| kenjiArai | 7:45655ac58160 | 76 | if (controller.status.A == 1){ |
| kenjiArai | 7:45655ac58160 | 77 | if (cont_flg_A == 0){ |
| kenjiArai | 7:45655ac58160 | 78 | LED_A = !LED_A; |
| kenjiArai | 7:45655ac58160 | 79 | cont_flg_A = 1; |
| kenjiArai | 7:45655ac58160 | 80 | } |
| kenjiArai | 7:45655ac58160 | 81 | } else { |
| kenjiArai | 7:45655ac58160 | 82 | cont_flg_A = 0; |
| kenjiArai | 7:45655ac58160 | 83 | } |
| kenjiArai | 6:1aff9f05d487 | 84 | if (controller.status.B == 1){ |
| kenjiArai | 7:45655ac58160 | 85 | if (cont_flg_B == 0){ |
| kenjiArai | 7:45655ac58160 | 86 | LED_B = !LED_B; |
| kenjiArai | 7:45655ac58160 | 87 | cont_flg_B = 1; |
| kenjiArai | 6:1aff9f05d487 | 88 | } |
| kenjiArai | 6:1aff9f05d487 | 89 | } else { |
| kenjiArai | 7:45655ac58160 | 90 | cont_flg_B = 0; |
| kenjiArai | 7:45655ac58160 | 91 | } |
| kenjiArai | 7:45655ac58160 | 92 | if (controller.status.X == 1){ |
| kenjiArai | 7:45655ac58160 | 93 | if (cont_flg_X == 0){ |
| kenjiArai | 7:45655ac58160 | 94 | LED_X = !LED_X; |
| kenjiArai | 7:45655ac58160 | 95 | cont_flg_X = 1; |
| kenjiArai | 7:45655ac58160 | 96 | } |
| kenjiArai | 7:45655ac58160 | 97 | } else { |
| kenjiArai | 7:45655ac58160 | 98 | cont_flg_X = 0; |
| kenjiArai | 6:1aff9f05d487 | 99 | } |
| kenjiArai | 7:45655ac58160 | 100 | if (controller.status.Y == 1){ |
| kenjiArai | 7:45655ac58160 | 101 | if (cont_flg_Y == 0){ |
| kenjiArai | 7:45655ac58160 | 102 | LED_Y = !LED_Y; |
| kenjiArai | 7:45655ac58160 | 103 | cont_flg_Y = 1; |
| kenjiArai | 7:45655ac58160 | 104 | } |
| kenjiArai | 7:45655ac58160 | 105 | } else { |
| kenjiArai | 7:45655ac58160 | 106 | cont_flg_Y = 0; |
| kenjiArai | 7:45655ac58160 | 107 | } |
| kenjiArai | 6:1aff9f05d487 | 108 | value = (float)controller.status.LeftAnalogUD/255 * 150.0f + 20; |
| kenjiArai | 7:45655ac58160 | 109 | SERVO_0.write(value); |
| kenjiArai | 7:45655ac58160 | 110 | value = (float)controller.status.LeftAnalogLR/255 * 150.0f + 20; |
| kenjiArai | 7:45655ac58160 | 111 | SERVO_1.write(value); |
| robo8080 | 5:1c04bd9f8457 | 112 | } |
| robo8080 | 5:1c04bd9f8457 | 113 | |
| kenjiArai | 6:1aff9f05d487 | 114 | void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){ |
| kenjiArai | 6:1aff9f05d487 | 115 | DEBUG("Disconnected!\r\n"); |
| kenjiArai | 6:1aff9f05d487 | 116 | DEBUG("Restarting the advertising process\r\n"); |
| kenjiArai | 6:1aff9f05d487 | 117 | ble.startAdvertising(); |
| robo8080 | 5:1c04bd9f8457 | 118 | } |
| jksoft | 0:8c643bfe55b7 | 119 | |
| kenjiArai | 6:1aff9f05d487 | 120 | void onDataWritten(const GattWriteCallbackParams *params){ |
| kenjiArai | 6:1aff9f05d487 | 121 | if (params->handle == ControllerChar.getValueAttribute().getHandle()) { |
| kenjiArai | 6:1aff9f05d487 | 122 | uint16_t bytesRead; |
| kenjiArai | 6:1aff9f05d487 | 123 | ble.readCharacteristicValue(ControllerChar.getValueAttribute().getHandle(), |
| kenjiArai | 6:1aff9f05d487 | 124 | RCBControllerPayload, &bytesRead); |
| kenjiArai | 6:1aff9f05d487 | 125 | memcpy( &controller.data[0], RCBControllerPayload, sizeof(controller)); |
| kenjiArai | 6:1aff9f05d487 | 126 | DEBUG("DATA:0x%02x 0x%02x %d %d %d %d %d %d %d 0x%02x\r\n", |
| kenjiArai | 6:1aff9f05d487 | 127 | controller.data[0],controller.data[1],controller.data[2],controller.data[3], |
| kenjiArai | 6:1aff9f05d487 | 128 | controller.data[4],controller.data[5],controller.data[6],controller.data[7], |
| kenjiArai | 6:1aff9f05d487 | 129 | controller.data[8],controller.data[9]); |
| kenjiArai | 6:1aff9f05d487 | 130 | data_analysis(); |
| kenjiArai | 6:1aff9f05d487 | 131 | } |
| jksoft | 1:48f6e08a3ac2 | 132 | } |
| jksoft | 1:48f6e08a3ac2 | 133 | |
| kenjiArai | 6:1aff9f05d487 | 134 | int main(void){ |
| kenjiArai | 6:1aff9f05d487 | 135 | DEBUG("\r\nInitialising the nRF51822\r\n"); |
| kenjiArai | 6:1aff9f05d487 | 136 | ble.init(); |
| kenjiArai | 6:1aff9f05d487 | 137 | ble.setDeviceName((const uint8_t *)deviceName); |
| kenjiArai | 6:1aff9f05d487 | 138 | ble.onDisconnection(disconnectionCallback); |
| jksoft | 1:48f6e08a3ac2 | 139 | ble.onDataWritten(onDataWritten); |
| kenjiArai | 6:1aff9f05d487 | 140 | DEBUG("Start RCB Controller\r\n"); |
| jksoft | 1:48f6e08a3ac2 | 141 | /* setup advertising */ |
| jksoft | 1:48f6e08a3ac2 | 142 | ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED); |
| jksoft | 1:48f6e08a3ac2 | 143 | ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); |
| jksoft | 1:48f6e08a3ac2 | 144 | ble.accumulateAdvertisingPayload(GapAdvertisingData::SHORTENED_LOCAL_NAME, |
| kenjiArai | 6:1aff9f05d487 | 145 | (const uint8_t *)deviceName, strlen(deviceName)); |
| jksoft | 1:48f6e08a3ac2 | 146 | ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, |
| kenjiArai | 7:45655ac58160 | 147 | (const uint8_t *)RCBController_service_uuid, |
| kenjiArai | 7:45655ac58160 | 148 | sizeof(RCBController_service_uuid)); |
| jksoft | 1:48f6e08a3ac2 | 149 | ble.setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */ |
| jksoft | 1:48f6e08a3ac2 | 150 | ble.startAdvertising(); |
| jksoft | 1:48f6e08a3ac2 | 151 | ble.addService(RCBControllerService); |
| jksoft | 1:48f6e08a3ac2 | 152 | while (true) { |
| jksoft | 1:48f6e08a3ac2 | 153 | ble.waitForEvent(); |
| jksoft | 0:8c643bfe55b7 | 154 | } |
| jksoft | 0:8c643bfe55b7 | 155 | } |
