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:
Sun Jun 12 12:39:00 2016 +0000
Revision:
5:315161fd3d19
Parent:
4:ed7848c6d374
Use nRF51_LowPwr library

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 5:315161fd3d19 8 * Revised: June 12th, 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 5:315161fd3d19 36 #define USE_DEVICE_SERIAL 1 // Serial or DEBUG & etc.
kenjiArai 4:ed7848c6d374 37 #define USE_DEVICE_I2C 1 // Sensors with I2C, LCD, EEPROM, Driver chips & etc.
kenjiArai 5:315161fd3d19 38 #define USE_DEVICE_SPI 0 // Sensors with SPI, 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 5:315161fd3d19 181 LowPwr set_lowpwr(&lowpwr_table);
kenjiArai 4:ed7848c6d374 182 ticker.attach(periodicCallback, 5); /* Blink LED every second */
kenjiArai 4:ed7848c6d374 183 ATTACH(&serialRxCallback, Serial::RxIrq);
kenjiArai 4:ed7848c6d374 184 for (int k = 0; k < 20; k++) { PRINTF("\r\n");}
kenjiArai 4:ed7848c6d374 185 PRINTF("Check paired Peripheral board\r\n"); // opening message
kenjiArai 5:315161fd3d19 186 wait(1.0);
kenjiArai 4:ed7848c6d374 187 // lcd
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 5:315161fd3d19 195 lcd.setCursor(TextLCD::CurOff_BlkOff);
kenjiArai 4:ed7848c6d374 196 lcd.setContrast(contrast);
kenjiArai 4:ed7848c6d374 197 // BLE
kenjiArai 4:ed7848c6d374 198 ble.init();
kenjiArai 4:ed7848c6d374 199 ble.onConnection(connectionCallback);
kenjiArai 4:ed7848c6d374 200 ble.onDisconnection(disconnectionCallback);
kenjiArai 4:ed7848c6d374 201 ble.gattClient().onServiceDiscoveryTermination(discoveryTerminationCallback);
kenjiArai 4:ed7848c6d374 202 ble.gattClient().onDataRead(triggerRead);
kenjiArai 4:ed7848c6d374 203 ble.gap().setScanParams(500, 400);
kenjiArai 4:ed7848c6d374 204 ble.gap().setTxPower(tx_power_level[0]);
kenjiArai 4:ed7848c6d374 205 ble.gap().startScan(scanCallback);
kenjiArai 4:ed7848c6d374 206 alive_board = 0;
kenjiArai 4:ed7848c6d374 207 while (true) {
kenjiArai 4:ed7848c6d374 208 if (trigger5Sec_flag == true){
kenjiArai 4:ed7848c6d374 209 trigger5Sec_flag = false;
kenjiArai 4:ed7848c6d374 210 peripheral_dat_readChar.read();
kenjiArai 4:ed7848c6d374 211 if (alive_board){
kenjiArai 4:ed7848c6d374 212 --judge_counter;
kenjiArai 4:ed7848c6d374 213 if (judge_counter < 0){
kenjiArai 4:ed7848c6d374 214 judge_counter = -1;
kenjiArai 4:ed7848c6d374 215 }
kenjiArai 4:ed7848c6d374 216 }
kenjiArai 4:ed7848c6d374 217 }
kenjiArai 4:ed7848c6d374 218 if (triggerRead_flag == true){
kenjiArai 4:ed7848c6d374 219 triggerRead_flag = false;
kenjiArai 4:ed7848c6d374 220 alivenessLED = 0;
kenjiArai 4:ed7848c6d374 221 PRINTF("%s", rcv_dt);
kenjiArai 4:ed7848c6d374 222 PRINTF("\r\n");
kenjiArai 4:ed7848c6d374 223 if (counter & 1UL){ // Change a screen contents
kenjiArai 4:ed7848c6d374 224 p = rcv_dt + 2;
kenjiArai 4:ed7848c6d374 225 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 226 // 12345678
kenjiArai 4:ed7848c6d374 227 lcd.printf(" Server ");
kenjiArai 4:ed7848c6d374 228 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 229 lcd.printf("%s", p);
kenjiArai 4:ed7848c6d374 230 } else {
kenjiArai 4:ed7848c6d374 231 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 232 // 12345678
kenjiArai 4:ed7848c6d374 233 lcd.printf(" Client ");
kenjiArai 4:ed7848c6d374 234 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 235 lcd.printf(" %3.2f[V]", vdd.read_real_value());
kenjiArai 4:ed7848c6d374 236 }
kenjiArai 4:ed7848c6d374 237 contrast = auto_contrast(vdd.read_real_value());
kenjiArai 4:ed7848c6d374 238 lcd.setContrast(contrast);
kenjiArai 4:ed7848c6d374 239 ++judge_counter;
kenjiArai 4:ed7848c6d374 240 if (judge_counter > LIMIT_JUDGE_CNT){
kenjiArai 4:ed7848c6d374 241 judge_counter = LIMIT_JUDGE_CNT;
kenjiArai 4:ed7848c6d374 242 alive_board = 1;
kenjiArai 4:ed7848c6d374 243 }
kenjiArai 4:ed7848c6d374 244 }
kenjiArai 4:ed7848c6d374 245 PRINTF("state %+d\r\n", judge_counter);
kenjiArai 4:ed7848c6d374 246 if ( judge_counter == -1){
kenjiArai 4:ed7848c6d374 247 PRINTF("%c", 0x07); // Ring a PC terminal bell
kenjiArai 4:ed7848c6d374 248 lcd.locate(0, 0); // 1st line top
kenjiArai 4:ed7848c6d374 249 // 12345678
kenjiArai 4:ed7848c6d374 250 lcd.printf(" Server ");
kenjiArai 4:ed7848c6d374 251 lcd.locate(0, 1); // 2nd line top
kenjiArai 4:ed7848c6d374 252 // 12345678
kenjiArai 4:ed7848c6d374 253 lcd.printf("is gone!");
kenjiArai 4:ed7848c6d374 254 alivenessLED = !alivenessLED;
kenjiArai 4:ed7848c6d374 255 osc_5KHz(3);
kenjiArai 4:ed7848c6d374 256 }
kenjiArai 4:ed7848c6d374 257 ble.waitForEvent();
kenjiArai 4:ed7848c6d374 258 }
kenjiArai 4:ed7848c6d374 259 }
kenjiArai 4:ed7848c6d374 260
kenjiArai 4:ed7848c6d374 261 void osc_5KHz(uint32_t time_sec){
kenjiArai 4:ed7848c6d374 262 for (int32_t t = 0; t < time_sec; t++){ // Durartion
kenjiArai 4:ed7848c6d374 263 for (int32_t n = 0; n < 5000; n++){ // 1sec with 5KHz
kenjiArai 4:ed7848c6d374 264 buzzer = 1;
kenjiArai 4:ed7848c6d374 265 nrf_delay_us(100);
kenjiArai 4:ed7848c6d374 266 buzzer = 0;
kenjiArai 4:ed7848c6d374 267 nrf_delay_us(100);
kenjiArai 4:ed7848c6d374 268 }
kenjiArai 4:ed7848c6d374 269 }
kenjiArai 4:ed7848c6d374 270 buzzer = 0;
kenjiArai 4:ed7848c6d374 271 }
kenjiArai 4:ed7848c6d374 272
kenjiArai 4:ed7848c6d374 273 uint8_t auto_contrast(float vdd){
kenjiArai 4:ed7848c6d374 274 #define OFFSET_CONST 15
kenjiArai 4:ed7848c6d374 275 #define SIZE_OF_TBL 50
kenjiArai 4:ed7848c6d374 276 uint8_t n = 0;
kenjiArai 4:ed7848c6d374 277 const static uint16_t const_table[] =
kenjiArai 4:ed7848c6d374 278 {
kenjiArai 4:ed7848c6d374 279 360, 355, 350, 345, 340, 335, 330, 325, 320, 315, 310, 305, 300,
kenjiArai 4:ed7848c6d374 280 295, 290, 285, 280, 275, 270, 265, 260, 257, 253, 250, 247, 243,
kenjiArai 4:ed7848c6d374 281 240, 237, 233, 230, 227, 223, 220, 217, 215, 212, 210, 208, 206,
kenjiArai 4:ed7848c6d374 282 204, 202, 200, 197, 195, 193, 190, 185, 180, 170, 100
kenjiArai 4:ed7848c6d374 283 };
kenjiArai 4:ed7848c6d374 284
kenjiArai 4:ed7848c6d374 285 uint16_t v = (uint16_t)(vdd * 100);
kenjiArai 4:ed7848c6d374 286 for (; n < 50; n++){
kenjiArai 4:ed7848c6d374 287 if (v >= const_table[n]){
kenjiArai 4:ed7848c6d374 288 break;
kenjiArai 4:ed7848c6d374 289 }
kenjiArai 4:ed7848c6d374 290 }
kenjiArai 4:ed7848c6d374 291 return n + OFFSET_CONST;
kenjiArai 4:ed7848c6d374 292 }
kenjiArai 4:ed7848c6d374 293
kenjiArai 4:ed7848c6d374 294 void serialRxCallback(){
kenjiArai 4:ed7848c6d374 295 char c = GETC();
kenjiArai 4:ed7848c6d374 296 PUTC(c);
kenjiArai 4:ed7848c6d374 297 if ( c == 0x1f ){ // Control+?
kenjiArai 4:ed7848c6d374 298 NVIC_SystemReset(); // System RESET!!
kenjiArai 4:ed7848c6d374 299 }
kenjiArai 4:ed7848c6d374 300 }
kenjiArai 4:ed7848c6d374 301
kenjiArai 4:ed7848c6d374 302 void periodicCallback(void){
kenjiArai 4:ed7848c6d374 303 alivenessLED = 1;
kenjiArai 4:ed7848c6d374 304 trigger5Sec_flag = true;
kenjiArai 4:ed7848c6d374 305 counter++;
kenjiArai 4:ed7848c6d374 306 }
kenjiArai 4:ed7848c6d374 307
kenjiArai 4:ed7848c6d374 308 uint32_t ble_advdata_parser
kenjiArai 4:ed7848c6d374 309 (
kenjiArai 4:ed7848c6d374 310 uint8_t type,
kenjiArai 4:ed7848c6d374 311 uint8_t advdata_len,
kenjiArai 4:ed7848c6d374 312 uint8_t *p_advdata,
kenjiArai 4:ed7848c6d374 313 uint8_t *len,
kenjiArai 4:ed7848c6d374 314 uint8_t *p_field_data
kenjiArai 4:ed7848c6d374 315 )
mbed_tw_hoehoe 3:d6f80e11a7f4 316 {
mbed_tw_hoehoe 3:d6f80e11a7f4 317 uint8_t index=0;
mbed_tw_hoehoe 3:d6f80e11a7f4 318 uint8_t field_length, field_type;
mbed_tw_hoehoe 3:d6f80e11a7f4 319
kenjiArai 4:ed7848c6d374 320 while(index<advdata_len) {
mbed_tw_hoehoe 3:d6f80e11a7f4 321 field_length = p_advdata[index];
mbed_tw_hoehoe 3:d6f80e11a7f4 322 field_type = p_advdata[index+1];
kenjiArai 4:ed7848c6d374 323 PRINTF("len=%d, field_type=%x, type=%d\r\n", field_length, field_type, type);
kenjiArai 4:ed7848c6d374 324 if(field_type == type) {
mbed_tw_hoehoe 3:d6f80e11a7f4 325 memcpy(p_field_data, &p_advdata[index+2], (field_length-1));
mbed_tw_hoehoe 3:d6f80e11a7f4 326 *len = field_length - 1;
mbed_tw_hoehoe 3:d6f80e11a7f4 327 return NRF_SUCCESS;
mbed_tw_hoehoe 3:d6f80e11a7f4 328 }
mbed_tw_hoehoe 3:d6f80e11a7f4 329 index += field_length + 1;
mbed_tw_hoehoe 3:d6f80e11a7f4 330 }
mbed_tw_hoehoe 3:d6f80e11a7f4 331 return NRF_ERROR_NOT_FOUND;
mbed_tw_hoehoe 3:d6f80e11a7f4 332 }
mbed_tw_hoehoe 0:83b5c6efd8d7 333
kenjiArai 4:ed7848c6d374 334 bool mac_equals(const Gap::Address_t mac_1, const Gap::Address_t mac_2){
kenjiArai 4:ed7848c6d374 335 PRINTF("\r\nAddress: ");
kenjiArai 4:ed7848c6d374 336 for (int i = 0; i < 6; i++){
kenjiArai 4:ed7848c6d374 337 PRINTF("0x%02x ", mac_1[i]);
kenjiArai 4:ed7848c6d374 338 }
kenjiArai 4:ed7848c6d374 339 PRINTF("\r\n");
kenjiArai 4:ed7848c6d374 340 for (int i = 0; i < 6; i++){
kenjiArai 4:ed7848c6d374 341 if (mac_1[i] != mac_2[i]){
kenjiArai 4:ed7848c6d374 342 PRINTF("0x%02x != 0x%02x at %d\r\n", mac_1[i], mac_2[i], i);
kenjiArai 4:ed7848c6d374 343 return false;
kenjiArai 4:ed7848c6d374 344 } else {
kenjiArai 4:ed7848c6d374 345 PRINTF("0x%02x == 0x%02x at %d\r\n", mac_1[i], mac_2[i], i);
kenjiArai 4:ed7848c6d374 346 }
kenjiArai 4:ed7848c6d374 347 }
kenjiArai 4:ed7848c6d374 348 return true;
kenjiArai 4:ed7848c6d374 349 }
kenjiArai 4:ed7848c6d374 350
kenjiArai 4:ed7848c6d374 351 void scanCallback(const Gap::AdvertisementCallbackParams_t *params){
kenjiArai 4:ed7848c6d374 352 uint8_t len;
kenjiArai 4:ed7848c6d374 353 uint8_t adv_name[32];
kenjiArai 4:ed7848c6d374 354 uint32_t action_result;
mbed_tw_hoehoe 3:d6f80e11a7f4 355
kenjiArai 4:ed7848c6d374 356 PRINTF("adv peerAddr");
kenjiArai 4:ed7848c6d374 357 PRINTF(
kenjiArai 4:ed7848c6d374 358 "[%02x %02x %02x %02x %02x %02x] rssi %+4d, isScanResponse %u, AdvertisementType %u",
kenjiArai 4:ed7848c6d374 359 params->peerAddr[5],
kenjiArai 4:ed7848c6d374 360 params->peerAddr[4],
kenjiArai 4:ed7848c6d374 361 params->peerAddr[3],
kenjiArai 4:ed7848c6d374 362 params->peerAddr[2],
kenjiArai 4:ed7848c6d374 363 params->peerAddr[1],
kenjiArai 4:ed7848c6d374 364 params->peerAddr[0],
kenjiArai 4:ed7848c6d374 365 params->rssi,
kenjiArai 4:ed7848c6d374 366 params->isScanResponse,
kenjiArai 4:ed7848c6d374 367 params->type
kenjiArai 4:ed7848c6d374 368 );
kenjiArai 4:ed7848c6d374 369 if (mac_equals(params->peerAddr, mac_board_0) == false){
kenjiArai 4:ed7848c6d374 370 PRINTF(" not expected peripheral device\r\n");
kenjiArai 4:ed7848c6d374 371 return;
kenjiArai 4:ed7848c6d374 372 }
kenjiArai 4:ed7848c6d374 373 action_result = ble_advdata_parser(
kenjiArai 4:ed7848c6d374 374 BLE_GAP_AD_TYPE_COMPLETE_LOCAL_NAME,
kenjiArai 4:ed7848c6d374 375 params->advertisingDataLen,
kenjiArai 4:ed7848c6d374 376 (uint8_t *)params->advertisingData,
kenjiArai 4:ed7848c6d374 377 &len,
kenjiArai 4:ed7848c6d374 378 adv_name
kenjiArai 4:ed7848c6d374 379 );
kenjiArai 4:ed7848c6d374 380 if( action_result == NRF_SUCCESS){
kenjiArai 4:ed7848c6d374 381 PRINTF("NRF_SUCCESS\r\n");
kenjiArai 4:ed7848c6d374 382 if(peripheral_inf.connected == false){
kenjiArai 4:ed7848c6d374 383 memcpy(peripheral_inf.address, params->peerAddr, sizeof(params->peerAddr));
kenjiArai 4:ed7848c6d374 384 peripheral_inf.deviceName = adv_name;
kenjiArai 4:ed7848c6d374 385 ble.connect(params->peerAddr, BLEProtocol::AddressType::RANDOM_STATIC, NULL, NULL);
mbed_tw_hoehoe 3:d6f80e11a7f4 386 }
mbed_tw_hoehoe 3:d6f80e11a7f4 387 ble.stopScan();
kenjiArai 4:ed7848c6d374 388 } else {
kenjiArai 4:ed7848c6d374 389 PRINTF("NRF_ERROR_NOT_FOUND\r\n");
mbed_tw_hoehoe 3:d6f80e11a7f4 390 }
mbed_tw_hoehoe 0:83b5c6efd8d7 391 }
mbed_tw_hoehoe 0:83b5c6efd8d7 392
mbed_tw_hoehoe 0:83b5c6efd8d7 393 void serviceDiscoveryCallback(const DiscoveredService *service) {
kenjiArai 4:ed7848c6d374 394 PRINTF("service found...\r\n");
kenjiArai 4:ed7848c6d374 395 if (service->getUUID().shortOrLong() == UUID::UUID_TYPE_SHORT) {
kenjiArai 4:ed7848c6d374 396 PRINTF("Service UUID-%x attrs[%u %u]\r\n",
kenjiArai 4:ed7848c6d374 397 service->getUUID().getShortUUID(),
kenjiArai 4:ed7848c6d374 398 service->getStartHandle(),
kenjiArai 4:ed7848c6d374 399 service->getEndHandle()
kenjiArai 4:ed7848c6d374 400 );
kenjiArai 4:ed7848c6d374 401 } else {
kenjiArai 4:ed7848c6d374 402 PRINTF("Service UUID-");
kenjiArai 4:ed7848c6d374 403 const uint8_t *longUUIDBytes = service->getUUID().getBaseUUID();
kenjiArai 4:ed7848c6d374 404 for (unsigned i = 0; i < UUID::LENGTH_OF_LONG_UUID; i++) {
kenjiArai 4:ed7848c6d374 405 PRINTF("%02x", longUUIDBytes[i]);
kenjiArai 4:ed7848c6d374 406 }
kenjiArai 4:ed7848c6d374 407 PRINTF(" attrs[%u %u]\r\n", service->getStartHandle(), service->getEndHandle());
kenjiArai 4:ed7848c6d374 408 }
mbed_tw_hoehoe 0:83b5c6efd8d7 409 }
mbed_tw_hoehoe 0:83b5c6efd8d7 410
mbed_tw_hoehoe 0:83b5c6efd8d7 411 void characteristicDiscoveryCallback(const DiscoveredCharacteristic *characteristicP) {
kenjiArai 4:ed7848c6d374 412 PRINTF("characteristicDiscoveryCallback\r\n");
kenjiArai 4:ed7848c6d374 413 if (characteristicP->getUUID().getShortUUID() == 0xa001){
kenjiArai 4:ed7848c6d374 414 PRINTF("UUID=0xa001\r\n");
kenjiArai 4:ed7848c6d374 415 peripheral_dat_readChar = *characteristicP;
mbed_tw_hoehoe 2:4b53d13d9851 416 }
kenjiArai 4:ed7848c6d374 417 if(peripheral_inf.connected){
kenjiArai 4:ed7848c6d374 418 ble.gattClient().read(
kenjiArai 4:ed7848c6d374 419 characteristicP->getConnectionHandle(),
kenjiArai 4:ed7848c6d374 420 characteristicP->getValueHandle(),
kenjiArai 4:ed7848c6d374 421 0
kenjiArai 4:ed7848c6d374 422 );
kenjiArai 4:ed7848c6d374 423 }
mbed_tw_hoehoe 0:83b5c6efd8d7 424 }
mbed_tw_hoehoe 0:83b5c6efd8d7 425
mbed_tw_hoehoe 0:83b5c6efd8d7 426 void connectionCallback(const Gap::ConnectionCallbackParams_t *params) {
kenjiArai 4:ed7848c6d374 427 PRINTF("connected\r\n");
kenjiArai 4:ed7848c6d374 428 connectedLED = 1;
kenjiArai 4:ed7848c6d374 429 if (params->role != Gap::CENTRAL) {
kenjiArai 4:ed7848c6d374 430 return;
kenjiArai 4:ed7848c6d374 431 }
kenjiArai 4:ed7848c6d374 432 if(peripheral_inf.connected == false){
kenjiArai 4:ed7848c6d374 433 peripheral_inf.handle = params->handle;
kenjiArai 4:ed7848c6d374 434 peripheral_inf.connected = true;
kenjiArai 4:ed7848c6d374 435 }
kenjiArai 4:ed7848c6d374 436 PRINTF("connectionHandle = params->handle %u\r\n", params->handle);
kenjiArai 4:ed7848c6d374 437 ble.gattClient().launchServiceDiscovery(
kenjiArai 4:ed7848c6d374 438 params->handle,
kenjiArai 4:ed7848c6d374 439 serviceDiscoveryCallback,
kenjiArai 4:ed7848c6d374 440 characteristicDiscoveryCallback,
kenjiArai 4:ed7848c6d374 441 0xa000,
kenjiArai 4:ed7848c6d374 442 0xa001
kenjiArai 4:ed7848c6d374 443 );
kenjiArai 4:ed7848c6d374 444 printf("connected as device (handle = %d)\r\n\r", params->handle);
kenjiArai 4:ed7848c6d374 445 printf(
kenjiArai 4:ed7848c6d374 446 "Conn. params => min=%d, max=%d, slave=%d, supervision=%d\r\n",
kenjiArai 4:ed7848c6d374 447 params->connectionParams->minConnectionInterval,
kenjiArai 4:ed7848c6d374 448 params->connectionParams->maxConnectionInterval,
kenjiArai 4:ed7848c6d374 449 params->connectionParams->slaveLatency,
kenjiArai 4:ed7848c6d374 450 params->connectionParams->connectionSupervisionTimeout
kenjiArai 4:ed7848c6d374 451 );
kenjiArai 4:ed7848c6d374 452 Gap::ConnectionParams_t connectionParams;
kenjiArai 4:ed7848c6d374 453 connectionParams.minConnectionInterval = 200;
kenjiArai 4:ed7848c6d374 454 connectionParams.maxConnectionInterval = 500;
kenjiArai 4:ed7848c6d374 455 connectionParams.slaveLatency = 0;
kenjiArai 4:ed7848c6d374 456 connectionParams.connectionSupervisionTimeout = 1500;
kenjiArai 4:ed7848c6d374 457 if (BLE::Instance(
kenjiArai 4:ed7848c6d374 458 BLE::DEFAULT_INSTANCE).gap().updateConnectionParams(params->handle,
kenjiArai 4:ed7848c6d374 459 &connectionParams) != BLE_ERROR_NONE
kenjiArai 4:ed7848c6d374 460 ){
kenjiArai 4:ed7848c6d374 461 printf("failed to update connection parameter\r\n");
mbed_tw_hoehoe 2:4b53d13d9851 462 }
mbed_tw_hoehoe 0:83b5c6efd8d7 463 }
mbed_tw_hoehoe 0:83b5c6efd8d7 464
mbed_tw_hoehoe 0:83b5c6efd8d7 465 void discoveryTerminationCallback(Gap::Handle_t connectionHandle) {
kenjiArai 4:ed7848c6d374 466 PRINTF("terminated SD for handle %u\r\n", connectionHandle);
mbed_tw_hoehoe 0:83b5c6efd8d7 467 }
mbed_tw_hoehoe 0:83b5c6efd8d7 468
mbed_tw_hoehoe 0:83b5c6efd8d7 469 void triggerRead(const GattReadCallbackParams *response) {
kenjiArai 4:ed7848c6d374 470 rcv_dt_len = response->len;
kenjiArai 4:ed7848c6d374 471 memcpy(rcv_dt, response->data, rcv_dt_len);
kenjiArai 4:ed7848c6d374 472 triggerRead_flag = true;
mbed_tw_hoehoe 0:83b5c6efd8d7 473 }
mbed_tw_hoehoe 0:83b5c6efd8d7 474
mbed_tw_hoehoe 3:d6f80e11a7f4 475 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params){
kenjiArai 4:ed7848c6d374 476 PRINTF("disconnected\r\n");
kenjiArai 4:ed7848c6d374 477 judge_counter = -1;
kenjiArai 4:ed7848c6d374 478 alive_board = 0;
kenjiArai 4:ed7848c6d374 479 connectedLED = 0;
kenjiArai 4:ed7848c6d374 480 if(peripheral_inf.handle == params->handle){
kenjiArai 4:ed7848c6d374 481 peripheral_inf.connected = false;
kenjiArai 4:ed7848c6d374 482 peripheral_inf.handle = 0xffff;
mbed_tw_hoehoe 3:d6f80e11a7f4 483 }
kenjiArai 4:ed7848c6d374 484 wait(2.0);
mbed_tw_hoehoe 2:4b53d13d9851 485 ble.gap().startScan(scanCallback);
mbed_tw_hoehoe 2:4b53d13d9851 486 }