Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Copyright (c) 2013 Nordic Semiconductor. All Rights Reserved.
- *
- * The information contained herein is property of Nordic Semiconductor ASA.
- * Terms and conditions of usage are described in detail in NORDIC
- * SEMICONDUCTOR STANDARD SOFTWARE LICENSE AGREEMENT.
- *
- * Licensees are granted free, non-transferable use of the information. NO
- * WARRANTY of ANY KIND is provided. This heading must NOT be removed from
- * the file.
- *
- */
- /** @file
- *
- * @defgroup ble_sdk_app_beacon_main main.c
- * @{
- * @ingroup ble_sdk_app_beacon
- * @brief Beacon Transmitter Sample Application main file.
- *
- * This file contains the source code for an Beacon transmitter sample application.
- */
- #include <stdbool.h>
- #include <stdint.h>
- #include "nrf_delay.h"
- #include "ble_advdata.h"
- #include "boards.h"
- #include "nordic_common.h"
- #include "softdevice_handler.h"
- #define IS_SRVC_CHANGED_CHARACT_PRESENT 0 /**< Include or not the service_changed characteristic. if not enabled, the server's database cannot be changed for the lifetime of the device*/
- #define ADVERTISING_LED_PIN_NO LED_0 /**< Is on when device is advertising. */
- #define APP_CFG_NON_CONN_ADV_TIMEOUT 0 /**< Time for which the device must be advertising in non-connectable mode (in seconds). 0 disables timeout. */
- #define NON_CONNECTABLE_ADV_INTERVAL MSEC_TO_UNITS(100, UNIT_0_625_MS) /**< The advertising interval for non-connectable advertisement (100 ms). This value can vary between 100ms to 10.24s). */
- #define APP_BEACON_INFO_LENGTH 0x17 /**< Total length of information advertised by the Beacon. */
- #define APP_ADV_DATA_LENGTH 0x15 /**< Length of manufacturer specific data in the advertisement. */
- #define APP_DEVICE_TYPE 0x02 /**< 0x02 refers to Beacon. */
- #define APP_MEASURED_RSSI 0xC3 /**< The Beacon's measured RSSI at 1 meter distance in dBm. */
- #define APP_COMPANY_IDENTIFIER 0x004C /**< Company identifier for Apple Inc. as per www.bluetooth.org. */
- #define APP_MAJOR_VALUE 0x01, 0x02 /**< Major value used to identify Beacons. */
- #define APP_MINOR_VALUE 0x03, 0x04 /**< Minor value used to identify Beacons. */
- #define APP_BEACON_UUID 0x01, 0x12, 0x23, 0x34, \
- 0x45, 0x56, 0x67, 0x78, \
- 0x89, 0x9a, 0xab, 0xbc, \
- 0xcd, 0xde, 0xef, 0xf0 /**< Proprietary UUID for Beacon. */
- #define DEAD_BEEF 0xDEADBEEF /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
- #if defined(USE_UICR_FOR_MAJ_MIN_VALUES)
- #define MAJ_VAL_OFFSET_IN_BEACON_INFO 18 /**< Position of the MSB of the Major Value in m_beacon_info array. */
- #define UICR_ADDRESS 0x10001080 /**< Address of the UICR register used by this example. The major and minor versions to be encoded into the advertising data will be picked up from this location. */
- #endif
- static ble_gap_adv_params_t m_adv_params; /**< Parameters to be passed to the stack when starting advertising. */
- static uint8_t m_beacon_info[APP_BEACON_INFO_LENGTH] = /**< Information advertised by the Beacon. */
- {
- APP_DEVICE_TYPE, // Manufacturer specific information. Specifies the device type in this
- // implementation.
- APP_ADV_DATA_LENGTH, // Manufacturer specific information. Specifies the length of the
- // manufacturer specific data in this implementation.
- APP_BEACON_UUID, // 128 bit UUID value.
- APP_MAJOR_VALUE, // Major arbitrary value that can be used to distinguish between Beacons.
- APP_MINOR_VALUE, // Minor arbitrary value that can be used to distinguish between Beacons.
- APP_MEASURED_RSSI // Manufacturer specific information. The Beacon's measured TX power in
- // this implementation.
- };
- /**@brief Function for error handling, which is called when an error has occurred.
- *
- * @warning This handler is an example only and does not fit a final product. You need to analyze
- * how your product is supposed to react in case of error.
- *
- * @param[in] error_code Error code supplied to the handler.
- * @param[in] line_num Line number where the handler is called.
- * @param[in] p_file_name Pointer to the file name.
- */
- void app_error_handler(uint32_t error_code, uint32_t line_num, const uint8_t * p_file_name)
- {
- // This call can be used for debug purposes during application development.
- // @note CAUTION: Activating this code will write the stack to flash on an error.
- // This function should NOT be used in a final product.
- // It is intended STRICTLY for development/debugging purposes.
- // The flash write will happen EVEN if the radio is active, thus interrupting
- // any communication.
- // Use with care. Un-comment the line below to use.
- // ble_debug_assert_handler(error_code, line_num, p_file_name);
- // On assert, the system can only recover on reset.
- NVIC_SystemReset();
- }
- /**@brief Callback function for asserts in the SoftDevice.
- *
- * @details This function will be called in case of an assert in the SoftDevice.
- *
- * @warning This handler is an example only and does not fit a final product. You need to analyze
- * how your product is supposed to react in case of Assert.
- * @warning On assert from the SoftDevice, the system can only recover on reset.
- *
- * @param[in] line_num Line number of the failing ASSERT call.
- * @param[in] file_name File name of the failing ASSERT call.
- */
- void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
- {
- app_error_handler(DEAD_BEEF, line_num, p_file_name);
- }
- /**@brief Function for the LEDs initialization.
- *
- * @details Initializes all LEDs used by this application.
- */
- static void leds_init(void)
- {
- nrf_gpio_cfg_output(LED_0);
- nrf_gpio_cfg_output(LED_1);
- nrf_gpio_cfg_output(LED_2);
- nrf_gpio_cfg_output(LED_3);
- }
- /**@brief Function for initializing the Advertising functionality.
- *
- * @details Encodes the required advertising data and passes it to the stack.
- * Also builds a structure to be passed to the stack when starting advertising.
- */
- static void advertising_init(void)
- {
- uint32_t err_code;
- ble_advdata_t advdata;
- uint8_t flags = BLE_GAP_ADV_FLAG_BR_EDR_NOT_SUPPORTED;
- ble_advdata_manuf_data_t manuf_specific_data;
- manuf_specific_data.company_identifier = APP_COMPANY_IDENTIFIER;
- #if defined(USE_UICR_FOR_MAJ_MIN_VALUES)
- // If USE_UICR_FOR_MAJ_MIN_VALUES is defined, the major and minor values will be read from the
- // UICR instead of using the default values. The major and minor values obtained from the UICR
- // are encoded into advertising data in big endian order (MSB First).
- // To set the UICR used by this example to a desired value, write to the address 0x10001080
- // using the nrfjprog tool. The command to be used is as follows.
- // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val <your major/minor value>
- // For example, for a major value and minor value of 0xabcd and 0x0102 respectively, the
- // the following command should be used.
- // nrfjprog --snr <Segger-chip-Serial-Number> --memwr 0x10001080 --val 0xabcd0102
- uint16_t major_value = ((*(uint32_t *)UICR_ADDRESS) & 0xFFFF0000) >> 16;
- uint16_t minor_value = ((*(uint32_t *)UICR_ADDRESS) & 0x0000FFFF);
- uint8_t index = MAJ_VAL_OFFSET_IN_BEACON_INFO;
- m_beacon_info[index++] = MSB(major_value);
- m_beacon_info[index++] = LSB(major_value);
- m_beacon_info[index++] = MSB(minor_value);
- m_beacon_info[index++] = LSB(minor_value);
- #endif
- manuf_specific_data.data.p_data = (uint8_t *) m_beacon_info;
- manuf_specific_data.data.size = APP_BEACON_INFO_LENGTH;
- // Build and set advertising data.
- memset(&advdata, 0, sizeof(advdata));
- advdata.name_type = BLE_ADVDATA_NO_NAME;
- advdata.flags.size = sizeof(flags);
- advdata.flags.p_data = &flags;
- advdata.p_manuf_specific_data = &manuf_specific_data;
- err_code = ble_advdata_set(&advdata, NULL);
- APP_ERROR_CHECK(err_code);
- // Initialize advertising parameters (used when starting advertising).
- memset(&m_adv_params, 0, sizeof(m_adv_params));
- m_adv_params.type = BLE_GAP_ADV_TYPE_ADV_NONCONN_IND;
- m_adv_params.p_peer_addr = NULL; // Undirected advertisement.
- m_adv_params.fp = BLE_GAP_ADV_FP_ANY;
- m_adv_params.interval = NON_CONNECTABLE_ADV_INTERVAL;
- m_adv_params.timeout = APP_CFG_NON_CONN_ADV_TIMEOUT;
- }
- /**@brief Function for starting advertising.
- */
- static void advertising_start(void)
- {
- uint32_t err_code;
- err_code = sd_ble_gap_adv_start(&m_adv_params);
- APP_ERROR_CHECK(err_code);
- nrf_gpio_pin_set(ADVERTISING_LED_PIN_NO);
- }
- /**@brief Function for initializing the BLE stack.
- *
- * @details Initializes the SoftDevice and the BLE event interrupt.
- */
- static void ble_stack_init(void)
- {
- uint32_t err_code;
- // Initialize the SoftDevice handler module.
- SOFTDEVICE_HANDLER_INIT(NRF_CLOCK_LFCLKSRC_SYNTH_250_PPM, false);
- // Enable BLE stack
- ble_enable_params_t ble_enable_params;
- memset(&ble_enable_params, 0, sizeof(ble_enable_params));
- ble_enable_params.gatts_enable_params.service_changed = IS_SRVC_CHANGED_CHARACT_PRESENT;
- err_code = sd_ble_enable(&ble_enable_params);
- APP_ERROR_CHECK(err_code);
- }
- /**@brief Function for doing power management.
- */
- static void power_manage(void)
- {
- uint32_t err_code = sd_app_evt_wait();
- APP_ERROR_CHECK(err_code);
- }
- int main(void)
- {
- nrf_delay_ms(500);
- // Initialize.
- leds_init();
- nrf_gpio_pin_set(LED_3);
- nrf_delay_ms(500);
- nrf_gpio_pin_clear(LED_3);
- nrf_gpio_pin_set(LED_2);
- ble_stack_init();
- nrf_delay_ms(500);
- nrf_gpio_pin_clear(LED_2);
- nrf_gpio_pin_set(LED_1);
- advertising_init();
- nrf_delay_ms(500);
- nrf_gpio_pin_clear(LED_1);
- // Start execution.
- advertising_start();
- nrf_delay_ms(500);
- nrf_gpio_pin_set(LED_3);
- nrf_delay_ms(500);
- uint32_t flag = 1;
- // Enter main loop.
- for (;;)
- {
- power_manage();
- if(flag)
- { flag =0; nrf_gpio_pin_clear(LED_3);}
- else
- { flag = 1; nrf_gpio_pin_set(LED_3); }
- nrf_delay_ms(100);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment