static void TransferThread(void *arg) { while(1) { WaitClearEvent(vblankData.eventflag, EF_VB_TRANSFER, WEF_AND|WEF_CLEAR, NULL); pdTransfer(); SetEventFlag(vblankData.eventflag, EF_VB_TRANSFER_DONE); } }
void TransferThread(void *arg) { while(1) { WaitClearEvent(vblankData.eventflag, EF_VB_TRANSFER, 0x10, 0); pdTransfer(); SetEventFlag(vblankData.eventflag, EF_VB_TRANSFER_DONE); } }
static void MainThread(void *arg) { while(1) { u32 port, slot; mainThreadCount++; if( mainThreadCount % 30 == 0 ) sio2_mtap_update_slots(); for(port=0; port < 2; port++) { for(slot=0; slot < 4; slot++) { if( ((openSlots[port] >> slot) & 0x1) == 1) { pdSetActive(port, slot, 0); padState[port][slot].stat70bit = pdGetStat70bit(port, slot); if(padState[port][slot].runTask != TASK_NONE) { if(padState[port][slot].runTask == TASK_PORT_CLOSE) { padState[port][slot].currentTask = padState[port][slot].runTask; padState[port][slot].runTask = TASK_NONE; padState[port][slot].reqState = PAD_RSTAT_BUSY; SetEventFlag(padState[port][slot].eventflag, EF_EXIT_THREAD); } else { if(padState[port][slot].currentTask == TASK_UPDATE_PAD) { // Start Task StartThread(padState[port][slot].taskTid, NULL); padState[port][slot].currentTask = padState[port][slot].runTask; padState[port][slot].runTask = TASK_NONE; padState[port][slot].reqState = PAD_RSTAT_BUSY; } else { padState[port][slot].runTask = TASK_NONE; padState[port][slot].reqState = PAD_RSTAT_FAILED; } } } } switch(padState[port][slot].currentTask) { case TASK_UPDATE_PAD: { SetEventFlag(padState[port][slot].eventflag, EF_UPDATE_PAD); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; case TASK_QUERY_PAD: { padState[port][slot].buttonDataReady = 0; SetEventFlag(padState[port][slot].eventflag, EF_QUERY_PAD); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; case TASK_PORT_CLOSE: { if(GetThreadsStatus( &padState[port][slot] ) == 1) { padState[port][slot].currentTask = TASK_NONE; padState[port][slot].reqState = PAD_RSTAT_COMPLETE; openSlots[port] ^= (1 << slot); DeleteThreads( &padState[port][slot] ); SetEventFlag(padState[port][slot].eventflag, EF_PORT_CLOSE); } } break; case TASK_SET_MAIN_MODE: { padState[port][slot].buttonDataReady = 0; SetEventFlag(padState[port][slot].eventflag, EF_SET_MAIN_MODE); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; case TASK_SET_ACT_ALIGN: { padState[port][slot].buttonDataReady = 0; SetEventFlag(padState[port][slot].eventflag, EF_SET_ACT_ALIGN); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; case TASK_SET_BUTTON_INFO: { padState[port][slot].buttonDataReady = 0; SetEventFlag(padState[port][slot].eventflag, EF_SET_SET_BUTTON_INFO); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; case TASK_SET_VREF_PARAM: { padState[port][slot].buttonDataReady = 0; SetEventFlag(padState[port][slot].eventflag, EF_SET_VREF_PARAM); WaitEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_START, 0x10, 0); pdSetActive(port, slot, 1); } break; } } } // Transfer is started in VblankStart vblankData.stopTransfer = 0; WaitClearEvent(vblankData.eventflag, EF_VB_TRANSFER_DONE, WEF_AND|WEF_CLEAR, NULL); if( (openSlots[0] != 0) || (openSlots[1] != 0)) { for(port=0; port < 2; port++) { for(slot=0; slot < 4; slot++) { if(pdIsActive(port, slot) == 1) { /* Signal transfer done and wait to task (reading sio2 data) to be done. */ SetEventFlag(padState[port][slot].eventflag, EF_PAD_TRANSFER_DONE); WaitEventFlag(padState[port][slot].eventflag, EF_TASK_DONE, 0x10, 0); } } } } // Send pad data to EE DmaSendEE(); mainThreadCount2++; // s7 // Check for disconnected controllers if(mainThreadCount2 >= 8) { if(mainThreadCount % 30 != 0) { if( pdIsActive(pad_port, pad_slot) == 1) { if( padState[pad_port][pad_slot].state == PAD_STATE_DISCONN) pad_portdata[pad_port] &= ~(1 << pad_slot); // clear slot else pad_portdata[pad_port] |= (1 << pad_slot); // set slot } else { if( pdCheckConnection(pad_port, pad_slot) == 1) pad_portdata[pad_port] |= (1 << pad_slot); // set slot else pad_portdata[pad_port] &= ~(1 << pad_slot); // clear slot } //Move onto the next slot pad_slot++; if(pad_slot >= 4) { //Move onto the next port pad_slot = 0; pad_port++; if(pad_port >= 2) pad_port = 0; } mainThreadCount2 = 0; } } } }