Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
F
firmware
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Service Desk
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Packages & Registries
Packages & Registries
Container Registry
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
François Revol
firmware
Commits
c0a3ed9e
Commit
c0a3ed9e
authored
Jul 17, 2020
by
schneider
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'schneider/mp-bonding' into 'master'
Bonding dialog See merge request
card10/firmware!390
parents
2c026ff2
7ea488c6
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
624 additions
and
887 deletions
+624
-887
epicardium/ble/app/app_main.c
epicardium/ble/app/app_main.c
+0
-427
epicardium/ble/app/common/app_db.c
epicardium/ble/app/common/app_db.c
+3
-41
epicardium/ble/app/common/app_ui.c
epicardium/ble/app/common/app_ui.c
+0
-349
epicardium/ble/ble.c
epicardium/ble/ble.c
+0
-2
epicardium/ble/ble_api.h
epicardium/ble/ble_api.h
+5
-0
epicardium/ble/ble_main.c
epicardium/ble/ble_main.c
+271
-40
epicardium/ble/card10.c
epicardium/ble/card10.c
+4
-6
epicardium/ble/meson.build
epicardium/ble/meson.build
+0
-2
epicardium/ble/stack.c
epicardium/ble/stack.c
+3
-0
epicardium/epicardium.h
epicardium/epicardium.h
+126
-2
epicardium/modules/config.c
epicardium/modules/config.c
+1
-1
epicardium/modules/hardware.c
epicardium/modules/hardware.c
+5
-0
epicardium/modules/interrupts.c
epicardium/modules/interrupts.c
+22
-0
lib/sdk/Libraries/BTLE/meson.build
lib/sdk/Libraries/BTLE/meson.build
+2
-2
lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/app_slave.c
...ries/BTLE/stack/ble-profiles/sources/apps/app/app_slave.c
+10
-2
preload/apps/ble/__init__.py
preload/apps/ble/__init__.py
+84
-13
pycardium/meson.build
pycardium/meson.build
+1
-0
pycardium/modules/interrupt.c
pycardium/modules/interrupt.c
+1
-0
pycardium/modules/qstrdefs.h
pycardium/modules/qstrdefs.h
+14
-0
pycardium/modules/sys_ble.c
pycardium/modules/sys_ble.c
+71
-0
pycardium/mpconfigport.h
pycardium/mpconfigport.h
+1
-0
No files found.
epicardium/ble/app/app_main.c
deleted
100644 → 0
View file @
2c026ff2
/*************************************************************************************************/
/*!
* \file
*
* \brief Application framework main module.
*
* Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
* ARM Ltd. confidential and proprietary.
*
* IMPORTANT. Your use of this file is governed by a Software License Agreement
* ("Agreement") that must be accepted in order to download or otherwise receive a
* copy of this file. You may not use or copy this file for any purpose other than
* as described in the Agreement. If you do not agree to all of the terms of the
* Agreement do not use this file and delete all copies in your possession or control;
* if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
* to any use, copying or further distribution of this software.
*/
/*************************************************************************************************/
/* card10:
* copied from: lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/app_main.c
*
* Reason: we need to correctly implement AppHandleNumericComparison
*/
/* clang-format off */
/* clang-formet turned off for easier diffing against orginal file */
#include <string.h>
#include "wsf_types.h"
#include "wsf_msg.h"
#include "sec_api.h"
#include "wsf_trace.h"
#include "wsf_timer.h"
#include "wsf_assert.h"
#include "util/bstream.h"
#include "dm_api.h"
#include "app_api.h"
#include "app_main.h"
#include "app_ui.h"
#include "modules/log.h"
/**************************************************************************************************
Global Variables
**************************************************************************************************/
/*! Configuration pointer for advertising */
appAdvCfg_t
*
pAppAdvCfg
;
/*! Configuration pointer for extended and periodic advertising */
appExtAdvCfg_t
*
pAppExtAdvCfg
;
/*! Configuration pointer for slave */
appSlaveCfg_t
*
pAppSlaveCfg
;
/*! Configuration pointer for master */
appMasterCfg_t
*
pAppMasterCfg
;
/*! Configuration pointer for extended master */
appExtMasterCfg_t
*
pAppExtMasterCfg
;
/*! Configuration pointer for security */
appSecCfg_t
*
pAppSecCfg
;
/*! Configuration pointer for connection parameter update */
appUpdateCfg_t
*
pAppUpdateCfg
;
/*! Configuration pointer for discovery */
appDiscCfg_t
*
pAppDiscCfg
;
/*! Configuration pointer for application */
appCfg_t
*
pAppCfg
;
/*! Connection control block array */
appConnCb_t
appConnCb
[
DM_CONN_MAX
];
/*! WSF handler ID */
wsfHandlerId_t
appHandlerId
;
/*! Main control block */
appCb_t
appCb
;
/*! Configuration structure for incoming request actions */
const
appReqActCfg_t
appReqActCfg
=
{
APP_ACT_ACCEPT
/*! Action for the remote connection parameter request */
};
/*! Configuration pointer for incoming request actions on master */
appReqActCfg_t
*
pAppMasterReqActCfg
=
(
appReqActCfg_t
*
)
&
appReqActCfg
;
/*! Configurable pointer for incoming request actions on slave */
appReqActCfg_t
*
pAppSlaveReqActCfg
=
(
appReqActCfg_t
*
)
&
appReqActCfg
;
/*************************************************************************************************/
/*!
* \brief Process messages from the event handler.
*
* \param pMsg Pointer to message.
*
* \return None.
*/
/*************************************************************************************************/
static
void
appProcMsg
(
wsfMsgHdr_t
*
pMsg
)
{
switch
(
pMsg
->
event
)
{
case
APP_BTN_POLL_IND
:
appUiBtnPoll
();
break
;
case
APP_UI_TIMER_IND
:
appUiTimerExpired
(
pMsg
);
break
;
default:
break
;
}
}
/*************************************************************************************************/
/*!
* \brief Check the bonded state of a connection.
*
* \param connId DM connection ID.
*
* \return Bonded state.
*/
/*************************************************************************************************/
bool_t
appCheckBonded
(
dmConnId_t
connId
)
{
WSF_ASSERT
((
connId
>
0
)
&&
(
connId
<=
DM_CONN_MAX
));
return
appConnCb
[
connId
-
1
].
bonded
;
}
/*************************************************************************************************/
/*!
* \brief Check the bond-by-LTK state of a connection.
*
* \param connId DM connection ID.
*
* \return Bond-by-LTK state.
*/
/*************************************************************************************************/
bool_t
appCheckBondByLtk
(
dmConnId_t
connId
)
{
WSF_ASSERT
((
connId
>
0
)
&&
(
connId
<=
DM_CONN_MAX
));
return
appConnCb
[
connId
-
1
].
bondByLtk
;
}
/*************************************************************************************************/
/*!
* \brief Return the number of existing connections of the given role.
*
* \param role Connection role
*
* \return Number of connections.
*/
/*************************************************************************************************/
uint8_t
appNumConns
(
uint8_t
role
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
,
j
;
for
(
i
=
DM_CONN_MAX
,
j
=
0
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
((
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
&&
(
DmConnRole
(
pCcb
->
connId
)
==
role
))
{
j
++
;
}
}
return
j
;
}
/*************************************************************************************************/
/*!
* \brief App framework handler init function called during system initialization.
*
* \param handlerID WSF handler ID for App.
*
* \return None.
*/
/*************************************************************************************************/
void
AppInit
(
void
)
{
appHandlerId
=
WsfOsSetNextHandler
(
AppHandler
);
AppDbInit
();
}
/*************************************************************************************************/
/*!
* \brief WSF event handler for app framework.
*
* \param event WSF event mask.
* \param pMsg WSF message.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandler
(
wsfEventMask_t
event
,
wsfMsgHdr_t
*
pMsg
)
{
if
(
pMsg
!=
NULL
)
{
APP_TRACE_INFO1
(
"App got evt %d"
,
pMsg
->
event
);
if
(
pMsg
->
event
>=
APP_MASTER_MSG_START
)
{
/* pass event to master handler */
(
*
appCb
.
masterCback
)(
pMsg
);
}
else
if
(
pMsg
->
event
>=
APP_SLAVE_MSG_START
)
{
/* pass event to slave handler */
(
*
appCb
.
slaveCback
)(
pMsg
);
}
else
{
appProcMsg
(
pMsg
);
}
}
else
{
if
(
event
&
APP_BTN_DOWN_EVT
)
{
AppUiBtnPressed
();
}
}
}
/*************************************************************************************************/
/*!
* \brief Handle a passkey request during pairing. If the passkey is to displayed, a
* random passkey is generated and displayed. If the passkey is to be entered
* the user is prompted to enter the passkey.
*
* \param pAuthReq DM authentication requested event structure.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandlePasskey
(
dmSecAuthReqIndEvt_t
*
pAuthReq
)
{
uint32_t
passkey
;
uint8_t
buf
[
SMP_PIN_LEN
];
if
(
pAuthReq
->
display
)
{
/* generate random passkey, limit to 6 digit max */
SecRand
((
uint8_t
*
)
&
passkey
,
sizeof
(
uint32_t
));
passkey
%=
1000000
;
/* convert to byte buffer */
buf
[
0
]
=
UINT32_TO_BYTE0
(
passkey
);
buf
[
1
]
=
UINT32_TO_BYTE1
(
passkey
);
buf
[
2
]
=
UINT32_TO_BYTE2
(
passkey
);
/* send authentication response to DM */
DmSecAuthRsp
((
dmConnId_t
)
pAuthReq
->
hdr
.
param
,
SMP_PIN_LEN
,
buf
);
/* display passkey */
AppUiDisplayPasskey
(
passkey
);
}
else
{
/* prompt user to enter passkey */
AppUiAction
(
APP_UI_PASSKEY_PROMPT
);
}
}
/*************************************************************************************************/
/*!
* \brief Handle a numeric comparison indication during pairing. The confirmation value is
* displayed and the user is prompted to verify that the local and peer confirmation
* values match.
*
* \param pCnfInd DM confirmation indication event structure.
*
* \return None.
*/
/*************************************************************************************************/
void
AppHandleNumericComparison
(
dmSecCnfIndEvt_t
*
pCnfInd
)
{
uint32_t
confirm
=
DmSecGetCompareValue
(
pCnfInd
->
confirm
);
LOG_INFO
(
"ble"
,
"Confirm Value: %ld"
,
confirm
);
/* display confirmation value */
AppUiDisplayConfirmValue
(
confirm
);
/* TODO: Verify that local and peer confirmation values match */
DmSecCompareRsp
((
dmConnId_t
)
pCnfInd
->
hdr
.
param
,
TRUE
);
}
/*************************************************************************************************/
/*!
* \brief Close the connection with the give connection identifier.
*
* \param connId Connection identifier.
*
* \return None.
*/
/*************************************************************************************************/
void
AppConnClose
(
dmConnId_t
connId
)
{
DmConnClose
(
DM_CLIENT_ID_APP
,
connId
,
HCI_ERR_REMOTE_TERMINATED
);
}
/*************************************************************************************************/
/*!
* \brief Get a list of connection identifiers of open connections.
*
* \param pConnIdList Buffer to hold connection IDs (must be DM_CONN_MAX bytes).
*
* \return Number of open connections.
*
*/
/*************************************************************************************************/
uint8_t
AppConnOpenList
(
dmConnId_t
*
pConnIdList
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
;
uint8_t
pos
=
0
;
memset
(
pConnIdList
,
DM_CONN_ID_NONE
,
DM_CONN_MAX
);
for
(
i
=
DM_CONN_MAX
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
(
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
{
pConnIdList
[
pos
++
]
=
pCcb
->
connId
;
}
}
return
pos
;
}
/*************************************************************************************************/
/*!
* \brief Check if a connection is open.
*
* \return Connection ID of open connection or DM_CONN_ID_NONE if no open connections.
*/
/*************************************************************************************************/
dmConnId_t
AppConnIsOpen
(
void
)
{
appConnCb_t
*
pCcb
=
appConnCb
;
uint8_t
i
;
for
(
i
=
DM_CONN_MAX
;
i
>
0
;
i
--
,
pCcb
++
)
{
if
(
pCcb
->
connId
!=
DM_CONN_ID_NONE
)
{
return
pCcb
->
connId
;
}
}
return
DM_CONN_ID_NONE
;
}
/*************************************************************************************************/
/*!
* \brief Get the device database record handle associated with an open connection.
*
* \param connId Connection identifier.
*
* \return Database record handle or APP_DB_HDL_NONE.
*/
/*************************************************************************************************/
appDbHdl_t
AppDbGetHdl
(
dmConnId_t
connId
)
{
return
appConnCb
[
connId
-
1
].
dbHdl
;
}
/*************************************************************************************************/
/*!
* \brief Add device to resolving list.
*
* \param pMsg Pointer to DM callback event message.
* \param connId Connection identifier.
*
* \return None.
*/
/*************************************************************************************************/
void
AppAddDevToResList
(
dmEvt_t
*
pMsg
,
dmConnId_t
connId
)
{
dmSecKey_t
*
pPeerKey
;
appDbHdl_t
hdl
=
appConnCb
[
connId
-
1
].
dbHdl
;
/* if LL Privacy is supported and the peer device has distributed its IRK */
if
(
HciLlPrivacySupported
()
&&
((
pPeerKey
=
AppDbGetKey
(
hdl
,
DM_KEY_IRK
,
NULL
))
!=
NULL
))
{
/* add peer device to resolving list. If all-zero local or peer IRK is used then
LL will only use or accept local or peer identity address respectively. */
DmPrivAddDevToResList
(
pPeerKey
->
irk
.
addrType
,
pPeerKey
->
irk
.
bdAddr
,
pPeerKey
->
irk
.
key
,
DmSecGetLocalIrk
(),
TRUE
,
pMsg
->
hdr
.
param
);
}
}
/*************************************************************************************************/
/*!
* \brief Update privacy mode for a given peer device.
*
* \param hdl Database record handle.
*
* \return None.
*/
/*************************************************************************************************/
void
AppUpdatePrivacyMode
(
appDbHdl_t
hdl
)
{
/* if peer device's been added to resolving list but RPA Only attribute not found on peer device */
if
((
hdl
!=
APP_DB_HDL_NONE
)
&&
AppDbGetPeerAddedToRl
(
hdl
)
&&
!
AppDbGetPeerRpao
(
hdl
))
{
dmSecKey_t
*
pPeerKey
=
AppDbGetKey
(
hdl
,
DM_KEY_IRK
,
NULL
);
if
(
pPeerKey
!=
NULL
)
{
/* set device privacy mode for this peer device */
DmPrivSetPrivacyMode
(
pPeerKey
->
irk
.
addrType
,
pPeerKey
->
irk
.
bdAddr
,
DM_PRIV_MODE_DEVICE
);
/* make sure resolving list flag cleared */
AppDbSetPeerAddedToRl
(
hdl
,
FALSE
);
}
}
}
/* clang-format on */
epicardium/ble/app/common/app_db.c
View file @
c0a3ed9e
...
...
@@ -95,12 +95,6 @@ static appDb_t appDb;
/*! When all records are allocated use this index to determine which to overwrite */
static
appDbRec_t
*
pAppDbNewRec
=
appDb
.
rec
;
/* Timer to delay writing to persistent storage until a burst of store() calls has finished */
static
TimerHandle_t
store_timer
;
static
StaticTimer_t
store_timer_buffer
;
static
void
store_callback
();
#define STORE_DELAY pdMS_TO_TICKS(5000)
/*************************************************************************************************/
/*!
* \brief Initialize the device database.
...
...
@@ -117,32 +111,12 @@ void AppDbInit(void)
memset
(
&
appDb
,
0
,
sizeof
(
appDb
));
}
epic_file_close
(
fd
);
}
store_timer
=
xTimerCreateStatic
(
"appdb_store_timer"
,
STORE_DELAY
,
pdFALSE
,
NULL
,
store_callback
,
&
store_timer_buffer
);
}
/* TODO this should actually put tasks into a queue. On the other end of the queue */
/* a worker task can read tasks off the queue and execute them */
static
void
store
(
void
)
{
LOG_INFO
(
"appDb"
,
"store() called, resetting timer"
);
if
(
xTimerReset
(
store_timer
,
10
)
!=
pdPASS
)
{
/* (Re)start the timer */
/* Store timer could not be reset, write to persistent storage anyway */
store_callback
();
}
}
static
void
store_callback
(
)
static
void
AppDbStore
(
void
)
{
LOG_INFO
(
"appDb"
,
"
STORE_DELAY passed,
writing to persistent storage"
);
LOG_INFO
(
"appDb"
,
"writing to persistent storage"
);
int
fd
=
epic_file_open
(
"pairings.bin"
,
"w"
);
if
(
fd
>=
0
)
{
...
...
@@ -198,7 +172,6 @@ appDbHdl_t AppDbNewRecord(uint8_t addrType, uint8_t *pAddr)
pRec
->
peerAddedToRl
=
FALSE
;
pRec
->
peerRpao
=
FALSE
;
store
();
return
(
appDbHdl_t
)
pRec
;
}
...
...
@@ -263,7 +236,6 @@ appDbHdl_t AppDbGetNextRecord(appDbHdl_t hdl)
void
AppDbDeleteRecord
(
appDbHdl_t
hdl
)
{
((
appDbRec_t
*
)
hdl
)
->
inUse
=
FALSE
;
store
();
}
/*************************************************************************************************/
...
...
@@ -281,7 +253,7 @@ void AppDbValidateRecord(appDbHdl_t hdl, uint8_t keyMask)
{
((
appDbRec_t
*
)
hdl
)
->
valid
=
TRUE
;
((
appDbRec_t
*
)
hdl
)
->
keyValidMask
=
keyMask
;
s
tore
();
AppDbS
tore
();
}
/*************************************************************************************************/
...
...
@@ -371,7 +343,6 @@ void AppDbDeleteAllRecords(void)
{
pRec
->
inUse
=
FALSE
;
}
store
();
}
/*************************************************************************************************/
...
...
@@ -518,7 +489,6 @@ void AppDbSetKey(appDbHdl_t hdl, dmSecKeyIndEvt_t *pKey)
default:
break
;
}
store
();
}
/*************************************************************************************************/
...
...
@@ -551,7 +521,6 @@ void AppDbSetCccTblValue(appDbHdl_t hdl, uint16_t idx, uint16_t value)
WSF_ASSERT
(
idx
<
APP_DB_NUM_CCCD
);
((
appDbRec_t
*
)
hdl
)
->
cccTbl
[
idx
]
=
value
;
store
();
}
/*************************************************************************************************/
...
...
@@ -581,7 +550,6 @@ uint8_t AppDbGetDiscStatus(appDbHdl_t hdl)
void
AppDbSetDiscStatus
(
appDbHdl_t
hdl
,
uint8_t
status
)
{
((
appDbRec_t
*
)
hdl
)
->
discStatus
=
status
;
store
();
}
/*************************************************************************************************/
...
...
@@ -611,7 +579,6 @@ uint16_t *AppDbGetHdlList(appDbHdl_t hdl)
void
AppDbSetHdlList
(
appDbHdl_t
hdl
,
uint16_t
*
pHdlList
)
{
memcpy
(((
appDbRec_t
*
)
hdl
)
->
hdlList
,
pHdlList
,
sizeof
(((
appDbRec_t
*
)
hdl
)
->
hdlList
));
store
();
}
/*************************************************************************************************/
...
...
@@ -654,7 +621,6 @@ void AppDbSetDevName(uint8_t len, char *pStr)
len
=
(
len
<=
sizeof
(
appDb
.
devName
))
?
len
:
sizeof
(
appDb
.
devName
);
memcpy
(
appDb
.
devName
,
pStr
,
len
);
store
();
}
/*************************************************************************************************/
...
...
@@ -684,7 +650,6 @@ bool_t AppDbGetPeerAddrRes(appDbHdl_t hdl)
void
AppDbSetPeerAddrRes
(
appDbHdl_t
hdl
,
uint8_t
addrRes
)
{
((
appDbRec_t
*
)
hdl
)
->
peerAddrRes
=
addrRes
;
store
();
}
/*************************************************************************************************/
...
...
@@ -715,7 +680,6 @@ void AppDbSetPeerSignCounter(appDbHdl_t hdl, uint32_t signCounter)
{
if
(((
appDbRec_t
*
)
hdl
)
->
peerSignCounter
!=
signCounter
)
{
((
appDbRec_t
*
)
hdl
)
->
peerSignCounter
=
signCounter
;
store
();
}
}
...
...
@@ -746,7 +710,6 @@ bool_t AppDbGetPeerAddedToRl(appDbHdl_t hdl)
void
AppDbSetPeerAddedToRl
(
appDbHdl_t
hdl
,
bool_t
peerAddedToRl
)
{
((
appDbRec_t
*
)
hdl
)
->
peerAddedToRl
=
peerAddedToRl
;
store
();
}
/*************************************************************************************************/
...
...
@@ -776,6 +739,5 @@ bool_t AppDbGetPeerRpao(appDbHdl_t hdl)
void
AppDbSetPeerRpao
(
appDbHdl_t
hdl
,
bool_t
peerRpao
)
{
((
appDbRec_t
*
)
hdl
)
->
peerRpao
=
peerRpao
;
store
();
}
/* clang-format on */
epicardium/ble/app/common/app_ui.c
deleted
100644 → 0
View file @
2c026ff2
/*************************************************************************************************/
/*!
* \file
*
* \brief Application framework user interface.
*
* Copyright (c) 2011-2018 Arm Ltd. All Rights Reserved.
* ARM Ltd. confidential and proprietary.
*
* IMPORTANT. Your use of this file is governed by a Software License Agreement
* ("Agreement") that must be accepted in order to download or otherwise receive a
* copy of this file. You may not use or copy this file for any purpose other than
* as described in the Agreement. If you do not agree to all of the terms of the
* Agreement do not use this file and delete all copies in your possession or control;
* if you do not have a copy of the Agreement, you must contact ARM Ltd. prior
* to any use, copying or further distribution of this software.
*/
/*************************************************************************************************/
#include "wsf_types.h"
#include "wsf_os.h"
#include "wsf_trace.h"
#include "app_ui.h"
/* card10:
* copied from: lib/sdk/Libraries/BTLE/stack/ble-profiles/sources/apps/app/common/app_ui.c
*
* Reason: has several user interactions which we likley have to implement
*/
/* clang-format off */
/* clang-formet turned off for easier diffing against orginal file */
/**************************************************************************************************
Global Variables
**************************************************************************************************/
/*! \brief Callback struct */
appUiCback_t
appUiCbackTbl
;
/*************************************************************************************************/
/*!
* \brief card10 - Should disable encryption. MAXIM bug reported to us in current static library. Requires
* this to be called before the BTLE app starts making advertisements. Avoids encryption
* rendering the frame unreadable.
*
* \return None.
*/
/*************************************************************************************************/
void
llc_api_crypto_disable_tx
();
/*************************************************************************************************/
/*!
* \brief Perform a user interface action based on the event value passed to the function.
*
* \param event User interface event value.
*
* \return None.
*/
/*************************************************************************************************/
void
AppUiAction
(
uint8_t
event
)
{
switch
(
event
)
{
case
APP_UI_NONE
:
/* no action */
break
;
case
APP_UI_RESET_CMPL
:
APP_TRACE_INFO0
(
">>> Reset complete <<<"
);
break
;
case
APP_UI_ADV_START
:
llc_api_crypto_disable_tx
();
APP_TRACE_INFO0
(
">>> Advertising started <<<"
);
break
;