#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <syslog.h>
#include <linux/fb.h>
#include <sys/mman.h>
#include "car_main.h"
#include "car_control.h"
int main( int argc , char **argv )
{
pthread_t control_thread ;
init_the_car();
init_server_socket();
if( (pthread_create( &control_thread , NULL , (void*)thread_control , NULL )) != 0 )
{
perror("Create the thread_control fail\n");
exit(1);
}
command=STOP;
sleep(1);
while(1)
{
receive_command();
}
close(server_socket_fd);
close(client_socket_fd);
close(car_fd);
close(pwm_fd);
close(ultrasonic_fd);
return 0;
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void init_the_car()
{
car_fd = open("/dev/car_driver", O_RDWR | O_NONBLOCK); // 打开设备
if (car_fd < 0)
{
perror("open car_driver fail");
exit(1);
}
command=STOP;
write( car_fd , &command , sizeof(command));
pwm_fd=open("/dev/pwm_driver", 0);
if(pwm_fd<0)
{
perror("open pwm_driver fail");
exit(1);
}
if(ioctl(pwm_fd,PWM_IOCTL_SET_FREQ,50)<0)
{
perror("execute the ioctl(PWM_IOCTL_SET_FREQ) fali:");
exit(1);
}
engine_angle = ( top_angle <<16) | bottom_angle;
if(ioctl(pwm_fd,PWM_IOCTL_SET_HOLLOW,engine_angle) < 0)
{
perror("init the car ioctl(PWM_IOCTL_SET_HOLLOW) fail");
//pthread_exit(NULL);
exit(1);
}
ultrasonic_fd=open("/dev/ultrasonic",O_RDWR | O_NONBLOCK);
if(ultrasonic_fd < 0 )
{
perror("/dev/ultrasonic file no exist\n");
exit(1);
}
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void init_server_socket()
{
int ret;
server_socket_fd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == server_socket_fd)
{
perror("socket");
exit(1);
}
printf("server_socket_fd id = %d",server_socket_fd);
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(HOSTPORT);
server_addr.sin_addr.s_addr = INADDR_ANY;
//server_addr.sin_addr.s_addr = htonl( INADDR_ANY );
bzero(&(server_addr.sin_zero),8);
ret = setsockopt( server_socket_fd , SOL_SOCKET , SO_REUSEADDR , &server_addr , sizeof( server_addr ) );
if( ret != 0 )
{
perror("setsockopt error");
exit(1);
}
ret = bind( server_socket_fd , (struct sockaddr*)&server_addr , sizeof(struct sockaddr) );
if (ret == -1)
{
perror("bind error");
exit(1);
}
printf("Bind success!\n");
ret = listen( server_socket_fd, MAX_CONNECTION );
if (ret == -1)
{
perror("listen error");
exit(1);
}
printf("listening......\n");
printf("Start accept\n");
sockaddr_in_length = sizeof(struct sockaddr_in);
client_socket_fd = accept(server_socket_fd, (struct sockaddr *)&client_addr, &sockaddr_in_length);
if( client_socket_fd == -1 )
{
perror( "create the client_socket_fd fail" );
exit( 1 );
}
printf("new connection client_socket_fd is %d\n",client_socket_fd);
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void receive_command()
{
if( command == EXIT)
{
close( client_socket_fd );
printf("accept again\n");
client_socket_fd = accept(server_socket_fd, (struct sockaddr *)&client_addr, &sockaddr_in_length);
if( client_socket_fd == -1 )
{
perror( "create the client_socket_fd fail\n" );
exit( 1 );
}
}
recv( client_socket_fd , &command , sizeof( command ), 0);
command_change = 1;
printf("recv the command is:%d\n", command );
}
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
void thread_control()
{
int temp;
int pre_engine_angle;
printf("Enter the thread_control\n");
while(1)
{
check_command:
switch(command)
{
case STOP:
//printf("stop model\n");
car_stop(car_fd);
break;
case GO:
printf("go model\n");
car_go(car_fd);
break;
case BACK:
printf("back model\n");
car_back(car_fd);
break;
case LEFT:
printf("left model\n");
car_left(car_fd);
break;
case RIGHT:
printf("right model\n");
car_right(car_fd);
break;
case CAM_UP :
top_angle++;
usleep( 1000 );
goto check_angle;
case CAM_DOWN :
top_angle--;
usleep( 1000 );
goto check_angle;
case CAM_LEFT :
bottom_angle++;
usleep( 1000 );
goto check_angle;
case CAM_RIGHT :
bottom_angle--;
usleep( 1000 );
goto check_angle;
case BREAK :
break;
case AUTO_MODE:
while(1)
{
car_auto(ultrasonic_fd,car_fd);
if(CTRL_MODE == command)
{
command=STOP;
break;
}
}
break;
default:
printf("stop model\n");
car_stop(car_fd);
break;
}
goto check_command;
check_angle:
if(top_angle<=TOP_MIN_ANGLE)
top_angle=TOP_MIN_ANGLE;
if(top_angle>=TOP_MAX_ANGLE)
top_angle=TOP_MAX_ANGLE;
if(bottom_angle<=BOTTOM_MIN_ANGLE)
bottom_angle=BOTTOM_MIN_ANGLE;
if(bottom_angle>=BOTTOM_MAX_ANGLE)
bottom_angle=BOTTOM_MAX_ANGLE;
engine_angle = ( top_angle <<16) | bottom_angle;
if( pre_engine_angle != engine_angle )
{
ioctl( pwm_fd , PWM_IOCTL_SET_HOLLOW , engine_angle);
printf( "top_angle is %d ,bottom_angle is %d\n",top_angle,bottom_angle );
}
pre_engine_angle = engine_angle ;
}
pthread_exit( NULL );
}
评论0