Ejemplo n.º 1
0
int main()
{
	//ActuatorController ac("/dev/tty.usbserial-A9S3VTXD");
	//ac.init();

	sf::Clock clock;
	

	sf::RenderWindow window(sf::VideoMode(640,480), "test");
	bool isAdding = false;
	bool area_selected = false;

	Director director;
	std::vector<cv::Vec2d> pointsList;
	std::vector<cv::Vec2d> area_points;
	std::vector<cv::Vec2d> selected_points;
	std::vector<ActuatorMoveOrder> ordersList;
	while (window.isOpen())
    {
        // check all the window's events that were triggered since the last iteration of the loop
        sf::Event event;
        while (window.pollEvent(event))
        {
        	sf::Time time1 = clock.getElapsedTime();
            director.update();
            if (event.type == sf::Event::MouseButtonPressed) {
            	if(isAdding) {
            		//When in adding mode, add position of where mouse clicked to a vector.
            		cv::Vec2d point = cv::Vec2d(-150+300.0*((double)event.mouseButton.x)/640.0, -90.0+180*((double)event.mouseButton.y)/480.0);
            		std::cout << point[0] << ',' << point[1] << std::endl;
            		pointsList.push_back(point);

            		cv::Vec2d mouse_pos = {(double)event.mouseButton.x, (double)event.mouseButton.y};
            		selected_points.push_back(mouse_pos); 
            	}
            	else {
            		//When not in adding mode, send order to manualPan function to move actuator.
            		cv::Vec2d point = cv::Vec2d(-150+300.0*((double)event.mouseButton.x)/640.0, -90.0+180*((double)event.mouseButton.y)/480.0);
            		std::cout << point[0] << ',' << point[1] << std::endl;
            		ActuatorMoveOrder order;
            		order.posDeg = point;
            		order.duration = 2;
            		director.performManualPan(order);
            		std::cout << time1.asSeconds() << std::endl;

            	}
            }
            else if (event.type == sf::Event::KeyPressed) {
            	if (event.key.code == sf::Keyboard::Escape) {
			    	window.close();
		    	}
		    	else if(event.key.code == sf::Keyboard::A) {
		    		// When A is pressed, window is in adding mode
		    		isAdding = true;
		    	}
		    	else if(event.key.code == sf::Keyboard::S) {
		    		//Draw box, Scan region
		    		director.performRegionScan(pointsList);
		    		area_points = director.getSelectedRegion();
		    		pointsList.clear();
		    		isAdding = false;
		    		area_selected = true;		   
		    	}
		    	else if(event.key.code == sf::Keyboard::D) {
		    		//FullScan
		    		ordersList = director.performFullScan();

		    	}
		    	else if(event.key.code == sf::Keyboard::C) {
		    		//Empty everything and stop
		    		area_points.clear();
		    		selected_points.clear();
		    		ordersList.clear();
		    		isAdding = false;
		    		area_selected = false;
		    		director.haltMovement();
		    	}

            }
            else if (event.type == sf::Event::Closed) {
                window.close();
            }
        }
        window.clear();

        //Acuator Position
        cv::Vec2d pos;
		pos = director.getCurrentPositionAC();
		//std::cout << pos << std::endl;
		auto actPos = sf::Vector2f((pos[0]+150.0)/300.0*640.0, (pos[1]+90.0)/180.0*480.0);
		sf::CircleShape actuator;
		actuator.setRadius(2);
		actuator.setFillColor(sf::Color::Green);		
		actuator.setPosition(actPos);
		window.draw(actuator);


		sf::Vector2f prevPos;
		//Actuator move path - create lines
		for(int j = 0; j < ordersList.size(); j++) {
			ActuatorMoveOrder &order = ordersList[j];
			//Adds new orders to the orderToAddList
			if(j != 0) {
				sf::Vector2f newPos = sf::Vector2f((order.posDeg[0]+150.0)/300.0*640.0, (order.posDeg[1]+90.0)/180.0*480.0);

				sf::Vertex linePoints[] = {prevPos, newPos};
				window.draw(linePoints, 2, sf::Lines);
				//std::cout<< prevPos.x << std::endl;
				prevPos = newPos;
			}
			else {
				prevPos = sf::Vector2f((order.posDeg[0]+150.0)/300.0*640.0, (order.posDeg[1]+90.0)/180.0*480.0);
			}
		}

        //Draws circles for the selected points
        for(int i = 0; i < selected_points.size(); i++) {
	        sf::CircleShape circle;
			circle.setRadius(1);
			circle.setFillColor(sf::Color::Red);
			circle.setOutlineColor(sf::Color::Red);
			circle.setOutlineThickness(1);
			circle.setPosition((selected_points[i])[0], (selected_points[i])[1]);
			window.draw(circle);
		}

		//Draw rectangle around selected points
		if(area_selected) {
			sf::RectangleShape rectangle;
			rectangle.setFillColor(sf::Color::Transparent);
			double width = ((area_points[1][0]+150.0)/300.0*640.0) - ((area_points[0][0]+150.0)/300.0*640.0);
			double height = ((area_points[1][1]+90.0)/180.0*480.0) - ((area_points[0][1]+90.0)/180.0*480.0);
			rectangle.setSize(sf::Vector2f(width, height));
			rectangle.setOutlineColor(sf::Color::Blue);
			rectangle.setOutlineThickness(1);
			rectangle.setPosition((area_points[0][0]+150.0)/300.0*640.0, (area_points[0][1]+90.0)/180.0*480.0);
			window.draw(rectangle);
		}

		//Draw x-y axis
		sf::Vertex x_axis[] = {sf::Vector2f(0, 240) , sf::Vector2f(640, 240)};
		sf::Vertex y_axis[] = {sf::Vector2f(320, 0) , sf::Vector2f(320, 480)}; 
		window.draw(x_axis, 2, sf::Lines);
		window.draw(y_axis, 2, sf::Lines);

		window.display();
    	
    }

}