OSStatus MVDCloudInterfaceResetCloudDevInfo(mico_Context_t* const inContext,
                                            MVDResetRequestData_t devResetRequestData)
{
  OSStatus err = kUnknownErr;
  
  // login_id/dev_passwd ok ?
  if((0 != strncmp(inContext->flashContentInRam.appConfig.virtualDevConfig.loginId, 
                   devResetRequestData.loginId, 
                   strlen(inContext->flashContentInRam.appConfig.virtualDevConfig.loginId))) ||
     (0 != strncmp(inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd, 
                   devResetRequestData.devPasswd, 
                   strlen(inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd))))
  {
    // devPass err
    cloud_if_log("ERROR: MVDCloudInterfaceResetCloudDevInfo: loginId/devPasswd mismatch!");
    return kMismatchErr;
  }
  cloud_if_log("MVDCloudInterfaceResetCloudDevInfo: loginId/devPasswd ok!");
  
  err = EasyCloudDeviceReset(&easyCloudContext);
  require_noerr_action( err, exit, cloud_if_log("ERROR: EasyCloudDeviceReset failed! err=%d", err) );
  
  mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex);
  inContext->flashContentInRam.appConfig.virtualDevConfig.isActivated = false;  // need to reActivate
  sprintf(inContext->flashContentInRam.appConfig.virtualDevConfig.deviceId, DEFAULT_DEVICE_ID);
  sprintf(inContext->flashContentInRam.appConfig.virtualDevConfig.masterDeviceKey, DEFAULT_DEVICE_KEY);
  sprintf(inContext->flashContentInRam.appConfig.virtualDevConfig.loginId, DEFAULT_LOGIN_ID);
  sprintf(inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd, DEFAULT_DEV_PASSWD);
  inContext->appStatus.virtualDevStatus.isCloudConnected = false;
  MICOUpdateConfiguration(inContext);
  mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex);
  
exit:
  return err;
}
OSStatus fogCloudDevAuthorize(app_context_t* const inContext,
                              MVDAuthorizeRequestData_t devAuthorizeReqData)
{
    cloud_if_log_trace();
    OSStatus err = kUnknownErr;
    easycloud_service_state_t cloudServiceState = FOGCLOUD_STOPPED;

    cloud_if_log("Device authorize...");

    cloudServiceState = FogCloudServiceState(&easyCloudContext);
    if (FOGCLOUD_STOPPED == cloudServiceState)
    {
        return kStateErr;
    }

    //ok, set cloud context
    strncpy(easyCloudContext.service_config_info.loginId,
            devAuthorizeReqData.loginId, MAX_SIZE_LOGIN_ID);
    strncpy(easyCloudContext.service_config_info.devPasswd,
            devAuthorizeReqData.devPasswd, MAX_SIZE_DEV_PASSWD);
    strncpy(easyCloudContext.service_config_info.userToken,
            devAuthorizeReqData.user_token, MAX_SIZE_USER_TOKEN);

    err = FogCloudAuthorize(&easyCloudContext);
    require_noerr_action( err, exit, cloud_if_log("ERROR: authorize failed! err=%d", err) );
    return kNoErr;

exit:
    return err;
}
OSStatus fogCloudResetCloudDevInfo(app_context_t* const inContext,
                                   MVDResetRequestData_t devResetRequestData)
{
    OSStatus err = kUnknownErr;

    cloud_if_log("Delete device info from cloud...");

    err = FogCloudDeviceReset(&easyCloudContext);
    require_noerr_action( err, exit, cloud_if_log("ERROR: FogCloudDeviceReset failed! err=%d", err) );

    inContext->appStatus.fogcloudStatus.isActivated = false;

    mico_rtos_lock_mutex(&inContext->mico_context->flashContentInRam_mutex);
    inContext->appConfig->fogcloudConfig.isActivated = false;  // need to reActivate
    inContext->appConfig->fogcloudConfig.owner_binding = false;  // no owner binding
    sprintf(inContext->appConfig->fogcloudConfig.deviceId, DEFAULT_DEVICE_ID);
    sprintf(inContext->appConfig->fogcloudConfig.masterDeviceKey, DEFAULT_DEVICE_KEY);
    sprintf(inContext->appConfig->fogcloudConfig.loginId, DEFAULT_LOGIN_ID);
    sprintf(inContext->appConfig->fogcloudConfig.devPasswd, DEFAULT_DEV_PASSWD);
    inContext->appStatus.fogcloudStatus.isCloudConnected = false;
    err = mico_system_context_update(inContext->mico_context);
    mico_rtos_unlock_mutex(&inContext->mico_context->flashContentInRam_mutex);

exit:
    return err;
}
//cloud service status changed handler
void cloudServiceStatusChangedHandler(void* context, easycloud_service_status_t serviceStateInfo)
{
  mico_Context_t *inContext = (mico_Context_t*)context;

  if (EASYCLOUD_CONNECTED == serviceStateInfo.state){
    cloud_if_log("cloud service connected!");
    inContext->appStatus.virtualDevStatus.isCloudConnected = true;
  }
  else{
    cloud_if_log("cloud service disconnected!");
    inContext->appStatus.virtualDevStatus.isCloudConnected = false;
  }
}
Exemple #5
0
OSStatus fogCloudSendtoChannel(const char* channel, unsigned char *inBuf, unsigned int inBufLen)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;

  cloud_if_log("MVD => Cloud[%s]:[%d]=%.*s", channel, inBufLen, inBufLen, inBuf);
  err = FogCloudPublishtoChannel(&easyCloudContext, channel, inBuf, inBufLen);
  require_noerr_action( err, exit, cloud_if_log("ERROR: fogCloudSendtoChannel failed! err=%d", err) );
  return kNoErr;
  
exit:
  return err;
}
OSStatus fogCloudSend(unsigned char *inBuf, unsigned int inBufLen)
{
    cloud_if_log_trace();
    OSStatus err = kUnknownErr;

    cloud_if_log("KIT => Cloud[publish]:[%d]=%.*s", inBufLen, inBufLen, inBuf);
    err = FogCloudPublish(&easyCloudContext, inBuf, inBufLen);
    require_noerr_action( err, exit, cloud_if_log("ERROR: fogCloudSend failed! err=%d", err) );
    return kNoErr;

exit:
    return err;
}
OSStatus MVDCloudInterfaceSendto(const char* topic, unsigned char *inBuf, unsigned int inBufLen)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;

  cloud_if_log("MVD => Cloud[%s]:[%d]=%.*s", topic, inBufLen, inBufLen, inBuf);
  err = EasyCloudPublishto(&easyCloudContext, topic, inBuf, inBufLen);
  require_noerr_action( err, exit, cloud_if_log("ERROR: MVDCloudInterfaceSendto failed! err=%d", err) );
  return kNoErr;
  
exit:
  return err;
}
OSStatus fogCloudStop(app_context_t* const inContext)
{
    cloud_if_log_trace();
    OSStatus err = kUnknownErr;

    cloud_if_log("fogCloudStop");
    err = FogCloudServiceStop(&easyCloudContext);
    require_noerr_action( err, exit,
                          cloud_if_log("ERROR: FogCloudServiceStop err=%d.", err) );
    return kNoErr;

exit:
    return err;
}
Exemple #9
0
OSStatus fogCloudDeinit(mico_Context_t* const inContext)
{  
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;
  
  cloud_if_log("fogCloudDeinit");
  err = FogCloudServiceDeInit(&easyCloudContext);
  require_noerr_action( err, exit, 
                       cloud_if_log("ERROR: FogCloudServiceDeInit err=%d.", err) );
  return kNoErr;
  
exit:
  return err;
}
OSStatus MVDCloudInterfaceStop(mico_Context_t* const inContext)
{  
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;
  
  cloud_if_log("MVDCloudInterfaceStop");
  err = EasyCloudServiceStop(&easyCloudContext);
  require_noerr_action( err, exit, 
                       cloud_if_log("ERROR: EasyCloudServiceStop err=%d.", err) );
  return kNoErr;
  
exit:
  return err;
}
//cloud service status changed handler
void cloudServiceStatusChangedHandler(void* context, easycloud_service_status_t serviceStateInfo)
{
  app_context_t *inContext = (app_context_t*)context;

  if (FOGCLOUD_CONNECTED == serviceStateInfo.state){
    cloud_if_log("cloud service connected!");
    inContext->appStatus.fogcloudStatus.isCloudConnected = true;
    //set_RF_LED_cloud_connected(inContext);
  }
  else{
    cloud_if_log("cloud service disconnected!");
    inContext->appStatus.fogcloudStatus.isCloudConnected = false;
    //set_RF_LED_cloud_disconnected(inContext);
  }
}
Exemple #12
0
//cloud message recived handler
void cloudMsgArrivedHandler(void* context, 
                            const char* topic, const unsigned int topicLen,
                            unsigned char *msg, unsigned int msgLen)
{
  OSStatus err = kUnknownErr;
  mico_Context_t *inContext = (mico_Context_t*)context;
  
  //note: get data just for length=len is valid, because Msg is just a buf pionter.
  cloud_if_log("Cloud[%.*s] => MVD: [%d]=%.*s", topicLen, topic, msgLen, msgLen, msg);
  
  err = MicoFogCloudCloudMsgProcess(inContext, topic, topicLen, msg, msgLen);
  if(kNoErr != err){
    cloud_if_log("ERROR: MicoFogCloudCloudMsgProcess err=%d", err);
  }
}
OSStatus fogCloudDevActivate(app_context_t* const inContext,
                             MVDActivateRequestData_t devActivateRequestData)
{
    cloud_if_log_trace();
    OSStatus err = kUnknownErr;

    cloud_if_log("Device activate...");

    //ok, set cloud context
    strncpy(easyCloudContext.service_config_info.loginId,
            devActivateRequestData.loginId, MAX_SIZE_LOGIN_ID);
    strncpy(easyCloudContext.service_config_info.devPasswd,
            devActivateRequestData.devPasswd, MAX_SIZE_DEV_PASSWD);
    strncpy(easyCloudContext.service_config_info.userToken,
            devActivateRequestData.user_token, MAX_SIZE_USER_TOKEN);

    // activate request
    err = FogCloudActivate(&easyCloudContext);
    require_noerr_action(err, exit,
                         cloud_if_log("ERROR: fogCloudDevActivate failed! err=%d", err) );

    inContext->appStatus.fogcloudStatus.isActivated = true;

    // write activate data back to flash
    mico_rtos_lock_mutex(&inContext->mico_context->flashContentInRam_mutex);
    inContext->appConfig->fogcloudConfig.isActivated = true;
    strncpy(inContext->appConfig->fogcloudConfig.deviceId,
            easyCloudContext.service_status.deviceId, MAX_SIZE_DEVICE_ID);
    strncpy(inContext->appConfig->fogcloudConfig.masterDeviceKey,
            easyCloudContext.service_status.masterDeviceKey, MAX_SIZE_DEVICE_KEY);

    strncpy(inContext->appConfig->fogcloudConfig.loginId,
            easyCloudContext.service_config_info.loginId, MAX_SIZE_LOGIN_ID);
    strncpy(inContext->appConfig->fogcloudConfig.devPasswd,
            easyCloudContext.service_config_info.devPasswd, MAX_SIZE_DEV_PASSWD);
    strncpy(inContext->appConfig->fogcloudConfig.userToken,
            easyCloudContext.service_config_info.userToken, MAX_SIZE_USER_TOKEN);

    err = mico_system_context_update(inContext->mico_context);
    mico_rtos_unlock_mutex(&inContext->mico_context->flashContentInRam_mutex);
    require_noerr_action(err, exit,
                         cloud_if_log("ERROR: activate write flash failed! err=%d", err) );

    return kNoErr;

exit:
    return err;
}
Exemple #14
0
WEAK OSStatus MicoFogCloudCloudMsgProcess(mico_Context_t* context, 
                                     const char* topic, const unsigned int topicLen,
                                     unsigned char *inBuf, unsigned int inBufLen)
{
  cloud_if_log("WARNING: MicoFogCloudCloudMsgProcess not override, use default functon. do nothing.");
  return kNoErr;
}
Exemple #15
0
easycloud_service_state_t fogCloudGetState(void)
{
  easycloud_service_state_t service_running_state = FOGCLOUD_STOPPED;
  
  cloud_if_log("fogCloudGetState");
  service_running_state = FogCloudServiceState(&easyCloudContext);
  return service_running_state;
}
easycloud_service_state_t MVDCloudInterfaceGetState(void)
{
  easycloud_service_state_t service_running_state = EASYCLOUD_STOPPED;
  
  cloud_if_log("MVDCloudInterfaceGetState");
  service_running_state = EasyCloudServiceState(&easyCloudContext);
  return service_running_state;
}
Exemple #17
0
//cloud service status changed handler
void cloudServiceStatusChangedHandler(void* context, easycloud_service_status_t serviceStateInfo)
{
  mico_Context_t *inContext = (mico_Context_t*)context;

  cloud_if_log("cloudServiceStatusChangedHandler: entry");

  if (FOGCLOUD_CONNECTED == serviceStateInfo.state){
    cloud_if_log("cloud service connected!");
    inContext->appStatus.fogcloudStatus.isCloudConnected = true;
    if(NULL != _fogcloud_connect_sem){
      mico_rtos_set_semaphore(&_fogcloud_connect_sem);
    }
    //set_RF_LED_cloud_connected(inContext);
  }
  else{
    cloud_if_log("cloud service disconnected!");
    inContext->appStatus.fogcloudStatus.isCloudConnected = false;
    //set_RF_LED_cloud_disconnected(inContext);
  }
}
//cloud message recived handler
void cloudMsgArrivedHandler(void* context, 
                            const char* topic, const unsigned int topicLen,
                            unsigned char *msg, unsigned int msgLen)
{
  mico_Context_t *inContext = (mico_Context_t*)context;
  
  //note: get data just for length=len is valid, because Msg is just a buf pionter.
  cloud_if_log("Cloud[%.*s] => MVD: [%d]=%.*s", topicLen, topic, msgLen, msgLen, msg);
  
  MVDCloudMsgProcess(inContext, topic, topicLen, msg, msgLen);
}
Exemple #19
0
OSStatus fogCloudDevAuthorize(mico_Context_t* const inContext,
                                       MVDAuthorizeRequestData_t devAuthorizeReqData)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;
  easycloud_service_state_t cloudServiceState = FOGCLOUD_STOPPED;
  
  cloud_if_log("Device authorize...");

  cloudServiceState = FogCloudServiceState(&easyCloudContext);
  if (FOGCLOUD_STOPPED == cloudServiceState){
    return kStateErr;
  }
  
  // dev_passwd ok ?
  if(0 != strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd, 
                  devAuthorizeReqData.devPasswd, 
                  strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd)))
  {
    // devPass err
    cloud_if_log("ERROR: fogCloudDevAuthorize: devPasswd mismatch!");
    return kMismatchErr;
  }
  cloud_if_log("fogCloudDevAuthorize: devPasswd ok!");
  
  //ok, set cloud context
  strncpy(easyCloudContext.service_config_info.loginId, 
          devAuthorizeReqData.loginId, MAX_SIZE_LOGIN_ID);
  strncpy(easyCloudContext.service_config_info.devPasswd, 
          devAuthorizeReqData.devPasswd, MAX_SIZE_DEV_PASSWD);
  strncpy(easyCloudContext.service_config_info.userToken, 
          devAuthorizeReqData.user_token, MAX_SIZE_USER_TOKEN);
  
  err = FogCloudAuthorize(&easyCloudContext);
  require_noerr_action( err, exit, cloud_if_log("ERROR: authorize failed! err=%d", err) );
  return kNoErr;
  
exit:
  return err;
}
OSStatus MVDCloudInterfacePrintVersion(void)
{
  //OSStatus err = kUnknownErr;
  int cloudServiceLibVersion = 0;
  cloud_if_log("MVDCloudInterfacePrintVersion");
  
  cloudServiceLibVersion = EasyCloudServiceVersion(&easyCloudContext);
  cloud_if_log("EasyCloud library version: v%d.%d.%d", 
               (cloudServiceLibVersion & 0x00FF0000) >> 16,
               (cloudServiceLibVersion & 0x0000FF00) >> 8,
               (cloudServiceLibVersion & 0x000000FF));
  
  return kNoErr;
}
OSStatus fogCloudPrintVersion(void)
{
    int cloudServiceLibVersion = 0;
    cloud_if_log("fogCloudPrintVersion");

    cloudServiceLibVersion = FogCloudServiceVersion(&easyCloudContext);
    UNUSED_PARAMETER(cloudServiceLibVersion);
    cloud_if_log("FogCloud library version: v%d.%d.%d",
                 (cloudServiceLibVersion & 0x00FF0000) >> 16,
                 (cloudServiceLibVersion & 0x0000FF00) >> 8,
                 (cloudServiceLibVersion & 0x000000FF));

    return kNoErr;
}
Exemple #22
0
OSStatus fogCloudStart(mico_Context_t* const inContext)
{
  OSStatus err = kUnknownErr;
  
  if(NULL == inContext){
    return kParamErr;
  }
  
  // start cloud service
  err = FogCloudServiceStart(&easyCloudContext);
  require_noerr_action( err, exit, cloud_if_log("ERROR: FogCloud service start failed.") );
  return kNoErr;
  
exit:
  return err;
}
OSStatus fogCloudInit(app_context_t* const inContext)
{
    OSStatus err = kUnknownErr;
    int cloudServiceLibVersion = 0;

    // set cloud service config
    strncpy(easyCloudContext.service_config_info.bssid,
            inContext->mico_context->micoStatus.mac, MAX_SIZE_BSSID);
    strncpy(easyCloudContext.service_config_info.productId,
            (char*)PRODUCT_ID, strlen((char*)PRODUCT_ID));
    strncpy(easyCloudContext.service_config_info.productKey,
            (char*)PRODUCT_KEY, strlen((char*)PRODUCT_KEY));
    easyCloudContext.service_config_info.msgRecvhandler = cloudMsgArrivedHandler;
    easyCloudContext.service_config_info.statusNotify = cloudServiceStatusChangedHandler;
    easyCloudContext.service_config_info.context = (void*)inContext;

    // set cloud status
    memset((void*)&(easyCloudContext.service_status), '\0', sizeof(easyCloudContext.service_status));
    easyCloudContext.service_status.isActivated = inContext->appConfig->fogcloudConfig.isActivated;
    strncpy(easyCloudContext.service_status.deviceId,
            inContext->appConfig->fogcloudConfig.deviceId, MAX_SIZE_DEVICE_ID);
    strncpy(easyCloudContext.service_status.masterDeviceKey,
            inContext->appConfig->fogcloudConfig.masterDeviceKey, MAX_SIZE_DEVICE_KEY);
    strncpy(easyCloudContext.service_status.device_name,
            DEFAULT_DEVICE_NAME, MAX_SIZE_DEVICE_NAME);

    cloudServiceLibVersion = FogCloudServiceVersion(&easyCloudContext);
    UNUSED_PARAMETER(cloudServiceLibVersion);
    cloud_if_log("FogCloud library version: %d.%d.%d",
                 (cloudServiceLibVersion & 0x00FF0000) >> 16,
                 (cloudServiceLibVersion & 0x0000FF00) >> 8,
                 (cloudServiceLibVersion & 0x000000FF));

    err = FogCloudServiceInit(&easyCloudContext);
    require_noerr_action( err, exit, cloud_if_log("ERROR: FogCloud service init failed.") );
    return kNoErr;

exit:
    return err;
}
Exemple #24
0
OSStatus fogCloudDevFirmwareUpdate(mico_Context_t* const inContext,
                                            MVDOTARequestData_t devOTARequestData)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;
  ecs_ota_flash_params_t ota_flash_params = {
    MICO_FLASH_FOR_UPDATE,
    UPDATE_START_ADDRESS,
    UPDATE_END_ADDRESS,
    UPDATE_FLASH_SIZE
  };

  cloud_if_log("fogCloudDevFirmwareUpdate: start ...");
  
  // login_id/dev_passwd ok ?
  if((0 != strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.loginId, 
                   devOTARequestData.loginId, 
                   strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.loginId))) ||
     (0 != strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd, 
                   devOTARequestData.devPasswd, 
                   strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd))))
  {
    // devPass err
    cloud_if_log("ERROR: fogCloudDevFirmwareUpdate: loginId/devPasswd mismatch!");
    return kMismatchErr;
  }
  cloud_if_log("fogCloudDevFirmwareUpdate: loginId/devPasswd ok!");
  
  //get latest rom version, file_path, md5
  cloud_if_log("fogCloudDevFirmwareUpdate: get latest rom version from server ...");
  err = FogCloudGetLatestRomVersion(&easyCloudContext);
  if(kNoErr != err){
    if(kNotFoundErr == err){
      cloud_if_log("WARNING: FogCloudGetLatestRomVersion: ROM not found on server!");
      inContext->appStatus.fogcloudStatus.RecvRomFileSize = 0;  // no rom to update
      return kNoErr;
    }
    else{
      cloud_if_log("ERROR: FogCloudGetLatestRomVersion failed! err=%d", err);
      goto exit;
    }
  }

  //FW version compare
  cloud_if_log("currnt_version=%s", inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion);
  cloud_if_log("latestRomVersion=%s", easyCloudContext.service_status.latestRomVersion);
  cloud_if_log("bin_file=%s", easyCloudContext.service_status.bin_file);
  cloud_if_log("bin_md5=%s", easyCloudContext.service_status.bin_md5);
  
  if(0 == strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion,
                  easyCloudContext.service_status.latestRomVersion, 
                  strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion))){
     cloud_if_log("the current firmware version[%s] is up-to-date!", 
                  inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion);
     inContext->appStatus.fogcloudStatus.RecvRomFileSize = 0;
     return kNoErr;
  }
  cloud_if_log("fogCloudDevFirmwareUpdate: new firmware[%s] found on server, downloading ...",
               easyCloudContext.service_status.latestRomVersion);
  
  //get rom data
  err = FogCloudGetRomData(&easyCloudContext, ota_flash_params);
  require_noerr_action( err, exit, 
                       cloud_if_log("ERROR: FogCloudGetRomData failed! err=%d", err) );
  
  //update rom version in flash
  cloud_if_log("fogCloudDevFirmwareUpdate: return rom version && file size.");
  mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex);
  memset(inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion,
         0, MAX_SIZE_FW_VERSION);
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.romVersion,
          easyCloudContext.service_status.latestRomVersion, 
          strlen(easyCloudContext.service_status.latestRomVersion));
  inContext->appStatus.fogcloudStatus.RecvRomFileSize = easyCloudContext.service_status.bin_file_size;
  MICOUpdateConfiguration(inContext);
  mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex);
  
  return kNoErr;
  
exit:
  return err;
}
Exemple #25
0
OSStatus fogCloudDevActivate(mico_Context_t* const inContext,
                                      MVDActivateRequestData_t devActivateRequestData)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;

  cloud_if_log("fogCloudDevActivate: entry");
  cloud_if_log("Device activate...");
  
  // login_id/dev_passwd set(not default value) ?
  if((0 != strncmp((char*)DEFAULT_LOGIN_ID,
                   inContext->flashContentInRam.appConfig.fogcloudConfig.loginId,       
                   strlen((char*)DEFAULT_LOGIN_ID))) ||
     (0 != strncmp((char*)DEFAULT_DEV_PASSWD,
                   inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd,
                   strlen((char*)DEFAULT_DEV_PASSWD))))
  {
    // login_id/dev_passwd ok ?
    if((0 != strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.loginId, 
                     devActivateRequestData.loginId, 
                     strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.loginId))) ||
       (0 != strncmp(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd, 
                     devActivateRequestData.devPasswd, 
                     strlen(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd))))
    {
      // devPass err
      cloud_if_log("ERROR: fogCloudDevActivate: loginId/devPasswd mismatch!");
      return kMismatchErr;
    }
  }
  cloud_if_log("fogCloudDevActivate: loginId/devPasswd ok!");
  
  //ok, set cloud context
  strncpy(easyCloudContext.service_config_info.loginId, 
          devActivateRequestData.loginId, MAX_SIZE_LOGIN_ID);
  cloud_if_log("fogCloudDevActivate: loginId: %s", easyCloudContext.service_config_info.loginId);
  
  strncpy(easyCloudContext.service_config_info.devPasswd, 
          devActivateRequestData.devPasswd, MAX_SIZE_DEV_PASSWD);
  cloud_if_log("fogCloudDevActivate: devPasswd: %s", easyCloudContext.service_config_info.devPasswd);
  
  strncpy(easyCloudContext.service_config_info.userToken, 
          devActivateRequestData.user_token, MAX_SIZE_USER_TOKEN);
  cloud_if_log("fogCloudDevActivate: userToken: %s", easyCloudContext.service_config_info.userToken);
    
  // activate request
  cloud_if_log("fogCloudDevActivate: start FogCloudActivate()");
  err = FogCloudActivate(&easyCloudContext);
  cloud_if_log("fogCloudDevActivate: FogCloudActivate() finished");
  require_noerr_action(err, exit, 
                       cloud_if_log("ERROR: fogCloudDevActivate failed! err=%d", err) );

  inContext->appStatus.fogcloudStatus.isActivated = true;
  cloud_if_log("fogCloudDevActivate: inContext->appStatus.fogcloudStatus.isActivated = true");
  
  // write activate data back to flash
  mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex);
  inContext->flashContentInRam.appConfig.fogcloudConfig.isActivated = true;
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.deviceId,
          easyCloudContext.service_status.deviceId, MAX_SIZE_DEVICE_ID);
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.masterDeviceKey,
          easyCloudContext.service_status.masterDeviceKey, MAX_SIZE_DEVICE_KEY);
  
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.loginId,
          easyCloudContext.service_config_info.loginId, MAX_SIZE_LOGIN_ID);
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd,
          easyCloudContext.service_config_info.devPasswd, MAX_SIZE_DEV_PASSWD);
  strncpy(inContext->flashContentInRam.appConfig.fogcloudConfig.userToken,
          easyCloudContext.service_config_info.userToken, MAX_SIZE_USER_TOKEN);
    
  err = MICOUpdateConfiguration(inContext);
  mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex);
  require_noerr_action(err, exit, 
                       cloud_if_log("ERROR: activate write flash failed! err=%d", err) );
  
  return kNoErr;
  
exit:
  return err;
}
OSStatus fogCloudDevFirmwareUpdate(app_context_t* const inContext,
                                   MVDOTARequestData_t devOTARequestData)
{
    cloud_if_log_trace();
    OSStatus err = kUnknownErr;
    ecs_ota_flash_params_t ota_flash_params =
    {
        MICO_PARTITION_OTA_TEMP,
        0x0,
    };

    md5_context md5;
    unsigned char md5_16[16] = {0};
    char *pmd5_32 = NULL;
    char rom_file_md5[32] = {0};
    uint8_t data[SizePerRW] = {0};
    uint32_t updateStartAddress = 0;
    uint32_t readLength = 0;
    uint32_t i = 0, size = 0;
    uint32_t romStringLen = 0;

    // crc16
    CRC16_Context contex;

    cloud_if_log("fogCloudDevFirmwareUpdate: start ...");

    //get latest rom version, file_path, md5
    cloud_if_log("fogCloudDevFirmwareUpdate: get latest rom version from server ...");
    err = FogCloudGetLatestRomVersion(&easyCloudContext);
    require_noerr_action( err, exit_with_error, cloud_if_log("ERROR: FogCloudGetLatestRomVersion failed! err=%d", err) );

    //FW version compare
    cloud_if_log("currnt_version=%s", inContext->appConfig->fogcloudConfig.romVersion);
    cloud_if_log("latestRomVersion=%s", easyCloudContext.service_status.latestRomVersion);
    cloud_if_log("bin_file=%s", easyCloudContext.service_status.bin_file);
    cloud_if_log("bin_md5=%s", easyCloudContext.service_status.bin_md5);

    romStringLen = strlen(easyCloudContext.service_status.latestRomVersion) > strlen(inContext->appConfig->fogcloudConfig.romVersion) ?
                   strlen(easyCloudContext.service_status.latestRomVersion):strlen(inContext->appConfig->fogcloudConfig.romVersion);
    if(0 == strncmp(inContext->appConfig->fogcloudConfig.romVersion,
                    easyCloudContext.service_status.latestRomVersion,
                    romStringLen))
    {
        cloud_if_log("the current firmware version[%s] is up-to-date!",
                     inContext->appConfig->fogcloudConfig.romVersion);
        inContext->appStatus.fogcloudStatus.RecvRomFileSize = 0;
        err = kNoErr;
        goto exit_with_no_error;
    }
    cloud_if_log("fogCloudDevFirmwareUpdate: new firmware[%s] found on server, downloading ...",
                 easyCloudContext.service_status.latestRomVersion);

    inContext->appStatus.fogcloudStatus.isOTAInProgress = true;
    OTAWillStart(inContext);

    //get rom data
    err = FogCloudGetRomData(&easyCloudContext, ota_flash_params);
    require_noerr_action( err, exit_with_error,
                          cloud_if_log("ERROR: FogCloudGetRomData failed! err=%d", err) );

//------------------------------ OTA DATA VERIFY -----------------------------
    // md5 init
    InitMd5(&md5);
    CRC16_Init( &contex );
    memset(rom_file_md5, 0, 32);
    memset(data, 0xFF, SizePerRW);
    updateStartAddress = ota_flash_params.update_offset;
    size = (easyCloudContext.service_status.bin_file_size)/SizePerRW;

    // read flash, md5 update
    for(i = 0; i <= size; i++)
    {
        if( i == size )
        {
            if( (easyCloudContext.service_status.bin_file_size)%SizePerRW )
            {
                readLength = (easyCloudContext.service_status.bin_file_size)%SizePerRW;
            }
            else
            {
                break;
            }
        }
        else
        {
            readLength = SizePerRW;
        }
        err = MicoFlashRead(ota_flash_params.update_partion, &updateStartAddress, data, readLength);
        require_noerr(err, exit_with_error);
        Md5Update(&md5, (uint8_t *)data, readLength);
        CRC16_Update( &contex, data, readLength );
    }

// read done, calc MD5
    Md5Final(&md5, md5_16);
    CRC16_Final( &contex, &ota_crc );
    pmd5_32 = ECS_DataToHexStringLowercase(md5_16,  sizeof(md5_16));  //convert hex data to hex string
    cloud_if_log("ota_data_in_flash_md5[%d]=%s", strlen(pmd5_32), pmd5_32);

    if (NULL != pmd5_32)
    {
        strncpy(rom_file_md5, pmd5_32, strlen(pmd5_32));
        free(pmd5_32);
        pmd5_32 = NULL;
    }
    else
    {
        err = kNoMemoryErr;
        goto exit_with_error;
    }

    // check md5
    if(0 != strncmp( easyCloudContext.service_status.bin_md5, (char*)&(rom_file_md5[0]),
                     strlen( easyCloudContext.service_status.bin_md5)))
    {
        cloud_if_log("ERROR: ota data wrote in flash md5 checksum err!!!");
        err = kChecksumErr;
        goto exit_with_error;
    }
    else
    {
        cloud_if_log("OTA data in flash md5 check success, crc16=%d.", ota_crc);
    }
    //----------------------------------------------------------------------------

    //update rom version in flash
    cloud_if_log("fogCloudDevFirmwareUpdate: return rom version && file size.");
    mico_rtos_lock_mutex(&inContext->mico_context->flashContentInRam_mutex);
    memset(inContext->appConfig->fogcloudConfig.romVersion,
           0, MAX_SIZE_FW_VERSION);
    strncpy(inContext->appConfig->fogcloudConfig.romVersion,
            easyCloudContext.service_status.latestRomVersion,
            strlen(easyCloudContext.service_status.latestRomVersion));
    inContext->appStatus.fogcloudStatus.RecvRomFileSize = easyCloudContext.service_status.bin_file_size;
    err = mico_system_context_update(inContext->mico_context);
    mico_rtos_unlock_mutex(&inContext->mico_context->flashContentInRam_mutex);

    OTASuccess(inContext);
    err = kNoErr;
    goto exit_with_no_error;

exit_with_no_error:
    cloud_if_log("fogCloudDevFirmwareUpdate exit with no error.");
    inContext->appStatus.fogcloudStatus.isOTAInProgress = false;
    return err;

exit_with_error:
    cloud_if_log("fogCloudDevFirmwareUpdate exit with err=%d.", err);
    OTAFailed(inContext);
    inContext->appStatus.fogcloudStatus.isOTAInProgress = false;
    return err;
}
OSStatus MVDCloudInterfaceDevFirmwareUpdate(mico_Context_t* const inContext,
                                            MVDOTARequestData_t devOTARequestData)
{
  cloud_if_log_trace();
  OSStatus err = kUnknownErr;

  cloud_if_log("MVDCloudInterfaceDevFirmwareUpdate: start ...");
  
  // login_id/dev_passwd ok ?
  if((0 != strncmp(inContext->flashContentInRam.appConfig.virtualDevConfig.loginId, 
                   devOTARequestData.loginId, 
                   strlen(inContext->flashContentInRam.appConfig.virtualDevConfig.loginId))) ||
     (0 != strncmp(inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd, 
                   devOTARequestData.devPasswd, 
                   strlen(inContext->flashContentInRam.appConfig.virtualDevConfig.devPasswd))))
  {
    // devPass err
    cloud_if_log("ERROR: MVDCloudInterfaceDevFirmwareUpdate: loginId/devPasswd mismatch!");
    return kMismatchErr;
  }
  cloud_if_log("MVDCloudInterfaceDevFirmwareUpdate: loginId/devPasswd ok!");
  
  //get latest rom version, file_path, md5
  cloud_if_log("MVDCloudInterfaceDevFirmwareUpdate: get latest rom version from server ...");
  err = EasyCloudGetLatestRomVersion(&easyCloudContext);
  require_noerr_action( err, exit, cloud_if_log("ERROR: EasyCloudGetLatestRomVersion failed! err=%d", err) );
  
  //FW version compare
  cloud_if_log("currnt_version=%s", inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion);
  cloud_if_log("latestRomVersion=%s", easyCloudContext.service_status.latestRomVersion);
  cloud_if_log("bin_file=%s", easyCloudContext.service_status.bin_file);
  cloud_if_log("bin_md5=%s", easyCloudContext.service_status.bin_md5);
  
  if(0 == strncmp(inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion,
                  easyCloudContext.service_status.latestRomVersion, 
                  strlen(inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion))){
     cloud_if_log("the current firmware version[%s] is up-to-date!", 
                  inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion);
     inContext->appStatus.virtualDevStatus.RecvRomFileSize = 0;
     return kNoErr;
  }
  cloud_if_log("MVDCloudInterfaceDevFirmwareUpdate: new firmware[%s] found on server, downloading ...",
               easyCloudContext.service_status.latestRomVersion);
  
  //get rom data
  err = EasyCloudGetRomData(&easyCloudContext);
  require_noerr_action( err, exit, 
                       cloud_if_log("ERROR: EasyCloudGetRomData failed! err=%d", err) );
  
  //update rom version in flash
  cloud_if_log("MVDCloudInterfaceDevFirmwareUpdate: return rom version && file size.");
  mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex);
  memset(inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion,
         0, MAX_SIZE_FW_VERSION);
  strncpy(inContext->flashContentInRam.appConfig.virtualDevConfig.romVersion,
          easyCloudContext.service_status.latestRomVersion, 
          strlen(easyCloudContext.service_status.latestRomVersion));
  inContext->appStatus.virtualDevStatus.RecvRomFileSize = easyCloudContext.service_status.bin_file_size;
  MICOUpdateConfiguration(inContext);
  mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex);
  
  return kNoErr;
  
exit:
  return err;
}