Pair function with BLE_Paired_Sever. If missing BLE_Paired_Server side, BZ will ON for notice.

Dependencies:   BLE_API TextLCD mbed nRF51822 nRF51_LowPwr nRF51_Vdd

Committer:
kenjiArai
Date:
Wed Jun 01 12:36:23 2016 +0000
Revision:
4:ed7848c6d374
Parent:
3:d6f80e11a7f4
Child:
5:315161fd3d19
Pair function with BLE_Paired_Client. If missing BLE_Paired_Server side, BZ will ON for notice.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 4:ed7848c6d374 1 /*
kenjiArai 4:ed7848c6d374 2 * /////// Tested on Switch Science mbed TY51822r3 ///////
kenjiArai 4:ed7848c6d374 3 * Modified by Kenji Arai
kenjiArai 4:ed7848c6d374 4 * http://www.page.sannet.ne.jp/kenjia/index.html
kenjiArai 4:ed7848c6d374 5 * http://mbed.org/users/kenjiArai/
kenjiArai 4:ed7848c6d374 6 *
kenjiArai 4:ed7848c6d374 7 * Started: April 8th, 2016
kenjiArai 4:ed7848c6d374 8 * Revised: June 1st, 2016
kenjiArai 4:ed7848c6d374 9 *
kenjiArai 4:ed7848c6d374 10 * Original program:
kenjiArai 4:ed7848c6d374 11 * BLE_Nano_CentralTest
kenjiArai 4:ed7848c6d374 12 * https://developer.mbed.org/users/mbed_tw_hoehoe/code/BLE_Nano_CentralTest/
kenjiArai 4:ed7848c6d374 13 * S130 potential unstability case [closed] by Fabien Comte
kenjiArai 4:ed7848c6d374 14 * https://devzone.nordicsemi.com/question/49705/s130-potential-unstability-case/
kenjiArai 4:ed7848c6d374 15 * Tested Device:
kenjiArai 4:ed7848c6d374 16 * BLE_Paired_Server
kenjiArai 4:ed7848c6d374 17 *
kenjiArai 4:ed7848c6d374 18 */
kenjiArai 4:ed7848c6d374 19
kenjiArai 4:ed7848c6d374 20 // Include ---------------------------------------------------------------------------------------
mbed_tw_hoehoe 0:83b5c6efd8d7 21 #include "mbed.h"
kenjiArai 4:ed7848c6d374 22 #include "BLE.h"
kenjiArai 4:ed7848c6d374 23 #include "DiscoveredCharacteristic.h"
kenjiArai 4:ed7848c6d374 24 #include "DiscoveredService.h"
kenjiArai 4:ed7848c6d374 25 #include "GapScanningParams.h"
mbed_tw_hoehoe 2:4b53d13d9851 26 #include "ble_radio_notification.h"
mbed_tw_hoehoe 3:d6f80e11a7f4 27 #include "ble_gap.h"
kenjiArai 4:ed7848c6d374 28 #include "nrf_delay.h"
kenjiArai 4:ed7848c6d374 29 #include "nRF51_Vdd.h"
kenjiArai 4:ed7848c6d374 30 #include "TextLCD.h"
kenjiArai 4:ed7848c6d374 31 #include "nRF51_lowpwr.h"
mbed_tw_hoehoe 0:83b5c6efd8d7 32
kenjiArai 4:ed7848c6d374 33 // Definition ------------------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 34 // Before using this function, please specify your program are used following functions or not.
kenjiArai 4:ed7848c6d374 35 #define USE_DEVICE_STDIO_MESSAGES 0 // printf
kenjiArai 4:ed7848c6d374 36 #define USE_DEVICE_SERIAL 0 // Serial or DEBUG & etc.
kenjiArai 4:ed7848c6d374 37 #define USE_DEVICE_I2C 1 // Sensors with I2C, LCD, EEPROM, Driver chips & etc.
kenjiArai 4:ed7848c6d374 38 #define USE_DEVICE_SPI 0 // Sensors with SOI, LCD, EEPROM, Driver chips & etc.
kenjiArai 4:ed7848c6d374 39 #define USE_DEVICE_SPISLAVE 0 // Communication with master vis SPI
kenjiArai 4:ed7848c6d374 40 #define USE_DEVICE_PWMOUT 0 // PWM duty output, Serve & etc.
kenjiArai 4:ed7848c6d374 41 #define USE_DEVICE_ANALOGIN 0 // Analog adc
mbed_tw_hoehoe 3:d6f80e11a7f4 42
mbed_tw_hoehoe 3:d6f80e11a7f4 43 typedef struct {
mbed_tw_hoehoe 3:d6f80e11a7f4 44 Gap::Handle_t handle;
mbed_tw_hoehoe 3:d6f80e11a7f4 45 Gap::Address_t address;
kenjiArai 4:ed7848c6d374 46 bool connected;
kenjiArai 4:ed7848c6d374 47 uint8_t* deviceName;
mbed_tw_hoehoe 3:d6f80e11a7f4 48 } peripheral_t;
mbed_tw_hoehoe 3:d6f80e11a7f4 49
kenjiArai 4:ed7848c6d374 50 #define LIMIT_JUDGE_CNT 4
kenjiArai 4:ed7848c6d374 51
kenjiArai 4:ed7848c6d374 52 #if USE_DEVICE_SERIAL
kenjiArai 4:ed7848c6d374 53 #define BAUD(x) pc.baud(x)
kenjiArai 4:ed7848c6d374 54 #define GETC(x) pc.getc(x)
kenjiArai 4:ed7848c6d374 55 #define PUTC(x) pc.putc(x)
kenjiArai 4:ed7848c6d374 56 #define PRINTF(...) pc.printf(__VA_ARGS__)
kenjiArai 4:ed7848c6d374 57 #define READABLE(x) pc.readable(x)
kenjiArai 4:ed7848c6d374 58 #define ATTACH(x,y) pc.attach(x,y)
kenjiArai 4:ed7848c6d374 59 #else
kenjiArai 4:ed7848c6d374 60 #define BAUD(x)
kenjiArai 4:ed7848c6d374 61 #define GETC(x) 'c'
kenjiArai 4:ed7848c6d374 62 #define PUTC(x)
kenjiArai 4:ed7848c6d374 63 #define PRINTF(...)
kenjiArai 4:ed7848c6d374 64 #define READABLE(x)
kenjiArai 4:ed7848c6d374 65 #define ATTACH(x,y)
kenjiArai 4:ed7848c6d374 66 #endif
kenjiArai 4:ed7848c6d374 67
kenjiArai 4:ed7848c6d374 68 // Object ----------------------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 69 BLE ble;
kenjiArai 4:ed7848c6d374 70 DigitalOut alivenessLED(LED1, 1);
kenjiArai 4:ed7848c6d374 71 DigitalOut connectedLED(LED2, 0);
kenjiArai 4:ed7848c6d374 72 DigitalOut buzzer(LED3, 0);
kenjiArai 4:ed7848c6d374 73 #if USE_DEVICE_SERIAL
kenjiArai 4:ed7848c6d374 74 Serial pc(USBTX, USBRX);
kenjiArai 4:ed7848c6d374 75 #endif
kenjiArai 4:ed7848c6d374 76 Ticker ticker;
kenjiArai 4:ed7848c6d374 77 nRF51_Vdd vdd(3.6f, 1.8f, ONLY4VDD);
kenjiArai 4:ed7848c6d374 78 I2C i2c1(P0_28, P0_29); // SDA, SCL
kenjiArai 4:ed7848c6d374 79 TextLCD_I2C_N lcd(&i2c1, ST7036_SA2, TextLCD::LCD8x2, NC, TextLCD::ST7032_3V3);
kenjiArai 4:ed7848c6d374 80
kenjiArai 4:ed7848c6d374 81 // ROM / Constant data ---------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 82 //#warning "You need to modify below values based on your board."
kenjiArai 4:ed7848c6d374 83 const Gap::Address_t mac_board_0 = {0x98, 0x11, 0x9b, 0x73, 0x1a, 0xe7}; // FRISK
kenjiArai 4:ed7848c6d374 84 /* followings are other own board
kenjiArai 4:ed7848c6d374 85 const Gap::Address_t mac_board_0 = {0x50, 0x2b, 0xea, 0x14, 0x95, 0xd2}; // Nano
kenjiArai 4:ed7848c6d374 86 const Gap::Address_t mac_board_0 = {0x98, 0x11, 0x9b, 0x73, 0x1a, 0xe7}; // FRISK
kenjiArai 4:ed7848c6d374 87 const Gap::Address_t mac_board_0 = {0x30, 0x74, 0x6d, 0xbd, 0x83, 0xf4}; // TY None Pin BLK
kenjiArai 4:ed7848c6d374 88 const Gap::Address_t mac_board_0 = {0x59, 0x2c, 0xa8, 0x0e, 0xe2, 0xef}; // TY cut PCB
kenjiArai 4:ed7848c6d374 89 */
kenjiArai 4:ed7848c6d374 90 const int8_t tx_power_level[8] =
kenjiArai 4:ed7848c6d374 91 {
kenjiArai 4:ed7848c6d374 92 RADIO_TXPOWER_TXPOWER_Pos4dBm, // 0
kenjiArai 4:ed7848c6d374 93 RADIO_TXPOWER_TXPOWER_0dBm, // 1
kenjiArai 4:ed7848c6d374 94 RADIO_TXPOWER_TXPOWER_Neg4dBm, // 2
kenjiArai 4:ed7848c6d374 95 RADIO_TXPOWER_TXPOWER_Neg8dBm, // 3
kenjiArai 4:ed7848c6d374 96 RADIO_TXPOWER_TXPOWER_Neg12dBm, // 4
kenjiArai 4:ed7848c6d374 97 RADIO_TXPOWER_TXPOWER_Neg16dBm, // 5
kenjiArai 4:ed7848c6d374 98 RADIO_TXPOWER_TXPOWER_Neg20dBm, // 6
kenjiArai 4:ed7848c6d374 99 RADIO_TXPOWER_TXPOWER_Neg30dBm // 7
kenjiArai 4:ed7848c6d374 100 };
kenjiArai 4:ed7848c6d374 101
kenjiArai 4:ed7848c6d374 102 const nRF51_LOWPWR_TypeDef lowpwr_table =
kenjiArai 4:ed7848c6d374 103 {
kenjiArai 4:ed7848c6d374 104 #if USE_DEVICE_STDIO_MESSAGES
kenjiArai 4:ed7848c6d374 105 true,
kenjiArai 4:ed7848c6d374 106 #else
kenjiArai 4:ed7848c6d374 107 false,
kenjiArai 4:ed7848c6d374 108 #endif
kenjiArai 4:ed7848c6d374 109 #if USE_DEVICE_SERIAL
kenjiArai 4:ed7848c6d374 110 true,
kenjiArai 4:ed7848c6d374 111 #else
kenjiArai 4:ed7848c6d374 112 false,
kenjiArai 4:ed7848c6d374 113 #endif
kenjiArai 4:ed7848c6d374 114 #if USE_DEVICE_I2C
kenjiArai 4:ed7848c6d374 115 true,
kenjiArai 4:ed7848c6d374 116 #else
kenjiArai 4:ed7848c6d374 117 false,
kenjiArai 4:ed7848c6d374 118 #endif
kenjiArai 4:ed7848c6d374 119 #if USE_DEVICE_SPI
kenjiArai 4:ed7848c6d374 120 true,
kenjiArai 4:ed7848c6d374 121 #else
kenjiArai 4:ed7848c6d374 122 false,
kenjiArai 4:ed7848c6d374 123 #endif
kenjiArai 4:ed7848c6d374 124 #if USE_DEVICE_SPISLAVE
kenjiArai 4:ed7848c6d374 125 true,
kenjiArai 4:ed7848c6d374 126 #else
kenjiArai 4:ed7848c6d374 127 false,
kenjiArai 4:ed7848c6d374 128 #endif
kenjiArai 4:ed7848c6d374 129 #if USE_DEVICE_PWMOUT
kenjiArai 4:ed7848c6d374 130 true,
kenjiArai 4:ed7848c6d374 131 #else
kenjiArai 4:ed7848c6d374 132 false,
kenjiArai 4:ed7848c6d374 133 #endif
kenjiArai 4:ed7848c6d374 134 #if USE_DEVICE_ANALOGIN
kenjiArai 4:ed7848c6d374 135 true
kenjiArai 4:ed7848c6d374 136 #else
kenjiArai 4:ed7848c6d374 137 false
kenjiArai 4:ed7848c6d374 138 #endif
kenjiArai 4:ed7848c6d374 139 };
kenjiArai 4:ed7848c6d374 140
kenjiArai 4:ed7848c6d374 141 // RAM -------------------------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 142 Gap::Address_t my_mac;
kenjiArai 4:ed7848c6d374 143 int my_board_index = -1;
kenjiArai 4:ed7848c6d374 144 int8_t alive_board = 0;
kenjiArai 4:ed7848c6d374 145 int8_t judge_counter = 0;
kenjiArai 4:ed7848c6d374 146 static peripheral_t peripheral_inf;
kenjiArai 4:ed7848c6d374 147 DiscoveredCharacteristic peripheral_dat_readChar;
kenjiArai 4:ed7848c6d374 148 DiscoveredCharacteristic central_dat_readChar;
kenjiArai 4:ed7848c6d374 149 volatile bool trigger5Sec_flag = false;
kenjiArai 4:ed7848c6d374 150 volatile bool triggerRead_flag = false;
kenjiArai 4:ed7848c6d374 151 uint16_t rcv_dt_len;
kenjiArai 4:ed7848c6d374 152 uint8_t rcv_dt[32];
kenjiArai 4:ed7848c6d374 153 uint32_t counter;
kenjiArai 4:ed7848c6d374 154 uint8_t contrast;
kenjiArai 4:ed7848c6d374 155
kenjiArai 4:ed7848c6d374 156 // Function prototypes ---------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 157 void periodicCallback(void);
kenjiArai 4:ed7848c6d374 158 uint32_t ble_advdata_parser(uint8_t type, uint8_t advdata_len, uint8_t *p_advdata,
kenjiArai 4:ed7848c6d374 159 uint8_t *len, uint8_t *p_field_data);
kenjiArai 4:ed7848c6d374 160 void scanCallback(const Gap::AdvertisementCallbackParams_t *params);
kenjiArai 4:ed7848c6d374 161 void serviceDiscoveryCallback(const DiscoveredService *service);
kenjiArai 4:ed7848c6d374 162 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP);
kenjiArai 4:ed7848c6d374 163 void connectionCallback(const Gap::ConnectionCallbackParams_t *params);
kenjiArai 4:ed7848c6d374 164 void discoveryTerminationCallback(Gap::Handle_t connectionHandle);
kenjiArai 4:ed7848c6d374 165 void triggerRead(const GattReadCallbackParams *response);
kenjiArai 4:ed7848c6d374 166 void triggerToggledWrite(const GattWriteCallbackParams *response);
kenjiArai 4:ed7848c6d374 167 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params);
kenjiArai 4:ed7848c6d374 168 void serialRxCallback();
kenjiArai 4:ed7848c6d374 169 void periodicCallback(void);
kenjiArai 4:ed7848c6d374 170 bool mac_equals(const Gap::Address_t mac_1, const Gap::Address_t mac_2);
kenjiArai 4:ed7848c6d374 171 void osc_5KHz(uint32_t time_sec);
kenjiArai 4:ed7848c6d374 172 uint8_t auto_contrast(float vdd);
kenjiArai 4:ed7848c6d374 173
kenjiArai 4:ed7848c6d374 174 //-------------------------------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 175 // Control Program
kenjiArai 4:ed7848c6d374 176 //-------------------------------------------------------------------------------------------------
kenjiArai 4:ed7848c6d374 177 int main(void) {
kenjiArai 4:ed7848c6d374 178 uint8_t *p;
mbed_tw_hoehoe 3:d6f80e11a7f4 179
kenjiArai 4:ed7848c6d374 180 nrf_delay_us(100);
kenjiArai 4:ed7848c6d374 181 ticker.attach(periodicCallback, 5); /* Blink LED every second */
kenjiArai 4:ed7848c6d374 182 ATTACH(&serialRxCallback, Serial::RxIrq);
kenjiArai 4:ed7848c6d374 183 for (int k = 0; k < 20; k++) { PRINTF("\r\n");}
kenjiArai 4:ed7848c6d374 184 PRINTF("Check paired Peripheral board\r\n"); // opening message
kenjiArai 4:ed7848c6d374 185 LowPwr set_lowpwr(&lowpwr_table);
kenjiArai 4:ed7848c6d374 186 // lcd
kenjiArai 4:ed7848c6d374 187 lcd.setCursor(TextLCD::CurOff_BlkOff);
kenjiArai 4:ed7848c6d374 188 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 189 // 12345678
kenjiArai 4:ed7848c6d374 190 lcd.printf("TY51822r");
kenjiArai 4:ed7848c6d374 191 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 192 // 12345678
kenjiArai 4:ed7848c6d374 193 lcd.puts(" JH1PJL ");
kenjiArai 4:ed7848c6d374 194 contrast = auto_contrast(vdd.read_real_value());
kenjiArai 4:ed7848c6d374 195 lcd.setContrast(contrast);
kenjiArai 4:ed7848c6d374 196 // BLE
kenjiArai 4:ed7848c6d374 197 ble.init();
kenjiArai 4:ed7848c6d374 198 ble.onConnection(connectionCallback);
kenjiArai 4:ed7848c6d374 199 ble.onDisconnection(disconnectionCallback);
kenjiArai 4:ed7848c6d374 200 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
kenjiArai 4:ed7848c6d374 201 ble.gattClient().onDataRead(triggerRead);
kenjiArai 4:ed7848c6d374 202 ble.gap().setScanParams(500, 400);
kenjiArai 4:ed7848c6d374 203 ble.gap().setTxPower(tx_power_level[0]);
kenjiArai 4:ed7848c6d374 204 ble.gap().startScan(scanCallback);
kenjiArai 4:ed7848c6d374 205 alive_board = 0;
kenjiArai 4:ed7848c6d374 206 while (true) {
kenjiArai 4:ed7848c6d374 207 if (trigger5Sec_flag == true){
kenjiArai 4:ed7848c6d374 208 trigger5Sec_flag = false;
kenjiArai 4:ed7848c6d374 209 peripheral_dat_readChar.read();
kenjiArai 4:ed7848c6d374 210 if (alive_board){
kenjiArai 4:ed7848c6d374 211 --judge_counter;
kenjiArai 4:ed7848c6d374 212 if (judge_counter < 0){
kenjiArai 4:ed7848c6d374 213 judge_counter = -1;
kenjiArai 4:ed7848c6d374 214 }
kenjiArai 4:ed7848c6d374 215 }
kenjiArai 4:ed7848c6d374 216 }
kenjiArai 4:ed7848c6d374 217 if (triggerRead_flag == true){
kenjiArai 4:ed7848c6d374 218 triggerRead_flag = false;
kenjiArai 4:ed7848c6d374 219 alivenessLED = 0;
kenjiArai 4:ed7848c6d374 220 PRINTF("%s", rcv_dt);
kenjiArai 4:ed7848c6d374 221 PRINTF("\r\n");
kenjiArai 4:ed7848c6d374 222 if (counter & 1UL){ // Change a screen contents
kenjiArai 4:ed7848c6d374 223 p = rcv_dt + 2;
kenjiArai 4:ed7848c6d374 224 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 225 // 12345678
kenjiArai 4:ed7848c6d374 226 lcd.printf(" Server ");
kenjiArai 4:ed7848c6d374 227 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 228 lcd.printf("%s", p);
kenjiArai 4:ed7848c6d374 229 } else {
kenjiArai 4:ed7848c6d374 230 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 231 // 12345678
kenjiArai 4:ed7848c6d374 232 lcd.printf(" Client ");
kenjiArai 4:ed7848c6d374 233 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 234 lcd.printf(" %3.2f[V]", vdd.read_real_value());
kenjiArai 4:ed7848c6d374 235 }
kenjiArai 4:ed7848c6d374 236 contrast = auto_contrast(vdd.read_real_value());
kenjiArai 4:ed7848c6d374 237 lcd.setContrast(contrast);
kenjiArai 4:ed7848c6d374 238 ++judge_counter;
kenjiArai 4:ed7848c6d374 239 if (judge_counter > LIMIT_JUDGE_CNT){
kenjiArai 4:ed7848c6d374 240 judge_counter = LIMIT_JUDGE_CNT;
kenjiArai 4:ed7848c6d374 241 alive_board = 1;
kenjiArai 4:ed7848c6d374 242 }
kenjiArai 4:ed7848c6d374 243 }
kenjiArai 4:ed7848c6d374 244 PRINTF("state %+d\r\n", judge_counter);
kenjiArai 4:ed7848c6d374 245 if ( judge_counter == -1){
kenjiArai 4:ed7848c6d374 246 PRINTF("%c", 0x07); // Ring a PC terminal bell
kenjiArai 4:ed7848c6d374 247 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 248 // 12345678
kenjiArai 4:ed7848c6d374 249 lcd.printf(" Server ");
kenjiArai 4:ed7848c6d374 250 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 251 // 12345678
kenjiArai 4:ed7848c6d374 252 lcd.printf("is gone!");
kenjiArai 4:ed7848c6d374 253 alivenessLED = !alivenessLED;
kenjiArai 4:ed7848c6d374 254 osc_5KHz(3);
kenjiArai 4:ed7848c6d374 255 }
kenjiArai 4:ed7848c6d374 256 ble.waitForEvent();
kenjiArai 4:ed7848c6d374 257 }
kenjiArai 4:ed7848c6d374 258 }
kenjiArai 4:ed7848c6d374 259
kenjiArai 4:ed7848c6d374 260 void osc_5KHz(uint32_t time_sec){
kenjiArai 4:ed7848c6d374 261 for (int32_t t = 0; t < time_sec; t++){ // Durartion
kenjiArai 4:ed7848c6d374 262 for (int32_t n = 0; n < 5000; n++){ // 1sec with 5KHz
kenjiArai 4:ed7848c6d374 263 buzzer = 1;
kenjiArai 4:ed7848c6d374 264 nrf_delay_us(100);
kenjiArai 4:ed7848c6d374 265 buzzer = 0;
kenjiArai 4:ed7848c6d374 266 nrf_delay_us(100);
kenjiArai 4:ed7848c6d374 267 }
kenjiArai 4:ed7848c6d374 268 }
kenjiArai 4:ed7848c6d374 269 buzzer = 0;
kenjiArai 4:ed7848c6d374 270 }
kenjiArai 4:ed7848c6d374 271
kenjiArai 4:ed7848c6d374 272 uint8_t auto_contrast(float vdd){
kenjiArai 4:ed7848c6d374 273 #define OFFSET_CONST 15
kenjiArai 4:ed7848c6d374 274 #define SIZE_OF_TBL 50
kenjiArai 4:ed7848c6d374 275 uint8_t n = 0;
kenjiArai 4:ed7848c6d374 276 const static uint16_t const_table[] =
kenjiArai 4:ed7848c6d374 277 {
kenjiArai 4:ed7848c6d374 278 360, 355, 350, 345, 340, 335, 330, 325, 320, 315, 310, 305, 300,
kenjiArai 4:ed7848c6d374 279 295, 290, 285, 280, 275, 270, 265, 260, 257, 253, 250, 247, 243,
kenjiArai 4:ed7848c6d374 280 240, 237, 233, 230, 227, 223, 220, 217, 215, 212, 210, 208, 206,
kenjiArai 4:ed7848c6d374 281 204, 202, 200, 197, 195, 193, 190, 185, 180, 170, 100
kenjiArai 4:ed7848c6d374 282 };
kenjiArai 4:ed7848c6d374 283
kenjiArai 4:ed7848c6d374 284 uint16_t v = (uint16_t)(vdd * 100);
kenjiArai 4:ed7848c6d374 285 for (; n < 50; n++){
kenjiArai 4:ed7848c6d374 286 if (v >= const_table[n]){
kenjiArai 4:ed7848c6d374 287 break;
kenjiArai 4:ed7848c6d374 288 }
kenjiArai 4:ed7848c6d374 289 }
kenjiArai 4:ed7848c6d374 290 return n + OFFSET_CONST;
kenjiArai 4:ed7848c6d374 291 }
kenjiArai 4:ed7848c6d374 292
kenjiArai 4:ed7848c6d374 293 void serialRxCallback(){
kenjiArai 4:ed7848c6d374 294 char c = GETC();
kenjiArai 4:ed7848c6d374 295 PUTC(c);
kenjiArai 4:ed7848c6d374 296 if ( c == 0x1f ){ // Control+?
kenjiArai 4:ed7848c6d374 297 NVIC_SystemReset(); // System RESET!!
kenjiArai 4:ed7848c6d374 298 }
kenjiArai 4:ed7848c6d374 299 }
kenjiArai 4:ed7848c6d374 300
kenjiArai 4:ed7848c6d374 301 void periodicCallback(void){
kenjiArai 4:ed7848c6d374 302 alivenessLED = 1;
kenjiArai 4:ed7848c6d374 303 trigger5Sec_flag = true;
kenjiArai 4:ed7848c6d374 304 counter++;
kenjiArai 4:ed7848c6d374 305 }
kenjiArai 4:ed7848c6d374 306
kenjiArai 4:ed7848c6d374 307 uint32_t ble_advdata_parser
kenjiArai 4:ed7848c6d374 308 (
kenjiArai 4:ed7848c6d374 309 uint8_t type,
kenjiArai 4:ed7848c6d374 310 uint8_t advdata_len,
kenjiArai 4:ed7848c6d374 311 uint8_t *p_advdata,
kenjiArai 4:ed7848c6d374 312 uint8_t *len,
kenjiArai 4:ed7848c6d374 313 uint8_t *p_field_data
kenjiArai 4:ed7848c6d374 314 )
mbed_tw_hoehoe 3:d6f80e11a7f4 315 {
mbed_tw_hoehoe 3:d6f80e11a7f4 316 uint8_t index=0;
mbed_tw_hoehoe 3:d6f80e11a7f4 317 uint8_t field_length, field_type;
mbed_tw_hoehoe 3:d6f80e11a7f4 318
kenjiArai 4:ed7848c6d374 319 while(index<advdata_len) {
mbed_tw_hoehoe 3:d6f80e11a7f4 320 field_length = p_advdata[index];
mbed_tw_hoehoe 3:d6f80e11a7f4 321 field_type = p_advdata[index+1];
kenjiArai 4:ed7848c6d374 322 PRINTF("len=%d, field_type=%x, type=%d\r\n", field_length, field_type, type);
kenjiArai 4:ed7848c6d374 323 if(field_type == type) {
mbed_tw_hoehoe 3:d6f80e11a7f4 324 memcpy(p_field_data, &p_advdata[index+2], (field_length-1));
mbed_tw_hoehoe 3:d6f80e11a7f4 325 *len = field_length - 1;
mbed_tw_hoehoe 3:d6f80e11a7f4 326 return NRF_SUCCESS;
mbed_tw_hoehoe 3:d6f80e11a7f4 327 }
mbed_tw_hoehoe 3:d6f80e11a7f4 328 index += field_length + 1;
mbed_tw_hoehoe 3:d6f80e11a7f4 329 }
mbed_tw_hoehoe 3:d6f80e11a7f4 330 return NRF_ERROR_NOT_FOUND;
mbed_tw_hoehoe 3:d6f80e11a7f4 331 }
mbed_tw_hoehoe 0:83b5c6efd8d7 332
kenjiArai 4:ed7848c6d374 333 bool mac_equals(const Gap::Address_t mac_1, const Gap::Address_t mac_2){
kenjiArai 4:ed7848c6d374 334 PRINTF("\r\nAddress: ");
kenjiArai 4:ed7848c6d374 335 for (int i = 0; i < 6; i++){
kenjiArai 4:ed7848c6d374 336 PRINTF("0x%02x ", mac_1[i]);
kenjiArai 4:ed7848c6d374 337 }
kenjiArai 4:ed7848c6d374 338 PRINTF("\r\n");
kenjiArai 4:ed7848c6d374 339 for (int i = 0; i < 6; i++){
kenjiArai 4:ed7848c6d374 340 if (mac_1[i] != mac_2[i]){
kenjiArai 4:ed7848c6d374 341 PRINTF("0x%02x != 0x%02x at %d\r\n", mac_1[i], mac_2[i], i);
kenjiArai 4:ed7848c6d374 342 return false;
kenjiArai 4:ed7848c6d374 343 } else {
kenjiArai 4:ed7848c6d374 344 PRINTF("0x%02x == 0x%02x at %d\r\n", mac_1[i], mac_2[i], i);
kenjiArai 4:ed7848c6d374 345 }
kenjiArai 4:ed7848c6d374 346 }
kenjiArai 4:ed7848c6d374 347 return true;
kenjiArai 4:ed7848c6d374 348 }
kenjiArai 4:ed7848c6d374 349
kenjiArai 4:ed7848c6d374 350 void scanCallback(const Gap::AdvertisementCallbackParams_t *params){
kenjiArai 4:ed7848c6d374 351 uint8_t len;
kenjiArai 4:ed7848c6d374 352 uint8_t adv_name[32];
kenjiArai 4:ed7848c6d374 353 uint32_t action_result;
mbed_tw_hoehoe 3:d6f80e11a7f4 354
kenjiArai 4:ed7848c6d374 355 PRINTF("adv peerAddr");
kenjiArai 4:ed7848c6d374 356 PRINTF(
kenjiArai 4:ed7848c6d374 357 "[%02x %02x %02x %02x %02x %02x] rssi %+4d, isScanResponse %u, AdvertisementType %u",
kenjiArai 4:ed7848c6d374 358 params->peerAddr[5],
kenjiArai 4:ed7848c6d374 359 params->peerAddr[4],
kenjiArai 4:ed7848c6d374 360 params->peerAddr[3],
kenjiArai 4:ed7848c6d374 361 params->peerAddr[2],
kenjiArai 4:ed7848c6d374 362 params->peerAddr[1],
kenjiArai 4:ed7848c6d374 363 params->peerAddr[0],
kenjiArai 4:ed7848c6d374 364 params->rssi,
kenjiArai 4:ed7848c6d374 365 params->isScanResponse,
kenjiArai 4:ed7848c6d374 366 params->type
kenjiArai 4:ed7848c6d374 367 );
kenjiArai 4:ed7848c6d374 368 if (mac_equals(params->peerAddr, mac_board_0) == false){
kenjiArai 4:ed7848c6d374 369 PRINTF(" not expected peripheral device\r\n");
kenjiArai 4:ed7848c6d374 370 return;
kenjiArai 4:ed7848c6d374 371 }
kenjiArai 4:ed7848c6d374 372 action_result = ble_advdata_parser(
kenjiArai 4:ed7848c6d374 373 BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
kenjiArai 4:ed7848c6d374 374 params->advertisingDataLen,
kenjiArai 4:ed7848c6d374 375 (uint8_t *)params->advertisingData,
kenjiArai 4:ed7848c6d374 376 &len,
kenjiArai 4:ed7848c6d374 377 adv_name
kenjiArai 4:ed7848c6d374 378 );
kenjiArai 4:ed7848c6d374 379 if( action_result == NRF_SUCCESS){
kenjiArai 4:ed7848c6d374 380 PRINTF("NRF_SUCCESS\r\n");
kenjiArai 4:ed7848c6d374 381 if(peripheral_inf.connected == false){
kenjiArai 4:ed7848c6d374 382 memcpy(peripheral_inf.address, params->peerAddr, sizeof(params->peerAddr));
kenjiArai 4:ed7848c6d374 383 peripheral_inf.deviceName = adv_name;
kenjiArai 4:ed7848c6d374 384 ble.connect(params->peerAddr, BLEProtocol::AddressType::RANDOM_STATIC, NULL, NULL);
mbed_tw_hoehoe 3:d6f80e11a7f4 385 }
mbed_tw_hoehoe 3:d6f80e11a7f4 386 ble.stopScan();
kenjiArai 4:ed7848c6d374 387 } else {
kenjiArai 4:ed7848c6d374 388 PRINTF("NRF_ERROR_NOT_FOUND\r\n");
mbed_tw_hoehoe 3:d6f80e11a7f4 389 }
mbed_tw_hoehoe 0:83b5c6efd8d7 390 }
mbed_tw_hoehoe 0:83b5c6efd8d7 391
mbed_tw_hoehoe 0:83b5c6efd8d7 392 void serviceDiscoveryCallback(const DiscoveredService *service) {
kenjiArai 4:ed7848c6d374 393 PRINTF("service found...\r\n");
kenjiArai 4:ed7848c6d374 394 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
kenjiArai 4:ed7848c6d374 395 PRINTF("Service UUID-%x attrs[%u %u]\r\n",
kenjiArai 4:ed7848c6d374 396 service->getUUID().getShortUUID(),
kenjiArai 4:ed7848c6d374 397 service->getStartHandle(),
kenjiArai 4:ed7848c6d374 398 service->getEndHandle()
kenjiArai 4:ed7848c6d374 399 );
kenjiArai 4:ed7848c6d374 400 } else {
kenjiArai 4:ed7848c6d374 401 PRINTF("Service UUID-");
kenjiArai 4:ed7848c6d374 402 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
kenjiArai 4:ed7848c6d374 403 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
kenjiArai 4:ed7848c6d374 404 PRINTF("%02x", longUUIDBytes[i]);
kenjiArai 4:ed7848c6d374 405 }
kenjiArai 4:ed7848c6d374 406 PRINTF(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
kenjiArai 4:ed7848c6d374 407 }
mbed_tw_hoehoe 0:83b5c6efd8d7 408 }
mbed_tw_hoehoe 0:83b5c6efd8d7 409
mbed_tw_hoehoe 0:83b5c6efd8d7 410 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
kenjiArai 4:ed7848c6d374 411 PRINTF("characteristicDiscoveryCallback\r\n");
kenjiArai 4:ed7848c6d374 412 if (characteristicP->getUUID().getShortUUID() == 0xa001){
kenjiArai 4:ed7848c6d374 413 PRINTF("UUID=0xa001\r\n");
kenjiArai 4:ed7848c6d374 414 peripheral_dat_readChar = *characteristicP;
mbed_tw_hoehoe 2:4b53d13d9851 415 }
kenjiArai 4:ed7848c6d374 416 if(peripheral_inf.connected){
kenjiArai 4:ed7848c6d374 417 ble.gattClient().read(
kenjiArai 4:ed7848c6d374 418 characteristicP->getConnectionHandle(),
kenjiArai 4:ed7848c6d374 419 characteristicP->getValueHandle(),
kenjiArai 4:ed7848c6d374 420 0
kenjiArai 4:ed7848c6d374 421 );
kenjiArai 4:ed7848c6d374 422 }
mbed_tw_hoehoe 0:83b5c6efd8d7 423 }
mbed_tw_hoehoe 0:83b5c6efd8d7 424
mbed_tw_hoehoe 0:83b5c6efd8d7 425 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
kenjiArai 4:ed7848c6d374 426 PRINTF("connected\r\n");
kenjiArai 4:ed7848c6d374 427 connectedLED = 1;
kenjiArai 4:ed7848c6d374 428 if (params->role != Gap::CENTRAL) {
kenjiArai 4:ed7848c6d374 429 return;
kenjiArai 4:ed7848c6d374 430 }
kenjiArai 4:ed7848c6d374 431 if(peripheral_inf.connected == false){
kenjiArai 4:ed7848c6d374 432 peripheral_inf.handle = params->handle;
kenjiArai 4:ed7848c6d374 433 peripheral_inf.connected = true;
kenjiArai 4:ed7848c6d374 434 }
kenjiArai 4:ed7848c6d374 435 PRINTF("connectionHandle = params->handle %u\r\n", params->handle);
kenjiArai 4:ed7848c6d374 436 ble.gattClient().launchServiceDiscovery(
kenjiArai 4:ed7848c6d374 437 params->handle,
kenjiArai 4:ed7848c6d374 438 serviceDiscoveryCallback,
kenjiArai 4:ed7848c6d374 439 characteristicDiscoveryCallback,
kenjiArai 4:ed7848c6d374 440 0xa000,
kenjiArai 4:ed7848c6d374 441 0xa001
kenjiArai 4:ed7848c6d374 442 );
kenjiArai 4:ed7848c6d374 443 printf("connected as device (handle = %d)\r\n\r", params->handle);
kenjiArai 4:ed7848c6d374 444 printf(
kenjiArai 4:ed7848c6d374 445 "Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n",
kenjiArai 4:ed7848c6d374 446 params->connectionParams->minConnectionInterval,
kenjiArai 4:ed7848c6d374 447 params->connectionParams->maxConnectionInterval,
kenjiArai 4:ed7848c6d374 448 params->connectionParams->slaveLatency,
kenjiArai 4:ed7848c6d374 449 params->connectionParams->connectionSupervisionTimeout
kenjiArai 4:ed7848c6d374 450 );
kenjiArai 4:ed7848c6d374 451 Gap::ConnectionParams_t connectionParams;
kenjiArai 4:ed7848c6d374 452 connectionParams.minConnectionInterval = 200;
kenjiArai 4:ed7848c6d374 453 connectionParams.maxConnectionInterval = 500;
kenjiArai 4:ed7848c6d374 454 connectionParams.slaveLatency = 0;
kenjiArai 4:ed7848c6d374 455 connectionParams.connectionSupervisionTimeout = 1500;
kenjiArai 4:ed7848c6d374 456 if (BLE::Instance(
kenjiArai 4:ed7848c6d374 457 BLE::DEFAULT_INSTANCE).gap().updateConnectionParams(params->handle,
kenjiArai 4:ed7848c6d374 458 &connectionParams) != BLE_ERROR_NONE
kenjiArai 4:ed7848c6d374 459 ){
kenjiArai 4:ed7848c6d374 460 printf("failed to update connection parameter\r\n");
mbed_tw_hoehoe 2:4b53d13d9851 461 }
mbed_tw_hoehoe 0:83b5c6efd8d7 462 }
mbed_tw_hoehoe 0:83b5c6efd8d7 463
mbed_tw_hoehoe 0:83b5c6efd8d7 464 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
kenjiArai 4:ed7848c6d374 465 PRINTF("terminated SD for handle %u\r\n", connectionHandle);
mbed_tw_hoehoe 0:83b5c6efd8d7 466 }
mbed_tw_hoehoe 0:83b5c6efd8d7 467
mbed_tw_hoehoe 0:83b5c6efd8d7 468 void triggerRead(const GattReadCallbackParams *response) {
kenjiArai 4:ed7848c6d374 469 rcv_dt_len = response->len;
kenjiArai 4:ed7848c6d374 470 memcpy(rcv_dt, response->data, rcv_dt_len);
kenjiArai 4:ed7848c6d374 471 triggerRead_flag = true;
mbed_tw_hoehoe 0:83b5c6efd8d7 472 }
mbed_tw_hoehoe 0:83b5c6efd8d7 473
mbed_tw_hoehoe 3:d6f80e11a7f4 474 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
kenjiArai 4:ed7848c6d374 475 PRINTF("disconnected\r\n");
kenjiArai 4:ed7848c6d374 476 judge_counter = -1;
kenjiArai 4:ed7848c6d374 477 alive_board = 0;
kenjiArai 4:ed7848c6d374 478 connectedLED = 0;
kenjiArai 4:ed7848c6d374 479 if(peripheral_inf.handle == params->handle){
kenjiArai 4:ed7848c6d374 480 peripheral_inf.connected = false;
kenjiArai 4:ed7848c6d374 481 peripheral_inf.handle = 0xffff;
mbed_tw_hoehoe 3:d6f80e11a7f4 482 }
kenjiArai 4:ed7848c6d374 483 wait(2.0);
mbed_tw_hoehoe 2:4b53d13d9851 484 ble.gap().startScan(scanCallback);
mbed_tw_hoehoe 2:4b53d13d9851 485 }