/********************************** (C) COPYRIGHT ******************************* * File Name : broadcaster.c * Author : WCH * Version : V1.0 * Date : 2020/08/06 * Description : Broadcast application, initialize the broadcast parameter, * and then be broadcast in the broadcasting state ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /********************************************************************* * INCLUDES */ #include "CONFIG.h" #include "devinfoservice.h" #include "broadcaster.h" /********************************************************************* * MACROS */ /********************************************************************* * CONSTANTS */ // What is the advertising interval when device is discoverable (units of 625us, min is 160=100ms) #define DEFAULT_ADVERTISING_INTERVAL 160 // Company Identifier: WCH #define WCH_COMPANY_ID 0x07D7 // Length of bd addr as a string #define B_ADDR_STR_LEN 15 /********************************************************************* * TYPEDEFS */ /********************************************************************* * GLOBAL VARIABLES */ /********************************************************************* * EXTERNAL VARIABLES */ /********************************************************************* * EXTERNAL FUNCTIONS */ /********************************************************************* * LOCAL VARIABLES */ static uint8_t Broadcaster_TaskID; // Task ID for internal task/event processing // GAP - SCAN RSP data (max size = 31 bytes) static uint8_t scanRspData[] = { // complete name 0x0c, // length of this data GAP_ADTYPE_LOCAL_NAME_COMPLETE, 0x42, // 'B' 0x72, // 'r' 0x6f, // 'o' 0x61, // 'a' 0x64, // 'd' 0x63, // 'c' 0x61, // 'a' 0x73, // 's' 0x74, // 't' 0x65, // 'e' 0x72, // 'r' // Tx power level 0x02, // length of this data GAP_ADTYPE_POWER_LEVEL, 0 // 0dBm }; // GAP - Advertisement data (max size = 31 bytes, though this is // best kept short to conserve power while advertisting) static uint8_t advertData[] = { // Flags; this sets the device to use limited discoverable // mode (advertises for 30 seconds at a time) instead of general // discoverable mode (advertises indefinitely) 0x02, // length of this data GAP_ADTYPE_FLAGS, GAP_ADTYPE_FLAGS_BREDR_NOT_SUPPORTED, // Broadcast of the data 0x04, // length of this data including the data type byte GAP_ADTYPE_MANUFACTURER_SPECIFIC, // manufacturer specific advertisement data type 'b', 'l', 'e', 0x04, GAP_ADTYPE_LOCAL_NAME_SHORT, 'a', 'b', 'c' }; /********************************************************************* * LOCAL FUNCTIONS */ static void Broadcaster_ProcessTMOSMsg(tmos_event_hdr_t *pMsg); static void Broadcaster_StateNotificationCB(gapRole_States_t newState); /********************************************************************* * PROFILE CALLBACKS */ // GAP Role Callbacks static gapRolesBroadcasterCBs_t Broadcaster_BroadcasterCBs = {Broadcaster_StateNotificationCB, // Profile State Change Callbacks NULL}; /********************************************************************* * PUBLIC FUNCTIONS */ /********************************************************************* * @fn Broadcaster_Init * * @brief Initialization function for the Broadcaster App * Task. This is called during initialization and should contain * any application specific initialization (ie. hardware * initialization/setup, table initialization, power up * notificaiton ... ). * * @param task_id - the ID assigned by TMOS. This ID should be * used to send messages and set timers. * * @return none */ void Broadcaster_Init() { Broadcaster_TaskID = TMOS_ProcessEventRegister(Broadcaster_ProcessEvent); // Setup the GAP Broadcaster Role Profile { // Device starts advertising upon initialization uint8_t initial_advertising_enable = TRUE; uint8_t initial_adv_event_type = GAP_ADTYPE_ADV_NONCONN_IND; // Set the GAP Role Parameters GAPRole_SetParameter(GAPROLE_ADVERT_ENABLED, sizeof(uint8_t), &initial_advertising_enable); GAPRole_SetParameter(GAPROLE_ADV_EVENT_TYPE, sizeof(uint8_t), &initial_adv_event_type); GAPRole_SetParameter(GAPROLE_SCAN_RSP_DATA, sizeof(scanRspData), scanRspData); GAPRole_SetParameter(GAPROLE_ADVERT_DATA, sizeof(advertData), advertData); } // Set advertising interval { uint16_t advInt = DEFAULT_ADVERTISING_INTERVAL; GAP_SetParamValue(TGAP_DISC_ADV_INT_MIN, advInt); GAP_SetParamValue(TGAP_DISC_ADV_INT_MAX, advInt); } // Setup a delayed profile startup tmos_set_event(Broadcaster_TaskID, SBP_START_DEVICE_EVT); } /********************************************************************* * @fn Broadcaster_ProcessEvent * * @brief Broadcaster Application Task event processor. This * function is called to process all events for the task. Events * include timers, messages and any other user defined events. * * @param task_id - The TMOS assigned task ID. * @param events - events to process. This is a bit map and can * contain more than one event. * * @return events not processed */ uint16_t Broadcaster_ProcessEvent(uint8_t task_id, uint16_t events) { if(events & SYS_EVENT_MSG) { uint8_t *pMsg; if((pMsg = tmos_msg_receive(Broadcaster_TaskID)) != NULL) { Broadcaster_ProcessTMOSMsg((tmos_event_hdr_t *)pMsg); // Release the TMOS message tmos_msg_deallocate(pMsg); } // return unprocessed events return (events ^ SYS_EVENT_MSG); } if(events & SBP_START_DEVICE_EVT) { // Start the Device GAPRole_BroadcasterStartDevice(&Broadcaster_BroadcasterCBs); return (events ^ SBP_START_DEVICE_EVT); } // Discard unknown events return 0; } /********************************************************************* * @fn Broadcaster_ProcessTMOSMsg * * @brief Process an incoming task message. * * @param pMsg - message to process * * @return none */ static void Broadcaster_ProcessTMOSMsg(tmos_event_hdr_t *pMsg) { switch(pMsg->event) { default: break; } } /********************************************************************* * @fn Broadcaster_StateNotificationCB * * @brief Notification from the profile of a state change. * * @param newState - new state * * @return none */ static void Broadcaster_StateNotificationCB(gapRole_States_t newState) { switch(newState) { case GAPROLE_STARTED: PRINT("Initialized..\n"); break; case GAPROLE_ADVERTISING: PRINT("Advertising..\n"); break; case GAPROLE_WAITING: PRINT("Waiting for advertising..\n"); break; case GAPROLE_ERROR: PRINT("Error..\n"); break; default: break; } } /********************************************************************* *********************************************************************/