#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <termios.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <time.h>
#include <ctype.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <linux/i2c-dev.h>
#include <linux/i2c.h>
#include <pthread.h>
#include <strings.h>
#include <unistd.h>
#include <string.h>

pthread_mutex_t g_mutex = PTHREAD_MUTEX_INITIALIZER;
//int tty_fd[3] = {0};
int tty_fd1 = -1;
int tty_fd2 = -1;
int tty_fd3 = -1;

pthread_t tty_pid[6] = {0};

#define FALSE 0;
#define TRUE 1;
int a[2] = {0};

int ConBaurate(unsigned long int baudrate)
{
switch (baudrate)
{
case 2400:
return B2400;
case 4800:
return B4800;
case 9600:
return B9600;
case 19200:
return B19200;
case 38400:
return B38400;
case 57600:
return B57600;
case 115200:
return B115200;
case 230400:
return B230400;
default:
return B115200;
}
}

int OpenTTY(char *dev, int baudrate)
{
int fdcom = 0;
struct termios termios_old, termios_new;
int tmpbaudrate, tmp;
char databit, stopbit, parity;
bzero(&termios_old, sizeof(termios_old));
bzero(&termios_new, sizeof(termios_new));
fdcom = open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK | O_NDELAY);
if (fdcom < 0)
{
printf("open %s failed", dev);
return fdcom;
}

cfmakeraw(&termios_new);
tcgetattr(fdcom, &termios_old); // get the serial port

// attributions

// baudrates
tmpbaudrate = ConBaurate(baudrate);
cfsetispeed(&termios_new, tmpbaudrate);
cfsetospeed(&termios_new, tmpbaudrate);
termios_new.c_cflag |= (CLOCAL | CREAD);
termios_new.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
/*
* fctl = pportinfo-> fctl; switch(fctl){ case '0':{
* termios_new.c_cflag &= ~CRTSCTS; //no flow control }break; case
* '1':{ termios_new.c_cflag |= CRTSCTS; //hardware flow control
* }break; case '2':{ termios_new.c_iflag |= IXON | IXOFF |IXANY;
* //software flow control }break; }
*/

termios_new.c_cflag &= ~CSIZE;
databit = 8;
switch (databit)
{
case '5':
termios_new.c_cflag |= CS5;
case '6':
termios_new.c_cflag |= CS6;
case '7':
termios_new.c_cflag |= CS7;
default:
termios_new.c_cflag |= CS8;
}

parity = 0;
switch (parity)
{
case '0':
{
termios_new.c_cflag &= ~PARENB; // no parity check
}
break;
case '1':
{
termios_new.c_cflag |= PARENB; // odd check
termios_new.c_cflag |= PARODD;
}
break;
case '2':
{
termios_new.c_cflag |= PARENB; // even check
termios_new.c_cflag = ~PARODD;
}
break;
case '3':
{
termios_new.c_cflag = ~PARENB; // space check
}
}

stopbit = '1';
if (stopbit == '2')
{
termios_new.c_cflag |= CSTOPB; // 2 stop bits
}
else
{
termios_new.c_cflag &= ~CSTOPB; // 1 stop bits
}

// other attributions default
termios_new.c_oflag &= ~OPOST;
termios_new.c_oflag &= ~(ONLCR | ICRNL);
termios_new.c_iflag &= ~(ICRNL | INLCR);
termios_new.c_iflag &= ~(IXON | IXOFF | IXANY);
termios_new.c_cc[VMIN] = 0;
termios_new.c_cc[VTIME] = 0;
tcflush(fdcom, TCIFLUSH);
tmp = tcsetattr(fdcom, TCSANOW, &termios_new);
return fdcom;
}

//初始化串口
unsigned char UART_Init()
{
tty_fd1 = OpenTTY("/dev/ttyS2", 115200); //可见光
if (-1 == tty_fd1)
{
puts("init ttyS2 failed");
return FALSE;
}
else
{
puts("init ttyS2 successed");
}

tty_fd2 = OpenTTY("/dev/ttyS4", 230400); //陀螺板
if (-1 == tty_fd2)
{
puts("init ttyS4 failed");
return FALSE;
}
else
{
puts("init ttyS4 successed");
}

tty_fd3 = OpenTTY("/dev/ttyS3", 230400); //飞机端

if (-1 == tty_fd3)
{
puts("init ttyS3 failed");
return FALSE;
}
else
{
puts("init ttyS3 successed");
}

return TRUE;
}

int SendUartBuffer(int serial_fd, unsigned char* pData, int len)
{
return write(serial_fd, pData, len);
}


int RecvUartBuffer(int serial_fd, unsigned char* pData, int len)
{
int ret = -1;
ret = read(serial_fd, pData, len);
return ret;
}


static void *thread_start_ttyS2(void *arg)
{
printf("thread_start_ttyS2!\n");
unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
int len = sizeof(pData);
int writeLen = 0;
// printf("len = %d\n",len);
while(1)
{
// writeLen = SendUartBuffer(tty_fd1, pData, len);
//usleep(400);
pthread_mutex_lock(&g_mutex);
a[0] = 1;
printf("-------a[0] = %d--------\n",a[0]);
sleep(4);
pthread_mutex_unlock(&g_mutex);

}
}

// static void *thread_start_ttys2_read()
// {
// unsigned char readData[255] = {0};
// char buf[1024] = {0};
// int readLen = 0;
// while(1)
// {
// readLen = RecvUartBuffer(tty_fd1, readData, 255);
// if(readLen > 0) {
// printf("readLen = %d ",readLen);
// for(int i =0; i < readLen; i++) {
// printf("%02X ",readData[i]);
// }
// printf("\n");
// bzero(readData,sizeof(readData));
// }
// usleep(400);
// // sleep(1);
// }
// }


// static void *thread_start_ttyS3(void *arg)
// {
// unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
// int len = sizeof(pData);
// int writeLen = 0;
// printf("len = %d\n",len);
// while(1)
// {
// writeLen = SendUartBuffer(tty_fd3, pData, len);
// //usleep(400);
// usleep(100);
// }

// }

// static void *thread_start_ttys3_read()
// {
// unsigned char readData[255] = {0};
// char buf[1024] = {0};
// int readLen = 0;
// while(1)
// {
// readLen = RecvUartBuffer(tty_fd3, readData, 255);
// if(readLen > 0) {
// printf("readLen = %d ",readLen);
// for(int i =0; i < readLen; i++) {
// printf("%02X ",readData[i]);
// }
// printf("\n");
// bzero(readData,sizeof(readData));
// }
// usleep(400);
// // sleep(1);
// }
// }



static void *thread_start_ttyS4(void *arg)
{
unsigned char pData[] = {0xFE,0x55,0x01,0x00,0x04,0x01,0x02,0x1C,0x00,0x02,0x73,0x02,0x01,0x00,0x49,0x2D};
int len = sizeof(pData);
int writeLen = 0;
// printf("len = %d\n",len);
while(1)
{
// pthread_mutex_lock(&g_mutex);
// writeLen = SendUartBuffer(tty_fd2, pData, len);
// pthread_mutex_unlock(&g_mutex);
//usleep(400);
sleep(1);

a[1] = 4;
printf("--------a[1] = %d---------\n",a[1]);
}
}

// static void *thread_start_ttys4_read()
// {
// unsigned char readData[255] = {0};
// char buf[1024] = {0};
// int readLen = 0;
// while(1)
// {
// pthread_mutex_lock(&g_mutex);
// readLen = RecvUartBuffer(tty_fd2, readData, 255);
// pthread_mutex_unlock(&g_mutex);
// if(readLen > 0) {
// printf("readLen = %d ",readLen);
// for(int i =0; i < readLen; i++) {
// printf("%02X ",readData[i]);
// }
// printf("\n");
// bzero(readData,sizeof(readData));
// }
// usleep(400);
// // sleep(1);
// }
// }

void CreateUartPhtread()
{
int ret = -1;
ret = pthread_create(&tty_pid[0], NULL, &thread_start_ttyS2, NULL);
if(0 != ret) {
printf("create thread_ttyS2 fail!\n");
return ;
}

ret = pthread_create(&tty_pid[1], NULL, &thread_start_ttyS4, NULL);
if(0 != ret) {
printf("create thread_ttyS4 fail!\n");
return ;
}

// ret = pthread_create(&tty_pid[2], NULL, &thread_start_ttyS3, NULL);
// if(0 != ret) {
// printf("create thread_ttyS3 fail!\n");
// return ;
// }

// ret = pthread_create(&tty_pid[3], NULL, &thread_start_ttys4_read, NULL);
// if(0 != ret) {
// printf("create thread_start_ttys4_read fail!\n");
// return ;
// }

// ret = pthread_create(&tty_pid[4], NULL, &thread_start_ttys3_read, NULL);
// if(0 != ret) {
// printf("create thread_start_ttys3_read fail!\n");
// return ;
// }

// ret = pthread_create(&tty_pid[5], NULL, &thread_start_ttys2_read, NULL);
// if(0 != ret) {
// printf("create thread_start_ttys2_read fail!\n");
// return ;
// }
}


int main()
{
puts("--------1-----");
if(!UART_Init())
{
printf("uart_Init fail!\n");
return -1;
}

CreateUartPhtread();
while(1);

return 0;
}