ST / Mbed OS mbed-os-example-ble-EddystoneService

This example is a fork of the following mbed-os example:

https://developer.mbed.org/teams/mbed-os-examples/code/mbed-os-example-ble-EddystoneService/

Please read the documentation in this page.

Committer:
Vincent Coubard
Date:
Thu Jul 28 23:27:37 2016 +0100
Revision:
2:9ee673e0b86a
Parent:
1:9db4d46bb63f
Child:
3:5120491ba317
Sync with mbed-os-5.1.0-rc3

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Vincent Coubard 2:9ee673e0b86a 1 /* mbed Microcontroller Library
Vincent Coubard 2:9ee673e0b86a 2 * Copyright (c) 2006-2015 ARM Limited
Vincent Coubard 2:9ee673e0b86a 3 *
Vincent Coubard 2:9ee673e0b86a 4 * Licensed under the Apache License, Version 2.0 (the "License");
Vincent Coubard 2:9ee673e0b86a 5 * you may not use this file except in compliance with the License.
Vincent Coubard 2:9ee673e0b86a 6 * You may obtain a copy of the License at
Vincent Coubard 2:9ee673e0b86a 7 *
Vincent Coubard 2:9ee673e0b86a 8 * http://www.apache.org/licenses/LICENSE-2.0
Vincent Coubard 2:9ee673e0b86a 9 *
Vincent Coubard 2:9ee673e0b86a 10 * Unless required by applicable law or agreed to in writing, software
Vincent Coubard 2:9ee673e0b86a 11 * distributed under the License is distributed on an "AS IS" BASIS,
Vincent Coubard 2:9ee673e0b86a 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Vincent Coubard 2:9ee673e0b86a 13 * See the License for the specific language governing permissions and
Vincent Coubard 2:9ee673e0b86a 14 * limitations under the License.
Vincent Coubard 2:9ee673e0b86a 15 */
Vincent Coubard 2:9ee673e0b86a 16
Vincent Coubard 2:9ee673e0b86a 17 #ifdef TARGET_NRF51822 /* Persistent storage supported on nrf51 platforms */
Vincent Coubard 2:9ee673e0b86a 18
Vincent Coubard 2:9ee673e0b86a 19 extern "C" {
Vincent Coubard 2:9ee673e0b86a 20 #include "pstorage.h"
Vincent Coubard 2:9ee673e0b86a 21 }
Vincent Coubard 2:9ee673e0b86a 22
Vincent Coubard 2:9ee673e0b86a 23 #include "nrf_error.h"
Vincent Coubard 2:9ee673e0b86a 24 #include "../../EddystoneService.h"
Vincent Coubard 2:9ee673e0b86a 25
Vincent Coubard 2:9ee673e0b86a 26 /**
Vincent Coubard 2:9ee673e0b86a 27 * Nordic specific structure used to store params persistently.
Vincent Coubard 2:9ee673e0b86a 28 * It extends EddystoneService::EddystoneParams_t with a persistence signature.
Vincent Coubard 2:9ee673e0b86a 29 */
Vincent Coubard 2:9ee673e0b86a 30 struct PersistentParams_t {
Vincent Coubard 2:9ee673e0b86a 31 EddystoneService::EddystoneParams_t params;
Vincent Coubard 2:9ee673e0b86a 32 uint32_t persistenceSignature; /* This isn't really a parameter, but having the expected
Vincent Coubard 2:9ee673e0b86a 33 * magic value in this field indicates persistence. */
Vincent Coubard 2:9ee673e0b86a 34
Vincent Coubard 2:9ee673e0b86a 35 static const uint32_t MAGIC = 0x1BEAC000; /* Magic that identifies persistence */
Vincent Coubard 2:9ee673e0b86a 36 };
Vincent Coubard 2:9ee673e0b86a 37
Vincent Coubard 2:9ee673e0b86a 38 /**
Vincent Coubard 2:9ee673e0b86a 39 * The following is a module-local variable to hold configuration parameters for
Vincent Coubard 2:9ee673e0b86a 40 * short periods during flash access. This is necessary because the pstorage
Vincent Coubard 2:9ee673e0b86a 41 * APIs don't copy in the memory provided as data source. The memory cannot be
Vincent Coubard 2:9ee673e0b86a 42 * freed or reused by the application until this flash access is complete. The
Vincent Coubard 2:9ee673e0b86a 43 * load and store operations in this module initialize persistentParams and then
Vincent Coubard 2:9ee673e0b86a 44 * pass it on to the 'pstorage' APIs.
Vincent Coubard 2:9ee673e0b86a 45 */
Vincent Coubard 2:9ee673e0b86a 46 static PersistentParams_t persistentParams;
Vincent Coubard 2:9ee673e0b86a 47
Vincent Coubard 2:9ee673e0b86a 48 static pstorage_handle_t pstorageHandle;
Vincent Coubard 2:9ee673e0b86a 49
Vincent Coubard 2:9ee673e0b86a 50 /**
Vincent Coubard 2:9ee673e0b86a 51 * Dummy callback handler needed by Nordic's pstorage module. This is called
Vincent Coubard 2:9ee673e0b86a 52 * after every flash access.
Vincent Coubard 2:9ee673e0b86a 53 */
Vincent Coubard 2:9ee673e0b86a 54 static void pstorageNotificationCallback(pstorage_handle_t *p_handle,
Vincent Coubard 2:9ee673e0b86a 55 uint8_t op_code,
Vincent Coubard 2:9ee673e0b86a 56 uint32_t result,
Vincent Coubard 2:9ee673e0b86a 57 uint8_t *p_data,
Vincent Coubard 2:9ee673e0b86a 58 uint32_t data_len)
Vincent Coubard 2:9ee673e0b86a 59 {
Vincent Coubard 2:9ee673e0b86a 60 /* Supress compiler warnings */
Vincent Coubard 2:9ee673e0b86a 61 (void) p_handle;
Vincent Coubard 2:9ee673e0b86a 62 (void) op_code;
Vincent Coubard 2:9ee673e0b86a 63 (void) result;
Vincent Coubard 2:9ee673e0b86a 64 (void) p_data;
Vincent Coubard 2:9ee673e0b86a 65 (void) data_len;
Vincent Coubard 2:9ee673e0b86a 66
Vincent Coubard 2:9ee673e0b86a 67 /* APP_ERROR_CHECK(result); */
Vincent Coubard 2:9ee673e0b86a 68 }
Vincent Coubard 2:9ee673e0b86a 69
Vincent Coubard 2:9ee673e0b86a 70 /* Platform-specific implementation for persistence on the nRF5x. Based on the
Vincent Coubard 2:9ee673e0b86a 71 * pstorage module provided by the Nordic SDK. */
Vincent Coubard 2:9ee673e0b86a 72 bool loadEddystoneServiceConfigParams(EddystoneService::EddystoneParams_t *paramsP)
Vincent Coubard 2:9ee673e0b86a 73 {
Vincent Coubard 2:9ee673e0b86a 74 static bool pstorageInitied = false;
Vincent Coubard 2:9ee673e0b86a 75 if (!pstorageInitied) {
Vincent Coubard 2:9ee673e0b86a 76 pstorage_init();
Vincent Coubard 2:9ee673e0b86a 77
Vincent Coubard 2:9ee673e0b86a 78 static pstorage_module_param_t pstorageParams = {
Vincent Coubard 2:9ee673e0b86a 79 .cb = pstorageNotificationCallback,
Vincent Coubard 2:9ee673e0b86a 80 .block_size = sizeof(PersistentParams_t),
Vincent Coubard 2:9ee673e0b86a 81 .block_count = 1
Vincent Coubard 2:9ee673e0b86a 82 };
Vincent Coubard 2:9ee673e0b86a 83 pstorage_register(&pstorageParams, &pstorageHandle);
Vincent Coubard 2:9ee673e0b86a 84 pstorageInitied = true;
Vincent Coubard 2:9ee673e0b86a 85 }
Vincent Coubard 2:9ee673e0b86a 86
Vincent Coubard 2:9ee673e0b86a 87 if ((pstorage_load(reinterpret_cast<uint8_t *>(&persistentParams), &pstorageHandle, sizeof(PersistentParams_t), 0) != NRF_SUCCESS) ||
Vincent Coubard 2:9ee673e0b86a 88 (persistentParams.persistenceSignature != PersistentParams_t::MAGIC)) {
Vincent Coubard 2:9ee673e0b86a 89 // On failure zero out and let the service reset to defaults
Vincent Coubard 2:9ee673e0b86a 90 memset(paramsP, 0, sizeof(EddystoneService::EddystoneParams_t));
Vincent Coubard 2:9ee673e0b86a 91 return false;
Vincent Coubard 2:9ee673e0b86a 92 }
Vincent Coubard 2:9ee673e0b86a 93
Vincent Coubard 2:9ee673e0b86a 94 memcpy(paramsP, &persistentParams.params, sizeof(EddystoneService::EddystoneParams_t));
Vincent Coubard 2:9ee673e0b86a 95 return true;
Vincent Coubard 2:9ee673e0b86a 96 }
Vincent Coubard 2:9ee673e0b86a 97
Vincent Coubard 2:9ee673e0b86a 98 /* Platform-specific implementation for persistence on the nRF5x. Based on the
Vincent Coubard 2:9ee673e0b86a 99 * pstorage module provided by the Nordic SDK. */
Vincent Coubard 2:9ee673e0b86a 100 void saveEddystoneServiceConfigParams(const EddystoneService::EddystoneParams_t *paramsP)
Vincent Coubard 2:9ee673e0b86a 101 {
Vincent Coubard 2:9ee673e0b86a 102 memcpy(&persistentParams.params, paramsP, sizeof(EddystoneService::EddystoneParams_t));
Vincent Coubard 2:9ee673e0b86a 103 if (persistentParams.persistenceSignature != PersistentParams_t::MAGIC) {
Vincent Coubard 2:9ee673e0b86a 104 persistentParams.persistenceSignature = PersistentParams_t::MAGIC;
Vincent Coubard 2:9ee673e0b86a 105 pstorage_store(&pstorageHandle,
Vincent Coubard 2:9ee673e0b86a 106 reinterpret_cast<uint8_t *>(&persistentParams),
Vincent Coubard 2:9ee673e0b86a 107 sizeof(PersistentParams_t),
Vincent Coubard 2:9ee673e0b86a 108 0 /* offset */);
Vincent Coubard 2:9ee673e0b86a 109 } else {
Vincent Coubard 2:9ee673e0b86a 110 pstorage_update(&pstorageHandle,
Vincent Coubard 2:9ee673e0b86a 111 reinterpret_cast<uint8_t *>(&persistentParams),
Vincent Coubard 2:9ee673e0b86a 112 sizeof(PersistentParams_t),
Vincent Coubard 2:9ee673e0b86a 113 0 /* offset */);
Vincent Coubard 2:9ee673e0b86a 114 }
Vincent Coubard 2:9ee673e0b86a 115 }
Vincent Coubard 2:9ee673e0b86a 116
Vincent Coubard 2:9ee673e0b86a 117 #endif /* #ifdef TARGET_NRF51822 */