// this should only be called at the end of the game's main loop. void FiniteStateMachine::change_state() { if (nextStateID != STATE_NULL) { delete currentState; // get_new_state should be overriden by a subclass and // return a pointer to a new GameState currentState = get_new_state(nextStateID); currentStateID = nextStateID; nextStateID = STATE_NULL; } }
// detect a pulse, respond to it and count number of pulses. // statsCurrent holds parameters. uint64_t Responder::detect_respond_pulse_count(STATS &statsCurrent, std::vector<std::complex<float> > &buff, uint64_t trigger_count, size_t num_rx_samps, float threshold, uhd::time_spec_t rx_time) { // buff, threshold bool input_state = false; for (size_t n = 0; n < num_rx_samps; n++) { float f = buff[n].real() * _opt.invert; bool new_state = get_new_state(_num_total_samps + n, _simulate_duration, f, threshold); if ((new_state == false) && (input_state)) // == falling_edge { trigger_count++; statsCurrent.detected++; if ((_opt.test_iterations > 0) && (_opt.skip_iterations > 0) && (statsCurrent.skipped == 0) && (_opt.skip_iterations == statsCurrent.detected)) { memset(&statsCurrent, 0x00, sizeof(STATS)); statsCurrent.delay = _delay; statsCurrent.detected = 1; statsCurrent.skipped = _opt.skip_iterations; trigger_count = 1; } if( !send_tx_burst(rx_time, n) ) { statsCurrent.missed++; } if(tx_burst_is_late() ) { statsCurrent.missed++; } } input_state = new_state; } return trigger_count; }
void telnet_config_event_handler(chanend c_xtcp, chanend c_uart_config, chanend c_flash_data, xtcp_connection_t *conn) { switch (conn->event) { case XTCP_IFUP: case XTCP_IFDOWN: case XTCP_ALREADY_HANDLED: return; default: break; } if (conn->local_port == S2E_TELNET_CONFIG_PORT) { connection_state_t *st = get_state_from_connection(conn); int close_request; int len; switch (conn->event) { case XTCP_NEW_CONNECTION: st = get_new_state(); if (!st) { xtcp_abort(c_xtcp, conn); break; } st->sending_welcome = 1; st->sending_ack = 0; st->err = NULL; st->conn_id = conn->id; init_telnet_parse_state(&st->telnet_parsing_state); reset_parsing_state(st); xtcp_init_send(c_xtcp, conn); break; case XTCP_RECV_DATA: len = xtcp_recv(c_xtcp, buf); if (!st || !st->active) break; len = parse_telnet_buffer(buf, len, &st->telnet_parsing_state, &close_request); parse_config(c_xtcp, c_uart_config, c_flash_data, conn, buf, len, st); if (close_request) xtcp_close(c_xtcp, conn); break; case XTCP_REQUEST_DATA: case XTCP_RESEND_DATA: if (!st || !st->active) { xtcp_complete_send(c_xtcp); break; } // When sending either st->sending_welcome is true, // st->sending_ack is true or st->err is non null. Depending on // whether the connection is sending a welcome message, ack or // error message if (st->sending_welcome) { xtcp_send(c_xtcp, welcome_msg, sizeof(welcome_msg)); } else if (st->sending_ack) { int len = construct_ack(st, buf); xtcp_send(c_xtcp, buf, len); } else if (st->err) { int len = strlen(st->err); strcpy(buf, st->err); buf[len] = '\n'; xtcp_send(c_xtcp, buf, len+1); } else { xtcp_complete_send(c_xtcp); } break; case XTCP_SENT_DATA: xtcp_complete_send(c_xtcp); if (st) { st->sending_ack = 0; st->sending_welcome = 0; st->err = NULL; } break; case XTCP_CLOSED: case XTCP_ABORTED: case XTCP_TIMED_OUT: if (st) { st->active = 0; } break; default: break; } conn->event = XTCP_ALREADY_HANDLED; } }