test

Dependencies:   BLE_API TMP102 mbed nRF51822

Committer:
Takhirano
Date:
Thu Oct 19 06:54:46 2017 +0000
Revision:
0:5017f0ff1b5c
test;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Takhirano 0:5017f0ff1b5c 1 #include "mbed.h"
Takhirano 0:5017f0ff1b5c 2 #include "TMP102.h"
Takhirano 0:5017f0ff1b5c 3 #include "BLE.h"
Takhirano 0:5017f0ff1b5c 4
Takhirano 0:5017f0ff1b5c 5 #define NEED_CONSOLE_OUTPUT 1 /* Set this if you need debug messages on the console;
Takhirano 0:5017f0ff1b5c 6 * it will have an impact on code-size and power consumption. */
Takhirano 0:5017f0ff1b5c 7
Takhirano 0:5017f0ff1b5c 8 #if NEED_CONSOLE_OUTPUT
Takhirano 0:5017f0ff1b5c 9 Serial pc(USBTX, USBRX);
Takhirano 0:5017f0ff1b5c 10 #define DEBUG(...) { pc.printf(__VA_ARGS__); }
Takhirano 0:5017f0ff1b5c 11 #else
Takhirano 0:5017f0ff1b5c 12 #define DEBUG(...) /* nothing */
Takhirano 0:5017f0ff1b5c 13 #endif /* #if NEED_CONSOLE_OUTPUT */
Takhirano 0:5017f0ff1b5c 14
Takhirano 0:5017f0ff1b5c 15 const static char DEVICE_NAME[] = "HRM1017_HTM";
Takhirano 0:5017f0ff1b5c 16 static volatile bool triggerSensorPolling = false;
Takhirano 0:5017f0ff1b5c 17
Takhirano 0:5017f0ff1b5c 18 BLEDevice ble;
Takhirano 0:5017f0ff1b5c 19 TMP102 healthThemometer(I2C_SDA0, I2C_SCL0, 0x90); /* The TMP102 connected to our board */
Takhirano 0:5017f0ff1b5c 20 //TMP102 healthThemometer(I2C_SDA1, I2C_SCL1, 0x90); /* The TMP102 connected to our board */
Takhirano 0:5017f0ff1b5c 21
Takhirano 0:5017f0ff1b5c 22 /* LEDs for indication: */
Takhirano 0:5017f0ff1b5c 23 DigitalOut oneSecondLed(LED1); /* LED1 is toggled every second. */
Takhirano 0:5017f0ff1b5c 24 DigitalOut advertisingStateLed(LED2); /* LED2 is on when we are advertising, otherwise off. */
Takhirano 0:5017f0ff1b5c 25
Takhirano 0:5017f0ff1b5c 26
Takhirano 0:5017f0ff1b5c 27 /* Health Thermometer Service */
Takhirano 0:5017f0ff1b5c 28 uint8_t thermTempPayload[5] = { 0, 0, 0, 0, 0 };
Takhirano 0:5017f0ff1b5c 29
Takhirano 0:5017f0ff1b5c 30 GattCharacteristic tempChar (GattCharacteristic::UUID_TEMPERATURE_MEASUREMENT_CHAR,
Takhirano 0:5017f0ff1b5c 31 thermTempPayload, 5, 5,
Takhirano 0:5017f0ff1b5c 32 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_INDICATE);
Takhirano 0:5017f0ff1b5c 33 /* Battery Level Service */
Takhirano 0:5017f0ff1b5c 34 uint8_t batt = 100; /* Battery level */
Takhirano 0:5017f0ff1b5c 35 uint8_t read_batt = 0; /* Variable to hold battery level reads */
Takhirano 0:5017f0ff1b5c 36 GattCharacteristic battLevel ( GattCharacteristic::UUID_BATTERY_LEVEL_CHAR,
Takhirano 0:5017f0ff1b5c 37 (uint8_t *)batt, 1, 1,
Takhirano 0:5017f0ff1b5c 38 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_NOTIFY);
Takhirano 0:5017f0ff1b5c 39 GattCharacteristic *htmChars[] = {&tempChar, };
Takhirano 0:5017f0ff1b5c 40 GattCharacteristic *battChars[] = {&battLevel, };
Takhirano 0:5017f0ff1b5c 41 GattService htmService(GattService::UUID_HEALTH_THERMOMETER_SERVICE, htmChars,
Takhirano 0:5017f0ff1b5c 42 sizeof(htmChars) / sizeof(GattCharacteristic *));
Takhirano 0:5017f0ff1b5c 43 GattService battService(GattService::UUID_BATTERY_SERVICE, battChars,
Takhirano 0:5017f0ff1b5c 44 sizeof(battChars) / sizeof(GattCharacteristic *));
Takhirano 0:5017f0ff1b5c 45
Takhirano 0:5017f0ff1b5c 46 uint16_t uuid16_list[] = {GattService::UUID_HEALTH_THERMOMETER_SERVICE,
Takhirano 0:5017f0ff1b5c 47 GattService::UUID_BATTERY_SERVICE};
Takhirano 0:5017f0ff1b5c 48
Takhirano 0:5017f0ff1b5c 49 uint32_t quick_ieee11073_from_float(float temperature);
Takhirano 0:5017f0ff1b5c 50 void updateServiceValues(void);
Takhirano 0:5017f0ff1b5c 51
Takhirano 0:5017f0ff1b5c 52 static Gap::ConnectionParams_t connectionParams;
Takhirano 0:5017f0ff1b5c 53
Takhirano 0:5017f0ff1b5c 54 void disconnectionCallback(const Gap::DisconnectionCallbackParams_t *params) // Mod
Takhirano 0:5017f0ff1b5c 55 {
Takhirano 0:5017f0ff1b5c 56 advertisingStateLed = 1;
Takhirano 0:5017f0ff1b5c 57
Takhirano 0:5017f0ff1b5c 58 DEBUG("Disconnected handle %u, reason %u\r\n", params->handle, params->reason);
Takhirano 0:5017f0ff1b5c 59 DEBUG("Restarting the advertising process\r\n");
Takhirano 0:5017f0ff1b5c 60 ble.gap().startAdvertising();
Takhirano 0:5017f0ff1b5c 61 }
Takhirano 0:5017f0ff1b5c 62
Takhirano 0:5017f0ff1b5c 63 void onConnectionCallback(const Gap::ConnectionCallbackParams_t *params) //Mod
Takhirano 0:5017f0ff1b5c 64 {
Takhirano 0:5017f0ff1b5c 65 advertisingStateLed = 0;
Takhirano 0:5017f0ff1b5c 66
Takhirano 0:5017f0ff1b5c 67 DEBUG("connected. Got handle %u\r\n", params->handle);
Takhirano 0:5017f0ff1b5c 68
Takhirano 0:5017f0ff1b5c 69 connectionParams.slaveLatency = 1;
Takhirano 0:5017f0ff1b5c 70 if (ble.gap().updateConnectionParams(params->handle, &connectionParams) != BLE_ERROR_NONE) {
Takhirano 0:5017f0ff1b5c 71 DEBUG("failed to update connection paramter\r\n");
Takhirano 0:5017f0ff1b5c 72 }
Takhirano 0:5017f0ff1b5c 73 }
Takhirano 0:5017f0ff1b5c 74
Takhirano 0:5017f0ff1b5c 75 void periodicCallback(void)
Takhirano 0:5017f0ff1b5c 76 {
Takhirano 0:5017f0ff1b5c 77 oneSecondLed = !oneSecondLed; /* Do blinky on LED1 while we're waiting for BLE events */
Takhirano 0:5017f0ff1b5c 78
Takhirano 0:5017f0ff1b5c 79 /* Note that the periodicCallback() executes in interrupt context, so it is safer to do
Takhirano 0:5017f0ff1b5c 80 * heavy-weight sensor polling from the main thread. */
Takhirano 0:5017f0ff1b5c 81 triggerSensorPolling = true;
Takhirano 0:5017f0ff1b5c 82 }
Takhirano 0:5017f0ff1b5c 83
Takhirano 0:5017f0ff1b5c 84 /**************************************************************************/
Takhirano 0:5017f0ff1b5c 85 /*!
Takhirano 0:5017f0ff1b5c 86 @brief Program entry point
Takhirano 0:5017f0ff1b5c 87 */
Takhirano 0:5017f0ff1b5c 88 /**************************************************************************/
Takhirano 0:5017f0ff1b5c 89 int main(void)
Takhirano 0:5017f0ff1b5c 90 {
Takhirano 0:5017f0ff1b5c 91
Takhirano 0:5017f0ff1b5c 92 /* Setup blinky led */
Takhirano 0:5017f0ff1b5c 93 oneSecondLed = 1;
Takhirano 0:5017f0ff1b5c 94 Ticker ticker;
Takhirano 0:5017f0ff1b5c 95 ticker.attach(periodicCallback, 1);
Takhirano 0:5017f0ff1b5c 96
Takhirano 0:5017f0ff1b5c 97 DEBUG("Initialising the nRF51822\r\n");
Takhirano 0:5017f0ff1b5c 98 ble.init();
Takhirano 0:5017f0ff1b5c 99 DEBUG("Init done\r\n");
Takhirano 0:5017f0ff1b5c 100 ble.gap().onDisconnection(disconnectionCallback);
Takhirano 0:5017f0ff1b5c 101 ble.gap().onConnection(onConnectionCallback);
Takhirano 0:5017f0ff1b5c 102
Takhirano 0:5017f0ff1b5c 103 ble.gap().getPreferredConnectionParams(&connectionParams);
Takhirano 0:5017f0ff1b5c 104
Takhirano 0:5017f0ff1b5c 105 /* setup advertising */
Takhirano 0:5017f0ff1b5c 106 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
Takhirano 0:5017f0ff1b5c 107 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_16BIT_SERVICE_IDS, (uint8_t*)uuid16_list, sizeof(uuid16_list));
Takhirano 0:5017f0ff1b5c 108 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_THERMOMETER);
Takhirano 0:5017f0ff1b5c 109 ble.gap().accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LOCAL_NAME, (uint8_t *)DEVICE_NAME, sizeof(DEVICE_NAME));
Takhirano 0:5017f0ff1b5c 110 ble.gap().setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
Takhirano 0:5017f0ff1b5c 111 ble.gap().setAdvertisingInterval(160); /* 100ms; in multiples of 0.625ms. */
Takhirano 0:5017f0ff1b5c 112 ble.gap().startAdvertising();
Takhirano 0:5017f0ff1b5c 113 advertisingStateLed = 1;
Takhirano 0:5017f0ff1b5c 114 DEBUG("Start Advertising\r\n");
Takhirano 0:5017f0ff1b5c 115
Takhirano 0:5017f0ff1b5c 116 ble.gattServer().addService(htmService);
Takhirano 0:5017f0ff1b5c 117 ble.gattServer().addService(battService);
Takhirano 0:5017f0ff1b5c 118 DEBUG("Add Service\r\n");
Takhirano 0:5017f0ff1b5c 119
Takhirano 0:5017f0ff1b5c 120 while (true) {
Takhirano 0:5017f0ff1b5c 121 if (triggerSensorPolling) {
Takhirano 0:5017f0ff1b5c 122 triggerSensorPolling = false;
Takhirano 0:5017f0ff1b5c 123 updateServiceValues();
Takhirano 0:5017f0ff1b5c 124 } else {
Takhirano 0:5017f0ff1b5c 125 ble.waitForEvent();
Takhirano 0:5017f0ff1b5c 126 }
Takhirano 0:5017f0ff1b5c 127 }
Takhirano 0:5017f0ff1b5c 128 }
Takhirano 0:5017f0ff1b5c 129
Takhirano 0:5017f0ff1b5c 130 /**************************************************************************/
Takhirano 0:5017f0ff1b5c 131 /*!
Takhirano 0:5017f0ff1b5c 132 @brief Ticker callback to switch advertisingStateLed state
Takhirano 0:5017f0ff1b5c 133 */
Takhirano 0:5017f0ff1b5c 134 /**************************************************************************/
Takhirano 0:5017f0ff1b5c 135 void updateServiceValues(void)
Takhirano 0:5017f0ff1b5c 136 {
Takhirano 0:5017f0ff1b5c 137 /* Decrement the battery level. */
Takhirano 0:5017f0ff1b5c 138 batt <=50 ? batt=100 : batt--;
Takhirano 0:5017f0ff1b5c 139
Takhirano 0:5017f0ff1b5c 140 /* Update the temperature. Note that we need to convert to an ieee11073 format float. */
Takhirano 0:5017f0ff1b5c 141 float temperature = healthThemometer.read();
Takhirano 0:5017f0ff1b5c 142 DEBUG("temp:%f\r\n", temperature);
Takhirano 0:5017f0ff1b5c 143 uint32_t temp_ieee11073 = quick_ieee11073_from_float(temperature);
Takhirano 0:5017f0ff1b5c 144 memcpy(thermTempPayload+1, &temp_ieee11073, 4);
Takhirano 0:5017f0ff1b5c 145 ble.gattServer().write(tempChar.getValueAttribute().getHandle(), thermTempPayload, sizeof(thermTempPayload)); //Mod
Takhirano 0:5017f0ff1b5c 146 ble.gattServer().write(battLevel.getValueAttribute().getHandle(), (uint8_t *)&batt, sizeof(batt)); //Mod
Takhirano 0:5017f0ff1b5c 147 }
Takhirano 0:5017f0ff1b5c 148
Takhirano 0:5017f0ff1b5c 149 /**
Takhirano 0:5017f0ff1b5c 150 * @brief A very quick conversion between a float temperature and 11073-20601 FLOAT-Type.
Takhirano 0:5017f0ff1b5c 151 * @param temperature The temperature as a float.
Takhirano 0:5017f0ff1b5c 152 * @return The temperature in 11073-20601 FLOAT-Type format.
Takhirano 0:5017f0ff1b5c 153 */
Takhirano 0:5017f0ff1b5c 154 uint32_t quick_ieee11073_from_float(float temperature)
Takhirano 0:5017f0ff1b5c 155 {
Takhirano 0:5017f0ff1b5c 156 uint8_t exponent = 0xFF; //exponent is -1
Takhirano 0:5017f0ff1b5c 157 uint32_t mantissa = (uint32_t)(temperature*10);
Takhirano 0:5017f0ff1b5c 158
Takhirano 0:5017f0ff1b5c 159 return ( ((uint32_t)exponent) << 24) | mantissa;
Takhirano 0:5017f0ff1b5c 160 }