Example #1
0
 bool check(float x, float z)
 {
   const uint32_t cellX = std::floor(x * 2.0f);
   const uint32_t cellZ = std::floor(z * 2.0f);
   return checkI(cellX, cellZ);
 }
//Recebe as tramas de dados e responde RR
int transfDados(int fd, char* buffer, char* data, int filesize)
{
	char dados[15000];
	int res=0,i, a=0;
	int pointer=0;
	char nr,cns,cnr;
	nr=0x0;
	cns=0x0;
	cnr=0x5;
	int isValid = FALSE, next = FALSE;

	while(next!=TRUE)
	{
		isValid = checkI(buffer,cns);

		if(isValid==TRUE)
		{
			getData(buffer,data);
			if (data[0]==1)
			{
				printf("Recebida trama de controlo de dados (start)\n");
				char fsize[data[2]];
				while(a<data[2])
				{
					fsize[a]=data[a+3];
					a++;
				}
				filesize = atoi(fsize);
				a=0;
				while(a<=data[4+data[2]])
				{
					filename[a]=data[4+data[2]+a];
					//printf("%c",filename[a]);
					a++;
				}
				filename[a]='\0';
			}
			else if(data[0]==0)
			{
				pointer = lerdados(data,dados,pointer);
				printf("A escrever dados na posicao %d de um total de %d\n",pointer,filesize);
			}
			else if(data[0]==2)
			{
				printf("Recebida trama de controlo de dados (end)\n");
				/*if(filesize!=(data[3]))
				{
					printf("Dados corrompidos, tamanho do ficheiro nao e valido.%d\n",data[3]);
					exit(1);
				}
				if(filename!=data[6])
				{
					printf("Dados corrompidos. Impossivel terminar.\n");
					exit(1);
				}*/
			}
			else
			{
				printf("Trama de dados corrompida.\n");
			}
			//Verifica o valor do N(r) anterior para o poder alterar
			if(nr==0x1){
				nr=0x0;
				cns=0x0;
				cnr=0x5;
			}
			else{
				nr=0x1;
				cns=0x2;
				cnr=0x25;
			}
			writeRR(fd,cnr);//Escreve o RR de resposta que permite ao Sender identificar se enviou o I bem ou necessita de enviar outra vez
		}
		else
		{

			next = checkDISC(buffer);
			if(next==FALSE)
			{
				writeRR(fd,cnr);
			}
			else{
				for(i=0; i<filesize; i++){
					data[i] = dados[i];
				}
				return filesize;
			}
		}
		llread(fd,buffer);
	}
}