micro:bitにRCBControllerを接続するサンプルプログラム。 接続が不安定。micro:bitの電源入り切りやリセットSW押下を何度か試せば接続できるかも。

Dependencies:   microbit

Fork of BLE_GATT_Example by Bluetooth Low Energy

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include "MicroBit.h"
00002 #include "ble/BLE.h"
00003 #include "RCBController.h"
00004 
00005 Serial pc(USBTX, USBRX);
00006 
00007 MicroBit uBit;
00008 MicroBitImage ARROW_N("\
00009         0 0 1 0 0\n\
00010         0 1 1 1 0\n\
00011         1 0 1 0 1\n\
00012         0 0 1 0 0\n\
00013         0 0 1 0 0\n"); 
00014 MicroBitImage ARROW_S("\
00015         0 0 1 0 0\n\
00016         0 0 1 0 0\n\
00017         1 0 1 0 1\n\
00018         0 1 1 1 0\n\
00019         0 0 1 0 0\n"); 
00020 MicroBitImage ARROW_E("\
00021         0 0 1 0 0\n\
00022         0 0 0 1 0\n\
00023         1 1 1 1 1\n\
00024         0 0 0 1 0\n\
00025         0 0 1 0 0\n"); 
00026 MicroBitImage ARROW_W("\
00027         0 0 1 0 0\n\
00028         0 1 0 0 0\n\
00029         1 1 1 1 1\n\
00030         0 1 0 0 0\n\
00031         0 0 1 0 0\n"); 
00032 
00033 uint16_t RCBController_service_uuid        = 0xFFF0;
00034 uint16_t RCBController_Characteristic_uuid = 0xFFF1;
00035 
00036 RCBController controller;
00037 
00038 const static char     DEVICE_NAME[]        = "micro:bit"; // change this
00039 static const uint16_t uuid16_list[]        = {0xFFFF}; //Custom UUID, FFFF is reserved for development
00040 //static const uint16_t uuid16_list[]        = {0xFFF0}; //Custom UUID, FFFF is reserved for development
00041 
00042 /* Set Up custom Characteristics */
00043 static uint8_t writeValue[10] = {0};
00044 WriteOnlyArrayGattCharacteristic<uint8_t, sizeof(writeValue)> Controller(RCBController_Characteristic_uuid, writeValue, GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE_WITHOUT_RESPONSE);
00045 
00046 /* Set up custom service */
00047 GattCharacteristic *characteristics[] = {&Controller};
00048 GattService        customService(RCBController_service_uuid, characteristics, sizeof(characteristics) / sizeof(GattCharacteristic *));
00049 
00050 void connectionCallback(const Gap::ConnectionCallbackParams_t *)
00051 {
00052     uBit.display.print("C");
00053     printf("connectionCallback\n\r");
00054 }
00055 
00056 /*
00057  *  Restart advertising when phone app disconnects
00058 */
00059 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
00060 {
00061     uBit.display.print("D");
00062     printf("disconnectionCallback\n\r");
00063     BLE::Instance(BLE::DEFAULT_INSTANCE).gap().startAdvertising();
00064 }
00065 
00066 /*
00067  *  Handle writes to writeCharacteristic
00068 */
00069 void writeCharCallback(const GattWriteCallbackParams *params)
00070 {
00071     printf("writeCharCallback\n\r");
00072     /* Check to see what characteristic was written, by handle */
00073     if(params->handle == Controller.getValueHandle()) {
00074         if(params->len == 10) {
00075             printf("Data received: length = %d, data = 0x",params->len);
00076             for(int x=0; x < params->len; x++) {
00077                 printf("%x", params->data[x]);
00078             }
00079             printf("\n\r");
00080             memcpy( &controller.data[0], &params->data[0], sizeof(controller));
00081             if(controller.status.UP) {
00082                 uBit.display.print(ARROW_N);
00083             }
00084             else if(controller.status.DOWN) {
00085                 uBit.display.print(ARROW_S);
00086             }
00087             else if(controller.status.RIGHT) {
00088                 uBit.display.print(ARROW_E);
00089             }
00090             else if(controller.status.LEFT) {
00091                 uBit.display.print(ARROW_W);
00092             }
00093             else if(controller.status.X) {
00094                 uBit.display.print("X");
00095             }
00096             else if(controller.status.Y) {
00097                 uBit.display.print("Y");
00098             }
00099             else if(controller.status.A) {
00100                 uBit.display.print("A");
00101             }
00102             else if(controller.status.B) {
00103                 uBit.display.print("B");
00104             }
00105             else {
00106                 uBit.display.clear();
00107             }
00108         }
00109     }
00110 }
00111 /*
00112  * Initialization callback
00113  */
00114 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
00115 {
00116     BLE &ble          = params->ble;
00117     ble_error_t error = params->error;
00118     
00119     if (error != BLE_ERROR_NONE) {
00120         return;
00121     }
00122 
00123     ble.gap().onConnection(connectionCallback);
00124     ble.gap().onDisconnection(disconnectionCallback);
00125     ble.gattServer().onDataWritten(writeCharCallback);
00126 
00127     /* Setup advertising */
00128     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE); // BLE only, no classic BT
00129     ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED); // advertising type
00130     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)); // add name
00131     ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t *)uuid16_list, sizeof(uuid16_list)); // UUID's broadcast in advertising packet
00132     ble.gap().setAdvertisingInterval(100); // 100ms.
00133 
00134     /* Add our custom service */
00135     ble.addService(customService);
00136 
00137     /* Start advertising */
00138     ble.gap().startAdvertising();
00139 }
00140 
00141 /*
00142  *  Main loop
00143 */
00144 int main(void)
00145 {
00146     pc.baud(115200);
00147     /* initialize stuff */
00148     printf("\n\r********* Starting Main Loop *********\n\r");
00149     
00150     BLE& ble = BLE::Instance(BLE::DEFAULT_INSTANCE);
00151     ble.init(bleInitComplete);
00152     
00153     /* SpinWait for initialization to complete. This is necessary because the
00154      * BLE object is used in the main loop below. */
00155     while (ble.hasInitialized()  == false) { /* spin loop */ }
00156 
00157     uBit.init();
00158     uBit.display.print("D");
00159     /* Infinite loop waiting for BLE interrupt events */
00160     while (true) {
00161         ble.waitForEvent(); /* Save power */
00162     }
00163 }