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 
}
Пример #4
0
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;
}