![](/media/cache/profiles/altb_JGUSAOG.jpg.50x50_q85.jpg)
SPI read Pixi Cam V1
pixySPI.cpp@4:478d4d9193a1, 2021-08-23 (annotated)
- 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?
User | Revision | Line number | New 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 | } |