现附上代码:
#include "mainwindow.h"
#include <QPainter>
#include <QImage>
#include <QPointF>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
this->camera = new TCamera(this);
img = new QImage((uchar*)(camera->m_pDataBuf),800,600,800,QImage::Format_Indexed8);
connect(this,SIGNAL(destroyed()),this,SLOT(close()));
p.setX(0);
p.setY(0);
img->setColorTable(camera->colorTable);
}
MainWindow::~MainWindow()
{
}
void MainWindow::closeEvent(QCloseEvent *event)
{
delete camera;
event->accept();
}
void MainWindow::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
painter.drawImage(p,*img);
event->accept();
camera->m_bDataUseEnd = true;
}
class TCamera : public QThread
{
Q_OBJECT
public:
TCamera(QWidget *para);
~TCamera();
bool writeToCamera();
void run();
int m_devFd;
unsigned long mnMapLen;
void *rgbdata;
QWidget* mpParen;
struct camera_setting cameraset;
uchar *m_pDataBuf; //原始数据缓冲区地址
int m_cbDataBuf; //原始数据缓冲区大小
uint m_nWidth; //输出图像宽度
uint m_nHeight; //输出图像高度
uint m_nMaxWidth; //当前分辨率下的最大输出图像宽度
uint m_nMaxHeight; //当前分辨率下的最大输出图像宽度
uint m_nBitCnt; //图像位深,彩色为24,灰度为8
QVector<QRgb> colorTable;
volatile bool m_bExit;
volatile bool m_bDataUseEnd;
};
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QtGui/QMainWindow>
#include "tcamera.h"
#include <QPaintEvent>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = 0);
~MainWindow();
TCamera *camera;
QImage *img;
void closeEvent(QCloseEvent *event);
void paintEvent(QPaintEvent *event);
QPointF p;
};
#endif // MAINWINDOW_H
#include "tcamera.h"
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <errno.h>
#include <unistd.h>
#include <sys/mman.h>
TCamera::TCamera(QWidget *para)
{
//QRgb *cl = new QRgb[256];
for(int i=0;i<256;i++)
{
//cl=qRgb(i,i,i);
colorTable.append(qRgb(i,i,i));
}
mpParen = para;
m_cbDataBuf = 0;
m_pDataBuf = 0;
m_cbDataBuf = 480000;
m_pDataBuf = new uchar[m_cbDataBuf];
mnMapLen = 1024*1024;
m_devFd = open("/dev/usb_cRz0",O_RDWR);
if( m_devFd < 1 ){
qDebug("open dev error");
return ;
}
if(writeToCamera()){
rgbdata = (void*)mmap(0,mnMapLen,PROT_READ,MAP_SHARED, m_devFd,0);
if(rgbdata == MAP_FAILED){
qDebug("mmap camera failed.");
return ;
}
}
m_bExit = false;
start();
}
TCamera::~TCamera()
{
if(rgbdata != (void*)-1)
munmap(rgbdata,m_devFd);
rgbdata = (void*)-1;
if (m_devFd>1){
cameraset.START = 0xFE;
writeToCamera();
this->m_bExit = true;
sleep(2);
}
close(m_devFd);
m_devFd = 0;
delete[] m_pDataBuf;
}
bool TCamera::writeToCamera(){
int result;
result = write(m_devFd,&cameraset,sizeof(struct camera_setting));
if(result == -1){
qDebug("send cmd failt.\n");
return false;
}else
return true;
}
void TCamera::run(){
fd_set rfd;
m_bDataUseEnd = true;
struct timeval tv;
tv.tv_sec = 10;
tv.tv_usec = 0;
while(true){
if(mpParen->isVisible())
break;
else if(m_bExit)
return;
}
while(true){
FD_ZERO(&rfd);
FD_SET(m_devFd,&rfd);
switch(select(m_devFd+1,&rfd,NULL,NULL,&tv))
{
default:
if(m_bDataUseEnd){
m_bDataUseEnd = false;
if(FD_ISSET(m_devFd,&rfd)){
memcpy((void*)m_pDataBuf,rgbdata,m_cbDataBuf);
mpParen->update();
}
}
break;
case -1:
case 0:
qDebug("Exit \n");
if(m_bExit)
return;
else
break;
}
}
}
以上是全部代码。
顺便再问下:我把图像数据直接写到fb中图像显示正常,而在paintEvent中显示时,图像的下半部分数据好像就有问题了,又是什么原因。