Changeset 4495 for trunk/MagicSoft/AMC


Ignore:
Timestamp:
08/04/04 16:56:04 (20 years ago)
Author:
merck
Message:
MMerck: Changes in Multithreading code.
Location:
trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.cpp

    r4174 r4495  
    3333#include <qtimer.h>
    3434#include <qimage.h>
    35 
    36 #define HEADERSIZE      15
    37 
    38 extern int g_iRefX, g_iRefY;
    39 
     35#include <kapp.h>
     36
     37extern KApplication*                    g_theApp;
     38extern double g_dRefX, g_dRefY;
    4039
    4140VideoFrame::VideoFrame( QWidget *parent, const char *name, AMCFrameGrabber* p_pFG )
     
    4746  qDebug("Creating Image arrays");
    4847        m_pImage = new QImage( MY_WIDTH, MY_HEIGHT, MY_DEPTH*8 );
    49         m_darkFrame = new QByteArray( BUFSIZE );
     48        m_pRawImage = new QImage( MY_WIDTH, MY_HEIGHT, MY_DEPTH*8 );
     49        m_pDarkFrame = new QByteArray( BUFSIZE );
    5050
    5151        m_iFrame = 0;
     
    5555
    5656        m_ix = m_iy = -1;
    57         m_iRefX = m_iRefY = -1;
    58   m_iCenterX = m_iCenterY = 1;
     57        m_dRefX = m_dRefY = -1.;
     58  m_dCenterX = m_dCenterY = -1.;
    5959        m_pCalibDlg = 0;
    60 //      m_qlSpots.setAutoDelete( true );
     60        m_qlSpotList.setAutoDelete( true );
     61        m_qlSpots.setAutoDelete( true );
    6162       
    6263  qDebug("Creating VideoThread");
     
    6465        m_pVideoThread->init( BUFSIZE );
    6566  qDebug("Creating SpotThread");
    66         m_pSpotThread = new VideoSpotThread( this, m_pImage, (uchar*) m_darkFrame->data() );
     67        m_pSpotThread = new VideoSpotThread( this, m_pRawImage, (uchar*) m_pDarkFrame->data() );
     68  qDebug("Starting SpotThread");
     69        m_pSpotThread->start();
    6770  qDebug("Starting VideoThread");
    68   qDebug("Thread for VideoFrame when starting VideoThread PID: %d - PPID: %d", getpid(), getppid() );
    6971        m_pVideoThread->start();
    7072}
     
    7274VideoFrame::~VideoFrame()
    7375{
    74         qDebug("Stoping video thread");
    75         m_pVideoThread->stop();
    76         m_pVideoThread->wait( );
     76        // Stop all runing threads
     77        halt( true );
    7778        qDebug("deleting video thread");
    7879        delete m_pVideoThread;
    79         qDebug("Stoping spot thread");
    80         m_pSpotThread->wait();
    8180        qDebug("deleting spot thread");
    8281        delete m_pSpotThread;
    83         delete m_darkFrame;
     82
     83        qDebug("Deleting image and dark frame buffers");
     84        delete m_pDarkFrame;
    8485        delete m_pImage;
    85         m_qlSpots.clear();
     86        delete m_pRawImage;
    8687}
    8788
     
    9596
    9697        // Overlay camera center if it was determined from the LEDs
    97         if( m_iCenterX > 1 )
     98        if( m_dCenterX > 0 )
    9899        {
    99100                windowPainter->setPen( Qt::white );
    100                 windowPainter->drawEllipse( m_iCenterX-2, m_iCenterY-2, 5, 5);
    101                 windowPainter->drawEllipse( m_iCenterX-4, m_iCenterY-4, 9, 9);
     101                windowPainter->drawEllipse( m_dCenterX-2., m_dCenterY-2., 5, 5);
     102                windowPainter->drawEllipse( m_dCenterX-4., m_dCenterY-4., 9, 9);
    102103        }
    103104
     
    111112        }
    112113
     114        // Overlay Leds
     115        windowPainter->setPen( Qt::yellow );
     116        for( VideoSpot* pActualSpot = m_qlLEDs.first();
     117                 pActualSpot; pActualSpot = m_qlLEDs.next() )
     118        {
     119                if( pActualSpot->isValid() )
     120                        windowPainter->drawRect( pActualSpot->getX()-4, pActualSpot->getY()-4, 9, 9);
     121        }
     122        windowPainter->drawEllipse( LED1_X-4, LED1_Y-4, 9, 9);
     123        windowPainter->drawEllipse( LED2_X-4, LED2_Y-4, 9, 9);
     124        windowPainter->drawEllipse( LED3_X-4, LED3_Y-4, 9, 9);
     125        windowPainter->drawEllipse( LED4_X-4, LED4_Y-4, 9, 9);
     126
     127        // Draw the calibration pointa and the regression fits.
    113128        if( m_pCalibDlg != 0 )
    114129        {
     
    127142                if( pRegression->isValid() )
    128143                {
    129                         iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
    130                         iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
    131                         windowPainter->drawLine( iX1, 0, iX2, 479 );   
     144                if( ! pRegression->getReversed() ) {
     145                                iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
     146                                iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
     147                        windowPainter->drawLine( iX1, 0, iX2, 479 );
     148                        }       
     149                else
     150                        {
     151                                iX1 = (int) pRegression->getAxis();
     152                                iX2 = (int) ( pRegression->getAxis() + 479 * pRegression->getSlope() );
     153                        windowPainter->drawLine( iX1, 0, iX2, 479 );   
     154                        }
    132155                }
    133156
     
    135158                if( pRegression->isValid() )
    136159                {
    137                         iX1 = (int) ((   0. - pRegression->getAxis() ) / pRegression->getSlope());
    138                         iX2 = (int) (( 479. - pRegression->getAxis() ) / pRegression->getSlope());
    139                         windowPainter->drawLine( iX1, 0, iX2, 479 );   
     160                if( ! pRegression->getReversed() )
     161                        {
     162                                iX1 = (int) ((   0. - pRegression->getAxis()) / pRegression->getSlope());
     163                                iX2 = (int) (( 479. - pRegression->getAxis()) / pRegression->getSlope());
     164                        windowPainter->drawLine( iX1, 0, iX2, 479 );   
     165                        }
     166                else
     167                        {
     168                                iX1 = (int) pRegression->getAxis();
     169                                iX2 = (int) ( pRegression->getAxis() + 479 * pRegression->getSlope() );
     170                        windowPainter->drawLine( iX1, 0, iX2, 479 );   
     171//                              qDebug( "Drawing line: (%d,%d) - (%d,%d)", iX1, 0, iX2, 479 );
     172                        }
    140173                }
    141174               
     
    144177        // Draw a blue cross for the global reference point
    145178        windowPainter->setPen( Qt::blue );
    146         windowPainter->drawLine( g_iRefX-4, g_iRefY, g_iRefX+4, g_iRefY);
    147         windowPainter->drawLine( g_iRefX, g_iRefY-4, g_iRefX, g_iRefY+4);
     179        windowPainter->drawLine( g_dRefX-4., g_dRefY, g_dRefX+4., g_dRefY);
     180        windowPainter->drawLine( g_dRefX, g_dRefY-4., g_dRefX, g_dRefY+4.);
    148181
    149182        // Draw a green rectangle showing the reference point for this panel
    150         if( m_iRefX > 0)
     183        if( m_dRefX > 0)
    151184        {
    152185                windowPainter->setPen( Qt::green );
    153                 if( m_iCenterX > 1 )
     186                if( m_dCenterX > 1.0 )
    154187                {
    155188                        // Adapt spot for shift of camera center.
    156                         int iDx, iDy;
    157                         iDx = m_iCenterX - CAMERA_X;
    158                         iDy = m_iCenterY - CAMERA_Y;
    159                         windowPainter->drawRect( m_iRefX+iDx-4, m_iRefY+iDy-4, 9, 9 );
     189                        double dDx, dDy;
     190                        dDx = m_dCenterX - CAMERA_X;
     191                        dDy = m_dCenterY - CAMERA_Y;
     192                        windowPainter->drawRect( m_dRefX+dDx-4., m_dRefY+dDy-4., 9., 9. );
    160193                } else
    161                         windowPainter->drawRect( m_iRefX-4, m_iRefY-4, 9, 9 );
     194                        windowPainter->drawRect( m_dRefX-4., m_dRefY-4., 9., 9. );
    162195        }
    163196
     
    194227                        if( pActualSpot->isValid() )
    195228                        {
    196                                 str.sprintf("%d %d\n", pActualSpot->getX(), pActualSpot->getY() );
     229                                str.sprintf("%6.2f %6.2f %d\n", pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel() );
    197230                                stream << str;
    198231                        }
     
    206239                        if( pActualSpot->isValid() )
    207240                        {
    208                                 str.sprintf("%d %d\n", pActualSpot->getX(), pActualSpot->getY() );
     241                                str.sprintf("%6.2f %6.2f %d\n", pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel() );
    209242                                stream << str;
    210243                        }
     
    220253        uchar* pFrame = m_pImage->bits();
    221254        m_pVideoThread->getLastFrame( pFrame );
    222         uchar* pDark = m_darkFrame->data();
     255        uchar* pDark = m_pDarkFrame->data();
    223256
    224257        for(int ind=0; ind< (MY_HEIGHT * MY_WIDTH * MY_DEPTH); ind++, pDark++, pFrame++ )
     
    234267void VideoFrame::clearDarks()
    235268{
    236         m_darkFrame->fill(0);
     269        m_pDarkFrame->fill(0);
    237270        m_iDarks = 0;
    238271}
     
    299332        if( event->button() == RightButton )
    300333        {
    301                 g_iRefX = event->x();
    302                 g_iRefY = event->y();
    303                 emit gref( g_iRefX, g_iRefY );
     334                g_dRefX = event->x();
     335                g_dRefY = event->y();
     336                emit gref( g_dRefX, g_dRefY );
    304337        }
    305338}
     
    307340void VideoFrame::customEvent(QCustomEvent *e)
    308341{
    309   if ( e->type() == THREAD_END_EVENT )
    310         {
     342  if ( e->type() == THREAD_SPOT_EVENT )
     343        {
     344                g_theApp->processEvents();
     345    m_pSpotThread->getSpotList( &m_qlSpotList );
     346                m_pSpotThread->getFrame( m_pImage->bits() );
     347                m_iGoodFrame++;
    311348                repaint( FALSE );
     349
    312350    calcCenter();
    313351                if( m_qlSpots.count() == 1)
     
    318356                else
    319357                        emit spot( -1, -1 );
     358                g_theApp->processEvents();
     359
    320360        }
    321361  if ( e->type() == THREAD_FRAME_EVENT )
    322362        {
    323363                m_iFrame++;
    324                 if( ! m_pSpotThread->running() )       
    325                 {
    326                         m_iGoodFrame++;
    327                         m_pVideoThread->getLastFrame( m_pImage->bits() );
    328                         m_pSpotThread->start();
    329                 }
    330 //              else
    331 //                      qDebug("Dropping Frame");
     364                if( ! m_pSpotThread->isActive() )       
     365                {
     366                        m_pVideoThread->getLastFrame( m_pRawImage->bits() );
     367                        m_pSpotThread->wake();
     368                }
     369//else
     370//      qDebug("Dropping Frame");
     371                g_theApp->processEvents();
    332372        }
    333373}
     
    349389        if ( p_zStop == true )
    350390        {
     391                qDebug("Stoping video thread");
    351392                m_pVideoThread->stop();
    352393                m_pVideoThread->wait();         // Wait for video thread to finish
     394                qDebug("Stoping videospot thread");
     395                m_pSpotThread->stop();
     396                m_pSpotThread->wake();
    353397                m_pSpotThread->wait();          // Wait for spot thread to finish
    354398        }
    355399        else
     400        {
     401                qDebug("Starting video thread");
     402                m_pSpotThread->start();
     403                qDebug("Starting videospot thread");
    356404                m_pVideoThread->start();
     405        }
    357406}
    358407
     
    365414  int iNumLEDs = 0;
    366415
    367   m_iCenterX = m_iCenterY = 1;
     416  m_dCenterX = m_dCenterY = -1.;
    368417  m_qlLEDs.clear();
    369418  m_qlSpots.clear();
    370419
    371         QList<VideoSpot>& qlSpotList = m_pSpotThread->getSpotList();
    372         for( VideoSpot* pActualSpot = qlSpotList.first();
    373                  pActualSpot; pActualSpot = qlSpotList.next() )
     420        for( VideoSpot* pActualSpot = m_qlSpotList.first();
     421                 pActualSpot; pActualSpot = m_qlSpotList.next() )
    374422        {
    375423    // Check if this spot is compatible with the spot of the
     
    380428                        dY1 = pActualSpot->getY() + (CAMERA_Y - LED1_Y);
    381429                        dX += dX1; dY += dY1;
    382                         m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
     430                        m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
    383431      iNumLEDs++;
    384432                }
     
    390438                        dY2 = pActualSpot->getY() + (CAMERA_Y - LED2_Y);
    391439                        dX += dX2; dY += dY2;
    392                         m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
     440                        m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
    393441      iNumLEDs++;
    394442                }
     
    400448                        dY3 = pActualSpot->getY() + (CAMERA_Y - LED3_Y);
    401449                        dX += dX3; dY += dY3;
    402                         m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
     450                        m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
    403451      iNumLEDs++;
    404452                }
     
    410458                        dY4 = pActualSpot->getY() + (CAMERA_Y - LED4_Y);
    411459                        dX += dX4; dY += dY4;
    412                         m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
     460                        m_qlLEDs.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
    413461      iNumLEDs++;
    414462                }
    415463    else
    416                         m_qlSpots.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY()) );
     464                        m_qlSpots.append( new VideoSpot( pActualSpot->getX(), pActualSpot->getY(), pActualSpot->getNumPixel()) );
    417465  }
    418466  if( iNumLEDs != 0)
    419467        {
    420                 m_iCenterX = (int) rint(dX / iNumLEDs);
    421                 m_iCenterY = (int) rint(dY / iNumLEDs);
     468                m_dCenterX = dX / iNumLEDs;
     469                m_dCenterY = dY / iNumLEDs;
    422470//              qDebug("Center %d %d", m_iCenterX, m_iCenterY);
    423471        }
    424   qDebug("Center at: %d %d -- with %d LEDs",m_iCenterX, m_iCenterY, iNumLEDs );
    425 }
     472//  qDebug("Center at: %5.1f %5.1f -- with %d LEDs",m_dCenterX, m_dCenterY, iNumLEDs );
     473}
  • trunk/MagicSoft/AMC/activemirrorcontrol/activemirrorcontrol/videoframe.h

    r3401 r4495  
    5050  void saveFrame();
    5151  /** Set the reference position */
    52   void setRef( int p_iX, int p_iY ) { m_iRefX = p_iX; m_iRefY = p_iY; };
     52  void setRef( double p_dX, double p_dY ) { m_dRefX = p_dX; m_dRefY = p_dY; };
    5353  /** Set list of spots used to calibrate panel movement */
    5454  void setCalibDlg( CalibratePanelDialog* p_pDlg ) { m_pCalibDlg = p_pDlg; };
     
    7272  QImage* m_pImage;
    7373  /**  */
    74   QByteArray* m_darkFrame;
     74  QImage* m_pRawImage;
     75  /**  */
     76  QByteArray* m_pDarkFrame;
    7577  /**  */
    7678        CalibratePanelDialog* m_pCalibDlg;
     
    8587  /**  */
    8688  QPoint m_qpRef;
     89  /** List of spots found in frame. */
     90        QList<VideoSpot> m_qlSpotList;
    8791  /** List of spots found in frame. In this list the spots from the camera LEDs are removed */
    8892        QList<VideoSpot> m_qlSpots;
     
    96100  int m_iy;
    97101  /**  */
    98   int m_iRefX;
     102  double m_dRefX;
    99103  /**  */
    100   int m_iRefY;
     104  double m_dRefY;
    101105  /**  */
    102   int m_iCenterX;
     106  double m_dCenterX;
    103107  /**  */
    104   int m_iCenterY;
     108  double m_dCenterY;
    105109  /**  */
    106110  int m_iFrame;
     
    130134signals: // Signals
    131135  /** Signal emitted when we find a spot. */
    132   void spot( int p_iX, int p_iY );
     136  void spot( double p_dX, double p_dY );
    133137  /** Signal emitted when we set a global reference. */
    134   void gref( int p_iX, int p_iY );
     138  void gref( double p_dX, double p_dY );
    135139  /** Signal emitted whit the number of grabbed frames per second. */
    136140  void framesGrabbed( int p_iFrames );
Note: See TracChangeset for help on using the changeset viewer.