Exemplo n.º 1
0
void blobProcess(void)
{
	uint32_t result, i, j=0;
	uint32_t x, y, loseCount=0, *memory = (uint32_t *)RLS_MEMORY;
	int16_t bdata[8];

   	move(1);

   	// get first frame (primer)
	result = cc_getRLSFrame(memory, RLS_MEMORY_SIZE, LUT_MEMORY, &g_numRls);
			
	while(1)
	{
		if (!g_loop)
		{
		// service calls
			while(g_chirpUsb->service());
			handleButton();
		}
		else
		{		
			// copy
			if (g_numRls>QMEMSIZE)
				g_numRls = QMEMSIZE;
			for (i=0; i<g_numRls; i++)
				g_qmem[i] = memory[i];


			// kick off next frame
			cc_getRLSFrame(memory, RLS_MEMORY_SIZE, LUT_MEMORY, NULL, false);
			// process this one
			cc_getMaxBlob(g_qmem, g_numRls, bdata);
			if (bdata[0]>0)
			{
				loseCount = 0;
				x = bdata[0]+(bdata[1]-bdata[0])/2;
				y = bdata[2]+(bdata[3]-bdata[2])/2;
				//servo(x, y);
				//printf("%d %d\n", x, y);
				if (detect(x, y))
				{
					//printf("***\n");
					move(0);
				}
			}
			else
			{
				loseCount++;
				if (loseCount==10)
 					move(1);
			}
			// check for result
			while(!g_chirpM0->service());

			// service calls
			while(g_chirpUsb->service());
		}
	} 		
}
Exemplo n.º 2
0
int32_t cc_getRLSFrameChirp(Chirp *chirp)
{
	int32_t result;
	uint32_t len, numRls;

	// figure out prebuf length (we need the prebuf length and the number of runlength segments, but there's a chicken and egg problem...)
	len = Chirp::serialize(chirp, RLS_MEMORY, RLS_MEMORY_SIZE,  HTYPE(0), UINT16(0), UINT16(0), UINTS32_NO_COPY(0), END);

	result = cc_getRLSFrame((uint32_t *)(RLS_MEMORY+len), LUT_MEMORY, &numRls);
	// send frame, use in-place buffer
	Chirp::serialize(chirp, RLS_MEMORY, RLS_MEMORY_SIZE,  HTYPE(FOURCC('C','C','Q','1')), UINT16(CAM_RES2_WIDTH), UINT16(CAM_RES2_HEIGHT), UINTS32_NO_COPY(numRls), END);
	// copy from IPC memory to RLS_MEMORY
	if (g_qqueue->readAll((Qval *)(RLS_MEMORY+len), (RLS_MEMORY_SIZE-len)/sizeof(Qval))!=numRls)
		return -1;
	chirp->useBuffer(RLS_MEMORY, len+numRls*4);

	return result;
}
Exemplo n.º 3
0
void blobProcess(void)
{
	uint32_t result, i, j=0;
	uint32_t x, y, *memory = (uint32_t *)RLS_MEMORY;
	int16_t bdata[8];

   	// get first frame (primer)
	result = cc_getRLSFrame(memory, RLS_MEMORY_SIZE, LUT_MEMORY, &g_numRls);
	
		
	while(1)
	{
		if (!g_loop)
		{
		// service calls
#ifdef SERVO						   
			servo(XCENTER, YCENTER);
#else
	  		motor(XCENTER, YTRACK);
#endif		
			while(g_chirpUsb->service());
			handleButton();
		}
		else
		{		
			// copy
			if (g_numRls>QMEMSIZE)
				g_numRls = QMEMSIZE;
			for (i=0; i<g_numRls; i++)
				g_qmem[i] = memory[i];


			// kick off next frame
			cc_getRLSFrame(memory, RLS_MEMORY_SIZE, LUT_MEMORY, NULL, false);
			// process this one
			cc_getMaxBlob(g_qmem, g_numRls, bdata);
			if (bdata[0]>0)
			{
				x = bdata[0]+(bdata[1]-bdata[0])/2;
				y = bdata[2]+(bdata[3]-bdata[2])/2;
#ifdef SERVO
				servo(x, y);
#else
				motor(x, y);
#endif
			}
			else
#ifdef SERVO						   
				servo(XCENTER, YCENTER);
#else
	  			motor(XCENTER, YTRACK);
#endif		
#if 0
			if (j%10==0)
			{
				if (bdata[0]>0)
					printf("%d %d\n", x, y);
				else
					printf("**\n");
			}
			j++;   			
#endif
			// check for result
			while(!g_chirpM0->service());

			// service calls
			while(g_chirpUsb->service());
		}
	} 		
}
Exemplo n.º 4
0
int32_t cc_getRLSCCChirp(Chirp *chirp)
{
	
	int16_t* c_components = new int16_t[MAX_BLOBS*4];
	
	
	uint32_t numRls, result;//, prebuf;
	uint32_t *memory = (uint32_t *)RLS_MEMORY;
	result = cc_getRLSFrame(memory, LUT_MEMORY, &numRls);
	
	CBlobAssembler blobber;
	
	int32_t row;
	uint32_t i, startCol, length;
	uint8_t model;

	for (i=0, row=-1; i<numRls; i++)
	{
			if (memory[i]==0)
			{
					row++;
					continue;
			}
			model = memory[i]&0x03;
			memory[i] >>= 3;
			startCol = memory[i]&0x1ff;
			memory[i] >>= 9;
			length = memory[i]&0x1ff;
			if(!handleRL(&blobber, model, row, startCol, length))
				break;
	}
	
	blobber.EndFrame();
	blobber.SortFinished();
	
	//
	// Take Finished blobs and return with chirp
	//
	CBlob *blob, *temp;
	blob = blobber.finishedBlobs;
	
	uint32_t cc_num = 0;
	temp = blob;
	while (temp)
	{
		int16_t top, right, bottom, left;
		temp->getBBox(left, top, right, bottom);
		
		// Don't want objects with area less than 9...
		if ((right-left)*(bottom-top) < 9)
			break;
		
		temp = temp->next;
		cc_num++;
	}
	
	// Remove the rest that we don't care about
	/*while(temp)
	{
		CBlob *next = temp->next;
		temp->~CBlob();
		temp = NULL;
		temp = next;
	}*/
	
	cc_num = (cc_num < 15) ? cc_num : MAX_BLOBS;

	// Populate return w/ result
	//void* mem = malloc(sizeof(int16_t)*cc_num*4);
	//if (mem == NULL)
	//	int i = 0;
	//free(mem);
	//int16_t* c_components = new int16_t[cc_num*4];
	//g_mem += sizeof(int16_t)*cc_num*4;
	memset((void *)c_components, 0, sizeof(uint16_t)*cc_num*4);

	for (int i = 0; i < cc_num; i++)
	{
		int16_t top, right, bottom, left;
		blob->getBBox(left, top, right, bottom);
		c_components[(i*4)+0] = top;
		c_components[(i*4)+1] = right;
		c_components[(i*4)+2] = bottom;
		c_components[(i*4)+3] = left;

		blob = blob->next;
	}
	
	//CRP_RETURN(chirp, USE_BUFFER(SRAM0_SIZE, SRAM0_LOC), HTYPE(0), UINT16(0), UINT16(0), UINTS8(0, 0), END);
	//prebuf = chirp->getPreBufLen();
	
	blobber.Reset();
	
	CRP_RETURN(chirp, HTYPE(FOURCC('V','I','S','U')), UINTS16(cc_num*4, c_components), END);
	
	delete[] c_components;
	//g_mem -= sizeof(int16_t)*cc_num*4;

	return result;
}