micro:bitにRCBControllerを接続するサンプルプログラム。 接続が不安定。micro:bitの電源入り切りやリセットSW押下を何度か試せば接続できるかも。
Fork of BLE_GATT_Example by
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], ¶ms->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 }
Generated on Tue Jul 12 2022 22:55:11 by 1.7.2