From 5f39ee6bf967030a2dcd0fc6869ab46a0909224d Mon Sep 17 00:00:00 2001 From: Hauke Mehrtens <hauke@hauke-m.de> Date: Mon, 29 Jul 2019 00:36:23 +0200 Subject: [PATCH] BLE: file transfer: add delete caracteristik --- epicardium/ble/ble_filetransfer.c | 83 +++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/epicardium/ble/ble_filetransfer.c b/epicardium/ble/ble_filetransfer.c index c98fb586..4577de14 100644 --- a/epicardium/ble/ble_filetransfer.c +++ b/epicardium/ble/ble_filetransfer.c @@ -53,17 +53,23 @@ enum { FILE_TRANS_SVC_HDL = FILE_TRANS_START_HDL, /*!< \brief File transfer service declaration */ - FILE_TRANS_DATA_CH_HDL, /*!< \brief File transfer rx characteristic */ - FILE_TRANS_DATA_HDL, /*!< \brief File transfer rx value */ + FILE_TRANS_DATA_CH_HDL, /*!< \brief File transfer data characteristic */ + FILE_TRANS_DATA_HDL, /*!< \brief File transfer data value */ + FILE_TRANS_DELETE_CH_HDL, /*!< \brief File transfer delete characteristic */ + FILE_TRANS_DELETE_HDL, /*!< \brief File transfer delete value */ FILE_TRANS_MAX_HDL /*!< \brief Maximum handle. */ }; -/* BLE File trasnfer Service UUID */ +/* BLE File transfer Service UUID */ static const uint8_t fileTransSvc[] = {0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x0}; -/* BLE File trasnfer characteristic configuration */ -static const uint8_t fileTransRxCh[] = {ATT_PROP_WRITE, UINT16_TO_BYTES(FILE_TRANS_DATA_HDL), 0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x1}; -/* BLE File trasnfer characteristic UUID */ -static const uint8_t attFileTransRxChUuid[] = {0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x1}; +/* BLE File transfer data characteristic configuration */ +static const uint8_t fileTransDataCh[] = {ATT_PROP_WRITE, UINT16_TO_BYTES(FILE_TRANS_DATA_HDL), 0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x1}; +/* BLE File transfer data characteristic UUID */ +static const uint8_t attFileTransDataChUuid[] = {0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x1}; +/* BLE File transfer delete characteristic configuration */ +static const uint8_t fileTransDeleteCh[] = {ATT_PROP_WRITE, UINT16_TO_BYTES(FILE_TRANS_DELETE_HDL), 0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x2}; +/* BLE File transfer delete characteristic UUID */ +static const uint8_t attFileTransDeleteChUuid[] = {0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x23,0x42,0x2}; /* * Create the BLE service description. @@ -80,11 +86,16 @@ static void *SvcFileTransAddGroupDyn(void) /* Primary service */ AttsDynAddAttrConst(pSHdl, attPrimSvcUuid, fileTransSvc, sizeof(fileTransSvc), 0, ATTS_PERMIT_READ); - /* File transfer data characteristic */ - AttsDynAddAttrConst(pSHdl, attChUuid, fileTransRxCh, sizeof(fileTransRxCh), 0, ATTS_PERMIT_READ); + AttsDynAddAttrConst(pSHdl, attChUuid, fileTransDataCh, sizeof(fileTransDataCh), 0, ATTS_PERMIT_READ); /* File transfer data attribute, this contains information about the real data */ - AttsDynAddAttr(pSHdl, attFileTransRxChUuid, NULL, 0, 128, + AttsDynAddAttr(pSHdl, attFileTransDataChUuid, NULL, 0, 128, + ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, ATTS_PERMIT_WRITE); + + /* File transfer delete characteristic */ + AttsDynAddAttrConst(pSHdl, attChUuid, fileTransDeleteCh, sizeof(fileTransDeleteCh), 0, ATTS_PERMIT_READ); + /* File transfer delete attribute, this contains information about the real data */ + AttsDynAddAttr(pSHdl, attFileTransDeleteChUuid, NULL, 0, 64, ATTS_SET_WRITE_CBACK | ATTS_SET_VARIABLE_LEN, ATTS_PERMIT_WRITE); } @@ -134,29 +145,47 @@ static uint8_t fileTransWrite(dmConnId_t connId, uint16_t handle, uint8_t operat attsAttr_t *pAttr) { uint32_t fileOffset; + FRESULT res; + char filename[65]; switch (handle) { case FILE_TRANS_DATA_HDL: - { - /* The first 4 bytes are our mandatory offset. */ - if (len < 4) { - return ATT_ERR_LENGTH; + /* The first 4 bytes are our mandatory offset. */ + if (len < 4) { + return ATT_ERR_LENGTH; + } + fileOffset = __ntohl(((uint32_t *)pValue)[0]); + //printf("0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", pValue[0], pValue[1], pValue[2], pValue[3], pValue[4], pValue[5], pValue[5]); + + if (operation == ATT_PDU_PREP_WRITE_REQ) { + //printf("write prepare request: %.*s, offset: %li\n", len - 4, pValue + 4, fileOffset); + return ATT_SUCCESS; + } else if (operation == ATT_PDU_EXEC_WRITE_REQ) { + //printf("write execute request: %.*s, offset: %li\n", len - 4, pValue + 4, fileOffset); + + fileTransWriteDataOffset("mytest.py", fileOffset, pValue + 4, len - 4); + return ATT_SUCCESS; + } + return ATT_ERR_NOT_SUP; + + case FILE_TRANS_DELETE_HDL: + snprintf(filename, sizeof(filename), "%.*s", len, pValue); + + if (operation == ATT_PDU_PREP_WRITE_REQ) { + res = f_stat(filename, NULL); + if (res == FR_OK) { + return ATT_SUCCESS; + } else { + return ATT_ERR_VALUE_NOT_ALLOWED; } - fileOffset = __ntohl(((uint32_t *)pValue)[0]); - //printf("0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x, 0x%x\n", pValue[0], pValue[1], pValue[2], pValue[3], pValue[4], pValue[5], pValue[5]); + } else if (operation == ATT_PDU_EXEC_WRITE_REQ) { + printf("delete: %s\n", filename); + f_unlink(filename); + return ATT_SUCCESS; + } + return ATT_ERR_NOT_SUP; - if (operation == ATT_PDU_PREP_WRITE_REQ) { - //printf("write prepare request: %.*s, offset: %li\n", len - 4, pValue + 4, fileOffset); - return ATT_SUCCESS; - } else if (operation == ATT_PDU_EXEC_WRITE_REQ) { - //printf("write execute request: %.*s, offset: %li\n", len - 4, pValue + 4, fileOffset); - - fileTransWriteDataOffset("mytest.py", fileOffset, pValue + 4, len - 4); - - return ATT_SUCCESS; - } - } } return ATT_ERR_NOT_SUP; } -- GitLab