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