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()); } } }
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; }
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()); } } }
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; }