TYBLE16 on os5 sample programs

Dependencies:   BME280 TextLCD nRF51_Vdd

Fork of TYBLE16_mbedlized_os5_BASE by Kenji Arai

Please refer following notebook.
/users/kenjiArai/notebook/tyble16-module-as-mbed-os-5-board-mbedlization/

Committer:
kenjiArai
Date:
Sun Apr 15 04:15:18 2018 +0000
Revision:
3:c0010c8ad17f
Parent:
2:47ad8c48224e
Separated Uart_Clinent & Uart_Server due to memory overflow

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kenjiArai 1:9011c83e4178 1 /* mbed Microcontroller Library
kenjiArai 1:9011c83e4178 2 * Copyright (c) 2006-2013 ARM Limited
kenjiArai 1:9011c83e4178 3 *
kenjiArai 1:9011c83e4178 4 * Licensed under the Apache License, Version 2.0 (the "License");
kenjiArai 1:9011c83e4178 5 * you may not use this file except in compliance with the License.
kenjiArai 1:9011c83e4178 6 * You may obtain a copy of the License at
kenjiArai 1:9011c83e4178 7 *
kenjiArai 1:9011c83e4178 8 * http://www.apache.org/licenses/LICENSE-2.0
kenjiArai 1:9011c83e4178 9 *
kenjiArai 1:9011c83e4178 10 * Unless required by applicable law or agreed to in writing, software
kenjiArai 1:9011c83e4178 11 * distributed under the License is distributed on an "AS IS" BASIS,
kenjiArai 1:9011c83e4178 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
kenjiArai 1:9011c83e4178 13 * See the License for the specific language governing permissions and
kenjiArai 1:9011c83e4178 14 * limitations under the License.
kenjiArai 1:9011c83e4178 15 */
kenjiArai 1:9011c83e4178 16 /*
kenjiArai 1:9011c83e4178 17 Modified by Kenji Arai, April 14th, 2018
kenjiArai 1:9011c83e4178 18 https://os.mbed.com/users/kenjiArai/
kenjiArai 1:9011c83e4178 19 */
kenjiArai 1:9011c83e4178 20
kenjiArai 1:9011c83e4178 21 //#define EXAMPLE_6_THERMO
kenjiArai 1:9011c83e4178 22 #ifdef EXAMPLE_6_THERMO
kenjiArai 1:9011c83e4178 23
kenjiArai 1:9011c83e4178 24 #include <events/mbed_events.h>
kenjiArai 1:9011c83e4178 25 #include "mbed.h"
kenjiArai 1:9011c83e4178 26 #include "ble/BLE.h"
kenjiArai 1:9011c83e4178 27 #include "ble/services/HealthThermometerService.h"
kenjiArai 1:9011c83e4178 28 #include "TYBLE16_BASE.h"
kenjiArai 1:9011c83e4178 29 #include "TextLCD.h"
kenjiArai 1:9011c83e4178 30 #include "BME280.h"
kenjiArai 1:9011c83e4178 31
kenjiArai 2:47ad8c48224e 32 #define NO_SENSOR 0
kenjiArai 2:47ad8c48224e 33 #define HAS_SENSOR 1
kenjiArai 2:47ad8c48224e 34 #define USE_LCD 1
kenjiArai 1:9011c83e4178 35
kenjiArai 1:9011c83e4178 36 DigitalOut led1(LED1, 1);
kenjiArai 1:9011c83e4178 37 Serial pc(USBTX, USBRX);
kenjiArai 1:9011c83e4178 38 I2C i2c(I2C_SDA, I2C_SCL);
kenjiArai 1:9011c83e4178 39 BME280 hmtp(i2c);
kenjiArai 1:9011c83e4178 40 #if USE_LCD
kenjiArai 1:9011c83e4178 41 TextLCD_I2C_N lcd(&i2c, 0x7c, TextLCD::LCD16x2); // LCD(Akizuki AQM1602A)
kenjiArai 1:9011c83e4178 42 #endif
kenjiArai 1:9011c83e4178 43
kenjiArai 1:9011c83e4178 44 const static char DEVICE_NAME[] = "TYBLE16";
kenjiArai 1:9011c83e4178 45 static const uint16_t uuid16_list[]
kenjiArai 1:9011c83e4178 46 = {GattService::UUID_HEALTH_THERMOMETER_SERVICE};
kenjiArai 1:9011c83e4178 47
kenjiArai 1:9011c83e4178 48 char *const opngmsg =
kenjiArai 1:9011c83e4178 49 "\x1b[2J\x1b[H"__FILE__ "\r\n"__DATE__ " " __TIME__ " (UTC)\r\n""\r\n";
kenjiArai 1:9011c83e4178 50
kenjiArai 1:9011c83e4178 51 static float currentTemperature = 39.6f;
kenjiArai 1:9011c83e4178 52 static HealthThermometerService *thermometerServicePtr;
kenjiArai 1:9011c83e4178 53
kenjiArai 1:9011c83e4178 54 static EventQueue eventQueue(/* event count */ 16 * EVENTS_EVENT_SIZE);
kenjiArai 1:9011c83e4178 55
kenjiArai 1:9011c83e4178 56 /* Restart Advertising on disconnection*/
kenjiArai 1:9011c83e4178 57 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *)
kenjiArai 1:9011c83e4178 58 {
kenjiArai 1:9011c83e4178 59 BLE::Instance().gap().startAdvertising();
kenjiArai 1:9011c83e4178 60 }
kenjiArai 1:9011c83e4178 61
kenjiArai 1:9011c83e4178 62 void updateSensorValue(void)
kenjiArai 1:9011c83e4178 63 {
kenjiArai 1:9011c83e4178 64 static uint32_t count = 0;
kenjiArai 1:9011c83e4178 65
kenjiArai 1:9011c83e4178 66 #if NO_SENSOR
kenjiArai 1:9011c83e4178 67 /* Do blocking calls or whatever is necessary for sensor polling.
kenjiArai 1:9011c83e4178 68 In our case, we simply update the Temperature measurement. */
kenjiArai 1:9011c83e4178 69 currentTemperature
kenjiArai 1:9011c83e4178 70 = (currentTemperature + 0.1f > 43.0f) ? 39.6f : currentTemperature + 0.1f;
kenjiArai 1:9011c83e4178 71 thermometerServicePtr->updateTemperature(currentTemperature);
kenjiArai 1:9011c83e4178 72 #elif HAS_SENSOR
kenjiArai 1:9011c83e4178 73 currentTemperature = hmtp.getTemperature();
kenjiArai 1:9011c83e4178 74 pc.printf("Temperature= %+5.2f [degC]", currentTemperature);
kenjiArai 1:9011c83e4178 75 pc.printf(", count = %8u\r\n", count++);
kenjiArai 1:9011c83e4178 76 #if USE_LCD
kenjiArai 1:9011c83e4178 77 lcd.locate(0, 1);
kenjiArai 1:9011c83e4178 78 lcd.printf(" %+5.2f %7u", currentTemperature, count);
kenjiArai 1:9011c83e4178 79 #endif
kenjiArai 1:9011c83e4178 80 thermometerServicePtr->updateTemperature(currentTemperature);
kenjiArai 1:9011c83e4178 81 #else
kenjiArai 1:9011c83e4178 82 thermometerServicePtr->updateTemperature(currentTemperature);
kenjiArai 1:9011c83e4178 83 #endif
kenjiArai 1:9011c83e4178 84 }
kenjiArai 1:9011c83e4178 85
kenjiArai 1:9011c83e4178 86 void periodicCallback(void)
kenjiArai 1:9011c83e4178 87 {
kenjiArai 1:9011c83e4178 88 led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
kenjiArai 1:9011c83e4178 89
kenjiArai 1:9011c83e4178 90 if (BLE::Instance().gap().getState().connected) {
kenjiArai 1:9011c83e4178 91 eventQueue.call(updateSensorValue);
kenjiArai 1:9011c83e4178 92 }
kenjiArai 1:9011c83e4178 93 }
kenjiArai 1:9011c83e4178 94
kenjiArai 1:9011c83e4178 95 void onBleInitError(BLE &ble, ble_error_t error)
kenjiArai 1:9011c83e4178 96 {
kenjiArai 1:9011c83e4178 97 /* Initialization error handling should go here */
kenjiArai 1:9011c83e4178 98 }
kenjiArai 1:9011c83e4178 99
kenjiArai 1:9011c83e4178 100 void printMacAddress()
kenjiArai 1:9011c83e4178 101 {
kenjiArai 1:9011c83e4178 102 /* Print out device MAC address to the console*/
kenjiArai 1:9011c83e4178 103 Gap::AddressType_t addr_type;
kenjiArai 1:9011c83e4178 104 Gap::Address_t address;
kenjiArai 1:9011c83e4178 105 BLE::Instance().gap().getAddress(&addr_type, address);
kenjiArai 1:9011c83e4178 106 pc.printf("DEVICE MAC ADDRESS: ");
kenjiArai 1:9011c83e4178 107 for (int i = 5; i >= 1; i--) {
kenjiArai 1:9011c83e4178 108 pc.printf("%02x:", address[i]);
kenjiArai 1:9011c83e4178 109 }
kenjiArai 1:9011c83e4178 110 pc.printf("%02x\r\n", address[0]);
kenjiArai 1:9011c83e4178 111 }
kenjiArai 1:9011c83e4178 112
kenjiArai 1:9011c83e4178 113 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
kenjiArai 1:9011c83e4178 114 {
kenjiArai 1:9011c83e4178 115 BLE& ble = params->ble;
kenjiArai 1:9011c83e4178 116 ble_error_t error = params->error;
kenjiArai 1:9011c83e4178 117
kenjiArai 1:9011c83e4178 118 if (error != BLE_ERROR_NONE) {
kenjiArai 1:9011c83e4178 119 onBleInitError(ble, error);
kenjiArai 1:9011c83e4178 120 return;
kenjiArai 1:9011c83e4178 121 }
kenjiArai 1:9011c83e4178 122
kenjiArai 1:9011c83e4178 123 if (ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
kenjiArai 1:9011c83e4178 124 return;
kenjiArai 1:9011c83e4178 125 }
kenjiArai 1:9011c83e4178 126
kenjiArai 1:9011c83e4178 127 ble.gap().onDisconnection(disconnectionCallback);
kenjiArai 1:9011c83e4178 128
kenjiArai 1:9011c83e4178 129 /* Setup primary service. */
kenjiArai 1:9011c83e4178 130 thermometerServicePtr =
kenjiArai 1:9011c83e4178 131 new HealthThermometerService(ble,
kenjiArai 1:9011c83e4178 132 currentTemperature,
kenjiArai 1:9011c83e4178 133 HealthThermometerService::LOCATION_EAR);
kenjiArai 1:9011c83e4178 134
kenjiArai 1:9011c83e4178 135 /* setup advertising */
kenjiArai 1:9011c83e4178 136 ble.gap().accumulateAdvertisingPayload(
kenjiArai 1:9011c83e4178 137 GapAdvertisingData::BREDR_NOT_SUPPORTED |
kenjiArai 1:9011c83e4178 138 GapAdvertisingData::LE_GENERAL_DISCOVERABLE
kenjiArai 1:9011c83e4178 139 );
kenjiArai 1:9011c83e4178 140 ble.gap().accumulateAdvertisingPayload(
kenjiArai 1:9011c83e4178 141 GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS,
kenjiArai 1:9011c83e4178 142 (uint8_t *)uuid16_list,
kenjiArai 1:9011c83e4178 143 sizeof(uuid16_list)
kenjiArai 1:9011c83e4178 144 );
kenjiArai 1:9011c83e4178 145 ble.gap().accumulateAdvertisingPayload(
kenjiArai 1:9011c83e4178 146 GapAdvertisingData::THERMOMETER_EAR
kenjiArai 1:9011c83e4178 147 );
kenjiArai 1:9011c83e4178 148 ble.gap().accumulateAdvertisingPayload(
kenjiArai 1:9011c83e4178 149 GapAdvertisingData::COMPLETE_LOCAL_NAME,
kenjiArai 1:9011c83e4178 150 (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME)
kenjiArai 1:9011c83e4178 151 );
kenjiArai 1:9011c83e4178 152 ble.gap().setAdvertisingType(
kenjiArai 1:9011c83e4178 153 GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED
kenjiArai 1:9011c83e4178 154 );
kenjiArai 1:9011c83e4178 155 ble.gap().setAdvertisingInterval(1000); /* 1000ms */
kenjiArai 1:9011c83e4178 156 ble.gap().startAdvertising();
kenjiArai 1:9011c83e4178 157
kenjiArai 1:9011c83e4178 158 printMacAddress();
kenjiArai 1:9011c83e4178 159 }
kenjiArai 1:9011c83e4178 160
kenjiArai 1:9011c83e4178 161 void scheduleBleEventsProcessing(BLE::OnEventsToProcessCallbackContext* context)
kenjiArai 1:9011c83e4178 162 {
kenjiArai 1:9011c83e4178 163 BLE &ble = BLE::Instance();
kenjiArai 1:9011c83e4178 164 eventQueue.call(Callback<void()>(&ble, &BLE::processEvents));
kenjiArai 1:9011c83e4178 165 }
kenjiArai 1:9011c83e4178 166
kenjiArai 1:9011c83e4178 167 int main()
kenjiArai 1:9011c83e4178 168 {
kenjiArai 1:9011c83e4178 169 pc.puts(opngmsg);
kenjiArai 1:9011c83e4178 170 #if USE_LCD
kenjiArai 1:9011c83e4178 171 lcd.locate(0, 0);
kenjiArai 1:9011c83e4178 172 // 1234567890123456
kenjiArai 1:9011c83e4178 173 lcd.puts("TYBLE16/Mbed-os5");
kenjiArai 1:9011c83e4178 174 lcd.locate(0, 1);
kenjiArai 1:9011c83e4178 175 // 1234567890123456
kenjiArai 1:9011c83e4178 176 lcd.puts(" by JH1PJL ");
kenjiArai 1:9011c83e4178 177 lcd.setCursor(TextLCD_Base::CurOff_BlkOff);
kenjiArai 1:9011c83e4178 178 lcd.setContrast(0x19);
kenjiArai 1:9011c83e4178 179 wait(2.0f);
kenjiArai 1:9011c83e4178 180 #endif
kenjiArai 1:9011c83e4178 181 // Check TYBLE-16 configuration
kenjiArai 1:9011c83e4178 182 cpu_sys();
kenjiArai 1:9011c83e4178 183 if (compile_condition() == false) {
kenjiArai 1:9011c83e4178 184 pc.printf("This is wrong configuration!!\r\n");
kenjiArai 1:9011c83e4178 185 while(true) {
kenjiArai 1:9011c83e4178 186 led1 = !led1;
kenjiArai 1:9011c83e4178 187 wait(0.2);
kenjiArai 1:9011c83e4178 188 }
kenjiArai 1:9011c83e4178 189 }
kenjiArai 1:9011c83e4178 190 #if USE_LCD
kenjiArai 1:9011c83e4178 191 lcd.locate(0, 0);
kenjiArai 1:9011c83e4178 192 // 123456 7890123456
kenjiArai 1:9011c83e4178 193 lcd.printf("Temp: %cC count", 0xdf);
kenjiArai 1:9011c83e4178 194 #endif
kenjiArai 1:9011c83e4178 195 eventQueue.call_every(1000, periodicCallback);
kenjiArai 1:9011c83e4178 196
kenjiArai 1:9011c83e4178 197 BLE &ble = BLE::Instance();
kenjiArai 1:9011c83e4178 198 ble.onEventsToProcess(scheduleBleEventsProcessing);
kenjiArai 1:9011c83e4178 199 ble.init(bleInitComplete);
kenjiArai 1:9011c83e4178 200
kenjiArai 1:9011c83e4178 201 eventQueue.dispatch_forever();
kenjiArai 1:9011c83e4178 202
kenjiArai 1:9011c83e4178 203 return 0;
kenjiArai 1:9011c83e4178 204 }
kenjiArai 1:9011c83e4178 205
kenjiArai 1:9011c83e4178 206 #endif