Button initiated config service

Dependencies:   BLE_API_EddystoneConfigService_2 mbed nRF51822

Fork of BLE_EddystoneBeaconConfigService_3 by URIBeacon

Committer:
mbedAustin
Date:
Thu Sep 17 20:48:19 2015 +0000
Revision:
56:f95c72f9c504
Parent:
55:3818a9fa827d
Child:
58:87afe537345b
Modified behavior, now the config service will display the configuration parameters in adv packets, regardless of whether it is reset to default or not.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mbedAustin 23:05e9bb3b13af 1 /* mbed Microcontroller Library
mbedAustin 23:05e9bb3b13af 2 * Copyright (c) 2006-2013 ARM Limited
mbedAustin 23:05e9bb3b13af 3 *
mbedAustin 23:05e9bb3b13af 4 * Licensed under the Apache License, Version 2.0 (the "License");
mbedAustin 23:05e9bb3b13af 5 * you may not use this file except in compliance with the License.
mbedAustin 23:05e9bb3b13af 6 * You may obtain a copy of the License at
mbedAustin 23:05e9bb3b13af 7 *
mbedAustin 23:05e9bb3b13af 8 * http://www.apache.org/licenses/LICENSE-2.0
mbedAustin 23:05e9bb3b13af 9 *
mbedAustin 23:05e9bb3b13af 10 * Unless required by applicable law or agreed to in writing, software
mbedAustin 23:05e9bb3b13af 11 * distributed under the License is distributed on an "AS IS" BASIS,
mbedAustin 23:05e9bb3b13af 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
mbedAustin 23:05e9bb3b13af 13 * See the License for the specific language governing permissions and
mbedAustin 23:05e9bb3b13af 14 * limitations under the License.
mbedAustin 23:05e9bb3b13af 15 */
mbedAustin 23:05e9bb3b13af 16
mbedAustin 33:8c65879e7d52 17 #ifndef SERVICES_EDDYSTONEBEACONCONFIGSERVICE_H_
mbedAustin 33:8c65879e7d52 18 #define SERVICES_EDDYSTONEBEACONCONFIGSERVICE_H_
mbedAustin 23:05e9bb3b13af 19
mbedAustin 23:05e9bb3b13af 20 #include "mbed.h"
mbedAustin 23:05e9bb3b13af 21 #include "ble/BLE.h"
mbedAustin 34:5876fbb1aa62 22 #include "ble/services/EddystoneService.h"
mbedAustin 23:05e9bb3b13af 23
mbedAustin 33:8c65879e7d52 24 #define EDDYSTONE_NUM_UID_FRAMES 10
mbedAustin 33:8c65879e7d52 25 #define EDDYSTONE_NUM_URL_FRAMES 50
mbedAustin 33:8c65879e7d52 26
mbedAustin 23:05e9bb3b13af 27
mbedAustin 23:05e9bb3b13af 28 #define UUID_URI_BEACON(FIRST, SECOND) { \
mbedAustin 23:05e9bb3b13af 29 0xee, 0x0c, FIRST, SECOND, 0x87, 0x86, 0x40, 0xba, \
mbedAustin 23:05e9bb3b13af 30 0xab, 0x96, 0x99, 0xb9, 0x1a, 0xc9, 0x81, 0xd8, \
mbedAustin 23:05e9bb3b13af 31 }
mbedAustin 23:05e9bb3b13af 32
mbedAustin 23:05e9bb3b13af 33 static const uint8_t UUID_URI_BEACON_SERVICE[] = UUID_URI_BEACON(0x20, 0x80);
mbedAustin 23:05e9bb3b13af 34 static const uint8_t UUID_LOCK_STATE_CHAR[] = UUID_URI_BEACON(0x20, 0x81);
mbedAustin 23:05e9bb3b13af 35 static const uint8_t UUID_LOCK_CHAR[] = UUID_URI_BEACON(0x20, 0x82);
mbedAustin 23:05e9bb3b13af 36 static const uint8_t UUID_UNLOCK_CHAR[] = UUID_URI_BEACON(0x20, 0x83);
mbedAustin 23:05e9bb3b13af 37 static const uint8_t UUID_URI_DATA_CHAR[] = UUID_URI_BEACON(0x20, 0x84);
mbedAustin 23:05e9bb3b13af 38 static const uint8_t UUID_FLAGS_CHAR[] = UUID_URI_BEACON(0x20, 0x85);
mbedAustin 23:05e9bb3b13af 39 static const uint8_t UUID_ADV_POWER_LEVELS_CHAR[] = UUID_URI_BEACON(0x20, 0x86);
mbedAustin 23:05e9bb3b13af 40 static const uint8_t UUID_TX_POWER_MODE_CHAR[] = UUID_URI_BEACON(0x20, 0x87);
mbedAustin 23:05e9bb3b13af 41 static const uint8_t UUID_BEACON_PERIOD_CHAR[] = UUID_URI_BEACON(0x20, 0x88);
mbedAustin 23:05e9bb3b13af 42 static const uint8_t UUID_RESET_CHAR[] = UUID_URI_BEACON(0x20, 0x89);
mbedAustin 34:5876fbb1aa62 43 extern const uint8_t BEACON_EDDYSTONE[2];
mbedAustin 23:05e9bb3b13af 44
mbedAustin 23:05e9bb3b13af 45 /**
mbedAustin 23:05e9bb3b13af 46 * @class EddystoneConfigService
mbedAustin 23:05e9bb3b13af 47 * @brief Eddystone Configuration Service. Can be used to set URL, adjust power levels, and set flags.
mbedAustin 25:e20bed9e466f 48 * See https://github.com/google/eddystone
mbedAustin 23:05e9bb3b13af 49 *
mbedAustin 23:05e9bb3b13af 50 */
mbedAustin 23:05e9bb3b13af 51 class EddystoneConfigService
mbedAustin 23:05e9bb3b13af 52 {
mbedAustin 39:2c73bc1ff4f5 53 public:
mbedAustin 23:05e9bb3b13af 54 /**
mbedAustin 23:05e9bb3b13af 55 * @brief Transmission Power Modes for UriBeacon
mbedAustin 23:05e9bb3b13af 56 */
mbedAustin 23:05e9bb3b13af 57 static const uint8_t TX_POWER_MODE_LOWEST = 0; /*!< Lowest TX power mode */
mbedAustin 23:05e9bb3b13af 58 static const uint8_t TX_POWER_MODE_LOW = 1; /*!< Low TX power mode */
mbedAustin 23:05e9bb3b13af 59 static const uint8_t TX_POWER_MODE_MEDIUM = 2; /*!< Medium TX power mode */
mbedAustin 23:05e9bb3b13af 60 static const uint8_t TX_POWER_MODE_HIGH = 3; /*!< High TX power mode */
mbedAustin 34:5876fbb1aa62 61 static const unsigned NUM_POWER_MODES = 4; /*!< Number of Power Modes defined */
mbedAustin 23:05e9bb3b13af 62
mbedAustin 23:05e9bb3b13af 63 static const int ADVERTISING_INTERVAL_MSEC = 1000; // Advertising interval for config service.
mbedAustin 23:05e9bb3b13af 64 static const int SERVICE_DATA_MAX = 31; // Maximum size of service data in ADV packets
mbedAustin 23:05e9bb3b13af 65
mbedAustin 23:05e9bb3b13af 66 typedef uint8_t Lock_t[16]; /* 128 bits */
mbedAustin 23:05e9bb3b13af 67 typedef int8_t PowerLevels_t[NUM_POWER_MODES];
mbedAustin 23:05e9bb3b13af 68
mbedAustin 23:05e9bb3b13af 69 // There are currently 3 subframes defined, URI, UID, and TLM
mbedAustin 23:05e9bb3b13af 70 #define EDDYSTONE_MAX_FRAMETYPE 3
mbedAustin 23:05e9bb3b13af 71 void (*frames[EDDYSTONE_MAX_FRAMETYPE])(uint8_t *, uint32_t);
mbedAustin 23:05e9bb3b13af 72 uint8_t frameIndex;
mbedAustin 23:05e9bb3b13af 73 static const int URI_DATA_MAX = 18;
mbedAustin 23:05e9bb3b13af 74 typedef uint8_t UriData_t[URI_DATA_MAX];
mbedAustin 23:05e9bb3b13af 75
mbedAustin 23:05e9bb3b13af 76 // UID Frame Type subfields
mbedAustin 23:05e9bb3b13af 77 static const int UID_NAMESPACEID_SIZE = 10;
mbedAustin 37:22175faa76be 78 typedef uint8_t UIDNamespaceID_t[UID_NAMESPACEID_SIZE];
mbedAustin 23:05e9bb3b13af 79 static const int UID_INSTANCEID_SIZE = 6;
mbedAustin 37:22175faa76be 80 typedef uint8_t UIDInstanceID_t[UID_INSTANCEID_SIZE];
mbedAustin 23:05e9bb3b13af 81
mbedAustin 23:05e9bb3b13af 82 // Eddystone Frame Type ID
mbedAustin 23:05e9bb3b13af 83 static const uint8_t FRAME_TYPE_UID = 0x00;
mbedAustin 23:05e9bb3b13af 84 static const uint8_t FRAME_TYPE_URL = 0x10;
mbedAustin 23:05e9bb3b13af 85 static const uint8_t FRAME_TYPE_TLM = 0x20;
mbedAustin 23:05e9bb3b13af 86
mbedAustin 23:05e9bb3b13af 87 static const uint8_t FRAME_SIZE_TLM = 14; // TLM frame is a constant 14Bytes
mbedAustin 23:05e9bb3b13af 88 static const uint8_t FRAME_SIZE_UID = 20; // includes RFU bytes
mbedAustin 23:05e9bb3b13af 89
mbedAustin 23:05e9bb3b13af 90 struct Params_t {
mbedAustin 39:2c73bc1ff4f5 91 // Config Data
mbedAustin 39:2c73bc1ff4f5 92 bool isConfigured; // Flag for configuration being complete, True = configured, false = not configured. Reset at instantiation, used for external callbacks.
mbedAustin 34:5876fbb1aa62 93 uint8_t lockedState;
mbedAustin 23:05e9bb3b13af 94 Lock_t lock;
mbedAustin 23:05e9bb3b13af 95 uint8_t flags;
mbedAustin 23:05e9bb3b13af 96 PowerLevels_t advPowerLevels; // Current value of AdvertisedPowerLevels
mbedAustin 23:05e9bb3b13af 97 uint8_t txPowerMode; // Firmware power levels used with setTxPower()
mbedAustin 23:05e9bb3b13af 98 uint16_t beaconPeriod;
mbedAustin 39:2c73bc1ff4f5 99 // TLM Frame Data
mbedAustin 34:5876fbb1aa62 100 uint8_t tlmVersion; // version of TLM packet
mbedAustin 39:2c73bc1ff4f5 101 bool tlmEnabled;
mbedAustin 39:2c73bc1ff4f5 102 uint8_t tlmBeaconPeriod; // how often to broadcat TLM frame, in minutes.
mbedAustin 39:2c73bc1ff4f5 103 // URI Frame Data
mbedAustin 39:2c73bc1ff4f5 104 uint8_t uriDataLength;
mbedAustin 39:2c73bc1ff4f5 105 UriData_t uriData;
mbedAustin 39:2c73bc1ff4f5 106 bool uriEnabled;
mbedAustin 39:2c73bc1ff4f5 107 uint8_t uriBeaconPeriod; // how often to broadcast URIFrame, in # of adv frames
mbedAustin 39:2c73bc1ff4f5 108 // UID Frame Data
mbedAustin 34:5876fbb1aa62 109 UIDNamespaceID_t uidNamespaceID; // UUID type, Namespace ID, 10B
mbedAustin 34:5876fbb1aa62 110 UIDInstanceID_t uidInstanceID; // UUID type, Instance ID, 6B
mbedAustin 39:2c73bc1ff4f5 111 bool uidEnabled;
mbedAustin 39:2c73bc1ff4f5 112 uint8_t uidBeaconPeriod; // how often to broadcast UID Frame, in # of adv frames
mbedAustin 23:05e9bb3b13af 113 };
mbedAustin 23:05e9bb3b13af 114
mbedAustin 23:05e9bb3b13af 115 /**
mbedAustin 23:05e9bb3b13af 116 * @param[ref] ble
mbedAustin 23:05e9bb3b13af 117 * BLEDevice object for the underlying controller.
mbedAustin 23:05e9bb3b13af 118 * @param[in/out] paramsIn
mbedAustin 23:05e9bb3b13af 119 * Reference to application-visible beacon state, loaded
mbedAustin 23:05e9bb3b13af 120 * from persistent storage at startup.
mbedAustin 23:05e9bb3b13af 121 * @param[in] defaultAdvPowerLevelsIn
mbedAustin 23:05e9bb3b13af 122 * Default power-levels array; applies only if the resetToDefaultsFlag is true.
mbedAustin 23:05e9bb3b13af 123 */
mbedAustin 23:05e9bb3b13af 124 EddystoneConfigService(BLEDevice &bleIn,
mbedAustin 23:05e9bb3b13af 125 Params_t &paramsIn,
mbedAustin 55:3818a9fa827d 126 PowerLevels_t &defaultAdvPowerLevelsIn,
mbedAustin 55:3818a9fa827d 127 PowerLevels_t &radioPowerLevelsIn) :
mbedAustin 23:05e9bb3b13af 128 ble(bleIn),
mbedAustin 31:11e7a505a4be 129 params(paramsIn), // Initialize URL Data
mbedAustin 45:1827e4f496a7 130 defaultUriDataLength(0),
mbedAustin 23:05e9bb3b13af 131 defaultUriData(),
mbedAustin 34:5876fbb1aa62 132 defaultUidNamespaceID(), // Initialize UID Data
mbedAustin 34:5876fbb1aa62 133 defaultUidInstanceID(),
mbedAustin 47:c191b7b7521d 134 defaultUrlPower(defaultAdvPowerLevelsIn[params.txPowerMode]),
mbedAustin 47:c191b7b7521d 135 defaultUidPower(defaultAdvPowerLevelsIn[params.txPowerMode]),
mbedAustin 23:05e9bb3b13af 136 defaultAdvPowerLevels(defaultAdvPowerLevelsIn),
mbedAustin 55:3818a9fa827d 137 radioPowerLevels(radioPowerLevelsIn),
mbedAustin 23:05e9bb3b13af 138 initSucceeded(false),
mbedAustin 23:05e9bb3b13af 139 resetFlag(),
mbedAustin 44:0e27ee7800b8 140 tlmIsSet(false),
mbedAustin 44:0e27ee7800b8 141 urlIsSet(false),
mbedAustin 44:0e27ee7800b8 142 uidIsSet(false),
mbedAustin 34:5876fbb1aa62 143 lockedStateChar(UUID_LOCK_STATE_CHAR, &params.lockedState),
mbedAustin 23:05e9bb3b13af 144 lockChar(UUID_LOCK_CHAR, &params.lock),
mbedAustin 23:05e9bb3b13af 145 uriDataChar(UUID_URI_DATA_CHAR, params.uriData, 0, URI_DATA_MAX,
mbedAustin 23:05e9bb3b13af 146 GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_READ | GattCharacteristic::BLE_GATT_CHAR_PROPERTIES_WRITE),
mbedAustin 23:05e9bb3b13af 147 unlockChar(UUID_UNLOCK_CHAR, &params.lock),
mbedAustin 23:05e9bb3b13af 148 flagsChar(UUID_FLAGS_CHAR, &params.flags),
mbedAustin 23:05e9bb3b13af 149 advPowerLevelsChar(UUID_ADV_POWER_LEVELS_CHAR, &params.advPowerLevels),
mbedAustin 23:05e9bb3b13af 150 txPowerModeChar(UUID_TX_POWER_MODE_CHAR, &params.txPowerMode),
mbedAustin 23:05e9bb3b13af 151 beaconPeriodChar(UUID_BEACON_PERIOD_CHAR, &params.beaconPeriod),
mbedAustin 31:11e7a505a4be 152 resetChar(UUID_RESET_CHAR, &resetFlag)
mbedAustin 31:11e7a505a4be 153 {
mbedAustin 44:0e27ee7800b8 154 // set eddystone as not configured yet. Used to exit config before timeout if GATT services are written to.
mbedAustin 40:6f39aee31205 155 params.isConfigured = false;
mbedAustin 44:0e27ee7800b8 156 }
mbedAustin 44:0e27ee7800b8 157
mbedAustin 44:0e27ee7800b8 158 /*
mbedAustin 44:0e27ee7800b8 159 * @breif Start EddystoneConfig advertising. This function should be called after the EddystoneConfig constructor and after all the frames have been added.
mbedAustin 44:0e27ee7800b8 160 * @paramsP[in] resetToDefaultsFlag
mbedAustin 44:0e27ee7800b8 161 * Applies to the state of the 'paramsIn' parameter.
mbedAustin 44:0e27ee7800b8 162 * If true, it indicates that paramsIn is potentially
mbedAustin 44:0e27ee7800b8 163 * un-initialized, and default values should be used
mbedAustin 44:0e27ee7800b8 164 * instead. Otherwise, paramsIn overrides the defaults.
mbedAustin 44:0e27ee7800b8 165 *
mbedAustin 44:0e27ee7800b8 166 */
mbedAustin 44:0e27ee7800b8 167 void start(bool resetToDefaultsFlag){
mbedAustin 50:52a8b18d5bf1 168 INFO("reset to defaults flag = %d", resetToDefaultsFlag);
mbedAustin 23:05e9bb3b13af 169 if (!resetToDefaultsFlag && (params.uriDataLength > URI_DATA_MAX)) {
mbedAustin 50:52a8b18d5bf1 170 INFO("Reset to Defaults triggered");
mbedAustin 23:05e9bb3b13af 171 resetToDefaultsFlag = true;
mbedAustin 23:05e9bb3b13af 172 }
mbedAustin 23:05e9bb3b13af 173 if (resetToDefaultsFlag) {
mbedAustin 23:05e9bb3b13af 174 resetToDefaults();
mbedAustin 23:05e9bb3b13af 175 }
mbedAustin 56:f95c72f9c504 176 updateCharacteristicValues();
mbedAustin 56:f95c72f9c504 177
mbedAustin 23:05e9bb3b13af 178 lockChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::lockAuthorizationCallback);
mbedAustin 23:05e9bb3b13af 179 unlockChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::unlockAuthorizationCallback);
mbedAustin 23:05e9bb3b13af 180 uriDataChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::uriDataWriteAuthorizationCallback);
mbedAustin 23:05e9bb3b13af 181 flagsChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::basicAuthorizationCallback<uint8_t>);
mbedAustin 23:05e9bb3b13af 182 advPowerLevelsChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::basicAuthorizationCallback<PowerLevels_t>);
mbedAustin 23:05e9bb3b13af 183 txPowerModeChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::powerModeAuthorizationCallback);
mbedAustin 23:05e9bb3b13af 184 beaconPeriodChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::basicAuthorizationCallback<uint16_t>);
mbedAustin 23:05e9bb3b13af 185 resetChar.setWriteAuthorizationCallback(this, &EddystoneConfigService::basicAuthorizationCallback<uint8_t>);
mbedAustin 23:05e9bb3b13af 186
mbedAustin 23:05e9bb3b13af 187 static GattCharacteristic *charTable[] = {
mbedAustin 23:05e9bb3b13af 188 &lockedStateChar, &lockChar, &unlockChar, &uriDataChar,
mbedAustin 23:05e9bb3b13af 189 &flagsChar, &advPowerLevelsChar, &txPowerModeChar, &beaconPeriodChar, &resetChar
mbedAustin 23:05e9bb3b13af 190 };
mbedAustin 23:05e9bb3b13af 191
mbedAustin 23:05e9bb3b13af 192 GattService configService(UUID_URI_BEACON_SERVICE, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
mbedAustin 23:05e9bb3b13af 193
mbedAustin 23:05e9bb3b13af 194 ble.addService(configService);
mbedAustin 23:05e9bb3b13af 195 ble.onDataWritten(this, &EddystoneConfigService::onDataWrittenCallback);
mbedAustin 23:05e9bb3b13af 196
mbedAustin 23:05e9bb3b13af 197 setupEddystoneConfigAdvertisements(); /* Setup advertising for the configService. */
mbedAustin 23:05e9bb3b13af 198
mbedAustin 23:05e9bb3b13af 199 initSucceeded = true;
mbedAustin 23:05e9bb3b13af 200 }
mbedAustin 23:05e9bb3b13af 201
mbedAustin 39:2c73bc1ff4f5 202 /*
mbedAustin 39:2c73bc1ff4f5 203 * Check if eddystone initialized successfully
mbedAustin 39:2c73bc1ff4f5 204 */
mbedAustin 39:2c73bc1ff4f5 205 bool initSuccessfully(void) const {
mbedAustin 23:05e9bb3b13af 206 return initSucceeded;
mbedAustin 23:05e9bb3b13af 207 }
mbedAustin 44:0e27ee7800b8 208
mbedAustin 44:0e27ee7800b8 209 /*
mbedAustin 44:0e27ee7800b8 210 * @breif Function to update the default values for the TLM frame. Only applied if Reset Defaults is applied.
mbedAustin 44:0e27ee7800b8 211 *
mbedAustin 44:0e27ee7800b8 212 * @param[in] tlmVersionIn Version of the TLM frame being used
mbedAustin 44:0e27ee7800b8 213 * @param[in] advPeriodInMin how long between TLM frames being advertised, this is measured in minutes.
mbedAustin 44:0e27ee7800b8 214 *
mbedAustin 44:0e27ee7800b8 215 */
mbedAustin 44:0e27ee7800b8 216 void setDefaultTLMFrameData(uint8_t tlmVersionIn = 0, uint32_t advPeriodInMin = 1){
mbedAustin 44:0e27ee7800b8 217 DBG("Setting Default TLM Data, version = %d, advPeriodInMind= %d",tlmVersionIn,advPeriodInMin);
mbedAustin 44:0e27ee7800b8 218 defaultTlmVersion = tlmVersionIn;
mbedAustin 44:0e27ee7800b8 219 TlmBatteryVoltage = 0;
mbedAustin 44:0e27ee7800b8 220 TlmBeaconTemp = 0;
mbedAustin 44:0e27ee7800b8 221 TlmPduCount = 0;
mbedAustin 44:0e27ee7800b8 222 TlmTimeSinceBoot = 0;
mbedAustin 44:0e27ee7800b8 223 defaultTlmAdvPeriod = advPeriodInMin;
mbedAustin 44:0e27ee7800b8 224 tlmIsSet = true; // flag to add this to eddystone service when config is done
mbedAustin 44:0e27ee7800b8 225
mbedAustin 44:0e27ee7800b8 226 }
mbedAustin 44:0e27ee7800b8 227
mbedAustin 44:0e27ee7800b8 228 /*
mbedAustin 44:0e27ee7800b8 229 * @breif Function to update the default values for the URI frame. Only applied if Reset Defaults is applied.
mbedAustin 44:0e27ee7800b8 230 *
mbedAustin 44:0e27ee7800b8 231 * @param[in] uriIn url to advertise
mbedAustin 44:0e27ee7800b8 232 * @param[in] advPeriod how long to advertise the url for, measured in number of ADV frames.
mbedAustin 44:0e27ee7800b8 233 *
mbedAustin 44:0e27ee7800b8 234 */
mbedAustin 44:0e27ee7800b8 235 void setDefaultURIFrameData(const char * uriIn,uint32_t advPeriod = 1000){
mbedAustin 44:0e27ee7800b8 236 DBG("Setting Default URI Data");
mbedAustin 45:1827e4f496a7 237 // // Set URL Frame
mbedAustin 45:1827e4f496a7 238 // EddystoneService::encodeURL(uriIn, defaultUriData, defaultUriDataLength); // encode URL to URL Formatting
mbedAustin 45:1827e4f496a7 239 // if (defaultUriDataLength > URI_DATA_MAX) {
mbedAustin 45:1827e4f496a7 240 // return;
mbedAustin 45:1827e4f496a7 241 // }
mbedAustin 45:1827e4f496a7 242 memcpy(defaultUriData,uriIn,URI_DATA_MAX);
mbedAustin 45:1827e4f496a7 243 // defaultUriData = (UriData_t *)uriIn;
mbedAustin 44:0e27ee7800b8 244 defaultUriAdvPeriod = advPeriod;
mbedAustin 44:0e27ee7800b8 245 urlIsSet = true; // flag to add this to eddystone service when config is done
mbedAustin 44:0e27ee7800b8 246 }
mbedAustin 44:0e27ee7800b8 247
mbedAustin 44:0e27ee7800b8 248 /*
mbedAustin 44:0e27ee7800b8 249 * @breif Function to update the default values for the UID frame. Only applied if Reset Defaults is applied.
mbedAustin 44:0e27ee7800b8 250 *
mbedAustin 44:0e27ee7800b8 251 * @param[in] namespaceID 10Byte Namespace ID
mbedAustin 44:0e27ee7800b8 252 * @param[in] instanceID 6Byte Instance ID
mbedAustin 44:0e27ee7800b8 253 * @param[in] advPeriod how long to advertise the URL for, measured in the number of adv frames.
mbedAustin 44:0e27ee7800b8 254 *
mbedAustin 44:0e27ee7800b8 255 */
mbedAustin 44:0e27ee7800b8 256 void setDefaultUIDFrameData(UIDNamespaceID_t *namespaceID, UIDInstanceID_t *instanceID, uint32_t advPeriod = 10){
mbedAustin 44:0e27ee7800b8 257 //Set UID frame
mbedAustin 44:0e27ee7800b8 258 DBG("Setting default UID Data");
mbedAustin 44:0e27ee7800b8 259 memcpy(defaultUidNamespaceID, namespaceID, UID_NAMESPACEID_SIZE);
mbedAustin 44:0e27ee7800b8 260 memcpy(defaultUidInstanceID, instanceID, UID_INSTANCEID_SIZE);
mbedAustin 44:0e27ee7800b8 261 defaultUidAdvPeriod = advPeriod;
mbedAustin 44:0e27ee7800b8 262 uidIsSet = true; // flag to add this to eddystone service when config is done
mbedAustin 44:0e27ee7800b8 263 }
mbedAustin 23:05e9bb3b13af 264
mbedAustin 23:05e9bb3b13af 265 /* Start out by advertising the configService for a limited time after
mbedAustin 23:05e9bb3b13af 266 * startup; and switch to the normal non-connectible beacon functionality
mbedAustin 23:05e9bb3b13af 267 * afterwards. */
mbedAustin 23:05e9bb3b13af 268 void setupEddystoneConfigAdvertisements() {
mbedAustin 23:05e9bb3b13af 269 const char DEVICE_NAME[] = "eddystone Config";
mbedAustin 23:05e9bb3b13af 270
mbedAustin 23:05e9bb3b13af 271 ble.clearAdvertisingPayload();
mbedAustin 23:05e9bb3b13af 272
mbedAustin 23:05e9bb3b13af 273 ble.accumulateAdvertisingPayload(GapAdvertisingData::BREDR_NOT_SUPPORTED | GapAdvertisingData::LE_GENERAL_DISCOVERABLE);
mbedAustin 23:05e9bb3b13af 274
mbedAustin 23:05e9bb3b13af 275 // UUID is in different order in the ADV frame (!)
mbedAustin 23:05e9bb3b13af 276 uint8_t reversedServiceUUID[sizeof(UUID_URI_BEACON_SERVICE)];
mbedAustin 23:05e9bb3b13af 277 for (unsigned int i = 0; i < sizeof(UUID_URI_BEACON_SERVICE); i++) {
mbedAustin 23:05e9bb3b13af 278 reversedServiceUUID[i] = UUID_URI_BEACON_SERVICE[sizeof(UUID_URI_BEACON_SERVICE) - i - 1];
mbedAustin 23:05e9bb3b13af 279 }
mbedAustin 23:05e9bb3b13af 280 ble.accumulateAdvertisingPayload(GapAdvertisingData::COMPLETE_LIST_128BIT_SERVICE_IDS, reversedServiceUUID, sizeof(reversedServiceUUID));
mbedAustin 23:05e9bb3b13af 281 ble.accumulateAdvertisingPayload(GapAdvertisingData::GENERIC_TAG);
mbedAustin 23:05e9bb3b13af 282 ble.accumulateScanResponse(GapAdvertisingData::COMPLETE_LOCAL_NAME, reinterpret_cast<const uint8_t *>(&DEVICE_NAME), sizeof(DEVICE_NAME));
mbedAustin 23:05e9bb3b13af 283 ble.accumulateScanResponse(
mbedAustin 23:05e9bb3b13af 284 GapAdvertisingData::TX_POWER_LEVEL,
mbedAustin 23:05e9bb3b13af 285 reinterpret_cast<uint8_t *>(&defaultAdvPowerLevels[EddystoneConfigService::TX_POWER_MODE_LOW]),
mbedAustin 23:05e9bb3b13af 286 sizeof(uint8_t));
mbedAustin 23:05e9bb3b13af 287
mbedAustin 55:3818a9fa827d 288 ble.setTxPower(radioPowerLevels[params.txPowerMode]);
mbedAustin 23:05e9bb3b13af 289 ble.setDeviceName(reinterpret_cast<const uint8_t *>(&DEVICE_NAME));
mbedAustin 23:05e9bb3b13af 290 ble.setAdvertisingType(GapAdvertisingParams::ADV_CONNECTABLE_UNDIRECTED);
mbedAustin 34:5876fbb1aa62 291 ble.setAdvertisingInterval(GapAdvertisingParams::MSEC_TO_ADVERTISEMENT_DURATION_UNITS(ADVERTISING_INTERVAL_MSEC));
mbedAustin 23:05e9bb3b13af 292 }
mbedAustin 23:05e9bb3b13af 293
mbedAustin 23:05e9bb3b13af 294 /*
mbedAustin 25:e20bed9e466f 295 * This function actually impliments the Eddystone Beacon service. It can be called with the help of the wrapper function
mbedAustin 25:e20bed9e466f 296 * to load saved config params, or it can be called explicitly to reset the eddystone beacon to hardcoded values on each reset.
mbedAustin 25:e20bed9e466f 297 *
mbedAustin 25:e20bed9e466f 298 */
mbedAustin 23:05e9bb3b13af 299 void setupEddystoneAdvertisements() {
mbedAustin 23:05e9bb3b13af 300 DBG("Switching Config -> adv");
mbedAustin 44:0e27ee7800b8 301 // Save params to storage
mbedAustin 23:05e9bb3b13af 302 extern void saveURIBeaconConfigParams(const Params_t *paramsP); /* forward declaration; necessary to avoid a circular dependency. */
mbedAustin 23:05e9bb3b13af 303 saveURIBeaconConfigParams(&params);
mbedAustin 44:0e27ee7800b8 304 // Setup Eddystone Service
mbedAustin 55:3818a9fa827d 305 static EddystoneService eddyServ(ble,params.beaconPeriod,radioPowerLevels[params.txPowerMode]);
mbedAustin 44:0e27ee7800b8 306 // Set configured frames (TLM,UID,URI...etc)
mbedAustin 43:e4a4f9a8766f 307 if(params.tlmEnabled){
mbedAustin 43:e4a4f9a8766f 308 eddyServ.setTLMFrameData(params.tlmVersion,params.tlmBeaconPeriod);
mbedAustin 43:e4a4f9a8766f 309 }
mbedAustin 43:e4a4f9a8766f 310 if(params.uriEnabled){
mbedAustin 48:992874158d56 311 eddyServ.setURLFrameData(params.advPowerLevels[params.txPowerMode], (const char *) params.uriData, params.uriBeaconPeriod);
mbedAustin 43:e4a4f9a8766f 312 }
mbedAustin 43:e4a4f9a8766f 313 if(params.uidEnabled){
mbedAustin 48:992874158d56 314 eddyServ.setUIDFrameData(params.advPowerLevels[params.txPowerMode], (uint8_t *) params.uidNamespaceID, (uint8_t *) params.uidInstanceID, params.uidBeaconPeriod);
mbedAustin 43:e4a4f9a8766f 315 }
mbedAustin 43:e4a4f9a8766f 316 // Start Advertising the eddystone service.
mbedAustin 43:e4a4f9a8766f 317 eddyServ.start();
mbedAustin 23:05e9bb3b13af 318 }
mbedAustin 23:05e9bb3b13af 319
mbedAustin 23:05e9bb3b13af 320 private:
mbedAustin 23:05e9bb3b13af 321
mbedAustin 23:05e9bb3b13af 322 /*
mbedAustin 23:05e9bb3b13af 323 * This callback is invoked when a GATT client attempts to modify any of the
mbedAustin 23:05e9bb3b13af 324 * characteristics of this service. Attempts to do so are also applied to
mbedAustin 23:05e9bb3b13af 325 * the internal state of this service object.
mbedAustin 23:05e9bb3b13af 326 */
mbedAustin 23:05e9bb3b13af 327 void onDataWrittenCallback(const GattWriteCallbackParams *writeParams) {
mbedAustin 23:05e9bb3b13af 328 uint16_t handle = writeParams->handle;
mbedAustin 23:05e9bb3b13af 329
mbedAustin 23:05e9bb3b13af 330 if (handle == lockChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 331 // Validated earlier
mbedAustin 23:05e9bb3b13af 332 memcpy(params.lock, writeParams->data, sizeof(Lock_t));
roywant 38:8fdb16f67e7c 333 // Set the state to be locked by the lock code (note: zeros are a valid lock)
mbedAustin 34:5876fbb1aa62 334 params.lockedState = true;
mbedAustin 44:0e27ee7800b8 335 INFO("Device Locked");
mbedAustin 23:05e9bb3b13af 336 } else if (handle == unlockChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 337 // Validated earlier
mbedAustin 34:5876fbb1aa62 338 params.lockedState = false;
mbedAustin 44:0e27ee7800b8 339 INFO("Device Unlocked");
mbedAustin 23:05e9bb3b13af 340 } else if (handle == uriDataChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 341 params.uriDataLength = writeParams->len;
mbedAustin 45:1827e4f496a7 342 memset(params.uriData,0x00,URI_DATA_MAX); // clear URI string
mbedAustin 45:1827e4f496a7 343 memcpy(params.uriData, writeParams->data, params.uriDataLength); // set URI string
mbedAustin 44:0e27ee7800b8 344 params.uriEnabled = true;
mbedAustin 34:5876fbb1aa62 345 INFO("URI = %s, URILen = %d", writeParams->data, writeParams->len);
mbedAustin 23:05e9bb3b13af 346 } else if (handle == flagsChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 347 params.flags = *(writeParams->data);
mbedAustin 34:5876fbb1aa62 348 INFO("flagsChar = 0x%x",params.flags);
mbedAustin 23:05e9bb3b13af 349 } else if (handle == advPowerLevelsChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 350 memcpy(params.advPowerLevels, writeParams->data, sizeof(PowerLevels_t));
mbedAustin 47:c191b7b7521d 351 INFO("PowerLevelsChar = %4x",params.advPowerLevels);
mbedAustin 23:05e9bb3b13af 352 } else if (handle == txPowerModeChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 353 params.txPowerMode = *(writeParams->data);
mbedAustin 34:5876fbb1aa62 354 INFO("TxPowerModeChar = %d",params.txPowerMode);
mbedAustin 23:05e9bb3b13af 355 } else if (handle == beaconPeriodChar.getValueHandle()) {
mbedAustin 23:05e9bb3b13af 356 params.beaconPeriod = *((uint16_t *)(writeParams->data));
mbedAustin 44:0e27ee7800b8 357 INFO("BeaconPeriod = %d",params.beaconPeriod);
mbedAustin 23:05e9bb3b13af 358
mbedAustin 23:05e9bb3b13af 359 /* Re-map beaconPeriod to within permissible bounds if necessary. */
mbedAustin 23:05e9bb3b13af 360 if (params.beaconPeriod != 0) {
mbedAustin 23:05e9bb3b13af 361 bool paramsUpdated = false;
mbedAustin 23:05e9bb3b13af 362 if (params.beaconPeriod < ble.getMinAdvertisingInterval()) {
mbedAustin 23:05e9bb3b13af 363 params.beaconPeriod = ble.getMinAdvertisingInterval();
mbedAustin 23:05e9bb3b13af 364 paramsUpdated = true;
mbedAustin 23:05e9bb3b13af 365 } else if (params.beaconPeriod > ble.getMaxAdvertisingInterval()) {
mbedAustin 23:05e9bb3b13af 366 params.beaconPeriod = ble.getMaxAdvertisingInterval();
mbedAustin 23:05e9bb3b13af 367 paramsUpdated = true;
mbedAustin 23:05e9bb3b13af 368 }
mbedAustin 23:05e9bb3b13af 369 if (paramsUpdated) {
mbedAustin 23:05e9bb3b13af 370 ble.updateCharacteristicValue(beaconPeriodChar.getValueHandle(), reinterpret_cast<uint8_t *>(&params.beaconPeriod), sizeof(uint16_t));
mbedAustin 23:05e9bb3b13af 371 }
mbedAustin 23:05e9bb3b13af 372 }
mbedAustin 23:05e9bb3b13af 373 } else if (handle == resetChar.getValueHandle()) {
mbedAustin 46:46bb40f60816 374 INFO("Reset triggered from Config Service, resetting to defaults");
mbedAustin 23:05e9bb3b13af 375 resetToDefaults();
mbedAustin 23:05e9bb3b13af 376 }
roywant 38:8fdb16f67e7c 377 updateCharacteristicValues();
mbedAustin 44:0e27ee7800b8 378 params.isConfigured = true; // some configuration data has been passed, on disconnect switch to advertising mode.
mbedAustin 23:05e9bb3b13af 379 }
mbedAustin 23:05e9bb3b13af 380
mbedAustin 23:05e9bb3b13af 381 /*
mbedAustin 23:05e9bb3b13af 382 * Reset the default values.
mbedAustin 23:05e9bb3b13af 383 */
mbedAustin 23:05e9bb3b13af 384 void resetToDefaults(void) {
mbedAustin 44:0e27ee7800b8 385 INFO("Resetting to defaults");
mbedAustin 44:0e27ee7800b8 386 // General
mbedAustin 34:5876fbb1aa62 387 params.lockedState = false;
mbedAustin 23:05e9bb3b13af 388 memset(params.lock, 0, sizeof(Lock_t));
mbedAustin 34:5876fbb1aa62 389 params.flags = 0x10;
mbedAustin 23:05e9bb3b13af 390 memcpy(params.advPowerLevels, defaultAdvPowerLevels, sizeof(PowerLevels_t));
mbedAustin 23:05e9bb3b13af 391 params.txPowerMode = TX_POWER_MODE_LOW;
mbedAustin 23:05e9bb3b13af 392 params.beaconPeriod = 1000;
mbedAustin 44:0e27ee7800b8 393
mbedAustin 44:0e27ee7800b8 394 // TLM Frame
mbedAustin 44:0e27ee7800b8 395 params.tlmVersion = defaultTlmVersion;
mbedAustin 44:0e27ee7800b8 396 params.tlmBeaconPeriod = defaultTlmAdvPeriod;
mbedAustin 44:0e27ee7800b8 397 params.tlmEnabled = tlmIsSet;
mbedAustin 44:0e27ee7800b8 398
mbedAustin 44:0e27ee7800b8 399 // URL Frame
mbedAustin 44:0e27ee7800b8 400 memcpy(params.uriData, defaultUriData, URI_DATA_MAX);
mbedAustin 44:0e27ee7800b8 401 params.uriDataLength = defaultUriDataLength;
mbedAustin 44:0e27ee7800b8 402 params.uriBeaconPeriod = defaultUriAdvPeriod;
mbedAustin 44:0e27ee7800b8 403 params.uriEnabled = urlIsSet;
mbedAustin 44:0e27ee7800b8 404
mbedAustin 44:0e27ee7800b8 405 // UID Frame
mbedAustin 34:5876fbb1aa62 406 memcpy(params.uidNamespaceID, defaultUidNamespaceID, UID_NAMESPACEID_SIZE);
mbedAustin 34:5876fbb1aa62 407 memcpy(params.uidInstanceID, defaultUidInstanceID, UID_INSTANCEID_SIZE);
mbedAustin 44:0e27ee7800b8 408 params.uidBeaconPeriod = defaultUidAdvPeriod;
mbedAustin 44:0e27ee7800b8 409 params.uidEnabled = uidIsSet;
mbedAustin 44:0e27ee7800b8 410
mbedAustin 23:05e9bb3b13af 411 updateCharacteristicValues();
mbedAustin 23:05e9bb3b13af 412 }
mbedAustin 23:05e9bb3b13af 413
mbedAustin 23:05e9bb3b13af 414 /*
mbedAustin 23:05e9bb3b13af 415 * Internal helper function used to update the GATT database following any
mbedAustin 23:05e9bb3b13af 416 * change to the internal state of the service object.
mbedAustin 23:05e9bb3b13af 417 */
mbedAustin 23:05e9bb3b13af 418 void updateCharacteristicValues(void) {
mbedAustin 34:5876fbb1aa62 419 ble.updateCharacteristicValue(lockedStateChar.getValueHandle(), &params.lockedState, 1);
mbedAustin 23:05e9bb3b13af 420 ble.updateCharacteristicValue(uriDataChar.getValueHandle(), params.uriData, params.uriDataLength);
mbedAustin 23:05e9bb3b13af 421 ble.updateCharacteristicValue(flagsChar.getValueHandle(), &params.flags, 1);
mbedAustin 23:05e9bb3b13af 422 ble.updateCharacteristicValue(beaconPeriodChar.getValueHandle(),
mbedAustin 23:05e9bb3b13af 423 reinterpret_cast<uint8_t *>(&params.beaconPeriod), sizeof(uint16_t));
mbedAustin 23:05e9bb3b13af 424 ble.updateCharacteristicValue(txPowerModeChar.getValueHandle(), &params.txPowerMode, 1);
mbedAustin 23:05e9bb3b13af 425 ble.updateCharacteristicValue(advPowerLevelsChar.getValueHandle(),
mbedAustin 23:05e9bb3b13af 426 reinterpret_cast<uint8_t *>(params.advPowerLevels), sizeof(PowerLevels_t));
mbedAustin 23:05e9bb3b13af 427 }
mbedAustin 23:05e9bb3b13af 428
mbedAustin 23:05e9bb3b13af 429 private:
mbedAustin 23:05e9bb3b13af 430 void lockAuthorizationCallback(GattWriteAuthCallbackParams *authParams) {
mbedAustin 34:5876fbb1aa62 431 if (params.lockedState) {
mbedAustin 23:05e9bb3b13af 432 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INSUF_AUTHORIZATION;
mbedAustin 23:05e9bb3b13af 433 } else if (authParams->len != sizeof(Lock_t)) {
mbedAustin 23:05e9bb3b13af 434 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
mbedAustin 23:05e9bb3b13af 435 } else if (authParams->offset != 0) {
mbedAustin 23:05e9bb3b13af 436 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbedAustin 23:05e9bb3b13af 437 } else {
mbedAustin 23:05e9bb3b13af 438 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 439 }
mbedAustin 23:05e9bb3b13af 440 }
mbedAustin 23:05e9bb3b13af 441
mbedAustin 23:05e9bb3b13af 442
mbedAustin 23:05e9bb3b13af 443 void unlockAuthorizationCallback(GattWriteAuthCallbackParams *authParams) {
mbedAustin 34:5876fbb1aa62 444 if ((!params.lockedState) && (authParams->len == sizeof(Lock_t))) {
mbedAustin 23:05e9bb3b13af 445 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 446 } else if (authParams->len != sizeof(Lock_t)) {
mbedAustin 23:05e9bb3b13af 447 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
mbedAustin 23:05e9bb3b13af 448 } else if (authParams->offset != 0) {
mbedAustin 23:05e9bb3b13af 449 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbedAustin 23:05e9bb3b13af 450 } else if (memcmp(authParams->data, params.lock, sizeof(Lock_t)) != 0) {
mbedAustin 23:05e9bb3b13af 451 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INSUF_AUTHORIZATION;
mbedAustin 23:05e9bb3b13af 452 } else {
mbedAustin 23:05e9bb3b13af 453 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 454 }
mbedAustin 23:05e9bb3b13af 455 }
mbedAustin 23:05e9bb3b13af 456
mbedAustin 23:05e9bb3b13af 457 void uriDataWriteAuthorizationCallback(GattWriteAuthCallbackParams *authParams) {
mbedAustin 34:5876fbb1aa62 458 if (params.lockedState) {
mbedAustin 23:05e9bb3b13af 459 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INSUF_AUTHORIZATION;
mbedAustin 23:05e9bb3b13af 460 } else if (authParams->offset != 0) {
mbedAustin 23:05e9bb3b13af 461 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbedAustin 23:05e9bb3b13af 462 } else {
mbedAustin 23:05e9bb3b13af 463 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 464 }
mbedAustin 23:05e9bb3b13af 465 }
mbedAustin 23:05e9bb3b13af 466
mbedAustin 23:05e9bb3b13af 467 void powerModeAuthorizationCallback(GattWriteAuthCallbackParams *authParams) {
mbedAustin 34:5876fbb1aa62 468 if (params.lockedState) {
mbedAustin 23:05e9bb3b13af 469 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INSUF_AUTHORIZATION;
mbedAustin 23:05e9bb3b13af 470 } else if (authParams->len != sizeof(uint8_t)) {
mbedAustin 23:05e9bb3b13af 471 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
mbedAustin 23:05e9bb3b13af 472 } else if (authParams->offset != 0) {
mbedAustin 23:05e9bb3b13af 473 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbedAustin 23:05e9bb3b13af 474 } else if (*((uint8_t *)authParams->data) >= NUM_POWER_MODES) {
mbedAustin 23:05e9bb3b13af 475 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_WRITE_NOT_PERMITTED;
mbedAustin 23:05e9bb3b13af 476 } else {
mbedAustin 23:05e9bb3b13af 477 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 478 }
mbedAustin 23:05e9bb3b13af 479 }
mbedAustin 23:05e9bb3b13af 480
mbedAustin 23:05e9bb3b13af 481 template <typename T>
mbedAustin 23:05e9bb3b13af 482 void basicAuthorizationCallback(GattWriteAuthCallbackParams *authParams) {
mbedAustin 34:5876fbb1aa62 483 if (params.lockedState) {
mbedAustin 23:05e9bb3b13af 484 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INSUF_AUTHORIZATION;
mbedAustin 23:05e9bb3b13af 485 } else if (authParams->len != sizeof(T)) {
mbedAustin 23:05e9bb3b13af 486 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_ATT_VAL_LENGTH;
mbedAustin 23:05e9bb3b13af 487 } else if (authParams->offset != 0) {
mbedAustin 23:05e9bb3b13af 488 authParams->authorizationReply = AUTH_CALLBACK_REPLY_ATTERR_INVALID_OFFSET;
mbedAustin 23:05e9bb3b13af 489 } else {
mbedAustin 23:05e9bb3b13af 490 authParams->authorizationReply = AUTH_CALLBACK_REPLY_SUCCESS;
mbedAustin 23:05e9bb3b13af 491 }
mbedAustin 23:05e9bb3b13af 492 }
mbedAustin 23:05e9bb3b13af 493
mbedAustin 23:05e9bb3b13af 494 BLEDevice &ble;
mbedAustin 23:05e9bb3b13af 495 Params_t &params;
mbedAustin 23:05e9bb3b13af 496 Ticker timeSinceBootTick;
mbedAustin 23:05e9bb3b13af 497 Timeout switchFrame;
mbedAustin 23:05e9bb3b13af 498 // Default value that is restored on reset
mbedAustin 55:3818a9fa827d 499 PowerLevels_t &defaultAdvPowerLevels; // this goes into the advertising frames (radio power measured at 1m from device)
mbedAustin 55:3818a9fa827d 500 PowerLevels_t &radioPowerLevels; // this configures the power levels of the radio
mbedAustin 23:05e9bb3b13af 501 uint8_t lockedState;
mbedAustin 23:05e9bb3b13af 502 bool initSucceeded;
mbedAustin 23:05e9bb3b13af 503 uint8_t resetFlag;
mbedAustin 31:11e7a505a4be 504 bool switchFlag;
mbedAustin 23:05e9bb3b13af 505
mbedAustin 44:0e27ee7800b8 506 //UID Default value that is restored on reset
mbedAustin 44:0e27ee7800b8 507 UIDNamespaceID_t defaultUidNamespaceID;
mbedAustin 44:0e27ee7800b8 508 UIDInstanceID_t defaultUidInstanceID;
mbedAustin 44:0e27ee7800b8 509 uint32_t defaultUidAdvPeriod;
mbedAustin 44:0e27ee7800b8 510 int8_t defaultUidPower;
mbedAustin 44:0e27ee7800b8 511 uint16_t uidRFU;
mbedAustin 44:0e27ee7800b8 512 bool uidIsSet;
mbedAustin 44:0e27ee7800b8 513
mbedAustin 44:0e27ee7800b8 514 //URI Default value that is restored on reset
mbedAustin 44:0e27ee7800b8 515 uint8_t defaultUriDataLength;
mbedAustin 44:0e27ee7800b8 516 UriData_t defaultUriData;
mbedAustin 44:0e27ee7800b8 517 int8_t defaultUrlPower;
mbedAustin 44:0e27ee7800b8 518 uint32_t defaultUriAdvPeriod;
mbedAustin 44:0e27ee7800b8 519 bool urlIsSet;
mbedAustin 44:0e27ee7800b8 520
mbedAustin 44:0e27ee7800b8 521 //TLM Default value that is restored on reset
mbedAustin 44:0e27ee7800b8 522 uint8_t defaultTlmVersion;
mbedAustin 44:0e27ee7800b8 523 uint32_t defaultTlmAdvPeriod;
mbedAustin 44:0e27ee7800b8 524 volatile uint16_t TlmBatteryVoltage;
mbedAustin 44:0e27ee7800b8 525 volatile uint16_t TlmBeaconTemp;
mbedAustin 44:0e27ee7800b8 526 volatile uint32_t TlmPduCount;
mbedAustin 44:0e27ee7800b8 527 volatile uint32_t TlmTimeSinceBoot;
mbedAustin 44:0e27ee7800b8 528 bool tlmIsSet;
mbedAustin 23:05e9bb3b13af 529
mbedAustin 23:05e9bb3b13af 530 ReadOnlyGattCharacteristic<uint8_t> lockedStateChar;
mbedAustin 23:05e9bb3b13af 531 WriteOnlyGattCharacteristic<Lock_t> lockChar;
mbedAustin 23:05e9bb3b13af 532 GattCharacteristic uriDataChar;
mbedAustin 23:05e9bb3b13af 533 WriteOnlyGattCharacteristic<Lock_t> unlockChar;
mbedAustin 23:05e9bb3b13af 534 ReadWriteGattCharacteristic<uint8_t> flagsChar;
mbedAustin 23:05e9bb3b13af 535 ReadWriteGattCharacteristic<PowerLevels_t> advPowerLevelsChar;
mbedAustin 23:05e9bb3b13af 536 ReadWriteGattCharacteristic<uint8_t> txPowerModeChar;
mbedAustin 23:05e9bb3b13af 537 ReadWriteGattCharacteristic<uint16_t> beaconPeriodChar;
mbedAustin 23:05e9bb3b13af 538 WriteOnlyGattCharacteristic<uint8_t> resetChar;
mbedAustin 23:05e9bb3b13af 539
mbedAustin 23:05e9bb3b13af 540 };
mbedAustin 23:05e9bb3b13af 541
mbedAustin 33:8c65879e7d52 542 #endif // SERVICES_EDDYSTONEBEACONCONFIGSERVICE_H_