#include "sensor.h"
#include "ui_sensor.h"
//#include "serial.h"
#include <QtGui>
#include <QByteArray>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const char *COM = "/dev/ttyS0" ;
Sensor::Sensor(QWidget *parent)
: QWidget(parent), ui(new Ui::Sensor)
{
ui->setupUi(this);
threadA = new Thread();
threadA->sensor_ui = ui;
}
Sensor::~Sensor()
{
delete ui;
//m_tty.tty_end(sel_fd);
}
void Sensor::on_PB_Exit_clicked()
{
threadA->stop();
}
void Sensor::on_PB_GetState_clicked()
{
if(!threadA->stopped)
threadA->start();
threadA->stopped = false;
}
Thread::Thread()
{
stopped = false;
m_tty = tty();
sel_fd = m_tty.tty_open(COM);
}
void Thread::run()
{
if(sel_fd>0)
{
printf("****Serial port is open,ready to get sensor state....\n");
}
else
{
printf("****Serial port is closed,please open it first!\n");
sel_fd = m_tty.tty_open(COM);
}
while(!stopped)
{
GetSensorState();
sleep(1);
}
stopped = false;
}
void Thread::stop()
{
stopped = true;
m_tty.tty_end(sel_fd);
}
void Thread::GetSensorState()
{
int i,wlen,rlen;
char command='\0';
char txbuff[6];
char revbuff[7];
QByteArray rev = " ";
for(command=0x10;command<=0x20;command++)
{
//printf("\n command:%#x",command);
if( (command == 0x1b)| (command == 0x1c) )
continue;
memset(txbuff,'\0',sizeof(txbuff));
txbuff[0]=0xAA;
txbuff[1]=0xFF;
txbuff[2]=command;
txbuff[3]=0xFF;
txbuff[3]= txbuff[3]^txbuff[2];
txbuff[4]=0xFF;
txbuff[5]='\0';
fflush(stdout);
wlen = m_tty.tty_write(sel_fd,txbuff,6);
fflush(stdout);
memset(revbuff,'\0',sizeof(revbuff));
rlen = m_tty.tty_read(sel_fd,revbuff,7);
fflush(stdout);
if(rlen < 0)
{
printf("read serial error!\n");
rlen = m_tty.tty_read(sel_fd,revbuff,7);
}
rev = " ";
for(i=2;i<4;i++)
rev.append(revbuff[i]);
char str[3]= {'\0'};
char value = '\0';
char *temp = rev.data();
i=0;
for(i=0;i<3;i++){
str[i]= *temp;
temp++;
}
value = (str[1] << 4)|str[2];
char d[2] = {'\0'};
sprintf(d,"%x",value);
for(i=2;i<5;i++)
{
printf(" %x",revbuff[i]);
}
revbuff[6]=0;
for(i=2;i<4;i++)
{
revbuff[5]=revbuff[5]^revbuff[i];
}
switch(txbuff[2])
{
case 0x10:
sensor_ui->LE_Temperature->setText(QString(d));
break;
case 0x11:
if(revbuff[2] == 0)
sensor_ui->RB_Sound->setChecked(true);
else
sensor_ui->RB_NoSound->setChecked(true);
break;
case 0x12:
if(revbuff[2] == 0)
sensor_ui->RB_Touch->setChecked(true);
else
sensor_ui->RB_UnTouch->setChecked(true);
break;
case 0x13:
sensor_ui->LE_V_Ntc->setText(QString(d));
break;
case 0x14:
sensor_ui->LE_V_Cds->setText(QString(d));
break;
case 0x15:
sensor_ui->LE_V_Diff->setText(QString(d));
break;
case 0x16:
sensor_ui->LE_V_Hls->setText(QString(d));
break;
case 0x17:
if(revbuff[2] == 1)
sensor_ui->RB_Shake->setChecked(true);
else
sensor_ui->RB_NoShake->setChecked(true);
break;
case 0x18:
if(revbuff[3] == 1)
sensor_ui->RB_Cc->setChecked(true);
else
sensor_ui->RB_NoCc->setChecked(true);
break;
case 0x19:
if(revbuff[3] == 1)
sensor_ui->RB_Rshw_Signal->setChecked(true);
else
sensor_ui->RB_Rshw_NoSignal->setChecked(true);
break;
case 0x1A:
if(revbuff[3] == 1)
sensor_ui->RB_Gas_Signal->setChecked(true);
else
sensor_ui->RB_Gas_NoSignal->setChecked(true);
break;
case 0x1D:
sensor_ui->LE_Humidity->setText(QString(d));
break;
case 0x1E:
if(revbuff[3]== 1)
sensor_ui->RB_Cc_Change->setChecked(true);
else
sensor_ui->RB_Cc_NoChange->setChecked(true);
break;
case 0x1F:
sensor_ui->LE_VoltageIn->setText(QString(d));
break;
case 0x20:
sensor_ui->LE_CurrentIn->setText(QString(d));
break;
}
}
}