TYBLE16 on os5 sample programs
Dependencies: BME280 TextLCD nRF51_Vdd
Fork of TYBLE16_mbedlized_os5_BASE by
Please refer following notebook.
/users/kenjiArai/notebook/tyble16-module-as-mbed-os-5-board-mbedlization/
6_Thermo/main.cpp@1:9011c83e4178, 2018-04-14 (annotated)
- Committer:
- kenjiArai
- Date:
- Sat Apr 14 04:56:34 2018 +0000
- Revision:
- 1:9011c83e4178
- Child:
- 2:47ad8c48224e
added samples
Who changed what in which revision?
User | Revision | Line number | New 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 | 1:9011c83e4178 | 32 | #define NO_SENSOR 1 |
kenjiArai | 1:9011c83e4178 | 33 | #define HAS_SENSOR 0 |
kenjiArai | 1:9011c83e4178 | 34 | #define USE_LCD 0 |
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 |