Exemplo n.º 1
0
void CUCode_AX::HandleMail(u32 mail)
{
	// Indicates if the next message is a command list address.
	static bool next_is_cmdlist = false;
	static u16 cmdlist_size = 0;

	bool set_next_is_cmdlist = false;

	// Wait for DSP processing to be done before answering any mail. This is
	// safe to do because it matches what the DSP does on real hardware: there
	// is no interrupt when a mail from CPU is received.
	m_processing.lock();

	if (next_is_cmdlist)
	{
		CopyCmdList(mail, cmdlist_size);
		StartWorking();
		NotifyAXThread();
	}
	else if (m_UploadSetupInProgress)
	{
		PrepareBootUCode(mail);
	}
	else if (mail == MAIL_RESUME)
	{
		// Acknowledge the resume request
		m_rMailHandler.PushMail(DSP_RESUME);
		DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP);
	}
	else if (mail == MAIL_NEW_UCODE)
	{
		soundStream->GetMixer()->SetHLEReady(false);
		m_UploadSetupInProgress = true;
	}
	else if (mail == MAIL_RESET)
	{
		m_DSPHLE->SetUCode(UCODE_ROM);
	}
	else if (mail == MAIL_CONTINUE)
	{
		// We don't have to do anything here - the CPU does not wait for a ACK
		// and sends a cmdlist mail just after.
	}
	else if ((mail & MAIL_CMDLIST_MASK) == MAIL_CMDLIST)
	{
		// A command list address is going to be sent next.
		set_next_is_cmdlist = true;
		cmdlist_size = (u16)(mail & ~MAIL_CMDLIST_MASK);
	}
	else
	{
		ERROR_LOG(DSPHLE, "Unknown mail sent to AX::HandleMail: %08x", mail);
	}

	m_processing.unlock();
	next_is_cmdlist = set_next_is_cmdlist;
}
Exemplo n.º 2
0
LRESULT CAppWindow::OnLoginStateChanged(WAVE_CONNECTION_STATE nStatus, WAVE_LOGIN_ERROR nError)
{
	CHECK_ENUM(nStatus, WCS_MAX);
	CHECK_ENUM(nError, WLE_MAX);

	if (!AllowContextMenu())
	{
		EndMenu();
	}

	switch (nStatus)
	{
	case WCS_BEGIN_LOGON:
	case WCS_BEGIN_SIGNOUT:
		StartWorking();
		break;

	case WCS_LOGGED_ON:
		StopWorking();
		ProcessLoggedOn();
		break;

	case WCS_RECONNECTING:
		StartWorking();
		ProcessReconnecting();
		break;

	case WCS_CONNECTED:
		StopWorking();
		ProcessConnected();
		break;

	case WCS_FAILED:
		StopWorking();
		break;

	case WCS_SIGNED_OUT:
		StopWorking();
		ProcessSignedOut();
		break;
	}

	return 0;
}
Exemplo n.º 3
0
/**
 *
 *
 *  @author OLiver
 */
bool nofCarrier::AddWareJob(const noRoadNode* rn)
{
    // Wenn wir rumstehen, sollten wir mal loslaufen! ^^und ggf umdrehen, genauso wie beim Laufen in die Mitte
    if(state == CARRS_WAITFORWARE || state == CARRS_GOTOMIDDLEOFROAD)
    {
        // Stimmt die Richtung nicht? Dann umdrehen (geht aber nur, wenn wir stehen!)
        if(rs_dir == workplace->GetNodeID(rn) && state == CARRS_WAITFORWARE)
        {
            rs_dir = !rs_dir;
            // wenn wir zur Mitte laufen, müssen noch 2 von der pos abgezogen werden wegen dem Laufen
            rs_pos = cur_rs->GetLength() - rs_pos - ((state == CARRS_GOTOMIDDLEOFROAD) ? 2 : 0);
        }
        // beim Gehen in die Mitte nicht sofort umdrehen!
        else if(rs_dir == workplace->GetNodeID(rn))
            return false;

        // Und loslaufen, wenn wir stehen
        if(state == CARRS_WAITFORWARE)
        {
            StartWalking(cur_rs->GetDir(rs_dir, rs_pos));
            // Endlich wird wieder ordentlich gearbeitet!
            StartWorking();
        }


        state = CARRS_FETCHWARE;

        // Wir übernehmen den Job
        return true;
    }
    else if(state == CARRS_WAITFORWARESPACE && rs_dir == !workplace->GetNodeID(rn))
    {
        // Wenn wir auf einen freien Platz warten, können wir nun losgehen, da wir ja die Waren dann "tauschen" können
        StartWalking(cur_rs->GetDir(rs_dir, rs_pos));
        state = CARRS_CARRYWARE;

        // Wir übernehmen den Job
        return true;
    }

    // Wir übernehmen den Job nicht
    return false;

}
Exemplo n.º 4
0
/**
 *
 *
 *  @author OLiver
 */
void nofCarrier::GoalReached()
{
    // Erstes Produktivitätsevent anmelden
    productivity_ev = em->AddEvent(this, PRODUCTIVITY_GF, 1);
    // Wir arbeiten schonmal
    StartWorking();

    noRoadNode* rn = gwg->GetSpecObj<noRoadNode>(pos);
    for(unsigned char i = 0; i < 6; ++i)
    {
        //noRoadNode * rn = gwg->GetSpecObj<noRoadNode>(x,y);
        if(rn->routes[i] == workplace)
        {
            // Am neuen Arbeitsplatz angekommen
            StartWalking(i);
            cur_rs = workplace;
            rs_pos = 0;
            rs_dir = (rn == cur_rs->GetF1()) ? false : true;

            state = CARRS_GOTOMIDDLEOFROAD;

            // Wenn hier schon Waren liegen, diese gleich transportieren
            if(workplace->AreWareJobs(rs_dir, ct, true))
            {
                // Ware aufnehmen
                carried_ware = static_cast<noFlag*>(rn)->SelectWare(GetCurMoveDir(), false, this);

                if(carried_ware)
                {
                    carried_ware->Carry( (rs_dir ? workplace->GetF1() : workplace->GetF2()) );
                    state = CARRS_CARRYWARE;
                }
            }
            // wenn was an der gegenüberliegenden Flaggge liegt, ebenfalls holen
            else if(workplace->AreWareJobs(!rs_dir, ct, false))
                state = CARRS_FETCHWARE;
            return;
        }
    }

    LOG.lprintf("nofCarrier::GoalReached: ERROR: Road of carrier (id: %u) not found!\n", GetObjId());
}