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; }
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; }
/** * * * @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; }
/** * * * @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()); }