#include "mainwindow.h"
#include "ui_mainwindow.h"
#include<gps.h>
#include<QTimer>
#include<QPainter>
#define GPS_LEN 512
float GPS::caculate(float *x) //change jingdu and weidu
{
int a;
float b,c,d,e,f;
a=*x/100; //30
b=(int)((*x/100-a)*100); //29
c=((*x/100-a)*100-b)*60;
d=b/60;
e=c/3600;
f=a+d+e;
return f;
}
int gps_analysis(char *buff,GPRMC *gps_date)
{
char *ptr=NULL;
if(gps_date==NULL)
return -1;
if(strlen(buff)<10)
return -1;
if(NULL==(ptr=strstr(buff,"$GPRMC")))/* 如果buff字符串中包含字符"$GPRMC"则将$GPRMC的地址赋值给ptr */
return -1;
/* sscanf函数为从字符串输入,意思是将ptr内存单元的值作为输入分别输入到后面的结构体成员 */
sscanf(ptr,"$GPRMC,%d.00,%c,%f,N,%f,E,%f,,%d,,,%c*",&(gps_date->time),&(gps_date->pos_state),&(gps_date->latitude),&(gps_date->longitude),&(gps_date->speed),&(gps_date->date),&(gps_date->mode));
return 0;
}
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
GpsYes = 0;
m_fd=openSerialPort();
if(m_fd<0)
{
openflag=0;
}
else
{
openflag=1;
}
this->setAttribute(Qt::WA_PaintOutsidePaintEvent);
QTimer *timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(update()));
timer->start(1000);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::update()
{
int nread = 0;
char gps_buff[GPS_LEN];
GPRMC gprmc,*gps_date;
float mylatitude,mylongitude;
nread = read(m_fd,gps_buff,sizeof(gps_buff));
if(nread<0)
{
printf("read gps_date error");
GpsYes = 0;
}
else
{
GpsYes = 1;
}
memset(&gprmc, 0 , sizeof(gprmc));
gps_analysis(gps_buff,&gprmc);
gps_date = &gprmc;
mylatitude = D.caculate(&gps_date->latitude);
mylongitude = D.caculate(&gps_date->longitude);
QString latitude = QString::number(mylatitude);
ui->latitudeline->setText(latitude);
QString altitude = QString::number(mylongitude);
ui->atitudeline->setText(altitude);
QString year = QString::number(gps_date->date%100);
QString month = QString::number((gps_date->date/100)%100);
QString day = QString::number(gps_date->date/10000);
ui->dateline->setText("20"+year+"-"+month+"-"+day );
QString hour = QString::number(gps_date->time/10000+8);
QString miunite = QString::number((gps_date->time/100)%100);
QString second = QString::number((gps_date->time%100));
ui->timeline->setText(hour+":"+miunite+":"+second);
QString speed = QString::number(gps_date->speed);
ui->speedline->setText(speed);
QString state;
char state_one[3] ={gps_date->pos_state,'\0'};
state = state_one;
ui->statusline->setText(state);
QString pattern;
char pattern_one[3] ={gps_date->mode,'\0'};
pattern = pattern_one;
ui->patternline->setText(pattern);
}
void MainWindow::on_close_button_clicked()
{
close();
}
int MainWindow::openSerialPort()
{
int fd=-1;
fd=open("/dev/ttySAC2",O_RDWR|O_NONBLOCK);
if(fd<0)
{
return -1;
}
termios serialAttr;
memset(&serialAttr,0,sizeof serialAttr);
serialAttr.c_iflag=IGNPAR;
serialAttr.c_cflag=B9600|HUPCL|CS8|CREAD|CLOCAL;
serialAttr.c_cc[VMIN]=1;
if(tcsetattr(fd,TCSANOW,&serialAttr)!=0)
{
return -1;
}
return fd;
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
i=(i+9)%360;
QConicalGradient gradient(260,51,i);
gradient.setSpread(QGradient::ReflectSpread);
if(GpsYes)
{
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(0.1, Qt::darkGray);
gradient.setColorAt(0.2, Qt::gray);
gradient.setColorAt(0.3, Qt::lightGray);
gradient.setColorAt(0.4, Qt::red);
gradient.setColorAt(0.5, Qt::green);
gradient.setColorAt(0.6, Qt::blue);
gradient.setColorAt(0.7, Qt::yellow);
gradient.setColorAt(0.8, Qt::magenta);
gradient.setColorAt(0.9, Qt::yellow);
gradient.setColorAt(1, Qt::green);
}
else
{
gradient.setColorAt(0.0, Qt::white);
gradient.setColorAt(1, Qt::black);
}
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap,
Qt::MiterJoin));
painter.setBrush(gradient);
painter.drawEllipse(210, 1, 100, 100);
QPainter painter1(this);
painter1.setRenderHint(QPainter::Antialiasing, true);
painter1.setPen(QPen(Qt::black, 1, Qt::SolidLine, Qt::RoundCap,
Qt::MiterJoin));
if(GpsYes)
{
painter1.setBrush(QBrush(Qt::red, Qt::SolidPattern));
ui->gpslabel->setText(QApplication::translate("Form", "\345\256\232\344\275\215\344\270\255", 0, QApplication::UnicodeUTF8));
}
else
{
painter1.setBrush(QBrush(Qt::black, Qt::SolidPattern));
ui->gpslabel->setText(QApplication::translate("Form", "\346\234\252\345\256\232\344\275\215", 0, QApplication::UnicodeUTF8));
}
painter1.drawEllipse(190, 30, 10, 10);
}