Go back to Richel Bilderbeek's homepage.

Go back to Richel Bilderbeek's C++ page.

 

 

 

 

 

(C++) LibcvautomationExample4

 

QtQt CreatorLubuntu

 

libcvautomation example 4: Qt Creator project around adapted example is a libcvautomation example of a Qt Creator project around an example supplied by Bradlee Speice (the author of libcvautomation). This example uses C++ and compiles cleanly and has the tabs replaced by spaces.

 

Technical facts

 

Operating system(s) or programming environment(s)

IDE(s):

Project type:

C++ standard:

Compiler(s):

Libraries used:

 

 

 

 

 

Qt project file: ./CppLibcvautomationExample4/CppLibcvautomationExample4.pro

 

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt
QMAKE_CXXFLAGS += -Wall -Wextra -Werror
SOURCES += main.cpp

#
#
# libcvautomation
#
# add path to #include paths, link statically to code
#
#
INCLUDEPATH += ../../Libraries/libcvautomation/include
SOURCES += \
    ../../Libraries/libcvautomation/libcvautomation/libcvautomation-xtest.c \
    ../../Libraries/libcvautomation/libcvautomation/libcvautomation-xlib.c \
    ../../Libraries/libcvautomation/libcvautomation/libcvautomation-opencv.c

# Link to X11 library
# undefined reference to `XOpenDisplay'
LIBS += -lX11

# Link to Xtst library
# undefined reference to `XTestQueryExtension'
LIBS += -lXtst

# Link to OpenCV library
# undefined reference to `cvFree_'
unix {
   CONFIG += link_pkgconfig
   PKGCONFIG += opencv
}

 

 

 

 

 

./CppLibcvautomationExample4/main.cpp

 

/*
* =====================================================================================
*
*       Filename:  cva-input.c
*
*    Description:  This is an example program to demonstrate the XTest and XInput
*                            functionality in libcvautomation
*
*        Created:  06/26/2012 09:20:20 AM
*       Revision:  none
*       Compiler:  gcc
*
*         Author:  Bradlee Speice (), bspeice.nc@gmail.com
*   Organization:
*
* =====================================================================================
*/
// Adapted by Richel Bilderbeek to C++

extern "C"
{
  #include <stdlib.h>
  #include <stdio.h>
  #include <unistd.h>
  #include <getopt.h>
  #include <limits.h>
  #include <math.h>

  #include <libcvautomation/libcvautomation.h>
}

#include <iostream>
#include <string>

void usage ();
void checkXTEEnabled (Display *display);

int main( int argc, char** argv )
{
  /* Set up for getopt */
  int mouseButton = 1;
  const std::string separator = ",";
  const std::string xDisplayLocation = "";
  Display *display = 0;
  int searchMember function = 0;
  int tolerance = INT_MAX;
  int timeout = 5;

  int returnCode = 1;

  /* Start getopt */
  while (1)
  {
    static struct option long_options[] =
    {
      {"help",          no_argument,      0,'h'},
      {"usage",         no_argument,      0,'u'},
      {"version",       no_argument,      0,'v'},
      {"display",       required_argument,0,'d'},
      {"search-member function", required_argument,0,'m'},
      {"tolerance",     required_argument,0,'t'},
      {"button",        required_argument,0,'b'},
      {"string",        required_argument,0,'s'},
      {"sane-tolerance",required_argument,0,'o'},
      {"print-format",  required_argument,0,'p'},
      {"timeout",       required_argument,0,'i'},
      /* Other valid values are "optional_argument"
       * and "required_argument" */
      {0, 0, 0, 0}
    };

    int option_index = 0;
    opterr = 0;

    int c = getopt_long (
       argc, argv, "hud:m:t:b:cs:", /* Use a single colon for required_argument,
                                     * double colon for optional_argument */
       long_options, &option_index);

    /* We're done with parsing options */
    if (c == -1)
      break;

    switch (c)
    {
      case 0:
        break;

      case 'h':
        usage();
        break;

      case 'u':
        usage();
        break;

      case 'v':
        usage();
        break;

      case 'd':
        if (display == NULL)
          display = XOpenDisplay( optarg );
        else
        {
          XCloseDisplay( display );
          XOpenDisplay( optarg );
        }
      case 'm':
        searchMember function = atoi(optarg);
        break;

      case 't':
        tolerance = atoi(optarg);
        break;

      case 'b':
        mouseButton = atoi(optarg);
        break;

      case 's':
        if (display == NULL)
                display = XOpenDisplay( xDisplayLocation.c_str() );
        cvaPoint returnPoint;
        returnPoint = xte_commandString( display, optarg, mouseButton, searchMember function, tolerance, timeout );

        if (returnPoint.x == -2 && returnPoint.y == -2)
        {
          /* Not an error, just that the command didn't use returnPoint */
          printf("%s\n", optarg);
          returnCode = 0;
        }

        else if (returnPoint.x != -1 && returnPoint.y != -1)
        {
          std::cout << optarg << separator << returnPoint.x << separator << returnPoint.y << '\n';
          //printf("%s%s%i%s%i\n", optarg, separator, returnPoint.x, separator, returnPoint.y);
          returnCode = 0;
        }

        break;

      case 'o':
        tolerance = atoi(optarg);
        /* Provide a more sane way to configure tolerance:
         * --sane-tolerance=100 ~= INT_MAX */
        tolerance = pow(1.2397076, tolerance);
        break;

      case 'i':
        timeout = atoi(optarg);
        break;

      case '?':
        /* Error routine */
        break;

      default:
        fprintf( stderr, "Unknown option..." );
        exit(0);
    };
  }

  if ( display != NULL )
  XCloseDisplay( display );

  return returnCode;
}

/*
* ===  FUNCTION  ======================================================================
*         Name:  usage
*  Description:  I really shouldn't need to write this
* =====================================================================================
*/
void usage()
{
  fprintf( stderr, "\
  Libcvautomation version: %s\n\
  cva-input -s <command_string>\n\
  \n\
  The cva-input program demonstrates the XTest section of libcvautomation.\n\
  The return code is 1 if there are no commands given, or if all commands fail.\n\
  It is 0 otherwise.\n\
  \n\
  Usage: \n\
  \n\
  \t-h, --help:\t\tDisplay this usage message.\n\
  \t-u, --usage:\t\tDisplay this usage message.\n\
  \t-d, --display:\t\tSpecify the X display to use.\n\
  \t-m, --search-member function:\tSpecify a member function to search by. See `cva-match --help\'\n\
  \t\t\t\tfor more information on this.\n\
  \t-t, --tolerance:\tSpecify how strict the match is.\n\
  \t-b, --button:\t\tSpecify the mouse button to press (default 1).\n\
  \t-c, --center:\t\tInstead of matching the top-left corner of an image,\n\
  \t\t\t\tmatch the center of the image.\n\
  \t-o, --sane-tolerance:\tSet the tolerance using a scale of 1-100,\n\
  \t-i, --timeout:\t\tSpecify the timeout to use when using the 'waitfor' function\n\
  \t-s, --string:\t\tCommand string - see below.\n\
  \t\t\t\tPlease make sure to use the '-t' or '-o' options when using this.\n\
  \n\
  This program works kind of like a mini-language. All options\n\
  are parsed left-to-right, and executed right there. Thus, specifying \"--display\"\n\
  at different places in the options will cause this program to use the most recent\n\
  given display.\n\
  Available commands:\n\
  \tmouseclick:\tClick the mouse in-place.\n\
  \timouseclick:\tClick the mouse at an image's top-left corner.\n\
  \ticmouseclick:\tClick the mouse at an image's center.\n\
  \tmousexy:\tMove the mouse to the given coordinate.\n\
  \tmouserxy:\tMove the mouse by the given x and y values (relative motion).\n\
  \tmouseimage:\tMove the mouse to an image's top-left corner.\n\
  \tcmouseimage:\tMove the mouse to an image's center.\n\
  \tmousedown:\tPush and leave down a mouse button.\n\
  \tmouseup:\tRelease a mouse button.\n\
  \tmousejiggle:\tJiggle the mouse (helps to activate some widgets).\n\
  \tmousescrollu:\tScroll the mouse wheel up.\n\
  \tmousescrolld:\tScroll the mouse wheel down.\n\
  \tmouselocation:\tReturn the location of the mouse.\n\
  \tkeyclick:\tClick a keyboard button.\n\
  \tkeydown:\tPush and leave down a keyboard button.\n\
  \tkeyup:\tRelease a keyboard button.\n\
  \tkeystring:\tInput a string of keys to X11.\n\
  \twaitfor:\tWait for an image to be displayed.\n\
  \n\
  If you have any questions, comments, concerns, email <%s>.\n\n", LIBCVAUTOMATION_VERSION, LIBCVAUTOMATION_BUGREPORT );

  exit (0);
}

void checkXTEEnabled ( Display *display )
{
  /* Make sure we have the XTest Extensions enabled.
   * This is a quick wrapper. */
  if (! xte_XTestSupported( display ))
  {
    printf("The XTest extension is not supported! Aborting...");
    exit(255);
  }
}

/* Doxygen Information */
/** \file cva-input.c
* \brief The cva-input program to demonstrate Libcvautomation's XTest functionality
* \author Bradlee Speice <bspeice@uncc.edu>
*/

/* The biggest purpose of documenting this code is to trick doxygen into making a man page for it. */
/** \page cva-input
*
* \author Bradlee Speice <bspeice@uncc.edu>
* \section usage Usage:
* This program works kind of like a mini-language. All options are parsed left-to-right, and executed right there. Thus, specifying "--display" at different places in the options will cause this program to use the most recent given display.
* The return code is 1 if there are no commands given, or if all commands fail. It is 0 otherwise.
* \section example Example Usage:
* Click the mouse:
*
* cva-input -s 'click 1'
*
* Press key 'a':
*
* cva-input -s 'keyclick a'
*
* \section options Full Options:
*
* -h, --help:                  Display this usage message.
*
* -u, --usage:                  Display this usage message.
*
* -d, --display:            Specify the X display to use.
*
* -m, --search-member function:      Specify a member function to search by. See <tt>cva-match --help</tt> for more information on this.
*
* -t, --tolerance:            Specify how strict the match is.
*
* -b, --button:            Specify the mouse button to press (default 1).
*
* -c, --center:            Instead of matching the top-left corner of an image, match the center of the image.
*
* -o, --sane-tolerance: Set the tolerance using a scale of 1-100, rather than INT_MIN to INT_MAX (100 ~= INT_MAX)
*
* -s, --string:            Command string - see below.
*
* -i, --timeout:            Specify the timeout to use when using the 'waitfor' command
*
*
* \section commands Full Command List:
* \c mouseclick:      Click the mouse in-place.
*
* \c imouseclick:      Click the mouse at an image's top-left corner.
*
* \c icmouseclick:      Click the mouse at an image's center.
*
* \c mousexy:      Move the mouse to the given coordinate.
*
* \c mouserxy:      Move the mouse by the given x and y values (relative motion).
*
* \c mouseimage:      Move the mouse to an image's top-left corner.
*
* \c cmouseimage:      Move the mouse to an image's center.
*
* \c mousedown:      Push and leave down a mouse button.
*
* \c mouseup:      Release a mouse button.
*
* \c mousejiggle:      Jiggle the mouse (helps to activate some widgets).
*
* \c mousescrollu: Scroll the mouse wheel up
*
* \c mousescrolld: Scroll the mouse wheel down
*
* \c mouselocation: Return the current location of the mouse
*
* \c keyclick:      Click a keyboard button.
*
* \c keydown:      Push and leave down a keyboard button.
*
* \c keyup:      Release a keyboard button.
*
* \c keystring:      Input a string of keys to X11.
*
* \c waitfor:      Wait for an image to be displayed
*
* \section contact Contact Information:
* Questions? Comments? Concerns? Suggestions? Send all feedback to Bradlee Speice at <bspeice@uncc.edu>
*/

 

 

 

 

 

./CppLibcvautomationExample4/CppLibcvautomationExample4.sh

 

#!/bin/sh
./CppLibcvautomationExample4 -s "mouselocation"
./CppLibcvautomationExample4 -s "mousexy 100 100"
./CppLibcvautomationExample4 -s "mouseclick"
./CppLibcvautomationExample4 -s "mouselocation"

 

 

 

 

 

Go back to Richel Bilderbeek's C++ page.

Go back to Richel Bilderbeek's homepage.

 

Valid XHTML 1.0 Strict

This page has been created by the tool CodeToHtml