diff --git a/epicardium/ble/filetransfer.c b/epicardium/ble/filetransfer.c index 5efc3a77a68db51bb6ec6ed194012377faa5e6a4..01a74ada5bdc149353a780e20e6bf29bcf1d760f 100644 --- a/epicardium/ble/filetransfer.c +++ b/epicardium/ble/filetransfer.c @@ -78,115 +78,101 @@ enum { }; /* BLE File transfer Service UUID */ -static const uint8_t fileTransSvc[] = { FILE_TRANS_UUID_SUFFIX, - 0x00, - FILE_TRANS_UUID_PREFIX }; +static const uint8_t fileTransSvc[] = { FILE_TRANS_UUID_SUFFIX, + 0x00, + FILE_TRANS_UUID_PREFIX }; +static const uint16_t fileTransSvc_len = sizeof(fileTransSvc); /* BLE File transfer Central TX configuration */ -static const uint8_t txChConfig[] = { ATT_PROP_WRITE_NO_RSP, - UINT16_TO_BYTES( - FILE_TRANS_CENTRAL_TX_VAL_HDL), - FILE_TRANS_UUID_SUFFIX, - 0x01, - FILE_TRANS_UUID_PREFIX }; +static const uint8_t txChConfig[] = { ATT_PROP_WRITE_NO_RSP, + UINT16_TO_BYTES( + FILE_TRANS_CENTRAL_TX_VAL_HDL), + FILE_TRANS_UUID_SUFFIX, + 0x01, + FILE_TRANS_UUID_PREFIX }; +static const uint16_t txChConfig_len = sizeof(txChConfig); + /* BLE File transfer Central TX UUID */ static const uint8_t attTxChConfigUuid[] = { FILE_TRANS_UUID_SUFFIX, 0x01, FILE_TRANS_UUID_PREFIX }; /* BLE File transfer Central RX configuration */ -static const uint8_t rxChConfig[] = { ATT_PROP_READ | ATT_PROP_NOTIFY, - UINT16_TO_BYTES( - FILE_TRANS_CENTRAL_RX_VAL_HDL), - FILE_TRANS_UUID_SUFFIX, - 0x02, - FILE_TRANS_UUID_PREFIX }; +static const uint8_t rxChConfig[] = { ATT_PROP_READ | ATT_PROP_NOTIFY, + UINT16_TO_BYTES( + FILE_TRANS_CENTRAL_RX_VAL_HDL), + FILE_TRANS_UUID_SUFFIX, + 0x02, + FILE_TRANS_UUID_PREFIX }; +static const uint16_t rxChConfig_len = sizeof(rxChConfig); + /* BLE File transfer Central RX UUID */ static const uint8_t attRxChConfigUuid[] = { FILE_TRANS_UUID_SUFFIX, 0x02, FILE_TRANS_UUID_PREFIX }; +static uint8_t attRxChConfigValue[64]; +static uint16_t attRxChConfigValue_len = 0; /* File descriptor of the currently transferred file */ static int file_fd = -1; -/* - * Create the BLE service description. - */ -static void *fileTransAddGroupDyn(void) -{ - void *pSHdl; - uint8_t initCcc[] = { UINT16_TO_BYTES(0x0000) }; - - /* Create the service */ - pSHdl = AttsDynCreateGroup(FILE_TRANS_START_HDL, FILE_TRANS_END_HDL); - - if (pSHdl != NULL) { - /* Primary service */ - AttsDynAddAttrConst( - pSHdl, - attPrimSvcUuid, - fileTransSvc, - sizeof(fileTransSvc), - 0, - ATTS_PERMIT_READ - ); - - /* File transfer Central TX characteristic */ - AttsDynAddAttrConst( - pSHdl, - attChUuid, - txChConfig, - sizeof(txChConfig), - 0, - ATTS_PERMIT_READ - ); - - /* File transfer Central TX, this contains information about the real data */ - AttsDynAddAttr( - pSHdl, - attTxChConfigUuid, - NULL, - 0, - 128, - ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, - ATTS_PERMIT_WRITE - ); - - /* File transfer Central RX characteristic */ - AttsDynAddAttrConst( - pSHdl, - attChUuid, - rxChConfig, - sizeof(rxChConfig), - 0, - ATTS_PERMIT_READ - ); - - /* File transfer Central RX, this contains information about the real data */ - AttsDynAddAttr( - pSHdl, - attRxChConfigUuid, - NULL, - 0, - 64, - ATTS_SET_READ_CBACK, - ATTS_PERMIT_READ - ); - - /* File transfer Central RX notification channel */ - AttsDynAddAttr( - pSHdl, - attCliChCfgUuid, - initCcc, - sizeof(uint16_t), - sizeof(uint16_t), - ATTS_SET_CCC, - ATTS_PERMIT_READ | ATTS_PERMIT_WRITE - ); - } - - return pSHdl; -} +/* Attribute list for uriCfg group */ +static const attsAttr_t fileTransCfgList[] = { + /* Service declaration */ + { + .pUuid = attPrimSvcUuid, + .pValue = (uint8_t *)fileTransSvc, + .pLen = (uint16_t *)&fileTransSvc_len, + .maxLen = sizeof(fileTransSvc), + .settings = 0, + .permissions = ATTS_PERMIT_READ, + }, + /* File transfer Central TX characteristic */ + { + .pUuid = attChUuid, + .pValue = (uint8_t *)txChConfig, + .pLen = (uint16_t *)&txChConfig_len, + .maxLen = sizeof(txChConfig), + .settings = 0, + .permissions = ATTS_PERMIT_READ, + }, + /* File transfer Central TX, this contains information about the real data */ + { + .pUuid = attTxChConfigUuid, + .pValue = NULL, + .pLen = NULL, + .maxLen = 128, + .settings = ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, + .permissions = ATTS_PERMIT_WRITE, + }, + /* File transfer Central RX characteristic */ + { + .pUuid = attChUuid, + .pValue = (uint8_t *)rxChConfig, + .pLen = (uint16_t *)&rxChConfig_len, + .maxLen = sizeof(rxChConfig), + .settings = 0, + .permissions = ATTS_PERMIT_READ, + }, + /* File transfer Central RX, this contains information about the real data */ + { + .pUuid = attRxChConfigUuid, + .pValue = attRxChConfigValue, + .pLen = &attRxChConfigValue_len, + .maxLen = sizeof(attRxChConfigValue), + .settings = ATTS_SET_VARIABLE_LEN, + .permissions = ATTS_PERMIT_READ, + }, + /* File transfer Central RX notification channel */ + { + .pUuid = attCliChCfgUuid, + .pValue = attRxChConfigValue, + .pLen = &attRxChConfigValue_len, + .maxLen = sizeof(attRxChConfigValue), + .settings = ATTS_SET_CCC, + .permissions = ATTS_PERMIT_READ | ATTS_PERMIT_WRITE, + }, +}; /** * Send a repose with an optional CRC. @@ -413,22 +399,17 @@ static uint8_t writeCallback( } } -static uint8_t readCallback( - dmConnId_t connId, - uint16_t handle, - uint8_t operation, - uint16_t offset, - attsAttr_t *pAttr -) { - LOG_ERR("filetrans", "read callback\n"); - return ATT_SUCCESS; -} +static attsGroup_t fileTransCfgGroup = { + .pAttr = (attsAttr_t *)fileTransCfgList, + .writeCback = writeCallback, + .startHandle = FILE_TRANS_START_HDL, + .endHandle = FILE_TRANS_END_HDL, +}; /* * This registers and starts the BLE file transfer service. */ void bleFileTransfer_init(void) { - void *pSHdl = fileTransAddGroupDyn(); - AttsDynRegister(pSHdl, readCallback, writeCallback); + AttsAddGroup(&fileTransCfgGroup); }