Переглянути джерело

src all commit / 인수인계 모든 파일

astrodom 2 роки тому
батько
коміт
5d638627d0
100 змінених файлів з 44635 додано та 0 видалено
  1. 355 0
      IES200RB.si4project/Backup/ble_nus(5553).c
  2. 476 0
      IES200RB.si4project/Backup/dio(3774).c
  3. 206 0
      IES200RB.si4project/Backup/dio(5579).h
  4. 479 0
      IES200RB.si4project/Backup/dio(5758).c
  5. 474 0
      IES200RB.si4project/Backup/dio(6619).c
  6. 62 0
      IES200RB.si4project/Backup/main(1019).h
  7. 63 0
      IES200RB.si4project/Backup/main(1551).h
  8. 64 0
      IES200RB.si4project/Backup/main(163).h
  9. 2266 0
      IES200RB.si4project/Backup/main(1699).c
  10. 2314 0
      IES200RB.si4project/Backup/main(20).c
  11. 2266 0
      IES200RB.si4project/Backup/main(2546).c
  12. 2254 0
      IES200RB.si4project/Backup/main(2586).c
  13. 2282 0
      IES200RB.si4project/Backup/main(2596).c
  14. 2261 0
      IES200RB.si4project/Backup/main(2685).c
  15. 2246 0
      IES200RB.si4project/Backup/main(2867).c
  16. 63 0
      IES200RB.si4project/Backup/main(3293).h
  17. 2268 0
      IES200RB.si4project/Backup/main(3779).c
  18. 2269 0
      IES200RB.si4project/Backup/main(3887).c
  19. 2160 0
      IES200RB.si4project/Backup/main(437).c
  20. 2259 0
      IES200RB.si4project/Backup/main(4540).c
  21. 2266 0
      IES200RB.si4project/Backup/main(5311).c
  22. 2323 0
      IES200RB.si4project/Backup/main(5467).c
  23. 2205 0
      IES200RB.si4project/Backup/main(6228).c
  24. 2314 0
      IES200RB.si4project/Backup/main(6274).c
  25. 2282 0
      IES200RB.si4project/Backup/main(6345).c
  26. 63 0
      IES200RB.si4project/Backup/main(6666).h
  27. 2297 0
      IES200RB.si4project/Backup/main(870).c
  28. 482 0
      IES200RB.si4project/Backup/nrf_pwr_mgmt(2287).c
  29. 168 0
      IES200RB.si4project/Backup/nrfx_wdt(2879).c
  30. 166 0
      IES200RB.si4project/Backup/nrfx_wdt(5384).c
  31. 135 0
      IES200RB.si4project/Backup/our_service(1699).h
  32. 1069 0
      IES200RB.si4project/Backup/sysmgr(1422).c
  33. 273 0
      IES200RB.si4project/Backup/sysmgr(5076).h
  34. 882 0
      IES200RB.si4project/Backup/sysmgr(5078).c
  35. 193 0
      IES200RB.si4project/Backup/sysmgr(5100).h
  36. 195 0
      IES200RB.si4project/Backup/sysmgr(7951).h
  37. 187 0
      IES200RB.si4project/IES200RB.SearchResults
  38. 19 0
      IES200RB.si4project/IES200RB.bookmarks.xml
  39. BIN
      IES200RB.si4project/IES200RB.sip_sym
  40. BIN
      IES200RB.si4project/IES200RB.sip_xab
  41. BIN
      IES200RB.si4project/IES200RB.sip_xad
  42. BIN
      IES200RB.si4project/IES200RB.sip_xc
  43. BIN
      IES200RB.si4project/IES200RB.sip_xf
  44. BIN
      IES200RB.si4project/IES200RB.sip_xm
  45. BIN
      IES200RB.si4project/IES200RB.sip_xr
  46. BIN
      IES200RB.si4project/IES200RB.sip_xsb
  47. BIN
      IES200RB.si4project/IES200RB.sip_xsd
  48. BIN
      IES200RB.si4project/IES200RB.siproj
  49. 22 0
      IES200RB.si4project/IES200RB.siproj_settings.xml
  50. BIN
      IES200RB.si4project/IES200RB.siwork
  51. 7 0
      IES200RB.si4project/IES200RB.snippets.xml
  52. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_advertising_ble_advertising.c.sisc
  53. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_advertising_ble_advertising.h.sisc
  54. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_db_discovery_ble_db_discovery.c.sisc
  55. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_db_discovery_ble_db_discovery.h.sisc
  56. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm.c.sisc
  57. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm.h.sisc
  58. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw.h.sisc
  59. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw_nrf51.c.sisc
  60. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw_nrf52.c.sisc
  61. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_link_ctx_manager_ble_link_ctx_manager.c.sisc
  62. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_link_ctx_manager_ble_link_ctx_manager.h.sisc
  63. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_racp_ble_racp.c.sisc
  64. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_racp_ble_racp.h.sisc
  65. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_radio_notification_ble_radio_notification.c.sisc
  66. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_radio_notification_ble_radio_notification.h.sisc
  67. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_app_attr_get.c.sisc
  68. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_app_attr_get.h.sisc
  69. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_attr_parser.c.sisc
  70. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_attr_parser.h.sisc
  71. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_nrf_ble_ancs_c.c.sisc
  72. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_nrf_ble_ancs_c.h.sisc
  73. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ans_c_ble_ans_c.c.sisc
  74. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ans_c_ble_ans_c.h.sisc
  75. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_ble_bas.c.sisc
  76. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_ble_bas.h.sisc
  77. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_c_ble_bas_c.c.sisc
  78. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_c_ble_bas_c.h.sisc
  79. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bps_ble_bps.c.sisc
  80. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bps_ble_bps.h.sisc
  81. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_cscs.c.sisc
  82. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_cscs.h.sisc
  83. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_sc_ctrlpt.c.sisc
  84. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_sc_ctrlpt.h.sisc
  85. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cts_c_ble_cts_c.c.sisc
  86. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cts_c_ble_cts_c.h.sisc
  87. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu.c.sisc
  88. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu.h.sisc
  89. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu_bonded.c.sisc
  90. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu_unbonded.c.sisc
  91. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_ble_dis.c.sisc
  92. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_ble_dis.h.sisc
  93. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_c_ble_dis_c.c.sisc
  94. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_c_ble_dis_c.h.sisc
  95. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_escs_defs.h.sisc
  96. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_nrf_ble_escs.c.sisc
  97. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_nrf_ble_escs.h.sisc
  98. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls.c.sisc
  99. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls.h.sisc
  100. BIN
      IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls_db.c.sisc

+ 355 - 0
IES200RB.si4project/Backup/ble_nus(5553).c

@@ -0,0 +1,355 @@
+/**
+ * Copyright (c) 2012 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include "sdk_common.h"
+#if NRF_MODULE_ENABLED(BLE_NUS)
+#include "ble.h"
+#include "ble_nus.h"
+#include "ble_srv_common.h"
+
+#define NRF_LOG_MODULE_NAME ble_nus
+#if BLE_NUS_CONFIG_LOG_ENABLED
+#define NRF_LOG_LEVEL       BLE_NUS_CONFIG_LOG_LEVEL
+#define NRF_LOG_INFO_COLOR  BLE_NUS_CONFIG_INFO_COLOR
+#define NRF_LOG_DEBUG_COLOR BLE_NUS_CONFIG_DEBUG_COLOR
+#else // BLE_NUS_CONFIG_LOG_ENABLED
+#define NRF_LOG_LEVEL       0
+#endif // BLE_NUS_CONFIG_LOG_ENABLED
+#include "nrf_log.h"
+NRF_LOG_MODULE_REGISTER();
+
+
+#define BLE_UUID_NUS_TX_CHARACTERISTIC 0x0003               /**< The UUID of the TX Characteristic. */
+#define BLE_UUID_NUS_RX_CHARACTERISTIC 0x0002               /**< The UUID of the RX Characteristic. */
+
+#define BLE_NUS_MAX_RX_CHAR_LEN        BLE_NUS_MAX_DATA_LEN /**< Maximum length of the RX Characteristic (in bytes). */
+#define BLE_NUS_MAX_TX_CHAR_LEN        BLE_NUS_MAX_DATA_LEN /**< Maximum length of the TX Characteristic (in bytes). */
+
+#define NUS_BASE_UUID                  {{0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E}} /**< Used vendor specific UUID. */
+
+
+/**@brief Function for handling the @ref BLE_GAP_EVT_CONNECTED event from the SoftDevice.
+ *
+ * @param[in] p_nus     Nordic UART Service structure.
+ * @param[in] p_ble_evt Pointer to the event received from BLE stack.
+ */
+static void on_connect(ble_nus_t * p_nus, ble_evt_t const * p_ble_evt)
+{
+    ret_code_t                 err_code;
+    ble_nus_evt_t              evt;
+    ble_gatts_value_t          gatts_val;
+    uint8_t                    cccd_value[2];
+    ble_nus_client_context_t * p_client = NULL;
+
+    err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage,
+                                 p_ble_evt->evt.gap_evt.conn_handle,
+                                 (void *) &p_client);
+    if (err_code != NRF_SUCCESS)
+    {
+        NRF_LOG_ERROR("Link context for 0x%02X connection handle could not be fetched.",
+                      p_ble_evt->evt.gap_evt.conn_handle);
+    }
+
+    /* Check the hosts CCCD value to inform of readiness to send data using the RX characteristic */
+    memset(&gatts_val, 0, sizeof(ble_gatts_value_t));
+    gatts_val.p_value = cccd_value;
+    gatts_val.len     = sizeof(cccd_value);
+    gatts_val.offset  = 0;
+
+    err_code = sd_ble_gatts_value_get(p_ble_evt->evt.gap_evt.conn_handle,
+                                      p_nus->tx_handles.cccd_handle,
+                                      &gatts_val);
+
+    if ((err_code == NRF_SUCCESS)     &&
+        (p_nus->data_handler != NULL) &&
+        ble_srv_is_notification_enabled(gatts_val.p_value))
+    {
+        if (p_client != NULL)
+        {
+            p_client->is_notification_enabled = true;
+        }
+
+        memset(&evt, 0, sizeof(ble_nus_evt_t));
+        evt.type        = BLE_NUS_EVT_COMM_STARTED;
+        evt.p_nus       = p_nus;
+        evt.conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+        evt.p_link_ctx  = p_client;
+
+        p_nus->data_handler(&evt);
+    }
+}
+
+
+/**@brief Function for handling the @ref BLE_GATTS_EVT_WRITE event from the SoftDevice.
+ *
+ * @param[in] p_nus     Nordic UART Service structure.
+ * @param[in] p_ble_evt Pointer to the event received from BLE stack.
+ */
+static void on_write(ble_nus_t * p_nus, ble_evt_t const * p_ble_evt)
+{
+    ret_code_t                    err_code;
+    ble_nus_evt_t                 evt;
+    ble_nus_client_context_t    * p_client;
+    ble_gatts_evt_write_t const * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;
+
+    err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage,
+                                 p_ble_evt->evt.gatts_evt.conn_handle,
+                                 (void *) &p_client);
+    if (err_code != NRF_SUCCESS)
+    {
+        NRF_LOG_ERROR("Link context for 0x%02X connection handle could not be fetched.",
+                      p_ble_evt->evt.gatts_evt.conn_handle);
+    }
+
+    memset(&evt, 0, sizeof(ble_nus_evt_t));
+    evt.p_nus       = p_nus;
+    evt.conn_handle = p_ble_evt->evt.gatts_evt.conn_handle;
+    evt.p_link_ctx  = p_client;
+
+    if ((p_evt_write->handle == p_nus->tx_handles.cccd_handle) &&
+        (p_evt_write->len == 2))
+    {
+        if (p_client != NULL)
+        {
+            if (ble_srv_is_notification_enabled(p_evt_write->data))
+            {
+                p_client->is_notification_enabled = true;
+                evt.type                          = BLE_NUS_EVT_COMM_STARTED;
+            }
+            else
+            {
+                p_client->is_notification_enabled = false;
+                evt.type                          = BLE_NUS_EVT_COMM_STOPPED;
+            }
+
+            if (p_nus->data_handler != NULL)
+            {
+                p_nus->data_handler(&evt);
+            }
+
+        }
+    }
+    else if ((p_evt_write->handle == p_nus->rx_handles.value_handle) &&
+             (p_nus->data_handler != NULL))
+    {
+        evt.type                  = BLE_NUS_EVT_RX_DATA;
+        evt.params.rx_data.p_data = p_evt_write->data;
+        evt.params.rx_data.length = p_evt_write->len;
+
+        p_nus->data_handler(&evt);
+    }
+    else
+    {
+        // Do Nothing. This event is not relevant for this service.
+    }
+}
+
+
+/**@brief Function for handling the @ref BLE_GATTS_EVT_HVN_TX_COMPLETE event from the SoftDevice.
+ *
+ * @param[in] p_nus     Nordic UART Service structure.
+ * @param[in] p_ble_evt Pointer to the event received from BLE stack.
+ */
+static void on_hvx_tx_complete(ble_nus_t * p_nus, ble_evt_t const * p_ble_evt)
+{
+    ret_code_t                 err_code;
+    ble_nus_evt_t              evt;
+    ble_nus_client_context_t * p_client;
+
+    err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage,
+                                 p_ble_evt->evt.gatts_evt.conn_handle,
+                                 (void *) &p_client);
+    if (err_code != NRF_SUCCESS)
+    {
+        NRF_LOG_ERROR("Link context for 0x%02X connection handle could not be fetched.",
+                      p_ble_evt->evt.gatts_evt.conn_handle);
+        return;
+    }
+
+    if ((p_client->is_notification_enabled) && (p_nus->data_handler != NULL))
+    {
+        memset(&evt, 0, sizeof(ble_nus_evt_t));
+        evt.type        = BLE_NUS_EVT_TX_RDY;
+        evt.p_nus       = p_nus;
+        evt.conn_handle = p_ble_evt->evt.gatts_evt.conn_handle;
+        evt.p_link_ctx  = p_client;
+
+        p_nus->data_handler(&evt);
+    }
+}
+
+
+void ble_nus_on_ble_evt(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    if ((p_context == NULL) || (p_ble_evt == NULL))
+    {
+        return;
+    }
+
+    ble_nus_t * p_nus = (ble_nus_t *)p_context;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+        case BLE_GAP_EVT_CONNECTED:
+            on_connect(p_nus, p_ble_evt);
+			NRF_LOG_INFO("BLE_GAP_EVT_CONNECTED.");
+            break;
+
+        case BLE_GATTS_EVT_WRITE:
+            on_write(p_nus, p_ble_evt);
+            break;
+
+        case BLE_GATTS_EVT_HVN_TX_COMPLETE:
+            on_hvx_tx_complete(p_nus, p_ble_evt);
+            break;
+
+        default:
+            // No implementation needed.
+            break;
+    }
+}
+
+
+uint32_t ble_nus_init(ble_nus_t * p_nus, ble_nus_init_t const * p_nus_init)
+{
+    ret_code_t            err_code;
+    ble_uuid_t            ble_uuid;
+    ble_uuid128_t         nus_base_uuid = NUS_BASE_UUID;
+    ble_add_char_params_t add_char_params;
+
+    VERIFY_PARAM_NOT_NULL(p_nus);
+    VERIFY_PARAM_NOT_NULL(p_nus_init);
+
+    // Initialize the service structure.
+    p_nus->data_handler = p_nus_init->data_handler;
+
+    /**@snippet [Adding proprietary Service to the SoftDevice] */
+    // Add a custom base UUID.
+    err_code = sd_ble_uuid_vs_add(&nus_base_uuid, &p_nus->uuid_type);
+    VERIFY_SUCCESS(err_code);
+
+    ble_uuid.type = p_nus->uuid_type;
+    ble_uuid.uuid = BLE_UUID_NUS_SERVICE;
+
+    // Add the service.
+    err_code = sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY,
+                                        &ble_uuid,
+                                        &p_nus->service_handle);
+    /**@snippet [Adding proprietary Service to the SoftDevice] */
+    VERIFY_SUCCESS(err_code);
+
+    // Add the RX Characteristic.
+    memset(&add_char_params, 0, sizeof(add_char_params));
+    add_char_params.uuid                     = BLE_UUID_NUS_RX_CHARACTERISTIC;
+    add_char_params.uuid_type                = p_nus->uuid_type;
+    add_char_params.max_len                  = BLE_NUS_MAX_RX_CHAR_LEN;
+    add_char_params.init_len                 = sizeof(uint8_t);
+    add_char_params.is_var_len               = true;
+    add_char_params.char_props.write         = 1;
+    add_char_params.char_props.write_wo_resp = 1;
+
+    add_char_params.read_access  = SEC_OPEN;
+    add_char_params.write_access = SEC_OPEN;
+
+    err_code = characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->rx_handles);
+    if (err_code != NRF_SUCCESS)
+    {
+        return err_code;
+    }
+
+    // Add the TX Characteristic.
+    /**@snippet [Adding proprietary characteristic to the SoftDevice] */
+    memset(&add_char_params, 0, sizeof(add_char_params));
+    add_char_params.uuid              = BLE_UUID_NUS_TX_CHARACTERISTIC;
+    add_char_params.uuid_type         = p_nus->uuid_type;
+    add_char_params.max_len           = BLE_NUS_MAX_TX_CHAR_LEN;
+    add_char_params.init_len          = sizeof(uint8_t);
+    add_char_params.is_var_len        = true;
+    add_char_params.char_props.notify = 1;
+
+    add_char_params.read_access       = SEC_OPEN;
+    add_char_params.write_access      = SEC_OPEN;
+    add_char_params.cccd_write_access = SEC_OPEN;
+
+    return characteristic_add(p_nus->service_handle, &add_char_params, &p_nus->tx_handles);
+    /**@snippet [Adding proprietary characteristic to the SoftDevice] */
+}
+
+
+uint32_t ble_nus_data_send(ble_nus_t * p_nus,
+                           uint8_t   * p_data,
+                           uint16_t  * p_length,
+                           uint16_t    conn_handle)
+{
+    ret_code_t                 err_code;
+    ble_gatts_hvx_params_t     hvx_params;
+    ble_nus_client_context_t * p_client;
+
+    VERIFY_PARAM_NOT_NULL(p_nus);
+
+    err_code = blcm_link_ctx_get(p_nus->p_link_ctx_storage, conn_handle, (void *) &p_client);
+    VERIFY_SUCCESS(err_code);
+
+    if ((conn_handle == BLE_CONN_HANDLE_INVALID) || (p_client == NULL))
+    {
+        return NRF_ERROR_NOT_FOUND;
+    }
+
+    if (!p_client->is_notification_enabled)
+    {
+        return NRF_ERROR_INVALID_STATE;
+    }
+
+    if (*p_length > BLE_NUS_MAX_DATA_LEN)
+    {
+        return NRF_ERROR_INVALID_PARAM;
+    }
+
+    memset(&hvx_params, 0, sizeof(hvx_params));
+
+    hvx_params.handle = p_nus->tx_handles.value_handle;
+    hvx_params.p_data = p_data;
+    hvx_params.p_len  = p_length;
+    hvx_params.type   = BLE_GATT_HVX_NOTIFICATION;
+
+    return sd_ble_gatts_hvx(conn_handle, &hvx_params);
+}
+
+
+#endif // NRF_MODULE_ENABLED(BLE_NUS)

+ 476 - 0
IES200RB.si4project/Backup/dio(3774).c

@@ -0,0 +1,476 @@
+/**
+  ******************************************************************************
+  * @file    dio.c
+  * @author  hskim
+  * @version v0.7
+  * @date    2019-06-07
+  * @brief   This file provides Digital Input and Output's fuction.
+  ******************************************************************************
+  */
+
+
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "pca10040.h"
+#include "dio.h"
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "sysmgr.h"
+
+#include "main.h"
+
+
+
+uint8_t BT5ButtonList[2] = BUTTONS_LIST;
+
+
+stHSDOut HSDOut[3];
+stHSDIOTask HSDIOTask;
+
+
+uint32_t TimeSlice[10];
+static int TS = 0;
+
+
+stHSDIn DIn[2];
+
+
+void DioTask()
+{
+	DITask();
+}
+
+
+
+
+int DITask()
+{
+	int i;
+	uint16_t readDI;
+
+	if( HSDIOTask.DIRunFlag < HSDIOTask.DIRunPeriodTime )
+		return 0;
+	HSDIOTask.DIRunFlag = 0;
+
+	for( i=0; i<1; i++)
+	{
+		//DInput[i].in  = (uint8_t)HAL_GPIO_ReadPin(DIPinMap[i].Port,  DIPinMap[i].Pin);
+		//if( DIPinMap[i].HighActive == LowActive )
+		//	DInput[i].in = ~DInput[i].in&0x01;
+	}
+
+    return 0;
+}
+
+
+
+
+
+
+int DOTask()
+{
+
+#if 0
+	int i;
+	int DoIndex;
+
+	if( !HSDIOTask.RunFlag )
+		return 0;
+	HSDIOTask.RunFlag = 0;
+
+	HSDOutProcess(DOut, DOPinMap, 21 );
+#endif
+
+    return 0;
+
+}
+
+
+
+
+
+void HSDInInit()
+{
+
+
+    uint32_t i;
+    for (i = 0; i < BUTTONS_NUMBER; ++i)
+    {
+        nrf_gpio_cfg_input(BT5ButtonList[i], BUTTON_PULL);
+    }
+
+	HSDIOTask.DIRunPeriodTime = 25;
+	HSDIOTask.DISecCount =1000/HSDIOTask.DIRunPeriodTime;
+
+
+	DIn[0].Pressed		 = Key_0_Pressed;
+	DIn[0].Released		 = Key_0_Released;
+	DIn[1].Pressed		 = Key_1_Pressed;
+	DIn[1].Released		 = Key_1_Released;
+
+	DIn[0].longPressTimeOne = 5;	//jakuja 
+	DIn[0].LongPressedOne	= DevRegLongPressedOne;
+
+#if 0	
+	DIn[2].Pressed		 = Key_2_Pressed;
+	DIn[2].Released		 = Key_2_Released;
+	DIn[3].Pressed		 = Key_3_Pressed;
+	DIn[3].Released		 = Key_3_Released;
+	DIn[4].Pressed		 = Key_4_Pressed;
+	DIn[4].Released		 = Key_4_Released;
+#endif
+
+
+}
+
+
+
+
+
+
+void HSDInRun()
+{
+	
+	int Len;
+
+	int DiIndex;
+
+	for( DiIndex=0; DiIndex<BUTTONS_NUMBER; DiIndex++)
+	{
+		if( nrf_gpio_pin_read(BT5ButtonList[DiIndex]) == false)		// BUTTON PUSH
+		{
+			DIn[DiIndex].in = 1;
+			
+			if( DIn[DiIndex].softRelease == 1 )
+			{
+				return;
+			}
+
+
+			if( DIn[DiIndex].onFlag == 0 )
+			{
+				DIn[DiIndex].pressCount++;
+				DIn[DiIndex].Pressed(&DIn[DiIndex]);
+				
+//				NRF_LOG_INFO("==> Key_%d Pressed", BT5ButtonList[DiIndex]);
+				
+			}else{
+
+				if( DIn[DiIndex].longPressTimeKeep != 0 )
+				{
+					if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeKeep )
+					{
+						DIn[DiIndex].LongPressedKeep(&DIn[DiIndex]);
+					}
+				}
+
+				if( DIn[1].pressTime == 20 )		//pressTime 25ms Tick
+				{
+					if( DIn[0].onFlag == 0 )
+						Trigger_Emg();
+					else{
+						Trigger_DUF();
+					}
+				}
+
+				if( DIn[DiIndex].pressTime % HSDIOTask.DISecCount == 0 )	// count up 0.5 sec
+				{
+					DIn[DiIndex].pressedSec++;
+
+
+					if( DIn[0].onFlag == 1 && DIn[1].pressedSec == 2 )
+					{
+						;
+					}
+
+					if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <= 5 )		//pressTime 25ms Tick
+					{
+						SystemTimer.SEND_TIMER = 0;
+					}
+
+					if( DIn[0].pressedSec == 5 )
+					{
+						Trigger_RegDev();
+					}
+
+
+					if( DIn[DiIndex].longPressTimeOne != 0 )
+					{
+						if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeOne )
+						{
+							DIn[DiIndex].longPressCount++;
+							DIn[DiIndex].softRelease = 1;
+							DIn[DiIndex].LongPressedOne(&DIn[DiIndex]);
+							
+//							NRF_LOG_INFO("==> Key_%d LongPressedOne", BT5ButtonList[DiIndex]);
+						}
+					}
+				}
+			}
+			
+			DIn[DiIndex].onFlag = 1;
+			DIn[DiIndex].pressTime++;
+
+		}else{
+
+
+			if( DIn[DiIndex].onFlag == 1 )
+			{
+				if( DiIndex == 0 )						// TEST BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[0].pressTime >= 2 && DIn[0].pressTime < 100 ){
+						if( SystemManager.FWUpdate == 0 )
+							Trigger_LineTest();
+					}else{
+//						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+					
+						
+					}
+				}
+
+				if( DiIndex == 1 )						// EMG BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[1].pressTime < 25 ){
+//						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+				
+						
+					}
+				}
+
+				DIn[DiIndex].Released(&DIn[DiIndex]);
+
+//				NRF_LOG_INFO("==> Key_%d Released", BT5ButtonList[DiIndex]);
+			}
+
+			
+			DIn[DiIndex].in = 0;
+			DIn[DiIndex].pressTime = 0;
+			DIn[DiIndex].onFlag = 0;
+			DIn[DiIndex].pressedSec = 0;
+			DIn[DiIndex].softRelease = 0;
+			DIn[DiIndex].prevTime = 0;
+
+		}
+
+	}
+
+}
+
+
+
+
+
+void Trigger_Emg()
+{
+
+	NRF_LOG_INFO("# EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+	if(!advertising_flag)
+		advertising_start();
+	
+	Buzzer_Select(BUZZER_EMG);
+
+}
+
+
+void Trigger_LineTest()
+{
+
+	NRF_LOG_INFO("# Test Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+
+	Buzzer_Select(BUZZER_TEST);
+
+}
+
+
+void Trigger_RegDev()
+{
+
+	NRF_LOG_INFO("# DevReg Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_REG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+	Buzzer_Select(BUZZER_REG);
+
+}
+
+
+void Trigger_DUF()
+{
+	NRF_LOG_INFO("# DevReg Pressed");
+
+	SystemTimer.SEND_TIMER = 0; 					
+	SystemManager.FWUpdate = 1;
+	Buzzer_Select(BUZZER_BOOT_LOADER);
+}
+
+
+
+char Key1Flag = 0;
+
+void Key_0_Pressed(stHSDIn* pDin)
+{
+
+
+	Key1Flag = 0;
+
+	
+
+}
+
+void Key_0_Released(stHSDIn* pDin)
+{
+
+	if( DIn[0].pressedSec < 1 )//jakuja 
+		return;
+
+
+	
+	
+	if( Key1Flag == 1 )
+		return;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	NRF_LOG_INFO("@@@@@@@ Test Pressed");
+
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+void DevRegLongPressedOne(stHSDIn* pDin)
+{
+
+	Key1Flag = 1;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_REG;
+
+	
+	NRF_LOG_INFO("@@@@@@@ DevReg Pressed");
+	
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+
+}
+
+
+
+
+void Key_1_Pressed(stHSDIn* pDin)
+{
+
+	if( DIn[0].onFlag == 1 )
+	{
+		SystemManager.FWUpdate = 1;
+		Buzzer_Select(BUZZER_BOOT_LOADER);
+	}
+	
+}
+
+void Key_1_Released(stHSDIn* pDin)
+{
+
+	if( DIn[1].pressedSec < 1 )//jakuja 
+		return;
+	
+#if 0
+	NRF_LOG_INFO("@@@@@@@ EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+
+
+
+
+
+#if 0
+void Key_2_Pressed(stHSDIn* pDin)
+{
+	uint8_t sendKey[2];
+	sendKey[0] = 0x51;	
+	 keys_send(1, &sendKey[0]);
+	
+}
+
+void Key_2_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_2_Released");
+
+}
+
+
+void Key_3_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Pressed");
+
+}
+
+void Key_3_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Released");
+
+}
+
+
+
+void Key_4_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Pressed");
+}//
+
+void Key_4_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Released");
+}
+#endif

+ 206 - 0
IES200RB.si4project/Backup/dio(5579).h

@@ -0,0 +1,206 @@
+
+#ifndef __HS_DIO_H
+#define __HS_DIO_H
+
+
+
+
+typedef enum
+{
+	LowActive = 0,
+	HighActive
+}LowHighActive;
+
+
+
+
+
+
+
+
+
+struct stHSDIOTask__{
+
+	char DORunFlag;
+	char DIRunFlag;
+	unsigned char DISecCount;
+
+	int DORunPeriodTime;
+	int DIRunPeriodTime;
+
+
+
+};
+typedef struct stHSDIOTask__ stHSDIOTask;
+
+
+
+
+
+typedef struct stHSDIn__{
+	unsigned char in;
+	unsigned char onFlag;
+	unsigned char softRelease;
+	unsigned char pressedSec;
+	//unsigned char SecCount;
+	unsigned int  pressTime;
+	unsigned int  longPressTimeOne;
+	unsigned int  longPressTimeKeep;
+	unsigned int  prevTime;
+
+
+	unsigned int pressCount;
+	unsigned int longPressCount;
+
+
+	void (*Pressed)(struct stHSDIn__*);
+	void (*Released)(struct stHSDIn__*);
+	void (*LongPressedOne)(struct stHSDIn__*);
+	void (*LongPressedKeep)(struct stHSDIn__*);
+
+
+}stHSDIn;
+
+
+
+
+
+struct stHSDOut__{
+	uint8_t Mode;	// 1:Normal,  2:Repeate,  3:Toggle
+	uint8_t LimitMode;
+	uint8_t Trigger;
+	uint8_t Out;
+	uint8_t Run;
+	uint8_t StartFalg;
+	uint8_t Err;
+
+	uint8_t DischageEnable;
+	int DischargeTimer;
+
+	int32_t AliveTimer;
+	int32_t AliveCounter;	// Not used : -1
+
+	int32_t OnDelay;
+	int32_t StopFuncDelay;
+	int32_t StopFuncDelaySet;
+	int32_t RefleshTime;
+	int32_t OnTime;
+	int32_t OffTime;
+	int32_t PulseCounter;
+	
+
+	int32_t UpdateTime;	// MODE3-timer for on/off switching    MODE1-Trigger Repeat
+	uint32_t PrevTick;
+	void (*StartFunc)(struct stHSDOut__*);
+	void (*StopFunc)(struct stHSDOut__*);
+	void (*OptFunc)(struct stHSDOut__*);
+	void (*UpdateFunc)(struct stHSDOut__*);
+};
+typedef struct stHSDOut__ stHSDOut;
+
+
+
+
+
+int DITask();
+int DOTask();
+void DioTask();
+
+#if 0
+void HSDataBitInit();
+void HSDOutInit();
+void HSDOutProcess(stHSDOut* DOut, const stDIOPortMap* PinMap, int Len);
+void HSDInInit();
+void HSDInRun(stHSDIn* DIn, const stDIOPortMap* PinMap, int Len);
+void HOT_1_Init( char output );
+void HSDataBitInRun(stHSDIn* DIn, uint32_t DataBit, int Len);
+
+
+void HSDOut_0_Start(stHSDOut* pDout);
+void HSDOut_0_Stop(stHSDOut* pDout);
+void HSDOut_0_Opt(stHSDOut* pDout);
+void HSDOut_1_Start(stHSDOut* pDout);
+void HSDOut_1_Stop(stHSDOut* pDout);
+void HSDOut_1_Opt(stHSDOut* pDout);
+void HSDOut_2_Start(stHSDOut* pDout);
+void HSDOut_2_Stop(stHSDOut* pDout);
+void HSDOut_2_Opt(stHSDOut* pDout);
+#endif
+
+
+
+
+
+void Key_0_Pressed(stHSDIn* pDin);
+void Key_0_Released(stHSDIn* pDin);
+void Key_1_Pressed(stHSDIn* pDin);
+void Key_1_Released(stHSDIn* pDin);
+void Key_2_Pressed(stHSDIn* pDin);
+void Key_2_Released(stHSDIn* pDin);
+void Key_3_Pressed(stHSDIn* pDin);
+void Key_3_Released(stHSDIn* pDin);
+void Key_4_Pressed(stHSDIn* pDin);
+void Key_4_Released(stHSDIn* pDin);
+void DevRegLongPressedOne(stHSDIn* pDin);
+
+void TriggerEmg();
+void TriggerLineTest();
+void TriggerRegDev();
+
+
+
+
+#if 0
+
+
+void Key_5_Pressed(stHSDIn* pDin);
+void Key_5_Released(stHSDIn* pDin);
+void Key_6_Pressed(stHSDIn* pDin);
+void Key_6_Released(stHSDIn* pDin);
+void Key_7_Pressed(stHSDIn* pDin);
+void Key_7_Released(stHSDIn* pDin);
+void Key_8_Pressed(stHSDIn* pDin);
+void Key_8_Released(stHSDIn* pDin);
+void Key_9_Pressed(stHSDIn* pDin);
+void Key_9_Released(stHSDIn* pDin);
+void Key_10_Pressed(stHSDIn* pDin);
+void Key_10_Released(stHSDIn* pDin);
+void Key_11_Pressed(stHSDIn* pDin);
+void Key_11_Released(stHSDIn* pDin);
+void Key_12_Pressed(stHSDIn* pDin);
+void Key_12_Released(stHSDIn* pDin);
+void Key_13_Pressed(stHSDIn* pDin);
+void Key_13_Released(stHSDIn* pDin);
+void Key_14_Pressed(stHSDIn* pDin);
+void Key_14_Released(stHSDIn* pDin);
+void Key_15_Pressed(stHSDIn* pDin);
+void Key_15_Released(stHSDIn* pDin);
+void Key_16_Pressed(stHSDIn* pDin);
+void Key_16_Released(stHSDIn* pDin);
+void Key_17_Pressed(stHSDIn* pDin);
+void Key_17_Released(stHSDIn* pDin);
+#endif
+
+
+
+
+
+
+extern uint32_t ADCCurrent[];
+extern uint32_t ADCCurrentPos;
+extern float SetAmp;
+extern char SetAmpUpdate;
+
+
+extern stHSDOut HSDOut[];
+extern stHSDIOTask HSDIOTask;
+
+
+extern uint32_t TimeSlice[];
+extern char Key1Flag;
+
+extern void Buzzer_Select(uint8_t state);
+
+
+
+#endif

+ 479 - 0
IES200RB.si4project/Backup/dio(5758).c

@@ -0,0 +1,479 @@
+/**
+  ******************************************************************************
+  * @file    dio.c
+  * @author  hskim
+  * @version v0.7
+  * @date    2019-06-07
+  * @brief   This file provides Digital Input and Output's fuction.
+  ******************************************************************************
+  */
+
+
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "pca10040.h"
+#include "dio.h"
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "sysmgr.h"
+
+#include "main.h"
+
+
+
+uint8_t BT5ButtonList[2] = BUTTONS_LIST;
+
+
+stHSDOut HSDOut[3];
+stHSDIOTask HSDIOTask;
+
+
+uint32_t TimeSlice[10];
+static int TS = 0;
+
+
+stHSDIn DIn[2];
+
+
+void DioTask()
+{
+	DITask();
+}
+
+
+
+
+int DITask()
+{
+	int i;
+	uint16_t readDI;
+
+	if( HSDIOTask.DIRunFlag < HSDIOTask.DIRunPeriodTime )
+		return 0;
+	HSDIOTask.DIRunFlag = 0;
+
+	for( i=0; i<1; i++)
+	{
+		//DInput[i].in  = (uint8_t)HAL_GPIO_ReadPin(DIPinMap[i].Port,  DIPinMap[i].Pin);
+		//if( DIPinMap[i].HighActive == LowActive )
+		//	DInput[i].in = ~DInput[i].in&0x01;
+	}
+
+    return 0;
+}
+
+
+
+
+
+
+int DOTask()
+{
+
+#if 0
+	int i;
+	int DoIndex;
+
+	if( !HSDIOTask.RunFlag )
+		return 0;
+	HSDIOTask.RunFlag = 0;
+
+	HSDOutProcess(DOut, DOPinMap, 21 );
+#endif
+
+    return 0;
+
+}
+
+
+
+
+
+void HSDInInit()
+{
+
+
+    uint32_t i;
+    for (i = 0; i < BUTTONS_NUMBER; ++i)
+    {
+        nrf_gpio_cfg_input(BT5ButtonList[i], BUTTON_PULL);
+    }
+
+	HSDIOTask.DIRunPeriodTime = 25;
+	HSDIOTask.DISecCount =1000/HSDIOTask.DIRunPeriodTime;
+
+
+	DIn[0].Pressed		 = Key_0_Pressed;
+	DIn[0].Released		 = Key_0_Released;
+	DIn[1].Pressed		 = Key_1_Pressed;
+	DIn[1].Released		 = Key_1_Released;
+
+	DIn[0].longPressTimeOne = 5;	//jakuja 
+	DIn[0].LongPressedOne	= DevRegLongPressedOne;
+
+#if 0	
+	DIn[2].Pressed		 = Key_2_Pressed;
+	DIn[2].Released		 = Key_2_Released;
+	DIn[3].Pressed		 = Key_3_Pressed;
+	DIn[3].Released		 = Key_3_Released;
+	DIn[4].Pressed		 = Key_4_Pressed;
+	DIn[4].Released		 = Key_4_Released;
+#endif
+
+
+}
+
+
+
+
+
+
+void HSDInRun()
+{
+	
+	int Len;
+
+	int DiIndex;
+
+	for( DiIndex=0; DiIndex<BUTTONS_NUMBER; DiIndex++)
+	{
+		if( nrf_gpio_pin_read(BT5ButtonList[DiIndex]) == false)		// BUTTON PUSH
+		{
+			DIn[DiIndex].in = 1;
+			
+			if( DIn[DiIndex].softRelease == 1 )
+			{
+				return;
+			}
+
+
+			if( DIn[DiIndex].onFlag == 0 )
+			{
+				DIn[DiIndex].pressCount++;
+				DIn[DiIndex].Pressed(&DIn[DiIndex]);
+				
+				NRF_LOG_INFO("==> Key_%d Pressed", BT5ButtonList[DiIndex]);
+				
+			}else{
+
+				if( DIn[DiIndex].longPressTimeKeep != 0 )
+				{
+					if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeKeep )
+					{
+						DIn[DiIndex].LongPressedKeep(&DIn[DiIndex]);
+					}
+				}
+
+				if( DIn[1].pressTime == 20 )		//pressTime 25ms Tick
+				{
+					if( DIn[0].onFlag == 0 )
+						Trigger_Emg();
+					else{
+						Trigger_DUF();
+					}
+				}
+
+				if( DIn[DiIndex].pressTime % HSDIOTask.DISecCount == 0 )	// count up 0.5 sec
+				{
+					DIn[DiIndex].pressedSec++;
+
+
+					if( DIn[0].onFlag == 1 && DIn[1].pressedSec == 2 )
+					{
+
+						//SystemTimer.SEND_TIMER = 0;						
+						//SystemManager.FWUpdate = 1;
+						//Buzzer_Select(4);
+					}
+
+					if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <= 5 )		//pressTime 25ms Tick
+					{
+						SystemTimer.SEND_TIMER = 0;
+					}
+
+					if( DIn[0].pressedSec == 5 )
+					{
+						Trigger_RegDev();
+					}
+
+
+					if( DIn[DiIndex].longPressTimeOne != 0 )
+					{
+						if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeOne )
+						{
+							DIn[DiIndex].longPressCount++;
+							DIn[DiIndex].softRelease = 1;
+							DIn[DiIndex].LongPressedOne(&DIn[DiIndex]);
+							
+							NRF_LOG_INFO("==> Key_%d LongPressedOne", BT5ButtonList[DiIndex]);
+						}
+					}
+				}
+			}
+			
+			DIn[DiIndex].onFlag = 1;
+			DIn[DiIndex].pressTime++;
+
+		}else{
+
+
+			if( DIn[DiIndex].onFlag == 1 )
+			{
+				if( DiIndex == 0 )						// TEST BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[0].pressTime >= 2 && DIn[0].pressTime < 100 ){
+						if( SystemManager.FWUpdate == 0 )
+							Trigger_LineTest();
+					}else{
+						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+					
+						
+					}
+				}
+
+				if( DiIndex == 1 )						// EMG BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[1].pressTime < 25 ){
+						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+				
+						
+					}
+				}
+
+				DIn[DiIndex].Released(&DIn[DiIndex]);
+
+				NRF_LOG_INFO("==> Key_%d Released", BT5ButtonList[DiIndex]);
+			}
+
+			
+			DIn[DiIndex].in = 0;
+			DIn[DiIndex].pressTime = 0;
+			DIn[DiIndex].onFlag = 0;
+			DIn[DiIndex].pressedSec = 0;
+			DIn[DiIndex].softRelease = 0;
+			DIn[DiIndex].prevTime = 0;
+
+		}
+
+	}
+
+}
+
+
+
+
+
+void Trigger_Emg()
+{
+
+	NRF_LOG_INFO("# EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+	if(!advertising_flag)
+		advertising_start();
+	
+	Buzzer_Select(BUZZER_EMG);
+
+}
+
+
+void Trigger_LineTest()
+{
+
+	NRF_LOG_INFO("# Test Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+
+	Buzzer_Select(BUZZER_TEST);
+
+}
+
+
+void Trigger_RegDev()
+{
+
+	NRF_LOG_INFO("# DevReg Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_REG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+	Buzzer_Select(BUZZER_REG);
+
+}
+
+
+void Trigger_DUF()
+{
+	NRF_LOG_INFO("# DevReg Pressed");
+
+	SystemTimer.SEND_TIMER = 0; 					
+	SystemManager.FWUpdate = 1;
+	Buzzer_Select(BUZZER_BOOT_LOADER);
+}
+
+
+
+char Key1Flag = 0;
+
+void Key_0_Pressed(stHSDIn* pDin)
+{
+
+
+	Key1Flag = 0;
+
+	
+
+}
+
+void Key_0_Released(stHSDIn* pDin)
+{
+
+	if( DIn[0].pressedSec < 1 )//jakuja 
+		return;
+
+
+	
+	
+	if( Key1Flag == 1 )
+		return;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	NRF_LOG_INFO("@@@@@@@ Test Pressed");
+
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+void DevRegLongPressedOne(stHSDIn* pDin)
+{
+
+	Key1Flag = 1;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_REG;
+
+	
+	NRF_LOG_INFO("@@@@@@@ DevReg Pressed");
+	
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+
+}
+
+
+
+
+void Key_1_Pressed(stHSDIn* pDin)
+{
+
+	if( DIn[0].onFlag == 1 )
+	{
+		SystemManager.FWUpdate = 1;
+		Buzzer_Select(BUZZER_BOOT_LOADER);
+	}
+	
+}
+
+void Key_1_Released(stHSDIn* pDin)
+{
+
+	if( DIn[1].pressedSec < 1 )//jakuja 
+		return;
+	
+#if 0
+	NRF_LOG_INFO("@@@@@@@ EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+
+
+
+
+
+#if 0
+void Key_2_Pressed(stHSDIn* pDin)
+{
+	uint8_t sendKey[2];
+	sendKey[0] = 0x51;	
+	 keys_send(1, &sendKey[0]);
+	
+}
+
+void Key_2_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_2_Released");
+
+}
+
+
+void Key_3_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Pressed");
+
+}
+
+void Key_3_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Released");
+
+}
+
+
+
+void Key_4_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Pressed");
+}//
+
+void Key_4_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Released");
+}
+#endif

+ 474 - 0
IES200RB.si4project/Backup/dio(6619).c

@@ -0,0 +1,474 @@
+/**
+  ******************************************************************************
+  * @file    dio.c
+  * @author  hskim
+  * @version v0.7
+  * @date    2019-06-07
+  * @brief   This file provides Digital Input and Output's fuction.
+  ******************************************************************************
+  */
+
+
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "pca10040.h"
+#include "dio.h"
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "sysmgr.h"
+
+#include "main.h"
+
+
+
+uint8_t BT5ButtonList[2] = BUTTONS_LIST;
+
+
+stHSDOut HSDOut[3];
+stHSDIOTask HSDIOTask;
+
+
+uint32_t TimeSlice[10];
+static int TS = 0;
+
+
+stHSDIn DIn[2];
+
+
+void DioTask()
+{
+	DITask();
+}
+
+
+
+
+int DITask()
+{
+	int i;
+	uint16_t readDI;
+
+	if( HSDIOTask.DIRunFlag < HSDIOTask.DIRunPeriodTime )
+		return 0;
+	HSDIOTask.DIRunFlag = 0;
+
+	for( i=0; i<1; i++)
+	{
+		//DInput[i].in  = (uint8_t)HAL_GPIO_ReadPin(DIPinMap[i].Port,  DIPinMap[i].Pin);
+		//if( DIPinMap[i].HighActive == LowActive )
+		//	DInput[i].in = ~DInput[i].in&0x01;
+	}
+
+    return 0;
+}
+
+
+
+
+
+
+int DOTask()
+{
+
+#if 0
+	int i;
+	int DoIndex;
+
+	if( !HSDIOTask.RunFlag )
+		return 0;
+	HSDIOTask.RunFlag = 0;
+
+	HSDOutProcess(DOut, DOPinMap, 21 );
+#endif
+
+    return 0;
+
+}
+
+
+
+
+
+void HSDInInit()
+{
+
+
+    uint32_t i;
+    for (i = 0; i < BUTTONS_NUMBER; ++i)
+    {
+        nrf_gpio_cfg_input(BT5ButtonList[i], BUTTON_PULL);
+    }
+
+	HSDIOTask.DIRunPeriodTime = 25;
+	HSDIOTask.DISecCount =1000/HSDIOTask.DIRunPeriodTime;
+
+
+	DIn[0].Pressed		 = Key_0_Pressed;
+	DIn[0].Released		 = Key_0_Released;
+	DIn[1].Pressed		 = Key_1_Pressed;
+	DIn[1].Released		 = Key_1_Released;
+
+	DIn[0].longPressTimeOne = 5;	//jakuja 
+	DIn[0].LongPressedOne	= DevRegLongPressedOne;
+
+#if 0	
+	DIn[2].Pressed		 = Key_2_Pressed;
+	DIn[2].Released		 = Key_2_Released;
+	DIn[3].Pressed		 = Key_3_Pressed;
+	DIn[3].Released		 = Key_3_Released;
+	DIn[4].Pressed		 = Key_4_Pressed;
+	DIn[4].Released		 = Key_4_Released;
+#endif
+
+
+}
+
+
+
+
+
+
+void HSDInRun()
+{
+	
+	int Len;
+
+	int DiIndex;
+
+	for( DiIndex=0; DiIndex<BUTTONS_NUMBER; DiIndex++)
+	{
+		if( nrf_gpio_pin_read(BT5ButtonList[DiIndex]) == false)		// BUTTON PUSH
+		{
+			DIn[DiIndex].in = 1;
+			
+			if( DIn[DiIndex].softRelease == 1 )
+			{
+				return;
+			}
+
+
+			if( DIn[DiIndex].onFlag == 0 )
+			{
+				DIn[DiIndex].pressCount++;
+				DIn[DiIndex].Pressed(&DIn[DiIndex]);
+				
+				NRF_LOG_INFO("==> Key_%d Pressed", BT5ButtonList[DiIndex]);
+				
+			}else{
+
+				if( DIn[DiIndex].longPressTimeKeep != 0 )
+				{
+					if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeKeep )
+					{
+						DIn[DiIndex].LongPressedKeep(&DIn[DiIndex]);
+					}
+				}
+
+				if( DIn[1].pressTime == 20 )		//pressTime 25ms Tick
+				{
+					if( DIn[0].onFlag == 0 )
+						TriggerEmg();
+					else{
+						SystemTimer.SEND_TIMER = 0;						
+						SystemManager.FWUpdate = 1;
+						Buzzer_Select(BUZZER_BOOT_LOADER);
+					}
+				}
+
+				if( DIn[DiIndex].pressTime % HSDIOTask.DISecCount == 0 )	// count up 0.5 sec
+				{
+					DIn[DiIndex].pressedSec++;
+
+
+					if( DIn[0].onFlag == 1 && DIn[1].pressedSec == 2 )
+					{
+
+						//SystemTimer.SEND_TIMER = 0;						
+						//SystemManager.FWUpdate = 1;
+						//Buzzer_Select(4);
+					}
+
+					if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <= 5 )		//pressTime 25ms Tick
+					{
+						SystemTimer.SEND_TIMER = 0;
+					}
+
+					if( DIn[0].pressedSec == 5 )
+					{
+						TriggerRegDev();
+					}
+
+
+					if( DIn[DiIndex].longPressTimeOne != 0 )
+					{
+						if( DIn[DiIndex].pressedSec >= DIn[DiIndex].longPressTimeOne )
+						{
+							DIn[DiIndex].longPressCount++;
+							DIn[DiIndex].softRelease = 1;
+							DIn[DiIndex].LongPressedOne(&DIn[DiIndex]);
+							
+							NRF_LOG_INFO("==> Key_%d LongPressedOne", BT5ButtonList[DiIndex]);
+						}
+					}
+				}
+			}
+			
+			DIn[DiIndex].onFlag = 1;
+			DIn[DiIndex].pressTime++;
+
+		}else{
+
+
+			if( DIn[DiIndex].onFlag == 1 )
+			{
+				if( DiIndex == 0 )						// TEST BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[0].pressTime >= 2 && DIn[0].pressTime < 100 ){
+						if( SystemManager.FWUpdate == 0 )
+							TriggerLineTest();
+					}else{
+						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+					
+						
+					}
+				}
+
+				if( DiIndex == 1 )						// EMG BUTTON
+				{
+					//if( DIn[0].pressedSec >= 1 && DIn[0].pressedSec <5 )
+					if( DIn[1].pressTime < 25 ){
+						NRF_LOG_INFO("$$$ Key_%d Released", BT5ButtonList[DiIndex]);
+
+						DIn[DiIndex].in = 0;
+						DIn[DiIndex].pressTime = 0;
+						DIn[DiIndex].onFlag = 0;
+						DIn[DiIndex].pressedSec = 0;
+						DIn[DiIndex].softRelease = 0;
+						DIn[DiIndex].prevTime = 0;
+				
+						
+					}
+				}
+
+				DIn[DiIndex].Released(&DIn[DiIndex]);
+
+				NRF_LOG_INFO("==> Key_%d Released", BT5ButtonList[DiIndex]);
+			}
+
+			
+			DIn[DiIndex].in = 0;
+			DIn[DiIndex].pressTime = 0;
+			DIn[DiIndex].onFlag = 0;
+			DIn[DiIndex].pressedSec = 0;
+			DIn[DiIndex].softRelease = 0;
+			DIn[DiIndex].prevTime = 0;
+
+		}
+
+	}
+
+}
+
+
+
+
+
+void TriggerEmg()
+{
+
+	NRF_LOG_INFO("@@@@@@@ EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+	if(!advertising_flag)
+		advertising_start();
+	
+	Buzzer_Select(BUZZER_EMG);
+
+}
+
+
+void TriggerLineTest()
+{
+
+	NRF_LOG_INFO("@@@@@@@ Test Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+
+	Buzzer_Select(BUZZER_TEST);
+
+}
+
+
+void TriggerRegDev()
+{
+
+	NRF_LOG_INFO("@@@@@@@ DevReg Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_REG;
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+	if(!advertising_flag)
+		advertising_start();
+
+
+	Buzzer_Select(BUZZER_REG);
+
+}
+
+
+
+
+
+char Key1Flag = 0;
+
+void Key_0_Pressed(stHSDIn* pDin)
+{
+
+
+	Key1Flag = 0;
+
+	
+
+}
+
+void Key_0_Released(stHSDIn* pDin)
+{
+
+	if( DIn[0].pressedSec < 1 )//jakuja 
+		return;
+
+
+	
+	
+	if( Key1Flag == 1 )
+		return;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_TEST;
+	NRF_LOG_INFO("@@@@@@@ Test Pressed");
+
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+void DevRegLongPressedOne(stHSDIn* pDin)
+{
+
+	Key1Flag = 1;
+
+#if 0	
+	SystemManager.EmgSendButton = BUTTON_REG;
+
+	
+	NRF_LOG_INFO("@@@@@@@ DevReg Pressed");
+	
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+
+}
+
+
+
+
+void Key_1_Pressed(stHSDIn* pDin)
+{
+
+	if( DIn[0].onFlag == 1 )
+	{
+		SystemManager.FWUpdate = 1;
+		Buzzer_Select(BUZZER_BOOT_LOADER);
+	}
+	
+}
+
+void Key_1_Released(stHSDIn* pDin)
+{
+
+	if( DIn[1].pressedSec < 1 )//jakuja 
+		return;
+	
+#if 0
+	NRF_LOG_INFO("@@@@@@@ EMG Pressed");
+
+	SystemManager.EmgSendButton = BUTTON_EMG;
+	SystemTimer.SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+#endif
+
+}
+
+
+
+
+
+
+#if 0
+void Key_2_Pressed(stHSDIn* pDin)
+{
+	uint8_t sendKey[2];
+	sendKey[0] = 0x51;	
+	 keys_send(1, &sendKey[0]);
+	
+}
+
+void Key_2_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_2_Released");
+
+}
+
+
+void Key_3_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Pressed");
+
+}
+
+void Key_3_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_3_Released");
+
+}
+
+
+
+void Key_4_Pressed(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Pressed");
+}//
+
+void Key_4_Released(stHSDIn* pDin)
+{
+	//NRF_LOG_INFO("Key_4_Released");
+}
+#endif

+ 62 - 0
IES200RB.si4project/Backup/main(1019).h

@@ -0,0 +1,62 @@
+
+#ifndef __MAIN_H
+#define __MAIN_H
+
+
+
+
+#define VER_HIGH_VALUE	1
+#define VER_LOW_VALUE	1
+
+
+#define	BATTERY_LOW_LEVEL	23
+
+
+
+#define IES200_1ST_MAC	0x44
+#define IES200_2ST_MAC	0x33
+#define IES200_3ST_MAC	0xC0
+
+
+#define BUTTON_NONE		0
+#define BUTTON_EMG		1
+#define BUTTON_TEST		2
+#define BUTTON_REG		3
+#define BUTTON_ALIVE	5
+
+
+
+#define BUZZER_NONE	0
+#define BUZZER_EMG	1
+#define BUZZER_TEST	2
+#define BUZZER_REG	3
+#define BUZZER_BOOT_LOADER	4
+#define BUZZER_POWER_ON		5
+
+
+
+
+#define COMMAND_LENGTH	17
+
+#define COMMAND_TYPE	0x74
+
+#define COMMAND_EMG		0x01
+#define COMMAND_TEST	0x02
+#define COMMAND_ALIVE	0x04
+#define COMMAND_REG		0x03
+
+
+#define RUN_TIME_LIMIT		10000		//10sec
+#define SLEEP_WDT_LIMIT		4000000000   // 4000000000/1000 = 4000000sec    4000000/60/60/24/ = 46days
+
+void advertising_start(void);
+
+
+
+extern uint8_t advertising_flag;
+
+
+#endif
+
+
+

+ 63 - 0
IES200RB.si4project/Backup/main(1551).h

@@ -0,0 +1,63 @@
+
+#ifndef __MAIN_H
+#define __MAIN_H
+
+
+
+
+#define VER_HIGH_VALUE	1
+#define VER_LOW_VALUE	1
+
+
+#define	BATTERY_LOW_LEVEL	23
+
+
+
+#define IES200_1ST_MAC	0x44
+#define IES200_2ST_MAC	0x33
+#define IES200_3ST_MAC	0xC0
+
+
+#define BUTTON_NONE		0
+#define BUTTON_EMG		1
+#define BUTTON_TEST		2
+#define BUTTON_REG		3
+#define BUTTON_ALIVE	5
+
+
+
+#define BUZZER_NONE	0
+#define BUZZER_EMG	1
+#define BUZZER_TEST	2
+#define BUZZER_REG	3
+#define BUZZER_BOOT_LOADER	4
+#define BUZZER_POWER_ON		5
+
+
+
+
+#define COMMAND_LENGTH	17
+
+#define COMMAND_TYPE	0x74
+
+#define COMMAND_EMG		0x01
+#define COMMAND_TEST	0x02
+#define COMMAND_ALIVE	0x04
+#define COMMAND_REG		0x03
+
+
+#define RUN_TIME_LIMIT		10000		//10sec
+#define SLEEP_WDT_LIMIT		4000000000   // 4000000000/1000 = 4000000sec    4000000/60/60/24/ = 46days
+//#define SLEEP_WDT_LIMIT		3*60*60*1000   // 2*60*60*1000/1000 = 6Hour
+
+void advertising_start(void);
+
+
+
+extern uint8_t advertising_flag;
+
+
+#endif
+
+
+

+ 64 - 0
IES200RB.si4project/Backup/main(163).h

@@ -0,0 +1,64 @@
+
+#ifndef __MAIN_H
+#define __MAIN_H
+
+
+
+
+#define VER_HIGH_VALUE	1
+#define VER_LOW_VALUE	1
+
+
+#define	BATTERY_LOW_LEVEL	23
+
+
+
+#define IES200_1ST_MAC	0x44
+#define IES200_2ST_MAC	0x33
+#define IES200_3ST_MAC	0xC0
+
+
+#define BUTTON_NONE		0
+#define BUTTON_EMG		1
+#define BUTTON_TEST		2
+#define BUTTON_REG		3
+#define BUTTON_ALIVE	5
+
+
+
+#define BUZZER_NONE	0
+#define BUZZER_EMG	1
+#define BUZZER_TEST	2
+#define BUZZER_REG	3
+#define BUZZER_BOOT_LOADER	4
+#define BUZZER_POWER_ON		5
+
+
+
+
+#define COMMAND_LENGTH	17
+
+#define COMMAND_TYPE	0x74
+
+#define COMMAND_EMG		0x01
+#define COMMAND_TEST	0x02
+#define COMMAND_ALIVE	0x04
+#define COMMAND_REG		0x03
+
+
+#define RUN_TIME_LIMIT		10000		//10sec
+//#define SLEEP_WDT_LIMIT		4000000000   // 4000000000/1000 = 4000000sec    4000000/60/60/24/ = 46days
+//#define SLEEP_WDT_LIMIT		1*60*60*1000+1*60*1000   // 2*60*60*1000/1000 = 6Hour
+
+
+void advertising_start(void);
+
+
+
+extern uint8_t advertising_flag;
+
+
+#endif
+
+
+

+ 2266 - 0
IES200RB.si4project/Backup/main(1699).c

@@ -0,0 +1,2266 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("wdt_event_handler()");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+
+	
+
+
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2314 - 0
IES200RB.si4project/Backup/main(20).c

@@ -0,0 +1,2314 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+//char DEVICE_NAME[] =   {'I', 'C', 'S', 'P', 'C', 'A', 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+	RegMacDelteAll();
+	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/21");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+
+#if 0
+	LoadReceiverMac();
+
+
+	if(SystemManager.StrPeerAddr[0] == 'U'){
+
+		memset(SystemManager.StrPeerAddr, 'X', sizeof(SystemManager.StrPeerAddr));
+		
+		RegMacDelteAll();
+		SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+		
+		
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0; 
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+
+		for (;;)
+		{
+			idle_state_handle();
+		
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+#endif
+
+
+#if 1
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+#endif	
+
+	WdtSleepMode();
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2266 - 0
IES200RB.si4project/Backup/main(2546).c

@@ -0,0 +1,2266 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("wdt_event_handler()");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+
+	
+
+
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2254 - 0
IES200RB.si4project/Backup/main(2586).c

@@ -0,0 +1,2254 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+//char DEVICE_NAME[] =   {'I', 'C', 'S', 'P', 'C', 'A', 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+    if (p_evt->type == BLE_NUS_EVT_RX_DATA)
+    {
+        uint32_t err_code;
+
+		NRF_LOG_INFO("BLE_NUS_EVT_RX_DATA.");
+
+		for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
+        {
+            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+        }
+		NRF_LOG_INFO("\n");
+
+
+		//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+		
+		
+		//SystemTimer.TMR_SYS_OFF = 0;
+		
+		
+		//if( SystemManager.EmgSendButton == 11 )
+		//{
+		//	SystemTimer.TMR_SYS_OFF = 3;
+		//}
+
+
+#if 0
+        NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART.");
+        NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);
+
+        for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
+        {
+            do
+            {
+                err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
+                if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
+                {
+                    NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code);
+                    APP_ERROR_CHECK(err_code);
+                }
+            } while (err_code == NRF_ERROR_BUSY);
+        }
+        if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '\r')
+        {
+            while (app_uart_put('\n') == NRF_ERROR_BUSY);
+        }
+#endif
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.");
+
+			if( localNameChg++ == 2 )
+			{
+
+//				uint32_t err_code;
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("Connected");
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+            NRF_LOG_INFO("Disconnected");
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+		RegMacDelteAll();
+		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	NRF_LOG_INFO("\n\n\n\n");	
+	NRF_LOG_INFO("IES-200B Program Start --- Ver 0.92 2022/03/09");	
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+	
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	
+
+	WdtSleepMode();
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2282 - 0
IES200RB.si4project/Backup/main(2596).c

@@ -0,0 +1,2282 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_DAY)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 1
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2261 - 0
IES200RB.si4project/Backup/main(2685).c

@@ -0,0 +1,2261 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+//char DEVICE_NAME[] =   {'I', 'C', 'S', 'P', 'C', 'A', 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+		RegMacDelteAll();
+		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	NRF_LOG_INFO("\n\n\n\n");	
+	NRF_LOG_INFO("IES-200B Program Start --- Ver 0.92 2022/03/10");	
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+	
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	
+
+	WdtSleepMode();
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2246 - 0
IES200RB.si4project/Backup/main(2867).c

@@ -0,0 +1,2246 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("wdt_event_handler()");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x01);
+	}
+
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+//	WdtRunMode();
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 63 - 0
IES200RB.si4project/Backup/main(3293).h

@@ -0,0 +1,63 @@
+
+#ifndef __MAIN_H
+#define __MAIN_H
+
+
+
+
+#define VER_HIGH_VALUE	1
+#define VER_LOW_VALUE	1
+
+
+#define	BATTERY_LOW_LEVEL	23
+
+
+
+#define IES200_1ST_MAC	0x44
+#define IES200_2ST_MAC	0x33
+#define IES200_3ST_MAC	0xC0
+
+
+#define BUTTON_NONE		0
+#define BUTTON_EMG		1
+#define BUTTON_TEST		2
+#define BUTTON_REG		3
+#define BUTTON_ALIVE	5
+
+
+
+#define BUZZER_NONE	0
+#define BUZZER_EMG	1
+#define BUZZER_TEST	2
+#define BUZZER_REG	3
+#define BUZZER_BOOT_LOADER	4
+#define BUZZER_POWER_ON		5
+
+
+
+
+#define COMMAND_LENGTH	17
+
+#define COMMAND_TYPE	0x74
+
+#define COMMAND_EMG		0x01
+#define COMMAND_TEST	0x02
+#define COMMAND_ALIVE	0x04
+#define COMMAND_REG		0x03
+
+
+#define RUN_TIME_LIMIT		10000		//10sec
+#define SLEEP_WDT_LIMIT 24*60*60*1000	// 24 Hour		
+
+
+void advertising_start(void);
+
+
+
+extern uint8_t advertising_flag;
+
+
+#endif
+
+
+

+ 2268 - 0
IES200RB.si4project/Backup/main(3779).c

@@ -0,0 +1,2268 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+		
+    }
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+#if 0
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+#endif			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+#if 0
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+#endif
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+//			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+//			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+		break;	
+	}
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	NRF_LOG_RAW_INFO("\n");
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit(); 
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 1
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2269 - 0
IES200RB.si4project/Backup/main(3887).c

@@ -0,0 +1,2269 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+	RegMacDelteAll();
+	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/21");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+#if 1
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+#endif	
+
+	WdtSleepMode();
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2160 - 0
IES200RB.si4project/Backup/main(437).c

@@ -0,0 +1,2160 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery    
+*	@  
+*
+*	
+*  V2022/02/10
+*  @  AES 
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+//#define APP_ADV_DURATION                18000                                       	/**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+#define APP_ADV_DURATION                300                                       	/**< The advertising duration (3 seconds) in units of 10 milliseconds. */
+
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+#define TIMER_MS_INTERVAL		APP_TIMER_TICKS(25)		// 25ms interrupt
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) 		// 1 ms interrupt
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+
+
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms  SystemManager.BleSendStatus    
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	//   	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+	}
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_RAW_INFO("0x%02x, ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_RAW_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+			SystemManager.random_value[0] = Aes_Dec_temp[3];
+			SystemManager.random_value[1] = Aes_Dec_temp[4];
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+		
+    }
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+#if 0
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+#endif			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	//  
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	//  
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	//  
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	//  
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  //  
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+
+// 25ms Timer
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+		break;	
+	}
+}
+
+
+//  EMG  
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = UID_VALUE_01;    
+    data_array[2] = UID_VALUE_02;
+    data_array[3] = UID_VALUE_03;
+    data_array[4] = UID_VALUE_04;
+	
+    data_array[5] = SITE_VALUE_01;
+    data_array[6] = SITE_VALUE_02;
+    data_array[7] = SITE_VALUE_03;
+    data_array[8] = SITE_VALUE_04;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = SystemManager.random_value[1];
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	NRF_LOG_RAW_INFO("\n");
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+
+//  Test  
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+    data_array[1] = UID_VALUE_01;    
+    data_array[2] = UID_VALUE_02;
+    data_array[3] = UID_VALUE_03;
+    data_array[4] = UID_VALUE_04;
+	
+    data_array[5] = SITE_VALUE_01;
+    data_array[6] = SITE_VALUE_02;
+    data_array[7] = SITE_VALUE_03;
+    data_array[8] = SITE_VALUE_04;
+
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = SystemManager.random_value[1];
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = UID_VALUE_01;    
+    data_array[2] = UID_VALUE_02;
+    data_array[3] = UID_VALUE_03;
+    data_array[4] = UID_VALUE_04;
+	
+    data_array[5] = SITE_VALUE_01;
+    data_array[6] = SITE_VALUE_02;
+    data_array[7] = SITE_VALUE_03;
+    data_array[8] = SITE_VALUE_04;
+
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = SystemManager.random_value[1];
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+//  
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendRegData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = UID_VALUE_01;    
+    data_array[2] = UID_VALUE_02;
+    data_array[3] = UID_VALUE_03;
+    data_array[4] = UID_VALUE_04;
+	
+    data_array[5] = SITE_VALUE_01;
+    data_array[6] = SITE_VALUE_02;
+    data_array[7] = SITE_VALUE_03;
+    data_array[8] = SITE_VALUE_04;
+
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = SystemManager.random_value[1];
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/04/04");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit(); 
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 0
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2259 - 0
IES200RB.si4project/Backup/main(4540).c

@@ -0,0 +1,2259 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+//char DEVICE_NAME[] =   {'I', 'C', 'S', 'P', 'C', 'A', 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+		RegMacDelteAll();
+		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	NRF_LOG_INFO("\n\n\n\n");	
+	NRF_LOG_INFO("IES-200B Program Start --- Ver 0.92 2022/03/10");	
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+	
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	
+
+	WdtSleepMode();
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2266 - 0
IES200RB.si4project/Backup/main(5311).c

@@ -0,0 +1,2266 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL	APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+		
+    }
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+#if 0
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+#endif			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+#if 0
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+#endif
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+//			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+//			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+		break;	
+	}
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	NRF_LOG_RAW_INFO("\n");
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit(); 
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 1
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2323 - 0
IES200RB.si4project/Backup/main(5467).c

@@ -0,0 +1,2323 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+#define SLEEP_WDT_LIMIT 1*60*1000
+#define DUF_WDT_LIMIT 2*60*1000
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_DAY)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("==========>  wdt_event_handler() <======================");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+	WdtDufMode();
+
+
+
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+#define SND_WDT_DUF_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = DUF_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void WdtDufMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_DUF_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+
+	// ---------------------------------------
+//	err_code = nrf_drv_clock_init(NULL);
+//	APP_ERROR_CHECK(err_code);
+//	nrf_drv_clock_lfclk_request();
+	//----------------------------------------
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+	NRF_LOG_INFO("-----------------------------------------------");
+
+	NRF_LOG_RAW_INFO("Wdt SleepMode Setting\n");
+	
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+
+//	nrf_wdt_reload_value_set(RUN_TIME_LIMIT*3);	//10sec
+
+	NRF_LOG_INFO("-----------------------------------------------");
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 0	
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+//	WdtSleepMode();
+//	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	
+
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+//	WdtRunMode();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2205 - 0
IES200RB.si4project/Backup/main(6228).c

@@ -0,0 +1,2205 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       	/**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL	APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+	}
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+		
+    }
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+#if 0
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+#endif			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+#if 0
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+#endif
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+// 25ms Timer
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+		break;	
+	}
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	NRF_LOG_RAW_INFO("\n");
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit(); 
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 1
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2314 - 0
IES200RB.si4project/Backup/main(6274).c

@@ -0,0 +1,2314 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+//char DEVICE_NAME[] =   {'I', 'C', 'S', 'P', 'C', 'A', 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+	RegMacDelteAll();
+	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/21");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+
+#if 0
+	LoadReceiverMac();
+
+
+	if(SystemManager.StrPeerAddr[0] == 'U'){
+
+		memset(SystemManager.StrPeerAddr, 'X', sizeof(SystemManager.StrPeerAddr));
+		
+		RegMacDelteAll();
+		SaveReceiverMac(SystemManager.StrPeerAddr);
+
+
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+		
+		
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0; 
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+
+		for (;;)
+		{
+			idle_state_handle();
+		
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+#endif
+
+
+#if 1
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+	else if( SystemManager.GpReg == 0x04  )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		//nrf_power_gpregret_set(1);
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		nrf_power_gpregret_set(2);
+	}
+#endif	
+
+	WdtSleepMode();
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+
+	
+	Battery_Adc_Read();
+
+	WdtRunMode();
+
+
+    //Configure WDT.
+    //nrf_drv_wdt_config_t config = NRF_DRV_WDT_DEAFULT_CONFIG;
+    //err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    //APP_ERROR_CHECK(err_code);
+    //err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    //APP_ERROR_CHECK(err_code);
+    //nrf_drv_wdt_enable();
+
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 2282 - 0
IES200RB.si4project/Backup/main(6345).c

@@ -0,0 +1,2282 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+
+nrf_drv_wdt_channel_id m_channel_id;
+void WdtRunMode();
+
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_HOUR)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+uint8_t advertising_flag = 0;
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("<<      wdt_event_handler()       >>");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+	WdtRunMode();
+
+	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	nrf_power_gpregret_set(0xB1);
+
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+
+
+void WdtRunMode()
+{
+	ret_code_t err_code;
+
+	uint64_t time = 10*60*60*1000;
+
+	uint64_t ticks = (time * 32768ULL) / 1000;
+//	  NRFX_ASSERT(ticks <= UINT32_MAX);
+
+	NRF_LOG_INFO("===>> ticks is [%d]", ticks);
+
+	nrf_wdt_reload_value_set((uint32_t) ticks);
+
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+}
+
+
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 1
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+	WdtSleepMode();
+	nrf_drv_wdt_channel_feed(m_channel_id);
+//	WdtRunMode();
+
+	
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 63 - 0
IES200RB.si4project/Backup/main(6666).h

@@ -0,0 +1,63 @@
+
+#ifndef __MAIN_H
+#define __MAIN_H
+
+
+
+
+#define VER_HIGH_VALUE	1
+#define VER_LOW_VALUE	1
+
+
+#define	BATTERY_LOW_LEVEL	23
+
+
+
+#define IES200_1ST_MAC	0x44
+#define IES200_2ST_MAC	0x33
+#define IES200_3ST_MAC	0xC0
+
+
+#define BUTTON_NONE		0
+#define BUTTON_EMG		1
+#define BUTTON_TEST		2
+#define BUTTON_REG		3
+#define BUTTON_ALIVE	5
+
+
+
+#define BUZZER_NONE	0
+#define BUZZER_EMG	1
+#define BUZZER_TEST	2
+#define BUZZER_REG	3
+#define BUZZER_BOOT_LOADER	4
+#define BUZZER_POWER_ON		5
+
+
+
+
+#define COMMAND_LENGTH	17
+
+#define COMMAND_TYPE	0x74
+
+#define COMMAND_EMG		0x01
+#define COMMAND_TEST	0x02
+#define COMMAND_ALIVE	0x04
+#define COMMAND_REG		0x03
+
+
+#define RUN_TIME_LIMIT		10000		//10sec
+//#define SLEEP_WDT_LIMIT		4000000000   // 4000000000/1000 = 4000000sec    4000000/60/60/24/ = 46days
+#define SLEEP_WDT_LIMIT		3*60*60*1000   // 2*60*60*1000/1000 = 6Hour
+
+void advertising_start(void);
+
+
+
+extern uint8_t advertising_flag;
+
+
+#endif
+
+
+

+ 2297 - 0
IES200RB.si4project/Backup/main(870).c

@@ -0,0 +1,2297 @@
+/**
+ * Copyright (c) 2014 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+/** @file
+ *
+ * @defgroup ble_sdk_uart_over_ble_main main.c
+ * @{
+ * @ingroup  ble_sdk_app_nus_eval
+ * @brief    UART over BLE application main file.
+ *
+ * This file contains the source code for a sample application that uses the Nordic UART service.
+ * This application uses the @ref srvlib_conn_params module.
+ */
+
+
+
+
+/******************************************************************************************************************
+*
+*	V2022/01/25
+*	@ Battery 연결시 부저음 추가 
+*	@ 와치독 적용
+*
+*	
+*  V2022/02/10
+*  @ 비상벨 AES 암호화
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*	
+*
+*
+*
+*
+*	
+*
+*
+*	
+*
+*
+*******************************************************************************************************************/	
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+#include <stdint.h>
+#include <string.h>
+#include "nordic_common.h"
+#include "nrf.h"
+#include "ble_hci.h"
+#include "ble_advdata.h"
+#include "ble_advertising.h"
+#include "ble_conn_params.h"
+#include "nrf_sdh.h"
+#include "nrf_sdh_soc.h"
+#include "nrf_sdh_ble.h"
+#include "nrf_ble_gatt.h"
+#include "nrf_ble_qwr.h"
+#include "app_pwm.h"
+
+#include "app_timer.h"
+#include "ble_nus.h"
+#include "app_uart.h"
+#include "app_util_platform.h"
+#include "bsp_btn_ble.h"
+#include "nrf_pwr_mgmt.h"
+#include "nrf_delay.h"
+
+#if defined (UART_PRESENT)
+#include "nrf_uart.h"
+#endif
+#if defined (UARTE_PRESENT)
+#include "nrf_uarte.h"
+#endif
+
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+#include "nrf_drv_saadc.h"
+#include "nrf_drv_rtc.h"
+#include "nrf_drv_wdt.h"
+
+
+#include "main.h"
+#include "sysmgr.h"
+#include "dio.h"
+#include "nrf_power.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+#define APP_BLE_CONN_CFG_TAG            1                                           /**< A tag identifying the SoftDevice BLE configuration. */
+
+//#define DEVICE_NAME                     "Nordic_UART"                               /**< Name of device. Will be included in the advertising data. */
+#define NUS_SERVICE_UUID_TYPE           BLE_UUID_TYPE_VENDOR_BEGIN                  /**< UUID type for the Nordic UART Service (vendor specific). */
+
+#define APP_BLE_OBSERVER_PRIO           3                                           /**< Application's BLE observer priority. You shouldn't need to modify this value. */
+
+#define APP_ADV_INTERVAL                64                                          /**< The advertising interval (in units of 0.625 ms. This value corresponds to 40 ms). */
+
+#define APP_ADV_DURATION                300                                       /**< The advertising duration (180 seconds) in units of 10 milliseconds. */
+
+#define APP_TIMER_PRESCALER             0 
+
+
+
+#define MIN_CONN_INTERVAL               MSEC_TO_UNITS(20, UNIT_1_25_MS)             /**< Minimum acceptable connection interval (20 ms), Connection interval uses 1.25 ms units. */
+#define MAX_CONN_INTERVAL               MSEC_TO_UNITS(75, UNIT_1_25_MS)             /**< Maximum acceptable connection interval (75 ms), Connection interval uses 1.25 ms units. */
+#define SLAVE_LATENCY                   0                                           /**< Slave latency. */
+#define CONN_SUP_TIMEOUT                MSEC_TO_UNITS(4000, UNIT_10_MS)             /**< Connection supervisory timeout (4 seconds), Supervision Timeout uses 10 ms units. */
+#define FIRST_CONN_PARAMS_UPDATE_DELAY  APP_TIMER_TICKS(5000)                       /**< Time from initiating event (connect or start of notification) to first time sd_ble_gap_conn_param_update is called (5 seconds). */
+#define NEXT_CONN_PARAMS_UPDATE_DELAY   APP_TIMER_TICKS(30000)                      /**< Time between each call to sd_ble_gap_conn_param_update after the first call (30 seconds). */
+#define MAX_CONN_PARAMS_UPDATE_COUNT    3                                           /**< Number of attempts before giving up the connection parameter negotiation. */
+
+#define DEAD_BEEF                       0xDEADBEEF                                  /**< Value used as error code on stack dump, can be used to identify stack location on stack unwind. */
+
+#define UART_TX_BUF_SIZE                256                                         /**< UART TX buffer size. */
+#define UART_RX_BUF_SIZE                256                                         /**< UART RX buffer size. */
+
+#define COMPARE_COUNTERTIME  (3UL)                                        /**< Get Compare event COMPARE_TIME seconds after the counter starts from 0. */
+#define TICK_EVENT_OUTPUT     BSP_LED_0                                 /**< Pin number for indicating tick event. */
+#define COMPARE_EVENT_OUTPUT   BSP_LED_1
+
+
+#define SLEEP_WDT_LIMIT 5*60*1000
+
+
+
+BLE_NUS_DEF(m_nus, NRF_SDH_BLE_TOTAL_LINK_COUNT);                                   /**< BLE NUS service instance. */
+NRF_BLE_GATT_DEF(m_gatt);                                                           /**< GATT module instance. */
+NRF_BLE_QWR_DEF(m_qwr);                                                             /**< Context for the Queued Write module.*/
+BLE_ADVERTISING_DEF(m_advertising);                                                 /**< Advertising module instance. */
+
+
+#define TIMER_MS_INTERVAL        			 APP_TIMER_TICKS(25)
+
+
+
+APP_TIMER_DEF(m_ms_timer_id);
+APP_TIMER_DEF(wakeup_timer_id);
+APP_TIMER_DEF(m_our_char_timer_id);
+nrf_drv_wdt_channel_id m_channel_id;
+
+
+#define KEEPALIVE_INTERVAL_30_SEC	30*1000
+#define KEEPALIVE_INTERVAL_1_MIN	60*1000
+#define KEEPALIVE_INTERVAL_30_MIN	30*60*1000
+#define KEEPALIVE_INTERVAL_1_HOUR	60*60*1000
+#define KEEPALIVE_INTERVAL_1_DAY	24*60*6*1000
+
+
+
+#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_1_DAY)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(KEEPALIVE_INTERVAL_30_SEC)
+
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(30*1000)
+//#define WAKEUP_TIME_INVERVAL	APP_TIMER_TICKS(15000)
+
+
+#define OUR_CHAR_TIMER_INTERVAL APP_TIMER_TICKS(1) // 1 ms intervals
+
+
+char DEVICE_NAME[] =   {'I', 'C', 'S', 'W', 'E', 'S', 0x44,0x33,0xC0,0xFF,0xFF,0xFF };
+
+
+/* Flag to check fds initialization. */
+static bool volatile m_fds_initialized;
+/* Array to map FDS events to strings. */
+static char const * fds_evt_str[] =
+{
+    "FDS_EVT_INIT",
+    "FDS_EVT_WRITE",
+    "FDS_EVT_UPDATE",
+    "FDS_EVT_DEL_RECORD",
+    "FDS_EVT_DEL_FILE",
+    "FDS_EVT_GC",
+};
+
+
+/* Keep track of the progress of a delete_all operation. */
+static struct
+{
+    bool delete_next;   //!< Delete next record.
+    bool pending;       //!< Waiting for an fds FDS_EVT_DEL_RECORD event, to delete the next record.
+} m_delete_all;
+
+
+
+
+
+static void uart_init(void);
+static void advertising_init(void);
+static void buttons_leds_init(bool * p_erase_bonds);
+static void log_init(void);
+static void power_management_init(void);
+void wakeup_timer_handler(void * p_context);
+
+static void leds_config(void);
+
+void Battery_Adc_Read(void);
+
+
+
+static void idle_state_handle(void);
+//static void advertising_start(void);
+static void timer_ms_timeout_handler(void * p_context);
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt);
+
+
+
+
+
+uint8_t advertising_flag = 0;
+
+
+
+
+
+
+static void fds_evt_handler(fds_evt_t const * p_evt)
+{
+    if (p_evt->result == NRF_SUCCESS)
+    {
+        NRF_LOG_INFO("Event: %s received (NRF_SUCCESS)",
+                      fds_evt_str[p_evt->id]);
+    }
+    else
+    {
+        NRF_LOG_INFO("Event: %s received (%s)",
+                      fds_evt_str[p_evt->id],
+                      fds_err_str(p_evt->result));
+    }
+
+    switch (p_evt->id)
+    {
+        case FDS_EVT_INIT:
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                m_fds_initialized = true;
+            }
+            break;
+
+        case FDS_EVT_WRITE:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->write.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->write.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->write.record_key);
+            }
+        } break;
+
+        case FDS_EVT_DEL_RECORD:
+        {
+            if (p_evt->result == NRF_SUCCESS)
+            {
+                NRF_LOG_INFO("Record ID:\t0x%04x",  p_evt->del.record_id);
+                NRF_LOG_INFO("File ID:\t0x%04x",    p_evt->del.file_id);
+                NRF_LOG_INFO("Record key:\t0x%04x", p_evt->del.record_key);
+            }
+            m_delete_all.pending = false;
+        } break;
+
+        default:
+            break;
+    }
+}
+
+
+
+
+void ReMac_Mapping();
+ble_gap_addr_t old_ble_addr;
+ble_gap_addr_t new_ble_addr;
+
+
+int SysStatus;
+int SysCounter;
+
+static uint16_t   m_conn_handle          = BLE_CONN_HANDLE_INVALID;                 /**< Handle of the current connection. */
+static uint16_t   m_ble_nus_max_data_len = BLE_GATT_ATT_MTU_DEFAULT - 3;            /**< Maximum length of data (in bytes) that can be transmitted to the peer by the Nordic UART service module. */
+static ble_uuid_t m_adv_uuids[]          =                                          /**< Universally unique service identifier. */
+{
+    {BLE_UUID_NUS_SERVICE, NUS_SERVICE_UUID_TYPE}
+};
+APP_PWM_INSTANCE(PWM1,1);                   // Create the instance "PWM1" using TIMER1.
+
+static volatile bool ready_flag;            // A flag indicating PWM status.
+#define SAMPLES_IN_BUFFER 5
+
+static nrf_saadc_value_t     m_buffer_pool[SAMPLES_IN_BUFFER];
+
+int SysCounter;
+
+
+ble_advertising_t* p_m_advertising;
+
+
+
+void SendEmgData(void);
+void SendTestData(void);
+void SendRegData(void);
+void SendAliveData(void);
+void bsp_event_handler(bsp_event_t event);
+
+
+
+void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
+{
+    if (p_event->type == NRF_DRV_SAADC_EVT_DONE)
+    {
+      nrf_drv_saadc_buffer_convert(p_event->data.done.p_buffer, SAMPLES_IN_BUFFER);
+      
+    }
+    
+    for(uint8_t i = 1 ; i < SAMPLES_IN_BUFFER ; i++)
+    {
+      NRF_LOG_INFO("ADC:%04d\r\n",p_event->data.done.p_buffer[i]);
+    }
+}
+
+void SaadcInit(void)
+{
+
+  nrf_saadc_channel_config_t channel_config =
+      NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
+  nrf_drv_saadc_init(NULL, saadc_callback);
+
+  nrf_drv_saadc_channel_init(2, &channel_config);
+  
+
+}
+
+
+void wdt_event_handler(void)
+{
+    //bsp_board_leds_off();
+    NRF_LOG_INFO("==========>  wdt_event_handler() <======================");
+}
+
+
+void BootLoad_Reboot()
+{
+
+
+//	memset(SystemManager.StrPeerAddr, 'U', sizeof(SystemManager.StrPeerAddr));
+
+//	RegMacDelteAll();
+//	SaveReceiverMac(SystemManager.StrPeerAddr);
+
+    nrf_drv_wdt_enable();
+
+	nrf_power_gpregret_set(0xB1);
+	NVIC_SystemReset();
+
+}
+
+
+
+
+
+// ALREADY_DONE_FOR_YOU: This is a timer event handler
+// 1m sec Interrupt
+static void timer_timeout_handler(void * p_context)
+{
+	uint32_t err_code;
+    SystemTimer.MS_1++;
+    SystemTimer.UART_LAST_RECV_TIMER++;
+    SystemTimer.SEND_TIMER++;
+    SystemTimer.BUZZER_TIMER--;
+
+	SystemManager.BleConnectTime++;
+
+	SystemTimer.TIM_KEY++;
+	SystemTimer.SLEEP_TIMER++;
+
+
+	// 500ms 마다 SystemManager.BleSendStatus 상태확인하여 수신기에 데이타 전송
+
+	if(SystemManager.BleConnected){
+
+		if( SystemManager.BleSendStatus &&  (SystemTimer.SEND_TIMER%500 ==0))
+		{
+			NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+
+			if( SystemManager.EmgSendButton == BUTTON_EMG )			// EMG
+			{
+				SendEmgData();
+				SystemTimer.EMG_SEND_RUN = 0;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_TEST )		// TEST
+			{
+				SendTestData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_ALIVE )		// Alive
+			{
+				SendAliveData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = BUTTON_NONE;
+
+			}else if( SystemManager.EmgSendButton == BUTTON_REG )		// 등록
+			{
+				SendRegData(); 
+				SystemTimer.EMG_SEND_RUN = 0;
+				//SystemManager.EmgSendButton = 11;
+				//ParkPowerOff();
+			}			  
+		}
+	}else{
+
+		
+		//NRF_LOG_INFO("SystemManager.BleConnected:%d\n", SystemManager.BleConnected);
+		// BLE ADVERTISE RECONNECT START
+	}
+
+
+	if( SystemTimer.SEND_TIMER > 3000 )
+	{
+		NVIC_SystemReset();		// SYSTEM RESET
+	}
+
+
+#if 0
+	if( SystemManager.EmgSendButton == 3 || SystemManager.EmgSendButton == 11 )
+	{
+		if( SystemManager.BleConnectTime > 6000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}else{
+
+		if( SystemManager.BleConnectTime > 3000 )
+		{
+			NVIC_SystemReset();
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle); 
+			///m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			//sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_LOCAL_HOST_TERMINATED_CONNECTION);
+			//sd_ble_gap_adv_stop(m_advertising.adv_handle);  
+
+		}
+	}
+#endif
+
+
+
+#if 1
+
+	switch(SystemManager.BuzzerType){
+		
+		case BUZZER_EMG:	// EMG
+
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+		
+				if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+				}
+
+			}else{
+
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+							{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+
+		case BUZZER_TEST:	//TEST
+			if(SystemManager.Batt > BATTERY_LOW_LEVEL){
+
+				if( SystemTimer.BUZZER_TIMER < 10 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}else{		// LOW BATTERY (20% Under)
+				if( SystemTimer.BUZZER_TIMER == 500 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 450 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 350 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 300 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+	                        {
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+				}else if( SystemTimer.BUZZER_TIMER < 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+					SystemManager.BuzzerType = BUZZER_NONE;
+					app_pwm_disable(&PWM1);
+				}
+			}
+		break;
+			
+		case BUZZER_REG:	//등록
+
+			if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+			//	app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+			}
+			
+		break;
+
+
+		case BUZZER_BOOT_LOADER: //BOOT LOAD REBOOT
+
+			if( SystemTimer.BUZZER_TIMER == 800 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 700 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 500 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 400 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 200 )
+						{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}else if( SystemTimer.BUZZER_TIMER < 100 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = BUZZER_NONE;
+				app_pwm_disable(&PWM1);
+
+				BootLoad_Reboot();
+			}
+
+		break;
+
+
+
+		case BUZZER_POWER_ON:	// 밧데리 연결시 동작	
+
+				if( SystemTimer.BUZZER_TIMER == 250 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 200 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}
+				else if( SystemTimer.BUZZER_TIMER == 150 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+				}else if( SystemTimer.BUZZER_TIMER == 100 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 50);
+				}else if( SystemTimer.BUZZER_TIMER < 50 )
+				{
+					app_pwm_channel_duty_set(&PWM1, 0, 0);
+
+					SystemManager.BuzzerType = BUZZER_NONE;
+
+					app_pwm_disable(&PWM1);
+					SystemManager.GoSleep = 1;
+				}		
+		break;				
+
+#if 0
+		case 10:
+			if( SystemTimer.BUZZER_TIMER == 150 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER == 100 )
+			{
+				//app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}else if( SystemTimer.BUZZER_TIMER < 50 )
+			{
+				app_pwm_channel_duty_set(&PWM1, 0, 0);
+				SystemManager.BuzzerType = 100;
+				app_pwm_disable(&PWM1);
+			}
+		break;
+#endif			
+	}
+
+	
+#endif
+
+
+}
+
+
+
+/**@brief Function for assert macro callback.
+ *
+ * @details This function will be called in case of an assert in the SoftDevice.
+ *
+ * @warning This handler is an example only and does not fit a final product. You need to analyse
+ *          how your product is supposed to react in case of Assert.
+ * @warning On assert from the SoftDevice, the system can only recover on reset.
+ *
+ * @param[in] line_num    Line number of the failing ASSERT call.
+ * @param[in] p_file_name File name of the failing ASSERT call.
+ */
+void assert_nrf_callback(uint16_t line_num, const uint8_t * p_file_name)
+{
+    app_error_handler(DEAD_BEEF, line_num, p_file_name);
+}
+
+/**@brief Function for initializing the timer module.
+ */
+static void timers_init(void)
+{
+    ret_code_t err_code = app_timer_init();
+    APP_ERROR_CHECK(err_code);
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+ *
+ * @details This function will set up all the necessary GAP (Generic Access Profile) parameters of
+ *          the device. It also sets the permissions and appearance.
+ */
+static void gap_params_init(void)
+{
+    uint32_t                err_code;
+    ble_gap_conn_params_t   gap_conn_params;
+    ble_gap_conn_sec_mode_t sec_mode;
+
+    BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+
+    err_code = sd_ble_gap_device_name_set(&sec_mode,
+                                          (const uint8_t *) DEVICE_NAME,
+                                          strlen(DEVICE_NAME));
+    APP_ERROR_CHECK(err_code);
+
+    memset(&gap_conn_params, 0, sizeof(gap_conn_params));
+
+    gap_conn_params.min_conn_interval = MIN_CONN_INTERVAL;
+    gap_conn_params.max_conn_interval = MAX_CONN_INTERVAL;
+    gap_conn_params.slave_latency     = SLAVE_LATENCY;
+    gap_conn_params.conn_sup_timeout  = CONN_SUP_TIMEOUT;
+
+    err_code = sd_ble_gap_ppcp_set(&gap_conn_params);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling Queued Write Module errors.
+ *
+ * @details A pointer to this function will be passed to each service which may need to inform the
+ *          application about an error.
+ *
+ * @param[in]   nrf_error   Error code containing information about what went wrong.
+ */
+static void nrf_qwr_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for handling the data from the Nordic UART Service.
+ *
+ * @details This function will process the data received from the Nordic UART BLE Service and send
+ *          it to the UART module.
+ *
+ * @param[in] p_evt       Nordic UART Service event.
+ */
+/**@snippet [Handling the data received over BLE] */
+static void nus_data_handler(ble_nus_evt_t * p_evt)
+{
+
+	uint32_t i;
+
+	uint32_t err_code;
+
+	uint8_t Aes_temp[16];
+	uint8_t Aes_Dec_temp[16];
+
+
+	switch(p_evt->type){
+		case BLE_NUS_EVT_RX_DATA:
+		
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (AES) => ");
+
+
+			for (i = 0; i < p_evt->params.rx_data.length; i++)
+	        {
+	            NRF_LOG_INFO("0x%02x ",  *(p_evt->params.rx_data.p_data+i));
+	        }
+			NRF_LOG_INFO("\n");
+
+			for(i=0; i<16; i++){
+			
+				Aes_temp[i] = *(p_evt->params.rx_data.p_data+i);
+			}
+			
+			WesDecryptEcb( &Aes_temp[0], &Aes_Dec_temp[0] );
+			
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_RX_DATA (ORG) => ");
+			
+			for (i=0; i<16; i++)
+			{
+				NRF_LOG_RAW_INFO("0x%02x, ", Aes_Dec_temp[i]);
+			}
+			NRF_LOG_RAW_INFO("\n");
+
+		break;
+
+		case BLE_NUS_EVT_TX_RDY:
+
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_TX_RDY ======> \n");
+
+		break;
+
+		case BLE_NUS_EVT_COMM_STARTED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STARTED ======> \n");
+		break;
+		
+		case BLE_NUS_EVT_COMM_STOPPED:
+			NRF_LOG_RAW_INFO("BLE_NUS_EVT_COMM_STOPPED ======> \n");
+		break;
+
+
+    }
+
+}
+/**@snippet [Handling the data received over BLE] */
+
+
+/**@brief Function for initializing services that will be used by the application.
+ */
+static void services_init(void)
+{
+    uint32_t           err_code;
+    ble_nus_init_t     nus_init;
+    nrf_ble_qwr_init_t qwr_init = {0};
+
+    // Initialize Queued Write Module.
+    qwr_init.error_handler = nrf_qwr_error_handler;
+
+    err_code = nrf_ble_qwr_init(&m_qwr, &qwr_init);
+    APP_ERROR_CHECK(err_code);
+
+    // Initialize NUS.
+    memset(&nus_init, 0, sizeof(nus_init));
+
+    nus_init.data_handler = nus_data_handler;
+
+    err_code = ble_nus_init(&m_nus, &nus_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling an event from the Connection Parameters Module.
+ *
+ * @details This function will be called for all events in the Connection Parameters Module
+ *          which are passed to the application.
+ *
+ * @note All this function does is to disconnect. This could have been done by simply setting
+ *       the disconnect_on_fail config parameter, but instead we use the event handler
+ *       mechanism to demonstrate its use.
+ *
+ * @param[in] p_evt  Event received from the Connection Parameters Module.
+ */
+static void on_conn_params_evt(ble_conn_params_evt_t * p_evt)
+{
+    uint32_t err_code;
+
+    if (p_evt->evt_type == BLE_CONN_PARAMS_EVT_FAILED)
+    {
+        err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_CONN_INTERVAL_UNACCEPTABLE);
+        APP_ERROR_CHECK(err_code);
+    }
+}
+
+
+/**@brief Function for handling errors from the Connection Parameters module.
+ *
+ * @param[in] nrf_error  Error code containing information about what went wrong.
+ */
+static void conn_params_error_handler(uint32_t nrf_error)
+{
+    APP_ERROR_HANDLER(nrf_error);
+}
+
+
+/**@brief Function for initializing the Connection Parameters module.
+ */
+static void conn_params_init(void)
+{
+    uint32_t               err_code;
+    ble_conn_params_init_t cp_init;
+
+    memset(&cp_init, 0, sizeof(cp_init));
+
+    cp_init.p_conn_params                  = NULL;
+    cp_init.first_conn_params_update_delay = FIRST_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.next_conn_params_update_delay  = NEXT_CONN_PARAMS_UPDATE_DELAY;
+    cp_init.max_conn_params_update_count   = MAX_CONN_PARAMS_UPDATE_COUNT;
+    cp_init.start_on_notify_cccd_handle    = BLE_GATT_HANDLE_INVALID;
+    cp_init.disconnect_on_fail             = false;
+    cp_init.evt_handler                    = on_conn_params_evt;
+    cp_init.error_handler                  = conn_params_error_handler;
+
+    err_code = ble_conn_params_init(&cp_init);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for putting the chip into sleep mode.
+ *
+ * @note This function will not return.
+ */
+static void sleep_mode_enter(void)
+{
+    uint32_t err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Prepare wakeup buttons.
+    err_code = bsp_btn_ble_sleep_mode_prepare();
+    APP_ERROR_CHECK(err_code);
+    SysStatus = 300;
+    // Go to system-off mode (this function will not return; wakeup will cause a reset).
+    err_code = sd_power_system_off();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling advertising events.
+ *
+ * @details This function will be called for advertising events which are passed to the application.
+ *
+ * @param[in] ble_adv_evt  Advertising event.
+ */
+static void on_adv_evt(ble_adv_evt_t ble_adv_evt)
+{
+    uint32_t err_code;
+
+    switch (ble_adv_evt)
+    {
+        case BLE_ADV_EVT_FAST:
+            NRF_LOG_INFO("BLE_ADV_EVT_FAST");
+			SystemManager.BleConnectTime = 0;
+            err_code = bsp_indication_set(BSP_INDICATE_ADVERTISING);
+            SysStatus = 200;
+            APP_ERROR_CHECK(err_code);
+        break;
+		
+        case BLE_ADV_EVT_IDLE:
+            NRF_LOG_INFO("BLE_ADV_EVT_IDLE");
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			NVIC_SystemReset();
+
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+
+			//StartRTC();
+			//app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(15000), NULL);
+
+			        // Enter System ON sleep mode
+            //__WFE();
+            // Make sure any pending events are cleared
+            //__SEV();
+           // __WFE();
+
+			
+            //sleep_mode_enter();
+           // err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            //APP_ERROR_CHECK(err_code);
+            //app_timer_start(wakeup_timer_id, APP_TIMER_TICKS(5000), NULL);
+			// err_code = sd_app_evt_wait();
+            //SysStatus = 201;
+            //app_uart_close();
+            //idle_state_handle();
+            break;
+        default:
+            break;
+    }
+}
+
+
+
+int localNameChg = 0;
+
+
+/**@brief Function for handling BLE events.
+ *
+ * @param[in]   p_ble_evt   Bluetooth stack event.
+ * @param[in]   p_context   Unused.
+ */
+static void ble_evt_handler(ble_evt_t const * p_ble_evt, void * p_context)
+{
+    uint32_t err_code;
+
+    switch (p_ble_evt->header.evt_id)
+    {
+
+
+        case BLE_GAP_EVT_ADV_REPORT :
+            NRF_LOG_INFO("BLE_GAP_EVT_ADV_REPORT ");
+        break;
+
+
+		case BLE_GAP_EVT_SCAN_REQ_REPORT:
+
+			 NRF_LOG_INFO("BLE_GAP_EVT_SCAN_REQ_REPORT");
+
+			ble_gap_evt_scan_req_report_t * p_scan_req_report_t = (ble_gap_evt_scan_req_report_t *)&p_ble_evt->evt.gap_evt.params.scan_req_report;
+
+			NRF_LOG_INFO("Peer Address = 0x%02x:%02x:%02x:%02x:%02x:%02x",
+					   p_scan_req_report_t->peer_addr.addr[0],
+					   p_scan_req_report_t->peer_addr.addr[1],
+					   p_scan_req_report_t->peer_addr.addr[2],
+					   p_scan_req_report_t->peer_addr.addr[3],
+					   p_scan_req_report_t->peer_addr.addr[4],
+					   p_scan_req_report_t->peer_addr.addr[5]);
+
+			NRF_LOG_INFO("RSSI value = %d dBm", p_scan_req_report_t->rssi);
+			
+			SystemManager.PeerAddr[0] = p_scan_req_report_t->peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_scan_req_report_t->peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_scan_req_report_t->peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_scan_req_report_t->peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_scan_req_report_t->peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_scan_req_report_t->peer_addr.addr[5];
+			
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", p_scan_req_report_t->peer_addr.addr[0],
+				  p_scan_req_report_t->peer_addr.addr[1],
+				  p_scan_req_report_t->peer_addr.addr[2],
+				  p_scan_req_report_t->peer_addr.addr[3],
+				  p_scan_req_report_t->peer_addr.addr[4],
+				  p_scan_req_report_t->peer_addr.addr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+			
+			if( Key1Flag )
+				break;
+
+			if( strncmp( SystemManager.StrRegPeerAddr, SystemManager.StrPeerAddr, 12 ) != 0 )
+			{
+				NRF_LOG_INFO("Reg Receiver Arrived.\n");
+				break;
+			}
+
+			NRF_LOG_INFO("Reg Receiver Arrived.\n");
+
+			if( localNameChg++ == 2 )
+			{
+
+
+				ble_gap_conn_params_t   gap_conn_params;
+				ble_gap_conn_sec_mode_t sec_mode;
+
+//				memcpy( &DEVICE_NAME[6], SystemManager.RegPeerAddr, 6);			// 원상복구
+
+				BLE_GAP_CONN_SEC_MODE_SET_OPEN(&sec_mode);
+				sd_ble_gap_device_name_set(&sec_mode, (const uint8_t *)DEVICE_NAME, strlen(DEVICE_NAME));
+				
+				sd_ble_gap_adv_stop(p_m_advertising->adv_handle); 
+
+				memcpy( &p_m_advertising->adv_data.adv_data.p_data[14], &DEVICE_NAME[6], 6 );
+				memcpy( &p_m_advertising->adv_data.scan_rsp_data.p_data[14], &DEVICE_NAME[6], 6 );
+
+				//ble_advdata_encode(p_m_advertising->p_adv_data, p_m_advertising->adv_data.adv_data.p_data, &p_m_advertising->adv_data.adv_data.len);
+				sd_ble_gap_adv_set_configure(&p_m_advertising->adv_handle, &p_m_advertising->adv_data, &p_m_advertising->adv_params);
+				
+				sd_ble_gap_adv_start(p_m_advertising->adv_handle, APP_BLE_CONN_CFG_TAG);
+
+				NRF_LOG_INFO("Local Name Change = %d", err_code);
+				
+			}
+			else if( localNameChg == 2)
+			{
+
+			}
+			
+		break;
+
+
+        case BLE_GAP_EVT_CONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_CONNECTED =========>");
+			
+			err_code = bsp_indication_set(BSP_INDICATE_CONNECTED);
+			APP_ERROR_CHECK(err_code);
+			m_conn_handle = p_ble_evt->evt.gap_evt.conn_handle;
+			err_code = nrf_ble_qwr_conn_handle_assign(&m_qwr, m_conn_handle);
+			APP_ERROR_CHECK(err_code);
+
+			SystemManager.BleConnected = 1;
+			SystemTimer.SEND_TIMER = 0;
+
+			SystemManager.PeerAddr[0] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[0];
+			SystemManager.PeerAddr[1] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[1];
+			SystemManager.PeerAddr[2] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[2];
+			SystemManager.PeerAddr[3] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[3];
+			SystemManager.PeerAddr[4] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[4];
+			SystemManager.PeerAddr[5] = p_ble_evt->evt.gap_evt.params.connected.peer_addr.addr[5];
+
+			sprintf(SystemManager.StrPeerAddr, "%02x%02x%02x%02x%02x%02x", SystemManager.PeerAddr[0],
+				SystemManager.PeerAddr[1],
+				SystemManager.PeerAddr[2],
+				SystemManager.PeerAddr[3],
+				SystemManager.PeerAddr[4],
+				SystemManager.PeerAddr[5]);
+			SystemManager.StrPeerAddr[12] = 0;
+
+		break;
+
+        case BLE_GAP_EVT_DISCONNECTED:
+			
+			NRF_LOG_INFO("<============ BLE_GAP_EVT_DISCONNECTED =========>");
+
+            // LED indication will be changed when advertising starts.
+            m_conn_handle = BLE_CONN_HANDLE_INVALID;
+			NVIC_SystemReset();
+
+#if 0
+			err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+            APP_ERROR_CHECK(err_code);
+
+			app_pwm_disable(&PWM1);
+
+			app_timer_stop(m_ms_timer_id);
+			app_timer_stop(m_our_char_timer_id);
+
+			
+	
+            app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);
+            err_code = sd_app_evt_wait();
+            APP_ERROR_CHECK(err_code);
+#endif
+        break;
+
+        case BLE_GAP_EVT_PHY_UPDATE_REQUEST:
+            NRF_LOG_DEBUG("PHY update request.");
+            ble_gap_phys_t const phys =
+            {
+                .rx_phys = BLE_GAP_PHY_AUTO,
+                .tx_phys = BLE_GAP_PHY_AUTO,
+            };
+            err_code = sd_ble_gap_phy_update(p_ble_evt->evt.gap_evt.conn_handle, &phys);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GAP_EVT_SEC_PARAMS_REQUEST:
+            // Pairing not supported
+            err_code = sd_ble_gap_sec_params_reply(m_conn_handle, BLE_GAP_SEC_STATUS_PAIRING_NOT_SUPP, NULL, NULL);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_SYS_ATTR_MISSING:
+            // No system attributes have been stored.
+            err_code = sd_ble_gatts_sys_attr_set(m_conn_handle, NULL, 0, 0);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTC_EVT_TIMEOUT:
+            // Disconnect on GATT Client timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gattc_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        case BLE_GATTS_EVT_TIMEOUT:
+            // Disconnect on GATT Server timeout event.
+            err_code = sd_ble_gap_disconnect(p_ble_evt->evt.gatts_evt.conn_handle,
+                                             BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            APP_ERROR_CHECK(err_code);
+        break;
+
+        default:
+            // No implementation needed.
+        break;
+    }
+}
+
+
+
+
+
+
+/**@brief Function for the SoftDevice initialization.
+ *
+ * @details This function initializes the SoftDevice and the BLE event interrupt.
+ */
+static void ble_stack_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_sdh_enable_request();
+    APP_ERROR_CHECK(err_code);
+
+    // Configure the BLE stack using the default settings.
+    // Fetch the start address of the application RAM.
+    uint32_t ram_start = 0;
+    err_code = nrf_sdh_ble_default_cfg_set(APP_BLE_CONN_CFG_TAG, &ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    // Enable BLE stack.
+    err_code = nrf_sdh_ble_enable(&ram_start);
+    APP_ERROR_CHECK(err_code);
+
+    
+    /* enable DCDC to save current */
+    err_code = sd_power_dcdc_mode_set(NRF_POWER_DCDC_ENABLE);
+    APP_ERROR_CHECK(err_code);
+
+    // Register a handler for BLE events.
+    NRF_SDH_BLE_OBSERVER(m_ble_observer, APP_BLE_OBSERVER_PRIO, ble_evt_handler, NULL);
+}
+
+
+/**@brief Function for handling events from the GATT library. */
+void gatt_evt_handler(nrf_ble_gatt_t * p_gatt, nrf_ble_gatt_evt_t const * p_evt)
+{
+    if ((m_conn_handle == p_evt->conn_handle) && (p_evt->evt_id == NRF_BLE_GATT_EVT_ATT_MTU_UPDATED))
+    {
+        m_ble_nus_max_data_len = p_evt->params.att_mtu_effective - OPCODE_LENGTH - HANDLE_LENGTH;
+        NRF_LOG_INFO("Data len is set to 0x%X(%d)", m_ble_nus_max_data_len, m_ble_nus_max_data_len);
+    }
+    NRF_LOG_DEBUG("ATT MTU exchange completed. central 0x%x peripheral 0x%x",
+                  p_gatt->att_mtu_desired_central,
+                  p_gatt->att_mtu_desired_periph);
+}
+
+
+/**@brief Function for initializing the GATT library. */
+void gatt_init(void)
+{
+    ret_code_t err_code;
+
+    err_code = nrf_ble_gatt_init(&m_gatt, gatt_evt_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = nrf_ble_gatt_att_mtu_periph_set(&m_gatt, NRF_SDH_BLE_GATT_MAX_MTU_SIZE);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling events from the BSP module.
+ *
+ * @param[in]   event   Event generated by button press.
+ */
+void bsp_event_handler(bsp_event_t event)
+{
+    uint32_t err_code;
+
+    NRF_LOG_INFO("BSP_EVENT_HANDLER => %d", event);
+
+    switch (event)
+    {
+
+		case BSP_EVENT_DFU:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_DFU=>%d", event); 
+		break;
+
+		case BSP_EVENT_ADVERTISING_START:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_START=>%d", event);	
+		break;
+
+
+		case BSP_EVENT_ADVERTISING_STOP:	// 들어오지 않음
+			NRF_LOG_INFO("@@@@@@@ BSP_EVENT_ADVERTISING_STOP=>%d", event);	
+		break;
+
+	
+        case BSP_EVENT_SLEEP:	// 들어오지 않음
+        	NRF_LOG_INFO("@@@@@@@ bsp_event_handler() --  BSP_EVENT_SLEEP");
+            //sleep_mode_enter();
+        break;
+
+		case BSP_EVENT_WAKEUP:  // 들어오지 않음
+
+		    NRF_LOG_INFO("@@@@@@@ BSP_EVENT_WAKEUP=>%d", event);	
+			
+			advertising_flag = 0;
+
+		break;
+
+        case BSP_EVENT_DISCONNECT:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_DISCONNECT");
+		  
+            err_code = sd_ble_gap_disconnect(m_conn_handle, BLE_HCI_REMOTE_USER_TERMINATED_CONNECTION);
+            if (err_code != NRF_ERROR_INVALID_STATE)
+            {
+                APP_ERROR_CHECK(err_code);
+            }
+        break;
+
+        case BSP_EVENT_WHITELIST_OFF:
+
+		  	NRF_LOG_INFO("bsp_event_handler() --  BSP_EVENT_WHITELIST_OFF");
+
+            if (m_conn_handle == BLE_CONN_HANDLE_INVALID)
+            {
+                err_code = ble_advertising_restart_without_whitelist(&m_advertising);
+                if (err_code != NRF_ERROR_INVALID_STATE)
+                {
+                    APP_ERROR_CHECK(err_code);
+                }
+            }
+		break;
+
+		case BSP_EVENT_KEY_1:		// event 15		TEST
+
+			LoadReceiverMac();
+
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);			
+			//strncpy( DEVICE_NAME, "ICSWES", 6);
+		break;
+
+
+		case BSP_EVENT_KEY_2:		// event 16		EMG
+
+			LoadReceiverMac();
+			//fds_register(fds_evt_handler);
+			//fds_init();
+			
+			Battery_Adc_Read();
+		
+			err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+			APP_ERROR_CHECK(err_code);
+			
+
+
+		break;
+
+        default:
+
+
+		break;
+
+    }
+}
+
+
+
+
+
+/* *@brief Undo the changes that we did when advertising has the timeout.
+*/
+void wakeup_timer_handler(void * p_context)
+{
+
+	uint32_t err_code;
+
+	
+	app_timer_stop(wakeup_timer_id);
+
+	app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+
+	bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+	
+	APP_ERROR_CHECK(err_code);
+	//err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
+	err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+	APP_ERROR_CHECK(err_code);
+
+	SystemManager.EmgSendButton = BUTTON_ALIVE;
+	NRF_LOG_INFO("==> Alive Send");
+
+	SystemTimer.EMG_SEND_RUN = 1;
+	SystemTimer.SEND_TIMER = 0;
+
+
+}
+
+
+
+static void timer_ms_timeout_handler(void * p_context)
+{
+	UNUSED_PARAMETER(p_context);
+
+	HSDInRun();
+	
+}
+
+	
+
+
+/**@brief   Function for handling app_uart events.
+ *
+ * @details This function will receive a single character from the app_uart module and append it to
+ *          a string. The string will be be sent over BLE when the last character received was a
+ *          'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length.
+ */
+/**@snippet [Handling the data received over UART] */
+void uart_event_handle(app_uart_evt_t * p_event)
+{
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t       err_code;
+
+    switch (p_event->evt_type)
+    {
+        case APP_UART_DATA_READY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA_READY");
+		
+            UNUSED_VARIABLE(app_uart_get(&data_array[index]));
+            index++;
+
+            if ((data_array[index - 1] == '\n') ||
+                (data_array[index - 1] == '\r') ||
+                (index >= m_ble_nus_max_data_len))
+            {
+                if (index > 1)
+                {
+                    NRF_LOG_DEBUG("Ready to send data over BLE NUS");
+                    NRF_LOG_HEXDUMP_DEBUG(data_array, index);
+
+                    do
+                    {
+                        uint16_t length = (uint16_t)index;
+                        err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+                        if ((err_code != NRF_ERROR_INVALID_STATE) &&
+                            (err_code != NRF_ERROR_RESOURCES) &&
+                            (err_code != NRF_ERROR_NOT_FOUND))
+                        {
+                            APP_ERROR_CHECK(err_code);
+                        }
+                    } while (err_code == NRF_ERROR_RESOURCES);
+                }
+
+                index = 0;
+            }
+            break;
+
+        case APP_UART_COMMUNICATION_ERROR:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_COMMUNICATION_ERROR");
+
+            APP_ERROR_HANDLER(p_event->data.error_communication);
+            break;
+
+        case APP_UART_FIFO_ERROR:
+			
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_FIFO_ERROR");
+
+		
+            APP_ERROR_HANDLER(p_event->data.error_code);
+            break;
+		
+		case APP_UART_TX_EMPTY:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_TX_EMPTY");
+
+			break;
+
+		case APP_UART_DATA:
+
+			NRF_LOG_DEBUG("uart_event_handle -- APP_UART_DATA");
+
+			break;
+
+        default:
+            break;
+    }
+}
+/**@snippet [Handling the data received over UART] */
+
+
+/**@brief  Function for initializing the UART module.
+ */
+/**@snippet [UART Initialization] */
+static void uart_init(void)
+{
+    uint32_t                     err_code;
+    app_uart_comm_params_t const comm_params =
+    {
+        .rx_pin_no    = RX_PIN_NUMBER,
+        .tx_pin_no    = TX_PIN_NUMBER,
+        .rts_pin_no   = RTS_PIN_NUMBER,
+        .cts_pin_no   = CTS_PIN_NUMBER,
+        .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
+        .use_parity   = false,
+#if defined (UART_PRESENT)
+        .baud_rate    = NRF_UART_BAUDRATE_115200
+#else
+        .baud_rate    = NRF_UARTE_BAUDRATE_115200
+#endif
+    };
+
+    APP_UART_FIFO_INIT(&comm_params,
+                       UART_RX_BUF_SIZE,
+                       UART_TX_BUF_SIZE,
+                       uart_event_handle,
+                       APP_IRQ_PRIORITY_LOWEST,
+                       err_code);
+    APP_ERROR_CHECK(err_code);
+}
+/**@snippet [UART Initialization] */
+
+
+
+
+
+/**@brief Function for initializing the Advertising functionality.
+ */
+static void advertising_init(void)
+{
+
+ //p_m_advertising->adv_data.adv_data.p_data = p_m_advertising->enc_advdata;
+
+	ret_code_t			   err_code;
+	ble_advertising_init_t init;
+	char plevel = 0xfe;
+	ble_advdata_conn_int_t connParams;
+
+	connParams.min_conn_interval = 0x20;
+	connParams.max_conn_interval = 0x28;
+
+	memset(&init, 0, sizeof(init));
+
+	init.advdata.name_type 		 = BLE_ADVDATA_FULL_NAME;
+	init.advdata.include_appearance = false;
+	init.advdata.flags 			 = BLE_GAP_ADV_FLAGS_LE_ONLY_LIMITED_DISC_MODE;
+	init.advdata.p_tx_power_level = &plevel;
+	init.advdata.p_slave_conn_int = &connParams;
+
+
+	// Prepare the scan response manufacturer specific data packet
+	ble_advdata_manuf_data_t  manuf_data_response;
+	uint8_t					 data_response[] = "M";
+	
+	manuf_data_response.company_identifier  = 0x0059;
+	manuf_data_response.data.p_data		 = data_response;
+	manuf_data_response.data.size			 = sizeof(data_response);
+	init.srdata.name_type = BLE_ADVDATA_FULL_NAME;
+	init.srdata.p_manuf_specific_data = &manuf_data_response;
+
+	init.config.ble_adv_fast_enabled  = true;
+	init.config.ble_adv_fast_interval = APP_ADV_INTERVAL;
+	init.config.ble_adv_fast_timeout  = APP_ADV_DURATION;
+
+	init.evt_handler = on_adv_evt;
+
+	err_code = ble_advertising_init(&m_advertising, &init);
+	APP_ERROR_CHECK(err_code);
+
+	ble_advertising_conn_cfg_tag_set(&m_advertising, APP_BLE_CONN_CFG_TAG);
+ 
+	p_m_advertising = &m_advertising;
+
+}
+
+
+/**@brief Function for initializing buttons and leds.
+ *
+ * @param[out] p_erase_bonds  Will be true if the clear bonding button was pressed to wake the application up.
+ */
+static void buttons_leds_init(bool * p_erase_bonds)
+{
+    bsp_event_t startup_event;
+
+    uint32_t err_code = bsp_init(BSP_INIT_LEDS | BSP_INIT_BUTTONS, bsp_event_handler);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = bsp_btn_ble_init(NULL, &startup_event);
+    APP_ERROR_CHECK(err_code);
+
+    *p_erase_bonds = (startup_event == BSP_EVENT_CLEAR_BONDING_DATA);
+}
+
+
+/**@brief Function for initializing the nrf log module.
+ */
+static void log_init(void)
+{
+    ret_code_t err_code = NRF_LOG_INIT(NULL);
+    APP_ERROR_CHECK(err_code);
+
+    NRF_LOG_DEFAULT_BACKENDS_INIT();
+}
+
+
+/**@brief Function for initializing power management.
+ */
+static void power_management_init(void)
+{
+    ret_code_t err_code;
+    err_code = nrf_pwr_mgmt_init();
+    APP_ERROR_CHECK(err_code);
+}
+
+
+/**@brief Function for handling the idle state (main loop).
+ *
+ * @details If there is no pending log operation, then sleep until next the next event occurs.
+ */
+static void idle_state_handle(void)
+{
+    if (NRF_LOG_PROCESS() == false)
+    {
+        nrf_pwr_mgmt_run();
+    }
+}
+
+
+/**@brief Function for starting advertising.
+ */
+void advertising_start(void)
+{
+
+    uint32_t err_code = ble_advertising_start(&m_advertising, BLE_ADV_MODE_FAST);
+    APP_ERROR_CHECK(err_code);
+
+	advertising_flag = 1;
+}
+
+
+
+static void leds_config(void)
+{
+    bsp_board_init(BSP_INIT_LEDS);
+}
+
+
+
+void Battery_Adc_Read(void)
+{
+	uint32_t avr = 0;
+
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[0]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[1]);
+	nrf_delay_ms(5);
+	nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, &m_buffer_pool[2]);
+
+	avr = m_buffer_pool[0] + m_buffer_pool[1] + m_buffer_pool[2];
+	avr /= 3;
+
+
+	SystemManager.Batt = (((float)avr*0.708)-200.0)*(100.0/(330.0-200.0));
+
+	if(SystemManager.Batt > 100)
+		SystemManager.Batt = 100;
+
+	NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)avr*0.708), SystemManager.Batt);
+
+	
+
+#if 0
+	if(nrf_drv_saadc_sample_convert(NRF_SAADC_INPUT_AIN2, m_buffer_pool) == NRF_SUCCESS)
+	{
+//		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)/330.0)*100;
+		SystemManager.Batt = (((float)m_buffer_pool[0]*0.708)-200.0)*(100.0/(330.0-200.0));
+
+		if(SystemManager.Batt > 100)
+			SystemManager.Batt = 100;
+
+		NRF_LOG_INFO("Vol:%d -- [%d]\r\n",(int)((float)m_buffer_pool[0]*0.708), SystemManager.Batt);
+	}
+#endif
+
+
+}
+
+
+
+
+void Buzzer_Select(uint8_t state)
+{
+	switch(state){
+		case BUZZER_NONE:
+
+		break;
+
+		case BUZZER_EMG:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 1;
+
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 200;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_TEST:
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 2;
+			
+				if(SystemManager.Batt > BATTERY_LOW_LEVEL)
+					SystemTimer.BUZZER_TIMER = 100;
+				else
+					SystemTimer.BUZZER_TIMER = 600;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+		break;
+
+		case BUZZER_REG:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 3;
+				SystemTimer.BUZZER_TIMER = 500;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;
+
+		case BUZZER_BOOT_LOADER:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = 4;
+				SystemTimer.BUZZER_TIMER = 1000;
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+			}
+
+		break;		
+
+		case BUZZER_POWER_ON:
+
+			if( SystemManager.BuzzerType == BUZZER_NONE )
+			{
+				SystemManager.BuzzerType = BUZZER_POWER_ON;
+				
+				SystemTimer.BUZZER_TIMER = 300;
+				
+				
+				app_pwm_enable(&PWM1);
+				app_pwm_channel_duty_set(&PWM1, 0, 50);
+
+			}
+
+		break;	
+
+		
+	}
+
+}
+
+
+// 송신기 EMG 신호를 전송
+void SendEmgData(void)
+{
+
+    static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+    static uint8_t index = 0;
+    uint32_t err_code;
+    uint16_t length;
+	int i;
+
+
+	NRF_LOG_INFO("SendEmgData(%d)", SystemManager.Batt);
+
+
+    data_array[0] = COMMAND_TYPE;
+
+    data_array[1] = 0;    
+    data_array[2] = 0;
+    data_array[3] = 0;
+    data_array[4] = 0;
+	
+    data_array[5] = 1;
+    data_array[6] = 1;
+    data_array[7] = 1;
+    data_array[8] = 1;
+	
+    data_array[9]  = new_ble_addr.addr[3];
+    data_array[10] = new_ble_addr.addr[4];
+    data_array[11] = new_ble_addr.addr[5];
+	
+    data_array[12] = COMMAND_EMG;
+	
+    data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;        
+    data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+
+	WesEncryptEcb( &data_array[1] );
+
+    err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+
+	for( i=0; i<17; i++)
+	{
+		NRF_LOG_RAW_INFO("%02x ", data_array[i]);
+	}
+	
+	NRF_LOG_RAW_INFO("\n");
+
+
+
+    SystemManager.BleSendStatus = err_code;
+
+    if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+    {
+        APP_ERROR_CHECK(err_code);
+    }
+
+	//SystemTimer.SLEEP_TIMER = 0;
+	//SystemManager.SleepEnter = 1;
+	
+}
+
+
+
+// 송신기 Test 신호를 전송
+void SendTestData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendTestData()");
+
+
+	data_array[0] = COMMAND_TYPE;
+	
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] 	= new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_TEST;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;
+	data_array[16] = 0x3;
+	
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+void SendAliveData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+	NRF_LOG_INFO("SendAliveData()");
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] = new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_ALIVE;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+    data_array[15] = VER_LOW_VALUE;      
+	data_array[16] = 0x3;
+
+	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+	}
+
+}
+
+
+
+
+
+// 등록모드 
+void SendRegData(void)
+{
+
+	static uint8_t data_array[BLE_NUS_MAX_DATA_LEN];
+	static uint8_t index = 0;
+	uint32_t	   err_code;
+	uint16_t length;
+
+
+	NRF_LOG_INFO("SendRegData()");
+
+
+#if 0
+	if( SystemManager.BuzzerType == 0 )
+	{
+		SystemManager.BuzzerType = 3;
+		SystemTimer.BUZZER_TIMER = 500;
+		app_pwm_enable(&PWM1);
+		app_pwm_channel_duty_set(&PWM1, 0, 50);
+	}
+#endif
+
+	data_array[0] = COMMAND_TYPE;
+
+	data_array[1] = 0;	  
+	data_array[2] = 0;
+	data_array[3] = 0;
+	data_array[4] = 0;
+	
+	data_array[5] = 1;
+	data_array[6] = 1;
+	data_array[7] = 1;
+	data_array[8] = 1;
+	
+	data_array[9] =  new_ble_addr.addr[3];
+	data_array[10] = new_ble_addr.addr[4];
+	data_array[11] = new_ble_addr.addr[5];
+	
+	data_array[12] = COMMAND_REG;
+	
+	data_array[13] = SystemManager.Batt;
+	
+    data_array[14] = VER_HIGH_VALUE;
+	data_array[15] = VER_LOW_VALUE; 
+	data_array[16] = 0x3;
+	
+ 	length = COMMAND_LENGTH;
+
+	WesEncryptEcb( &data_array[1] );
+
+	err_code = ble_nus_data_send(&m_nus, data_array, &length, m_conn_handle);
+
+	SystemManager.BleSendStatus = err_code;
+
+	if ((err_code != NRF_ERROR_RESOURCES)&&(err_code != NRF_ERROR_INVALID_STATE) && (err_code != NRF_ERROR_BUSY) && (err_code != NRF_ERROR_NOT_FOUND))// (or anything else you want to filter out...)
+	{
+		APP_ERROR_CHECK(err_code);
+
+//		RegMacDelteAll();
+//		SaveReceiverMac(SystemManager.StrPeerAddr);
+	}else{
+		
+	}
+
+}
+
+
+
+void pwm_ready_callback(uint32_t pwm_id)    // PWM callback function
+{
+    ready_flag = true;
+}
+
+
+void pwmInit(void)
+{
+
+    ret_code_t err_code;
+
+   app_pwm_config_t pwm1_cfg = APP_PWM_DEFAULT_CONFIG_1CH(370L, 7);		//1000L -> 1Khz, 500L -> 2Khz,  370L -> 2.7Khz   
+
+
+    /* Switch the polarity of the second channel. */
+    //pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_LOW;
+	pwm1_cfg.pin_polarity[0] = APP_PWM_POLARITY_ACTIVE_HIGH;
+	
+
+    /* Initialize and enable PWM. */
+    err_code = app_pwm_init(&PWM1,&pwm1_cfg,pwm_ready_callback);
+    APP_ERROR_CHECK(err_code);
+}
+
+
+
+#define SND_WDT_SLEEP_CONFIG                                               \
+{                                                                         \
+    .behaviour          = (nrf_wdt_behaviour_t)NRFX_WDT_CONFIG_BEHAVIOUR, \
+    .reload_value       = SLEEP_WDT_LIMIT,                   \
+    NRFX_WDT_IRQ_CONFIG                                                   \
+}
+
+
+void WdtRunMode()
+{
+	nrf_wdt_reload_value_set(RUN_TIME_LIMIT);	//10sec
+}
+
+
+
+void WdtSleepMode()
+{
+	uint32_t err_code;
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+
+
+}
+
+
+void ReMac_Mapping()
+{
+
+
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+
+ 	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+
+	dd.addr[0] = IES200_1ST_MAC;
+	dd.addr[1] = IES200_2ST_MAC;
+	dd.addr[2] = IES200_3ST_MAC;
+	dd.addr[3] = old_ble_addr.addr[3];
+	dd.addr[4] = old_ble_addr.addr[4];
+	dd.addr[5] = old_ble_addr.addr[5];
+	
+	sd_ble_gap_addr_set(&dd);
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+	DEVICE_NAME[9] = dd.addr[3];
+	DEVICE_NAME[10] = dd.addr[4];
+	DEVICE_NAME[11] = dd.addr[5];
+
+	NRF_LOG_INFO("MAC Address : %02X %02X %02X", dd.addr[3], dd.addr[4], dd.addr[5]);
+
+}
+
+/**@brief Application main function.
+ */
+int main(void)
+{
+
+	uint32_t err_code = NRF_SUCCESS;
+
+	bool erase_bonds;
+
+	uint8_t flash_buf = 0x00;
+	
+
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+	NRF_LOG_RAW_INFO("ICS-200B Program Start --- Ver 1.10 2022/03/24");	
+	NRF_LOG_RAW_INFO("\n===========================================================\n\n");
+
+
+	// Initialize.
+	//uart_init();
+	SaadcInit();
+	log_init();
+
+	/* Register first to receive an event when initialization is complete. */
+    (void) fds_register(fds_evt_handler);
+	
+	pwmInit();
+
+	err_code = fds_init();
+    APP_ERROR_CHECK(err_code);
+
+
+	// ---------------------------------------
+	err_code = nrf_drv_clock_init(NULL);
+	APP_ERROR_CHECK(err_code);
+	nrf_drv_clock_lfclk_request();
+	//----------------------------------------
+
+	
+	timers_init();
+	HSDInInit();
+
+	SystemManager.GpReg = nrf_power_gpregret_get();
+	buttons_leds_init(&erase_bonds);
+	power_management_init();
+	ble_stack_init();
+
+	ReMac_Mapping();
+
+	SystemManager.ResetReason =  NRF_POWER->RESETREAS;
+	SystemManager.BleSendStatus = -1;
+	
+	gap_params_init();
+	gatt_init();
+	services_init();
+	advertising_init();
+	conn_params_init();
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+	//err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+	//APP_ERROR_CHECK(err_code);
+
+	// Start execution.
+	//printf("\r\nUART started.\r\n");
+	NRF_LOG_INFO("Debug logging for UART over RTT started.");
+	//advertising_start();
+
+
+    ParkSysInit();
+	bsp_board_leds_off();
+
+	SystemManager.SendRepeat = 0;
+	SystemManager.SendRepeatTimerLimit = 30000;	// on time
+
+	err_code = bsp_indication_set(BSP_INDICATE_IDLE);
+    APP_ERROR_CHECK(err_code);
+
+	NRF_LOG_INFO("-----------------------------------------------");
+
+	NRF_LOG_RAW_INFO("Wdt SleepMode Setting\n");
+	
+    nrf_drv_wdt_config_t config = SND_WDT_SLEEP_CONFIG;
+
+    err_code = nrf_drv_wdt_init(&config, wdt_event_handler);
+    APP_ERROR_CHECK(err_code);
+    err_code = nrf_drv_wdt_channel_alloc(&m_channel_id);
+    APP_ERROR_CHECK(err_code);
+    nrf_drv_wdt_enable();
+
+	NRF_LOG_INFO("-----------------------------------------------");
+
+	if( SystemManager.GpReg == 0x00 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_EMG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+		
+	}
+#if 0	
+	else if( SystemManager.GpReg == 0x04 )
+	{
+		err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);
+		err_code = app_timer_start(m_our_char_timer_id, OUR_CHAR_TIMER_INTERVAL, NULL);
+		APP_ERROR_CHECK(err_code);			
+
+
+		SystemManager.EmgSendButton = BUTTON_REG;
+		SystemTimer.EMG_SEND_RUN = 1;
+		SystemTimer.SEND_TIMER = 0;	
+		Buzzer_Select(BUZZER_POWER_ON);
+		
+		for (;;)
+		{
+			idle_state_handle();
+
+			if( SystemManager.GoSleep == 1 )
+			{
+				app_timer_stop(m_ms_timer_id);
+				app_timer_stop(m_our_char_timer_id);
+				break;
+			}
+		}
+		
+		nrf_power_gpregret_set(0x02);
+	}
+#endif
+	
+//	WdtSleepMode();
+//	nrf_drv_wdt_channel_feed(m_channel_id);
+
+	
+
+
+
+    app_timer_start(wakeup_timer_id, WAKEUP_TIME_INVERVAL, NULL);		// Wake Up Timer Reset
+    err_code = sd_app_evt_wait();										// jakuja  GOTO SLEEP MODE
+    APP_ERROR_CHECK(err_code);
+
+//	<---------------------------------------------------------------->
+	
+	Battery_Adc_Read();
+
+//	WdtRunMode();
+
+	// Enter main loop.
+	for (;;)
+	{
+		SysCounter++;
+		idle_state_handle();
+	}
+}
+
+
+/**
+ * @}
+ */

+ 482 - 0
IES200RB.si4project/Backup/nrf_pwr_mgmt(2287).c

@@ -0,0 +1,482 @@
+/**
+ * Copyright (c) 2016 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+#include "sdk_common.h"
+#if NRF_MODULE_ENABLED(NRF_PWR_MGMT)
+
+#include "nrf_pwr_mgmt.h"
+#include "nrf.h"
+#include "nrf_mtx.h"
+#include "nrf_power.h"
+#include "app_error.h"
+#include "nrf_assert.h"
+#include "nrf_log_ctrl.h"
+#include "app_util_platform.h"
+
+#define NRF_LOG_MODULE_NAME pwr_mgmt
+#if NRF_PWR_MGMT_CONFIG_LOG_ENABLED
+    #define NRF_LOG_LEVEL       NRF_PWR_MGMT_CONFIG_LOG_LEVEL
+    #define NRF_LOG_INFO_COLOR  NRF_PWR_MGMT_CONFIG_INFO_COLOR
+    #define NRF_LOG_DEBUG_COLOR NRF_PWR_MGMT_CONFIG_DEBUG_COLOR
+#else
+    #define NRF_LOG_LEVEL       0
+#endif // NRF_PWR_MGMT_CONFIG_LOG_ENABLED
+#include "nrf_log.h"
+NRF_LOG_MODULE_REGISTER();
+
+#ifdef SOFTDEVICE_PRESENT
+    #include "nrf_soc.h"
+    #include "nrf_sdh.h"
+#endif // SOFTDEVICE_PRESENT
+
+
+#if NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+    #if (APP_SCHEDULER_ENABLED != 1)
+        #error "APP_SCHEDULER is required."
+    #endif
+    #include "app_scheduler.h"
+#endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+
+
+// Create section "pwr_mgmt_data".
+NRF_SECTION_SET_DEF(pwr_mgmt_data,
+                    nrf_pwr_mgmt_shutdown_handler_t,
+                    NRF_PWR_MGMT_CONFIG_HANDLER_PRIORITY_COUNT);
+
+static nrf_pwr_mgmt_evt_t   m_pwr_mgmt_evt;     /**< Event type which will be passed to the shutdown
+                                                     handlers.*/
+static nrf_mtx_t            m_sysoff_mtx;       /**< Module API lock.*/
+static bool                 m_shutdown_started; /**< True if application started the shutdown preparation. */
+static nrf_section_iter_t   m_handlers_iter;    /**< Shutdown handlers iterator. */
+
+#if (NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED && __FPU_PRESENT)
+    #define PWR_MGMT_FPU_SLEEP_PREPARE()     pwr_mgmt_fpu_sleep_prepare()
+
+     __STATIC_INLINE void pwr_mgmt_fpu_sleep_prepare(void)
+     {
+        uint32_t original_fpscr;
+
+        CRITICAL_REGION_ENTER();
+        original_fpscr = __get_FPSCR();
+        /*
+         * Clear FPU exceptions.
+         * Without this step, the FPU interrupt is marked as pending,
+         * preventing system from sleeping. Exceptions cleared:
+         * - IOC - Invalid Operation cumulative exception bit.
+         * - DZC - Division by Zero cumulative exception bit.
+         * - OFC - Overflow cumulative exception bit.
+         * - UFC - Underflow cumulative exception bit.
+         * - IXC - Inexact cumulative exception bit.
+         * - IDC - Input Denormal cumulative exception bit.
+         */
+        __set_FPSCR(original_fpscr & ~0x9Fu);
+        __DMB();
+        NVIC_ClearPendingIRQ(FPU_IRQn);
+        CRITICAL_REGION_EXIT();
+
+        /*
+         * The last chance to indicate an error in FPU to the user 
+         * as the FPSCR is now cleared
+         *
+         * This assert is related to previous FPU operations 
+         * and not power management.
+         *
+         * Critical FPU exceptions signaled:
+         * - IOC - Invalid Operation cumulative exception bit.
+         * - DZC - Division by Zero cumulative exception bit.
+         * - OFC - Overflow cumulative exception bit.
+         */
+        ASSERT((original_fpscr & 0x7) == 0);
+     }
+#else
+    #define PWR_MGMT_FPU_SLEEP_PREPARE()
+#endif // NRF_PWR_MGMT_CONFIG_FPU_SUPPORT_ENABLED
+
+
+#if NRF_PWR_MGMT_CONFIG_DEBUG_PIN_ENABLED
+    #undef  PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+    #define PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+
+    #include "nrf_gpio.h"
+    #define PWR_MGMT_DEBUG_PINS_INIT()   pwr_mgmt_debug_pins_init()
+    #define PWR_MGMT_DEBUG_PIN_CLEAR()   nrf_gpio_pin_clear(NRF_PWR_MGMT_SLEEP_DEBUG_PIN)
+    #define PWR_MGMT_DEBUG_PIN_SET()     nrf_gpio_pin_set(NRF_PWR_MGMT_SLEEP_DEBUG_PIN)
+
+    __STATIC_INLINE void pwr_mgmt_debug_pins_init(void)
+    {
+        nrf_gpio_pin_clear(NRF_PWR_MGMT_SLEEP_DEBUG_PIN);
+        nrf_gpio_cfg_output(NRF_PWR_MGMT_SLEEP_DEBUG_PIN);
+    }
+
+#else
+    #define PWR_MGMT_DEBUG_PIN_CLEAR()
+    #define PWR_MGMT_DEBUG_PIN_SET()
+    #define PWR_MGMT_DEBUG_PINS_INIT()
+#endif
+
+
+#if NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED
+    #undef  PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+    #define PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+
+    #undef  PWR_MGMT_TIMER_REQUIRED
+    #define PWR_MGMT_TIMER_REQUIRED
+    #include "app_timer.h"
+
+    #define PWR_MGMT_CPU_USAGE_MONITOR_INIT()    pwr_mgmt_cpu_usage_monitor_init()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_UPDATE()  pwr_mgmt_cpu_usage_monitor_update()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SUMMARY() NRF_LOG_INFO("Maximum CPU usage: %u%%", \
+                                                              m_max_cpu_usage)
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SECTION_ENTER()  \
+        {                                               \
+            uint32_t sleep_start = app_timer_cnt_get()
+
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SECTION_EXIT()                       \
+            uint32_t sleep_end = app_timer_cnt_get();                       \
+            uint32_t sleep_duration;                                        \
+            sleep_duration = app_timer_cnt_diff_compute(sleep_end,          \
+                                                       sleep_start);        \
+            m_ticks_sleeping += sleep_duration;                             \
+        }
+
+    static uint32_t m_ticks_sleeping;    /**< Number of ticks spent in sleep mode (__WFE()). */
+    static uint32_t m_ticks_last;        /**< Number of ticks from the last CPU usage computation. */
+    static uint8_t  m_max_cpu_usage;     /**< Maximum observed CPU usage (0 - 100%). */
+
+    __STATIC_INLINE void pwr_mgmt_cpu_usage_monitor_init(void)
+    {
+        m_ticks_sleeping    = 0;
+        m_ticks_last        = 0;
+        m_max_cpu_usage     = 0;
+    }
+
+    __STATIC_INLINE void pwr_mgmt_cpu_usage_monitor_update(void)
+    {
+        uint32_t delta;
+        uint32_t ticks;
+        uint8_t  cpu_usage;
+
+        ticks = app_timer_cnt_get();
+        delta = app_timer_cnt_diff_compute(ticks, m_ticks_last);
+        cpu_usage = 100 * (delta - m_ticks_sleeping) / delta;
+
+        NRF_LOG_INFO("CPU Usage: %u%%", cpu_usage);
+        if (m_max_cpu_usage < cpu_usage)
+        {
+            m_max_cpu_usage = cpu_usage;
+        }
+
+        m_ticks_last        = ticks;
+        m_ticks_sleeping    = 0;
+    }
+
+#else
+    #define PWR_MGMT_CPU_USAGE_MONITOR_INIT()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_UPDATE()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SUMMARY()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SECTION_ENTER()
+    #define PWR_MGMT_CPU_USAGE_MONITOR_SECTION_EXIT()
+#endif // NRF_PWR_MGMT_CONFIG_CPU_USAGE_MONITOR_ENABLED
+
+
+#if NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED
+    #undef  PWR_MGMT_TIMER_REQUIRED
+    #define PWR_MGMT_TIMER_REQUIRED
+
+    #define PWR_MGMT_STANDBY_TIMEOUT_INIT()  pwr_mgmt_standby_timeout_clear()
+    #define PWR_MGMT_STANDBY_TIMEOUT_CLEAR() pwr_mgmt_standby_timeout_clear()
+    #define PWR_MGMT_STANDBY_TIMEOUT_CHECK() pwr_mgmt_standby_timeout_check()
+
+    static uint16_t m_standby_counter;     /**< Number of seconds from the last activity
+                                                (@ref pwr_mgmt_feed). */
+
+    __STATIC_INLINE void pwr_mgmt_standby_timeout_clear(void)
+    {
+        m_standby_counter = 0;
+    }
+
+    __STATIC_INLINE void pwr_mgmt_standby_timeout_check(void)
+    {
+        if (m_standby_counter < NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_S)
+        {
+            m_standby_counter++;
+        }
+        else if (m_shutdown_started == false)
+        {
+            nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_GOTO_SYSOFF);
+        }
+    }
+
+#else
+    #define PWR_MGMT_STANDBY_TIMEOUT_INIT()
+    #define PWR_MGMT_STANDBY_TIMEOUT_CLEAR()
+    #define PWR_MGMT_STANDBY_TIMEOUT_CHECK()
+#endif // NRF_PWR_MGMT_CONFIG_STANDBY_TIMEOUT_ENABLED
+
+
+#if NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY
+    #undef  PWR_MGMT_TIMER_REQUIRED
+    #define PWR_MGMT_TIMER_REQUIRED
+
+    #define PWR_MGMT_AUTO_SHUTDOWN_RETRY() pwr_mgmt_auto_shutdown_retry()
+
+    __STATIC_INLINE void pwr_mgmt_auto_shutdown_retry(void)
+    {
+        if (m_shutdown_started)
+        {
+            // Try to continue the shutdown procedure.
+            nrf_pwr_mgmt_shutdown(NRF_PWR_MGMT_SHUTDOWN_CONTINUE);
+        }
+    }
+
+#else
+    #define PWR_MGMT_AUTO_SHUTDOWN_RETRY()
+#endif // NRF_PWR_MGMT_CONFIG_AUTO_SHUTDOWN_RETRY
+
+
+#ifdef PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+    #define PWR_MGMT_SLEEP_INIT()           pwr_mgmt_sleep_init()
+    #define PWR_MGMT_SLEEP_LOCK_ACQUIRE()   CRITICAL_REGION_ENTER()
+    #define PWR_MGMT_SLEEP_LOCK_RELEASE()   CRITICAL_REGION_EXIT()
+
+    __STATIC_INLINE void pwr_mgmt_sleep_init(void)
+    {
+    #ifdef SOFTDEVICE_PRESENT
+        ASSERT(current_int_priority_get() >= APP_IRQ_PRIORITY_LOW);
+    #endif
+        SCB->SCR |= SCB_SCR_SEVONPEND_Msk;
+    }
+
+#else
+    #define PWR_MGMT_SLEEP_INIT()
+    #define PWR_MGMT_SLEEP_LOCK_ACQUIRE()
+    #define PWR_MGMT_SLEEP_LOCK_RELEASE()
+#endif // PWR_MGMT_SLEEP_IN_CRITICAL_SECTION_REQUIRED
+
+
+#ifdef PWR_MGMT_TIMER_REQUIRED
+    #include "app_timer.h"
+    #define PWR_MGMT_TIMER_CREATE()     pwr_mgmt_timer_create()
+
+    APP_TIMER_DEF(m_pwr_mgmt_timer);    /**< Timer used by this module. */
+
+    /**@brief Handle events from m_pwr_mgmt_timer.
+     */
+    static void nrf_pwr_mgmt_timeout_handler(void * p_context)
+    {
+        PWR_MGMT_CPU_USAGE_MONITOR_UPDATE();
+        PWR_MGMT_AUTO_SHUTDOWN_RETRY();
+        PWR_MGMT_STANDBY_TIMEOUT_CHECK();
+    }
+
+    __STATIC_INLINE ret_code_t pwr_mgmt_timer_create(void)
+    {
+        ret_code_t ret_code = app_timer_create(&m_pwr_mgmt_timer,
+                                               APP_TIMER_MODE_REPEATED,
+                                               nrf_pwr_mgmt_timeout_handler);
+        if (ret_code != NRF_SUCCESS)
+        {
+            return ret_code;
+        }
+
+        return app_timer_start(m_pwr_mgmt_timer, APP_TIMER_TICKS(1000), NULL);
+    }
+#else
+    #define PWR_MGMT_TIMER_CREATE() NRF_SUCCESS
+#endif // PWR_MGMT_TIMER_REQUIRED
+
+ret_code_t nrf_pwr_mgmt_init(void)
+{
+    NRF_LOG_INFO("Init");
+
+    m_shutdown_started = false;
+    nrf_mtx_init(&m_sysoff_mtx);
+    nrf_section_iter_init(&m_handlers_iter, &pwr_mgmt_data);
+
+    PWR_MGMT_SLEEP_INIT();
+    PWR_MGMT_DEBUG_PINS_INIT();
+    PWR_MGMT_STANDBY_TIMEOUT_INIT();
+    PWR_MGMT_CPU_USAGE_MONITOR_INIT();
+
+    return PWR_MGMT_TIMER_CREATE();
+}
+
+void nrf_pwr_mgmt_run(void)
+{
+    PWR_MGMT_FPU_SLEEP_PREPARE();
+    PWR_MGMT_SLEEP_LOCK_ACQUIRE();
+    PWR_MGMT_CPU_USAGE_MONITOR_SECTION_ENTER();
+    PWR_MGMT_DEBUG_PIN_SET();
+
+    // Wait for an event.
+#ifdef SOFTDEVICE_PRESENT
+    if (nrf_sdh_is_enabled())
+    {
+        ret_code_t ret_code = sd_app_evt_wait();
+        ASSERT((ret_code == NRF_SUCCESS) || (ret_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED));
+        UNUSED_VARIABLE(ret_code);
+    }
+    else
+#endif // SOFTDEVICE_PRESENT
+    {
+        // Wait for an event.
+        __WFE();
+        // Clear the internal event register.
+        __SEV();
+        __WFE();
+    }
+
+    PWR_MGMT_DEBUG_PIN_CLEAR();
+    PWR_MGMT_CPU_USAGE_MONITOR_SECTION_EXIT();
+    PWR_MGMT_SLEEP_LOCK_RELEASE();
+}
+
+void nrf_pwr_mgmt_feed(void)
+{
+    NRF_LOG_DEBUG("Feed");
+    // It does not stop started shutdown process.
+    PWR_MGMT_STANDBY_TIMEOUT_CLEAR();
+}
+
+/**@brief Function runs the shutdown procedure.
+ */
+static void shutdown_process(void)
+{
+    NRF_LOG_INFO("Shutdown started. Type %d", m_pwr_mgmt_evt);
+    // Executing all callbacks.
+    for (/* m_handlers_iter is initialized in nrf_pwr_mgmt_init(). Thanks to that each handler is
+            called only once.*/;
+         nrf_section_iter_get(&m_handlers_iter) != NULL;
+         nrf_section_iter_next(&m_handlers_iter))
+    {
+        nrf_pwr_mgmt_shutdown_handler_t * p_handler =
+            (nrf_pwr_mgmt_shutdown_handler_t *) nrf_section_iter_get(&m_handlers_iter);
+        if ((*p_handler)(m_pwr_mgmt_evt))
+        {
+            NRF_LOG_INFO("SysOff handler 0x%08X => ready", (unsigned int)*p_handler);
+        }
+        else
+        {
+            // One of the modules is not ready.
+            NRF_LOG_INFO("SysOff handler 0x%08X => blocking", (unsigned int)*p_handler);
+            return;
+        }
+    }
+
+    PWR_MGMT_CPU_USAGE_MONITOR_SUMMARY();
+    NRF_LOG_INFO("Shutdown complete.");
+    NRF_LOG_FINAL_FLUSH();
+
+    if ((m_pwr_mgmt_evt == NRF_PWR_MGMT_EVT_PREPARE_RESET)
+     || (m_pwr_mgmt_evt == NRF_PWR_MGMT_EVT_PREPARE_DFU))
+    {
+        NVIC_SystemReset();
+    }
+    else
+    {
+        // Enter System OFF.
+#ifdef SOFTDEVICE_PRESENT
+        if (nrf_sdh_is_enabled())
+        {
+            ret_code_t ret_code = sd_power_system_off();
+            ASSERT((ret_code == NRF_SUCCESS) || (ret_code == NRF_ERROR_SOFTDEVICE_NOT_ENABLED));
+            UNUSED_VARIABLE(ret_code);
+#ifdef DEBUG
+            while (true)
+            {
+                /* Since the CPU is kept on in an emulated System OFF mode, it is recommended
+                 * to add an infinite loop directly after entering System OFF, to prevent
+                 * the CPU from executing code that normally should not be executed. */
+                __WFE();
+
+            }
+#endif
+        }
+#endif // SOFTDEVICE_PRESENT
+        nrf_power_system_off();
+    }
+}
+
+#if NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+/**@brief Handle events from app_scheduler.
+ */
+static void scheduler_shutdown_handler(void * p_event_data, uint16_t event_size)
+{
+    UNUSED_PARAMETER(p_event_data);
+    UNUSED_PARAMETER(event_size);
+    shutdown_process();
+}
+#endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+
+void nrf_pwr_mgmt_shutdown(nrf_pwr_mgmt_shutdown_t shutdown_type)
+{
+    // Check if shutdown procedure is not started.
+    if (!nrf_mtx_trylock(&m_sysoff_mtx))
+    {
+        return;
+    }
+
+    if (shutdown_type != NRF_PWR_MGMT_SHUTDOWN_CONTINUE)
+    {
+        if (m_shutdown_started)
+        {
+            nrf_mtx_unlock(&m_sysoff_mtx);
+            return;
+        }
+        else
+        {
+            m_pwr_mgmt_evt      = (nrf_pwr_mgmt_evt_t)shutdown_type;
+            m_shutdown_started  = true;
+        }
+    }
+
+    ASSERT(m_shutdown_started);
+    NRF_LOG_INFO("Shutdown request %d", shutdown_type);
+
+#if NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+    ret_code_t ret_code = app_sched_event_put(NULL, 0, scheduler_shutdown_handler);
+    APP_ERROR_CHECK(ret_code);
+#else
+    shutdown_process();
+#endif // NRF_PWR_MGMT_CONFIG_USE_SCHEDULER
+
+    nrf_mtx_unlock(&m_sysoff_mtx);
+}
+
+#endif // NRF_MODULE_ENABLED(NRF_PWR_MGMT)

+ 168 - 0
IES200RB.si4project/Backup/nrfx_wdt(2879).c

@@ -0,0 +1,168 @@
+/**
+ * Copyright (c) 2015 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <nrfx.h>
+
+#if NRFX_CHECK(NRFX_WDT_ENABLED)
+#include <nrfx_wdt.h>
+
+#define NRFX_LOG_MODULE WDT
+#include <nrfx_log.h>
+
+/**@brief WDT state. */
+static nrfx_drv_state_t m_state;
+
+/**@brief WDT alloc table. */
+static uint8_t m_alloc_index;
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+/**@brief WDT event handler. */
+static nrfx_wdt_event_handler_t m_wdt_event_handler;
+
+/**@brief WDT interrupt handler. */
+void nrfx_wdt_irq_handler(void)
+{
+    if (nrf_wdt_event_check(NRF_WDT_EVENT_TIMEOUT))
+    {
+        m_wdt_event_handler();
+        nrf_wdt_event_clear(NRF_WDT_EVENT_TIMEOUT);
+    }
+}
+#endif
+
+
+nrfx_err_t nrfx_wdt_init(nrfx_wdt_config_t const * p_config,
+                         nrfx_wdt_event_handler_t  wdt_event_handler)
+{
+    NRFX_ASSERT(p_config);
+    nrfx_err_t err_code;
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    NRFX_ASSERT(wdt_event_handler != NULL);
+    m_wdt_event_handler = wdt_event_handler;
+#else
+    NRFX_ASSERT(wdt_event_handler == NULL);
+    (void)wdt_event_handler;
+#endif
+    if (m_state == NRFX_DRV_STATE_UNINITIALIZED)
+    {
+        m_state = NRFX_DRV_STATE_INITIALIZED;
+    }
+    else
+    {
+        err_code = NRFX_ERROR_INVALID_STATE;
+        NRFX_LOG_WARNING("Function: %s, error code: %s.",
+                         __func__,
+                         NRFX_LOG_ERROR_STRING_GET(err_code));
+        return err_code;
+    }
+
+    nrf_wdt_behaviour_set(p_config->behaviour);
+
+//    uint64_t ticks = (p_config->reload_value * 32768ULL) / 1000;
+    uint64_t ticks = (p_config->reload_value * 32768ULL);
+
+    NRFX_ASSERT(ticks <= UINT32_MAX);
+
+    nrf_wdt_reload_value_set((uint32_t) ticks);
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    NRFX_IRQ_PRIORITY_SET(WDT_IRQn, p_config->interrupt_priority);
+    NRFX_IRQ_ENABLE(WDT_IRQn);
+#endif
+
+    err_code = NRFX_SUCCESS;
+    NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code));
+    return err_code;
+}
+
+
+void nrfx_wdt_enable(void)
+{
+    NRFX_ASSERT(m_alloc_index != 0);
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED);
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    nrf_wdt_int_enable(NRF_WDT_INT_TIMEOUT_MASK);
+#endif
+    nrf_wdt_task_trigger(NRF_WDT_TASK_START);
+    m_state = NRFX_DRV_STATE_POWERED_ON;
+    NRFX_LOG_INFO("Enabled.");
+}
+
+
+void nrfx_wdt_feed(void)
+{
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON);
+    for (uint8_t i = 0; i < m_alloc_index; i++)
+    {
+        nrf_wdt_reload_request_set((nrf_wdt_rr_register_t)(NRF_WDT_RR0 + i));
+    }
+}
+
+nrfx_err_t nrfx_wdt_channel_alloc(nrfx_wdt_channel_id * p_channel_id)
+{
+    nrfx_err_t result;
+    NRFX_ASSERT(p_channel_id);
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED);
+
+    NRFX_CRITICAL_SECTION_ENTER();
+    if (m_alloc_index < NRF_WDT_CHANNEL_NUMBER)
+    {
+        *p_channel_id = (nrfx_wdt_channel_id)(NRF_WDT_RR0 + m_alloc_index);
+        m_alloc_index++;
+        nrf_wdt_reload_request_enable(*p_channel_id);
+        result = NRFX_SUCCESS;
+    }
+    else
+    {
+        result = NRFX_ERROR_NO_MEM;
+    }
+    NRFX_CRITICAL_SECTION_EXIT();
+    NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(result));
+    return result;
+}
+
+void nrfx_wdt_channel_feed(nrfx_wdt_channel_id channel_id)
+{
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON);
+    nrf_wdt_reload_request_set(channel_id);
+}
+
+#endif // NRFX_CHECK(NRFX_WDT_ENABLED)

+ 166 - 0
IES200RB.si4project/Backup/nrfx_wdt(5384).c

@@ -0,0 +1,166 @@
+/**
+ * Copyright (c) 2015 - 2020, Nordic Semiconductor ASA
+ *
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ *
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ *
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ *
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ *
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
+
+#include <nrfx.h>
+
+#if NRFX_CHECK(NRFX_WDT_ENABLED)
+#include <nrfx_wdt.h>
+
+#define NRFX_LOG_MODULE WDT
+#include <nrfx_log.h>
+
+/**@brief WDT state. */
+static nrfx_drv_state_t m_state;
+
+/**@brief WDT alloc table. */
+static uint8_t m_alloc_index;
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+/**@brief WDT event handler. */
+static nrfx_wdt_event_handler_t m_wdt_event_handler;
+
+/**@brief WDT interrupt handler. */
+void nrfx_wdt_irq_handler(void)
+{
+    if (nrf_wdt_event_check(NRF_WDT_EVENT_TIMEOUT))
+    {
+        m_wdt_event_handler();
+        nrf_wdt_event_clear(NRF_WDT_EVENT_TIMEOUT);
+    }
+}
+#endif
+
+
+nrfx_err_t nrfx_wdt_init(nrfx_wdt_config_t const * p_config,
+                         nrfx_wdt_event_handler_t  wdt_event_handler)
+{
+    NRFX_ASSERT(p_config);
+    nrfx_err_t err_code;
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    NRFX_ASSERT(wdt_event_handler != NULL);
+    m_wdt_event_handler = wdt_event_handler;
+#else
+    NRFX_ASSERT(wdt_event_handler == NULL);
+    (void)wdt_event_handler;
+#endif
+    if (m_state == NRFX_DRV_STATE_UNINITIALIZED)
+    {
+        m_state = NRFX_DRV_STATE_INITIALIZED;
+    }
+    else
+    {
+        err_code = NRFX_ERROR_INVALID_STATE;
+        NRFX_LOG_WARNING("Function: %s, error code: %s.",
+                         __func__,
+                         NRFX_LOG_ERROR_STRING_GET(err_code));
+        return err_code;
+    }
+
+    nrf_wdt_behaviour_set(p_config->behaviour);
+
+    uint64_t ticks = (p_config->reload_value * 32768ULL) / 1000;
+    NRFX_ASSERT(ticks <= UINT32_MAX);
+
+    nrf_wdt_reload_value_set((uint32_t) ticks);
+
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    NRFX_IRQ_PRIORITY_SET(WDT_IRQn, p_config->interrupt_priority);
+    NRFX_IRQ_ENABLE(WDT_IRQn);
+#endif
+
+    err_code = NRFX_SUCCESS;
+    NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(err_code));
+    return err_code;
+}
+
+
+void nrfx_wdt_enable(void)
+{
+    NRFX_ASSERT(m_alloc_index != 0);
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED);
+#if !NRFX_CHECK(NRFX_WDT_CONFIG_NO_IRQ)
+    nrf_wdt_int_enable(NRF_WDT_INT_TIMEOUT_MASK);
+#endif
+    nrf_wdt_task_trigger(NRF_WDT_TASK_START);
+    m_state = NRFX_DRV_STATE_POWERED_ON;
+    NRFX_LOG_INFO("Enabled.");
+}
+
+
+void nrfx_wdt_feed(void)
+{
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON);
+    for (uint8_t i = 0; i < m_alloc_index; i++)
+    {
+        nrf_wdt_reload_request_set((nrf_wdt_rr_register_t)(NRF_WDT_RR0 + i));
+    }
+}
+
+nrfx_err_t nrfx_wdt_channel_alloc(nrfx_wdt_channel_id * p_channel_id)
+{
+    nrfx_err_t result;
+    NRFX_ASSERT(p_channel_id);
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_INITIALIZED);
+
+    NRFX_CRITICAL_SECTION_ENTER();
+    if (m_alloc_index < NRF_WDT_CHANNEL_NUMBER)
+    {
+        *p_channel_id = (nrfx_wdt_channel_id)(NRF_WDT_RR0 + m_alloc_index);
+        m_alloc_index++;
+        nrf_wdt_reload_request_enable(*p_channel_id);
+        result = NRFX_SUCCESS;
+    }
+    else
+    {
+        result = NRFX_ERROR_NO_MEM;
+    }
+    NRFX_CRITICAL_SECTION_EXIT();
+    NRFX_LOG_INFO("Function: %s, error code: %s.", __func__, NRFX_LOG_ERROR_STRING_GET(result));
+    return result;
+}
+
+void nrfx_wdt_channel_feed(nrfx_wdt_channel_id channel_id)
+{
+    NRFX_ASSERT(m_state == NRFX_DRV_STATE_POWERED_ON);
+    nrf_wdt_reload_request_set(channel_id);
+}
+
+#endif // NRFX_CHECK(NRFX_WDT_ENABLED)

+ 135 - 0
IES200RB.si4project/Backup/our_service(1699).h

@@ -0,0 +1,135 @@
+/**
+ * Copyright (c) 2014 - 2018, Nordic Semiconductor ASA
+ * 
+ * All rights reserved.
+ * 
+ * Redistribution and use in source and binary forms, with or without modification,
+ * are permitted provided that the following conditions are met:
+ * 
+ * 1. Redistributions of source code must retain the above copyright notice, this
+ *    list of conditions and the following disclaimer.
+ * 
+ * 2. Redistributions in binary form, except as embedded into a Nordic
+ *    Semiconductor ASA integrated circuit in a product or a software update for
+ *    such product, must reproduce the above copyright notice, this list of
+ *    conditions and the following disclaimer in the documentation and/or other
+ *    materials provided with the distribution.
+ * 
+ * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
+ *    contributors may be used to endorse or promote products derived from this
+ *    software without specific prior written permission.
+ * 
+ * 4. This software, with or without modification, must only be used with a
+ *    Nordic Semiconductor ASA integrated circuit.
+ * 
+ * 5. Any software provided in binary form under this license must not be reverse
+ *    engineered, decompiled, modified and/or disassembled.
+ * 
+ * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
+ * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
+ * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ * 
+ */
+ 
+#ifndef OUR_SERVICE_H__
+#define OUR_SERVICE_H__
+
+#include <stdint.h>
+#include "ble.h"
+#include "ble_srv_common.h"
+
+#include <stdbool.h>
+#include <stdint.h>
+#include <stdio.h>
+#include "app_uart.h"
+#include "app_error.h"
+
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+
+
+
+
+
+
+#define COM_STX               0x02
+#define COM_ETX               0x03
+#define COM_TYPE_SVR          0x01
+#define COM_TYPE_BELL_EMG     0x01
+#define COM_TYPE_SVR_NORMAL   0x02
+#define COM_TYPE_SVR_TALKING  0x03
+#define COM_TYPE_SVR_DISCON   0x04
+#define COM_TYPE_SVR_BUSY     0x05
+#define COM_TYPE_SVR_ALIVE    0x06
+
+
+#define COM_TYPE_BAND         0x02
+#define COM_TYPE_BAND_EMG     0x01
+#define COM_SVR_ACK           72
+
+
+
+
+struct stSystemTimer__ {
+
+
+	volatile int MS_1;
+        volatile int UART_LAST_RECV_TIMER;
+        volatile int SEND_TEST_TIMER;
+        volatile int LED_TOGGLE_TIMER;
+
+
+
+};
+typedef struct stSystemTimer__ stSystemTimer;
+
+
+
+
+struct stSystemManager__ {
+
+  char RxValild;
+  char RxEvent;
+
+  char SwitchOn;
+  char BuzzerOn;
+  char MicOn;
+  char SpeakerOn;
+
+};
+typedef struct stSystemManager__ stSystemManager;
+
+
+
+void USART_Handler(void);
+void ParseEventServer();
+void SendToEventServer(char* data, int len);
+void SendEmergency();
+void SendEmergencyLocal();
+void LedToggle();
+void USART_DataCheck();
+
+extern char SvrRxBuffer[];
+extern int SvrRxBufferPos;
+extern char SvrEvent;
+
+
+extern stSystemTimer SystemTimer;
+extern stSystemManager SystemManager;
+
+
+
+#endif  /* _ OUR_SERVICE_H__ */

+ 1069 - 0
IES200RB.si4project/Backup/sysmgr(1422).c

@@ -0,0 +1,1069 @@
+#include "sysmgr.h"
+#include <nrfx.h>
+#include <nrf_delay.h>
+#include <drv_rtc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "nrf_spi.h"
+#include "nrf_drv_spi.h"
+#include "nrf_pwr_mgmt.h"
+
+#include "main.h"
+
+
+
+stSystemTimer SystemTimer;
+stSystemManager SystemManager;
+
+
+extern const nrf_drv_spi_t spi;  /**< SPI instance. */
+extern volatile bool spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */
+uint8_t       m_tx_buf[64];           /**< TX buffer. */
+uint8_t       m_rx_buf[64];    /**< RX buffer. */
+uint8_t m_length;        /**< Transfer length. */
+
+
+RegMacPool_t RegMacPool;
+
+const char *fds_err_str(ret_code_t ret)
+{
+    /* Array to map FDS return values to strings. */
+    static char const * err_str[] =
+    {
+        "FDS_ERR_OPERATION_TIMEOUT",
+        "FDS_ERR_NOT_INITIALIZED",
+        "FDS_ERR_UNALIGNED_ADDR",
+        "FDS_ERR_INVALID_ARG",
+        "FDS_ERR_NULL_ARG",
+        "FDS_ERR_NO_OPEN_RECORDS",
+        "FDS_ERR_NO_SPACE_IN_FLASH",
+        "FDS_ERR_NO_SPACE_IN_QUEUES",
+        "FDS_ERR_RECORD_TOO_LARGE",
+        "FDS_ERR_NOT_FOUND",
+        "FDS_ERR_NO_PAGES",
+        "FDS_ERR_USER_LIMIT_REACHED",
+        "FDS_ERR_CRC_CHECK_FAILED",
+        "FDS_ERR_BUSY",
+        "FDS_ERR_INTERNAL",
+    };
+
+    return err_str[ret - NRF_ERROR_FDS_ERR_BASE];
+}
+
+
+void ParkSysInit()
+{
+	SystemTimer.TMR_SYS_OFF = 3;
+}
+
+void ParkPowerOff()
+{
+  SystemTimer.TMR_SYS_OFF = 0;
+}
+
+
+void SC16IS750_FIFOEnable(unsigned char fifo_enable)
+{
+    unsigned char temp_fcr;
+
+    temp_fcr = SC16IS750_ReadRegister(SC16IS750_REG_FCR);
+
+    if (fifo_enable == 0){
+        temp_fcr &= 0xFE;
+    } else {
+        temp_fcr |= 0x01;
+    }
+    SC16IS750_WriteRegister(SC16IS750_REG_FCR,temp_fcr);
+
+    return;
+}
+
+
+
+
+void SC16IS750_WriteRegister(unsigned char reg_addr, unsigned char val)
+{
+
+  m_tx_buf[0] = reg_addr<<3;
+  m_tx_buf[1] = val;
+
+  //nrf_gpio_pin_write( SPI_SS_PIN,0);
+  nrf_delay_us(10);
+  nrf_drv_spi_transfer(&spi, m_tx_buf, 2, m_rx_buf, 0);
+  nrf_delay_us(10);
+  //nrf_gpio_pin_write( SPI_SS_PIN,1);
+
+    return ;
+}
+
+
+unsigned char SC16IS750_ReadRegister(unsigned char reg_addr)
+{
+  unsigned char result;
+
+
+
+  m_tx_buf[0] = 0x80|(reg_addr<<3);
+
+
+ // nrf_gpio_pin_write( SPI_SS_PIN,0);
+  nrf_delay_us(10);
+  nrf_drv_spi_transfer(&spi, m_tx_buf, 1, m_rx_buf, 1);
+  result = m_rx_buf[0];
+  nrf_delay_us(10);
+ // nrf_gpio_pin_write( SPI_SS_PIN,1);
+
+
+  return result;
+
+}
+
+
+
+void SC16IS750_ResetDevice(void)
+{
+    unsigned char reg;
+
+    reg = SC16IS750_ReadRegister(SC16IS750_REG_IOCONTROL);
+    reg |= 0x08;
+    SC16IS750_WriteRegister(SC16IS750_REG_IOCONTROL, reg);
+
+    return;
+}
+
+
+
+int16_t SC16IS750_SetBaudrate(uint32_t baudrate) //return error of baudrate parts per thousand
+{
+    uint16_t divisor;
+    uint8_t prescaler;
+    uint32_t actual_baudrate;
+    int16_t error;
+    uint8_t temp_lcr;
+    if ( (SC16IS750_ReadRegister(SC16IS750_REG_MCR)&0x80) == 0) { //if prescaler==1
+        prescaler = 1;
+    } else {
+        prescaler = 4;
+    }
+
+    prescaler = 1;
+
+    divisor = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(baudrate*16);
+
+    temp_lcr = SC16IS750_ReadRegister(SC16IS750_REG_LCR);
+    temp_lcr |= 0x80;
+    SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr);
+    //write to DLL
+    SC16IS750_WriteRegister(SC16IS750_REG_DLL,(uint8_t)divisor);
+    //write to DLH
+    SC16IS750_WriteRegister(SC16IS750_REG_DLH,(uint8_t)(divisor>>8));
+    temp_lcr &= 0x7F;
+    SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr);
+
+
+    actual_baudrate = (SC16IS750_CRYSTCAL_FREQ/prescaler)/(16*divisor);
+    error = ((float)actual_baudrate-baudrate)*1000/baudrate;
+
+    return error;
+
+}
+
+
+
+void SC16IS750_SetLine(uint8_t data_length, uint8_t parity_select, uint8_t stop_length )
+{
+    uint8_t temp_lcr;
+    temp_lcr = SC16IS750_ReadRegister(SC16IS750_REG_LCR);
+    temp_lcr &= 0xC0; //Clear the lower six bit of LCR (LCR[0] to LCR[5]
+
+
+    switch (data_length) {            //data length settings
+        case 5:
+            break;
+        case 6:
+            temp_lcr |= 0x01;
+            break;
+        case 7:
+            temp_lcr |= 0x02;
+            break;
+        case 8:
+            temp_lcr |= 0x03;
+            break;
+        default:
+            temp_lcr |= 0x03;
+            break;
+    }
+
+    if ( stop_length == 2 ) {
+        temp_lcr |= 0x04;
+    }
+
+    switch (parity_select) {            //parity selection length settings
+        case 0:                         //no parity
+             break;
+        case 1:                         //odd parity
+            temp_lcr |= 0x08;
+            break;
+        case 2:                         //even parity
+            temp_lcr |= 0x18;
+            break;
+        case 3:                         //force '1' parity
+            temp_lcr |= 0x03;
+            break;
+        case 4:                         //force '0' parity
+            break;
+        default:
+            break;
+    }
+
+    SC16IS750_WriteRegister(SC16IS750_REG_LCR,temp_lcr);
+}
+
+
+
+void SC16IS750_WriteByte(uint8_t val)
+{
+	uint8_t tmp_lsr;
+
+	do {
+		tmp_lsr = SC16IS750_ReadRegister(SC16IS750_REG_LSR);
+	} while ((tmp_lsr&0x20) ==0);
+//nrf_delay_ms(1);
+	SC16IS750_WriteRegister(SC16IS750_REG_THR,val);
+}
+
+
+
+int DBGPrint(const char *fmt, ...)
+{
+    char buff[128];
+    va_list args;
+    int n;
+    int i;
+
+    va_start(args, fmt);
+    n = vsnprintf(buff, 120, fmt, args);
+    va_end(args);
+
+
+    //HAL_UART_Transmit(CLIUart, (uint8_t*)buff, n, 500);
+
+    for( i=0; i<n; i++)
+    {
+        
+      SC16IS750_WriteByte(buff[i]);
+    }
+
+    
+
+    return n;
+}
+
+
+
+
+/* Dummy configuration data. */
+static configuration_t m_dummy_cfg =
+{
+    .config1_on  = false,
+    .config2_on  = true,
+    .boot_count  = 0x0,
+    .device_name = "dummy",
+};
+
+
+
+
+
+static void record_write(uint32_t fid,
+                         uint32_t key,
+                         void const * p_data,
+                         uint32_t len)
+{
+    fds_record_t const rec =
+    {
+        .file_id           = fid,
+        .key               = key,
+        .data.p_data       = p_data,
+        .data.length_words = (len + 3) / sizeof(uint32_t)
+    };
+
+    NRF_LOG_INFO(
+                    "writing record to flash...\n"
+                    "file: 0x%x, key: 0x%x, \"%s\", len: %u bytes\n",
+                    fid, key, p_data, len);
+
+	   fds_record_desc_t desc	= {0};
+	desc.record_id = 1;
+
+    //ret_code_t rc = fds_record_write(NULL, &rec);
+    ret_code_t rc = fds_record_write(&desc, &rec);
+    if (rc != NRF_SUCCESS)
+    {
+        NRF_LOG_INFO(
+                        "error: fds_record_write() returned %s.\n",
+                        fds_err_str(rc));
+    }
+}
+
+
+
+
+
+static void record_update( configuration_t const * p_cfg)
+{
+    fds_record_desc_t desc = {0};
+    fds_find_token_t  ftok = {0};
+
+    if (fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &ftok) == NRF_SUCCESS)
+    {
+        fds_record_t const rec =
+        {
+            .file_id           = CONFIG_FILE,
+            .key               = CONFIG_REC_KEY,
+            .data.p_data       = p_cfg,
+            .data.length_words = (sizeof(configuration_t) + 3) / sizeof(uint32_t)
+        };
+
+        ret_code_t rc = fds_record_update(&desc, &rec);
+        if (rc != NRF_SUCCESS)
+        {
+            NRF_LOG_INFO( "error: fds_record_update() returned %s.\n",
+                            fds_err_str(rc));
+        }
+    }
+    else
+    {
+        NRF_LOG_INFO( "error: could not find config file.\n");
+    }
+}
+
+
+static void record_delete( uint32_t fid, uint32_t key)
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+
+    NRF_LOG_INFO( 
+                    "deleting record...\n"
+                    "file: 0x%x, key: 0x%x\n",
+                    fid,
+                    key);
+
+    if (fds_record_find(fid, key, &desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc = fds_record_delete(&desc);
+        if (rc != NRF_SUCCESS)
+        {
+            NRF_LOG_INFO( 
+                            "error: fds_record_delete() returned %s.\n", fds_err_str(rc));
+
+            return;
+        }
+
+        NRF_LOG_INFO(  "record id: 0x%x\n", desc.record_id);
+    }
+    else
+    {
+        NRF_LOG_INFO(  "error: record not found!\n");
+    }
+}
+
+
+bool record_delete_next(void)
+{
+    fds_find_token_t  tok   = {0};
+    fds_record_desc_t desc  = {0};
+
+    if (fds_record_iterate(&desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc = fds_record_delete(&desc);
+        if (rc != NRF_SUCCESS)
+        {
+            return false;
+        }
+
+        return true;
+    }
+    else
+    {
+        /* No records left to delete. */
+        return false;
+    }
+}
+
+
+
+
+static void print_cfg_cmd( size_t argc, char ** argv)
+{
+    fds_record_desc_t desc = {0};
+    fds_find_token_t  tok  = {0};
+
+    while (fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO( "error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO( "error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO(
+                                "error: unexpecte error %s.\n",
+                                fds_err_str(rc));
+
+                continue;
+            }
+        }
+
+        configuration_t * p_cfg = (configuration_t *)(frec.p_data);
+
+        NRF_LOG_INFO(
+                        "config1:\t%s\n"
+                        "config2:\t%s\n"
+                        "boot count:\t%u\n"
+                        "device name:\t%s\n",
+                        p_cfg->config1_on ? "on" : "off",
+                        p_cfg->config2_on ? "on" : "off",
+                        p_cfg->boot_count,
+                        p_cfg->device_name);
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+static void print_all_cmd( )
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+
+    NRF_LOG_INFO("rec. id \t file id \t rec. key \t length");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO(  "error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO(  "error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_INFO(   " 0x%04x"
+                        "\t 0x%04x"
+                        "\t 0x%04x"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+        for (uint8_t i=0;i<len;i++)
+        {
+                NRF_LOG_RAW_INFO( "%c",data[i]);
+        }
+        NRF_LOG_INFO("\n");
+
+
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+
+
+void RegMac(char* str)
+{
+
+  print_all_cmd();
+  NRF_LOG_RAW_INFO("Registration MAC : %s\n", str);
+  
+  RegMacPool.Count++;
+  record_write(1, RegMacPool.Count, str, 12);
+
+  print_all_cmd();
+
+}
+
+
+
+void RegMacDelteAll()
+{
+    bool next;
+
+#if 1
+  while(1)
+  {  
+       next = record_delete_next();
+        if (!next)
+        {
+            NRF_LOG_INFO("No records left to delete.");
+            break;
+        } 
+
+		nrf_delay_ms(20);
+  }
+
+#endif
+
+  memset( &RegMacPool, 0, sizeof(RegMacPool));
+
+
+}
+
+
+
+
+void LoadRegMac()
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+    char tmpBuf[15];
+
+    NRF_LOG_INFO( 
+                    "\nrec. id\t"
+                    "\tfile id\t"
+                    "\trec. key"
+                    "\tlength\tmac\n");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+		
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO("error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO("error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_RAW_INFO( 
+                        " 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+
+
+        if( RegMacPool.Count >= 5 )
+        {
+            NRF_LOG_RAW_INFO( "Mac Pool Over\n");
+
+            return;
+        }
+        
+        RegMacPool.Mac[RegMacPool.Count][12] = 0;
+        strncpy( RegMacPool.Mac[RegMacPool.Count++], data, 12);
+        //for (uint8_t i=0;i<len;i++)
+        {
+        //        NRF_LOG_RAW_INFO( "%c",data[i]);
+        }
+        //NRF_LOG_RAW_INFO( "\n");
+         NRF_LOG_RAW_INFO( "%s\n",RegMacPool.Mac[RegMacPool.Count-1]);
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+
+void LoadReceiverMac()
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+    char tmpBuf[15];
+
+    NRF_LOG_INFO( 
+                    "\nrec. id\t"
+                    "\tfile id\t"
+                    "\trec. key"
+                    "\tlength\tmac\n");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+		
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO("error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO("error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_RAW_INFO( 
+                        " 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+		strncpy( SystemManager.StrRegPeerAddr, data, 12);
+		strncpy( tmpBuf, SystemManager.StrRegPeerAddr, 12);
+		
+		SystemManager.StrRegPeerAddr[12] = 0;
+		tmpBuf[12] = 0;
+		 NRF_LOG_RAW_INFO( "%s\n",SystemManager.StrRegPeerAddr);
+
+		SystemManager.RegPeerAddr[5] = (uint8_t)strtol(&tmpBuf[10], NULL, 16); tmpBuf[10] = 0;
+		SystemManager.RegPeerAddr[4] = (uint8_t)strtol(&tmpBuf[8], NULL, 16); tmpBuf[8] = 0;
+		SystemManager.RegPeerAddr[3] = (uint8_t)strtol(&tmpBuf[6], NULL, 16); tmpBuf[6] = 0;
+		SystemManager.RegPeerAddr[2] = (uint8_t)strtol(&tmpBuf[4], NULL, 16); tmpBuf[4] = 0;
+		SystemManager.RegPeerAddr[1] = (uint8_t)strtol(&tmpBuf[2], NULL, 16); tmpBuf[2] = 0;
+		SystemManager.RegPeerAddr[0] = (uint8_t)strtol(&tmpBuf[0], NULL, 16); 
+
+		 
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+void SaveRegMac(char* mac)
+{
+  int i;
+
+  if( RegMacPool.Count>= 5 )
+      return;
+  
+
+  for( i=0; i<RegMacPool.Count; i++)
+  {
+      if( strncmp( RegMacPool.Mac[i], mac, 12) == 0 )
+      {
+           NRF_LOG_RAW_INFO( "Allready Registrated\n");
+          return;
+      }
+  
+  }
+  
+  
+  RegMacPool.Mac[RegMacPool.Count][12] = 0;
+  strncpy( RegMacPool.Mac[RegMacPool.Count], mac, 12);
+
+   record_write(1, RegMacPool.Count+1, mac, 12);
+
+    RegMacPool.Count++;
+}
+
+
+
+
+void FlashTest()
+{
+
+
+    static uint8_t m_data[256];
+    int len;
+
+    sprintf(m_data, "hello-%d", 1);
+
+    len = strlen(m_data);
+    
+
+    record_write( 1, 1, m_data, len);
+    sprintf(m_data, "hello-%d", 2);
+    record_write( 1, 2, m_data, len);
+
+    print_all_cmd();
+}
+
+
+void SaveReceiverMac(char* mac)
+{
+	static uint8_t m_data[256];
+
+	mac[12] = 0;
+
+	 sprintf(m_data, "%s", mac);
+	 
+   NRF_LOG_RAW_INFO( "===> SaveReceiverMac : %s\n", m_data);
+
+
+
+	
+   record_write(1,1, m_data, 12);
+   print_all_cmd();
+
+  //FlashTest();
+
+}
+
+
+
+
+int FindRegMac(char* mac)
+{
+
+  int i;
+
+ 
+
+  for( i=0; i<RegMacPool.Count; i++)
+  {
+      if( strncmp( RegMacPool.Mac[i], mac, 12) == 0 )
+      {
+           NRF_LOG_RAW_INFO( "Valid Mac\n");
+          return 1;
+      }  
+  }
+  
+
+  return 0;
+
+}
+
+void DisplayRegMac()
+{
+
+  print_all_cmd( );
+}
+
+
+
+
+
+void SetMacAddress(uint8_t* addr)
+{
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+	dd.addr[0] = addr[0];
+	dd.addr[1] = addr[1];
+	//dd.addr[2] = addr[2];
+        dd.addr[2] = 0x57;
+	dd.addr[3] = addr[3];
+	dd.addr[4] = addr[4];
+	dd.addr[5] = addr[5];	
+    sd_ble_gap_addr_set(&dd);
+
+	
+	sd_ble_gap_addr_get(&new_ble_addr);
+
+
+
+
+
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+HSKey Key[4];
+
+
+void KeyInit(void)
+{
+
+
+	Key[KEY_SELECT].longPressTimeOne = 2;
+
+	Key[KEY_UP].longPressTimeOne = 2;
+
+
+
+	//Key[KEY_COUNTER].longPressTimeKeep = 4;
+
+}
+
+
+
+
+//50ms key polling
+void ReadKEY(void)
+{	  
+
+	static int key_poll_count = 0;
+
+	if( SystemTimer.TIM_KEY < 100 )
+		return;
+
+	SystemTimer.TIM_KEY = 0;
+
+	
+
+	if( Key[KEY_SELECT].softRelease == 1 )
+		return;
+
+	if( key_poll_count == 2 )
+	{
+		if( nrf_gpio_pin_read(BSP_BUTTON_1) == true )
+		{
+			if( SystemManager.EmgSendButton == 10 )
+			{
+				SystemManager.EmgSendButton = BUTTON_TEST;
+				Key[KEY_SELECT].softRelease = 1;
+
+			}
+			
+		}
+
+	}
+
+	key_poll_count++;
+
+	if( nrf_gpio_pin_read(BSP_BUTTON_1) == false  )
+	{
+		Key[KEY_SELECT].pressTime++;
+		nrf_pwr_mgmt_feed();
+
+
+		if( Key[KEY_SELECT].pressTime>20)
+		{
+			Key[KEY_SELECT].softRelease = 1;
+			KeySelectLongPressedOne();
+		}
+	}
+
+
+
+
+}
+
+
+
+
+void KeySelectLongPressedOne(void)
+{
+	NRF_LOG_INFO("KeySelectLongPressedOne\r\n" );	
+	SystemManager.EmgSendButton = BUTTON_REG;
+}
+
+
+
+
+void PortInputCfg(void)
+{
+
+#if 1
+    uint32_t i;
+    for (i = 17; i <= 20; ++i)
+    {
+        nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN);
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP);
+    }
+
+
+	for (i = 12; i <= 15; ++i)
+    {
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN);
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP);
+    }
+
+	nrf_gpio_cfg_input(7, NRF_GPIO_PIN_PULLDOWN);
+#endif
+
+
+}
+
+
+
+
+
+
+
+uint8_t AesBuffer[16];
+
+void CarEncryptEcb(int mode)
+{
+  uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON
+  uint8_t in[]  = {'C', 'A', 'R', 1,2,3,4,5,6,7,8,9,10,11,12,13 };
+
+  uint16_t tempVal;
+
+
+  if( mode == AES_ENC_CAR )
+  {
+  	in[0] = 'C';
+	in[1] = 'A';
+	in[2] = 'R';
+  }else if( mode == AES_ENC_EMG )
+  {
+  	in[0] = 'E';
+	in[1] = 'M';
+	in[2] = 'G';
+  }else if( mode == AES_ENC_WES_EMG )
+  {
+  	in[0] = 'E';
+	in[1] = 'M';
+	in[2] = 'G';
+  }
+
+  
+
+  tempVal = rand();
+
+  in[3] = tempVal&0xff;
+  in[4] = (tempVal>>8)&0xff;
+
+  AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+  NRF_LOG_RAW_INFO("ECB encrypt: %x\n", tempVal);
+
+}
+
+
+
+
+void WesEncryptEcb(uint8_t* in)
+{
+	int i;
+	uint8_t* inOrg = in;
+  uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON
+  
+  //for( i=0; i<16; i++)
+  {
+		//*(in+i) = i+1;
+		//in++;
+  }
+  
+   AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+   memcpy( inOrg, SystemManager.AesEncData, 16 );
+
+}
+
+
+
+
+
+// 0x73:parking  0x72:emg
+void CarEncryptEcbACK(char type)
+{
+
+	uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON
+	uint8_t in[]  = {'C', 'A', 'R', 'A','C','K',1,2,3,4,5,6,7,8,9,0x0A };
+
+	switch(type){
+		// BAND EMG
+		case 0x72:
+			in[3] = 'E';
+			in[4] = 'M';
+			in[5] = 'G';	
+		break;
+
+		// NEW iOS APP
+		case 0x75:
+			in[3] = 'P';
+			in[4] = 'C';
+			in[5] = 'A';	
+		break;
+	}
+
+
+	AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+	NRF_LOG_RAW_INFO("ECB ACK\n");
+}
+
+

+ 273 - 0
IES200RB.si4project/Backup/sysmgr(5076).h

@@ -0,0 +1,273 @@
+#ifndef _SYSMGR_H_
+#define _SYSMGR_H_
+
+#include "nrf_drv_spi.h"
+#include "app_util_platform.h"
+#include "nrf_gpio.h"
+#include "nrf_delay.h"
+#include "boards.h"
+#include "app_error.h"
+#include <string.h>
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+
+#include "ble_gap.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+
+struct stSystemTimer__ {
+	volatile int MS_1;
+        volatile int UART_LAST_RECV_TIMER;
+        volatile int SEND_TEST_TIMER;
+        volatile int LED_TOGGLE_TIMER;
+        volatile int TMR_SYS_OFF;
+        volatile int SEND_TIMER;
+        volatile int BUZZER_TIMER;
+        char EMG_SEND_RUN;
+		volatile int TIM_KEY;
+		volatile int SLEEP_TIMER;
+};
+typedef struct stSystemTimer__ stSystemTimer;
+
+
+
+
+struct stSystemManager__ {
+
+  char EmgSendButton;
+  char TestSendButton;
+  char RxEvent;
+  char SendRepeat;
+  char SendFlag;
+  int  BleConnectTime;
+  int  SendRepeatTimerLimit;
+  char BuzzerType;
+  char BuzzerBusy;
+  unsigned char Batt;
+
+  char BleSendReady;
+  char BleSendStatus;
+
+
+  char BleConnected;
+  char BleSendRetry;
+  char PeerAddr[6];
+  char StrPeerAddr[15];
+  char RegPeerAddr[6];
+  char StrRegPeerAddr[15];
+
+
+
+  char SysReady;
+  char SleepEnter;
+
+  char FWUpdate;
+  
+  char GpReg;
+  char GoSleep;  
+  uint32_t ResetReason;
+
+
+	char AesEncData[16];
+
+
+};
+typedef struct stSystemManager__ stSystemManager;
+
+
+
+
+#define     SC16IS750_ADDRESS_AA     (0X90)
+#define     SC16IS750_ADDRESS_AB     (0X92)
+#define     SC16IS750_ADDRESS_AC     (0X94)
+#define     SC16IS750_ADDRESS_AD     (0X96)
+#define     SC16IS750_ADDRESS_BA     (0X98)
+#define     SC16IS750_ADDRESS_BB     (0X9A)
+#define     SC16IS750_ADDRESS_BC     (0X9C)
+#define     SC16IS750_ADDRESS_BD     (0X9E)
+#define     SC16IS750_ADDRESS_CA     (0XA0)
+#define     SC16IS750_ADDRESS_CB     (0XA2)
+#define     SC16IS750_ADDRESS_CC     (0XA4)
+#define     SC16IS750_ADDRESS_CD     (0XA6)
+#define     SC16IS750_ADDRESS_DA     (0XA8)
+#define     SC16IS750_ADDRESS_DB     (0XAA)
+#define     SC16IS750_ADDRESS_DC     (0XAC)
+#define     SC16IS750_ADDRESS_DD     (0XAE)
+
+
+//General Registers
+#define     SC16IS750_REG_RHR        (0x00)
+#define     SC16IS750_REG_THR        (0X00)
+#define     SC16IS750_REG_IER        (0X01)
+#define     SC16IS750_REG_FCR        (0X02)
+#define     SC16IS750_REG_IIR        (0X02)
+#define     SC16IS750_REG_LCR        (0X03)
+#define     SC16IS750_REG_MCR        (0X04)
+#define     SC16IS750_REG_LSR        (0X05)
+#define     SC16IS750_REG_MSR        (0X06)
+#define     SC16IS750_REG_SPR        (0X07)
+#define     SC16IS750_REG_TCR        (0X06)
+#define     SC16IS750_REG_TLR        (0X07)
+#define     SC16IS750_REG_TXLVL      (0X08)
+#define     SC16IS750_REG_RXLVL      (0X09)
+#define     SC16IS750_REG_IODIR      (0X0A)
+#define     SC16IS750_REG_IOSTATE    (0X0B)
+#define     SC16IS750_REG_IOINTENA   (0X0C)
+#define     SC16IS750_REG_IOCONTROL  (0X0E)
+#define     SC16IS750_REG_EFCR       (0X0F)
+
+//Special Registers
+#define     SC16IS750_REG_DLL        (0x00)
+#define     SC16IS750_REG_DLH        (0X01)
+
+//Enhanced Registers
+#define     SC16IS750_REG_EFR        (0X02)
+#define     SC16IS750_REG_XON1       (0X04)
+#define     SC16IS750_REG_XON2       (0X05)
+#define     SC16IS750_REG_XOFF1      (0X06)
+#define     SC16IS750_REG_XOFF2      (0X07)
+
+//
+#define     SC16IS750_INT_CTS        (0X80)
+#define     SC16IS750_INT_RTS        (0X40)
+#define     SC16IS750_INT_XOFF       (0X20)
+#define     SC16IS750_INT_SLEEP      (0X10)
+#define     SC16IS750_INT_MODEM      (0X08)
+#define     SC16IS750_INT_LINE       (0X04)
+#define     SC16IS750_INT_THR        (0X02)
+#define     SC16IS750_INT_RHR        (0X01)
+
+//Application Related 
+
+#define     SC16IS750_CRYSTCAL_FREQ (14745600UL) 
+//#define 	SC16IS750_CRYSTCAL_FREQ (1843200UL)	  
+//#define     SC16IS750_CRYSTCAL_FREQ (16000000UL)    
+//#define     SC16IS750_DEBUG_PRINT   (0)
+#define     SC16IS750_PROTOCOL_I2C  (0)
+#define     SC16IS750_PROTOCOL_SPI  (1)
+
+
+
+
+
+
+#define AES_ENC_CAR		1
+#define AES_ENC_EMG		2
+#define AES_ENC_PCA		3
+#define AES_ENC_WES_EMG	4
+#define AES_ENC_WES_ALV	5
+#define AES_ENC_WES_TST	6
+#define AES_ENC_WES_REG	7
+
+
+/* A dummy structure to save in flash. */
+
+#define CONFIG_FILE     (0x8010)
+#define CONFIG_REC_KEY  (0x7010)
+
+
+typedef struct
+{
+    uint32_t boot_count;
+    char     device_name[16];
+    bool     config1_on;
+    bool     config2_on;
+} configuration_t;
+
+
+
+typedef struct
+{
+    char Mac[10][15];	
+    int Count;
+}RegMacPool_t;
+
+
+
+
+void SC16IS750_ResetDevice(void);
+void SC16IS750_WriteRegister(unsigned char reg_addr, unsigned char val);
+unsigned char SC16IS750_ReadRegister(unsigned char reg_addr);
+void SC16IS750_FIFOEnable(unsigned char fifo_enable);
+int16_t SC16IS750_SetBaudrate(uint32_t baudrate);
+void SC16IS750_SetLine(uint8_t data_length, uint8_t parity_select, uint8_t stop_length );
+void SC16IS750_WriteByte(uint8_t val);
+int DBGPrint(const char *fmt, ...);
+
+
+void ParkSysInit();
+void ParkPowerOff();
+
+void SendEmgData(void);
+extern stSystemTimer SystemTimer;
+extern stSystemManager SystemManager;
+
+
+
+
+
+
+
+#define KEY_SELECT		0
+#define KEY_UP			1
+#define KEY_DOWN		3
+#define KEY_BACK		2
+
+
+
+
+typedef struct tsHSKey{
+	unsigned char onFlag;
+	unsigned char softRelease;
+	unsigned char pressedSec;
+	unsigned int  pressTime;
+	unsigned int  longPressTimeOne;
+	unsigned int  longPressTimeKeep;
+	unsigned int  prevTime;
+
+
+}HSKey;
+
+
+
+
+
+
+void ReadKEY(void);
+void KeyInit(void);
+
+
+
+
+void KeySelectLongPressedOne(void);
+
+
+void m_standby_counter_clerar();
+void PortInputCfg(void);
+
+
+void lfclk_config(void);
+void rtc_config(void);
+
+void SaveReceiverMac(char* mac);
+void LoadReceiverMac();
+void FlashTest();
+
+
+
+
+
+void WesEncryptEcb(uint8_t* in);
+
+
+
+extern ble_gap_addr_t old_ble_addr;
+extern ble_gap_addr_t new_ble_addr;
+
+extern RegMacPool_t RegMacPool;
+
+#endif

+ 882 - 0
IES200RB.si4project/Backup/sysmgr(5078).c

@@ -0,0 +1,882 @@
+#include "sysmgr.h"
+#include <nrfx.h>
+#include <nrf_delay.h>
+#include <drv_rtc.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#include "nrf_spi.h"
+#include "nrf_drv_spi.h"
+#include "nrf_pwr_mgmt.h"
+
+#include "main.h"
+
+
+
+stSystemTimer SystemTimer;
+stSystemManager SystemManager;
+
+
+extern const nrf_drv_spi_t spi;  /**< SPI instance. */
+extern volatile bool spi_xfer_done;  /**< Flag used to indicate that SPI instance completed the transfer. */
+uint8_t       m_tx_buf[64];           /**< TX buffer. */
+uint8_t       m_rx_buf[64];    /**< RX buffer. */
+uint8_t m_length;        /**< Transfer length. */
+
+
+RegMacPool_t RegMacPool;
+
+const char *fds_err_str(ret_code_t ret)
+{
+    /* Array to map FDS return values to strings. */
+    static char const * err_str[] =
+    {
+        "FDS_ERR_OPERATION_TIMEOUT",
+        "FDS_ERR_NOT_INITIALIZED",
+        "FDS_ERR_UNALIGNED_ADDR",
+        "FDS_ERR_INVALID_ARG",
+        "FDS_ERR_NULL_ARG",
+        "FDS_ERR_NO_OPEN_RECORDS",
+        "FDS_ERR_NO_SPACE_IN_FLASH",
+        "FDS_ERR_NO_SPACE_IN_QUEUES",
+        "FDS_ERR_RECORD_TOO_LARGE",
+        "FDS_ERR_NOT_FOUND",
+        "FDS_ERR_NO_PAGES",
+        "FDS_ERR_USER_LIMIT_REACHED",
+        "FDS_ERR_CRC_CHECK_FAILED",
+        "FDS_ERR_BUSY",
+        "FDS_ERR_INTERNAL",
+    };
+
+    return err_str[ret - NRF_ERROR_FDS_ERR_BASE];
+}
+
+
+void ParkSysInit()
+{
+	SystemTimer.TMR_SYS_OFF = 3;
+}
+
+void ParkPowerOff()
+{
+  SystemTimer.TMR_SYS_OFF = 0;
+}
+
+
+
+
+
+
+/* Dummy configuration data. */
+static configuration_t m_dummy_cfg =
+{
+    .config1_on  = false,
+    .config2_on  = true,
+    .boot_count  = 0x0,
+    .device_name = "dummy",
+};
+
+
+
+
+
+static void record_write(uint32_t fid,
+                         uint32_t key,
+                         void const * p_data,
+                         uint32_t len)
+{
+    fds_record_t const rec =
+    {
+        .file_id           = fid,
+        .key               = key,
+        .data.p_data       = p_data,
+        .data.length_words = (len + 3) / sizeof(uint32_t)
+    };
+
+    NRF_LOG_INFO(
+                    "writing record to flash...\n"
+                    "file: 0x%x, key: 0x%x, \"%s\", len: %u bytes\n",
+                    fid, key, p_data, len);
+
+	   fds_record_desc_t desc	= {0};
+	desc.record_id = 1;
+
+    //ret_code_t rc = fds_record_write(NULL, &rec);
+    ret_code_t rc = fds_record_write(&desc, &rec);
+    if (rc != NRF_SUCCESS)
+    {
+        NRF_LOG_INFO(
+                        "error: fds_record_write() returned %s.\n",
+                        fds_err_str(rc));
+    }
+}
+
+
+
+
+
+static void record_update( configuration_t const * p_cfg)
+{
+    fds_record_desc_t desc = {0};
+    fds_find_token_t  ftok = {0};
+
+    if (fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &ftok) == NRF_SUCCESS)
+    {
+        fds_record_t const rec =
+        {
+            .file_id           = CONFIG_FILE,
+            .key               = CONFIG_REC_KEY,
+            .data.p_data       = p_cfg,
+            .data.length_words = (sizeof(configuration_t) + 3) / sizeof(uint32_t)
+        };
+
+        ret_code_t rc = fds_record_update(&desc, &rec);
+        if (rc != NRF_SUCCESS)
+        {
+            NRF_LOG_INFO( "error: fds_record_update() returned %s.\n",
+                            fds_err_str(rc));
+        }
+    }
+    else
+    {
+        NRF_LOG_INFO( "error: could not find config file.\n");
+    }
+}
+
+
+static void record_delete( uint32_t fid, uint32_t key)
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+
+    NRF_LOG_INFO( 
+                    "deleting record...\n"
+                    "file: 0x%x, key: 0x%x\n",
+                    fid,
+                    key);
+
+    if (fds_record_find(fid, key, &desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc = fds_record_delete(&desc);
+        if (rc != NRF_SUCCESS)
+        {
+            NRF_LOG_INFO( 
+                            "error: fds_record_delete() returned %s.\n", fds_err_str(rc));
+
+            return;
+        }
+
+        NRF_LOG_INFO(  "record id: 0x%x\n", desc.record_id);
+    }
+    else
+    {
+        NRF_LOG_INFO(  "error: record not found!\n");
+    }
+}
+
+
+bool record_delete_next(void)
+{
+    fds_find_token_t  tok   = {0};
+    fds_record_desc_t desc  = {0};
+
+    if (fds_record_iterate(&desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc = fds_record_delete(&desc);
+        if (rc != NRF_SUCCESS)
+        {
+            return false;
+        }
+
+        return true;
+    }
+    else
+    {
+        /* No records left to delete. */
+        return false;
+    }
+}
+
+
+
+
+static void print_cfg_cmd( size_t argc, char ** argv)
+{
+    fds_record_desc_t desc = {0};
+    fds_find_token_t  tok  = {0};
+
+    while (fds_record_find(CONFIG_FILE, CONFIG_REC_KEY, &desc, &tok) == NRF_SUCCESS)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO( "error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO( "error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO(
+                                "error: unexpecte error %s.\n",
+                                fds_err_str(rc));
+
+                continue;
+            }
+        }
+
+        configuration_t * p_cfg = (configuration_t *)(frec.p_data);
+
+        NRF_LOG_INFO(
+                        "config1:\t%s\n"
+                        "config2:\t%s\n"
+                        "boot count:\t%u\n"
+                        "device name:\t%s\n",
+                        p_cfg->config1_on ? "on" : "off",
+                        p_cfg->config2_on ? "on" : "off",
+                        p_cfg->boot_count,
+                        p_cfg->device_name);
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+static void print_all_cmd( )
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+
+    NRF_LOG_INFO("rec. id \t file id \t rec. key \t length");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO(  "error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO(  "error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_INFO(   " 0x%04x"
+                        "\t 0x%04x"
+                        "\t 0x%04x"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+        for (uint8_t i=0;i<len;i++)
+        {
+                NRF_LOG_RAW_INFO( "%c",data[i]);
+        }
+        NRF_LOG_INFO("\n");
+
+
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+
+
+void RegMac(char* str)
+{
+
+  print_all_cmd();
+  NRF_LOG_RAW_INFO("Registration MAC : %s\n", str);
+  
+  RegMacPool.Count++;
+  record_write(1, RegMacPool.Count, str, 12);
+
+  print_all_cmd();
+
+}
+
+
+
+void RegMacDelteAll()
+{
+    bool next;
+
+#if 1
+  while(1)
+  {  
+       next = record_delete_next();
+        if (!next)
+        {
+            NRF_LOG_INFO("No records left to delete.");
+            break;
+        } 
+
+		nrf_delay_ms(20);
+  }
+
+#endif
+
+  memset( &RegMacPool, 0, sizeof(RegMacPool));
+
+
+}
+
+
+
+
+void LoadRegMac()
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+    char tmpBuf[15];
+
+    NRF_LOG_INFO( 
+                    "\nrec. id\t"
+                    "\tfile id\t"
+                    "\trec. key"
+                    "\tlength\tmac\n");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+		
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO("error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO("error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_RAW_INFO( 
+                        " 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+
+
+        if( RegMacPool.Count >= 5 )
+        {
+            NRF_LOG_RAW_INFO( "Mac Pool Over\n");
+
+            return;
+        }
+        
+        RegMacPool.Mac[RegMacPool.Count][12] = 0;
+        strncpy( RegMacPool.Mac[RegMacPool.Count++], data, 12);
+        //for (uint8_t i=0;i<len;i++)
+        {
+        //        NRF_LOG_RAW_INFO( "%c",data[i]);
+        }
+        //NRF_LOG_RAW_INFO( "\n");
+         NRF_LOG_RAW_INFO( "%s\n",RegMacPool.Mac[RegMacPool.Count-1]);
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+
+
+void LoadReceiverMac()
+{
+    fds_find_token_t tok   = {0};
+    fds_record_desc_t desc = {0};
+    uint8_t *data;
+    char tmpBuf[15];
+
+    NRF_LOG_INFO( 
+                    "\nrec. id\t"
+                    "\tfile id\t"
+                    "\trec. key"
+                    "\tlength\tmac\n");
+
+    while (fds_record_iterate(&desc, &tok) != FDS_ERR_NOT_FOUND)
+    {
+        ret_code_t rc;
+        fds_flash_record_t frec = {0};
+
+        rc = fds_record_open(&desc, &frec);
+		
+        switch (rc)
+        {
+            case NRF_SUCCESS:
+                break;
+
+            case FDS_ERR_CRC_CHECK_FAILED:
+                NRF_LOG_INFO("error: CRC check failed!\n");
+                continue;
+
+            case FDS_ERR_NOT_FOUND:
+                NRF_LOG_INFO("error: record not found!\n");
+                continue;
+
+            default:
+            {
+                NRF_LOG_INFO("error: unexpecte error %s.\n", fds_err_str(rc));
+                continue;
+            }
+        }
+
+        uint32_t const len = frec.p_header->length_words * sizeof(uint32_t);
+
+        NRF_LOG_RAW_INFO( 
+                        " 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t 0x%04x\t"
+                        "\t %4u bytes\t",
+                        frec.p_header->record_id,
+                        frec.p_header->file_id,
+                        frec.p_header->record_key,
+                        len);
+
+        data = (uint8_t *) frec.p_data;
+		strncpy( SystemManager.StrRegPeerAddr, data, 12);
+		strncpy( tmpBuf, SystemManager.StrRegPeerAddr, 12);
+		
+		SystemManager.StrRegPeerAddr[12] = 0;
+		tmpBuf[12] = 0;
+		 NRF_LOG_RAW_INFO( "%s\n",SystemManager.StrRegPeerAddr);
+
+		SystemManager.RegPeerAddr[5] = (uint8_t)strtol(&tmpBuf[10], NULL, 16); tmpBuf[10] = 0;
+		SystemManager.RegPeerAddr[4] = (uint8_t)strtol(&tmpBuf[8], NULL, 16); tmpBuf[8] = 0;
+		SystemManager.RegPeerAddr[3] = (uint8_t)strtol(&tmpBuf[6], NULL, 16); tmpBuf[6] = 0;
+		SystemManager.RegPeerAddr[2] = (uint8_t)strtol(&tmpBuf[4], NULL, 16); tmpBuf[4] = 0;
+		SystemManager.RegPeerAddr[1] = (uint8_t)strtol(&tmpBuf[2], NULL, 16); tmpBuf[2] = 0;
+		SystemManager.RegPeerAddr[0] = (uint8_t)strtol(&tmpBuf[0], NULL, 16); 
+
+		 
+
+        rc = fds_record_close(&desc);
+        APP_ERROR_CHECK(rc);
+    }
+}
+
+
+
+
+void SaveRegMac(char* mac)
+{
+  int i;
+
+  if( RegMacPool.Count>= 5 )
+      return;
+  
+
+  for( i=0; i<RegMacPool.Count; i++)
+  {
+      if( strncmp( RegMacPool.Mac[i], mac, 12) == 0 )
+      {
+           NRF_LOG_RAW_INFO( "Allready Registrated\n");
+          return;
+      }
+  
+  }
+  
+  
+  RegMacPool.Mac[RegMacPool.Count][12] = 0;
+  strncpy( RegMacPool.Mac[RegMacPool.Count], mac, 12);
+
+   record_write(1, RegMacPool.Count+1, mac, 12);
+
+    RegMacPool.Count++;
+}
+
+
+
+
+void FlashTest()
+{
+
+
+    static uint8_t m_data[256];
+    int len;
+
+    sprintf(m_data, "hello-%d", 1);
+
+    len = strlen(m_data);
+    
+
+    record_write( 1, 1, m_data, len);
+    sprintf(m_data, "hello-%d", 2);
+    record_write( 1, 2, m_data, len);
+
+    print_all_cmd();
+}
+
+
+void SaveReceiverMac(char* mac)
+{
+	static uint8_t m_data[256];
+
+	mac[12] = 0;
+
+	 sprintf(m_data, "%s", mac);
+	 
+   NRF_LOG_RAW_INFO( "===> SaveReceiverMac : %s\n", m_data);
+
+
+
+	
+   record_write(1,1, m_data, 12);
+   print_all_cmd();
+
+  //FlashTest();
+
+}
+
+
+
+
+int FindRegMac(char* mac)
+{
+
+  int i;
+
+ 
+
+  for( i=0; i<RegMacPool.Count; i++)
+  {
+      if( strncmp( RegMacPool.Mac[i], mac, 12) == 0 )
+      {
+           NRF_LOG_RAW_INFO( "Valid Mac\n");
+          return 1;
+      }  
+  }
+  
+
+  return 0;
+
+}
+
+void DisplayRegMac()
+{
+
+  print_all_cmd( );
+}
+
+
+
+
+
+void SetMacAddress(uint8_t* addr)
+{
+
+	sd_ble_gap_addr_get(&old_ble_addr);
+	ble_gap_addr_t dd;
+	dd.addr_id_peer = 0;
+	dd.addr_type = BLE_GAP_ADDR_TYPE_PUBLIC;
+	dd.addr[0] = addr[0];
+	dd.addr[1] = addr[1];
+	//dd.addr[2] = addr[2];
+        dd.addr[2] = 0x57;
+	dd.addr[3] = addr[3];
+	dd.addr[4] = addr[4];
+	dd.addr[5] = addr[5];	
+    sd_ble_gap_addr_set(&dd);
+
+	
+	sd_ble_gap_addr_get(&new_ble_addr);
+	
+}
+
+
+
+
+
+
+
+
+
+
+
+
+HSKey Key[4];
+
+
+void KeyInit(void)
+{
+
+
+	Key[KEY_SELECT].longPressTimeOne = 2;
+
+	Key[KEY_UP].longPressTimeOne = 2;
+
+
+
+	//Key[KEY_COUNTER].longPressTimeKeep = 4;
+
+}
+
+
+
+
+//50ms key polling
+void ReadKEY(void)
+{	  
+
+	static int key_poll_count = 0;
+
+	if( SystemTimer.TIM_KEY < 100 )
+		return;
+
+	SystemTimer.TIM_KEY = 0;
+
+	
+
+	if( Key[KEY_SELECT].softRelease == 1 )
+		return;
+
+	if( key_poll_count == 2 )
+	{
+		if( nrf_gpio_pin_read(BSP_BUTTON_1) == true )
+		{
+			if( SystemManager.EmgSendButton == 10 )
+			{
+				SystemManager.EmgSendButton = BUTTON_TEST;
+				Key[KEY_SELECT].softRelease = 1;
+
+			}
+			
+		}
+
+	}
+
+	key_poll_count++;
+
+	if( nrf_gpio_pin_read(BSP_BUTTON_1) == false  )
+	{
+		Key[KEY_SELECT].pressTime++;
+		nrf_pwr_mgmt_feed();
+
+
+		if( Key[KEY_SELECT].pressTime>20)
+		{
+			Key[KEY_SELECT].softRelease = 1;
+			KeySelectLongPressedOne();
+		}
+	}
+
+
+
+
+}
+
+
+
+
+void KeySelectLongPressedOne(void)
+{
+	NRF_LOG_INFO("KeySelectLongPressedOne\r\n" );	
+	SystemManager.EmgSendButton = BUTTON_REG;
+}
+
+
+
+
+void PortInputCfg(void)
+{
+
+#if 1
+    uint32_t i;
+    for (i = 17; i <= 20; ++i)
+    {
+        nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN);
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP);
+    }
+
+
+	for (i = 12; i <= 15; ++i)
+    {
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLDOWN);
+        //nrf_gpio_cfg_input(i, NRF_GPIO_PIN_PULLUP);
+    }
+
+	nrf_gpio_cfg_input(7, NRF_GPIO_PIN_PULLDOWN);
+#endif
+
+
+}
+
+
+
+
+
+
+#if 0
+//uint8_t AesBuffer[16];
+
+void CarEncryptEcb(int mode)
+{
+  uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON
+  uint8_t in[]  = {'C', 'A', 'R', 1,2,3,4,5,6,7,8,9,10,11,12,13 };
+
+  uint16_t tempVal;
+
+
+  if( mode == AES_ENC_CAR )
+  {
+  	in[0] = 'C';
+	in[1] = 'A';
+	in[2] = 'R';
+  }else if( mode == AES_ENC_EMG )
+  {
+  	in[0] = 'E';
+	in[1] = 'M';
+	in[2] = 'G';
+  }else if( mode == AES_ENC_WES_EMG )
+  {
+  	in[0] = 'E';
+	in[1] = 'M';
+	in[2] = 'G';
+  }
+
+  
+
+  tempVal = rand();
+
+  in[3] = tempVal&0xff;
+  in[4] = (tempVal>>8)&0xff;
+
+  AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+  NRF_LOG_RAW_INFO("ECB encrypt: %x\n", tempVal);
+
+}
+#endif
+
+
+
+
+void WesDecryptEcb(char* in, char* out)
+{
+	uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // IES-200B PARTRON
+
+	NRF_LOG_INFO("WesDecryptEcb AES128");
+
+	AES128_ECB_decrypt(in, key, out);
+
+}
+
+
+
+
+
+void WesEncryptEcb(uint8_t* in)
+{
+	int i;
+
+	uint8_t* inOrg = in;
+
+	uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // IES-200B PARTRON
+  
+  
+   AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+   memcpy( inOrg, SystemManager.AesEncData, 16 );
+
+}
+
+
+
+
+
+
+#if 0	// Not Used
+void CarEncryptEcbACK(char type)
+{
+
+	uint8_t key[] = {0x53, 0x6D, 0x61, 0x72, 0x74, 0x42, 0x61, 0x6E, 0x64, 0x50, 0x41, 0x52, 0x54, 0x52, 0x4F, 0x4E}; // SmartBandPARTRON
+	uint8_t in[]  = {'C', 'A', 'R', 'A','C','K',1,2,3,4,5,6,7,8,9,0x0A };
+
+	switch(type){
+		// BAND EMG
+		case 0x72:
+			in[3] = 'E';
+			in[4] = 'M';
+			in[5] = 'G';	
+		break;
+
+		// NEW iOS APP
+		case 0x75:
+			in[3] = 'P';
+			in[4] = 'C';
+			in[5] = 'A';	
+		break;
+	}
+
+
+	AES128_ECB_encrypt(in, key, SystemManager.AesEncData);
+
+	NRF_LOG_RAW_INFO("ECB ACK\n");
+}
+#endif
+
+

+ 193 - 0
IES200RB.si4project/Backup/sysmgr(5100).h

@@ -0,0 +1,193 @@
+#ifndef _SYSMGR_H_
+#define _SYSMGR_H_
+
+#include "nrf_drv_spi.h"
+#include "app_util_platform.h"
+#include "nrf_gpio.h"
+#include "nrf_delay.h"
+#include "boards.h"
+#include "app_error.h"
+#include <string.h>
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+
+#include "ble_gap.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+
+struct stSystemTimer__ {
+	volatile int MS_1;
+        volatile int UART_LAST_RECV_TIMER;
+        volatile int SEND_TEST_TIMER;
+        volatile int LED_TOGGLE_TIMER;
+        volatile int TMR_SYS_OFF;
+        volatile int SEND_TIMER;
+        volatile int BUZZER_TIMER;
+        char EMG_SEND_RUN;
+		volatile int TIM_KEY;
+		volatile int SLEEP_TIMER;
+};
+typedef struct stSystemTimer__ stSystemTimer;
+
+
+
+
+struct stSystemManager__ {
+
+  char EmgSendButton;
+  char TestSendButton;
+  char RxEvent;
+  char SendRepeat;
+  char SendFlag;
+  int  BleConnectTime;
+  int  SendRepeatTimerLimit;
+  char BuzzerType;
+  char BuzzerBusy;
+  unsigned char Batt;
+
+  char BleSendReady;
+  char BleSendStatus;
+
+
+  char BleConnected;
+  char BleSendRetry;
+  char PeerAddr[6];
+  char StrPeerAddr[15];
+  char RegPeerAddr[6];
+  char StrRegPeerAddr[15];
+
+
+
+  char SysReady;
+  char SleepEnter;
+
+  char FWUpdate;
+  
+  char GpReg;
+  char GoSleep;  
+  uint32_t ResetReason;
+
+
+	char AesEncData[16];
+
+
+};
+typedef struct stSystemManager__ stSystemManager;
+
+
+
+
+#define AES_ENC_CAR		1
+#define AES_ENC_EMG		2
+#define AES_ENC_PCA		3
+#define AES_ENC_WES_EMG	4
+#define AES_ENC_WES_ALV	5
+#define AES_ENC_WES_TST	6
+#define AES_ENC_WES_REG	7
+
+
+/* A dummy structure to save in flash. */
+
+#define CONFIG_FILE     (0x8010)
+#define CONFIG_REC_KEY  (0x7010)
+
+
+typedef struct
+{
+    uint32_t boot_count;
+    char     device_name[16];
+    bool     config1_on;
+    bool     config2_on;
+} configuration_t;
+
+
+
+typedef struct
+{
+    char Mac[10][15];	
+    int Count;
+}RegMacPool_t;
+
+
+
+
+
+
+
+void ParkSysInit();
+void ParkPowerOff();
+
+void SendEmgData(void);
+extern stSystemTimer SystemTimer;
+extern stSystemManager SystemManager;
+
+
+
+
+
+
+
+#define KEY_SELECT		0
+#define KEY_UP			1
+#define KEY_DOWN		3
+#define KEY_BACK		2
+
+
+
+
+typedef struct tsHSKey{
+	unsigned char onFlag;
+	unsigned char softRelease;
+	unsigned char pressedSec;
+	unsigned int  pressTime;
+	unsigned int  longPressTimeOne;
+	unsigned int  longPressTimeKeep;
+	unsigned int  prevTime;
+
+
+}HSKey;
+
+
+
+
+
+
+void ReadKEY(void);
+void KeyInit(void);
+
+
+
+
+void KeySelectLongPressedOne(void);
+
+
+void m_standby_counter_clerar();
+void PortInputCfg(void);
+
+
+void lfclk_config(void);
+void rtc_config(void);
+
+void SaveReceiverMac(char* mac);
+void LoadReceiverMac();
+void FlashTest();
+
+
+
+
+
+void WesEncryptEcb(uint8_t* in);
+void WesDecryptEcb(char* in, char* out);
+
+
+
+extern ble_gap_addr_t old_ble_addr;
+extern ble_gap_addr_t new_ble_addr;
+
+extern RegMacPool_t RegMacPool;
+
+#endif

+ 195 - 0
IES200RB.si4project/Backup/sysmgr(7951).h

@@ -0,0 +1,195 @@
+#ifndef _SYSMGR_H_
+#define _SYSMGR_H_
+
+#include "nrf_drv_spi.h"
+#include "app_util_platform.h"
+#include "nrf_gpio.h"
+#include "nrf_delay.h"
+#include "boards.h"
+#include "app_error.h"
+#include <string.h>
+#include "nrf_log.h"
+#include "nrf_log_ctrl.h"
+#include "nrf_log_default_backends.h"
+
+#include "ble_gap.h"
+
+#include "fds.h"
+#include "nrf_fstorage.h"
+
+
+
+struct stSystemTimer__ {
+	volatile int MS_1;
+        volatile int UART_LAST_RECV_TIMER;
+        volatile int SEND_TEST_TIMER;
+        volatile int LED_TOGGLE_TIMER;
+        volatile int TMR_SYS_OFF;
+        volatile int SEND_TIMER;
+        volatile int BUZZER_TIMER;
+        char EMG_SEND_RUN;
+		volatile int TIM_KEY;
+		volatile int SLEEP_TIMER;
+};
+typedef struct stSystemTimer__ stSystemTimer;
+
+
+
+
+struct stSystemManager__ {
+
+  char EmgSendButton;
+  char TestSendButton;
+  char RxEvent;
+  char SendRepeat;
+  char SendFlag;
+  int  BleConnectTime;
+  int  SendRepeatTimerLimit;
+  char BuzzerType;
+  char BuzzerBusy;
+  unsigned char Batt;
+
+  char BleSendReady;
+  char BleSendStatus;
+
+
+  char BleConnected;
+  char BleSendRetry;
+  char PeerAddr[6];
+  char StrPeerAddr[15];
+  char RegPeerAddr[6];
+  char StrRegPeerAddr[15];
+
+
+
+  char SysReady;
+  char SleepEnter;
+
+  char FWUpdate;
+  
+  char GpReg;
+  char GoSleep;  
+  uint32_t ResetReason;
+
+
+	char AesEncData[16];
+
+
+};
+typedef struct stSystemManager__ stSystemManager;
+
+
+
+
+#define AES_ENC_CAR		1
+#define AES_ENC_EMG		2
+#define AES_ENC_PCA		3
+#define AES_ENC_WES_EMG	4
+#define AES_ENC_WES_ALV	5
+#define AES_ENC_WES_TST	6
+#define AES_ENC_WES_REG	7
+
+
+/* A dummy structure to save in flash. */
+
+#define CONFIG_FILE     (0x8010)
+#define CONFIG_REC_KEY  (0x7010)
+
+
+typedef struct
+{
+    uint32_t boot_count;
+    char     device_name[16];
+    bool     config1_on;
+    bool     config2_on;
+} configuration_t;
+
+
+
+typedef struct
+{
+    char Mac[10][15];	
+    int Count;
+}RegMacPool_t;
+
+
+
+
+
+
+
+void ParkSysInit();
+void ParkPowerOff();
+
+void SendEmgData(void);
+extern stSystemTimer SystemTimer;
+extern stSystemManager SystemManager;
+
+
+
+
+
+
+
+#define KEY_SELECT		0
+#define KEY_UP			1
+#define KEY_DOWN		3
+#define KEY_BACK		2
+
+
+
+
+typedef struct tsHSKey{
+	unsigned char onFlag;
+	unsigned char softRelease;
+	unsigned char pressedSec;
+	unsigned int  pressTime;
+	unsigned int  longPressTimeOne;
+	unsigned int  longPressTimeKeep;
+	unsigned int  prevTime;
+
+
+}HSKey;
+
+
+
+
+
+
+void ReadKEY(void);
+void KeyInit(void);
+
+
+
+
+void KeySelectLongPressedOne(void);
+
+
+void m_standby_counter_clerar();
+void PortInputCfg(void);
+
+
+void lfclk_config(void);
+void rtc_config(void);
+
+void SaveReceiverMac(char* mac);
+void LoadReceiverMac();
+void FlashTest();
+
+
+uint8_t Load_Flash();
+void Save_Flash(uint8_t data);
+
+
+
+void WesEncryptEcb(uint8_t* in);
+void WesDecryptEcb(char* in, char* out);
+
+
+
+extern ble_gap_addr_t old_ble_addr;
+extern ble_gap_addr_t new_ble_addr;
+
+extern RegMacPool_t RegMacPool;
+
+#endif

+ 187 - 0
IES200RB.si4project/IES200RB.SearchResults

@@ -0,0 +1,187 @@
+---- app_timer_create Matches (29 in 24 files) ----
+app_button_init in app_button.c (components\libraries\button) : 
+    /* Create polling timer. */
+    return app_timer_create(&m_detection_delay_timer_id,
+                            APP_TIMER_MODE_SINGLE_SHOT,
+                            detection_delay_timeout_handler);
+}
+app_timer.c (components\libraries\timer) line 960 : 
+
+ret_code_t app_timer_create(app_timer_id_t const *      p_timer_id,
+                            app_timer_mode_t            mode,
+                            app_timer_timeout_handler_t timeout_handler)
+{
+app_timer.h (components\libraries\timer) line 214 : 
+ *       the timer is not running.
+ * @attention The FreeRTOS and RTX app_timer implementation does not allow app_timer_create to
+ *       be called on the previously initialized instance.
+ */
+ret_code_t app_timer_create(app_timer_id_t const *      p_timer_id,
+                            app_timer_mode_t            mode,
+                            app_timer_timeout_handler_t timeout_handler);
+
+app_timer2.c (components\libraries\timer) line 553 : 
+
+ret_code_t app_timer_create(app_timer_id_t const *      p_timer_id,
+                            app_timer_mode_t            mode,
+                            app_timer_timeout_handler_t timeout_handler)
+{
+app_timer_freertos.c (components\libraries\timer) line 122 : 
+
+uint32_t app_timer_create(app_timer_id_t const *      p_timer_id,
+                          app_timer_mode_t            mode,
+                          app_timer_timeout_handler_t timeout_handler)
+{
+app_timer_rtx.c (components\libraries\timer) line 131 : 
+
+ret_code_t app_timer_create(app_timer_id_t const      * p_timer_id,
+                            app_timer_mode_t            mode,
+                            app_timer_timeout_handler_t timeout_handler)
+{
+ast_init in auth_status_tracker.c (components\ble\peer_manager) : 
+{
+    ret_code_t err_code = app_timer_create(&m_pairing_attempt_timer,
+                                           APP_TIMER_MODE_SINGLE_SHOT,
+                                           blacklisted_peers_state_transition_handle);
+
+auth_status_tracker.h (components\ble\peer_manager) line 65 : 
+ * @retval NRF_SUCCESS Initialization was successful.
+ * @retval Other       Other error codes might be returned by the @ref app_timer_create function.
+ */
+ret_code_t ast_init(void);
+
+ble_conn_params_init in ble_conn_params.c (components\ble\common) : 
+
+        err_code = app_timer_create(&p_instance->timer_id,
+                            APP_TIMER_MODE_SINGLE_SHOT,
+                            update_timeout_handler);
+        if (err_code != NRF_SUCCESS)
+bsp_init in bsp.c (components\libraries\bsp) : 
+        {
+            err_code = app_timer_create(&m_bsp_button_tmr,
+                                        APP_TIMER_MODE_SINGLE_SHOT,
+                                        button_timer_handler);
+        }
+bsp_init in bsp.c (components\libraries\bsp) : 
+          err_code =
+              app_timer_create(&m_bsp_leds_tmr, APP_TIMER_MODE_SINGLE_SHOT, leds_timer_handler);
+      }
+
+      if (err_code == NRF_SUCCESS)
+bsp_init in bsp.c (components\libraries\bsp) : 
+          err_code =
+              app_timer_create(&m_bsp_alert_tmr, APP_TIMER_MODE_REPEATED, alert_timer_handler);
+      }
+    }
+#endif // LEDS_NUMBER > 0 && !(defined BSP_SIMPLE)
+es_adv_timing_timers_init in es_adv_timing.c (components\ble\ble_services\eddystone) : 
+
+    err_code = app_timer_create(&m_es_adv_interval_timer,
+                                APP_TIMER_MODE_SINGLE_SHOT,
+                                adv_interval_timeout);
+    APP_ERROR_CHECK(err_code);
+
+    err_code = app_timer_create(&m_es_slot_timer,
+                                APP_TIMER_MODE_SINGLE_SHOT,
+                                adv_slot_timeout);
+    APP_ERROR_CHECK(err_code);
+hci_transport_open in hci_transport.c (components\libraries\hci) : 
+
+    uint32_t err_code = app_timer_create(&m_app_timer_id,
+                                         APP_TIMER_MODE_REPEATED,
+                                         hci_transport_timeout_handle);
+    if (err_code != NRF_SUCCESS)
+led_softblink.h (components\libraries\led_softblink) line 116 : 
+ *
+ * @return Values returned by @ref app_timer_create.
+ */
+ret_code_t led_softblink_init(led_sb_init_params_t const * p_init_params);
+
+low_power_pwm_init in low_power_pwm.c (components\libraries\low_power_pwm) : 
+
+    err_code = app_timer_create(p_pwm_instance->p_timer_id, APP_TIMER_MODE_SINGLE_SHOT, pwm_timeout_handler);
+
+    if (err_code != NRF_SUCCESS)
+    {
+low_power_pwm.h (components\libraries\low_power_pwm) line 159 : 
+ *
+ * @return Values returned by @ref app_timer_create.
+ */
+ret_code_t low_power_pwm_init(low_power_pwm_t * p_pwm_instance,
+                              low_power_pwm_config_t const * p_pwm_config,
+timers_init in main.c (examples\ble_peripheral\ble_app_uart) : 
+
+    app_timer_create(&m_our_char_timer_id, APP_TIMER_MODE_REPEATED, timer_timeout_handler);
+
+	app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+}
+
+/**@brief Function for the GAP initialization.
+main in main.c (examples\ble_peripheral\ble_app_uart) : 
+
+	err_code = app_timer_create(&wakeup_timer_id, APP_TIMER_MODE_SINGLE_SHOT, wakeup_timer_handler);
+    APP_ERROR_CHECK(err_code);
+	err_code = app_timer_create(&m_ms_timer_id, APP_TIMER_MODE_REPEATED, timer_ms_timeout_handler);
+    APP_ERROR_CHECK(err_code);
+
+	//err_code = app_timer_start(m_ms_timer_id, TIMER_MS_INTERVAL, NULL);
+cli_ble_uart_enable in nrf_cli_ble_uart.c (components\libraries\cli\ble_uart) : 
+        {
+            err_code = app_timer_create(p_instance->p_timer,
+                                        APP_TIMER_MODE_SINGLE_SHOT,
+                                        timer_handler);
+            p_instance->p_cb->timer_created = true;
+cli_rtt_enable in nrf_cli_rtt.c (components\libraries\cli\rtt) : 
+        {
+            err_code = app_timer_create(p_internal->p_timer,
+                                        APP_TIMER_MODE_SINGLE_SHOT,
+                                        timer_handler);
+            p_internal->p_cb->timer_created = true;
+cli_uart_enable in nrf_cli_uart.c (components\libraries\cli\uart) : 
+        {
+            err_code = app_timer_create(p_internal->p_timer,
+                                        APP_TIMER_MODE_SINGLE_SHOT,
+                                        timer_handler);
+            p_internal->p_cb->timer_created = true;
+nrf_csense_init in nrf_csense.c (components\libraries\csense) : 
+
+    err_code = app_timer_create(&nrf_csense_timer, APP_TIMER_MODE_REPEATED, csense_timer_handler);
+    if (err_code != NRF_SUCCESS)
+    {
+        return err_code;
+nrf_libuarte_async.c (components\libraries\libuarte) line 131 : 
+#define local_app_timer_stop(p_timer) app_timer_stop(p_timer)
+#define local_app_timer_create(p_timer) app_timer_create(p_timer, APP_TIMER_MODE_SINGLE_SHOT, app_timer_handler)
+#define local_app_timer_cnt_diff_compute(to, from) app_timer_cnt_diff_compute(to, from)
+#else
+#ifndef APP_TIMER_CONFIG_RTC_FREQUENCY
+nrf_libuarte_async_init in nrf_libuarte_async.c (components\libraries\libuarte) : 
+        /* app_timer in use */
+        if(!p_libuarte->p_ctrl_blk->app_timer_created)
+        {
+            ret = local_app_timer_create(p_libuarte->p_app_timer);
+            if (ret != NRF_SUCCESS)
+nrf_libuarte_async_init in nrf_libuarte_async.c (components\libraries\libuarte) : 
+            }
+            p_libuarte->p_ctrl_blk->app_timer_created = true;
+        }
+        p_libuarte->p_app_timer_ctrl_blk->activate = false;
+        p_libuarte->p_app_timer_ctrl_blk->rx_count = 0;
+{anonnrf_libuarte_async_ctrl_blk_t} in nrf_libuarte_async.h (components\libraries\libuarte) : 
+    uint32_t timeout_us;
+    bool app_timer_created;
+    bool hwfc;
+    bool rx_halted;
+    bool enabled;
+pwr_mgmt_timer_create in nrf_pwr_mgmt.c (components\libraries\pwr_mgmt) : 
+    {
+        ret_code_t ret_code = app_timer_create(&m_pwr_mgmt_timer,
+                                               APP_TIMER_MODE_REPEATED,
+                                               nrf_pwr_mgmt_timeout_handler);
+        if (ret_code != NRF_SUCCESS)
+conn_secure in peer_manager_handler.c (components\ble\peer_manager) : 
+    {
+        err_code = app_timer_create(&secure_delay_timer,
+                                    APP_TIMER_MODE_SINGLE_SHOT,
+                                    delayed_conn_secure);
+        APP_ERROR_CHECK(err_code);

+ 19 - 0
IES200RB.si4project/IES200RB.bookmarks.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<SourceInsightBookmarks
+	AppVer="4.00.0106"
+	AppVerMinReader="4.00.0009"
+	>
+	<Bookmarks>
+		<Mark
+			Name="1777866154916160402202"
+			Comment="ramdom"
+			File="examples\ble_peripheral\ble_app_uart\main.c"
+			Line="751"
+			Column="3"
+			Symbol="nus_data_handler"
+			SymbolInstance="0"
+			SymbolType="Function"
+			LineOffset="39"
+			/>
+	</Bookmarks>
+</SourceInsightBookmarks>

BIN
IES200RB.si4project/IES200RB.sip_sym


BIN
IES200RB.si4project/IES200RB.sip_xab


BIN
IES200RB.si4project/IES200RB.sip_xad


BIN
IES200RB.si4project/IES200RB.sip_xc


BIN
IES200RB.si4project/IES200RB.sip_xf


BIN
IES200RB.si4project/IES200RB.sip_xm


BIN
IES200RB.si4project/IES200RB.sip_xr


BIN
IES200RB.si4project/IES200RB.sip_xsb


BIN
IES200RB.si4project/IES200RB.sip_xsd


BIN
IES200RB.si4project/IES200RB.siproj


+ 22 - 0
IES200RB.si4project/IES200RB.siproj_settings.xml

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ProjectSettings
+	AppVer="4.00.0106"
+	AppVerMinReader="4.00.0034"
+	GlobalConfiguration="1"
+	GlobalWorkspace="0"
+	LocalsInDb="0"
+	IndexMembers="1"
+	IndexFragments="1"
+	UseMasterFileList="0"
+	SourceDir="..\"
+	BackupDir="%PROJECT_DATA_DIR%\Backup"
+	MasterFileList="%PROJECT_SOURCE_DIR%\%PROJECT_NAME%_filelist.txt"
+	IsImportProject="0"
+	>
+	<Imports>
+		<ImportedLibs/>
+	</Imports>
+	<ParseConditions>
+		<Defines/>
+	</ParseConditions>
+</ProjectSettings>

BIN
IES200RB.si4project/IES200RB.siwork


+ 7 - 0
IES200RB.si4project/IES200RB.snippets.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<SourceInsightCodeSnippets
+	AppVer="4.00.0106"
+	AppVerMinReader="4.00.0019"
+	>
+	<SnippetList/>
+</SourceInsightCodeSnippets>

BIN
IES200RB.si4project/cache/parse/components_ble_ble_advertising_ble_advertising.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_advertising_ble_advertising.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_db_discovery_ble_db_discovery.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_db_discovery_ble_db_discovery.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw_nrf51.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_dtm_ble_dtm_hw_nrf52.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_link_ctx_manager_ble_link_ctx_manager.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_link_ctx_manager_ble_link_ctx_manager.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_racp_ble_racp.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_racp_ble_racp.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_radio_notification_ble_radio_notification.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_radio_notification_ble_radio_notification.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_app_attr_get.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_app_attr_get.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_attr_parser.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_ancs_attr_parser.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_nrf_ble_ancs_c.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ancs_c_nrf_ble_ancs_c.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ans_c_ble_ans_c.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_ans_c_ble_ans_c.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_ble_bas.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_ble_bas.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_c_ble_bas_c.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bas_c_ble_bas_c.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bps_ble_bps.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_bps_ble_bps.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_cscs.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_cscs.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_sc_ctrlpt.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cscs_ble_sc_ctrlpt.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cts_c_ble_cts_c.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_cts_c_ble_cts_c.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu_bonded.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dfu_ble_dfu_unbonded.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_ble_dis.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_ble_dis.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_c_ble_dis_c.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_dis_c_ble_dis_c.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_escs_defs.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_nrf_ble_escs.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_escs_nrf_ble_escs.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls.c.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls.h.sisc


BIN
IES200RB.si4project/cache/parse/components_ble_ble_services_ble_gls_ble_gls_db.c.sisc


Деякі файли не було показано, через те що забагато файлів було змінено