Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed-rtos mbed mbed_fota_fan_control
Fork of mbed_fota_lamp_control by
Revision 13:e714e2971c49, committed 2015-10-13
- Comitter:
- dudnwjs
- Date:
- Tue Oct 13 06:35:19 2015 +0000
- Parent:
- 12:e3d3676753cc
- Commit message:
- lamp demo;
Changed in this revision
--- a/dialog_fota/app.cpp Wed Sep 02 07:44:29 2015 +0000
+++ b/dialog_fota/app.cpp Tue Oct 13 06:35:19 2015 +0000
@@ -13,6 +13,8 @@
#include "diss_task.h"
#include "fota_server_task.h"
#include "fan_control_task.h"
+#include "lamp_control_task.h"
+
namespace sevencore_fota{
/**
@@ -119,6 +121,26 @@
}
/**
****************************************************************************************
+ * @brief Send enable request to Lamp Control profile task.
+ * @param[in] BMH Ble Message Handler class reference
+ * @return void.
+ ****************************************************************************************
+ */
+void app_lamp_control_db_create(BleMsgHandler* BMH)
+{
+ uint8_t *msg;
+ // Add fan_control service table in the database
+ struct lamp_control_create_db_req req;
+ unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct lamp_control_create_db_req);
+ req.features = 0x000F;
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_CREATE_DB_REQ,TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_create_db_req),&req,msg);
+ BMH->BleSendMsg(msg,msg_size);
+}
+/**
+ ****************************************************************************************
* @brief Send Start Advertising command to GAPM task.
* @param[in] BMH Ble Message Handler class reference
* @return void.
@@ -335,6 +357,28 @@
}
/**
****************************************************************************************
+ * @brief Send enable request to lamp_control profile task.
+ * @param[in] device Ble device info
+ * @param[in] BMH Ble Message Handler class reference
+ * @return void.
+ ****************************************************************************************
+ */
+void app_lamp_control_enable(ble_dev *device,BleMsgHandler* BMH)
+{
+ uint8_t *msg;
+ struct lamp_control_enable_req req;
+ unsigned short msg_size = 1 + sizeof(ble_hdr) + sizeof(struct lamp_control_enable_req);
+ req.conhdl = device->conhdl;
+ req.sec_lvl = 1;
+
+ msg = new uint8_t[msg_size];
+
+ // Send the message
+ BMH->BleMsgAlloc(LAMP_CONTROL_ENABLE_REQ, TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_enable_req),&req,msg);
+ BMH->BleSendMsg(msg,msg_size);
+}
+/**
+ ****************************************************************************************
* @brief Send connection confirmation.
* param[in] auth Authentication requirements.
* @param[in] device Ble device info
--- a/dialog_fota/app.h Wed Sep 02 07:44:29 2015 +0000
+++ b/dialog_fota/app.h Tue Oct 13 06:35:19 2015 +0000
@@ -37,10 +37,10 @@
#define APP_DIS_MANUFACTURER_NAME_STR ("SevenCore")
#define APP_DIS_MANUFACTURER_NAME_STR_LEN (9)
/// Model Number String (up to 18 chars)
-#define APP_DIS_MODEL_NB_STR ("SC-BF-EXT")
-#define APP_DIS_MODEL_NB_STR_LEN (9)
+#define APP_DIS_MODEL_NB_STR ("SC-Lamp-02")
+#define APP_DIS_MODEL_NB_STR_LEN (10)
/// System ID - LSB -> MSB (FIXME)
-#define APP_DIS_SERIAL_NB_STR ("123-789")
+#define APP_DIS_SERIAL_NB_STR ("123-456")
#define APP_DIS_SERIAL_NB_STR_LEN (7)
/// System ID - LSB -> MSB (FIXME)
#define APP_DIS_SYSTEM_ID ("\x12\x34\x56\xFF\xFE\x9A\xBC\xDE")
@@ -63,7 +63,7 @@
#define APP_DFLT_ADV_DATA_LEN (8+2)
#define APP_SCNRSP_DATA "\x09\xFF\x00\x60\x52\x57\x2D\x42\x4C\x45"
#define APP_SCNRSP_DATA_LENGTH (10)
-#define APP_DFLT_DEVICE_NAME ("FAN-00")
+#define APP_DFLT_DEVICE_NAME ("SC-Lamp-02")
typedef struct
@@ -138,6 +138,14 @@
void app_fan_control_db_create(BleMsgHandler* BMH);
/**
****************************************************************************************
+ * @brief Send enable request to Lamp Control profile task.
+ * @param[in] BMH Ble Message Handler class reference
+ * @return void.
+ ****************************************************************************************
+ */
+void app_lamp_control_db_create(BleMsgHandler* BMH);
+/**
+ ****************************************************************************************
* @brief Send Start Advertising command to GAPM task.
* @param[in] BMH Ble Message Handler class reference
* @return void.
@@ -181,6 +189,15 @@
void app_fan_control_enable(ble_dev *device,BleMsgHandler* BMH);
/**
****************************************************************************************
+ * @brief Send enable request to Lamp_control profile task.
+ * @param[in] device Ble device info
+ * @param[in] BMH Ble Message Handler class reference
+ * @return void.
+ ****************************************************************************************
+ */
+void app_lamp_control_enable(ble_dev *device,BleMsgHandler* BMH);
+/**
+ ****************************************************************************************
* @brief Send connection confirmation.
* param[in] auth Authentication requirements.
* @param[in] device Ble device info
--- a/dialog_fota/app_task.cpp Wed Sep 02 07:44:29 2015 +0000
+++ b/dialog_fota/app_task.cpp Tue Oct 13 06:35:19 2015 +0000
@@ -11,11 +11,16 @@
#include "app.h"
#include "fota_server_task.h"
#include "fan_control_task.h"
+#include "lamp_control_task.h"
#include "mbed.h"
extern DigitalOut port18;//mid
extern DigitalOut port19;//low
extern DigitalOut port20;//high
+
+extern DigitalOut port21;//low
+extern DigitalOut port22;//high
+
extern uint8_t Timer_flag;
extern uint32_t Residual_Time;
@@ -334,7 +339,8 @@
if (app_env.state == APP_IDLE)
{
//app_set_mode(BMH);
- app_fan_control_db_create(BMH);
+ //app_fan_control_db_create(BMH);
+ app_lamp_control_db_create(BMH);
}
return 0;
@@ -552,9 +558,170 @@
}
}
}
+/**
+ ****************************************************************************************
+ * @brief Handles the LAMP_CONTROL_CREATE_DB_CFM message.
+ *
+ * @param[in] msgid Id of the message received.
+ * @param[in] param Pointer to the parameters of the message.
+ * @param[in] dest_id ID of the receiving task instance (TASK_GAP).
+ * @param[in] src_id ID of the sending task instance.
+ * @param[in] BMH Ble Message Handler class reference.
+ *
+ * @return If the message was consumed or not.
+ ****************************************************************************************
+ */
+void lamp_control_create_db_cfm_handler(unsigned short msgid,
+ struct lamp_control_create_db_cfm *param,
+ unsigned short dest_id,
+ unsigned short src_id,
+ BleMsgHandler* BMH)
+{
+ uint8_t fota_normal = 0;
+ uint8_t fota_normal_len = sizeof(fota_normal);
+ if (param->status == CO_ERROR_NO_ERROR)
+ {
+ // Initialization All Characteristic
+ {
+ uint8_t *msg;
+ struct lamp_control_set_char_val_req power_state_val;
+ unsigned short msg_size = 1+sizeof(ble_hdr)+ sizeof(lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE);
+ // Fill in the parameter structure
+ power_state_val.char_code = LAMP_CONTROL_POWER_STATE_CHAR;
+ power_state_val.val_len = LAMP_CONTROL_MIN_SIZE;
+ memcpy(&power_state_val.val[0], &fota_normal, fota_normal_len);
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_SET_CHAR_VAL_REQ,TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_set_char_val_req)-(4-FAN_CONTROL_MIN_SIZE),&power_state_val,msg );
+ // Send the message
+ BMH->BleSendMsg(msg,msg_size);
+ free(msg);
+ }
+ {
+ uint8_t *msg;
+ struct lamp_control_set_char_val_req light_intensity_val;
+ unsigned short msg_size = 1+sizeof(ble_hdr)+ sizeof(lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE);
+ // Fill in the parameter structure
+ light_intensity_val.char_code = LAMP_CONTROL_LIGHT_INTENSITY_CHAR;
+ light_intensity_val.val_len = LAMP_CONTROL_MIN_SIZE;
+ memcpy(&light_intensity_val.val[0], &fota_normal, fota_normal_len);
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_SET_CHAR_VAL_REQ,TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE),&light_intensity_val,msg );
+ // Send the message
+ BMH->BleSendMsg(msg,msg_size);
+ free(msg);
+ }
+ {
+ uint8_t *msg;
+ struct lamp_control_set_char_val_req lamp_timer_val;
+ unsigned short msg_size = 1+sizeof(ble_hdr)+ sizeof(lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE);
+ // Fill in the parameter structure
+ lamp_timer_val.char_code = LAMP_CONTROL_LAMP_TIMER_CHAR;
+ lamp_timer_val.val_len = LAMP_CONTROL_MIN_SIZE;
+ memcpy(&lamp_timer_val.val[0], &fota_normal, fota_normal_len);
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_SET_CHAR_VAL_REQ,TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE),&lamp_timer_val,msg );
+ // Send the message
+ BMH->BleSendMsg(msg,msg_size);
+ free(msg);
+ }
+ {
+ uint8_t *msg;
+ struct lamp_control_set_char_val_req residual_time_val;
+ unsigned short msg_size = 1+sizeof(ble_hdr)+ sizeof(lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MAX_SIZE);
+ // Fill in the parameter structure
+ residual_time_val.char_code = LAMP_CONTROL_RESIDUAL_TIME_CHAR;
+ residual_time_val.val_len = LAMP_CONTROL_MAX_SIZE;
+ memcpy(&residual_time_val.val[0], &fota_normal, fota_normal_len*4);
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_SET_CHAR_VAL_REQ,TASK_LAMP_CONTROL, TASK_GTL,sizeof(struct lamp_control_set_char_val_req)-(4-FAN_CONTROL_MAX_SIZE),&residual_time_val,msg );
+ // Send the message
+ BMH->BleSendMsg(msg,msg_size);
+ free(msg);
+ }
+ }
+ if (app_env.state == APP_IDLE)
+ {
+ app_set_mode(BMH);
+ }
+}
/**
****************************************************************************************
+ * @brief Handles the LAMP_CONTROL_COMMAND_IND message.
+ *
+ * @param[in] msgid Id of the message received.
+ * @param[in] param Pointer to the parameters of the message.
+ * @param[in] dest_id ID of the receiving task instance (TASK_GAP).
+ * @param[in] src_id ID of the sending task instance.
+ * @param[in] BMH Ble Message Handler class reference.
+ *
+ * @return If the message was consumed or not.
+ ****************************************************************************************
+ */
+void lamp_control_command_ind_handler(unsigned short msgid,
+ struct lamp_control_command_ind *param,
+ unsigned short dest_id,
+ unsigned short src_id,
+ BleMsgHandler* BMH)
+{
+ char str[30] = "\nLAMP remote control START!!\n";
+ BMH->HostPcPrint(str);
+ if( param->char_code == LAMP_CONTROL_POWER_STATE_CHAR){
+ if(param->command == 0){
+ Timer_flag = 0;
+ Residual_Time = 0;
+ port21 = 0;
+ port22 = 0;
+ }
+ if(param->command == 1){
+ if( port21 == 0 && port22 == 0 )
+ port21 = 1;
+ }
+ }else if( param->char_code == LAMP_CONTROL_LIGHT_INTENSITY_CHAR){
+ if( param->command == 1 ){ //low
+ port21 = 1;
+ port22 = 0;
+ }
+ else if( param->command == 2 ){ //mid
+ port21 = 0;
+ port22 = 1;
+ }
+ }else if( param->char_code == LAMP_CONTROL_LAMP_TIMER_CHAR){
+ Timer_flag = param->command;
+ }else if( param->char_code == LAMP_CONTROL_RESIDUAL_TIME_CHAR){
+ Residual_Time = param->residual_time;
+ {
+ uint8_t fota_normal = 0;
+ uint8_t *msg;
+ struct lamp_control_set_char_val_req char_set_req;
+ unsigned short msg_size = 1+sizeof(ble_hdr)+ sizeof(lamp_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE);
+ // Fill in the parameter structure
+ char_set_req.char_code = LAMP_CONTROL_POWER_STATE_CHAR;
+ char_set_req.val_len = LAMP_CONTROL_MIN_SIZE;
+ memcpy(&char_set_req.val[0], &fota_normal, sizeof(fota_normal));
+
+ msg = new uint8_t[msg_size];
+
+ BMH->BleMsgAlloc(LAMP_CONTROL_SET_CHAR_VAL_REQ
+ ,TASK_LAMP_CONTROL, TASK_GTL
+ ,sizeof(struct fan_control_set_char_val_req)-(4-LAMP_CONTROL_MIN_SIZE)
+ ,&char_set_req,msg );
+ // Send the message
+ BMH->BleSendMsg(msg,msg_size);
+ free(msg);
+ }
+ }
+}
+/**
+ ****************************************************************************************
* @brief Handles ready indication from the GAP.
*
* @param[in] msgid Id of the message received.
@@ -670,7 +837,8 @@
app_dis_enable(&device,BMH);
app_fota_server_enable(&device,BMH);
- app_fan_control_enable(&device,BMH);
+ //app_fan_control_enable(&device,BMH);
+ app_lamp_control_enable(&device,BMH);
app_connect_confirm(GAP_AUTH_REQ_NO_MITM_NO_BOND,&device,BMH);
return 0;
--- a/dialog_fota/app_task.h Wed Sep 02 07:44:29 2015 +0000
+++ b/dialog_fota/app_task.h Tue Oct 13 06:35:19 2015 +0000
@@ -132,6 +132,42 @@
BleMsgHandler* BMH);
/**
****************************************************************************************
+ * @brief Handles the LAMP_CONTROL_CREATE_DB_CFM message.
+ *
+ * @param[in] msgid Id of the message received.
+ * @param[in] param Pointer to the parameters of the message.
+ * @param[in] dest_id ID of the receiving task instance (TASK_GAP).
+ * @param[in] src_id ID of the sending task instance.
+ * @param[in] BMH Ble Message Handler class reference.
+ *
+ * @return If the message was consumed or not.
+ ****************************************************************************************
+ */
+void lamp_control_create_db_cfm_handler(unsigned short msgid,
+ struct lamp_control_create_db_cfm *param,
+ unsigned short dest_id,
+ unsigned short src_id,
+ BleMsgHandler* BMH);
+/**
+ ****************************************************************************************
+ * @brief Handles the LAMP_CONTROL_COMMAND_IND message.
+ *
+ * @param[in] msgid Id of the message received.
+ * @param[in] param Pointer to the parameters of the message.
+ * @param[in] dest_id ID of the receiving task instance (TASK_GAP).
+ * @param[in] src_id ID of the sending task instance.
+ * @param[in] BMH Ble Message Handler class reference.
+ *
+ * @return If the message was consumed or not.
+ ****************************************************************************************
+ */
+void lamp_control_command_ind_handler(unsigned short msgid,
+ struct lamp_control_command_ind *param,
+ unsigned short dest_id,
+ unsigned short src_id,
+ BleMsgHandler* BMH);
+/**
+ ****************************************************************************************
* @brief Handles ready indication from the GAP.
*
* @param[in] msgid Id of the message received.
--- a/dialog_fota/dialog_fota_config.h Wed Sep 02 07:44:29 2015 +0000
+++ b/dialog_fota/dialog_fota_config.h Tue Oct 13 06:35:19 2015 +0000
@@ -96,6 +96,7 @@
// Start of conditionally assigned task types
TASK_FOTA_SERVER = 54 ,
TASK_FAN_CONTROL = 55 ,
+ TASK_LAMP_CONTROL = 56 ,
#if (BLE_SAMPLE128)
TASK_SAMPLE128 , // Sample128 Task
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/dialog_fota/lamp_control_task.h Tue Oct 13 06:35:19 2015 +0000
@@ -0,0 +1,141 @@
+/**
+ * @file lamp_control_task.h
+ * @brief Lamp Control Task Header.
+ * Copyright 2015 SEVENCORE Co., Ltd.
+ *
+ * @author HyeongJun Kim
+ * @version 1.0.0
+ * @date 2015-09-02
+*/
+
+#ifndef LAMP_CONTROL_TASK_H_
+#define LAMP_CONTROL_TASK_H_
+
+/*
+ * INCLUDE FILES
+ ****************************************************************************************
+*/
+
+
+/**
+ ****************************************************************************************
+ * @addtogroup dialog_fota module
+ * @brief Fota Server Task Header.
+ *
+ * @{
+ ****************************************************************************************
+ */
+namespace sevencore_fota{
+
+
+/*
+ * DEFINES
+ ****************************************************************************************
+ */
+
+/// Maximum number of fota server task instances
+#define LAMP_CONTROL_IDX_MAX (1)
+#define LAMP_CONTROL_MIN_SIZE (1)
+#define LAMP_CONTROL_MAX_SIZE (4)
+
+/*
+ * ENUMERATIONS
+ ****************************************************************************************
+ */
+
+///Attribue Table Indexes
+enum
+{
+ LAMP_CONTROL_POWER_STATE_CHAR,
+ LAMP_CONTROL_LIGHT_INTENSITY_CHAR,
+ LAMP_CONTROL_LAMP_TIMER_CHAR,
+ LAMP_CONTROL_RESIDUAL_TIME_CHAR,
+
+ LAMP_CONTROL_CHAR_MAX,
+};
+
+/// Messages for Fota Server
+enum
+{
+ /// Start lamp_control. Device connection
+ LAMP_CONTROL_ENABLE_REQ = TASK_LAMP_CONTROL*1024,
+ ///Create DataBase
+ LAMP_CONTROL_CREATE_DB_REQ,
+ ///Inform APP of database creation status
+ LAMP_CONTROL_CREATE_DB_CFM,
+ /// Disable confirm.
+ LAMP_CONTROL_DISABLE_IND,
+ //Set Request of The Attribute Value of Fota Service Characteristics
+ LAMP_CONTROL_SET_CHAR_VAL_REQ,
+ //Fan Control Command Indication
+ LAMP_CONTROL_COMMAND_IND,
+ /// Error Indication
+ LAMP_CONTROL_ERROR_IND,
+};
+
+
+/*
+ * API MESSAGES STRUCTURES
+ ****************************************************************************************
+ */
+
+
+/// Parameters of the @ref LAMP_CONTROL_ENABLE_REQ message
+struct lamp_control_enable_req
+
+{
+ /// Connection Handle
+ uint16_t conhdl;
+ /// Security level
+ uint8_t sec_lvl;
+};
+
+
+/// Parameters of the @ref LAMP_CONTROL_CREATE_DB_REQ message
+struct lamp_control_create_db_req
+{
+ /// Indicate if TXPS is supported or not
+ uint16_t features;
+};
+
+
+/// Parameters of the @ref LAMP_CONTROL_CREATE_DB_CFM message
+struct lamp_control_create_db_cfm
+{
+ /// Status
+ uint8_t status;
+};
+
+
+/// Parameters of the @ref LAMP_CONTROL_SET_CHAR_VAL_REQ message - shall be dynamically allocated
+struct lamp_control_set_char_val_req
+{
+ /// Characteristic Code
+ uint8_t char_code;
+ /// Value length
+ uint8_t val_len;
+ /// Value
+ uint8_t val[4];
+};
+
+
+/// Parameters of the @ref LAMP_CONTROL_DISABLE_IND message
+struct lamp_control_disable_ind
+{
+ /// Connection Handle
+ uint16_t conhdl;
+};
+
+/// Parameters of the @ref LAMP_CONTROL_COMMAND_IND message
+struct lamp_control_command_ind
+{
+ uint8_t char_code;
+ uint8_t command;
+ uint32_t residual_time;
+};
+
+
+}//namespace
+
+/// @} dialog_fota module
+#endif // LAMP_CONTROL_TASK_H_
--- a/ext_fota/BleMsgHandler.cpp Wed Sep 02 07:44:29 2015 +0000
+++ b/ext_fota/BleMsgHandler.cpp Tue Oct 13 06:35:19 2015 +0000
@@ -14,6 +14,7 @@
#include "fota_server_task.h"
#include "app_task.h"
#include "fan_control_task.h"
+#include "lamp_control_task.h"
/**
****************************************************************************************
@@ -247,6 +248,24 @@
if( print_flag == 1)
hostpc->printf("==> FAN_CONTROL_ERROR_IND !!\n");
break;
+ case LAMP_CONTROL_CREATE_DB_CFM:
+ if ( print_flag == 1)
+ hostpc->printf("Rcved LAMP_CONTROL_CREATE_DB_CFM Msg\n");
+ lamp_control_create_db_cfm_handler(msg_hdr.bType,(struct lamp_control_create_db_cfm *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
+ break;
+ case LAMP_CONTROL_DISABLE_IND:
+ if( print_flag == 1)
+ hostpc->printf("==> LAMP_CONTROL_DISABLE_IND!!\n");
+ break;
+ case LAMP_CONTROL_COMMAND_IND:
+ if( print_flag == 1)
+ hostpc->printf("==> LAMP_CONTROL_COMMAND_IND msg\n");
+ lamp_control_command_ind_handler(msg_hdr.bType,(struct lamp_control_command_ind *)&msg[paramPos],msg_hdr.bDstid,msg_hdr.bSrcid,this);
+ break;
+ case LAMP_CONTROL_ERROR_IND:
+ if( print_flag == 1)
+ hostpc->printf("==> LAMP_CONTROL_ERROR_IND !!\n");
+ break;
default:
if( print_flag == 1)
hostpc->printf("message Type Not Defined ! \n");
--- a/main.cpp Wed Sep 02 07:44:29 2015 +0000
+++ b/main.cpp Tue Oct 13 06:35:19 2015 +0000
@@ -28,6 +28,9 @@
DigitalOut port19(p19);//low
DigitalOut port20(p20);//high
+DigitalOut port21(p21);//low
+DigitalOut port22(p22);//high
+
uint8_t Timer_flag;
uint32_t Residual_Time;
@@ -45,8 +48,8 @@
if( Timer_flag == 1 && Residual_Time == 0 )
{
hostpc.printf("Power off!!\n");
- if( port18 == 1 || port19 == 1 || port20 == 1 )
- port18 = port19 = port20 = 0;
+ if( port21 == 1 || port22 == 1 )
+ port21 = port22 = 0;
Timer_flag = 0;
/*{
uint8_t fota_normal = 0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mbed_fota_lamp_control.lib Tue Oct 13 06:35:19 2015 +0000 @@ -0,0 +1,1 @@ +http://developer.mbed.org/users/dudnwjs/code/mbed_fota_fan_control/#e3d3676753cc
