unsigned int picread(void) { int i; unsigned int c; if(picmode&PICCMDMSK) { //bpWline("no read"); BPMSG1077; return 0; } c=0; switch(picmode&PICMODEMSK) // make it future proof { case PICMODE6: bbR(MOSI); // switch in to input bbH(CLK, PICSPEED/2); bbL(CLK, PICSPEED/2); for(i=0; i<14; i++) { c>>=1; bbH(CLK, PICSPEED/2); if(bbR(MOSI)) c|=0x2000; // bit14 bbL(CLK, PICSPEED/2); } bbH(CLK, PICSPEED/2); bbL(CLK, PICSPEED/2); bbL(MOSI, PICSPEED/5); break; case PICMODE4: bbR(MOSI); for(i=0; i<16; i++) { c>>=1; bbH(CLK, PICSPEED/2); if(bbR(MOSI)) c|=0x8000; // bit16 bbL(CLK, PICSPEED/2); } bbH(CLK, PICSPEED/2); bbL(CLK, PICSPEED/2); bbL(MOSI, PICSPEED/5); break; default: bpWline("unknown mode"); BPMSG1078; return 0; } // bpWbin(c>>8); bpSP; // bpWbin(c&0x0FF); bpSP; return c; }
void binpic(void) { unsigned char cmd; int ok; unsigned int temp; bpWstring("PIC1"); modeConfig.HiZ=1; // to allow different Vcc bbL(MOSI|CLK, PICSPEED); // pull both pins to 0 before applying Vcc and Vpp picmode=PICMODE6; piccmddelay=2; while(1) { cmd=UART1RX(); switch(cmd&0xC0) { case 0x00: ok=1; switch(cmd&0xF0) { case 0x00: switch(cmd) { case 0x00: return; case 0x01: bpWstring("PIC1"); break; case 0x02: picmode=PICMODE6; break; case 0x03: picmode=PICMODE4; break; case 0x04: case 0x05: case 0x06: case 0x07: piccmddelay=(cmd-0x04); break; default: ok=0; } break; case 0x10: if(cmd&0x08) { if(cmd&0x04) { bbH(AUX ,5); } else { bbL(AUX ,5); } if(cmd&0x02) { bbH(MISO ,5); } else { bbL(MISO ,5); } if(cmd&0x01) { bbH(CS ,5); } else { bbL(CS ,5); } } else { if(cmd&0x04) // pwm? { PWMfreq=100; PWMduty=50; updatePWM(); } else { PWMfreq=0; updatePWM(); } if(cmd&0x02) // vreg on { BP_VREG_ON(); //modeConfig.vregEN=1; } else { BP_VREG_OFF(); //modeConfig.vregEN=0; } if(cmd&0x01) // pullup on #ifndef BUSPIRATEV1A { BP_PULLUP_ON(); // modeConfig.pullupEN=1; } else { BP_PULLUP_OFF(); // modeConfig.pullupEN=0; } #endif } break; default: ok=0; } if(ok) { UART1TX(1); } else { UART1TX(0); } break; case 0x40: picmode|=PICCMD; picwrite(cmd&0x3F); picmode&=PICMODEMSK; UART1TX(1); break; case 0x80: picmode|=PICCMD; picwrite(cmd&0x3F); picmode&=PICMODEMSK; temp=UART1RX(); temp<<=8; temp|=UART1RX(); picwrite(temp); UART1TX(1); break; case 0xC0: picmode|=PICCMD; picwrite(cmd&0x3F); picmode&=PICMODEMSK; UART1TX(1); temp=picread(); UART1TX(temp>>8); UART1TX(temp&0x0FF); break; } } }
unsigned int picwrite(unsigned int c) { int i; int mask; mask=0x01; if(picmode&PICCMDMSK) // we got a command { switch(picmode&PICMODEMSK) // make it future proof { case PICMODE6: for(i=0; i<6; i++) { bbH(CLK, PICSPEED/4); if(c&mask) { bbH(MOSI, PICSPEED/4); } else { bbL(MOSI, PICSPEED/4); } bbL(CLK, PICSPEED/4); bbL(MOSI, PICSPEED/4); // both dat and clk low mask<<=1; } break; case PICMODE4: for(i=0; i<4; i++) { bbH(CLK, PICSPEED/4); if(c&mask) { bbH(MOSI, PICSPEED/4); } else { bbL(MOSI, PICSPEED/4); } bbL(CLK, PICSPEED/4); bbL(MOSI, PICSPEED/4); // both dat and clk low mask<<=1; } break; default: //bpWline("unknown"); BPMSG1078; return 0; } bpDelayMS(piccmddelay); } else // send data { switch(picmode&PICMODEMSK) // make it future proof { case PICMODE6: bbH(CLK, PICSPEED/4); // send leading 0 bbL(MOSI, PICSPEED/4); bbL(CLK, PICSPEED/4); bbL(CLK, PICSPEED/4); for(i=0; i<14; i++) // 14 bits { bbH(CLK, PICSPEED/4); if(c&mask) { bbH(MOSI, PICSPEED/4); } else { bbL(MOSI, PICSPEED/4); } bbL(CLK, PICSPEED/4); bbL(MOSI, PICSPEED/4); // both dat and clk low mask<<=1; } bbH(CLK, PICSPEED/4); // send trailing 0 bbL(MOSI, PICSPEED/4); bbL(CLK, PICSPEED/4); bbL(CLK, PICSPEED/4); break; case PICMODE4: for(i=0; i<16; i++) // does 16 bits at a time { bbH(CLK, PICSPEED/4); if(c&mask) { bbH(MOSI, PICSPEED/4); } else { bbL(MOSI, PICSPEED/4); } bbL(CLK, PICSPEED/4); bbL(MOSI, PICSPEED/4); // both dat and clk low mask<<=1; } break; default: //bpWline("unknown"); BPMSG1078; return 0; } } return 0x100; // no data to display }
void bb_scan(tld::TldStruct& tld, Eigen::Vector4d const & bb, Eigen::Vector2i imsize, int minwin) { double shift = 0.1; //used for scaling the bb Eigen::VectorXd scale(21); scale << -10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10; for (unsigned int i = 0; i < 21; i++) scale(i) = pow(1.2, scale(i)); int minBB = minwin; if (bb_width(bb) < minwin) return; Eigen::VectorXd bbW(21); //scale bb on x axis for (unsigned int x = 0; x < 21; x++) { bbW(x) = floor((bb_width(bb) * scale(x)) + 0.5); } Eigen::VectorXd bbH(21); //scale bb on y axis for (unsigned int x = 0; x < 21; x++) { bbH(x) = floor((bb_height(bb) * scale(x)) + 0.5); } Eigen::VectorXd bbSHH(21); Eigen::VectorXd bbSHW(21); //shift the scales for (unsigned int x = 0; x < 21; x++) bbSHH(x) = bbH(x) * shift; for (unsigned int x = 0; x < 21; x++) { if (bbH(x) <= bbW(x)) bbSHW(x) = bbH(x) * shift; else bbSHW(x) = bbW(x) * shift; } Eigen::VectorXd bbF(4); bbF << 2, 2, imsize(0), imsize(1); Eigen::Matrix<double, 6, Eigen::Dynamic> bbs; Eigen::Matrix<double, 6, Eigen::Dynamic> bbsbak; Eigen::Matrix<double, 2, Eigen::Dynamic> sca; //create a grid of bounding boxes with different scales for (unsigned int i = 0, last_scale = 0; i < 21; i++) { if (bbW(i) < minBB || bbH(i) < minBB) continue; Eigen::VectorXd left; Eigen::VectorXd leftbak; Eigen::VectorXd top; Eigen::VectorXd topbak; double val; val = bbF(0); for (unsigned int p = 0; val <= bbF(2) - bbW(i) - 1; val += bbSHW(i), p++) { leftbak.resize(left.size()); leftbak = left; left.resize(p + 1); if (p > 0) left << leftbak, floor(val + 0.5); else left(0) = floor(val + 0.5); } if(left.size() == 0) continue; val = bbF(1); for (unsigned int p = 0; val <= bbF(3) - bbH(i) - 1; val += bbSHH(i), p++) { topbak.resize(top.size()); topbak = top; top.resize(p + 1); if (p > 0) top << topbak, floor(val + 0.5); else top(0) = floor(val + 0.5); } if(top.size() == 0) continue; Eigen::MatrixXd grid(2, top.size() * left.size()); unsigned int cnt = 0; for (int k = 0; k < left.size(); k++) for (int w = 0; w < top.size(); w++) { grid(0, cnt) = top(w); grid(1, cnt) = left(k); cnt++; } Eigen::MatrixXd bbsnew(6, grid.cols()); bbsnew.row(0) = grid.row(1); bbsnew.row(1) = grid.row(0); bbsnew.row(2) = grid.array().row(1) + bbW(i) - 1; bbsnew.row(3) = grid.array().row(0) + bbH(i) - 1; bbsnew.row(4) = Eigen::MatrixXd::Constant(1, grid.cols(), last_scale + 1); bbsnew.row(5) = Eigen::MatrixXd::Constant(1, grid.cols(), left.size()); bbsbak.resize(6, bbs.cols()); bbsbak = bbs; bbs.resize(6, bbs.cols() + bbsnew.cols()); //lets have some fun! if (i > 0) bbs << bbsbak, bbsnew; else bbs = bbsnew; //save the scales on x and y axis sca.conservativeResize(2, sca.cols() + 1); sca(0, sca.cols() - 1) = bbH(i); sca(1, sca.cols() - 1) = bbW(i); last_scale++; } tld.grid = bbs; tld.nGrid = bbs.cols(); tld.scales = sca; }