SPI read Pixi Cam V1

Committer:
altb2
Date:
Mon Aug 23 11:26:37 2021 +0000
Revision:
4:478d4d9193a1
1st commit, reading pixi cam via SPI

Who changed what in which revision?

UserRevisionLine numberNew contents of line
altb2 4:478d4d9193a1 1
altb2 4:478d4d9193a1 2
altb2 4:478d4d9193a1 3 #include "pixySPI.h"
altb2 4:478d4d9193a1 4
altb2 4:478d4d9193a1 5 pixySPI::pixySPI(PinName mosi, PinName miso, PinName sclk, int nBlocks)
altb2 4:478d4d9193a1 6 :spi(mosi,miso,sclk)
altb2 4:478d4d9193a1 7 {
altb2 4:478d4d9193a1 8 spi.format(8,0); //8bits mode 0
altb2 4:478d4d9193a1 9 spi.frequency(100000); //set the frequency in Hz
altb2 4:478d4d9193a1 10 sync=0xAA55; //start word of a frame coming from the pixy
altb2 4:478d4d9193a1 11 //blocks=new Block[nBlocks]; //allocate space for the blocks
altb2 4:478d4d9193a1 12 //numBlocks=nBlocks;
altb2 4:478d4d9193a1 13 numBlocks=NUM_BLOCKS;
altb2 4:478d4d9193a1 14 bestX=CENTER_X;
altb2 4:478d4d9193a1 15 bestY=CENTER_Y;
altb2 4:478d4d9193a1 16 }
altb2 4:478d4d9193a1 17
altb2 4:478d4d9193a1 18 pixySPI::~pixySPI()
altb2 4:478d4d9193a1 19 {
altb2 4:478d4d9193a1 20 //delete blocks;
altb2 4:478d4d9193a1 21 }
altb2 4:478d4d9193a1 22
altb2 4:478d4d9193a1 23
altb2 4:478d4d9193a1 24 short pixySPI::readTwoBytesLSB()
altb2 4:478d4d9193a1 25 {
altb2 4:478d4d9193a1 26 short out;
altb2 4:478d4d9193a1 27 char read[2]= {0,0};
altb2 4:478d4d9193a1 28 read[0]=spi.write(0x00);
altb2 4:478d4d9193a1 29 read[1]=spi.write(0x00);
altb2 4:478d4d9193a1 30 out=(((short)read[0]) << 8) | read[1];
altb2 4:478d4d9193a1 31 return out;
altb2 4:478d4d9193a1 32 }
altb2 4:478d4d9193a1 33
altb2 4:478d4d9193a1 34
altb2 4:478d4d9193a1 35 //this doesn't work
altb2 4:478d4d9193a1 36 void pixySPI::readNBytes(char* buf, int num)
altb2 4:478d4d9193a1 37 {
altb2 4:478d4d9193a1 38 for (int i=0; i<num; i++) {
altb2 4:478d4d9193a1 39 char byte=spi.write(0x00);
altb2 4:478d4d9193a1 40 memcpy(buf+i, &byte, 1);
altb2 4:478d4d9193a1 41 }
altb2 4:478d4d9193a1 42 }
altb2 4:478d4d9193a1 43
altb2 4:478d4d9193a1 44 void pixySPI::capture()
altb2 4:478d4d9193a1 45 {
altb2 4:478d4d9193a1 46 memset(blocks, 0, numBlocks*sizeof(Block)); //destroy the old targets
altb2 4:478d4d9193a1 47 //rec_blocks = 0;
altb2 4:478d4d9193a1 48 for (i=0; i<numBlocks; ++i) {
altb2 4:478d4d9193a1 49 // printf("block %d\n", i);
altb2 4:478d4d9193a1 50 Block* out=&blocks[i];
altb2 4:478d4d9193a1 51 out->signature=INVALID_BLOCK;
altb2 4:478d4d9193a1 52 uint16_t checksum=0;
altb2 4:478d4d9193a1 53 //first we need to detect the start of a block. They all start with 0xAA55
altb2 4:478d4d9193a1 54 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 4:478d4d9193a1 55 //debug->printf("looking for valid signature\n");
altb2 4:478d4d9193a1 56 Timer t;
altb2 4:478d4d9193a1 57 t.start();
altb2 4:478d4d9193a1 58 while (memcmp((char*)&sync, frame, 2)!=0) {
altb2 4:478d4d9193a1 59 frame[0]=frame[1]; //move byte down
altb2 4:478d4d9193a1 60 frame[1]=spi.write(0x00); //get next byte.
altb2 4:478d4d9193a1 61 if (t.read_ms()>5)
altb2 4:478d4d9193a1 62 {
altb2 4:478d4d9193a1 63 t.stop();
altb2 4:478d4d9193a1 64 return;
altb2 4:478d4d9193a1 65 }
altb2 4:478d4d9193a1 66 }
altb2 4:478d4d9193a1 67 //printf("target\n\n");
altb2 4:478d4d9193a1 68 spi.write(0x00);
altb2 4:478d4d9193a1 69 //ok so we got a valid signature
altb2 4:478d4d9193a1 70 //these didn't end up working
altb2 4:478d4d9193a1 71 //readNBytes((char*)(&checksum), 2); //get the checksum
altb2 4:478d4d9193a1 72 //readNBytes((char*)(&out), sizeof(Block)); //get the rest of the data
altb2 4:478d4d9193a1 73 checksum=readTwoBytesLSB();
altb2 4:478d4d9193a1 74 out->signature=readTwoBytesLSB();
altb2 4:478d4d9193a1 75 out->x=readTwoBytesLSB();
altb2 4:478d4d9193a1 76 out->y=readTwoBytesLSB();
altb2 4:478d4d9193a1 77 out->width=readTwoBytesLSB();
altb2 4:478d4d9193a1 78 out->height=readTwoBytesLSB();
altb2 4:478d4d9193a1 79
altb2 4:478d4d9193a1 80 if (checksum!=(out->x+out->y+out->signature+out->width+out->height) || checksum==0) {
altb2 4:478d4d9193a1 81 //debug->printf("checksum doesn't add up %d\n", checksum);
altb2 4:478d4d9193a1 82 out->signature=INVALID_BLOCK; //used for invalid signatures
altb2 4:478d4d9193a1 83 }
altb2 4:478d4d9193a1 84 //printf("found block\n");
altb2 4:478d4d9193a1 85 if (blocks[0].signature!=INVALID_BLOCK)
altb2 4:478d4d9193a1 86 {
altb2 4:478d4d9193a1 87 //mutex->lock();
altb2 4:478d4d9193a1 88 bestX=blocks[0].x;
altb2 4:478d4d9193a1 89 bestY=blocks[0].y;
altb2 4:478d4d9193a1 90 //mutex->unlock();
altb2 4:478d4d9193a1 91 }
altb2 4:478d4d9193a1 92 }
altb2 4:478d4d9193a1 93 return;
altb2 4:478d4d9193a1 94 }
altb2 4:478d4d9193a1 95
altb2 4:478d4d9193a1 96 Block* pixySPI::getBlocks()
altb2 4:478d4d9193a1 97 {
altb2 4:478d4d9193a1 98 return blocks;
altb2 4:478d4d9193a1 99 }
altb2 4:478d4d9193a1 100
altb2 4:478d4d9193a1 101 int pixySPI::getNumBlocks()
altb2 4:478d4d9193a1 102 {
altb2 4:478d4d9193a1 103 return i;
altb2 4:478d4d9193a1 104 }
altb2 4:478d4d9193a1 105
altb2 4:478d4d9193a1 106 int pixySPI::getBestX()
altb2 4:478d4d9193a1 107 {
altb2 4:478d4d9193a1 108 if (bestX>640)
altb2 4:478d4d9193a1 109 return 640;
altb2 4:478d4d9193a1 110 else if (bestX<0)
altb2 4:478d4d9193a1 111 return 0;
altb2 4:478d4d9193a1 112 else
altb2 4:478d4d9193a1 113 return bestX;
altb2 4:478d4d9193a1 114 }
altb2 4:478d4d9193a1 115
altb2 4:478d4d9193a1 116 int pixySPI::getBestY()
altb2 4:478d4d9193a1 117 {
altb2 4:478d4d9193a1 118 if (bestY>400)
altb2 4:478d4d9193a1 119 return 400;
altb2 4:478d4d9193a1 120 else if (bestY<0)
altb2 4:478d4d9193a1 121 return 0;
altb2 4:478d4d9193a1 122 else
altb2 4:478d4d9193a1 123 return bestY;
altb2 4:478d4d9193a1 124 }
altb2 4:478d4d9193a1 125
altb2 4:478d4d9193a1 126 char pixySPI::getRawData()
altb2 4:478d4d9193a1 127 {
altb2 4:478d4d9193a1 128 return spi.write(0x00);
altb2 4:478d4d9193a1 129 }