![](/media/cache/profiles/altb_JGUSAOG.jpg.50x50_q85.jpg)
SPI read Pixi Cam V1
Diff: pixySPI.cpp
- Revision:
- 4:478d4d9193a1
diff -r 66df7d295245 -r 478d4d9193a1 pixySPI.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/pixySPI.cpp Mon Aug 23 11:26:37 2021 +0000 @@ -0,0 +1,129 @@ + + +#include "pixySPI.h" + +pixySPI::pixySPI(PinName mosi, PinName miso, PinName sclk, int nBlocks) + :spi(mosi,miso,sclk) +{ + spi.format(8,0); //8bits mode 0 + spi.frequency(100000); //set the frequency in Hz + sync=0xAA55; //start word of a frame coming from the pixy + //blocks=new Block[nBlocks]; //allocate space for the blocks + //numBlocks=nBlocks; + numBlocks=NUM_BLOCKS; + bestX=CENTER_X; + bestY=CENTER_Y; +} + +pixySPI::~pixySPI() +{ + //delete blocks; +} + + +short pixySPI::readTwoBytesLSB() +{ + short out; + char read[2]= {0,0}; + read[0]=spi.write(0x00); + read[1]=spi.write(0x00); + out=(((short)read[0]) << 8) | read[1]; + return out; +} + + +//this doesn't work +void pixySPI::readNBytes(char* buf, int num) +{ + for (int i=0; i<num; i++) { + char byte=spi.write(0x00); + memcpy(buf+i, &byte, 1); + } +} + +void pixySPI::capture() +{ + memset(blocks, 0, numBlocks*sizeof(Block)); //destroy the old targets + //rec_blocks = 0; + for (i=0; i<numBlocks; ++i) { + // printf("block %d\n", i); + Block* out=&blocks[i]; + out->signature=INVALID_BLOCK; + uint16_t checksum=0; + //first we need to detect the start of a block. They all start with 0xAA55 + 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 + //debug->printf("looking for valid signature\n"); + Timer t; + t.start(); + while (memcmp((char*)&sync, frame, 2)!=0) { + frame[0]=frame[1]; //move byte down + frame[1]=spi.write(0x00); //get next byte. + if (t.read_ms()>5) + { + t.stop(); + return; + } + } + //printf("target\n\n"); + spi.write(0x00); + //ok so we got a valid signature + //these didn't end up working + //readNBytes((char*)(&checksum), 2); //get the checksum + //readNBytes((char*)(&out), sizeof(Block)); //get the rest of the data + checksum=readTwoBytesLSB(); + out->signature=readTwoBytesLSB(); + out->x=readTwoBytesLSB(); + out->y=readTwoBytesLSB(); + out->width=readTwoBytesLSB(); + out->height=readTwoBytesLSB(); + + if (checksum!=(out->x+out->y+out->signature+out->width+out->height) || checksum==0) { + //debug->printf("checksum doesn't add up %d\n", checksum); + out->signature=INVALID_BLOCK; //used for invalid signatures + } + //printf("found block\n"); + if (blocks[0].signature!=INVALID_BLOCK) + { + //mutex->lock(); + bestX=blocks[0].x; + bestY=blocks[0].y; + //mutex->unlock(); + } + } + return; +} + +Block* pixySPI::getBlocks() +{ + return blocks; +} + +int pixySPI::getNumBlocks() +{ + return i; +} + +int pixySPI::getBestX() +{ + if (bestX>640) + return 640; + else if (bestX<0) + return 0; + else + return bestX; +} + +int pixySPI::getBestY() +{ + if (bestY>400) + return 400; + else if (bestY<0) + return 0; + else + return bestY; +} + +char pixySPI::getRawData() +{ + return spi.write(0x00); +} \ No newline at end of file