summaryrefslogtreecommitdiff
Side-by-side diff
Diffstat (more/less context) (show whitespace changes)
-rw-r--r--noncore/multimedia/camera/camera.pro2
-rw-r--r--noncore/multimedia/camera/mainwindow.cpp144
-rw-r--r--noncore/multimedia/camera/mainwindow.h22
-rw-r--r--noncore/multimedia/camera/previewwidget.cpp16
-rw-r--r--noncore/multimedia/camera/previewwidget.h4
-rw-r--r--noncore/multimedia/camera/zcameraio.cpp42
-rw-r--r--noncore/multimedia/camera/zcameraio.h22
7 files changed, 234 insertions, 18 deletions
diff --git a/noncore/multimedia/camera/camera.pro b/noncore/multimedia/camera/camera.pro
index 16da0c9..ffd5f37 100644
--- a/noncore/multimedia/camera/camera.pro
+++ b/noncore/multimedia/camera/camera.pro
@@ -6,18 +6,18 @@ CONFIG = qt warn_on debug
HEADERS = zcameraio.h \
previewwidget.h \
mainwindow.h
SOURCES = zcameraio.cpp \
previewwidget.cpp \
mainwindow.cpp \
main.cpp
INCLUDEPATH += $(OPIEDIR)/include
DEPENDPATH += $(OPIEDIR)/include
-LIBS += -lqpe -lopiecore2
+LIBS += -lqpe -lopie -lopiecore2
INTERFACES =
TARGET = opiecam
include ( $(OPIEDIR)/include.pro )
diff --git a/noncore/multimedia/camera/mainwindow.cpp b/noncore/multimedia/camera/mainwindow.cpp
index 34ebe9e..8e89039 100644
--- a/noncore/multimedia/camera/mainwindow.cpp
+++ b/noncore/multimedia/camera/mainwindow.cpp
@@ -8,80 +8,141 @@
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "mainwindow.h"
#include "previewwidget.h"
#include "zcameraio.h"
+#include <qapplication.h>
+#include <qaction.h>
#include <qvbox.h>
#include <qcombobox.h>
#include <qcursor.h>
#include <qdatastream.h>
+#include <qfile.h>
+#include <qimage.h>
#include <qlabel.h>
#include <qpopupmenu.h>
#include <qpushbutton.h>
#include <qmessagebox.h>
#include <qdirectpainter_qws.h>
+#include <qpe/global.h>
#include <qpe/resource.h>
#include <qpe/qcopenvelope_qws.h>
#include <opie/ofiledialog.h>
+#include <opie/odevice.h>
+using namespace Opie;
#include <opie2/odebug.h>
#include <assert.h>
CameraMainWindow::CameraMainWindow( QWidget * parent, const char * name, WFlags f )
- :QMainWindow( parent, name, f )
+ :QMainWindow( parent, name, f ), _pics( 0 )
{
+ #ifdef QT_NO_DEBUG
if ( !ZCameraIO::instance()->isOpen() )
{
QVBox* v = new QVBox( this );
v->setMargin( 10 );
QLabel* l1 = new QLabel( v );
l1->setPixmap( Resource::loadPixmap( "camera/error" ) );
QLabel* l2 = new QLabel( v );
l2->setText( "<b>Sorry. could not detect your camera :-(</b><p>"
"* Is the sharpzdc_cs module loaded ?<br>"
"* Is /dev/sharpzdc read/writable ?<p>" );
connect( new QPushButton( "Exit", v ), SIGNAL( clicked() ), this, SLOT( close() ) );
setCentralWidget( v );
return;
}
+ #endif
+
+ init();
_rotation = 270; //TODO: grab these from the actual settings
preview = new PreviewWidget( this, "camera preview widget" );
//setCentralWidget( preview ); <--- don't do this!
preview->resize( QSize( 240, 288 ) );
preview->show();
// construct a System Channel to receive setRotation messages
_sysChannel = new QCopChannel( "QPE/System", this );
connect( _sysChannel, SIGNAL( received( const QCString&, const QByteArray& ) ),
this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
connect( preview, SIGNAL( contextMenuRequested() ), this, SLOT( showContextMenu() ) );
+
+ connect( ZCameraIO::instance(), SIGNAL( shutterClicked() ), this, SLOT( shutterClicked() ) );
};
CameraMainWindow::~CameraMainWindow()
{
}
+void CameraMainWindow::init()
+{
+ // TODO: Save this stuff in config
+ quality = 50;
+ zoom = 1;
+ captureX = 640;
+ captureY = 480;
+ captureFormat = "JPEG";
+
+ resog = new QActionGroup( 0, "reso", true );
+ resog->setToggleAction( true );
+ new QAction( " 64 x 48", 0, 0, resog, 0, true );
+ new QAction( "128 x 96", 0, 0, resog, 0, true );
+ new QAction( "192 x 144", 0, 0, resog, 0, true );
+ new QAction( "256 x 192", 0, 0, resog, 0, true );
+ new QAction( "320 x 240", 0, 0, resog, 0, true );
+ new QAction( "384 x 288", 0, 0, resog, 0, true );
+ new QAction( "448 x 336", 0, 0, resog, 0, true );
+ new QAction( "512 x 384", 0, 0, resog, 0, true );
+ new QAction( "576 x 432", 0, 0, resog, 0, true );
+ ( new QAction( "640 x 480", 0, 0, resog, 0, true ) )->setOn( true );
+
+ qualityg = new QActionGroup( 0, "quality", true );
+ qualityg->setToggleAction( true );
+ new QAction( " 0 (minimal)", 0, 0, qualityg, 0, true );
+ new QAction( " 25 (low)", 0, 0, qualityg, 0, true );
+ ( new QAction( " 50 (good)", 0, 0, qualityg, 0, true ) )->setOn( true );
+ new QAction( " 75 (better)", 0, 0, qualityg, 0, true );
+ new QAction( "100 (best)", 0, 0, qualityg, 0, true );
+
+ zoomg = new QActionGroup( 0, "zoom", true );
+ zoomg->setToggleAction( true );
+ ( new QAction( "x 1", 0, 0, zoomg, 0, true ) )->setOn( true );
+ new QAction( "x 2", 0, 0, zoomg, 0, true );
+
+ outputg = new QActionGroup( 0, "output", true );
+ outputg->setToggleAction( true );
+ ( new QAction( "JPEG", 0, 0, outputg, 0, true ) )->setOn( true );
+ new QAction( "PNG", 0, 0, outputg, 0, true );
+ new QAction( "BMP", 0, 0, outputg, 0, true );
+
+ connect( resog, SIGNAL( selected(QAction*) ), this, SLOT( resoMenuItemClicked(QAction*) ) );
+ connect( qualityg, SIGNAL( selected(QAction*) ), this, SLOT( qualityMenuItemClicked(QAction*) ) );
+ connect( zoomg, SIGNAL( selected(QAction*) ), this, SLOT( zoomMenuItemClicked(QAction*) ) );
+ connect( outputg, SIGNAL( selected(QAction*) ), this, SLOT( outputMenuItemClicked(QAction*) ) );
+}
+
+
void CameraMainWindow::systemMessage( const QCString& msg, const QByteArray& data )
{
QDataStream stream( data, IO_ReadOnly );
odebug << "received system message: " << msg << oendl;
if ( msg == "setCurrentRotation(int)" )
{
stream >> _rotation;
odebug << "received setCurrentRotation(" << _rotation << ")" << oendl;
switch ( _rotation )
{
case 270: preview->resize( QSize( 240, 288 ) ); break;
@@ -99,23 +160,94 @@ void CameraMainWindow::changeZoom( int zoom )
int z;
switch ( zoom )
{
case 0: z = 128; break;
case 1: z = 256; break;
case 2: z = 512; break;
default: assert( 0 ); break;
}
ZCameraIO::instance()->setCaptureFrame( 240, 160, z );
}
-
void CameraMainWindow::showContextMenu()
{
+ QPopupMenu reso;
+ reso.setCheckable( true );
+ resog->addTo( &reso );
+
+ QPopupMenu quality;
+ quality.setCheckable( true );
+ qualityg->addTo( &quality );
+
+ QPopupMenu zoom;
+ zoom.setCheckable( true );
+ zoomg->addTo( &zoom );
+
+ QPopupMenu output;
+ output.setCheckable( true );
+ outputg->addTo( &output );
+
QPopupMenu m( this );
- m.insertItem( "Item 1" );
- m.insertItem( "Item 1" );
- m.insertItem( "Item 1" );
- m.insertItem( "Item 1" );
+ m.insertItem( "&Resolution", &reso );
+ m.insertItem( "&Zoom", &zoom );
+ m.insertItem( "&Quality", &quality );
+ m.insertItem( "&Output As", &output );
m.exec( QCursor::pos() );
}
+
+void CameraMainWindow::resoMenuItemClicked( QAction* a )
+{
+ captureX = a->text().left(3).toInt();
+ captureY = a->text().right(3).toInt();
+ odebug << "Capture Resolution now: " << captureX << ", " << captureY << oendl;
+}
+
+
+void CameraMainWindow::qualityMenuItemClicked( QAction* a )
+{
+ quality = a->text().left(3).toInt();
+ odebug << "Quality now: " << quality << oendl;
+}
+
+
+void CameraMainWindow::zoomMenuItemClicked( QAction* a )
+{
+ zoom = QString( a->text()[2] ).toInt();
+ odebug << "Zoom now: " << zoom << oendl;
+ ZCameraIO::instance()->setZoom( zoom );
+}
+
+
+void CameraMainWindow::outputMenuItemClicked( QAction* a )
+{
+ captureFormat = a->text();
+ odebug << "Output format now: " << captureFormat << oendl;
+}
+
+
+void CameraMainWindow::shutterClicked()
+{
+ Global::statusMessage( "CAPTURING..." );
+ qApp->processEvents();
+
+ odebug << "Shutter has been pressed" << oendl;
+ ODevice::inst()->touchSound();
+ QString name;
+ name.sprintf( "/tmp/image-%d_%d_%d_q%d.%s", _pics++, captureX, captureY, quality, (const char*) captureFormat.lower() );
+ QImage i;
+ ZCameraIO::instance()->captureFrame( captureX, captureY, zoom, &i );
+ QImage im = i.convertDepth( 32 );
+ bool result = im.save( name, captureFormat, quality );
+ if ( !result )
+ {
+ oerr << "imageio-Problem while writing." << oendl;
+ Global::statusMessage( "Error!" );
+ }
+ else
+ {
+ odebug << captureFormat << "-image has been successfully captured" << oendl;
+ Global::statusMessage( "Ok." );
+ }
+}
+
diff --git a/noncore/multimedia/camera/mainwindow.h b/noncore/multimedia/camera/mainwindow.h
index df66204..7a12452 100644
--- a/noncore/multimedia/camera/mainwindow.h
+++ b/noncore/multimedia/camera/mainwindow.h
@@ -12,42 +12,62 @@
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <qmainwindow.h>
#include <qdatetime.h>
#include <qimage.h>
#include <qpixmap.h>
+class QAction;
+class QActionGroup;
class QIconSet;
class QToolButton;
class QLabel;
class MainWindowBase;
class QCopChannel;
class PreviewWidget;
class CameraMainWindow: public QMainWindow
{
Q_OBJECT
public:
CameraMainWindow( QWidget * parent = 0, const char * name = "mainwindow", WFlags f = 0 );
virtual ~CameraMainWindow();
public slots:
void changeZoom( int );
void systemMessage( const QCString&, const QByteArray& );
-
void showContextMenu();
+ void resoMenuItemClicked( QAction* );
+ void qualityMenuItemClicked( QAction* );
+ void zoomMenuItemClicked( QAction* );
+ void outputMenuItemClicked( QAction* );
+ void shutterClicked();
protected:
+ void init();
private:
PreviewWidget* preview;
int _rotation;
QCopChannel* _sysChannel;
+
+ QActionGroup* resog;
+ QActionGroup* qualityg;
+ QActionGroup* zoomg;
+ QActionGroup* outputg;
+
+ int quality;
+ int zoom;
+ int captureX;
+ int captureY;
+ QString captureFormat;
+
+ int _pics;
};
#endif
diff --git a/noncore/multimedia/camera/previewwidget.cpp b/noncore/multimedia/camera/previewwidget.cpp
index cdeacf6..f87dcc9 100644
--- a/noncore/multimedia/camera/previewwidget.cpp
+++ b/noncore/multimedia/camera/previewwidget.cpp
@@ -9,36 +9,40 @@
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#include "previewwidget.h"
#include "zcameraio.h"
#include <opie2/odebug.h>
+#include <assert.h>
+
PreviewWidget::PreviewWidget( QWidget * parent, const char * name, WFlags f )
:QLabel( parent, name, f )
{
#ifndef QT_NO_DEBUG
setBackgroundColor( QColor( 255, 0, 0 ) );
#else
setBackgroundMode( NoBackground );
#endif
-
- startTimer( 150 );
- //startTimer( 2000 );
+ #ifndef QT_NO_DEBUG
+ if ( ZCameraIO::instance()->isOpen() ) startTimer( 1500 );
+ #else
+ if ( ZCameraIO::instance()->isOpen() ) startTimer( 200 );
+ #endif
};
PreviewWidget::~PreviewWidget()
{
}
void PreviewWidget::resizeEvent( QResizeEvent* e )
{
QLabel::resizeEvent( e );
int w = e->size().width();
@@ -53,12 +57,18 @@ void PreviewWidget::resizeEvent( QResizeEvent* e )
void PreviewWidget::timerEvent( QTimerEvent* )
{
//QDirectPainter fb( this );
//ZCameraIO::instance()->snapshot( fb.frameBuffer() );
if ( ZCameraIO::instance()->snapshot( &i ) )
{
p.convertFromImage( i );
setPixmap( p );
}
}
+
+void PreviewWidget::mousePressEvent( QMouseEvent* )
+{
+ emit contextMenuRequested();
+}
+
diff --git a/noncore/multimedia/camera/previewwidget.h b/noncore/multimedia/camera/previewwidget.h
index 6b64768..dada301 100644
--- a/noncore/multimedia/camera/previewwidget.h
+++ b/noncore/multimedia/camera/previewwidget.h
@@ -25,19 +25,23 @@ class QResizeEvent;
class PreviewWidget: public QLabel
{
Q_OBJECT
public:
PreviewWidget( QWidget * parent = 0, const char * name = 0, WFlags f = 0 );
virtual ~PreviewWidget();
protected:
virtual void timerEvent( QTimerEvent* );
virtual void resizeEvent( QResizeEvent* );
+ virtual void mousePressEvent( QMouseEvent* );
+
+ signals:
+ void contextMenuRequested();
private:
QPixmap p;
QImage i;
};
#endif
diff --git a/noncore/multimedia/camera/zcameraio.cpp b/noncore/multimedia/camera/zcameraio.cpp
index b37ae8c..9af0c25 100644
--- a/noncore/multimedia/camera/zcameraio.cpp
+++ b/noncore/multimedia/camera/zcameraio.cpp
@@ -51,49 +51,60 @@ ZCameraIO::ZCameraIO()
oerr << "Can't open camera driver: " << strerror(errno) << oendl;
else
init();
}
void ZCameraIO::init()
{
if ( ZCameraIO::_instance )
ofatal << "Don't create more than one ZCameraIO instances." << oendl;
else
{
+ _timer = new QTime();
setReadMode( STATUS );
}
}
ZCameraIO::~ZCameraIO()
{
if ( _driver != -1 )
{
setReadMode( 0 );
::close( _driver );
}
}
bool ZCameraIO::isOpen() const
{
return _driver != -1;
}
bool ZCameraIO::isShutterPressed()
{
- return _status[0] == 'S';
+ if ( _timer->elapsed() < 1000 ) //TODO: make this customizable?
+ {
+ clearShutterLatch();
+ return false;
+ }
+ if ( _status[0] == 'S' )
+ {
+ _timer->restart();
clearShutterLatch();
+ return true;
+ }
+ else return false;
}
bool ZCameraIO::isFinderReversed() const
{
return _status[1] == 'M';
}
bool ZCameraIO::isCapturing() const
{
return _status[2] == 'C';
@@ -115,38 +126,46 @@ bool ZCameraIO::setCaptureFrame( int width, int height, int zoom, bool rot )
{
_width = width;
_height = height;
_zoom = zoom;
_rot = rot;
_readlen = 2 * _width * _height; // camera is fixed @ 16 bits per pixel
return true;
}
return false;
}
+bool ZCameraIO::setZoom( int zoom )
+{
+ return setCaptureFrame( _width, _height, zoom*256, _rot );
+}
+
+
void ZCameraIO::setReadMode( int mode )
{
char b[10];
sprintf( b, "M=%d", mode );
write( b, mode <= 9 ? 3 : 4 );
- if ( mode & 1 ) // STATUS bit is set
+ if ( mode & STATUS ) // STATUS bit is set
+ {
read( _status, 4 );
+ if ( isShutterPressed() ) emit shutterClicked();
+ }
}
void ZCameraIO::clearShutterLatch()
{
- char b = 'B';
- write( &b, 1 );
+ write( "B", 1 );
}
bool ZCameraIO::read( char* b, int len )
{
#ifndef NO_TIMING
QTime t;
t.start();
#endif
int rlen = ::read( _driver, b, len );
#ifndef NO_TIMING
int time = t.elapsed();
@@ -203,28 +222,43 @@ bool ZCameraIO::snapshot( QImage* image )
*p = *bp;
p++;
bp++;
*p = *bp;
p++;
bp++;
}
}
return true;
}
+
bool ZCameraIO::snapshot( unsigned char* buf )
{
setReadMode( IMAGE | XFLIP | YFLIP );
read( (char*) buf, _readlen );
/* //TESTCODE
int fd = open( "/tmp/cam", O_RDONLY );
if ( ::read( fd, (char*) buf, 76800 ) != 76800 )
owarn << "Couldn't read image from /dev/sharp_zdc" << oendl;
// TESTCODE */
return true;
}
+
+void ZCameraIO::captureFrame( int w, int h, int zoom, QImage* image )
+{
+ int pw = _width;
+ int ph = _height;
+ if ( _rot )
+ setCaptureFrame( h, w, zoom*256, true );
+ else
+ setCaptureFrame( w, h, zoom*256, false );
+ snapshot( image );
+ setCaptureFrame( pw, ph, _zoom, _rot );
+}
+
+
diff --git a/noncore/multimedia/camera/zcameraio.h b/noncore/multimedia/camera/zcameraio.h
index 9d4b1d7..edce143 100644
--- a/noncore/multimedia/camera/zcameraio.h
+++ b/noncore/multimedia/camera/zcameraio.h
@@ -7,59 +7,75 @@
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
**********************************************************************/
#ifndef ZCAMERAIO_H
#define ZCAMERAIO_H
+#include <qobject.h>
+
class QImage;
+class QTime;
-class ZCameraIO
+class ZCameraIO : public QObject
{
+ Q_OBJECT
+
public:
virtual ~ZCameraIO();
enum ReadMode
{
IMAGE = 0, STATUS = 1,
FASTER = 0, BETTER = 2,
XNOFLIP = 0, XFLIP = 4,
YNOFLIP = 0, YFLIP = 8
};
+ // low level interface
+
bool setCaptureFrame( int w, int h, int zoom = 256, bool rot = true );
+ bool setZoom( int zoom = 0 );
void setReadMode( int = IMAGE | XFLIP | YFLIP );
bool isShutterPressed(); // not const, because it calls clearShutterLatch
bool isAvailable() const;
bool isCapturing() const;
bool isFinderReversed() const;
- bool isOpen() const;
- bool snapshot( QImage* );
bool snapshot( unsigned char* );
+ bool snapshot( QImage* );
+
+ // high level interface
+ bool isOpen() const;
static ZCameraIO* instance();
+ void captureFrame( int w, int h, int zoom, QImage* image );
protected:
ZCameraIO();
void clearShutterLatch();
void init();
bool read( char*, int );
bool write( char*, int = 0 );
+ signals:
+ void shutterClicked();
+
private:
int _driver;
char _status[4];
static ZCameraIO* _instance;
int _height;
int _width;
int _zoom;
bool _rot;
int _readlen;
+
+ QTime* _timer;
};
#endif