Ruprecht Altenburger
/
TPixy-Interface
SPI read Pixi Cam V1
pixyUART.cpp@5:d109b094d4bb, 2021-08-28 (annotated)
- 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?
User | Revision | Line number | New 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 |