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
main.cpp@4:ed7848c6d374, 2016-06-01 (annotated)
- 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?
User | Revision | Line number | New 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 | } |