test

Dependencies:   BufferedSerial WatchdogTimer

Committer:
harada_jpms
Date:
Fri Jun 01 06:26:08 2018 +0000
Revision:
0:ad0d1afb4462
Child:
1:d2ebf1c3ae5a
20180601_1530

Who changed what in which revision?

UserRevisionLine numberNew contents of line
harada_jpms 0:ad0d1afb4462 1 // Include --------------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 2 #include "mbed.h"
harada_jpms 0:ad0d1afb4462 3 #include "BLE.h"
harada_jpms 0:ad0d1afb4462 4 #include "DiscoveredCharacteristic.h"
harada_jpms 0:ad0d1afb4462 5 #include "DiscoveredService.h"
harada_jpms 0:ad0d1afb4462 6 #include "UARTService.h"
harada_jpms 0:ad0d1afb4462 7
harada_jpms 0:ad0d1afb4462 8 // Definition -----------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 9 #define NUM_ONCE 20
harada_jpms 0:ad0d1afb4462 10 #define BFSIZE (NUM_ONCE+4)
harada_jpms 0:ad0d1afb4462 11
harada_jpms 0:ad0d1afb4462 12 #define SOFT_DEVICE_FATHER_HANDLE 3
harada_jpms 0:ad0d1afb4462 13
harada_jpms 0:ad0d1afb4462 14 // Object ---------------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 15 BLE& ble_uart = BLE::Instance();
harada_jpms 0:ad0d1afb4462 16 Serial pc(P0_1, P0_3, 115200); // for another board
harada_jpms 0:ad0d1afb4462 17 Ticker main_timer; // メインタイマー
harada_jpms 0:ad0d1afb4462 18
harada_jpms 0:ad0d1afb4462 19 // ROM / Constant data --------------------------------------------------------
harada_jpms 0:ad0d1afb4462 20 const Gap::Address_t mac_board_0 = {0xFF, 0x42, 0xD5, 0x9C, 0x9C, 0xE1};
harada_jpms 0:ad0d1afb4462 21
harada_jpms 0:ad0d1afb4462 22 // RAM ------------------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 23 Gap::Handle_t connectionHandle = 0xFFFF;
harada_jpms 0:ad0d1afb4462 24 DiscoveredCharacteristic uartTXCharacteristic;
harada_jpms 0:ad0d1afb4462 25 DiscoveredCharacteristic uartRXCharacteristic;
harada_jpms 0:ad0d1afb4462 26 bool foundUartRXCharacteristic = false;
harada_jpms 0:ad0d1afb4462 27 bool connected2server = false;
harada_jpms 0:ad0d1afb4462 28 bool connection_tx = false;
harada_jpms 0:ad0d1afb4462 29 bool connection_rx = false;
harada_jpms 0:ad0d1afb4462 30 UARTService * uartServicePtr = NULL;
harada_jpms 0:ad0d1afb4462 31 Gap::Address_t my_mac;
harada_jpms 0:ad0d1afb4462 32 int my_board_index = -1;
harada_jpms 0:ad0d1afb4462 33 bool received_uart_dat = false;
harada_jpms 0:ad0d1afb4462 34 int8_t uart_buffer[BFSIZE];
harada_jpms 0:ad0d1afb4462 35 uint8_t uart_bf_len;
harada_jpms 0:ad0d1afb4462 36 volatile bool rx_isr_busy = false;
harada_jpms 0:ad0d1afb4462 37
harada_jpms 0:ad0d1afb4462 38 // Function prototypes --------------------------------------------------------
harada_jpms 0:ad0d1afb4462 39 // BLE
harada_jpms 0:ad0d1afb4462 40 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *);
harada_jpms 0:ad0d1afb4462 41 void serviceDiscoveryCallback(const DiscoveredService *);
harada_jpms 0:ad0d1afb4462 42 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *);
harada_jpms 0:ad0d1afb4462 43 void discoveryTerminationCallback(Gap::Handle_t );
harada_jpms 0:ad0d1afb4462 44 void onReceivedDataFromDeviceCallback(const GattHVXCallbackParams *);
harada_jpms 0:ad0d1afb4462 45 void connectionCallback(const Gap::ConnectionCallbackParams_t *);
harada_jpms 0:ad0d1afb4462 46 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *);
harada_jpms 0:ad0d1afb4462 47 // Pre-check
harada_jpms 0:ad0d1afb4462 48 bool mac_equals(const Gap::Address_t, const Gap::Address_t);
harada_jpms 0:ad0d1afb4462 49 int get_board_index(const Gap::Address_t);
harada_jpms 0:ad0d1afb4462 50
harada_jpms 0:ad0d1afb4462 51 //------------------------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 52 // Control Program
harada_jpms 0:ad0d1afb4462 53 //------------------------------------------------------------------------------
harada_jpms 0:ad0d1afb4462 54 int main(void)
harada_jpms 0:ad0d1afb4462 55 {
harada_jpms 0:ad0d1afb4462 56 // opening message
harada_jpms 0:ad0d1afb4462 57 pc.printf("UART Communication / Client(Central) side\r\n");
harada_jpms 0:ad0d1afb4462 58 pc.printf(" need Server module (run BLE_Uart_Server program)\r\n");
harada_jpms 0:ad0d1afb4462 59 // Mixed role **************************************************************
harada_jpms 0:ad0d1afb4462 60 ble_uart.init();
harada_jpms 0:ad0d1afb4462 61 ble_uart.gap().onConnection(connectionCallback);
harada_jpms 0:ad0d1afb4462 62 ble_uart.gap().onDisconnection(disconnectionCallback);
harada_jpms 0:ad0d1afb4462 63 // Client(Central) role ****************************************************
harada_jpms 0:ad0d1afb4462 64 ble_uart.gattClient().onHVX(onReceivedDataFromDeviceCallback);
harada_jpms 0:ad0d1afb4462 65 ble_uart.gap().setScanParams(500, 450);
harada_jpms 0:ad0d1afb4462 66 ble_uart.gap().startScan(advertisementCallback);
harada_jpms 0:ad0d1afb4462 67 while(true) {
harada_jpms 0:ad0d1afb4462 68 // allow notifications from Server(Peripheral)
harada_jpms 0:ad0d1afb4462 69 if (foundUartRXCharacteristic &&
harada_jpms 0:ad0d1afb4462 70 !ble_uart.gattClient().isServiceDiscoveryActive()) {
harada_jpms 0:ad0d1afb4462 71 // need to do the following only once
harada_jpms 0:ad0d1afb4462 72 foundUartRXCharacteristic = false;
harada_jpms 0:ad0d1afb4462 73 uint16_t value = BLE_HVX_NOTIFICATION;
harada_jpms 0:ad0d1afb4462 74 ble_uart.gattClient().write(
harada_jpms 0:ad0d1afb4462 75 GattClient::GATT_OP_WRITE_REQ,
harada_jpms 0:ad0d1afb4462 76 connectionHandle,
harada_jpms 0:ad0d1afb4462 77 uartRXCharacteristic.getValueHandle() + 1,
harada_jpms 0:ad0d1afb4462 78 sizeof(uint16_t),
harada_jpms 0:ad0d1afb4462 79 reinterpret_cast<const uint8_t *>(&value)
harada_jpms 0:ad0d1afb4462 80 );
harada_jpms 0:ad0d1afb4462 81
harada_jpms 0:ad0d1afb4462 82 if (received_uart_dat == true) {
harada_jpms 0:ad0d1afb4462 83 received_uart_dat = false;
harada_jpms 0:ad0d1afb4462 84 for(int i = 0; i < uart_bf_len; i++) {
harada_jpms 0:ad0d1afb4462 85 //pc.printf("%c", uart_buffer[i]);
harada_jpms 0:ad0d1afb4462 86 pc.putc(uart_buffer[i]);
harada_jpms 0:ad0d1afb4462 87 }
harada_jpms 0:ad0d1afb4462 88 }
harada_jpms 0:ad0d1afb4462 89 }
harada_jpms 0:ad0d1afb4462 90
harada_jpms 0:ad0d1afb4462 91 ble_uart.waitForEvent();
harada_jpms 0:ad0d1afb4462 92 }
harada_jpms 0:ad0d1afb4462 93 }
harada_jpms 0:ad0d1afb4462 94
harada_jpms 0:ad0d1afb4462 95 void onReceivedDataFromDeviceCallback(const GattHVXCallbackParams *params)
harada_jpms 0:ad0d1afb4462 96 {
harada_jpms 0:ad0d1afb4462 97 if (params->type == BLE_HVX_NOTIFICATION) {
harada_jpms 0:ad0d1afb4462 98 if ((params->handle
harada_jpms 0:ad0d1afb4462 99 == uartRXCharacteristic.getValueHandle()) && (params->len > 0)) {
harada_jpms 0:ad0d1afb4462 100 uart_bf_len = params->len;
harada_jpms 0:ad0d1afb4462 101 strcpy((char *)uart_buffer, (char *)params->data);
harada_jpms 0:ad0d1afb4462 102 received_uart_dat = true;
harada_jpms 0:ad0d1afb4462 103 }
harada_jpms 0:ad0d1afb4462 104 }
harada_jpms 0:ad0d1afb4462 105 }
harada_jpms 0:ad0d1afb4462 106
harada_jpms 0:ad0d1afb4462 107 bool mac_equals(const Gap::Address_t mac_1, const Gap::Address_t mac_2)
harada_jpms 0:ad0d1afb4462 108 {
harada_jpms 0:ad0d1afb4462 109 for (int i = 0; i < 6; i++) {
harada_jpms 0:ad0d1afb4462 110
harada_jpms 0:ad0d1afb4462 111 }
harada_jpms 0:ad0d1afb4462 112
harada_jpms 0:ad0d1afb4462 113 for (int i = 0; i < 6; i++) {
harada_jpms 0:ad0d1afb4462 114 if (mac_1[i] != mac_2[i]) {
harada_jpms 0:ad0d1afb4462 115 return false;
harada_jpms 0:ad0d1afb4462 116 } else {
harada_jpms 0:ad0d1afb4462 117 }
harada_jpms 0:ad0d1afb4462 118 }
harada_jpms 0:ad0d1afb4462 119 return true;
harada_jpms 0:ad0d1afb4462 120 }
harada_jpms 0:ad0d1afb4462 121
harada_jpms 0:ad0d1afb4462 122 int get_board_index(const Gap::Address_t mac)
harada_jpms 0:ad0d1afb4462 123 {
harada_jpms 0:ad0d1afb4462 124 if (mac_equals(mac, mac_board_0)) {
harada_jpms 0:ad0d1afb4462 125 return 0;
harada_jpms 0:ad0d1afb4462 126 }
harada_jpms 0:ad0d1afb4462 127 #if 0
harada_jpms 0:ad0d1afb4462 128 if (mac_equals(mac, mac_board_1)) {
harada_jpms 0:ad0d1afb4462 129 return 1;
harada_jpms 0:ad0d1afb4462 130 }
harada_jpms 0:ad0d1afb4462 131 if (mac_equals(mac, mac_board_2)) {
harada_jpms 0:ad0d1afb4462 132 return 2;
harada_jpms 0:ad0d1afb4462 133 }
harada_jpms 0:ad0d1afb4462 134 if (mac_equals(mac, mac_board_3)) {
harada_jpms 0:ad0d1afb4462 135 return 3;
harada_jpms 0:ad0d1afb4462 136 }
harada_jpms 0:ad0d1afb4462 137 if (mac_equals(mac, mac_board_4)) {
harada_jpms 0:ad0d1afb4462 138 return 4;
harada_jpms 0:ad0d1afb4462 139 }
harada_jpms 0:ad0d1afb4462 140 #endif
harada_jpms 0:ad0d1afb4462 141 return -1;
harada_jpms 0:ad0d1afb4462 142 }
harada_jpms 0:ad0d1afb4462 143
harada_jpms 0:ad0d1afb4462 144 // Client(Central) role ********************************************************
harada_jpms 0:ad0d1afb4462 145 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params)
harada_jpms 0:ad0d1afb4462 146 {
harada_jpms 0:ad0d1afb4462 147 // connections
harada_jpms 0:ad0d1afb4462 148 int peer_board_index = get_board_index(params->peerAddr);
harada_jpms 0:ad0d1afb4462 149 if (peer_board_index != -1) {
harada_jpms 0:ad0d1afb4462 150 pc.printf("");
harada_jpms 0:ad0d1afb4462 151 pc.printf(
harada_jpms 0:ad0d1afb4462 152 "adv peerAddr [%02x %02x %02x %02x %02x %02x]\r\n",
harada_jpms 0:ad0d1afb4462 153 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3],
harada_jpms 0:ad0d1afb4462 154 params->peerAddr[2], params->peerAddr[1], params->peerAddr[0]
harada_jpms 0:ad0d1afb4462 155 );
harada_jpms 0:ad0d1afb4462 156 pc.printf(
harada_jpms 0:ad0d1afb4462 157 "rssi=%+4d, isScanResponse %u, AdvertisementType %u\r\n",
harada_jpms 0:ad0d1afb4462 158 params->rssi, params->isScanResponse, params->type
harada_jpms 0:ad0d1afb4462 159 );
harada_jpms 0:ad0d1afb4462 160 ble_uart.gap().connect(
harada_jpms 0:ad0d1afb4462 161 params->peerAddr, Gap::ADDR_TYPE_RANDOM_STATIC, NULL, NULL);
harada_jpms 0:ad0d1afb4462 162 }
harada_jpms 0:ad0d1afb4462 163 }
harada_jpms 0:ad0d1afb4462 164
harada_jpms 0:ad0d1afb4462 165 void serviceDiscoveryCallback(const DiscoveredService *service)
harada_jpms 0:ad0d1afb4462 166 {
harada_jpms 0:ad0d1afb4462 167 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
harada_jpms 0:ad0d1afb4462 168
harada_jpms 0:ad0d1afb4462 169 } else {
harada_jpms 0:ad0d1afb4462 170 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
harada_jpms 0:ad0d1afb4462 171 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
harada_jpms 0:ad0d1afb4462 172
harada_jpms 0:ad0d1afb4462 173 }
harada_jpms 0:ad0d1afb4462 174 }
harada_jpms 0:ad0d1afb4462 175 }
harada_jpms 0:ad0d1afb4462 176
harada_jpms 0:ad0d1afb4462 177 void characteristicDiscoveryCallback(
harada_jpms 0:ad0d1afb4462 178 const DiscoveredCharacteristic *characteristicP)
harada_jpms 0:ad0d1afb4462 179 {
harada_jpms 0:ad0d1afb4462 180
harada_jpms 0:ad0d1afb4462 181 if (characteristicP->getUUID().getShortUUID()
harada_jpms 0:ad0d1afb4462 182 == UARTServiceTXCharacteristicShortUUID) {
harada_jpms 0:ad0d1afb4462 183 uartTXCharacteristic = *characteristicP;
harada_jpms 0:ad0d1afb4462 184 connection_tx = true;
harada_jpms 0:ad0d1afb4462 185 } else if (characteristicP->getUUID().getShortUUID()
harada_jpms 0:ad0d1afb4462 186 == UARTServiceRXCharacteristicShortUUID) {
harada_jpms 0:ad0d1afb4462 187 uartRXCharacteristic = *characteristicP;
harada_jpms 0:ad0d1afb4462 188 foundUartRXCharacteristic = true;
harada_jpms 0:ad0d1afb4462 189 connection_rx = true;
harada_jpms 0:ad0d1afb4462 190 }
harada_jpms 0:ad0d1afb4462 191 }
harada_jpms 0:ad0d1afb4462 192
harada_jpms 0:ad0d1afb4462 193 void discoveryTerminationCallback(Gap::Handle_t connectionHandle)
harada_jpms 0:ad0d1afb4462 194 {
harada_jpms 0:ad0d1afb4462 195 }
harada_jpms 0:ad0d1afb4462 196
harada_jpms 0:ad0d1afb4462 197 // Mixed role ******************************************************************
harada_jpms 0:ad0d1afb4462 198 void connectionCallback(const Gap::ConnectionCallbackParams_t *params)
harada_jpms 0:ad0d1afb4462 199 {
harada_jpms 0:ad0d1afb4462 200 if (params->role == Gap::CENTRAL) {
harada_jpms 0:ad0d1afb4462 201 pc.printf("connected as Client(Central) (handle = %d)\r\n\r",
harada_jpms 0:ad0d1afb4462 202 params->handle);
harada_jpms 0:ad0d1afb4462 203 connected2server = true;
harada_jpms 0:ad0d1afb4462 204 connectionHandle = params->handle;
harada_jpms 0:ad0d1afb4462 205 ble_uart.gattClient().onServiceDiscoveryTermination(
harada_jpms 0:ad0d1afb4462 206 discoveryTerminationCallback);
harada_jpms 0:ad0d1afb4462 207 ble_uart.gattClient().launchServiceDiscovery(
harada_jpms 0:ad0d1afb4462 208 params->handle,
harada_jpms 0:ad0d1afb4462 209 serviceDiscoveryCallback,
harada_jpms 0:ad0d1afb4462 210 characteristicDiscoveryCallback
harada_jpms 0:ad0d1afb4462 211 );
harada_jpms 0:ad0d1afb4462 212 }
harada_jpms 0:ad0d1afb4462 213 pc.printf(
harada_jpms 0:ad0d1afb4462 214 "Client(Central/Myself) %02x:%02x:%02x:%02x:%02x:%02x\r\n",
harada_jpms 0:ad0d1afb4462 215 params->ownAddr[5], params->ownAddr[4], params->ownAddr[3],
harada_jpms 0:ad0d1afb4462 216 params->ownAddr[2], params->ownAddr[1], params->ownAddr[0]
harada_jpms 0:ad0d1afb4462 217 );
harada_jpms 0:ad0d1afb4462 218 pc.printf(
harada_jpms 0:ad0d1afb4462 219 "Connected Server(Peripheral) %02x:%02x:%02x:%02x:%02x:%02x\r\n",
harada_jpms 0:ad0d1afb4462 220 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3],
harada_jpms 0:ad0d1afb4462 221 params->peerAddr[2], params->peerAddr[1], params->peerAddr[0]
harada_jpms 0:ad0d1afb4462 222 );
harada_jpms 0:ad0d1afb4462 223 }
harada_jpms 0:ad0d1afb4462 224
harada_jpms 0:ad0d1afb4462 225 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params)
harada_jpms 0:ad0d1afb4462 226 {
harada_jpms 0:ad0d1afb4462 227 pc.printf(" -> disconnected\r\n", params->handle);
harada_jpms 0:ad0d1afb4462 228 connected2server = false;
harada_jpms 0:ad0d1afb4462 229 // connection_1st = false;
harada_jpms 0:ad0d1afb4462 230 connection_tx = false;
harada_jpms 0:ad0d1afb4462 231 connection_rx = false;
harada_jpms 0:ad0d1afb4462 232 if (params->handle == SOFT_DEVICE_FATHER_HANDLE) {
harada_jpms 0:ad0d1afb4462 233 ble_uart.startAdvertising(); // restart advertising
harada_jpms 0:ad0d1afb4462 234 } else {
harada_jpms 0:ad0d1afb4462 235 ble_uart.gap().startScan(advertisementCallback);// restart scan
harada_jpms 0:ad0d1afb4462 236 }
harada_jpms 0:ad0d1afb4462 237 }