SPI read Pixi Cam V1

Committer:
altb2
Date:
Sat Aug 28 13:03:58 2021 +0000
Revision:
5:d109b094d4bb
Pixy Cam V1 Interface with UARt connection. Just connect the TX -> RX pin and power supply (see Pixy cam doc)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 5:d109b094d4bb 1
altb2 5:d109b094d4bb 2
altb2 5:d109b094d4bb 3 #include "pixyUART.h"
altb2 5:d109b094d4bb 4
altb2 5:d109b094d4bb 5 pixyUART::pixyUART(BufferedSerial *com)
altb2 5:d109b094d4bb 6 {
altb2 5:d109b094d4bb 7 sync=0xAA55; //start word of a frame coming from the pixy
altb2 5:d109b094d4bb 8 //blocks=new Block[nBlocks]; //allocate space for the blocks
altb2 5:d109b094d4bb 9 //numBlocks=nBlocks;
altb2 5:d109b094d4bb 10 numBlocks=NUM_BLOCKS;
altb2 5:d109b094d4bb 11 uart = com;
altb2 5:d109b094d4bb 12 }
altb2 5:d109b094d4bb 13
altb2 5:d109b094d4bb 14 pixyUART::~pixyUART()
altb2 5:d109b094d4bb 15 {
altb2 5:d109b094d4bb 16 //delete blocks;
altb2 5:d109b094d4bb 17 }
altb2 5:d109b094d4bb 18
altb2 5:d109b094d4bb 19
altb2 5:d109b094d4bb 20 int8_t pixyUART::readTwoBytesLSB(uint16_t *out)
altb2 5:d109b094d4bb 21 {
altb2 5:d109b094d4bb 22 int32_t num = uart->read(buffer, 2);
altb2 5:d109b094d4bb 23 if(num>0)
altb2 5:d109b094d4bb 24 {
altb2 5:d109b094d4bb 25 *out=buffer[0]+256*buffer[1];
altb2 5:d109b094d4bb 26 return 1;
altb2 5:d109b094d4bb 27 }
altb2 5:d109b094d4bb 28 else
altb2 5:d109b094d4bb 29 return -1;
altb2 5:d109b094d4bb 30 }
altb2 5:d109b094d4bb 31
altb2 5:d109b094d4bb 32
altb2 5:d109b094d4bb 33 void pixyUART::capture()
altb2 5:d109b094d4bb 34 {
altb2 5:d109b094d4bb 35 memset(blocks, 0, numBlocks*sizeof(Block)); //destroy the old targets
altb2 5:d109b094d4bb 36 captured_blocks = 0;
altb2 5:d109b094d4bb 37 Timer ti;
altb2 5:d109b094d4bb 38 ti.reset();
altb2 5:d109b094d4bb 39 ti.start();
altb2 5:d109b094d4bb 40 uint8_t got_data;
altb2 5:d109b094d4bb 41 for (int i=0; i<numBlocks; i++) {
altb2 5:d109b094d4bb 42 Block* out=&blocks[captured_blocks];
altb2 5:d109b094d4bb 43 out->signature=INVALID_BLOCK;
altb2 5:d109b094d4bb 44 uint16_t checksum=0;
altb2 5:d109b094d4bb 45 //first we need to detect the start of a block. They all start with 0xAA55
altb2 5:d109b094d4bb 46 char frame[2]= {0,0}; //this is a 2 byte running frame of what is being recieved. It's like a first-in-last-out queue
altb2 5:d109b094d4bb 47 //debug->printf("looking for valid signature\n");
altb2 5:d109b094d4bb 48 int32_t num = 1;
altb2 5:d109b094d4bb 49 while(memcmp((char*)&sync, frame, 2)!=0)
altb2 5:d109b094d4bb 50 {
altb2 5:d109b094d4bb 51 frame[0] = frame[1]; //move byte down
altb2 5:d109b094d4bb 52 num = uart->read(&frame[1],1); //get next byte.
altb2 5:d109b094d4bb 53 //printf("%d ",frame[1]);
altb2 5:d109b094d4bb 54 if(num<=0)
altb2 5:d109b094d4bb 55 {
altb2 5:d109b094d4bb 56 break;
altb2 5:d109b094d4bb 57 }
altb2 5:d109b094d4bb 58 }
altb2 5:d109b094d4bb 59 if(i==0)
altb2 5:d109b094d4bb 60 ti.reset();
altb2 5:d109b094d4bb 61 if(ti.read()>.015)
altb2 5:d109b094d4bb 62 break;
altb2 5:d109b094d4bb 63 //printf(" / ");
altb2 5:d109b094d4bb 64 while(memcmp((char*)&sync, frame, 2)==0)
altb2 5:d109b094d4bb 65 {
altb2 5:d109b094d4bb 66 num = uart->read(frame,2); //get next byte.
altb2 5:d109b094d4bb 67 //printf("%d %d",frame[0],frame[1]);
altb2 5:d109b094d4bb 68 if(num<=0)
altb2 5:d109b094d4bb 69 {
altb2 5:d109b094d4bb 70 break;
altb2 5:d109b094d4bb 71 }
altb2 5:d109b094d4bb 72 }
altb2 5:d109b094d4bb 73 //printf(" . ");
altb2 5:d109b094d4bb 74 checksum = frame[0]+256*frame[1];
altb2 5:d109b094d4bb 75 got_data = readTwoBytesLSB(&out->signature);
altb2 5:d109b094d4bb 76 if(got_data<0)
altb2 5:d109b094d4bb 77 break;
altb2 5:d109b094d4bb 78 got_data = readTwoBytesLSB(&out->x);
altb2 5:d109b094d4bb 79 if(got_data<0)
altb2 5:d109b094d4bb 80 break;
altb2 5:d109b094d4bb 81 got_data = readTwoBytesLSB(&out->y);
altb2 5:d109b094d4bb 82 if(got_data<0)
altb2 5:d109b094d4bb 83 break;
altb2 5:d109b094d4bb 84 got_data = readTwoBytesLSB(&out->width);
altb2 5:d109b094d4bb 85 if(got_data<0)
altb2 5:d109b094d4bb 86 break;
altb2 5:d109b094d4bb 87 got_data = readTwoBytesLSB(&out->height);
altb2 5:d109b094d4bb 88 if(got_data<0)
altb2 5:d109b094d4bb 89 break;
altb2 5:d109b094d4bb 90 //printf("cs: %d i: %d x: %d y: %d w: %d h: %d\r\n",checksum,out->signature,out->x,out->y,out->width,out->height);
altb2 5:d109b094d4bb 91 if (checksum!=(out->x+out->y+out->signature+out->width+out->height) || checksum==0) {
altb2 5:d109b094d4bb 92 //debug->printf("checksum doesn't add up %d\n", checksum);
altb2 5:d109b094d4bb 93 out->signature=INVALID_BLOCK; //used for invalid signatures
altb2 5:d109b094d4bb 94 }
altb2 5:d109b094d4bb 95 else
altb2 5:d109b094d4bb 96 {
altb2 5:d109b094d4bb 97 captured_blocks++;
altb2 5:d109b094d4bb 98 }
altb2 5:d109b094d4bb 99
altb2 5:d109b094d4bb 100 }
altb2 5:d109b094d4bb 101 return;
altb2 5:d109b094d4bb 102 }
altb2 5:d109b094d4bb 103
altb2 5:d109b094d4bb 104 Block* pixyUART::getBlocks()
altb2 5:d109b094d4bb 105 {
altb2 5:d109b094d4bb 106 return blocks;
altb2 5:d109b094d4bb 107 }
altb2 5:d109b094d4bb 108
altb2 5:d109b094d4bb 109