Exemple #1
0
    void run()
    {
        input->poll_input();

        if(circuit && !settings.pause)
        {
            circuit->run(2.5e-3 / Circuit::timescale); // Run 2.5 ms
            //circuit->run(100.0e-6 / Circuit::timescale); // Run 100 us

            uint64_t emu_time = circuit->global_time * 1000000.0 * Circuit::timescale;
            
            // Make sure real time is at least mostly caught up
            if(settings.throttle)
                while(circuit->rtc.get_usecs() + 50000 < emu_time);

            // If real time is too far ahead, adjust timer
            if(circuit->rtc.get_usecs() > emu_time + 100000)
                circuit->rtc += (circuit->rtc.get_usecs() - emu_time - 100000);

            if(real_time.get_usecs() > 1000000)
            {
                setStatusText({"FPS: ", circuit->video.frame_count});
                circuit->video.frame_count = 0;
                real_time += 1000000;
            }

            //if(emu_time > 1.56e6) onClose();
        }
        else
        {
            SDL_Delay(10);
            if(settings.pause && statusText() != "Paused") setStatusText("Paused");
            else if(!settings.pause && statusText() != VERSION_STRING) setStatusText(VERSION_STRING);
            if(circuit == nullptr && (focused() || video_window.focused())) drawLogo();
        }

        if(input_window.active_selector)
        {
            auto key_state = Keyboard::state();
    
            for(unsigned i = 0; i < key_state.size(); i++)
                if(key_state[i]) input_window.active_selector->assign({KeyAssignment::KEYBOARD, i});

            //Check Joystick Events
            SDL_Event event;
            while(SDL_PollEvent(&event))
            {
                switch(event.type)
                {   
                    case SDL_JOYBUTTONDOWN:
                        input_window.active_selector->assign({KeyAssignment::JOYSTICK_BUTTON, event.jbutton.button, event.jbutton.which});
                        break;
                    case SDL_JOYAXISMOTION:
                        if(!input_window.active_selector->allow_joystick) break;
                        if(abs(event.jaxis.value) > 8192)
                        {
                            unsigned axis = (event.jaxis.axis << 1) | (event.jaxis.value > 0);
                            input_window.active_selector->assign({KeyAssignment::JOYSTICK_AXIS, axis, event.jaxis.which});
                        }
                    default:
                        break;
                }
            }
        }
        else // Handle user interface inputs
        {            
            UserInterfaceState ui_state = UserInterfaceState::getCurrent(*this);

            // Don't update ui inputs while main window is in the background
            if(focused())
            {            
                if(ui_state.quit && !prev_ui_state.quit)
                {
                    onClose();
                }
                if(ui_state.pause && !prev_ui_state.pause)
                {
                    settings.pause = !settings.pause;
                    pause_item.setChecked(settings.pause);
                }
                if(ui_state.fullscreen && !prev_ui_state.fullscreen)
                {
                    fullscreen_item.setChecked(!settings.fullscreen);
                    fullscreen_item.onToggle();
                }
                if(ui_state.throttle && !prev_ui_state.throttle)
                {
                    throttle_item.setChecked(!settings.throttle);
                    throttle_item.onToggle();
                }
            }

            prev_ui_state = ui_state;
        }
    }