Index: trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.cpp
===================================================================
--- trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.cpp	(revision 4494)
+++ trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.cpp	(revision 4495)
@@ -33,9 +33,8 @@
 #include <qtimer.h>
 #include <qimage.h>
-
-#define HEADERSIZE	15
-
-extern int g_iRefX, g_iRefY;
-
+#include <kapp.h>
+
+extern KApplication*			g_theApp;
+extern double g_dRefX, g_dRefY;
 
 VideoFrame::VideoFrame( QWidget *parent, const char *name, AMCFrameGrabber* p_pFG )
@@ -47,5 +46,6 @@
   qDebug("Creating Image arrays");
 	m_pImage = new QImage( MY_WIDTH, MY_HEIGHT, MY_DEPTH*8 );
-	m_darkFrame = new QByteArray( BUFSIZE );
+	m_pRawImage = new QImage( MY_WIDTH, MY_HEIGHT, MY_DEPTH*8 );
+	m_pDarkFrame = new QByteArray( BUFSIZE );
 
 	m_iFrame = 0;
@@ -55,8 +55,9 @@
 
 	m_ix = m_iy = -1;
-	m_iRefX = m_iRefY = -1;
-  m_iCenterX = m_iCenterY = 1;
+	m_dRefX = m_dRefY = -1.;
+  m_dCenterX = m_dCenterY = -1.;
 	m_pCalibDlg = 0;
-//	m_qlSpots.setAutoDelete( true );
+	m_qlSpotList.setAutoDelete( true );
+	m_qlSpots.setAutoDelete( true );
 	
   qDebug("Creating VideoThread");
@@ -64,7 +65,8 @@
 	m_pVideoThread->init( BUFSIZE );
   qDebug("Creating SpotThread");
-	m_pSpotThread = new VideoSpotThread( this, m_pImage, (uchar*) m_darkFrame->data() );
+	m_pSpotThread = new VideoSpotThread( this, m_pRawImage, (uchar*) m_pDarkFrame->data() );
+  qDebug("Starting SpotThread");
+	m_pSpotThread->start();
   qDebug("Starting VideoThread");
-  qDebug("Thread for VideoFrame when starting VideoThread PID: %d - PPID: %d", getpid(), getppid() );
 	m_pVideoThread->start();
 }
@@ -72,16 +74,15 @@
 VideoFrame::~VideoFrame()
 {
-	qDebug("Stoping video thread");
-	m_pVideoThread->stop();
-	m_pVideoThread->wait( );
+	// Stop all runing threads
+	halt( true );
 	qDebug("deleting video thread");
 	delete m_pVideoThread;
-	qDebug("Stoping spot thread");
-	m_pSpotThread->wait();
 	qDebug("deleting spot thread");
 	delete m_pSpotThread;
-	delete m_darkFrame;
+
+	qDebug("Deleting image and dark frame buffers");
+	delete m_pDarkFrame;
 	delete m_pImage;
-	m_qlSpots.clear();
+	delete m_pRawImage;
 }
 
@@ -95,9 +96,9 @@
 
 	// Overlay camera center if it was determined from the LEDs
-	if( m_iCenterX > 1 )
+	if( m_dCenterX > 0 )
 	{
 		windowPainter->setPen( Qt::white );
-		windowPainter->drawEllipse( m_iCenterX-2, m_iCenterY-2, 5, 5);
-		windowPainter->drawEllipse( m_iCenterX-4, m_iCenterY-4, 9, 9);
+		windowPainter->drawEllipse( m_dCenterX-2., m_dCenterY-2., 5, 5);
+		windowPainter->drawEllipse( m_dCenterX-4., m_dCenterY-4., 9, 9);
 	}
 
@@ -111,4 +112,18 @@
 	}
 
+	// Overlay Leds
+	windowPainter->setPen( Qt::yellow );
+	for( VideoSpot* pActualSpot = m_qlLEDs.first();
+	  	 pActualSpot; pActualSpot = m_qlLEDs.next() )
+	{
+		if( pActualSpot->isValid() )
+			windowPainter->drawRect( pActualSpot->getX()-4, pActualSpot->getY()-4, 9, 9);
+	}
+	windowPainter->drawEllipse( LED1_X-4, LED1_Y-4, 9, 9);
+	windowPainter->drawEllipse( LED2_X-4, LED2_Y-4, 9, 9);
+	windowPainter->drawEllipse( LED3_X-4, LED3_Y-4, 9, 9);
+	windowPainter->drawEllipse( LED4_X-4, LED4_Y-4, 9, 9);
+
+	// Draw the calibration pointa and the regression fits.
 	if( m_pCalibDlg != 0 )
 	{
@@ -127,7 +142,15 @@
 		if( pRegression->isValid() )
 		{
-			iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
-			iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
-			windowPainter->drawLine( iX1, 0, iX2, 479 );	
+  		if( ! pRegression->getReversed() ) {
+				iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
+				iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
+  			windowPainter->drawLine( iX1, 0, iX2, 479 );
+			}	
+  		else
+			{
+				iX1 = (int) pRegression->getAxis();
+				iX2 = (int) ( pRegression->getAxis() + 479 * pRegression->getSlope() );
+  			windowPainter->drawLine( iX1, 0, iX2, 479 );	
+			}
 		}
 
@@ -135,7 +158,17 @@
 		if( pRegression->isValid() )
 		{
-			iX1 = (int) ((   0. - pRegression->getAxis() ) / pRegression->getSlope());
-			iX2 = (int) (( 479. - pRegression->getAxis() ) / pRegression->getSlope());
-			windowPainter->drawLine( iX1, 0, iX2, 479 );	
+  		if( ! pRegression->getReversed() )
+			{
+				iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
+				iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
+  			windowPainter->drawLine( iX1, 0, iX2, 479 );	
+			}
+  		else
+			{
+				iX1 = (int) pRegression->getAxis();
+				iX2 = (int) ( pRegression->getAxis() + 479 * pRegression->getSlope() );
+  			windowPainter->drawLine( iX1, 0, iX2, 479 );	
+//				qDebug( "Drawing line: (%d,%d) - (%d,%d)", iX1, 0, iX2, 479 );
+			}
 		}
 		
@@ -144,20 +177,20 @@
 	// Draw a blue cross for the global reference point
 	windowPainter->setPen( Qt::blue );
-	windowPainter->drawLine( g_iRefX-4, g_iRefY, g_iRefX+4, g_iRefY);
-	windowPainter->drawLine( g_iRefX, g_iRefY-4, g_iRefX, g_iRefY+4);
+	windowPainter->drawLine( g_dRefX-4., g_dRefY, g_dRefX+4., g_dRefY);
+	windowPainter->drawLine( g_dRefX, g_dRefY-4., g_dRefX, g_dRefY+4.);
 
 	// Draw a green rectangle showing the reference point for this panel
-	if( m_iRefX > 0)
+	if( m_dRefX > 0)
 	{
 		windowPainter->setPen( Qt::green );
-		if( m_iCenterX > 1 )
+		if( m_dCenterX > 1.0 )
 		{
 			// Adapt spot for shift of camera center.
-			int iDx, iDy;
-			iDx = m_iCenterX - CAMERA_X;
-			iDy = m_iCenterY - CAMERA_Y;
-			windowPainter->drawRect( m_iRefX+iDx-4, m_iRefY+iDy-4, 9, 9 );
+			double dDx, dDy;
+			dDx = m_dCenterX - CAMERA_X;
+			dDy = m_dCenterY - CAMERA_Y;
+			windowPainter->drawRect( m_dRefX+dDx-4., m_dRefY+dDy-4., 9., 9. );
 		} else
-			windowPainter->drawRect( m_iRefX-4, m_iRefY-4, 9, 9 );
+			windowPainter->drawRect( m_dRefX-4., m_dRefY-4., 9., 9. );
 	}
 
@@ -194,5 +227,5 @@
 			if( pActualSpot->isValid() )
 			{
-				str.sprintf("%d %d\n", pActualSpot->getX(), pActualSpot->getY() );
+				str.sprintf("%6.2f %6.2f %d\n", pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel() );
 				stream << str;
 			}
@@ -206,5 +239,5 @@
 			if( pActualSpot->isValid() )
 			{
-				str.sprintf("%d %d\n", pActualSpot->getX(), pActualSpot->getY() );
+				str.sprintf("%6.2f %6.2f %d\n", pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel() );
 				stream << str;
 			}
@@ -220,5 +253,5 @@
 	uchar* pFrame = m_pImage->bits();
 	m_pVideoThread->getLastFrame( pFrame );
-	uchar* pDark = m_darkFrame->data();
+	uchar* pDark = m_pDarkFrame->data();
 
 	for(int ind=0; ind< (MY_HEIGHT * MY_WIDTH * MY_DEPTH); ind++, pDark++, pFrame++ )
@@ -234,5 +267,5 @@
 void VideoFrame::clearDarks()
 {
-	m_darkFrame->fill(0);
+	m_pDarkFrame->fill(0);
 	m_iDarks = 0;
 }
@@ -299,7 +332,7 @@
 	if( event->button() == RightButton )
 	{
-		g_iRefX = event->x();
-		g_iRefY = event->y();
-		emit gref( g_iRefX, g_iRefY );
+		g_dRefX = event->x();
+		g_dRefY = event->y();
+		emit gref( g_dRefX, g_dRefY );
 	}
 }
@@ -307,7 +340,12 @@
 void VideoFrame::customEvent(QCustomEvent *e)
 {
-  if ( e->type() == THREAD_END_EVENT )
-	{
+  if ( e->type() == THREAD_SPOT_EVENT )
+	{
+		g_theApp->processEvents();
+    m_pSpotThread->getSpotList( &m_qlSpotList );
+		m_pSpotThread->getFrame( m_pImage->bits() );
+		m_iGoodFrame++;
 		repaint( FALSE );
+
     calcCenter();
 		if( m_qlSpots.count() == 1)
@@ -318,16 +356,18 @@
 		else
 			emit spot( -1, -1 );
+		g_theApp->processEvents();
+
 	}
   if ( e->type() == THREAD_FRAME_EVENT )
 	{
 		m_iFrame++;
-		if( ! m_pSpotThread->running() )	
-		{
-			m_iGoodFrame++;
-			m_pVideoThread->getLastFrame( m_pImage->bits() );
-			m_pSpotThread->start();
-		}
-//		else
-//			qDebug("Dropping Frame");
+		if( ! m_pSpotThread->isActive() )	
+		{
+			m_pVideoThread->getLastFrame( m_pRawImage->bits() );
+			m_pSpotThread->wake();
+		}
+//else
+//	qDebug("Dropping Frame");
+		g_theApp->processEvents();
 	}
 }
@@ -349,10 +389,19 @@
 	if ( p_zStop == true )
  	{
+		qDebug("Stoping video thread");
 		m_pVideoThread->stop();
 		m_pVideoThread->wait();		// Wait for video thread to finish
+		qDebug("Stoping videospot thread");
+		m_pSpotThread->stop();
+		m_pSpotThread->wake();
 		m_pSpotThread->wait();		// Wait for spot thread to finish
 	}
 	else
+	{
+		qDebug("Starting video thread");
+		m_pSpotThread->start();
+		qDebug("Starting videospot thread");
 		m_pVideoThread->start();
+	}
 }
 
@@ -365,11 +414,10 @@
   int iNumLEDs = 0;
 
-  m_iCenterX = m_iCenterY = 1;
+  m_dCenterX = m_dCenterY = -1.;
   m_qlLEDs.clear();
   m_qlSpots.clear();
 
-	QList<VideoSpot>& qlSpotList = m_pSpotThread->getSpotList();
-	for( VideoSpot* pActualSpot = qlSpotList.first();
-	  	 pActualSpot; pActualSpot = qlSpotList.next() )
+	for( VideoSpot* pActualSpot = m_qlSpotList.first();
+	  	 pActualSpot; pActualSpot = m_qlSpotList.next() )
 	{
     // Check if this spot is compatible with the spot of the
@@ -380,5 +428,5 @@
 			dY1 = pActualSpot->getY() + (CAMERA_Y - LED1_Y);
 			dX += dX1; dY += dY1;
-			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
+			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
       iNumLEDs++;
 		}
@@ -390,5 +438,5 @@
 			dY2 = pActualSpot->getY() + (CAMERA_Y - LED2_Y);
 			dX += dX2; dY += dY2;
-			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
+			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
       iNumLEDs++;
 		}
@@ -400,5 +448,5 @@
 			dY3 = pActualSpot->getY() + (CAMERA_Y - LED3_Y);
 			dX += dX3; dY += dY3;
-			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
+			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
       iNumLEDs++;
 		}
@@ -410,16 +458,16 @@
 			dY4 = pActualSpot->getY() + (CAMERA_Y - LED4_Y);
 			dX += dX4; dY += dY4;
-			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
+			m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
       iNumLEDs++;
 		}
     else
-			m_qlSpots.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
+			m_qlSpots.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
   }
   if( iNumLEDs != 0)
 	{
-		m_iCenterX = (int) rint(dX / iNumLEDs);
-		m_iCenterY = (int) rint(dY / iNumLEDs);
+		m_dCenterX = dX / iNumLEDs;
+		m_dCenterY = dY / iNumLEDs;
 //		qDebug("Center %d %d", m_iCenterX, m_iCenterY);
 	}
-  qDebug("Center at: %d %d -- with %d LEDs",m_iCenterX, m_iCenterY, iNumLEDs );
-}
+//  qDebug("Center at: %5.1f %5.1f -- with %d LEDs",m_dCenterX, m_dCenterY, iNumLEDs );
+}
Index: trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.h
===================================================================
--- trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.h	(revision 4494)
+++ trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.h	(revision 4495)
@@ -50,5 +50,5 @@
   void saveFrame();
   /** Set the reference position */
-  void setRef( int p_iX, int p_iY ) { m_iRefX = p_iX; m_iRefY = p_iY; };
+  void setRef( double p_dX, double p_dY ) { m_dRefX = p_dX; m_dRefY = p_dY; };
   /** Set list of spots used to calibrate panel movement */
   void setCalibDlg( CalibratePanelDialog* p_pDlg ) { m_pCalibDlg = p_pDlg; };
@@ -72,5 +72,7 @@
   QImage* m_pImage;
   /**  */
-  QByteArray* m_darkFrame;
+  QImage* m_pRawImage;
+  /**  */
+  QByteArray* m_pDarkFrame;
   /**  */
 	CalibratePanelDialog* m_pCalibDlg;
@@ -85,4 +87,6 @@
   /**  */
   QPoint m_qpRef;
+  /** List of spots found in frame. */
+	QList<VideoSpot> m_qlSpotList;
   /** List of spots found in frame. In this list the spots from the camera LEDs are removed */
 	QList<VideoSpot> m_qlSpots;
@@ -96,11 +100,11 @@
   int m_iy;
   /**  */
-  int m_iRefX;
+  double m_dRefX;
   /**  */
-  int m_iRefY;
+  double m_dRefY;
   /**  */
-  int m_iCenterX;
+  double m_dCenterX;
   /**  */
-  int m_iCenterY;
+  double m_dCenterY;
   /**  */
   int m_iFrame;
@@ -130,7 +134,7 @@
 signals: // Signals
   /** Signal emitted when we find a spot. */
-  void spot( int p_iX, int p_iY );
+  void spot( double p_dX, double p_dY );
   /** Signal emitted when we set a global reference. */
-  void gref( int p_iX, int p_iY );
+  void gref( double p_dX, double p_dY );
   /** Signal emitted whit the number of grabbed frames per second. */
   void framesGrabbed( int p_iFrames );
