/** * Copyright 2014 Comcast Cable Communications Management, LLC * * This file is part of CATS. * * CATS is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * CATS is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with CATS. If not, see <http://www.gnu.org/licenses/>. */ package com.comcast.cats.vision.panel.imagecompare; import static com.comcast.cats.vision.util.CatsVisionConstants.CLEAR_CURRENT_REGION; import static com.comcast.cats.vision.util.CatsVisionConstants.DELETE_REGION; import static com.comcast.cats.vision.util.CatsVisionConstants.IMAGE_COMPARE; import static com.comcast.cats.vision.util.CatsVisionConstants.IMAGE_WINDOW; import static com.comcast.cats.vision.util.CatsVisionConstants.LOAD_REGION; import static com.comcast.cats.vision.util.CatsVisionConstants.LOAD_SNAPSHOT; import static com.comcast.cats.vision.util.CatsVisionConstants.OCR; import static com.comcast.cats.vision.util.CatsVisionConstants.SAVE_SNAPSHOT; import static com.comcast.cats.vision.util.CatsVisionConstants.SAVE_SNAPSHOT_AS; import static com.comcast.cats.vision.util.CatsVisionConstants.SETTOP; import static com.comcast.cats.vision.util.CatsVisionConstants.TEST_ALL_IMAGE_COMPARES; import static com.comcast.cats.vision.util.CatsVisionConstants.TEST_CURRENT_REGION; import java.awt.Component; import java.awt.Dimension; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.WindowEvent; import java.awt.event.WindowListener; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import javax.swing.JFileChooser; import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JTabbedPane; import javax.xml.bind.JAXBException; import org.apache.log4j.Logger; import com.comcast.cats.Settop; import com.comcast.cats.event.CatsEventDispatcher; import com.comcast.cats.event.CatsEventType; import com.comcast.cats.image.ImageCompareRegionInfo; import com.comcast.cats.image.OCRCompareResult; import com.comcast.cats.image.OCRRegionInfo; import com.comcast.cats.image.RegionInfo; import com.comcast.cats.provider.BaseProvider; import com.comcast.cats.provider.ImageCompareProvider; import com.comcast.cats.provider.OCRProvider; import com.comcast.cats.provider.RegionLocatorProvider; import com.comcast.cats.provider.VideoProvider; import com.comcast.cats.provider.exceptions.ImageCompareException; import com.comcast.cats.provider.exceptions.OCRException; import com.comcast.cats.provider.impl.RegionLocatorProviderImpl; import com.comcast.cats.vision.panel.video.ResolutionType; import com.comcast.cats.vision.util.CatsVisionUtils; import com.comcast.cats.vision.util.PanelAndProviders; import com.comcast.cats.vision.util.ProviderType; /** * The controller class for the ImageCompareWindow. * * @author sajayjk * */ @Named public class ImageController implements ActionListener, MouseListener, WindowListener { private static final Logger logger = Logger.getLogger( ImageController.class ); private RegionLocatorProvider regionLocatorProviderImpl; private static final String IC_DIALOG_NAME = "imageWindow"; private static final Dimension DIMENSION = new Dimension( 1090, 780 ); private static final Point POINT = new Point( 50, 50 ); private static final Rectangle BOUNDS = new Rectangle( POINT, DIMENSION ); private Map< String, PanelAndProviders > macIdPanelAndProvidersMap = new LinkedHashMap< String, PanelAndProviders >(); private ImageCompareTabbedFrame icTabbedFrame; // TODO make this configurable private final static int IC_TIMEOUT_MS = 5000; private CatsEventDispatcher catsEventDispatcher; @Inject public ImageController( CatsEventDispatcher catsEventDispatcher ) { this.catsEventDispatcher = catsEventDispatcher; regionLocatorProviderImpl = new RegionLocatorProviderImpl(); } public void addImageCompareTab( Settop settop ) { if ( icTabbedFrame == null ) { logger.debug( "Creating ImageCompareTab" ); icTabbedFrame = new ImageCompareTabbedFrame( IMAGE_WINDOW, IC_DIALOG_NAME, DIMENSION ); icTabbedFrame.addWindowListener( this ); icTabbedFrame.setBounds( BOUNDS ); addImageComparePanelListeners(); } String macID = settop.getHostMacAddress(); VideoProvider videoProvider = settop.getVideo(); PanelAndProviders panelProviders = macIdPanelAndProvidersMap.get( macID ); if ( null != panelProviders ) { logger.debug( "Replacing old video image with new" ); ImageComparePanel imgComparePanel = ( ImageComparePanel ) panelProviders.getPanel(); icTabbedFrame.setImageOnPanel( imgComparePanel, videoProvider.getVideoImage() ); } else { logger.debug( "Creating new ImageComparePanel for settop- " + settop.getHostMacAddress() ); ImageComparePanel panel = createImageComparePanel( settop ); Map< ProviderType, BaseProvider > providers = new LinkedHashMap< ProviderType, BaseProvider >(); OCRProvider ocrProvider = settop.getOCRProvider(); providers.put( ProviderType.OCR, ocrProvider ); providers.put( ProviderType.IMAGE_COMPARE, settop.getImageCompareProvider() ); providers.put( ProviderType.VIDEO, videoProvider ); if ( null != ocrProvider ) { ocrProvider.setVideoURL( videoProvider.getVideoURL() ); } PanelAndProviders panelAndProviders = new PanelAndProviders( panel, providers ); macIdPanelAndProvidersMap.put( macID, panelAndProviders ); icTabbedFrame.addTab( macID, panel ); } } public ImageComparePanel createImageComparePanel( Settop settop ) { RegionDetailsPanel regionDetailsPanel = new RegionDetailsPanel(); FreezeVideoPanel freezeVideoPanel = new FreezeVideoPanel( settop.getVideo().getVideoImage() ); ImageCompareInfoPanel icInfoPanel = new ImageCompareInfoPanel(); ImageComparePanel imageComparePanel = new ImageComparePanel( settop.getHostMacAddress(), regionDetailsPanel, freezeVideoPanel, icInfoPanel ); return imageComparePanel; } private void addImageComparePanelListeners() { icTabbedFrame.addActionListener( this ); icTabbedFrame.addMouseListener( this ); } private void removeImageComparePanelListeners() { icTabbedFrame.removeActionListener( this ); icTabbedFrame.removeMouseListener( this ); } public void removeImageTab( String mac ) { if ( macIdPanelAndProvidersMap.containsKey( mac ) ) { logger.debug( "Removing Audio Tab with title -" + SETTOP + mac ); // Remove ImageCompare tab icTabbedFrame.removeTab( mac ); macIdPanelAndProvidersMap.remove( mac ); if ( macIdPanelAndProvidersMap.isEmpty() ) { // Remove ImageCompare frame removeImageCompareFrame(); } } } public void removeImageCompareFrame() { removeImageComparePanelListeners(); macIdPanelAndProvidersMap.clear(); icTabbedFrame.setVisible( false ); icTabbedFrame = null; } @Override public void actionPerformed( ActionEvent event ) { ImageComparePanel imageWindow = getImageComparePanel(); Object soucre = event.getSource(); if ( soucre instanceof JMenuItem ) { JMenuItem menuItem = ( JMenuItem ) soucre; String text = menuItem.getText(); if ( text.equals( LOAD_SNAPSHOT ) ) { loadImage( imageWindow ); } else if ( text.equals( SAVE_SNAPSHOT ) ) { save( imageWindow ); } else if ( text.equals( SAVE_SNAPSHOT_AS ) ) { saveAs( imageWindow ); } else if ( text.equals( IMAGE_COMPARE ) ) { createNewRegion( imageWindow, RegionDetailsPanel.IC_MODE ); } else if ( text.equals( OCR ) ) { createNewRegion( imageWindow, RegionDetailsPanel.OCR_MODE ); } else if ( text.equals( CLEAR_CURRENT_REGION ) ) { clearRegion( imageWindow ); } else if ( text.equals( TEST_CURRENT_REGION ) ) { testCurrentRegion( imageWindow ); } else if ( text.equals( TEST_ALL_IMAGE_COMPARES ) ) { testAllRegion( imageWindow ); } } } private ImageComparePanel getImageComparePanel() { JTabbedPane icTabbedPane = icTabbedFrame.getTabbedPane(); int tabIndex = icTabbedPane.getSelectedIndex(); Component component = icTabbedPane.getComponent( tabIndex ); ImageComparePanel imageComparePanel = ( ImageComparePanel ) component; return imageComparePanel; } /** * LoadImage Action for the menuLoadImage. Loads an image and its details to * IC CATS Vision. */ private void loadImage( ImageComparePanel icPanel ) { // TODO: check if existing region needs to be saved first. int retVal = icPanel.getRegionFileLoader().showOpenDialog( icPanel ); if ( JFileChooser.APPROVE_OPTION == retVal ) { String xmlPath = icPanel.getRegionFileLoader().getSelectedFile().getAbsolutePath(); icPanel.getRegionDetailsPanel().resetRegionDetails(); icPanel.getFreezeVideoPanel().clearRegion(); try { loadImage( icPanel, xmlPath ); } catch ( IOException exception ) { logger.error( exception.getMessage() ); CatsVisionUtils.showImageCompareDialog( "There is a problem with the xml file you have selected. Cannot load.", JOptionPane.ERROR_MESSAGE ); return; } catch ( IllegalArgumentException exception ) { // if illegal xml was chosen logger.error( exception.getMessage() ); CatsVisionUtils.showImageCompareDialog( "The selected xml file is not appropriate.", JOptionPane.ERROR_MESSAGE ); return; } enableMenus(); icPanel.getIcInfoPanel().setVisible( false ); icPanel.getRegionDetailsPanel().setVisible( true ); /* * connect the image with the region data. */ icPanel.getFreezeVideoPanel().registerDetailsPanel( icPanel.getRegionDetailsPanel() ); icPanel.getRegionFileSaver().setSelectedFile( icPanel.getRegionFileLoader().getSelectedFile() ); /* * to provide Save functionality. */ icPanel.getRegionDetailsPanel().setSnapshotFilepath( ImageCompareUtil.changeExtensionToJPG( xmlPath ) ); } } /** * Test All Regions Action. * * currently supports only IC. OCR not supported. */ private void testAllRegion( ImageComparePanel icPanel ) { disableMenus(); List< RegionInfo > regionsList = icPanel.getRegionDetailsPanel().getRegionsList(); List< RegionInfo > icRegions = new ArrayList< RegionInfo >(); for ( RegionInfo regionInfo : regionsList ) { if ( regionInfo instanceof ImageCompareRegionInfo ) { icRegions.add( ( ImageCompareRegionInfo ) regionInfo ); } } boolean doesICRegionExist = false; if ( !icRegions.isEmpty() ) { doesICRegionExist = true; Thread t = new Thread( new ImageCompareThread( icRegions ) ); t.start(); // starting a new thread to avoid blocking AWT's // thread. } if ( doesICRegionExist == false ) { enableMenus(); CatsVisionUtils.showInfo( "Test All Regions", "There was no Image Compare Regions to test" ); } } /** * Test Current Region */ private void testCurrentRegion( ImageComparePanel icPanel ) { disableMenus(); // starting a new thread to avoid blocking AWT's // thread. Runnable compareJob; if ( icPanel.getRegionDetailsPanel().getMode() == RegionDetailsPanel.IC_MODE ) { compareJob = new ImageCompareThread( icPanel.getRegionDetailsPanel().getCurrentRegion() ); } else { compareJob = new OCRCompareThread( icPanel.getRegionDetailsPanel().getCurrentRegion() ); } Thread t = new Thread( compareJob ); t.start(); } /** * Clear Region Action */ private void clearRegion( ImageComparePanel icPanel ) { icPanel.getFreezeVideoPanel().clearRegion(); } /** * Actual ImageCompare Region and image loading happens here. * * @param xmlPath * @throws IOException */ private void loadImage( ImageComparePanel icPanel, String xmlPath ) throws IOException { List< RegionInfo > regionsList = regionLocatorProviderImpl.getRegionInfo( xmlPath ); if ( null == regionsList || regionsList.size() <= 0 ) { CatsVisionUtils.showImageCompareDialog( "No Regions available for this image", JOptionPane.INFORMATION_MESSAGE ); } String imagePath = ImageCompareUtil.changeExtensionToJPG( xmlPath ); BufferedImage image = ImageCompareUtil.loadImageFromFile( imagePath ); if ( null == image ) { CatsVisionUtils.showImageCompareDialog( "Image cannot be found for the selected snapshot xml", JOptionPane.ERROR_MESSAGE ); return; } icPanel.setSnapImageSize( new Dimension( image.getWidth(), image.getHeight() ) ); icPanel.setCurrentImage( image, regionsList ); } /** * Create new Region Action. */ private void createNewRegion( ImageComparePanel icPanel, int mode ) { icPanel.getRegionDetailsPanel().setMode( mode ); if ( icPanel.getRegionDetailsPanel().isVisible() ) { // if it already exists; just clear it to get new data. icPanel.getRegionDetailsPanel().clearCurrentRegionDetails(); } else { icPanel.getIcInfoPanel().setVisible( false ); // hide the first // information panel. icPanel.getRegionDetailsPanel().setVisible( true ); icPanel.getFreezeVideoPanel().registerDetailsPanel( icPanel.getRegionDetailsPanel() ); enableMenus(); } } /** * Enables all disabled menues after region is loaded or new region is * selected. */ private void enableMenus() { icTabbedFrame.getMenuSaveImage().setEnabled( true ); icTabbedFrame.getMenuSaveAsImage().setEnabled( true ); icTabbedFrame.getMenuLoadRegion().setEnabled( true ); icTabbedFrame.getMenuDeleteRegion().setEnabled( true ); icTabbedFrame.getMenuClearRegion().setEnabled( true ); icTabbedFrame.getMenuTestCurrentRegion().setEnabled( true ); icTabbedFrame.getMenuTestAllRegions().setEnabled( true ); icTabbedFrame.getMenuLoadImage().setEnabled( true ); icTabbedFrame.getMenuNewImageCompareRegion().setEnabled( true ); icTabbedFrame.getMenuNewRegion().setEnabled( true ); } /** * Disables all menues while testing occurs. selected. */ private void disableMenus() { icTabbedFrame.getMenuSaveImage().setEnabled( false ); icTabbedFrame.getMenuSaveAsImage().setEnabled( false ); icTabbedFrame.getMenuLoadRegion().setEnabled( false ); icTabbedFrame.getMenuDeleteRegion().setEnabled( false ); icTabbedFrame.getMenuClearRegion().setEnabled( false ); icTabbedFrame.getMenuTestCurrentRegion().setEnabled( false ); icTabbedFrame.getMenuTestAllRegions().setEnabled( false ); icTabbedFrame.getMenuLoadImage().setEnabled( false ); icTabbedFrame.getMenuNewImageCompareRegion().setEnabled( false ); icTabbedFrame.getMenuNewRegion().setEnabled( false ); } /** * Save the current image and regions to disk. */ private void save( ImageComparePanel icPanel ) { String filePath = icPanel.getRegionDetailsPanel().getSnapshotFilepath(); if ( filePath != null ) { try { RegionLocatorProvider regionLocatorProvider = regionLocatorProviderImpl; regionLocatorProvider.saveImageAndRegion( icPanel.getRegionDetailsPanel().getRegionsList(), icPanel .getFreezeVideoPanel().getSnapshot(), filePath ); } catch ( IOException e ) { logger.error( e.getMessage() ); JOptionPane.showMessageDialog( icPanel, "An error occured while saving: " + icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath(), "Save Failed", JOptionPane.ERROR_MESSAGE ); } catch ( JAXBException e ) { logger.error( e.getMessage() ); JOptionPane.showMessageDialog( icPanel, "An error occured while saving: " + icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath() + "\n" + e.getMessage(), "Save Failed", JOptionPane.ERROR_MESSAGE ); } } else { saveAs( icPanel ); } } /** * Save the current image and regions to disk. * */ private void saveAs( ImageComparePanel icPanel) { // if "Save AS" or file not saved before int retVal = icPanel.getRegionFileSaver().showSaveDialog( icPanel ); if ( retVal == JFileChooser.APPROVE_OPTION ) { String fileName = icPanel.getRegionFileSaver().getSelectedFile().getName(); if ( fileName.endsWith( ".xml" ) ) { fileName = icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath().substring( 0, fileName.lastIndexOf( ".xml" ) ); } fileName = icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath().concat( ".jpg" ); try { RegionLocatorProvider regionLocatorProvider = regionLocatorProviderImpl; regionLocatorProvider.saveImageAndRegion( icPanel.getRegionDetailsPanel().getRegionsList(), icPanel .getFreezeVideoPanel().getSnapshot(), fileName ); icPanel.getRegionDetailsPanel().setSnapshotFilepath( fileName ); } catch ( IOException e ) { JOptionPane.showMessageDialog( icPanel, "An error occured while saving: " + icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath(), "Save Failed", JOptionPane.ERROR_MESSAGE ); } catch ( JAXBException e ) { logger.error( e.getMessage() ); JOptionPane.showMessageDialog( icPanel, "An error occured while saving: " + icPanel.getRegionFileSaver().getSelectedFile().getAbsolutePath() + "\n" + e.getMessage(), "Save Failed", JOptionPane.ERROR_MESSAGE ); } } } @Override public void mouseClicked( MouseEvent event ) { processEvent( event ); } @Override public void mouseEntered( MouseEvent event ) { processEvent( event ); } @Override public void mouseExited( MouseEvent arg0 ) { // TODO Auto-generated method stub } @Override public void mousePressed( MouseEvent arg0 ) { // TODO Auto-generated method stub } @Override public void mouseReleased( MouseEvent arg0 ) { // TODO Auto-generated method stub } /** * Start video mode; The panel will run the current video. */ public void startVideo( FreezeVideoPanel freezeVideoPanel, VideoProvider videoProvider ) { /* * add listener to receive video events */ catsEventDispatcher.addListener( freezeVideoPanel, CatsEventType.VIDEO, videoProvider ); freezeVideoPanel.startVideoMode(); } /** * Stop video. */ public void stopVideo( FreezeVideoPanel freezeVideoPanel, VideoProvider videoProvider ) { catsEventDispatcher.removeListener( freezeVideoPanel ); freezeVideoPanel.stopVideoMode(); } private void processEvent( MouseEvent event ) { Object soucre = event.getSource(); if ( soucre instanceof JMenuItem ) { JMenuItem menuItem = ( JMenuItem ) soucre; String text = menuItem.getText(); if ( text.equals( LOAD_REGION ) ) { /* * remove any existing menu items */ icTabbedFrame.getMenuLoadRegion().removeAll(); final ImageComparePanel icPanel = getImageComparePanel(); List< RegionInfo > regionList = icPanel.getRegionDetailsPanel().getRegionsList(); for ( RegionInfo regionInfo : regionList ) { JMenuItem regionMenuItem = new JMenuItem( regionInfo.getName() ); // add the latest set of regions icTabbedFrame.getMenuLoadRegion().add( regionMenuItem ); regionMenuItem.addActionListener( new ActionListener() { // on Clicking a region; load that to the window. @Override public void actionPerformed( ActionEvent actionEvent ) { List< RegionInfo > regionList = icPanel.getRegionDetailsPanel().getRegionsList(); for ( RegionInfo regionInfo : regionList ) { if ( regionInfo.getName().equals( ( ( JMenuItem ) actionEvent.getSource() ).getText() ) ) { icPanel.getFreezeVideoPanel().paintRegion( regionInfo ); icPanel.getRegionDetailsPanel().loadRegionDetails( regionInfo ); } } } } ); } } else if ( text.equals( DELETE_REGION ) ) { /* * remove any existing menu items */ icTabbedFrame.getMenuDeleteRegion().removeAll(); final ImageComparePanel icPanel = getImageComparePanel(); List< RegionInfo > regionList = icPanel.getRegionDetailsPanel().getRegionsList(); for ( RegionInfo regionInfo : regionList ) { JMenuItem regionMenuItem = new JMenuItem( regionInfo.getName() ); icTabbedFrame.getMenuDeleteRegion().add( regionMenuItem ); // add // the // latest // set of regions regionMenuItem.addActionListener( new ActionListener() { @Override public void actionPerformed( ActionEvent actionEvent ) { // on Clicking a region; delete that region. List< RegionInfo > regionList = icPanel.getRegionDetailsPanel().getRegionsList(); for ( RegionInfo regionInfo : regionList ) { if ( regionInfo.getName().equals( ( ( JMenuItem ) actionEvent.getSource() ).getText() ) ) { regionList.remove( regionInfo ); if ( icPanel.getRegionDetailsPanel().getCurrentRegion() != null && regionInfo.getName().equals( icPanel.getRegionDetailsPanel().getCurrentRegion().getName() ) ) { icPanel.getRegionDetailsPanel().clearCurrentRegionDetails(); icPanel.getFreezeVideoPanel().clearRegion(); } break; } } icPanel.getRegionDetailsPanel().setRegionsList( regionList ); // update // the // current // list } } ); } } } } /** * Thread class that takes on the responsibility of actual comparision. * Else, the AWT thread will be blocked and unavailable for painting, * keypress etc. * * @author sajayjk */ class ImageCompareThread implements Runnable { RegionInfo regionInfo = null; List< RegionInfo > regionInfoList = null; public ImageCompareThread( RegionInfo regionInfo ) { this.regionInfo = regionInfo; } public ImageCompareThread( List< RegionInfo > regionInfoList ) { this.regionInfoList = ( ArrayList< RegionInfo > ) regionInfoList; } @Override public void run() { long startTime = 0; long endTime = 0; boolean testResult = false; final ImageComparePanel icPanel = getImageComparePanel(); icPanel.getRegionDetailsPanel().showTestMode(); PanelAndProviders panelAndProviders = macIdPanelAndProvidersMap.get( icPanel.getName() ); ImageCompareProvider icProvider = ( ImageCompareProvider ) panelAndProviders .getProvider( ProviderType.IMAGE_COMPARE ); VideoProvider videoProvider = ( VideoProvider ) panelAndProviders.getProvider( ProviderType.VIDEO ); BufferedImage refImage = icPanel.getFreezeVideoPanel().getSnapshot(); try { if ( regionInfo != null && 0 != regionInfo.getWidth() && 0 != regionInfo.getHeight() ) { ArrayList< RegionInfo > list = new ArrayList< RegionInfo >(); list.add( regionInfo ); logger.debug( "Testing Region " + regionInfo ); icPanel.getFreezeVideoPanel().paintRegions( list ); // show test mode in all chils panels // icPanel.getFreezeVideoPanel().startVideoMode(); startVideo( icPanel.getFreezeVideoPanel(), videoProvider ); startTime = System.currentTimeMillis(); // testResult = icProvider.waitForRegion( ( ImageCompareRegionInfo ) regionInfo, refImage, // IC_TIMEOUT_MS ); endTime = System.currentTimeMillis(); logger.debug( "testResult " + testResult ); } else if ( regionInfoList != null && regionInfoList.size() != 0 ) { // show test mode in all chils panels // icPanel.getFreezeVideoPanel().startVideoMode(); startVideo( icPanel.getFreezeVideoPanel(), videoProvider ); logger.debug( "Testing All Regions" ); List< ImageCompareRegionInfo > icRegions = new ArrayList< ImageCompareRegionInfo >(); for ( RegionInfo regionInfo : regionInfoList ) { icRegions.add( ( ImageCompareRegionInfo ) regionInfo ); } icPanel.getFreezeVideoPanel().paintRegions( regionInfoList ); startTime = System.currentTimeMillis(); testResult = icProvider.waitForAllRegions( icRegions, refImage, IC_TIMEOUT_MS ); endTime = System.currentTimeMillis(); logger.debug( "testResult " + testResult ); } else { logger.debug( "Full Screen Compare" ); icPanel.getFreezeVideoPanel().clearRegion(); logger.debug( "Full Screen Compare IC" ); // show test mode in all chils panels // icPanel.getFreezeVideoPanel().startVideoMode(); startVideo( icPanel.getFreezeVideoPanel(), videoProvider ); startTime = System.currentTimeMillis(); testResult = icProvider.waitForImageOnScreen( refImage, IC_TIMEOUT_MS ); endTime = System.currentTimeMillis(); logger.debug( "testResult " + testResult ); } } catch ( ImageCompareException e ) { CatsVisionUtils.showError( e.getMessage() ); } icPanel.getRegionDetailsPanel().updateTestResults( testResult, ( int ) ( endTime - startTime ) ); // icPanel.getFreezeVideoPanel().stopVideoMode(); stopVideo( icPanel.getFreezeVideoPanel(), videoProvider ); enableMenus(); } } /** * Thread class that takes on the responsibility of actual OCR comparison. * Else, the AWT thread will be blocked and unavailable for painting, key * press etc. * * @author minujames */ class OCRCompareThread implements Runnable { RegionInfo regionInfo = null; public OCRCompareThread( RegionInfo regionInfo ) { this.regionInfo = regionInfo; } public void run() { long startTime = 0; long endTime = 0; boolean testResult = false; OCRCompareResult ocrResult = null; final ImageComparePanel icPanel = getImageComparePanel(); icPanel.getRegionDetailsPanel().showTestMode(); PanelAndProviders panelAndProviders = macIdPanelAndProvidersMap.get( icPanel.getName() ); VideoProvider videoProvider = ( VideoProvider ) panelAndProviders.getProvider( ProviderType.VIDEO ); OCRProvider ocrProvider = ( OCRProvider ) panelAndProviders.getProvider( ProviderType.OCR ); if ( null != ocrProvider ) { try { if ( regionInfo != null && 0 != regionInfo.getWidth() && 0 != regionInfo.getHeight() ) { ArrayList< RegionInfo > list = new ArrayList< RegionInfo >(); list.add( regionInfo ); logger.debug( "Testing Region " + regionInfo ); icPanel.getFreezeVideoPanel().paintRegions( list ); if ( isSnapshotResolutionValid( icPanel.getSnapImageSize(), ocrProvider, videoProvider ) ) { // show test mode in all chills panels // icPanel.getFreezeVideoPanel().startVideoMode(); startVideo( icPanel.getFreezeVideoPanel(), videoProvider ); startTime = System.currentTimeMillis(); // ocrResult = ocrProvider.waitForOCRRegionCompareResult( ( OCRRegionInfo ) regionInfo ); // testResult = ocrProvider.isOCRResultAccurate( ( OCRRegionInfo ) regionInfo, ocrResult ); endTime = System.currentTimeMillis(); // setMainVideoResolution( mainVideoSize ); } logger.debug( "testResult " + testResult ); } else { logger.debug( "Full Screen Compare OCR" ); icPanel.getFreezeVideoPanel().clearRegion(); if ( isSnapshotResolutionValid( icPanel.getSnapImageSize(), ocrProvider, videoProvider ) ) { // show test mode in all chills panels // icPanel.getFreezeVideoPanel().startVideoMode(); startVideo( icPanel.getFreezeVideoPanel(), videoProvider ); startTime = System.currentTimeMillis(); OCRRegionInfo currentRegion = ( OCRRegionInfo ) icPanel.getRegionDetailsPanel() .getCurrentRegion(); // ocrResult = ocrProvider.getOCRTextOnScreenNow( currentRegion ); // testResult = ocrProvider.isOCRResultAccurate( ( OCRRegionInfo ) regionInfo, ocrResult ); endTime = System.currentTimeMillis(); // setMainVideoResolution( mainVideoSize ); } logger.debug( "testResult " + testResult ); } } catch ( Exception e ) { CatsVisionUtils.showError( e.getMessage() ); } // icPanel.getFreezeVideoPanel().stopVideoMode(); stopVideo( icPanel.getFreezeVideoPanel(), videoProvider ); if ( testResult ) { CatsVisionUtils.showOCRResultOnSuccess( ocrResult ); } else { CatsVisionUtils.showOCRResultOnFailure( ocrResult ); } } else { CatsVisionUtils .showError( "Cannot perform OCR. OCR service is not available or \n the url is not configured in cats.props file as 'cats.ocr.server.url'." ); } icPanel.getRegionDetailsPanel().updateTestResults( testResult, ( int ) ( endTime - startTime ) ); enableMenus(); } // TODO - is this method needed? private boolean isSnapshotResolutionValid( Dimension snapImageSize, OCRProvider ocrProvider, VideoProvider videoProvider ) { boolean validResolution = true; Dimension mainVideoSize = videoProvider.getVideoSize(); if ( mainVideoSize.width != snapImageSize.width || mainVideoSize.height != snapImageSize.height ) { if ( ResolutionType.isResolutionValid( snapImageSize ) ) { // setMainVideoResolution( snapImageSize ); ocrProvider.setVideoURL( videoProvider.getVideoURL() ); } else { validResolution = false; CatsVisionUtils .showError( "Cannot Perform OCR. \n The resolution of the loaded image is not supported by the video server." ); } } return validResolution; } } @Override public void windowActivated( WindowEvent e ) { } @Override public void windowClosed( WindowEvent e ) { } @Override public void windowClosing( WindowEvent e ) { removeImageCompareFrame(); } @Override public void windowDeactivated( WindowEvent e ) { } @Override public void windowDeiconified( WindowEvent e ) { } @Override public void windowIconified( WindowEvent e ) { } @Override public void windowOpened( WindowEvent e ) { } }