mitk::BaseProperty::Pointer TestSerialize(mitk::BaseProperty *property)
  {
    std::string serializername = std::string(property->GetNameOfClass()) + "Serializer";

    std::list<itk::LightObject::Pointer> allSerializers =
      itk::ObjectFactoryBase::CreateAllInstance(serializername.c_str());
    CPPUNIT_ASSERT_EQUAL(size_t(1), allSerializers.size());

    auto *serializer =
      dynamic_cast<mitk::BasePropertySerializer *>(allSerializers.begin()->GetPointer());
    CPPUNIT_ASSERT(serializer != nullptr);
    if (!serializer)
      return nullptr;

    serializer->SetProperty(property);
    TiXmlElement *serialization(nullptr);
    try
    {
      serialization = serializer->Serialize();
    }
    catch (...)
    {
    }
    CPPUNIT_ASSERT(serialization != nullptr);
    if (!serialization)
      return nullptr;

    mitk::BaseProperty::Pointer restoredProperty = serializer->Deserialize(serialization);
    CPPUNIT_ASSERT(restoredProperty.IsNotNull());
    return restoredProperty;
  }
Esempio n. 2
0
void reallocate_orders(int number_of_clients){
  if(number_of_clients == 1){
    for(int i = 0;i<6;i++){
      if(queue[i][0] == 1){
        queue[i][1] = 0;
      }
    }
  }
  else if(number_of_clients == 2){
    for(int i = 0;i<3;i++){
      if(queue[i][0] == 1)
        queue[i][1] = 0;
    }
    for(int i = 3;i<6;i++){
      if(queue[i][0] == 1){
        queue[i][1] = 1;
      }
    }
  }
  Message message_send; 
  char server_message[BUFSIZE];
    for(int i = 0;i<6;i++){
      message_send.orders[i][0] = queue[i][0];
      message_send.orders[i][1] = queue[i][1];
    }
  serialization(ORDER_UPDATE, message_send, server_message);
  for(int i = 0;i<clients;i++){
      write(client_sockets[i], server_message, strlen(server_message));  
  }
}
Esempio n. 3
0
SYSTEM::CSmartPtr<IRender> IRender::CopyNewRender()
{
	Carto::IRenderPtr pRend;
	SYSTEM::CBinArchive ar;

	serialization( ar );
	ar.SetReadState();
	ar.SetPosToBegin();
	pRend = CreateRenderFromStream( ar );

	return pRend;
}
Esempio n. 4
0
void check_clients(){
  int x[3] = {0};
  sleep(3);
  while(1){
    char net_check[BUFSIZE];
    Message message_send;
    serialization(NETCHECK, message_send, net_check);
    if(clients){
      for(int i = 0;i<clients;i++){
        write(client_sockets[i],net_check, strlen(net_check));
      }
      puts("NETCHECK");  
      sleep(10);

      /*for(int i = 0;i<clients;i++){
        if(client_checkin[i] == 0){
          printf("Client: %d didn't check in\n", i);
          //Remove from network
          x[i]++;
          if(x[i] == 2){
            close(client_sockets[i]);
            printf("Socket: %d closed\n", i );
            clients--;
            if((clients+1)==2 && i == 1){//Client 1 disconnected, client 2 will now be client 1
              elev_client[1].floor_current = elev_client[2].floor_current;
              Message message_send;
              message_send.type = ID_UPDATE;
              message_send.ID = i;
              client_sockets[1] = client_sockets[2];
              char server_message[BUFSIZE];
              serialization(ID_UPDATE, message_send, server_message);
              write(client_sockets[1], server_message, strlen(server_message));
            }
          //sleep(1);
          reallocate_orders(clients); 
          }
        }

        else
        {
          client_checkin[i] = 0;
        }
      }
      */
    }
  if(clients == 0){
    exit(1);
    }
  }
} 
Esempio n. 5
0
void button_check(){
	Message message_send;
	elev_button_type_t button_type;
	int floor;
	int button_is_pressed=0;
	puts("Button check thread started");
	while (1){
		for(floor = 0;floor<N_FLOORS;floor++){ 
			for(button_type = 0;button_type<N_BUTTONS;button_type++){ 
				if(elev_get_button_signal(button_type,floor)==1){
					if(button_type==BUTTON_INSIDE){ 
						elev_set_button_lamp(BUTTON_INSIDE,floor,1);
						elevator.queue[floor]=1;
						}
					pthread_mutex_lock(&mutex);
					button_is_pressed=1;
					message_send.button.floor=floor;
					message_send.button.type=button_type;
					pthread_mutex_unlock(&mutex);
					while(elev_get_button_signal(button_type,floor));
					break;
				}
			}
			if(button_is_pressed)
				break;
		}
		if(button_is_pressed){ 
			
			puts("Button is pressed, creating thread\n");
			button_is_pressed=0;
			char transmit[BUFSIZE];
			serialization(BUTTON_CHECK, message_send, transmit);
			pthread_t message_send_thread;
    		pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit);	
			if(message_send.button.type==BUTTON_INSIDE){
				FILE *fp;
			   fp = fopen("local_order_queue.txt", "w+");
			   fprintf(fp,"%d %d %d %d", elevator.queue[0], elevator.queue[1], elevator.queue[2], elevator.queue[3] );
			   fclose(fp);
    		}
		}
		if(!connection){
			break;
		}

	} 			
}
Esempio n. 6
0
void check_clients(){
  sleep(3);
  while(1){
    char net_check[BUFSIZE];
    Message message_send;
    serialization(NETCHECK, message_send, net_check);
    if(clients){
      for(int i = 0;i<clients;i++){
        write(client_sockets[i],net_check, strlen(net_check));
      }
      puts("NETCHECK");  
      sleep(10);
    }
  if(clients == 0){
    exit(1);
    }
  }
} 
Esempio n. 7
0
void *order_counter(void *x){
  char *buf = (char*)x;
  char server_message[BUFSIZE];
  Message message_send;
  char order_and_ID[2];
  for(int i = 0;i<2;i++){
    order_and_ID[i] = buf[i];
  }
  puts("Order counter");
  sleep(20);
  if(queue[order_and_ID[0]][0]!=0 && queue[order_and_ID[0]][1]==order_and_ID[1]){//Check if order is not taken and ID is correct
    printf("Client: %d did not finish order", order_and_ID[1]);
    if(clients == 1){
      queue[order_and_ID[0]][1] = 0;
      for(int i = 0;i<6;i++){
        message_send.orders[i][0] = queue[i][0];
        message_send.orders[i][1] = queue[i][1]; 
      }
    }
    else{
      if(queue[order_and_ID[0]][1] == 0){
        queue[order_and_ID[0]][1] = 1;
        for(int i = 0;i<6;i++){
          message_send.orders[i][0] = queue[i][0];
          message_send.orders[i][1] = queue[i][1]; 
        }  
      }
      else{
        queue[order_and_ID[0]][1] = 0;
        for(int i = 0;i<6;i++){
          message_send.orders[i][0] = queue[i][0];
          message_send.orders[i][1] = queue[i][1]; 
        }  
      }
    }
    serialization(ORDER_UPDATE, message_send, server_message);
    write(client_sockets[0], server_message, strlen(server_message));   
  }
  else
    puts("order done");
}
Esempio n. 8
0
void elevator_thread(){
	int sum=0;
	int stop=0;
	Message message_send;
 	elevator.queue[0] = 0;
	elevator.queue[1] = 0;
	elevator.queue[2] = 0;
	elevator.queue[3] = 0;
 	FILE *fp;
   	char buff[255];

   fp = fopen("local_order_queue.txt", "a+");
	for(int i=0;i<N_FLOORS;i++){
	   fscanf(fp, "%s", buff);
	   printf("%d : %s\n", i, buff );
	   if(buff[0] == '1'){
		   elevator.queue[i]=1;
		   sum++;
		}
		else
			elevator.queue[i]=0;
   	}
   fclose(fp);
	
	if(!sum){
		elev_init();
		elevator.floor_current = 0;
		elevator.direction=DIRN_STOP;
	}
	message_send.elevator.direction = elevator.direction;
	message_send.elevator.floor_current = elevator.floor_current;
	
	char transmit[BUFSIZE];
	serialization(ELEV_UPDATE, message_send, transmit);
	pthread_t message_send_thread;
	pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit);
	
	int floor_update_not_sent=1;
	while(1){
		if(sum != 0){
			elevator.floor_current = elev_get_floor_sensor_signal();
			int orders_up=0;
			int orders_down=0;
			if(elevator.direction == DIRN_STOP){
				for(int i=elevator.floor_current+1;i<N_FLOORS;i++){
					if(elevator.queue[i] != 0){
						orders_up++;
						puts("Order up");
					}

				}
				for( int i=elevator.floor_current-1;i>=0;i--){
					if(elevator.queue[i] != 0){
						orders_down++;
						puts("Order down");
					}
				}
				if (orders_up == 0 && orders_down == 0){
				elevator.direction=DIRN_STOP;
				}
				else if(orders_up>orders_down){
					elevator.direction=DIRN_UP;
					puts("DIRN UP");
				}
			
				else{
					elevator.direction=DIRN_DOWN;
					puts("DIRN DOWN");
				}
			}
			for(int i=0;i<N_FLOORS;i++){
				message_send.elevator.queue[i]=elevator.queue[i];
			}
			message_send.elevator.direction = elevator.direction;
			message_send.elevator.floor_current = elevator.floor_current;
			char transmit[BUFSIZE];
			serialization(ELEV_UPDATE, message_send, transmit);
			pthread_t message_send_thread;
			pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit);	
			
			elev_set_motor_direction(elevator.direction);		
		}

		while(sum){
			elevator.floor_current=elev_get_floor_sensor_signal();
			if(elevator.floor_current!=-1){
				elev_set_floor_indicator(elevator.floor_current);
				if((elevator.floor_current==0 && elevator.direction==DIRN_DOWN) || (elevator.floor_current==N_FLOORS&&elevator.direction==DIRN_UP)){
					elevator.direction=DIRN_STOP;
					elev_set_motor_direction(elevator.direction);
					stop=1;
				}
				if(elevator.queue[elevator.floor_current]==1){
					stop=1;
				}
				else if(elevator.queue[elevator.floor_current]==2){
					sum=0;
					if(elevator.direction==DIRN_UP){
						for(int i=elevator.floor_current;i<N_FLOORS;i++){
							if(elevator.queue[i]==1){
								sum++;
							}
						}
						switch (elevator.floor_current){
							case 1:
								if(elev_orders[elevator.floor_current][1]==my_ID){
									stop=1;
									break;
								}
							case 2:
							if(elev_orders[elevator.floor_current][1]==my_ID){
									stop=1;
									break;
								}
							default:
								if(sum==0){
									stop=1;
								}
						}
					}
					else if(elevator.direction==DIRN_DOWN){
						for(int i=elevator.floor_current;i>=0;i--){
							if(elevator.queue[i]==1){
								sum++;
							}
						}
						switch (elevator.floor_current){
							case 1:
								if(elev_orders[elevator.floor_current+2][1]==my_ID){
									stop=1;
									break;
								}
							case 2:
							if(elev_orders[elevator.floor_current+2][1]==my_ID){
									stop=1;
									break;
								}
							default:
								if(sum==0){
									stop=1;
								}
						}
					}					
				}
				if(stop){
					stop=0;
					elev_set_motor_direction(DIRN_STOP);
					elev_set_button_lamp(BUTTON_INSIDE,elevator.floor_current,0);
					elevator.queue[elevator.floor_current]=0;
					printf("Elevator queue updated: \t");
					sum = 0;
					for(int i=0;i<N_FLOORS;i++){
						message_send.elevator.queue[i]=elevator.queue[i];
						sum+=elevator.queue[i];
						printf("%d ", elevator.queue[i]);		
					}

					FILE *fp;
			   		fp = fopen("local_order_queue.txt", "w+");
			   		fprintf(fp,"%d %d %d %d", elevator.queue[0], elevator.queue[1], elevator.queue[2], elevator.queue[3] );
			   		fclose(fp);
					
					message_send.elevator.prev_direction = elevator.direction;	
					elevator.direction = DIRN_STOP;
					message_send.elevator.direction = elevator.direction;
					message_send.elevator.floor_current = elevator.floor_current;
					printf("Floor current: %d\n", message_send.elevator.floor_current);

					for(int i = 0;i<6;i++){
						message_send.orders[i][0] = elev_orders[i][0];
						message_send.orders[i][1] = elev_orders[i][1];
					}
					switch (elevator.floor_current){
						case 0:
							message_send.orders[0][0] = 0;
							message_send.orders[0][1] = my_ID;
							elevator.next_direction = DIRN_UP;
							break;
						case 1:
							if(elev_orders[1][1] == my_ID){
								message_send.orders[1][0] = 0;
								message_send.orders[1][1] = my_ID;
								elevator.next_direction = DIRN_UP;
							}
							else {
								message_send.orders[3][0] = 0;
								message_send.orders[3][1] = my_ID;
								elevator.next_direction = DIRN_DOWN;
							}
							break;
						case 2:
							if(elev_orders[2][1] == my_ID){
								message_send.orders[2][0] = 0;
								message_send.orders[2][1] = my_ID;
								elevator.next_direction = DIRN_UP;
							}
							else {
								message_send.orders[4][0] = 0;
								message_send.orders[4][1] = my_ID;
								elevator.next_direction = DIRN_DOWN;
							}
							break;							
						case 3:
							message_send.orders[5][0] = 0;
							message_send.orders[5][1] = my_ID;
							elevator.next_direction = DIRN_DOWN;
							break;
					}
					puts("ORDER UPDATE");
       				for(int i = 0;i<6;i++){
          				printf("Order: %d \t ID: %d\n",message_send.orders[i][0], message_send.orders[i][1]);
        			}
					
					char transmit[BUFSIZE];
					serialization(ORDER_UPDATE, message_send, transmit);
					pthread_t message_send_thread;
					pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit);	
					
					floor_update_not_sent=0;
					elev_set_door_open_lamp(1);
				    elev_set_button_lamp(BUTTON_INSIDE,elevator.floor_current,0);
				    sleep(2);
				    elev_set_door_open_lamp(0);
				    sum = 0;
				    switch (elevator.next_direction){
				    	case DIRN_DOWN:
				    		for(int i = elevator.floor_current;i>=0;i--){
				    			sum += elevator.queue[i];
				    		}
				    		if(sum!=0){
				    			elevator.direction = DIRN_DOWN;
				    		}
				    		else {
				    			for(int i = elevator.floor_current;i<N_FLOORS;i++){
				    				sum+=elevator.queue[i];
				    			}
				    			if(sum!=0)
				    				elevator.direction = DIRN_UP;
				    		}
				    		break;
				    	case DIRN_UP:
				    		for(int i = elevator.floor_current;i<N_FLOORS;i++){
				    			sum += elevator.queue[i];
				    		}
				    		if(sum!=0){
				    			elevator.direction = DIRN_UP;
				    		}
				    		else {
				    			for(int i = elevator.floor_current;i>=0;i--){
				    				sum+=elevator.queue[i];
				    			}
				    			if(sum!=0)
				    				elevator.direction = DIRN_DOWN;
				    		}
				    		break;
				    }
				    elev_set_motor_direction(elevator.direction);
				}
				else if(floor_update_not_sent){
					message_send.elevator.direction = elevator.direction;
					message_send.elevator.prev_direction = elevator.direction;
					message_send.elevator.floor_current = elevator.floor_current;
					
					char transmit[BUFSIZE];
					serialization(ELEV_UPDATE, message_send, transmit);
					pthread_t message_send_thread;
					pthread_create(&message_send_thread, NULL , tcp_send, (void*)transmit);	
					floor_update_not_sent=0;
				}
			}
			else
				floor_update_not_sent=1;
		}
	
		for(int i=0;i<N_FLOORS;i++){		
				sum+=elevator.queue[i];
		}

		if(!connection){
			break;
		}
	}
}
Esempio n. 9
0
 IGL_INLINE void deserialize(igl::viewer::ViewerCore& obj,const std::vector<char>& buffer)
 {
   serialization(false,obj,const_cast<std::vector<char>&>(buffer));
 }
Esempio n. 10
0
 IGL_INLINE void serialize(const igl::viewer::ViewerCore& obj,std::vector<char>& buffer)
 {
   serialization(true,const_cast<igl::viewer::ViewerCore&>(obj),buffer);
 }
Esempio n. 11
0
 IGL_INLINE void deserialize(ViewerData& obj,const std::vector<char>& buffer)
 {
   serialization(false,obj,const_cast<std::vector<char>&>(buffer));
   obj.dirty = ViewerData::DIRTY_ALL;
 }
Esempio n. 12
0
 IGL_INLINE void serialize(const ViewerData& obj,std::vector<char>& buffer)
 {
   serialization(true,const_cast<ViewerData&>(obj),buffer);
 }
Esempio n. 13
0
void *master_connection_handler(void *socket_desc){ //Connection handler for TCP connections

  //Get the socket descriptor
  int client_id = clients-1;
  int sock = *(int*)socket_desc;
  int read_size;
  char client_message[BUFSIZE], *message;

  sleep(1);
  client_message[0] = (clients-1)+'0';
  write(sock , client_message , strlen(client_message)); //Give client ID
  
  bzero(client_message,BUFSIZE); 

  struct timeval tv;
  tv.tv_sec = 11;  // 11 Secs Timeout 
  tv.tv_usec = 0;
  setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); 

  //Receive a message from client
  while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){
    Message message_send,message_receive;
    message_receive = deserialization(client_message);
    switch(message_receive.type){
      case BUTTON_CHECK: 
        
        printf("Reciever Button floor & type: ");
        printf("%d ",message_receive.button.floor);
        printf("%d \n",message_receive.button.type);
        switch(message_receive.button.type){
          case BUTTON_INSIDE:
            break;
          default:
            if(add_to_queue(message_receive.button.type, message_receive.button.floor)){

              char server_message[BUFSIZE];
              for(int i = 0;i<6;i++){
                message_send.orders[i][0] = queue[i][0];
                message_send.orders[i][1] = queue[i][1];
              }

              message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor);
              printf("Which client gets the order: %d",message_send.ID);
              message_send.elevator.new_floor_order=message_receive.button.floor;

              pthread_t order_counter_thread;
              char order_and_ID[2];
              order_and_ID[1] = message_send.ID;
              if(message_receive.button.type==BUTTON_CALL_UP){
                queue[message_receive.button.floor][1] = message_send.ID;
                queue[message_receive.button.floor][0] = 1;
                message_send.orders[message_receive.button.floor][1] = message_send.ID;
                order_and_ID[0] = message_receive.button.floor;
                pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID);
              }
              else{
                queue[message_receive.button.floor+2][1] = message_send.ID;
                queue[message_receive.button.floor+2][0] = 1;
                message_send.orders[message_receive.button.floor+2][1] = message_send.ID;
                order_and_ID[0] = message_receive.button.floor+2;
                pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID);
              }

              serialization(ELEV_ORDER, message_send, server_message);
              for(int i = 0;i<clients;i++){
                write(client_sockets[i], server_message, strlen(server_message));  
              }
              
              
            } 
          }
              
        break;
      case ELEV_UPDATE:
        //Only updates elevator location
        printf("ELEV FLOOR UPDATE BY ELEVATOR #%d\n",client_id);

        elev_client[client_id].floor_current = message_receive.elevator.floor_current;
        elev_client[client_id].direction = message_receive.elevator.direction;

        for(int i = 0;i<clients;i++){
          printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); 
        }

        break;
      case ORDER_UPDATE:
        //Clears orders that are done and sets lamps

        elev_client[client_id].floor_current = message_receive.elevator.floor_current;
        elev_client[client_id].direction = message_receive.elevator.direction;

        for(int i = 0;i<clients;i++){
          printf("Elevator #%d \t Floor current: %d \t Direction: %1d\n", i,elev_client[i].floor_current,(int)elev_client[i].direction); 
        }

        for(int i = 0;i<6;i++){
          queue[i][0] &= message_receive.orders[i][0];
          if(!(queue[i][0]&&message_receive.orders[i][0]))
            queue[i][1] = -1;

        }
        puts("\nNew queue");
        for(int i = 0;i<6;i++){
          printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]);

        }
        message_send.ID = -1;
        for(int i = 0;i<6;i++){
            message_send.orders[i][0] = queue[i][0];
            message_send.orders[i][1] = queue[i][1];
        }
        char server_message[BUFSIZE];
        serialization(ELEV_ORDER, message_send, server_message);
        for(int i = 0;i<clients;i++){
            write(client_sockets[i], server_message, strlen(server_message));  
        }
        break;
      case NETCHECK:
        client_checkin[client_id] = 1;
        break;
      case ID_UPDATE:
        client_id = message_receive.ID;
        break;  
    }    
    bzero(client_message,BUFSIZE);
  }
    
  if(read_size == 0){
      puts("Client disconnected");
      clients--;
      fflush(stdout);
      printf("#Clients: %d\n",clients);
      if(client_id == 0){
        system("gnome-terminal -x ./elevator 0");
      }
      else{ 
        if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1
          elev_client[1].floor_current = elev_client[2].floor_current;
          Message message_send;
          message_send.type = ID_UPDATE;
          message_send.ID = client_id;
          client_sockets[1] = client_sockets[2];
          char server_message[BUFSIZE];
          serialization(ID_UPDATE, message_send, server_message);
          write(client_sockets[1], server_message, strlen(server_message));
        }
        reallocate_orders(clients); 
      }
  }
  else if(read_size == -1){
      clients--;
      perror("recv failed, handler");
      printf("Client id: %d", client_id);
      printf("#Clients: %d\n",clients); 
      if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1
        elev_client[1].floor_current = elev_client[2].floor_current;
        Message message_send;
        message_send.type = ID_UPDATE;
        message_send.ID = client_id;
        client_sockets[1] = client_sockets[2];
        char server_message[BUFSIZE];
        serialization(ID_UPDATE, message_send, server_message);
        write(client_sockets[1], server_message, strlen(server_message));
      }
      reallocate_orders(clients); 
  }
       
  //Free the socket pointer
  free(socket_desc);
   
  return 0;
}
Esempio n. 14
0
void* client_message_handler(void *msg_recv){
	puts("Client message handler started");
	pthread_mutex_init(&mutex,NULL);
	char receive[BUFSIZE];
	bzero(receive,BUFSIZE);
	char *buf = (char*)msg_recv;
	for(int i = 0;i<BUFSIZE;i++){
		receive[i] = buf[i];
	}
	Message message_receive = deserialization(receive);
	switch(message_receive.type){
		case ELEV_ORDER:
			puts("ELEV ORDER");
			elev_set_button_lamp(BUTTON_CALL_UP, 0, message_receive.orders[0][0]);
			elev_set_button_lamp(BUTTON_CALL_UP, 1, message_receive.orders[1][0]);
			elev_set_button_lamp(BUTTON_CALL_UP, 2, message_receive.orders[2][0]);
			elev_set_button_lamp(BUTTON_CALL_DOWN, 1, message_receive.orders[3][0]);
			elev_set_button_lamp(BUTTON_CALL_DOWN, 2, message_receive.orders[4][0]);
			elev_set_button_lamp(BUTTON_CALL_DOWN, 3, message_receive.orders[5][0]);

			for(int i=0;i<6;i++){ //Global queue			 
				elev_orders[i][0] = message_receive.orders[i][0];
				elev_orders[i][1] = message_receive.orders[i][1];
				queue[i][0] = message_receive.orders[i][0];
				queue[i][1] = message_receive.orders[i][1];
			}
			puts("\nNew queue");
        	for(int i = 0;i<6;i++){
          		printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]);
       		 }

			printf("Message_recieve.ID: %d\n", message_receive.ID);
			printf("My ID: %d\n", my_ID);

			if(message_receive.ID==my_ID){ //Sets local queue based on ID
				puts("Order recieved");
				pthread_mutex_lock(&mutex);
				if(elevator.queue[elevator.floor_current]==0){
					elevator.queue[message_receive.elevator.new_floor_order]=2;
				}
				pthread_mutex_unlock(&mutex);
				//elevator.new_floor_order=1;
			}
			
		
			break;
		case ORDER_UPDATE:
			puts("ORDER UPDATE");
			for(int i=0;i<6;i++){ //Global queue			 
				elev_orders[i][0] = message_receive.orders[i][0];
				elev_orders[i][1] = message_receive.orders[i][1];
				if(my_ID == message_receive.orders[i][1]){
					if(i == 0){
						if(elevator.queue[0]==0){
							elevator.queue[0] = 1;
						}
					}
					else if(i == 1 || i == 3){
						if(elevator.queue[1]==0){
							elevator.queue[1] = 1;
						}
					}
					else if(i == 2 || i == 4){
						if(elevator.queue[2]==0){
							elevator.queue[2] = 1;
						}
					}
					else if(i == 5)
						if(elevator.queue[3]==0){
							elevator.queue[3] = 1;
						}
				}
			}
			printf("Elev queue: ");
			for(int i = 0;i<N_FLOORS;i++){
				printf("%d ",elevator.queue[i]);
			}
			printf("\n");

			break;
		case BUTTON_LAMP:
				puts("BUTTON LAMP");
				elev_set_button_lamp(BUTTON_CALL_UP, 0, message_receive.orders[0][0]);
				elev_set_button_lamp(BUTTON_CALL_UP, 1, message_receive.orders[1][0]);
				elev_set_button_lamp(BUTTON_CALL_UP, 2, message_receive.orders[2][0]);
				elev_set_button_lamp(BUTTON_CALL_DOWN, 1, message_receive.orders[3][0]);
				elev_set_button_lamp(BUTTON_CALL_DOWN, 2, message_receive.orders[4][0]);
				elev_set_button_lamp(BUTTON_CALL_DOWN, 3, message_receive.orders[5][0]);
				break;
		case ID_UPDATE:
			puts("ID UPDATE");
			my_ID = message_receive.ID;
			char id_upd[BUFSIZE];
			Message message_send_ID;
			message_send_ID.ID = my_ID;
			serialization(ID_UPDATE, message_send_ID, id_upd);
			pthread_t message_send_thread_ID;
			pthread_create(&message_send_thread_ID, NULL , tcp_send, (void*)id_upd);
			break;
		case NETCHECK:
			puts("NETCHECK");
			master_checkin = 1;
			char net_check[BUFSIZE];
			Message message_send;
			serialization(NETCHECK, message_send, net_check);
			pthread_t message_send_thread;
			pthread_create(&message_send_thread, NULL , tcp_send, (void*)net_check);
			sleep(6);
			master_checkin = 0;
			sleep(5);
			if(master_checkin == 0){
				puts("Master disconnected\n");
				connection = 0;
			}
			break;
	}
}
Esempio n. 15
0
int main( int argc, char** argv )
{
    ::setenv( "PYLON_ROOT", STRINGIZED( BASLER_PYLON_DIR ), 0 );
    ::setenv( "GENICAM_ROOT_V2_1", STRINGIZED( BASLER_PYLON_GENICAM_DIR ), 0 );
    try
    {
        unsigned int id;
        std::string address;
        std::string setAttributes;
        unsigned int discard;
        boost::program_options::options_description description( "options" );
        unsigned int packet_size;
        unsigned int exposure;
        unsigned int gain;
        unsigned int offset_x;
        unsigned int offset_y;
        unsigned int width;
        unsigned int height;
        std::string frame_trigger;
        std::string line_trigger;
        unsigned int line_rate;
        double timeout_seconds;
        description.add_options()
            ( "help,h", "display help message" )
            ( "address", boost::program_options::value< std::string >( &address ), "camera ip address; default: connect to the first available camera" )
            ( "discard", "discard frames, if cannot keep up; same as --buffer=1" )
            ( "buffer", boost::program_options::value< unsigned int >( &discard )->default_value( 0 ), "maximum buffer size before discarding frames, default: unlimited" )
            ( "list-cameras", "output camera list and exit" )
            ( "fields,f", boost::program_options::value< std::string >( &options.fields )->default_value( "t,rows,cols,type" ), "header fields, possible values: t,rows,cols,type,size,counters" )
            ( "image-type", boost::program_options::value< std::string >( &options.type )->default_value( "3ub" ), "image type, e.g. '3ub'; also see --long-help for details" )
            ( "offset-x", boost::program_options::value< unsigned int >( &offset_x )->default_value( 0 ), "offset in pixels in the line" )
            ( "offset-y", boost::program_options::value< unsigned int >( &offset_y )->default_value( 0 ), "offset in lines in the frame" )
            ( "width", boost::program_options::value< unsigned int >( &width )->default_value( std::numeric_limits< unsigned int >::max() ), "line width in pixels; default: max" )
            ( "height", boost::program_options::value< unsigned int >( &height )->default_value( std::numeric_limits< unsigned int >::max() ), "number of lines in frame (in chunk mode always 1); default: max" )
            ( "frame-trigger", boost::program_options::value< std::string >( &frame_trigger ), "'line1', 'line2', 'line3', 'encoder'" ) //; if absent while --line-trigger present, same as --line-trigger" )
            ( "line-trigger", boost::program_options::value< std::string >( &line_trigger ), "'line1', 'line2', 'line3', 'encoder'" )
            ( "line-rate", boost::program_options::value< unsigned int >( &line_rate ), "line aquisition rate" )
            ( "encoder-ticks", boost::program_options::value< unsigned int >( &encoder_ticks ), "number of encoder ticks until the counter resets (reused for line number in frame in chunk mode)" )
            ( "header-only", "output header only" )
            ( "no-header", "output image data only" )
            ( "packet-size", boost::program_options::value< unsigned int >( &packet_size ), "mtu size on camera side, should be not greater than your lan and network interface set to" )
            ( "exposure", boost::program_options::value< unsigned int >( &exposure )->default_value( 100 ), "exposure" )
            ( "gain", boost::program_options::value< unsigned int >( &gain )->default_value( 100 ), "gain" )
            ( "timeout", boost::program_options::value< double >( &timeout_seconds )->default_value( 3.0 ), " frame acquisition timeout" )
            ( "test-colour", "output colour test image" )
            ( "verbose,v", "be more verbose" );
        boost::program_options::variables_map vm;
        boost::program_options::store( boost::program_options::parse_command_line( argc, argv, description), vm );
        boost::program_options::parsed_options parsed = boost::program_options::command_line_parser(argc, argv).options( description ).allow_unregistered().run();
        boost::program_options::notify( vm );
        if ( vm.count( "help" ) || vm.count( "long-help" ) )
        {
            std::cerr << "acquire images from a basler camera (for now gige only)" << std::endl;
            std::cerr << "output to stdout as serialized cv::Mat" << std::endl;
            std::cerr << std::endl;
            std::cerr << "usage: basler-cat [<options>] [<filters>]" << std::endl;
            std::cerr << std::endl;
            std::cerr << description << std::endl;
            if( vm.count( "long-help" ) )
            {
                std::cerr << std::endl;
                std::cerr << snark::cv_mat::filters::usage() << std::endl;
                std::cerr << std::endl;
                std::cerr << snark::cv_mat::serialization::options::type_usage() << std::endl;
            }
            std::cerr << std::endl;
            std::cerr << "note: there is a glitch or a subtle feature in basler line camera:" << std::endl;
            std::cerr << "      - power-cycle camera" << std::endl;
            std::cerr << "      - view colour images: it works" << std::endl;
            std::cerr << "      - view grey-scale images: it works" << std::endl;
            std::cerr << "      - view colour images: it still displays grey-scale" << std::endl;
            std::cerr << "      even in their native viewer you need to set colour image" << std::endl;
            std::cerr << "      repeatedly and with pure luck it works, but we have not" << std::endl;
            std::cerr << "      managed to do it in software; the remedy: power-cycle the camera" << std::endl;
            std::cerr << std::endl;
            return 1;
        }
        verbose = vm.count( "verbose" );
        if( verbose )
        {
            std::cerr << "basler-cat: PYLON_ROOT=" << ::getenv( "PYLON_ROOT" ) << std::endl;
            std::cerr << "basler-cat: GENICAM_ROOT_V2_1=" << ::getenv( "GENICAM_ROOT_V2_1" ) << std::endl;
            std::cerr << "basler-cat: initializing camera..." << std::endl;
        }
        Pylon::PylonAutoInitTerm auto_init_term;
        Pylon::CTlFactory& factory = Pylon::CTlFactory::GetInstance();
        Pylon::ITransportLayer* transport_layer( Pylon::CTlFactory::GetInstance().CreateTl( Pylon::CBaslerGigECamera::DeviceClass() ) );        
        if( !transport_layer )
        { 
            std::cerr << "basler-cat: failed to create transport layer" << std::endl;
            std::cerr << "            most likely PYLON_ROOT and GENICAM_ROOT_V2_1 environment variables not set" << std::endl;
            std::cerr << "            point them to your pylon installation, e.g:" << std::endl;
            std::cerr << "            export PYLON_ROOT=/opt/pylon" << std::endl;
            std::cerr << "            export GENICAM_ROOT_V2_1=/opt/pylon/genicam" << std::endl;
            return 1;
        }
        if( vm.count( "list-cameras" ) )
        {
            Pylon::DeviceInfoList_t devices;
            factory.EnumerateDevices( devices );
            for( unsigned int i = 0; i < devices.size(); ++i ) { std::cerr << devices[i].GetFullName() << std::endl; }
            return 0;
        }
        timeout = timeout_seconds * 1000.0;
        std::string filters = comma::join( boost::program_options::collect_unrecognized( parsed.options, boost::program_options::include_positional ), ';' );
        options.header_only = vm.count( "header-only" );
        options.no_header = vm.count( "no-header" );
        csv = comma::csv::options( argc, argv );
        bool chunk_mode =    csv.has_field( "counters" ) // quick and dirty
                          || csv.has_field( "adjusted-t" )
                          || csv.has_field( "line" )
                          || csv.has_field( "line-count" )
                          || csv.has_field( "ticks" )
                          || csv.has_field( "counters/adjusted-t" )
                          || csv.has_field( "counters/line" )
                          || csv.has_field( "counters/line-count" )
                          || csv.has_field( "counters/ticks" );
        if( chunk_mode )
        {
            if( vm.count( "encoder-ticks" ) == 0 ) { std::cerr << "basler-cat: chunk mode, please specify --encoder-ticks" << std::endl; return 1; }
            if( !filters.empty() ) { std::cerr << "basler-cat: chunk mode, cannot handle filters; use: basler-cat | cv-cat <filters> instead" << std::endl; return 1; }
            if( height != 1 && height != std::numeric_limits< unsigned int >::max() ) { std::cerr << "basler-cat: only --height=1 implemented in chunk mode" << std::endl; return 1; }
            height = 1;
            std::vector< std::string > v = comma::split( csv.fields, ',' );
            std::string format;
            for( unsigned int i = 0; i < v.size(); ++i )
            {
                if( v[i] == "t" ) { v[i] = "header/" + v[i]; format += "t"; }
                else if( v[i] == "rows" || v[i] == "cols" || v[i] == "size" || v[i] == "type" ) { v[i] = "header/" + v[i]; format += "ui"; }
                else if( v[i] == "adjusted-t" ) { v[i] = "counters/" + v[i]; format += "t"; }
                else if( v[i] == "line-count" || v[i] == "ticks" ) { v[i] = "counters/" + v[i]; format += "ul"; }
                else if( v[i] == "line" ) { v[i] = "counters/" + v[i]; format += "ui"; }
                else { std::cerr << "basler-cat: expected field, got '" << v[i] << "'" << std::endl; return 1; }
            }
            csv.fields = comma::join( v, ',' );
            csv.full_xpath = true;
            csv.format( format );
        }
        if( !vm.count( "buffer" ) && vm.count( "discard" ) ) { discard = 1; }
        Pylon::CBaslerGigECamera camera;
        if( vm.count( "address" ) )
        {
            Pylon::CBaslerGigEDeviceInfo info;
            info.SetIpAddress( address.c_str() );
            camera.Attach( factory.CreateDevice( info ) );
        }
        else
        {
            Pylon::DeviceInfoList_t devices;
            factory.EnumerateDevices( devices );
            if( devices.empty() ) { std::cerr << "basler-cat: no camera found" << std::endl; return 1; }
            std::cerr << "basler-cat: will connect to the first of " << devices.size() << " found device(s):" << std::endl;
            for( unsigned int i = 0; i < devices.size(); ++i ) { std::cerr << "    " << devices[i].GetFullName() << std::endl; }
            camera.Attach( transport_layer->CreateDevice( devices[0] ) );
        }
        if( verbose ) { std::cerr << "basler-cat: initialized camera" << std::endl; }
        if( verbose ) { std::cerr << "basler-cat: opening camera " << camera.GetDevice()->GetDeviceInfo().GetFullName() << "..." << std::endl; }
        camera.Open();
        if( verbose ) { std::cerr << "basler-cat: opened camera " << camera.GetDevice()->GetDeviceInfo().GetFullName() << std::endl; }
        Pylon::CBaslerGigECamera::StreamGrabber_t grabber( camera.GetStreamGrabber( 0 ) );
        grabber.Open();
        unsigned int channels;
        switch( options.get_header().type ) // quick and dirty
        {
            case CV_8UC1:
                channels = set_pixel_format_( camera, Basler_GigECamera::PixelFormat_Mono8 );
                break;
            case CV_8UC3:
                channels = set_pixel_format_( camera, Basler_GigECamera::PixelFormat_RGB8Packed );
                break;
            default:
                std::cerr << "basler-cat: type \"" << options.type << "\" not implemented or not supported by camera" << std::endl;
                return 1;
        }
        unsigned int max_width = camera.Width.GetMax();
        if( offset_x >= max_width ) { std::cerr << "basler-cat: expected --offset-x less than " << max_width << ", got " << offset_x << std::endl; return 1; }
        camera.OffsetX.SetValue( offset_x );
        width = ( ( unsigned long long )( offset_x ) + width ) < max_width ? width : max_width - offset_x;
        camera.Width.SetValue( width );
        unsigned int max_height = camera.Height.GetMax();
        //if( height < 512 ) { std::cerr << "basler-cat: expected height greater than 512, got " << height << std::endl; return 1; }
        
        // todo: is the colour line 2098 * 3 or ( 2098 / 3 ) * 3 ?
        //offset_y *= channels;
        //height *= channels;
        
        if( offset_y >= max_height ) { std::cerr << "basler-cat: expected --offset-y less than " << max_height << ", got " << offset_y << std::endl; return 1; }
        camera.OffsetY.SetValue( offset_y );
        height = ( ( unsigned long long )( offset_y ) + height ) < max_height ? height : ( max_height - offset_y );
        camera.Height.SetValue( height );
        if( verbose ) { std::cerr << "basler-cat: set width,height to " << width << "," << height << std::endl; }
        if( vm.count( "packet-size" ) ) { camera.GevSCPSPacketSize.SetValue( packet_size ); }
        // todo: giving up... the commented code throws, but failure to stop acquisition, if active
        //       seems to lead to the following scenario:
        //       - power-cycle camera
        //       - view colour images: it works
        //       - view grey-scale images: it works
        //       - view colour images: it still displays grey-scale
        //if( verbose ) { std::cerr << "basler-cat: getting aquisition status... (frigging voodoo...)" << std::endl; }
        //GenApi::IEnumEntry* acquisition_status = camera.AcquisitionStatusSelector.GetEntry( Basler_GigECamera::AcquisitionStatusSelector_AcquisitionActive );
        //if( acquisition_status && GenApi::IsAvailable( acquisition_status ) && camera.AcquisitionStatus() )
        //{
        //    if( verbose ) { std::cerr << "basler-cat: stopping aquisition..." << std::endl; }
        //    camera.AcquisitionStop.Execute();
        //    if( verbose ) { std::cerr << "basler-cat: aquisition stopped" << std::endl; }
        //}
        
        // todo: a hack for now
        GenApi::IEnumEntry* acquisitionStart = camera.TriggerSelector.GetEntry( Basler_GigECamera::TriggerSelector_AcquisitionStart );
        if( acquisitionStart && GenApi::IsAvailable( acquisitionStart ) )
        {
            camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_AcquisitionStart );
            camera.TriggerMode.SetValue( frame_trigger.empty() ? Basler_GigECamera::TriggerMode_Off : Basler_GigECamera::TriggerMode_On );
        }
        GenApi::IEnumEntry* frameStart = camera.TriggerSelector.GetEntry( Basler_GigECamera::TriggerSelector_FrameStart );
        if( frameStart && GenApi::IsAvailable( frameStart ) )
        {
            //if( frame_trigger.empty() ) { frame_trigger = line_trigger; }
            if( frame_trigger.empty() )
            {
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_FrameStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_Off );
            }
            else
            {
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_FrameStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_On );
                Basler_GigECamera::TriggerSourceEnums t;
                if( frame_trigger == "line1" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line1 ); }
                if( frame_trigger == "line2" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line2 ); }
                if( frame_trigger == "line3" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line3 ); }
                else if( frame_trigger == "encoder" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_ShaftEncoderModuleOut ); }
                else { std::cerr << "basler-cat: frame trigger '" << frame_trigger << "' not implemented or invalid" << std::endl; return 1; }
                camera.TriggerActivation.SetValue( Basler_GigECamera::TriggerActivation_RisingEdge );
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_LineStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_On );
                camera.TriggerActivation.SetValue( Basler_GigECamera::TriggerActivation_RisingEdge );
                if( frame_trigger == "encoder" )
                {
                    // todo: make configurable
                    camera.ShaftEncoderModuleLineSelector.SetValue( Basler_GigECamera::ShaftEncoderModuleLineSelector_PhaseA );
                    camera.ShaftEncoderModuleLineSource.SetValue( Basler_GigECamera::ShaftEncoderModuleLineSource_Line1 );
                    camera.ShaftEncoderModuleLineSelector.SetValue( Basler_GigECamera::ShaftEncoderModuleLineSelector_PhaseB );
                    camera.ShaftEncoderModuleLineSource.SetValue( Basler_GigECamera::ShaftEncoderModuleLineSource_Line2 );
                    camera.ShaftEncoderModuleCounterMode.SetValue( Basler_GigECamera::ShaftEncoderModuleCounterMode_FollowDirection );
                    camera.ShaftEncoderModuleMode.SetValue( Basler_GigECamera::ShaftEncoderModuleMode_ForwardOnly );
                    camera.ShaftEncoderModuleCounterMax.SetValue( encoder_ticks - 1 );
                    /// @todo compensate for mechanical jitter, if needed
                    ///       see Runner_Users_manual.pdf, 8.3, Case 2
                    camera.ShaftEncoderModuleReverseCounterMax.SetValue( 0 );
                    camera.ShaftEncoderModuleCounterReset.Execute();
                    camera.ShaftEncoderModuleReverseCounterReset.Execute();
                }
            }
        }
        GenApi::IEnumEntry* lineStart = camera.TriggerSelector.GetEntry( Basler_GigECamera::TriggerSelector_LineStart );
        if( lineStart && GenApi::IsAvailable( lineStart ) )
        {
            if( line_trigger.empty() )
            {
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_LineStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_Off );
            }
            else
            {
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_LineStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_On );
                Basler_GigECamera::TriggerSourceEnums t;
                if( line_trigger == "line1" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line1 ); }
                else if( line_trigger == "line2" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line2 ); }
                else if( line_trigger == "line3" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_Line3 ); }
                else if( line_trigger == "encoder" ) { camera.TriggerSource.SetValue( Basler_GigECamera::TriggerSource_ShaftEncoderModuleOut ); }
                else { std::cerr << "basler-cat: line trigger '" << line_trigger << "' not implemented or invalid" << std::endl; return 1; }
                camera.TriggerActivation.SetValue( Basler_GigECamera::TriggerActivation_RisingEdge );
                camera.TriggerSelector.SetValue( Basler_GigECamera::TriggerSelector_LineStart );
                camera.TriggerMode.SetValue( Basler_GigECamera::TriggerMode_On );
                camera.TriggerActivation.SetValue( Basler_GigECamera::TriggerActivation_RisingEdge );
            }
        }
        if( chunk_mode )
        {
            std::cerr << "basler-cat: setting chunk mode..." << std::endl;
            if( !GenApi::IsWritable( camera.ChunkModeActive ) ) { std::cerr << "basler-cat: camera does not support chunk features" << std::endl; camera.Close(); return 1; }
            camera.ChunkModeActive.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_Framecounter );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_Timestamp );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_LineTriggerIgnoredCounter );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_FrameTriggerIgnoredCounter );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_LineTriggerEndToEndCounter );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_FrameTriggerCounter );
            camera.ChunkEnable.SetValue( true );
            camera.ChunkSelector.SetValue( Basler_GigECameraParams::ChunkSelector_FramesPerTriggerCounter );
            camera.ChunkEnable.SetValue( true );
            parser = camera.CreateChunkParser();
            if( !parser ) { std::cerr << "basler-cat: failed to create chunk parser" << std::endl; camera.Close(); return 1; }
            std::cerr << "basler-cat: set chunk mode" << std::endl;
        }
        camera.ExposureMode.SetValue( Basler_GigECamera::ExposureMode_Timed );
        if( vm.count( "exposure" ) ) { camera.ExposureTimeRaw.SetValue( exposure ); } // todo? auto exposure (see ExposureAutoEnums)
        if( vm.count( "gain" ) )
        { 
            camera.GainSelector.SetValue( Basler_GigECamera::GainSelector_All );
            camera.GainRaw.SetValue( gain );
            if( channels == 3 ) // todo: make configurable; also is not setting all not enough?
            {
                camera.GainSelector.SetValue( Basler_GigECamera::GainSelector_Red );
                camera.GainRaw.SetValue( gain );
                camera.GainSelector.SetValue( Basler_GigECamera::GainSelector_Green );
                camera.GainRaw.SetValue( gain );
                camera.GainSelector.SetValue( Basler_GigECamera::GainSelector_Blue );
                camera.GainRaw.SetValue( gain );
            }
        }
        if( vm.count( "line-rate" ) ) { camera.AcquisitionLineRateAbs.SetValue( line_rate ); }
        if( vm.count( "test-colour" ) ) { camera.TestImageSelector.SetValue( Basler_GigECamera::TestImageSelector_Testimage6 ); }
        else { camera.TestImageSelector.SetValue( Basler_GigECamera::TestImageSelector_Off ); }
        unsigned int payload_size = camera.PayloadSize.GetValue();
        if( verbose )
        { 
            std::cerr << "basler-cat: camera mtu size: " << camera.GevSCPSPacketSize.GetValue() << std::endl;
            std::cerr << "basler-cat: exposure: " << camera.ExposureTimeRaw.GetValue() << std::endl;
            std::cerr << "basler-cat: payload size: " << payload_size << std::endl;
        }
        std::vector< std::vector< char > > buffers( 2 ); // todo? make number of buffers configurable
        for( std::size_t i = 0; i < buffers.size(); ++i ) { buffers[i].resize( payload_size ); }
        grabber.MaxBufferSize.SetValue( buffers[0].size() );
        grabber.SocketBufferSize.SetValue( 127 );
        if( verbose )
        { 
            std::cerr << "basler-cat: socket buffer size: " << grabber.SocketBufferSize.GetValue() << std::endl;
            std::cerr << "basler-cat: max buffer size: " << grabber.MaxBufferSize.GetValue() << std::endl;
        }
        grabber.MaxNumBuffer.SetValue( buffers.size() ); // todo: use --buffer value for number of buffered images
        grabber.PrepareGrab(); // image size now must not be changed until FinishGrab() is called.
        std::vector< Pylon::StreamBufferHandle > buffer_handles( buffers.size() );
        for( std::size_t i = 0; i < buffers.size(); ++i )
        { 
            buffer_handles[i] = grabber.RegisterBuffer( &buffers[i][0], buffers[i].size() );
            grabber.QueueBuffer( buffer_handles[i], NULL );
        }
        if( chunk_mode )
        {
            snark::tbb::bursty_reader< ChunkPair > read( boost::bind( &capture_< ChunkPair >, boost::ref( camera ), boost::ref( grabber ) ), discard );
            tbb::filter_t< ChunkPair, void > write( tbb::filter::serial_in_order, boost::bind( &write_, _1 ) );
            snark::tbb::bursty_pipeline< ChunkPair > pipeline;
            camera.AcquisitionMode.SetValue( Basler_GigECamera::AcquisitionMode_Continuous );
            camera.AcquisitionStart.Execute(); // continuous acquisition mode        
            if( verbose ) { std::cerr << "basler-cat: running in chunk mode..." << std::endl; }
            pipeline.run( read, write );
            if( verbose ) { std::cerr << "basler-cat: shutting down..." << std::endl; }
            camera.AcquisitionStop();
            camera.DestroyChunkParser( parser );
        }
        else
        {
            snark::cv_mat::serialization serialization( options );
            snark::tbb::bursty_reader< Pair > reader( boost::bind( &capture_< Pair >, boost::ref( camera ), boost::ref( grabber ) ), discard );
            snark::imaging::applications::pipeline pipeline( serialization, filters, reader );
            camera.AcquisitionMode.SetValue( Basler_GigECamera::AcquisitionMode_Continuous );
            camera.AcquisitionStart.Execute(); // continuous acquisition mode        
            if( verbose ) { std::cerr << "basler-cat: running..." << std::endl; }
            pipeline.run();
            if( verbose ) { std::cerr << "basler-cat: shutting down..." << std::endl; }
            camera.AcquisitionStop();
        }
        if( verbose ) { std::cerr << "basler-cat: acquisition stopped" << std::endl; }
        is_shutdown = true;
        while( !done ) { boost::thread::sleep( boost::posix_time::microsec_clock::universal_time() + boost::posix_time::milliseconds( 100 ) ); }
        grabber.FinishGrab();
        Pylon::GrabResult result;
        while( grabber.RetrieveResult( result ) ); // get all buffers back
        for( std::size_t i = 0; i < buffers.size(); ++i ) { grabber.DeregisterBuffer( buffer_handles[i] ); }
        grabber.Close();
        camera.Close();
        if( verbose ) { std::cerr << "basler-cat: done" << std::endl; }
        return 0;
    }
    catch( std::exception& ex ) { std::cerr << "basler-cat: " << ex.what() << std::endl; }
    catch( ... ) { std::cerr << "basler-cat: unknown exception" << std::endl; }
    return 1;
}
Esempio n. 16
0
void CotMapCtrl::LoadGWF(LPCTSTR filename)
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());
    
	//打开工程文件
	CFile file;
	if(!file.Open(filename,CFile::modeRead))
	{
        return;
	}

	//关闭之前的map
	if(m_pGeomap)
	{
		m_pGeomap.reset();
	}
    CString PrjPath =filename;
	CString basePath =PrjPath.Left(PrjPath.ReverseFind(_T('\\'))+1);

	_bstr_t strPath =basePath;
	//设置参考路径
	SYSTEM::CRelativePath::SetBasePath(strPath);

	CArchive ar(&file,CArchive::load);

	unsigned long Size;
	ar >> Size;

	BYTE * pStart = new BYTE[Size];

	ar.Read( pStart , Size );

	SYSTEM::CBinArchive bin( pStart , Size );

	bin.SetReadState();

	serialization(bin,SERIEALIZE_MAP);

	ar.Close ();
	file.Close ();

	//读取图元
	CString strELFPath = filename;
	int iResult = strELFPath.Replace( _T("GWF"), _T("ELF"));

	if ( iResult == 1 && _waccess( strELFPath, 0) == 0 )
	{
		CFile fileElF(strELFPath,CFile::modeRead);
		CArchive arELF(&fileElF,CArchive::load);

		
		arELF >> Size;

		BYTE * pbuffer = new BYTE[Size];

		arELF.Read( pbuffer , Size );

		SYSTEM::CBinArchive ebin( pbuffer , Size );

		ebin.SetReadState();

		serialization(ebin,SERIEALIZE_MAPELEMENT);

		arELF.Close ();
		fileElF.Close ();

		
	}
Esempio n. 17
0
void *master_connection_handler(void *socket_desc){ 

  int client_id = clients-1;
  int sock = *(int*)socket_desc;
  int read_size;
  char client_message[BUFSIZE], *message;

  sleep(1);
  client_message[0] = (clients-1)+'0';
  write(sock , client_message , strlen(client_message)); //Give client ID
  bzero(client_message,BUFSIZE); 

  //Set up timed socket
  struct timeval tv;
  tv.tv_sec = 11;
  tv.tv_usec = 0;
  setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO,(char *)&tv,sizeof(tv)); 

  while( (read_size = recv(sock , client_message , BUFSIZE , 0)) > 0 ){
    Message message_send,message_receive;
    message_receive = deserialization(client_message);

    switch(message_receive.type){
      case BUTTON_CHECK: 
          if(add_to_queue(message_receive.button.type, message_receive.button.floor)){

            char server_message[BUFSIZE];
            for(int i = 0;i<6;i++){
              message_send.orders[i][0] = queue[i][0];
              message_send.orders[i][1] = queue[i][1];
            }

            message_send.ID = cost_function(message_receive.button.type, message_receive.button.floor);
            message_send.elevator.new_floor_order=message_receive.button.floor;

            pthread_t order_counter_thread;
            char order_and_ID[2];
            order_and_ID[1] = message_send.ID;

            //Starts counter on each order
            if(message_receive.button.type==BUTTON_CALL_UP){
              queue[message_receive.button.floor][1] = message_send.ID;
              queue[message_receive.button.floor][0] = 1;
              message_send.orders[message_receive.button.floor][1] = message_send.ID;
              order_and_ID[0] = message_receive.button.floor;
              pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID);
            }
            else{
              queue[message_receive.button.floor+2][1] = message_send.ID;
              queue[message_receive.button.floor+2][0] = 1;
              message_send.orders[message_receive.button.floor+2][1] = message_send.ID;
              order_and_ID[0] = message_receive.button.floor+2;
              pthread_create(&order_counter_thread, NULL, order_counter, (void*)order_and_ID);
            }

            serialization(ELEV_ORDER, message_send, server_message);
            for(int i = 0;i<clients;i++){
              write(client_sockets[i], server_message, strlen(server_message));  
            }
          }    
        break;
      case ELEV_UPDATE: //Updates elevator location

        elev_client[client_id].floor_current = message_receive.elevator.floor_current;
        elev_client[client_id].direction = message_receive.elevator.direction;

        break;
      case ORDER_UPDATE: //Clears orders that are done and sets lamps
        
        elev_client[client_id].floor_current = message_receive.elevator.floor_current;
        elev_client[client_id].direction = message_receive.elevator.direction;

        for(int i = 0;i<6;i++){
          queue[i][0] &= message_receive.orders[i][0];
          if(!(queue[i][0]&&message_receive.orders[i][0]))
            queue[i][1] = -1;

        }
        puts("\nNew queue");
        for(int i = 0;i<6;i++){
          printf("Order: %d \t ID: %d\n",queue[i][0],queue[i][1]);

        }
        message_send.ID = -1;
        for(int i = 0;i<6;i++){
            message_send.orders[i][0] = queue[i][0];
            message_send.orders[i][1] = queue[i][1];
        }
        char server_message[BUFSIZE];
        serialization(ELEV_ORDER, message_send, server_message);
        for(int i = 0;i<clients;i++){
            write(client_sockets[i], server_message, strlen(server_message));  
        }
        break;
      case NETCHECK:
        break;
      case ID_UPDATE:
        client_id = message_receive.ID;
        break;  
    }    
    bzero(client_message,BUFSIZE);
  }
    
  if(read_size == 0){
      puts("Client disconnected, terminal exit");
      clients--;
      fflush(stdout);
      printf("#Clients: %d\n",clients);
      if(client_id == 0){
        system("gnome-terminal -x ./elevator 0");
      }
      else{ 
        if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1
          elev_client[1].floor_current = elev_client[2].floor_current;
          Message message_send;
          message_send.type = ID_UPDATE;
          message_send.ID = client_id;
          client_sockets[1] = client_sockets[2];
          char server_message[BUFSIZE];
          serialization(ID_UPDATE, message_send, server_message);
          write(client_sockets[1], server_message, strlen(server_message));
        }   
      }
      sleep(1);
      reallocate_orders(clients); 

      Message message_send; 
      char server_message[BUFSIZE];
      for(int i = 0;i<6;i++){
        message_send.orders[i][0] = queue[i][0];
        message_send.orders[i][1] = queue[i][1];
      }
      serialization(ORDER_UPDATE, message_send, server_message);
      for(int i = 0;i<clients;i++){
          write(client_sockets[i], server_message, strlen(server_message));  
      }
  }
  else if(read_size == -1){
      clients--;
      perror("Network connection lost");
      printf("Client id: %d", client_id);
      printf("#Clients: %d\n",clients); 
      if((clients+1)==2 && client_id == 1){//Client 1 disconnected, client 2 will now be client 1
        elev_client[1].floor_current = elev_client[2].floor_current;
        Message message_send;
        message_send.type = ID_UPDATE;
        message_send.ID = client_id;
        client_sockets[1] = client_sockets[2];
        char server_message[BUFSIZE];
        serialization(ID_UPDATE, message_send, server_message);
        write(client_sockets[1], server_message, strlen(server_message));
      }
      sleep(1);
      reallocate_orders(clients); 

      Message message_send; 
      char server_message[BUFSIZE];
      for(int i = 0;i<6;i++){
        message_send.orders[i][0] = queue[i][0];
        message_send.orders[i][1] = queue[i][1];
      }
      serialization(ORDER_UPDATE, message_send, server_message);
      for(int i = 0;i<clients;i++){
          write(client_sockets[i], server_message, strlen(server_message));  
      }
  }
       
  //Free the socket pointer
  free(socket_desc);
   
  return 0;
}
Esempio n. 18
0
int main(int argc, char * argv[])
{

    if (argc != 2) {
        std::cerr << "Usage: " << argv[0] << " GlobalManagerIP" << std::endl;
        exit(-1);
    }

    //*
    // before we start, estimate overhead related to serialization and de-serialization of parameters
    osaTimeServer timeServer;
    std::stringstream serializationStream;
    cmnSerializer serialization(serializationStream);
    cmnDeSerializer deSerialization(serializationStream);
    unsigned int index;
    prmPositionCartesianGet parameter;
    cmnGenericObject * generated;
    timeServer.SetTimeOrigin();
    for (index = 0; index < confNumberOfSamples; index++) {
        serialization.Serialize(parameter);
        generated = deSerialization.DeSerialize();
        if (generated->Services() != parameter.Services()) {
            std::cout << "Serialization test failed!" << std::endl;
            exit(0);
        }
        // delete generated object created by de-serialization
        delete generated;
    }
    double elapsedTime = timeServer.GetRelativeTime();
    std::cout << std::endl << std::endl
              << "Serialization, dynamic creation and deserialization time for "
              << confNumberOfSamples << " samples of " << parameter.Services()->GetName()
              << ": " << cmnInternalTo_ms(elapsedTime) << " (ms)" << std::endl
              << "Per sample: " << cmnInternalTo_ms(elapsedTime / confNumberOfSamples) << " (ms)" << std::endl
              << std::endl << std::endl;
    //*/

    // networking part
    std::string globalTaskManagerIP(argv[1]);

    // Log configuration
    cmnLogger::SetMask(CMN_LOG_ALLOW_ERRORS_AND_WARNINGS);
    cmnLogger::SetMaskFunction(CMN_LOG_ALLOW_ERRORS_AND_WARNINGS);

    // create our server task
    clientTask * client = new clientTask("Client", confClientPeriod);

    // Get the TaskManager instance and set operation mode
    mtsTaskManager * taskManager = mtsTaskManager::GetInstance();
    taskManager->AddComponent(client);

    // Connect the tasks across networks
    taskManager->Connect("Client", "Required", "Server", "Provided");

    // create the tasks, i.e. find the commands
    taskManager->CreateAll();
    // start the periodic Run
    taskManager->StartAll();

    // run while the benchmarks are not over
    while (!(client->IsBenchmarkCompleted())) {
        osaSleep(10.0 * cmn_ms);
    }

    // cleanup
    taskManager->Cleanup();
    taskManager->KillAll();

    // To prevent crash due to CMN_LOG_CLASS (cmnLODOutputMultiplexer).
    osaSleep(0.5 * cmn_s);

    return 0;
}