Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of TYBLE16_BME280_data_sender by
main.cpp@2:f44ef892b2b2, 2017-11-19 (annotated)
- Committer:
- kenjiArai
- Date:
- Sun Nov 19 09:46:27 2017 +0000
- Revision:
- 2:f44ef892b2b2
- Parent:
- 1:f2982d4f4037
TYBLE16 serial communication (UART) for both "Central" and "Peripheral".
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| kenjiArai | 0:c3a498a8091c | 1 | /* |
| kenjiArai | 0:c3a498a8091c | 2 | * Mbed Application program / Using Akizuki BLE Module AE-TYBLE16 |
| kenjiArai | 0:c3a498a8091c | 3 | * on-board module : TAIYO YUDEN BLE 4.2 TYSA-B (EYSGJNAWY-WX) |
| kenjiArai | 0:c3a498a8091c | 4 | * |
| kenjiArai | 0:c3a498a8091c | 5 | * http://akizukidenshi.com/catalog/g/gK-12339/ |
| kenjiArai | 0:c3a498a8091c | 6 | * |
| kenjiArai | 0:c3a498a8091c | 7 | * Refernce document |
| kenjiArai | 0:c3a498a8091c | 8 | * https://www.yuden.co.jp/wireless_module/document/datareport2/jp/ |
| kenjiArai | 0:c3a498a8091c | 9 | * TY_BLE_EYSGJNAWY_WX_BriefDataReport_V1_3_20170925J.pdf |
| kenjiArai | 0:c3a498a8091c | 10 | * |
| kenjiArai | 0:c3a498a8091c | 11 | * Copyright (c) 2017 Kenji Arai / JH1PJL |
| kenjiArai | 0:c3a498a8091c | 12 | * http://www.page.sannet.ne.jp/kenjia/index.html |
| kenjiArai | 0:c3a498a8091c | 13 | * http://mbed.org/users/kenjiArai/ |
| kenjiArai | 0:c3a498a8091c | 14 | * Created: October 27th, 2017 |
| kenjiArai | 2:f44ef892b2b2 | 15 | * Revised: November 19th, 2017 |
| kenjiArai | 0:c3a498a8091c | 16 | */ |
| kenjiArai | 0:c3a498a8091c | 17 | |
| kenjiArai | 0:c3a498a8091c | 18 | /* |
| kenjiArai | 0:c3a498a8091c | 19 | Tested condition |
| kenjiArai | 2:f44ef892b2b2 | 20 | mbed-os-5.6.4 & mbed Rev.157(release 155?) |
| kenjiArai | 2:f44ef892b2b2 | 21 | Nucleo-F446RE TYBLE16 /also F411RE |
| kenjiArai | 2:f44ef892b2b2 | 22 | PA_9 (D8) pin5 / P0.03(UART_RX) |
| kenjiArai | 2:f44ef892b2b2 | 23 | PA_10(D2) pin6 / P0.01(UART_TX) |
| kenjiArai | 2:f44ef892b2b2 | 24 | pin7 / P0.02(UART_CTS) connected to pin8 / P0.00(UART_RTS) |
| kenjiArai | 2:f44ef892b2b2 | 25 | PB_3 (D3) pin15 / P0.23(MODE) Mode indication |
| kenjiArai | 0:c3a498a8091c | 26 | +3.3v pin14 / +V |
| kenjiArai | 0:c3a498a8091c | 27 | GND pin13 / GND |
| kenjiArai | 2:f44ef892b2b2 | 28 | */ |
| kenjiArai | 2:f44ef892b2b2 | 29 | |
| kenjiArai | 2:f44ef892b2b2 | 30 | /* |
| kenjiArai | 2:f44ef892b2b2 | 31 | --- HOW TO ESTABLISH CENTRAL AND PERIPHERAL UART --- |
| kenjiArai | 2:f44ef892b2b2 | 32 | 1) Prepare one peripheral module/TYBLE16 |
| kenjiArai | 2:f44ef892b2b2 | 33 | 2) Prepare another TYBLE16 module which was programed as "Central mode" |
| kenjiArai | 2:f44ef892b2b2 | 34 | Please refer "TYBLE16_set_Central_or_ Peripheral" program |
| kenjiArai | 2:f44ef892b2b2 | 35 | 3) Programing "TYBLE16_Uart_Central_and_Peripheral" into Mbed boards |
| kenjiArai | 2:f44ef892b2b2 | 36 | (same program into both "Central" and "Peripheral" Mbed board) |
| kenjiArai | 2:f44ef892b2b2 | 37 | 4) If you turn on both the "Central" and "Peripheral" power at the same time, |
| kenjiArai | 2:f44ef892b2b2 | 38 | the connection is automatically started |
| kenjiArai | 0:c3a498a8091c | 39 | */ |
| kenjiArai | 0:c3a498a8091c | 40 | |
| kenjiArai | 0:c3a498a8091c | 41 | // Include -------------------------------------------------------------------- |
| kenjiArai | 2:f44ef892b2b2 | 42 | #include "mbed.h" |
| kenjiArai | 2:f44ef892b2b2 | 43 | #include "RingBuffer.h" |
| kenjiArai | 0:c3a498a8091c | 44 | |
| kenjiArai | 0:c3a498a8091c | 45 | // Definition ----------------------------------------------------------------- |
| kenjiArai | 2:f44ef892b2b2 | 46 | #define TIME_OUT 5 // 5 sec |
| kenjiArai | 2:f44ef892b2b2 | 47 | #define BF_SIZE_BLE 256 |
| kenjiArai | 2:f44ef892b2b2 | 48 | #define BF_SIZE_PC 256 |
| kenjiArai | 2:f44ef892b2b2 | 49 | #define BF_SIZE_LINE 32 |
| kenjiArai | 0:c3a498a8091c | 50 | |
| kenjiArai | 0:c3a498a8091c | 51 | // Object/ Constructor -------------------------------------------------------- |
| kenjiArai | 0:c3a498a8091c | 52 | Serial pc(USBTX,USBRX); |
| kenjiArai | 2:f44ef892b2b2 | 53 | Serial tyble16(D8, D2); |
| kenjiArai | 2:f44ef892b2b2 | 54 | DigitalIn tyble16_mode(D3); |
| kenjiArai | 2:f44ef892b2b2 | 55 | Ticker t; |
| kenjiArai | 2:f44ef892b2b2 | 56 | RingBuffer ble_bf(BF_SIZE_BLE); |
| kenjiArai | 2:f44ef892b2b2 | 57 | RingBuffer pc_bf(BF_SIZE_PC); |
| kenjiArai | 0:c3a498a8091c | 58 | |
| kenjiArai | 0:c3a498a8091c | 59 | // RAM ------------------------------------------------------------------------ |
| kenjiArai | 0:c3a498a8091c | 60 | |
| kenjiArai | 0:c3a498a8091c | 61 | // ROM / Constant data -------------------------------------------------------- |
| kenjiArai | 0:c3a498a8091c | 62 | |
| kenjiArai | 0:c3a498a8091c | 63 | // Function prototypes -------------------------------------------------------- |
| kenjiArai | 0:c3a498a8091c | 64 | void check_connection(void); |
| kenjiArai | 2:f44ef892b2b2 | 65 | void excute_command(char *); |
| kenjiArai | 2:f44ef892b2b2 | 66 | void ble_rx(void); |
| kenjiArai | 2:f44ef892b2b2 | 67 | void pc_rx(void); |
| kenjiArai | 0:c3a498a8091c | 68 | |
| kenjiArai | 0:c3a498a8091c | 69 | //------------------------------------------------------------------------------ |
| kenjiArai | 0:c3a498a8091c | 70 | // Control Program |
| kenjiArai | 0:c3a498a8091c | 71 | //------------------------------------------------------------------------------ |
| kenjiArai | 0:c3a498a8091c | 72 | int main() |
| kenjiArai | 0:c3a498a8091c | 73 | { |
| kenjiArai | 2:f44ef892b2b2 | 74 | static char rcv_bf[BF_SIZE_LINE]; |
| kenjiArai | 0:c3a498a8091c | 75 | static uint8_t n = 0; |
| kenjiArai | 0:c3a498a8091c | 76 | char c = 0; |
| kenjiArai | 0:c3a498a8091c | 77 | |
| kenjiArai | 2:f44ef892b2b2 | 78 | tyble16.attach(&ble_rx, Serial::RxIrq); // Set interrupt handler |
| kenjiArai | 2:f44ef892b2b2 | 79 | pc.attach(&pc_rx, Serial::RxIrq); // Set interrupt handler |
| kenjiArai | 2:f44ef892b2b2 | 80 | pc.printf("\r\nUART/TYBLE16(%s, %s UTC)\r\n", __DATE__, __TIME__); |
| kenjiArai | 2:f44ef892b2b2 | 81 | tyble16.printf("I'm TYBLE16\r\n"); |
| kenjiArai | 0:c3a498a8091c | 82 | t.attach(check_connection, 1); |
| kenjiArai | 0:c3a498a8091c | 83 | while(true){ |
| kenjiArai | 2:f44ef892b2b2 | 84 | while(ble_bf.check() != 0){ |
| kenjiArai | 2:f44ef892b2b2 | 85 | //----- receive data ----------------------------------------------- |
| kenjiArai | 2:f44ef892b2b2 | 86 | c = ble_bf.read(); // data received |
| kenjiArai | 0:c3a498a8091c | 87 | pc.putc(c); // show to console |
| kenjiArai | 0:c3a498a8091c | 88 | rcv_bf[n++] = c; // save int buf |
| kenjiArai | 2:f44ef892b2b2 | 89 | // avoid buffer overflow |
| kenjiArai | 2:f44ef892b2b2 | 90 | if (n >= (BF_SIZE_LINE - 5)){ n = (BF_SIZE_LINE - 5);} |
| kenjiArai | 0:c3a498a8091c | 91 | if (c == '\n'){ // end one line |
| kenjiArai | 0:c3a498a8091c | 92 | pc.putc('\r'); |
| kenjiArai | 0:c3a498a8091c | 93 | rcv_bf[n] = 0; |
| kenjiArai | 2:f44ef892b2b2 | 94 | if (n >3){ // command ~?\r\n ?=specified one character |
| kenjiArai | 2:f44ef892b2b2 | 95 | if ((rcv_bf[0] == '~') && (rcv_bf[2] == '\r')){ |
| kenjiArai | 2:f44ef892b2b2 | 96 | excute_command(rcv_bf); |
| kenjiArai | 0:c3a498a8091c | 97 | } |
| kenjiArai | 0:c3a498a8091c | 98 | } |
| kenjiArai | 0:c3a498a8091c | 99 | n = 0; // Clear buffer |
| kenjiArai | 0:c3a498a8091c | 100 | } |
| kenjiArai | 0:c3a498a8091c | 101 | } |
| kenjiArai | 2:f44ef892b2b2 | 102 | while(pc_bf.check() != 0){ |
| kenjiArai | 2:f44ef892b2b2 | 103 | //----- send data -------------------------------------------------- |
| kenjiArai | 2:f44ef892b2b2 | 104 | char c = pc_bf.read(); |
| kenjiArai | 0:c3a498a8091c | 105 | tyble16.putc(c); |
| kenjiArai | 0:c3a498a8091c | 106 | pc.putc(c); // echo back |
| kenjiArai | 0:c3a498a8091c | 107 | if(c == '\r'){ // if CR then put LF |
| kenjiArai | 0:c3a498a8091c | 108 | tyble16.putc('\n'); |
| kenjiArai | 0:c3a498a8091c | 109 | pc.putc('\n'); |
| kenjiArai | 0:c3a498a8091c | 110 | } |
| kenjiArai | 0:c3a498a8091c | 111 | } |
| kenjiArai | 0:c3a498a8091c | 112 | } |
| kenjiArai | 0:c3a498a8091c | 113 | } |
| kenjiArai | 0:c3a498a8091c | 114 | |
| kenjiArai | 2:f44ef892b2b2 | 115 | // special command (You can make your own commands) |
| kenjiArai | 2:f44ef892b2b2 | 116 | void excute_command(char *buf) |
| kenjiArai | 0:c3a498a8091c | 117 | { |
| kenjiArai | 2:f44ef892b2b2 | 118 | char c = buf[1]; |
| kenjiArai | 2:f44ef892b2b2 | 119 | switch (c){ |
| kenjiArai | 2:f44ef892b2b2 | 120 | case 'x': // corrent -> nothing to do |
| kenjiArai | 2:f44ef892b2b2 | 121 | tyble16.printf("Accept 'x' Command\r\n"); |
| kenjiArai | 2:f44ef892b2b2 | 122 | break; |
| kenjiArai | 2:f44ef892b2b2 | 123 | case '?': // Help |
| kenjiArai | 2:f44ef892b2b2 | 124 | tyble16.printf("Command not available\r\n"); |
| kenjiArai | 2:f44ef892b2b2 | 125 | tyble16.printf("Please set your own command\r\n"); |
| kenjiArai | 2:f44ef892b2b2 | 126 | break; |
| kenjiArai | 2:f44ef892b2b2 | 127 | default: // no available command |
| kenjiArai | 2:f44ef892b2b2 | 128 | tyble16.printf("Command not available\r\n"); |
| kenjiArai | 2:f44ef892b2b2 | 129 | break; |
| kenjiArai | 0:c3a498a8091c | 130 | } |
| kenjiArai | 0:c3a498a8091c | 131 | } |
| kenjiArai | 0:c3a498a8091c | 132 | |
| kenjiArai | 2:f44ef892b2b2 | 133 | // Interrupt routine / Data from BLE |
| kenjiArai | 2:f44ef892b2b2 | 134 | void ble_rx() |
| kenjiArai | 2:f44ef892b2b2 | 135 | { |
| kenjiArai | 2:f44ef892b2b2 | 136 | ble_bf.save(tyble16.getc()); // BLE RX data save into ring buffer |
| kenjiArai | 2:f44ef892b2b2 | 137 | } |
| kenjiArai | 2:f44ef892b2b2 | 138 | |
| kenjiArai | 2:f44ef892b2b2 | 139 | // Interrupt routine / Data from PC |
| kenjiArai | 2:f44ef892b2b2 | 140 | void pc_rx() |
| kenjiArai | 2:f44ef892b2b2 | 141 | { |
| kenjiArai | 2:f44ef892b2b2 | 142 | pc_bf.save(pc.getc()); // PC RX data save into ring buffer |
| kenjiArai | 2:f44ef892b2b2 | 143 | } |
| kenjiArai | 2:f44ef892b2b2 | 144 | |
| kenjiArai | 0:c3a498a8091c | 145 | // Every one second, check communication status |
| kenjiArai | 0:c3a498a8091c | 146 | void check_connection(void) |
| kenjiArai | 0:c3a498a8091c | 147 | { |
| kenjiArai | 0:c3a498a8091c | 148 | static int8_t counter = 0; |
| kenjiArai | 0:c3a498a8091c | 149 | |
| kenjiArai | 2:f44ef892b2b2 | 150 | if (tyble16_mode == 0){ // Not connected |
| kenjiArai | 0:c3a498a8091c | 151 | if (++counter >= TIME_OUT){ |
| kenjiArai | 2:f44ef892b2b2 | 152 | // Software reset |
| kenjiArai | 2:f44ef892b2b2 | 153 | tyble16.puts("BRS\r\n"); |
| kenjiArai | 0:c3a498a8091c | 154 | counter = 0; |
| kenjiArai | 0:c3a498a8091c | 155 | } |
| kenjiArai | 0:c3a498a8091c | 156 | } else { |
| kenjiArai | 0:c3a498a8091c | 157 | counter = 0; |
| kenjiArai | 0:c3a498a8091c | 158 | } |
| kenjiArai | 0:c3a498a8091c | 159 | } |
