void home_task(void) { task_open(); current_menu_item = 1; current_tid = 0; while(1) { if( current_tid == 0) { clearBuff(); setxy(2,4); xprint("%s\n0x%04X",mainMenu[current_menu_item].name,mainMenu[current_menu_item].task ); lcd_xmit(); } event_wait( buttonEvent ); char button_state = button_get_pressed(); if(current_tid == 0) { if(( button_state & BUTTON_DOWN )&&( current_menu_item > 0 )) { current_menu_item--; // antmation? } else if(( button_state & BUTTON_UP )&&( current_menu_item < N_MENU -1 )) { current_menu_item++; } else if(( button_state & BUTTON_SELECT )) // no task running { // call up a new task task_create( mainMenu[current_menu_item].task, 10, 0, 0, 0 ); // should be a lower priority than this task // store tid current_tid = 1;//task_id_get( mainMenu[current_menu_item].task ); } } else { if(( button_state & BUTTON_MENU )) { task_kill( mainMenu[current_menu_item].task ); current_tid = 0; } } task_wait(10); //P2OUT ^= BIT3; } task_close(); }
/** Fibril for each accepted socket. * * @param arg Corresponding @c telnet_user_t structure. */ static int network_user_fibril(void *arg) { telnet_user_t *user = arg; int rc = loc_service_register(user->service_name, &user->service_id); if (rc != EOK) { telnet_user_error(user, "Unable to register %s with loc: %s.", user->service_name, str_error(rc)); return EOK; } telnet_user_log(user, "Service %s registerd with id %" PRIun ".", user->service_name, user->service_id); fid_t spawn_fibril = fibril_create(spawn_task_fibril, user); assert(spawn_fibril); fibril_add_ready(spawn_fibril); /* Wait for all clients to exit. */ fibril_mutex_lock(&user->guard); while (!user_can_be_destroyed_no_lock(user)) { if (user->task_finished) { closesocket(user->socket); user->socket_closed = true; user->srvs.aborted = true; continue; } else if (user->socket_closed) { if (user->task_id != 0) { task_kill(user->task_id); } } fibril_condvar_wait_timeout(&user->refcount_cv, &user->guard, 1000); } fibril_mutex_unlock(&user->guard); rc = loc_service_unregister(user->service_id); if (rc != EOK) { telnet_user_error(user, "Unable to unregister %s from loc: %s (ignored).", user->service_name, str_error(rc)); } telnet_user_log(user, "Destroying..."); telnet_user_destroy(user); return EOK; }
/* Every task that returns will end up here: */ void task_return_grave(void) { IRQ_OFF(); /* Prevent switch context as soon as possible, so we don't lose 'current_task's address */ irq_already_off = 1; /* This prevents IRQ_OFF to run twice */ task_kill(current_task->pid); /* Commit suicide */ for(;;); /* Never return. Remember that this 'for' won't be actually running, we just don't want to run 'ret' */ }