void Controller::init_fsm(FiniteStateMachine fsm) { fsm_add_state(fsm, "start-requested"); fsm_add_state(fsm, "started"); fsm_add_state(fsm, "exit-requested"); fsm_add_state(fsm, "stop-requested"); fsm_add_state(fsm, "retry"); fsm_add_state(fsm, "exit"); READY_TO_START_REQUESTED = fsm_link_states(fsm, "start-btn-clicked", "ready", "start-requested"); START_REQUESTED_TO_STARTED = fsm_link_states(fsm, "everything-started", "start-requested", "started"); STARTED_TO_EXIT_REQUESTED = fsm_link_states(fsm, "exit-btn-clicked", "started", "exit-requested"); STARTED_TO_STARTED = fsm_link_states(fsm, "new-image", "started", "started"); START_REQUESTED_TO_EXIT_REQUESTED = fsm_link_states(fsm, "exit-btn-clicked", "start-requested", "exit-requested"); START_REQUESTED_TO_STOP_REQUESTED = fsm_link_states(fsm, "failed", "start-requested", "stop-requested"); STARTED_TO_RETRY = fsm_link_states(fsm, "failed", "started", "retry"); RETRY_TO_RETRY = fsm_link_states(fsm, "everything-stopped", "retry", "retry"); RETRY_TO_START_REQUESTED = fsm_link_states(fsm, "start-btn-clicked", "retry", "start-requested"); RETRY_TO_EXIT_REQUESTED = fsm_link_states(fsm, "exit-btn-clicked", "retry", "exit-requested"); RETRY_TO_STOP_REQUESTED = fsm_link_states(fsm, "stop-btn-clicked", "retry", "stop-requested"); STARTED_TO_STOP_REQUESTED = fsm_link_states(fsm, "stop-btn-clicked", "started", "stop-requested"); STOP_REQUESTED_TO_READY = fsm_link_states(fsm, "everything-stopped", "stop-requested", "ready"); STOP_REQUESTED_TO_EXIT_REQUESTED = fsm_link_states(fsm, "exit-btn-clicked", "stop-requested", "exit-requested"); EXIT_REQUESTED_TO_EXIT = fsm_link_states(fsm, "everything-stopped", "exit-requested", "exit"); READY_TO_EXIT = fsm_link_states(fsm, "exit-btn-clicked", "ready", "exit"); mainWindow->stateReport(strdup(fsm_get_current_state_name(fsm))); }
/** * Returns the current state name */ char *communication_get_state_name(Context *ctx) { // thread-safe block - start communication_lock(ctx); char *ret = fsm_get_current_state_name(ctx->fsm); communication_unlock(ctx); // thread-safe block - end return ret; }
/** * Process the incoming APDU calling to proper procedure. * This method locks the communication layer thread. * * @param ctx current context * @param apdu APDU */ void communication_process_apdu(Context *ctx, APDU *apdu) { // thread-safe block - start communication_lock(ctx); DEBUG(" communication: current sm(%s) ", fsm_get_current_state_name(ctx->fsm)); if (ctx->type & AGENT_CONTEXT) { communication_process_apdu_agent(ctx, apdu); } else { communication_process_apdu_manager(ctx, apdu); } communication_unlock(ctx); // thread-safe block - end }