hi,
I'm trying to merge the the proxy server and beaconing example together. When I compare two main.c and copy the advertising part from beaconing to proxy server example and comment the gap_conn part, I encounter the following error:
build/light_switch_proxy_server_nrf52832_xxAA_s132_6.0.0_Debug/obj/nrf_sdh.o: In function `SWI2_EGU2_IRQHandler':
multiple definition of `SWI2_EGU2_IRQHandler'
Could anyone help? The SDK version is v2.2.0
Below is the code of main.c:
/* Copyright (c) 2010 - 2018, Nordic Semiconductor ASA * All rights reserved. * * Redistribution and use in source and binary forms, with or without modification, * are permitted provided that the following conditions are met: * * 1. Redistributions of source code must retain the above copyright notice, this * list of conditions and the following disclaimer. * * 2. Redistributions in binary form, except as embedded into a Nordic * Semiconductor ASA integrated circuit in a product or a software update for * such product, must reproduce the above copyright notice, this list of * conditions and the following disclaimer in the documentation and/or other * materials provided with the distribution. * * 3. Neither the name of Nordic Semiconductor ASA nor the names of its * contributors may be used to endorse or promote products derived from this * software without specific prior written permission. * * 4. This software, with or without modification, must only be used with a * Nordic Semiconductor ASA integrated circuit. * * 5. Any software provided in binary form under this license must not be reverse * engineered, decompiled, modified and/or disassembled. * * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include <stdint.h> #include <string.h> /* HAL */ #include <stdio.h> #include "nrf_delay.h" #include "nrf_gpio.h" #include "ble.h" #include "boards.h" #include "simple_hal.h" #include "app_timer.h" /* Core */ #include "sdk_config.h" #include "nrf_mesh_configure.h" #include "nrf_mesh.h" #include "mesh_stack.h" #include "device_state_manager.h" #include "access_config.h" #include "net_state.h" #include "mesh_adv.h" #include "nrf_sdh.h" #include "nrf_sdh_ble.h" #include "nrf_sdh_soc.h" #include "ble_conn_params.h" #include "ble_hci.h" #include "proxy.h" #include "mesh_opt_gatt.h" #include "mesh_config.h" /* Provisioning and configuration */ #include "mesh_provisionee.h" #include "advertiser.h" #include "mesh_app_utils.h" #include "mesh_softdevice_init.h" /* Models */ #include "generic_onoff_server.h" /* Logging and RTT */ #include "log.h" #include "rtt_input.h" /* Example specific includes */ #include "app_config.h" #include "example_common.h" #include "nrf_mesh_config_examples.h" #include "light_switch_example_common.h" #include "app_onoff.h" #define ONOFF_SERVER_0_LED (BSP_LED_0) #define DEVICE_NAME "nRF5x Mesh Light" #define MIN_CONN_INTERVAL MSEC_TO_UNITS(150, UNIT_1_25_MS) /**< Minimum acceptable connection interval. */ #define MAX_CONN_INTERVAL MSEC_TO_UNITS(250, UNIT_1_25_MS) /**< Maximum acceptable connection interval. */ #define SLAVE_LATENCY 0 /**< Slave latency. */ #define CONN_SUP_TIMEOUT MSEC_TO_UNITS(4000, UNIT_10_MS) /**< Connection supervisory timeout (4 seconds). */ #define FIRST_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(100) /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called. */ #define NEXT_CONN_PARAMS_UPDATE_DELAY APP_TIMER_TICKS(2000) /**< Time between each call to sd_ble_gap_conn_param_update after the first call. */ #define MAX_CONN_PARAMS_UPDATE_COUNT 3 /**< Number of attempts before giving up the connection parameter negotiation. */ //for beaconing #if defined(NRF51) && defined(NRF_MESH_STACK_DEPTH) #include "stack_depth.h" #endif #define ADVERTISER_BUFFER_SIZE (64) #define LED_BLINK_INTERVAL_MS (200) #define LED_BLINK_CNT_START (2) #define LED_BLINK_CNT_RESET (3) #define LED_BLINK_CNT_PROV (4) /** Single advertiser instance. May periodically transmit one packet at a time. */ static advertiser_t m_advertiser; static uint8_t m_adv_buffer[ADVERTISER_BUFFER_SIZE]; static bool m_device_provisioned; static bool m_device_provisioned; //static void gap_params_init(void); //static void conn_params_init(void); /*************************************************************************************************/ static void app_onoff_server_set_cb(const app_onoff_server_t * p_server, bool onoff); static void app_onoff_server_get_cb(const app_onoff_server_t * p_server, bool * p_present_onoff); /* Generic OnOff server structure definition and initialization */ APP_ONOFF_SERVER_DEF(m_onoff_server_0, APP_CONFIG_FORCE_SEGMENTATION, APP_CONFIG_MIC_SIZE, app_onoff_server_set_cb, app_onoff_server_get_cb) /* Callback for updating the hardware state */ static void app_onoff_server_set_cb(const app_onoff_server_t * p_server, bool onoff) { /* Resolve the server instance here if required, this example uses only 1 instance. */ __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Setting GPIO value: %d\n", onoff) hal_led_pin_set(ONOFF_SERVER_0_LED, onoff); } /* Callback for reading the hardware state */ static void app_onoff_server_get_cb(const app_onoff_server_t * p_server, bool * p_present_onoff) { /* Resolve the server instance here if required, this example uses only 1 instance. */ *p_present_onoff = hal_led_pin_get(ONOFF_SERVER_0_LED); } static void app_model_init(void) { /* Instantiate onoff server on element index 0 */ ERROR_CHECK(app_onoff_init(&m_onoff_server_0, 0)); } /*************************************advertising*************************************/ static void rx_cb(const nrf_mesh_adv_packet_rx_data_t * p_rx_data) { LEDS_OFF(BSP_LED_0_MASK); /* @c LED_RGB_RED_MASK on pca10031 */ char msg[64]; (void) sprintf(msg, "RX [@%u]: RSSI: %3d ADV TYPE: %x ADDR: [%02x:%02x:%02x:%02x:%02x:%02x]", p_rx_data->p_metadata->params.scanner.timestamp, p_rx_data->p_metadata->params.scanner.rssi, p_rx_data->adv_type, p_rx_data->p_metadata->params.scanner.adv_addr.addr[0], p_rx_data->p_metadata->params.scanner.adv_addr.addr[1], p_rx_data->p_metadata->params.scanner.adv_addr.addr[2], p_rx_data->p_metadata->params.scanner.adv_addr.addr[3], p_rx_data->p_metadata->params.scanner.adv_addr.addr[4], p_rx_data->p_metadata->params.scanner.adv_addr.addr[5]); __LOG_XB(LOG_SRC_APP, LOG_LEVEL_INFO, msg, p_rx_data->p_payload, p_rx_data->length); LEDS_ON(BSP_LED_0_MASK); /* @c LED_RGB_RED_MASK on pca10031 */ } static void adv_init(void) { advertiser_instance_init(&m_advertiser, NULL, m_adv_buffer, ADVERTISER_BUFFER_SIZE); } static void adv_start(void) { advertiser_enable(&m_advertiser); static const uint8_t adv_data[] = { 0x11, /* AD data length (including type, but not itself) */ 0x09, /* AD data type (Complete local name) */ 'N', /* AD data payload (Name of device) */ 'o', 'r', 'd', 'i', 'c', ' ', 'T', 'e', 's', 't', ' ', 'M', 'e', 's', 'h' }; /* Allocate packet */ adv_packet_t * p_packet = advertiser_packet_alloc(&m_advertiser, sizeof(adv_data)); if (p_packet) { /* Construct packet contents */ memcpy(p_packet->packet.payload, adv_data, sizeof(adv_data)); /* Repeat forever */ p_packet->config.repeats = ADVERTISER_REPEAT_INFINITE; advertiser_packet_send(&m_advertiser, p_packet); } } /*************************************************************************************************/ //static void on_sd_evt(uint32_t sd_evt, void * p_context) //{ // (void) nrf_mesh_on_sd_evt(sd_evt); // //} //NRF_SDH_SOC_OBSERVER(mesh_observer, NRF_SDH_BLE_STACK_OBSERVER_PRIO, on_sd_evt, NULL); static void node_reset(void) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "----- Node reset -----\n"); hal_led_blink_ms(LEDS_MASK, LED_BLINK_INTERVAL_MS, LED_BLINK_CNT_RESET); /* This function may return if there are ongoing flash operations. */ mesh_stack_device_reset(); } static void config_server_evt_cb(const config_server_evt_t * p_evt) { if (p_evt->type == CONFIG_SERVER_EVT_NODE_RESET) { node_reset(); } } static void button_event_handler(uint32_t button_number) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Button %u pressed\n", button_number); switch (button_number) { /* Pressing SW1 on the Development Kit will result in LED state to toggle and trigger the STATUS message to inform client about the state change. This is a demonstration of state change publication due to local event. */ case 0: { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "User action \n"); hal_led_pin_set(ONOFF_SERVER_0_LED, !hal_led_pin_get(ONOFF_SERVER_0_LED)); app_onoff_status_publish(&m_onoff_server_0); break; } /* Initiate node reset */ case 3: { /* Clear all the states to reset the node. */ if (mesh_stack_is_device_provisioned()) { (void) proxy_stop(); mesh_stack_config_clear(); node_reset(); } else { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "The device is unprovisioned. Resetting has no effect.\n"); } break; } default: break; } } static void app_rtt_input_handler(int key) { if (key >= '0' && key <= '4') { uint32_t button_number = key - '0'; button_event_handler(button_number); } } //static void on_conn_params_evt(ble_conn_params_evt_t * p_evt) //{ // uint32_t err_code; // // if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED) // { // err_code = sd_ble_gap_disconnect(p_evt->conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE); // APP_ERROR_CHECK(err_code); // } // else if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_SUCCEEDED) // { // __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Successfully updated connection parameters\n"); // } //} //static void conn_params_error_handler(uint32_t nrf_error) //{ // APP_ERROR_HANDLER(nrf_error); //} static void provisioning_complete_cb(void) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Successfully provisioned\n"); /* Restores the application parameters after switching from the Provisioning service to the Proxy */ // gap_params_init(); // conn_params_init(); dsm_local_unicast_address_t node_address; dsm_local_unicast_addresses_get(&node_address); __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Node Address: 0x%04x \n", node_address.address_start); hal_led_mask_set(LEDS_MASK, false); hal_led_blink_ms(LEDS_MASK, LED_BLINK_INTERVAL_MS, LED_BLINK_CNT_PROV); } static void models_init_cb(void) { __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Initializing and adding models\n"); app_model_init(); } static void mesh_init(void) { uint8_t dev_uuid[NRF_MESH_UUID_SIZE]; uint8_t node_uuid_prefix[NODE_UUID_PREFIX_LEN] = SERVER_NODE_UUID_PREFIX; ERROR_CHECK(mesh_app_uuid_gen(dev_uuid, node_uuid_prefix, NODE_UUID_PREFIX_LEN)); mesh_stack_init_params_t init_params = { .core.irq_priority = NRF_MESH_IRQ_PRIORITY_LOWEST, .core.lfclksrc = DEV_BOARD_LF_CLK_CFG, .core.p_uuid = dev_uuid, .models.models_init_cb = models_init_cb, .models.config_server_cb = config_server_evt_cb }; ERROR_CHECK(mesh_stack_init(&init_params, &m_device_provisioned)); /* Start listening for incoming packets */ nrf_mesh_rx_cb_set(rx_cb); /* Start Advertising own beacon */ adv_init(); } //static void gap_params_init(void) //{ // uint32_t err_code; // ble_gap_conn_sec_mode_t sec_mode; // // BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode); // // err_code = sd_ble_gap_device_name_set(&sec_mode, // (const uint8_t *) DEVICE_NAME, // strlen(DEVICE_NAME)); // APP_ERROR_CHECK(err_code); //} // //static void conn_params_init(void) //{ // uint32_t err_code; // ble_conn_params_init_t cp_init; // ble_gap_conn_params_t gap_conn_params; // // memset(&gap_conn_params, 0, sizeof(gap_conn_params)); // gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL; // gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL; // gap_conn_params.slave_latency = SLAVE_LATENCY; // gap_conn_params.conn_sup_timeout = CONN_SUP_TIMEOUT; // // err_code = sd_ble_gap_ppcp_set(&gap_conn_params); // APP_ERROR_CHECK(err_code); // // memset(&cp_init, 0, sizeof(cp_init)); // cp_init.p_conn_params = &gap_conn_params; // cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY; // cp_init.next_conn_params_update_delay = NEXT_CONN_PARAMS_UPDATE_DELAY; // cp_init.max_conn_params_update_count = MAX_CONN_PARAMS_UPDATE_COUNT; // cp_init.start_on_notify_cccd_handle = BLE_GATT_HANDLE_INVALID; // cp_init.disconnect_on_fail = false; // cp_init.evt_handler = on_conn_params_evt; // cp_init.error_handler = conn_params_error_handler; // // // // err_code = ble_conn_params_init(&cp_init); // APP_ERROR_CHECK(err_code); // // //} static void initialize(void) { __LOG_INIT(LOG_SRC_APP | LOG_SRC_ACCESS | LOG_SRC_BEARER, LOG_LEVEL_INFO, LOG_CALLBACK_DEFAULT); __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "----- BLE Mesh Light Switch Proxy Server Beacon -----\n"); #if defined(NRF51) && defined(NRF_MESH_STACK_DEPTH) stack_depth_paint_stack(); #endif ERROR_CHECK(app_timer_init()); hal_leds_init(); #if BUTTON_BOARD ERROR_CHECK(hal_buttons_init(button_event_handler)); #endif uint32_t err_code = nrf_sdh_enable_request(); APP_ERROR_CHECK(err_code); #if defined S140 // todo remove that after S140 priority fixing softdevice_irq_priority_checker(); #endif uint32_t ram_start = 0; /* Set the default configuration (as defined through sdk_config.h). */ err_code = nrf_sdh_ble_default_cfg_set(MESH_SOFTDEVICE_CONN_CFG_TAG, &ram_start); APP_ERROR_CHECK(err_code); err_code = nrf_sdh_ble_enable(&ram_start); APP_ERROR_CHECK(err_code); // gap_params_init(); // conn_params_init(); // nrf_clock_lf_cfg_t lfc_cfg = DEV_BOARD_LF_CLK_CFG; // ERROR_CHECK(mesh_softdevice_init(lfc_cfg)); mesh_init(); __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Initialization complete!\n"); } static void start(void) { rtt_input_enable(app_rtt_input_handler, RTT_INPUT_POLL_PERIOD_MS); ERROR_CHECK(mesh_stack_start()); if (!m_device_provisioned) { static const uint8_t static_auth_data[NRF_MESH_KEY_SIZE] = STATIC_AUTH_DATA; mesh_provisionee_start_params_t prov_start_params = { .p_static_data = static_auth_data, .prov_complete_cb = provisioning_complete_cb, .p_device_uri = NULL }; ERROR_CHECK(mesh_provisionee_prov_start(&prov_start_params)); } adv_start(); const uint8_t *p_uuid = nrf_mesh_configure_device_uuid_get(); __LOG_XB(LOG_SRC_APP, LOG_LEVEL_INFO, "Device UUID ", p_uuid, NRF_MESH_UUID_SIZE); // __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Bluetooth Mesh Beacon example started!\n"); hal_led_mask_set(LEDS_MASK, LED_MASK_STATE_OFF); hal_led_blink_ms(LEDS_MASK, LED_BLINK_INTERVAL_MS, LED_BLINK_CNT_START); } int main(void) { initialize(); execution_start(start); for (;;) { (void)sd_app_evt_wait(); } }