Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
		}
	}
}