boolean CDWHCIDevice::TransferStageAsync (CUSBRequest *pURB, boolean bIn, boolean bStatusStage) { assert (pURB != 0); unsigned nChannel = AllocateChannel (); if (nChannel >= m_nChannels) { return FALSE; } CDWHCITransferStageData *pStageData = new CDWHCITransferStageData (nChannel, pURB, bIn, bStatusStage); assert (pStageData != 0); assert (m_pStageData[nChannel] == 0); m_pStageData[nChannel] = pStageData; EnableChannelInterrupt (nChannel); if (!pStageData->IsSplit ()) { pStageData->SetState (StageStateNoSplitTransfer); } else { if (!pStageData->BeginSplitCycle ()) { DisableChannelInterrupt (nChannel); delete pStageData; m_pStageData[nChannel] = 0; FreeChannel (nChannel); return FALSE; } pStageData->SetState (StageStateStartSplit); pStageData->SetSplitComplete (FALSE); pStageData->GetFrameScheduler ()->StartSplit (); } StartTransaction (pStageData); return TRUE; }
void PlayField::MessageReceived(void){ int cnt = GetReceivedCount(); char *buf = (char*)GetReceivedBuffer(); for(int n=0; n<cnt; n++){ switch(GetReceivedCommand(n)){ case INPUT_DIGITAL_DOWN:{ if(!buf){ printf("PlayField::MessageReceived: No buffer!\n"); break; } int len = *(int16*)buf; buf+=sizeof(int16); char *str = new char[len+1]; for(int n=0; n<len; n++) str[n]=*buf++; str[len]='\0'; // printf("%s down\n",str); char *key = &str[1]; int chan = 0; bool done = false; do{ switch(*key++){ case '0': chan*=10; break; case '1': chan*=10; chan+=1; break; case '2': chan*=10; chan+=2; break; case '3': chan*=10; chan+=3; break; case '4': chan*=10; chan+=4; break; case '5': chan*=10; chan+=5; break; case '6': chan*=10; chan+=6; break; case '7': chan*=10; chan+=7; break; case '8': chan*=10; chan+=8; break; case '9': chan*=10; chan+=9; break; default: done=true; } }while(!done); if(chan>=channels->GetCount()){ // printf("PlayField::MessageReceived(): Channel overflow!\n"); delete str; return; } // printf("%s(%d) down\n",key,chan); if(!strcmp(key,"!Hook")){ //printf("PlayField: hookof %d\n",chan); #ifndef SINGLE_LINE_TEST if(GetChannel(chan)) printf("PlayField: Channel allready active (%d)!\n",chan); else{ #endif //((Player*)players->GetItem(0))->Logon(); Player *player = AllocateChannel(chan); player->Logon(); #ifndef SINGLE_LINE_TEST } #endif } else if(!strcmp(key,"1")){ if(GetChannel(chan)) ((Player*)GetChannel(chan))->Lock(0); } else if(!strcmp(key,"2")){ if(GetChannel(chan)) ((Player*)GetChannel(chan))->Lock(1); } else if(!strcmp(key,"3")){ if(GetChannel(chan)) ((Player*)GetChannel(chan))->Lock(2); } else if(!strcmp(key,"4")){ if(GetChannel(chan)) ((Player*)GetChannel(chan))->Lock(3); } else if(!strcmp(key,"5")){ if(GetChannel(chan)) ((Player*)GetChannel(chan))->Spinn(); } if(GetChannel(chan)) ((Player*)GetChannel(chan))->DigitDown(key); /* if(!strcmp(key,"!Hook")) state[chan] = '!'; if(!strcmp(key,"0")) state[chan] = '0'; if(!strcmp(key,"1")) state[chan] = '1'; if(!strcmp(key,"2")) state[chan] = '2'; if(!strcmp(key,"3")) state[chan] = '3'; if(!strcmp(key,"4")) state[chan] = '4'; if(!strcmp(key,"5")) state[chan] = '5'; if(!strcmp(key,"6")) state[chan] = '6'; if(!strcmp(key,"7")) state[chan] = '7'; if(!strcmp(key,"8")) state[chan] = '8'; if(!strcmp(key,"9")) state[chan] = '9'; if(!strcmp(key,"#")) state[chan] = '#'; if(!strcmp(key,"*")) state[chan] = '*'; */ delete str; }break; case INPUT_DIGITAL_UP:{ if(!buf){ printf("PlayField::MessageReceived: No buffer!\n"); break; } int len = *(int16*)buf; buf+=sizeof(int16); char *str = new char[len+1]; for(int n=0; n<len; n++) str[n]=*buf++; str[len]='\0'; // printf("%s up\n",str); char *key = &str[1]; int chan = 0; bool done = false; do{ switch(*key++){ case '0': chan*=10; break; case '1': chan*=10; chan+=1; break; case '2': chan*=10; chan+=2; break; case '3': chan*=10; chan+=3; break; case '4': chan*=10; chan+=4; break; case '5': chan*=10; chan+=5; break; case '6': chan*=10; chan+=6; break; case '7': chan*=10; chan+=7; break; case '8': chan*=10; chan+=8; break; case '9': chan*=10; chan+=9; break; default: done=true; } }while(!done); if(chan>=channels->GetCount()){ // printf("PlayField::MessageReceived(): Channel overflow!\n"); delete str; return; } // printf("%s(%d) up\n",key,chan); // if(!strcmp(key,"!Hook")) ((Player*)players->GetItem(0))->Logout(); if(GetChannel(chan)) ((Player*)GetChannel(chan))->DigitUp(key); #ifndef SINGLE_LINE_TEST if(!strcmp(key,"!Hook")){ //printf("PlayField: hookon %d\n",chan); Player *player = GetChannel(chan); if(player){ player->Logout(); FreeChannel(chan); }else printf("PlayField: No player in channel %d!\n",chan); } #endif /* if(!strcmp(key,"!Hook")) state[chan] = '-'; else if(!strcmp(key,"0")) state[chan] = '!'; if(!strcmp(key,"1")) state[chan] = '!'; if(!strcmp(key,"2")) state[chan] = '!'; if(!strcmp(key,"3")) state[chan] = '!'; if(!strcmp(key,"4")) state[chan] = '!'; if(!strcmp(key,"5")) state[chan] = '!'; if(!strcmp(key,"6")) state[chan] = '!'; if(!strcmp(key,"7")) state[chan] = '!'; if(!strcmp(key,"8")) state[chan] = '!'; if(!strcmp(key,"9")) state[chan] = '!'; if(!strcmp(key,"#")) state[chan] = '!'; if(!strcmp(key,"*")) state[chan] = '!'; */ delete str; }break; } } }