summaryrefslogtreecommitdiff
Unidiff
Diffstat (more/less context) (ignore 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.cpp44
-rw-r--r--noncore/multimedia/camera/zcameraio.h22
7 files changed, 235 insertions, 19 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
@@ -15,7 +15,7 @@ SOURCES = zcameraio.cpp \
15 15
16INCLUDEPATH += $(OPIEDIR)/include 16INCLUDEPATH += $(OPIEDIR)/include
17DEPENDPATH += $(OPIEDIR)/include 17DEPENDPATH += $(OPIEDIR)/include
18LIBS += -lqpe -lopiecore2 18LIBS += -lqpe -lopie -lopiecore2
19INTERFACES = 19INTERFACES =
20TARGET = opiecam 20TARGET = opiecam
21 21
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
@@ -17,26 +17,34 @@
17#include "previewwidget.h" 17#include "previewwidget.h"
18#include "zcameraio.h" 18#include "zcameraio.h"
19 19
20#include <qapplication.h>
21#include <qaction.h>
20#include <qvbox.h> 22#include <qvbox.h>
21#include <qcombobox.h> 23#include <qcombobox.h>
22#include <qcursor.h> 24#include <qcursor.h>
23#include <qdatastream.h> 25#include <qdatastream.h>
26#include <qfile.h>
27#include <qimage.h>
24#include <qlabel.h> 28#include <qlabel.h>
25#include <qpopupmenu.h> 29#include <qpopupmenu.h>
26#include <qpushbutton.h> 30#include <qpushbutton.h>
27#include <qmessagebox.h> 31#include <qmessagebox.h>
28#include <qdirectpainter_qws.h> 32#include <qdirectpainter_qws.h>
33#include <qpe/global.h>
29#include <qpe/resource.h> 34#include <qpe/resource.h>
30#include <qpe/qcopenvelope_qws.h> 35#include <qpe/qcopenvelope_qws.h>
31#include <opie/ofiledialog.h> 36#include <opie/ofiledialog.h>
37#include <opie/odevice.h>
38using namespace Opie;
32 39
33#include <opie2/odebug.h> 40#include <opie2/odebug.h>
34 41
35#include <assert.h> 42#include <assert.h>
36 43
37CameraMainWindow::CameraMainWindow( QWidget * parent, const char * name, WFlags f ) 44CameraMainWindow::CameraMainWindow( QWidget * parent, const char * name, WFlags f )
38 :QMainWindow( parent, name, f ) 45 :QMainWindow( parent, name, f ), _pics( 0 )
39{ 46{
47 #ifdef QT_NO_DEBUG
40 if ( !ZCameraIO::instance()->isOpen() ) 48 if ( !ZCameraIO::instance()->isOpen() )
41 { 49 {
42 QVBox* v = new QVBox( this ); 50 QVBox* v = new QVBox( this );
@@ -51,6 +59,9 @@ CameraMainWindow::CameraMainWindow( QWidget * parent, const char * name, WFlags
51 setCentralWidget( v ); 59 setCentralWidget( v );
52 return; 60 return;
53 } 61 }
62 #endif
63
64 init();
54 65
55 _rotation = 270; //TODO: grab these from the actual settings 66 _rotation = 270; //TODO: grab these from the actual settings
56 67
@@ -65,6 +76,8 @@ CameraMainWindow::CameraMainWindow( QWidget * parent, const char * name, WFlags
65 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) ); 76 this, SLOT( systemMessage( const QCString&, const QByteArray& ) ) );
66 77
67 connect( preview, SIGNAL( contextMenuRequested() ), this, SLOT( showContextMenu() ) ); 78 connect( preview, SIGNAL( contextMenuRequested() ), this, SLOT( showContextMenu() ) );
79
80 connect( ZCameraIO::instance(), SIGNAL( shutterClicked() ), this, SLOT( shutterClicked() ) );
68}; 81};
69 82
70 83
@@ -73,6 +86,54 @@ CameraMainWindow::~CameraMainWindow()
73} 86}
74 87
75 88
89void CameraMainWindow::init()
90{
91 // TODO: Save this stuff in config
92 quality = 50;
93 zoom = 1;
94 captureX = 640;
95 captureY = 480;
96 captureFormat = "JPEG";
97
98 resog = new QActionGroup( 0, "reso", true );
99 resog->setToggleAction( true );
100 new QAction( " 64 x 48", 0, 0, resog, 0, true );
101 new QAction( "128 x 96", 0, 0, resog, 0, true );
102 new QAction( "192 x 144", 0, 0, resog, 0, true );
103 new QAction( "256 x 192", 0, 0, resog, 0, true );
104 new QAction( "320 x 240", 0, 0, resog, 0, true );
105 new QAction( "384 x 288", 0, 0, resog, 0, true );
106 new QAction( "448 x 336", 0, 0, resog, 0, true );
107 new QAction( "512 x 384", 0, 0, resog, 0, true );
108 new QAction( "576 x 432", 0, 0, resog, 0, true );
109 ( new QAction( "640 x 480", 0, 0, resog, 0, true ) )->setOn( true );
110
111 qualityg = new QActionGroup( 0, "quality", true );
112 qualityg->setToggleAction( true );
113 new QAction( " 0 (minimal)", 0, 0, qualityg, 0, true );
114 new QAction( " 25 (low)", 0, 0, qualityg, 0, true );
115 ( new QAction( " 50 (good)", 0, 0, qualityg, 0, true ) )->setOn( true );
116 new QAction( " 75 (better)", 0, 0, qualityg, 0, true );
117 new QAction( "100 (best)", 0, 0, qualityg, 0, true );
118
119 zoomg = new QActionGroup( 0, "zoom", true );
120 zoomg->setToggleAction( true );
121 ( new QAction( "x 1", 0, 0, zoomg, 0, true ) )->setOn( true );
122 new QAction( "x 2", 0, 0, zoomg, 0, true );
123
124 outputg = new QActionGroup( 0, "output", true );
125 outputg->setToggleAction( true );
126 ( new QAction( "JPEG", 0, 0, outputg, 0, true ) )->setOn( true );
127 new QAction( "PNG", 0, 0, outputg, 0, true );
128 new QAction( "BMP", 0, 0, outputg, 0, true );
129
130 connect( resog, SIGNAL( selected(QAction*) ), this, SLOT( resoMenuItemClicked(QAction*) ) );
131 connect( qualityg, SIGNAL( selected(QAction*) ), this, SLOT( qualityMenuItemClicked(QAction*) ) );
132 connect( zoomg, SIGNAL( selected(QAction*) ), this, SLOT( zoomMenuItemClicked(QAction*) ) );
133 connect( outputg, SIGNAL( selected(QAction*) ), this, SLOT( outputMenuItemClicked(QAction*) ) );
134}
135
136
76void CameraMainWindow::systemMessage( const QCString& msg, const QByteArray& data ) 137void CameraMainWindow::systemMessage( const QCString& msg, const QByteArray& data )
77{ 138{
78 QDataStream stream( data, IO_ReadOnly ); 139 QDataStream stream( data, IO_ReadOnly );
@@ -108,14 +169,85 @@ void CameraMainWindow::changeZoom( int zoom )
108 ZCameraIO::instance()->setCaptureFrame( 240, 160, z ); 169 ZCameraIO::instance()->setCaptureFrame( 240, 160, z );
109} 170}
110 171
111
112void CameraMainWindow::showContextMenu() 172void CameraMainWindow::showContextMenu()
113{ 173{
174 QPopupMenu reso;
175 reso.setCheckable( true );
176 resog->addTo( &reso );
177
178 QPopupMenu quality;
179 quality.setCheckable( true );
180 qualityg->addTo( &quality );
181
182 QPopupMenu zoom;
183 zoom.setCheckable( true );
184 zoomg->addTo( &zoom );
185
186 QPopupMenu output;
187 output.setCheckable( true );
188 outputg->addTo( &output );
189
114 QPopupMenu m( this ); 190 QPopupMenu m( this );
115 m.insertItem( "Item 1" ); 191 m.insertItem( "&Resolution", &reso );
116 m.insertItem( "Item 1" ); 192 m.insertItem( "&Zoom", &zoom );
117 m.insertItem( "Item 1" ); 193 m.insertItem( "&Quality", &quality );
118 m.insertItem( "Item 1" ); 194 m.insertItem( "&Output As", &output );
119 m.exec( QCursor::pos() ); 195 m.exec( QCursor::pos() );
120} 196}
121 197
198
199void CameraMainWindow::resoMenuItemClicked( QAction* a )
200{
201 captureX = a->text().left(3).toInt();
202 captureY = a->text().right(3).toInt();
203 odebug << "Capture Resolution now: " << captureX << ", " << captureY << oendl;
204}
205
206
207void CameraMainWindow::qualityMenuItemClicked( QAction* a )
208{
209 quality = a->text().left(3).toInt();
210 odebug << "Quality now: " << quality << oendl;
211}
212
213
214void CameraMainWindow::zoomMenuItemClicked( QAction* a )
215{
216 zoom = QString( a->text()[2] ).toInt();
217 odebug << "Zoom now: " << zoom << oendl;
218 ZCameraIO::instance()->setZoom( zoom );
219}
220
221
222void CameraMainWindow::outputMenuItemClicked( QAction* a )
223{
224 captureFormat = a->text();
225 odebug << "Output format now: " << captureFormat << oendl;
226}
227
228
229void CameraMainWindow::shutterClicked()
230{
231 Global::statusMessage( "CAPTURING..." );
232 qApp->processEvents();
233
234 odebug << "Shutter has been pressed" << oendl;
235 ODevice::inst()->touchSound();
236 QString name;
237 name.sprintf( "/tmp/image-%d_%d_%d_q%d.%s", _pics++, captureX, captureY, quality, (const char*) captureFormat.lower() );
238 QImage i;
239 ZCameraIO::instance()->captureFrame( captureX, captureY, zoom, &i );
240 QImage im = i.convertDepth( 32 );
241 bool result = im.save( name, captureFormat, quality );
242 if ( !result )
243 {
244 oerr << "imageio-Problem while writing." << oendl;
245 Global::statusMessage( "Error!" );
246 }
247 else
248 {
249 odebug << captureFormat << "-image has been successfully captured" << oendl;
250 Global::statusMessage( "Ok." );
251 }
252}
253
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
@@ -21,6 +21,8 @@
21#include <qimage.h> 21#include <qimage.h>
22#include <qpixmap.h> 22#include <qpixmap.h>
23 23
24class QAction;
25class QActionGroup;
24class QIconSet; 26class QIconSet;
25class QToolButton; 27class QToolButton;
26class QLabel; 28class QLabel;
@@ -39,15 +41,33 @@ class CameraMainWindow: public QMainWindow
39 public slots: 41 public slots:
40 void changeZoom( int ); 42 void changeZoom( int );
41 void systemMessage( const QCString&, const QByteArray& ); 43 void systemMessage( const QCString&, const QByteArray& );
42
43 void showContextMenu(); 44 void showContextMenu();
45 void resoMenuItemClicked( QAction* );
46 void qualityMenuItemClicked( QAction* );
47 void zoomMenuItemClicked( QAction* );
48 void outputMenuItemClicked( QAction* );
49 void shutterClicked();
44 50
45 protected: 51 protected:
52 void init();
46 53
47 private: 54 private:
48 PreviewWidget* preview; 55 PreviewWidget* preview;
49 int _rotation; 56 int _rotation;
50 QCopChannel* _sysChannel; 57 QCopChannel* _sysChannel;
58
59 QActionGroup* resog;
60 QActionGroup* qualityg;
61 QActionGroup* zoomg;
62 QActionGroup* outputg;
63
64 int quality;
65 int zoom;
66 int captureX;
67 int captureY;
68 QString captureFormat;
69
70 int _pics;
51}; 71};
52 72
53#endif 73#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
@@ -18,6 +18,8 @@
18 18
19#include <opie2/odebug.h> 19#include <opie2/odebug.h>
20 20
21#include <assert.h>
22
21PreviewWidget::PreviewWidget( QWidget * parent, const char * name, WFlags f ) 23PreviewWidget::PreviewWidget( QWidget * parent, const char * name, WFlags f )
22 :QLabel( parent, name, f ) 24 :QLabel( parent, name, f )
23{ 25{
@@ -27,9 +29,11 @@ PreviewWidget::PreviewWidget( QWidget * parent, const char * name, WFlags f )
27 setBackgroundMode( NoBackground ); 29 setBackgroundMode( NoBackground );
28 #endif 30 #endif
29 31
30 32 #ifndef QT_NO_DEBUG
31 startTimer( 150 ); 33 if ( ZCameraIO::instance()->isOpen() ) startTimer( 1500 );
32 //startTimer( 2000 ); 34 #else
35 if ( ZCameraIO::instance()->isOpen() ) startTimer( 200 );
36 #endif
33}; 37};
34 38
35 39
@@ -62,3 +66,9 @@ void PreviewWidget::timerEvent( QTimerEvent* )
62 } 66 }
63} 67}
64 68
69
70void PreviewWidget::mousePressEvent( QMouseEvent* )
71{
72 emit contextMenuRequested();
73}
74
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
@@ -34,6 +34,10 @@ class PreviewWidget: public QLabel
34 protected: 34 protected:
35 virtual void timerEvent( QTimerEvent* ); 35 virtual void timerEvent( QTimerEvent* );
36 virtual void resizeEvent( QResizeEvent* ); 36 virtual void resizeEvent( QResizeEvent* );
37 virtual void mousePressEvent( QMouseEvent* );
38
39 signals:
40 void contextMenuRequested();
37 41
38 private: 42 private:
39 QPixmap p; 43 QPixmap p;
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
@@ -60,6 +60,7 @@ void ZCameraIO::init()
60 ofatal << "Don't create more than one ZCameraIO instances." << oendl; 60 ofatal << "Don't create more than one ZCameraIO instances." << oendl;
61 else 61 else
62 { 62 {
63 _timer = new QTime();
63 setReadMode( STATUS ); 64 setReadMode( STATUS );
64 } 65 }
65} 66}
@@ -83,8 +84,18 @@ bool ZCameraIO::isOpen() const
83 84
84bool ZCameraIO::isShutterPressed() 85bool ZCameraIO::isShutterPressed()
85{ 86{
86 return _status[0] == 'S'; 87 if ( _timer->elapsed() < 1000 ) //TODO: make this customizable?
87 clearShutterLatch(); 88 {
89 clearShutterLatch();
90 return false;
91 }
92 if ( _status[0] == 'S' )
93 {
94 _timer->restart();
95 clearShutterLatch();
96 return true;
97 }
98 else return false;
88} 99}
89 100
90 101
@@ -124,20 +135,28 @@ bool ZCameraIO::setCaptureFrame( int width, int height, int zoom, bool rot )
124} 135}
125 136
126 137
138bool ZCameraIO::setZoom( int zoom )
139{
140 return setCaptureFrame( _width, _height, zoom*256, _rot );
141}
142
143
127void ZCameraIO::setReadMode( int mode ) 144void ZCameraIO::setReadMode( int mode )
128{ 145{
129 char b[10]; 146 char b[10];
130 sprintf( b, "M=%d", mode ); 147 sprintf( b, "M=%d", mode );
131 write( b, mode <= 9 ? 3 : 4 ); 148 write( b, mode <= 9 ? 3 : 4 );
132 if ( mode & 1 ) // STATUS bit is set 149 if ( mode & STATUS ) // STATUS bit is set
150 {
133 read( _status, 4 ); 151 read( _status, 4 );
152 if ( isShutterPressed() ) emit shutterClicked();
153 }
134} 154}
135 155
136 156
137void ZCameraIO::clearShutterLatch() 157void ZCameraIO::clearShutterLatch()
138{ 158{
139 char b = 'B'; 159 write( "B", 1 );
140 write( &b, 1 );
141} 160}
142 161
143 162
@@ -212,6 +231,7 @@ bool ZCameraIO::snapshot( QImage* image )
212 return true; 231 return true;
213} 232}
214 233
234
215bool ZCameraIO::snapshot( unsigned char* buf ) 235bool ZCameraIO::snapshot( unsigned char* buf )
216{ 236{
217 setReadMode( IMAGE | XFLIP | YFLIP ); 237 setReadMode( IMAGE | XFLIP | YFLIP );
@@ -228,3 +248,17 @@ bool ZCameraIO::snapshot( unsigned char* buf )
228 return true; 248 return true;
229} 249}
230 250
251
252void ZCameraIO::captureFrame( int w, int h, int zoom, QImage* image )
253{
254 int pw = _width;
255 int ph = _height;
256 if ( _rot )
257 setCaptureFrame( h, w, zoom*256, true );
258 else
259 setCaptureFrame( w, h, zoom*256, false );
260 snapshot( image );
261 setCaptureFrame( pw, ph, _zoom, _rot );
262}
263
264
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
@@ -16,10 +16,15 @@
16#ifndef ZCAMERAIO_H 16#ifndef ZCAMERAIO_H
17#define ZCAMERAIO_H 17#define ZCAMERAIO_H
18 18
19#include <qobject.h>
20
19class QImage; 21class QImage;
22class QTime;
20 23
21class ZCameraIO 24class ZCameraIO : public QObject
22{ 25{
26 Q_OBJECT
27
23 public: 28 public:
24 virtual ~ZCameraIO(); 29 virtual ~ZCameraIO();
25 30
@@ -31,18 +36,24 @@ class ZCameraIO
31 YNOFLIP = 0, YFLIP = 8 36 YNOFLIP = 0, YFLIP = 8
32 }; 37 };
33 38
39 // low level interface
40
34 bool setCaptureFrame( int w, int h, int zoom = 256, bool rot = true ); 41 bool setCaptureFrame( int w, int h, int zoom = 256, bool rot = true );
42 bool setZoom( int zoom = 0 );
35 void setReadMode( int = IMAGE | XFLIP | YFLIP ); 43 void setReadMode( int = IMAGE | XFLIP | YFLIP );
36 44
37 bool isShutterPressed(); // not const, because it calls clearShutterLatch 45 bool isShutterPressed(); // not const, because it calls clearShutterLatch
38 bool isAvailable() const; 46 bool isAvailable() const;
39 bool isCapturing() const; 47 bool isCapturing() const;
40 bool isFinderReversed() const; 48 bool isFinderReversed() const;
41 bool isOpen() const;
42 49
43 bool snapshot( QImage* );
44 bool snapshot( unsigned char* ); 50 bool snapshot( unsigned char* );
51 bool snapshot( QImage* );
52
53 // high level interface
54 bool isOpen() const;
45 static ZCameraIO* instance(); 55 static ZCameraIO* instance();
56 void captureFrame( int w, int h, int zoom, QImage* image );
46 57
47 protected: 58 protected:
48 ZCameraIO(); 59 ZCameraIO();
@@ -51,6 +62,9 @@ class ZCameraIO
51 bool read( char*, int ); 62 bool read( char*, int );
52 bool write( char*, int = 0 ); 63 bool write( char*, int = 0 );
53 64
65 signals:
66 void shutterClicked();
67
54 private: 68 private:
55 int _driver; 69 int _driver;
56 char _status[4]; 70 char _status[4];
@@ -60,6 +74,8 @@ class ZCameraIO
60 int _zoom; 74 int _zoom;
61 bool _rot; 75 bool _rot;
62 int _readlen; 76 int _readlen;
77
78 QTime* _timer;
63}; 79};
64 80
65#endif 81#endif