int socket_queue_delete(app_context_t * const inContext, mico_queue_t *queue) { int i; socket_msg_t *msg; int ret = -1; mico_rtos_lock_mutex(&inContext->appStatus.queue_mtx); // remove queue for(i=0; i < MAX_QUEUE_NUM; i++) { if (queue == inContext->appStatus.socket_out_queue[i]) { inContext->appStatus.socket_out_queue[i] = NULL; ret = 0; } } mico_rtos_unlock_mutex(&inContext->appStatus.queue_mtx); // free queue buffer while(kNoErr == mico_rtos_pop_from_queue( queue, &msg, 0)) { socket_msg_free(msg); } // deinit queue mico_rtos_deinit_queue(queue); return ret; }
OSStatus mico_rtos_delete_worker_thread( mico_worker_thread_t* worker_thread ) { if ( mico_rtos_delete_thread( &worker_thread->thread ) != kNoErr ) { return kGeneralErr; } if ( mico_rtos_deinit_queue( &worker_thread->event_queue ) != kNoErr ) { return kGeneralErr; } return kNoErr; }
OSStatus mico_rtos_create_worker_thread( mico_worker_thread_t* worker_thread, uint8_t priority, uint32_t stack_size, uint32_t event_queue_size ) { memset( worker_thread, 0, sizeof( *worker_thread ) ); if ( mico_rtos_init_queue( &worker_thread->event_queue, "worker queue", sizeof(mico_event_message_t), event_queue_size ) != kNoErr ) { return kGeneralErr; } if ( mico_rtos_create_thread( &worker_thread->thread, priority , "worker thread", worker_thread_main, stack_size, (mico_thread_arg_t) worker_thread ) != kNoErr ) { mico_rtos_deinit_queue( &worker_thread->event_queue ); return kGeneralErr; } return kNoErr; }
int socket_queue_create(app_context_t * const inContext, mico_queue_t *queue) { OSStatus err; int i; mico_queue_t *p_queue; err = mico_rtos_init_queue(queue, "sockqueue", sizeof(int), MAX_QUEUE_LENGTH); if (err != kNoErr) return -1; mico_rtos_lock_mutex(&inContext->appStatus.queue_mtx); for(i=0; i < MAX_QUEUE_NUM; i++) { p_queue = inContext->appStatus.socket_out_queue[i]; if(p_queue == NULL ){ inContext->appStatus.socket_out_queue[i] = queue; mico_rtos_unlock_mutex(&inContext->appStatus.queue_mtx); return 0; } } mico_rtos_unlock_mutex(&inContext->appStatus.queue_mtx); mico_rtos_deinit_queue(queue); return -1; }
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; }