int32_t cam_getFrameChirp(const uint8_t &type, const uint16_t &xOffset, const uint16_t &yOffset, const uint16_t &xWidth, const uint16_t &yWidth, Chirp *chirp) { int32_t result, prebuf; uint8_t *frame = (uint8_t *)SRAM0_LOC; // force an error to get prebuf length CRP_RETURN(chirp, USE_BUFFER(SRAM0_SIZE, frame), HTYPE(0), UINT16(0), UINT16(0), UINTS8(0, 0), END); prebuf = chirp->getPreBufLen(); if ((result=cam_getFrame(frame+prebuf, SRAM0_SIZE-prebuf, type, xOffset, yOffset, xWidth, yWidth))>=0) // send frame, use in-place buffer CRP_RETURN(chirp, USE_BUFFER(SRAM0_SIZE, frame), HTYPE(FOURCC('B','A','8','1')), UINT16(xWidth), UINT16(yWidth), UINTS8(xWidth*yWidth, frame+prebuf), END); return result; }
int32_t exec_versionType(Chirp *chirp) { if (chirp) CRP_RETURN(chirp, STRING(FW_TYPE), END); return 0; }
int32_t prm_getAll(const uint16_t &index, Chirp *chirp) { int res; uint16_t i; uint32_t len; uint8_t *data, argList[CRP_MAX_ARGS]; ParamRecord *rec; Shadow *shadow; for (i=0, rec=(ParamRecord *)PRM_FLASH_LOC; rec->crc!=0xffff && rec<(ParamRecord *)PRM_ENDREC; i++, rec++) { if(i==index) { shadow = prm_findShadow(prm_getId(rec)); if (shadow && shadow->data) { len = shadow->len; data = shadow->data; } else { len = rec->len; data = (uint8_t *)rec+prm_getDataOffset(rec); } res = Chirp::getArgList(data, rec->len, argList); if (res<0) return res; CRP_RETURN(chirp, UINT32(rec->flags), STRING(argList), STRING(prm_getId(rec)), STRING(prm_getDesc(rec)), UINTS8(len, data), END); return 0; } } return -1; }
int32_t exec_version(Chirp *chirp) { uint16_t ver[] = {FW_MAJOR_VER, FW_MINOR_VER, FW_BUILD_VER}; cprintf("Pixy firmware version %d.%d.%d\n", ver[0], ver[1], ver[2]); if (chirp) CRP_RETURN(chirp, UINTS16(sizeof(ver), ver), END); return 0; }
int32_t prm_getChirp(const char *id, Chirp *chirp) { ParamRecord *rec; Shadow *shadow = prm_findShadow(id); if (shadow && shadow->data) CRP_RETURN(chirp, UINTS8(shadow->len, shadow->data), END); else { rec = prm_find(id); if (rec==NULL) return -1; CRP_RETURN(chirp, UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec)), END); } return 0; }
int32_t exec_getAction(const uint16_t &index, Chirp *chirp) { int n = sizeof(actions)/sizeof(ActionScriptlet); if (index>=n) return -1; if (chirp) CRP_RETURN(chirp, STRING(actions[index].action), STRING(actions[index].scriptlet), END); return 0; }
int32_t prm_getChirp(const char *id, Chirp *chirp) { ParamRecord *rec; rec = prm_find(id); if (rec==NULL) return -1; CRP_RETURN(chirp, UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec)), END); return 0; }
int32_t prm_getInfo(const char *id, Chirp *chirp) { ParamRecord *rec; for (rec=(ParamRecord *)PRM_FLASH_LOC; rec->crc!=0xffff && rec<(ParamRecord *)PRM_ENDREC; rec++) { if(strcmp(id, (char *)rec->data)==0) { CRP_RETURN(chirp, STRING(prm_getDesc(rec))); return 0; } } return -1; }
int32_t prm_getAll(const uint16_t &index, Chirp *chirp) { uint16_t i; ParamRecord *rec; for (i=0, rec=(ParamRecord *)PRM_FLASH_LOC; rec->crc!=0xffff && rec<(ParamRecord *)PRM_ENDREC; i++, rec++) { if(i==index) { CRP_RETURN(chirp, STRING(prm_getId(rec)), STRING(prm_getDesc(rec)), UINTS8(rec->len, (uint8_t *)rec+prm_getDataOffset(rec))); return 0; } } return -1; }
int cc_sendBlobs(Chirp *chirp, const BlobA *blobs, uint32_t len, const BlobB *ccBlobs, uint32_t ccLen, uint8_t renderFlags) { CRP_RETURN(chirp, HTYPE(FOURCC('C','C','B','2')), HINT8(renderFlags), HINT16(CAM_RES2_WIDTH), HINT16(CAM_RES2_HEIGHT), UINTS16(len*sizeof(BlobA)/sizeof(uint16_t), blobs), UINTS16(ccLen*sizeof(BlobB)/sizeof(uint16_t), ccBlobs), END); return 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; }