/* MICO system callback: Restore default configuration provided by application */ void appRestoreDefault_callback(mico_Context_t *mico_context) { mico_context->flashContentInRam.appConfig.configDataVer = CONFIGURATION_VERSION; mico_context->flashContentInRam.appConfig.bonjourServicePort = BONJOUR_SERVICE_PORT; // restore fogcloud config MicoFogCloudRestoreDefault(mico_context); // restore user config userRestoreDefault_callback(mico_context); }
void fogcloud_main_thread(void *arg) { OSStatus err = kUnknownErr; mico_Context_t *inContext = (mico_Context_t *)arg; MVDResetRequestData_t devResetRequestData; #ifdef ENABLE_FOGCLOUD_AUTO_ACTIVATE MVDActivateRequestData_t devDefaultActivateData; #endif /* wait for station on */ while(!inContext->appStatus.isWifiConnected){ mico_thread_msleep(500); } //--- create msg recv queue, NOTE: just push msg pionter into queue, so msg memory must be freed after used. if(NULL == msg_recv_queue_mutex){ err = mico_rtos_init_mutex(&msg_recv_queue_mutex); require_noerr_action(err, exit, fogcloud_log("ERROR: mico_rtos_init_mutex (msg_recv_queue_mutex) failed, err=%d.", err)); } err = mico_rtos_init_queue(&msg_recv_queue, "fog_recv_queue", sizeof(int), FOGCLOUD_MAX_RECV_QUEUE_LENGTH); require_noerr_action(err, exit, fogcloud_log("ERROR: mico_rtos_init_queue (msg_recv_queue) failed, err=%d", err)); /* start FogCloud service */ err = fogCloudStart(inContext); require_noerr_action(err, exit, fogcloud_log("ERROR: MicoFogCloudCloudInterfaceStart failed!") ); /* start configServer for fogcloud (server for activate/authorize/reset/ota cmd from user APP) */ if(false == inContext->flashContentInRam.appConfig.fogcloudConfig.owner_binding){ err = MicoStartFogCloudConfigServer( inContext); require_noerr_action(err, exit, fogcloud_log("ERROR: start FogCloud configServer failed!") ); } #ifdef ENABLE_FOGCLOUD_AUTO_ACTIVATE /* activate when wifi on */ while(false == inContext->flashContentInRam.appConfig.fogcloudConfig.isActivated){ // auto activate, using default login_id/dev_pass/user_token fogcloud_log("device activate start..."); memset((void*)&devDefaultActivateData, 0, sizeof(devDefaultActivateData)); strncpy(devDefaultActivateData.loginId, inContext->flashContentInRam.appConfig.fogcloudConfig.loginId, MAX_SIZE_LOGIN_ID); strncpy(devDefaultActivateData.devPasswd, inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd, MAX_SIZE_DEV_PASSWD); strncpy(devDefaultActivateData.user_token, inContext->micoStatus.mac, // use MAC as default user_token MAX_SIZE_USER_TOKEN); err = fogCloudDevActivate(inContext, devDefaultActivateData); if(kNoErr == err){ fogcloud_log("device activate success!"); break; } else{ fogcloud_log("device auto activate failed, err = %d, will retry in 3s ...", err); } mico_thread_sleep(3); } #endif // ENABLE_FOGCLOUD_AUTO_ACTIVATE #ifndef DISABLE_FOGCLOUD_OTA_CHECK /* OTA check just device activated */ if( (!inContext->appStatus.noOTACheckOnSystemStart) && (inContext->flashContentInRam.appConfig.fogcloudConfig.isActivated) ){ // start ota thread err = mico_rtos_create_thread(NULL, MICO_APPLICATION_PRIORITY, "fogcloud_ota", fogcloud_ota_thread, STACK_SIZE_FOGCLOUD_OTA_THREAD, inContext); if(kNoErr != err){ fogcloud_log("ERROR: start FogCloud OTA thread failed, err=%d.", err); } } inContext->appStatus.noOTACheckOnSystemStart = false; #endif // DISABLE_FOGCLOUD_OTA_CHECK while(1){ // device info reset if(device_need_delete){ fogcloud_log("delete device from cloud ..."); memset((void*)&devResetRequestData, 0, sizeof(devResetRequestData)); strncpy(devResetRequestData.loginId, inContext->flashContentInRam.appConfig.fogcloudConfig.loginId, MAX_SIZE_LOGIN_ID); strncpy(devResetRequestData.devPasswd, inContext->flashContentInRam.appConfig.fogcloudConfig.devPasswd, MAX_SIZE_DEV_PASSWD); strncpy(devResetRequestData.user_token, inContext->flashContentInRam.appConfig.fogcloudConfig.userToken, MAX_SIZE_USER_TOKEN); err = fogCloudResetCloudDevInfo(inContext, devResetRequestData); if(kNoErr == err){ device_need_delete = false; fogcloud_log("delete device success, system need reboot..."); mico_rtos_lock_mutex(&inContext->flashContentInRam_mutex); MicoFogCloudRestoreDefault(inContext); MICOUpdateConfiguration(inContext); mico_rtos_unlock_mutex(&inContext->flashContentInRam_mutex); // system restart inContext->micoStatus.sys_state = eState_Software_Reset; if(inContext->micoStatus.sys_state_change_sem){ mico_rtos_set_semaphore(&inContext->micoStatus.sys_state_change_sem); } } else{ fogcloud_log("delete device failed, err = %d.", err); } } mico_thread_sleep(1); if(inContext->appStatus.fogcloudStatus.isOTAInProgress){ continue; // ota is in progress, the oled && system led will be holding } if(inContext->appStatus.fogcloudStatus.isCloudConnected){ set_RF_LED_cloud_connected(inContext); // toggle LED } else{ set_RF_LED_cloud_disconnected(inContext); // stop LED blink } } exit: fogcloud_log("fogcloud_main_thread exit err=%d.", err); if(NULL != msg_recv_queue_mutex){ mico_rtos_deinit_mutex(&msg_recv_queue_mutex); } if(NULL != msg_recv_queue){ mico_rtos_deinit_queue(&msg_recv_queue); } mico_rtos_delete_thread(NULL); return; }