Example #1
0
void	Hardware_Init( void )
{
	System_Init();
	Vbl_Init();
	Video_Init();
	IKBD_Init();
	Graphic_Init();
}
int main(int argc, char **argv)
{
	struct sockaddr_in addr;
	int opt, result;

	char dest_addr[OPT_BUF_SIZE + 1] = "127.0.0.1";
	char dest_port[OPT_BUF_SIZE + 1] = "3425";
	unsigned char joystickID = 0;	/* Default joystick Id */

	/* Init SDL */
	if( SDL_Init( SDL_INIT_EVERYTHING ) == -1 )
	{
		return 1;
	}

	/* Init SDL_ttf */
	if( TTF_Init() != 0 )
	{
		return 1;
	}

	while (-1 != (opt = getopt(argc, argv, "hJj:i:p:"))) {
		switch (opt) {
		/* Show help */
		case '?':
		case 'h':
			puts("help: ");
			return 0;
		/* Show available joysticks */
		case 'J':
			/* Check for joysticks */
			if( SDL_NumJoysticks() < 1 ) {
				printf( "Joysticks discovering: No joysticks connected!\n" );
			}
			else {
				printf( "Joysticks discovering: %d joysticks found!\n", SDL_NumJoysticks());
				int i;
				printf("ID  DEVICE NAME\n");
				for (i = 0; i < SDL_NumJoysticks(); i++) {
					printf( "%d - %s\n", i, SDL_JoystickNameForIndex(i));
				}
			}
			return 0;
			break;
		/* Choise joystick by id */
		case 'j':
			joystickID = atoi(optarg);
			break;
		/* Set destination ip addres */
		case 'i':
			snprintf(dest_addr, OPT_BUF_SIZE, "%s", optarg);
			break;
		/* Set destination port */
		case 'p':
			snprintf(dest_port, OPT_BUF_SIZE, "%s", optarg);
			break;
		default:
			break;
		}
	}

    sock = socket(AF_INET, SOCK_STREAM, 0);
    if(sock < 0) {
       perror("Socket");
       return 1;
    }

    addr.sin_family = AF_INET;
    addr.sin_addr.s_addr = inet_addr(dest_addr);
    addr.sin_port = htons(atoi(dest_port));

    printf("Connecting %s:%s...\n", dest_addr, dest_port);

    if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {
        perror("Connect");
        return 2;
    }

    puts("Connected!");
	puts("press ENTER to exit");

	/* Telemetry thread creating */
	result = pthread_create(&telemetry_thread, NULL, thread_telemetry, NULL);
	if (result != 0) {
		perror("Creating the thread");
		return 1;
	}

	/* Check for joysticks */
	if( SDL_NumJoysticks() < 1 ) {
		printf( "Warning: No joysticks connected!\n" );
	}
	else {
		/* Open joystick */
		if( SDL_JoystickOpen( joystickID ) == NULL ) {
			printf( "Warning: Unable to open game controller!\n" );
			//SDL_JoystickEventState(SDL_ENABLE);
		}

		/* Joystick control thread creating */
		result = pthread_create(&joystick_thread, NULL, thread_joystick_control, NULL);
		if (result != 0) {
			perror("Creating the thread");
			return 1;
		}
	}

	Graphic_Init();

	while(1) {
	   	if( SDL_PollEvent( &event ) ) {
	        if( event.type == SDL_KEYDOWN ) {
	        	/* We don't use keybord repeat events */
	        	if ( !event.key.repeat ) {
	            switch( event.key.keysym.sym ) {
	                case SDLK_UP:
	                	chassis_state = FORWARD;
	                	thread_id = 1;
	                	//sprintf(thread_commands[thread_id], "run=F,%d,%d\n", run_speed, run_time);
	                	puts("UP");
	                	result = pthread_create(&thread, NULL, thread_command_send, &thread_id);
	                	if (result != 0) {
	                		perror("Creating the thread");
	                		return 1;
	                	}
	                	SET_DIGITAL_INPUT;
	                	break;
	                case SDLK_DOWN:
	                	chassis_state = BACKWARD;
	                	thread_id = 2;
	                	//sprintf(thread_commands[thread_id], "run=B,%d,%d\n", run_speed, run_time);
	                	puts("DOWN");
	                	result = pthread_create(&thread, NULL, thread_command_send, &thread_id);
	                	if (result != 0) {
	                		perror("Creating the thread");
	                		return 1;
	                	}
	                	SET_DIGITAL_INPUT;
	                	break;
	                case SDLK_LEFT:
	                	steer_pos = LEFT_STEER_POS;
	                	sprintf(single_command, "steer=%d\n", steer_pos);
	                	send(sock, single_command, strlen(single_command), 0);
	                	puts("LEFT");
	                	break;
	                case SDLK_RIGHT:
	                	steer_pos = RIGHT_STEER_POS;
	                	sprintf(single_command, "steer=%d\n", steer_pos);
	                	//single_command = strbuf;
	                	send(sock, single_command, strlen(single_command), 0);
	                	puts("RIGHT");
	                	break;
	                case SDLK_PAGEUP:
	                	thread_id = 1;
	                	result = pthread_create(&thread, NULL, thread_speed_change, &thread_id);
	                	if (result != 0) {
	                		perror("Creating the thread");
	                		return 1;
	                	}
	                	break;
	                case SDLK_PAGEDOWN:
	                	thread_id = 2;
	                	result = pthread_create(&thread, NULL, thread_speed_change, &thread_id);
	                	if (result != 0) {
	                		perror("Creating the thread");
	                		return 1;
	                	}
	                	break;
	                case SDLK_RETURN:
	                	Quit();
	                	return 0;
	                	break;
	                default:
	                	break;
	            	}
	        	}
	        }
			else if( event.type == SDL_KEYUP ) {
				/* We don't use keybord repeat events */
				if ( !event.key.repeat ) {
	            switch( event.key.keysym.sym ) {
	                case SDLK_UP:
	                	chassis_state = NONE;
	                	puts("STOP");
	                	//UpdateScreen(0.0, NONE, run_speed);
	                	break;
	                case SDLK_DOWN:
	                	chassis_state = NONE;
	                	puts("STOP");
	                	//UpdateScreen(0.0, NONE, run_speed);
	                	break;
	                case SDLK_LEFT:
	                case SDLK_RIGHT:
	                	steer_pos = CENTER_STEER_POS;
	                	sprintf(single_command, "steer=%d\n", steer_pos);
	                	send(sock, single_command, strlen(single_command), 0);
	                	//UpdateScreen(0.0, NONE, run_speed);
	                	puts("CENTER");
	                	break;
	                case SDLK_PAGEUP:
	                case SDLK_PAGEDOWN:
	                	/*
	                	result = pthread_cancel(thread3);
	                	if (result != 0) {
	                		perror("Cancelling the thread");
	                		return 1;
	                	}
	                	*/
	                	break;
	                default:
	                	break;
	            	}
				}
	        }
	        else if( event.type == SDL_QUIT ) {
	        	Quit();
	  			return 0;
	        }
	        else if( event.type ==  SDL_JOYAXISMOTION ) {
	        	//Motion on controller 0
	        	if( event.jaxis.which == joystickID ) {
	        		unsigned short value = 0;
	        		switch (event.jaxis.axis) {
	        		/* Steering axis */
	        		case 3:
	        			value = CENTER_STEER_POS + ((( RIGHT_STEER_POS - LEFT_STEER_POS ) / 2 ) * \
	        						event.jaxis.value ) / 32768;
	        			/* Joystick steer treshold protection */
	        			if ( ABS( steer_pos - value ) > JOYSTICK_STEER_TRESHOLD_VALUE ) {
	        				steer_pos = value;
						printf("steer_pos = %d\n", steer_pos);
	        				sprintf(single_command, "steer=%d\n", steer_pos);
	        				send(sock, single_command, strlen(single_command), 0);
	        			}
	        			break;
	        		/* Speed & direction axis */
	        		case 2:
	        			if ( event.jaxis.value < 0 ) {
	        				run_direction = "F";
	        				chassis_state = FORWARD;
	        				//run_speed = (( 0 - event.jaxis.value )  * 255 ) / 32768;
	        				//printf("%d\n",0 - event.jaxis.value ); // debug
	        			}
	        			else if ( event.jaxis.value > 0 ) {
	        				run_direction = "B";
	        				chassis_state = BACKWARD;
	        				//run_speed = ((event.jaxis.value )  * 255 ) / 32767;
	        				//printf("%d\n", event.jaxis.value ); // debug
	        			}
	        			else {
	        				chassis_state = NONE;
	        			}
	        			value = ( ABS(event.jaxis.value)  * ( 255 - JOYSTICK_RUN_DEADZONE_VALUE ) ) / 32768 + JOYSTICK_RUN_DEADZONE_VALUE;
	        			printf("%d\n", ABS(event.jaxis.value) ); // debug
	        			/* Joystick run treshold protection */
	        			if ( ABS( run_speed - value ) > JOYSTICK_RUN_TRESHOLD_VALUE ) {
	        				run_speed = value;
	        				sprintf(single_command, "run=%s,%d,%d\n", run_direction, run_speed, run_time);
	        				send(sock, single_command, strlen(single_command), 0);
	        				SET_ANALOG_INPUT;
	        			}
	        			break;
	        		/* Turret axis */
					case 0:
						if (turret_state == STOP) {
							turn_speed = 150;
						}
						else {
							value = ( ABS(event.jaxis.value)  * ( 200 - TURRET_HOR_DC_DEADZONE_VALUE ) ) / 32768 + TURRET_HOR_DC_DEADZONE_VALUE;
							printf("%d\n", ABS(event.jaxis.value) ); // debug
							turn_speed = value;
						}

						if ( event.jaxis.value < 0 ) {
							turn_direction = "R";
							turret_state = RIGHT;
						}
						else if ( event.jaxis.value > 0 ) {
							turn_direction = "L";
							turret_state = LEFT;
						}
						else {
							turret_state = STOP;
						}

						/* Joystick run treshold protection */
						if ( ABS( turn_speed - value ) > TURRET_HOR_DC_TRESHOLD_VALUE ) {
							sprintf(single_command, "turhdc=%s,%d,%d\n", turn_direction, turn_speed, turn_time);
							send(sock, single_command, strlen(single_command), 0);
						}
						SET_ANALOG_INPUT;
						break;
					/* Turret axis */
	        		case 1:
	        			break;
	        		}
	        	}
	        }
	        else if( event.type ==  SDL_JOYBUTTONDOWN ) {
	        	//Motion on controller 0
	        	if( event.jaxis.which == joystickID ) {

	        	}
	        }
	    }
	UpdateScreen((double)((0 - CENTER_STEER_POS + steer_pos) / 6), chassis_state, run_speed, 0);
	}
return 0;
}