Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. Mobile and Embedded
  4. Multitouch driver for Qt Embedded

Multitouch driver for Qt Embedded

Scheduled Pinned Locked Moved Mobile and Embedded
4 Posts 3 Posters 11.1k Views
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • L Offline
    L Offline
    Luc4
    wrote on last edited by
    #1

    Hi! Does anyone has ever been able to make multitouch work in Qt Embedded?
    I tried using tslib, but I can only get single touch support.
    I'm trying to understand what it is necessary to do to read the input device to get the events, but I can't understand how to do it. Do you have any idea of where I should go to get some information about this task?
    Thanks!

    1 Reply Last reply
    0
    • A Offline
      A Offline
      atluft
      wrote on last edited by
      #2

      Here is one way:

      Create mouse handler plugin

      Copy library to mousedrivers directory

      Set the environment variable like this @ export QWS_MOUSE_PROTO=LinuxMultiTouch:/dev/input/event0 @

      Run your multi touch enabled application

      I use a type A multi point device, see "multi-touch-protocol":http://www.kernel.org/doc/Documentation/input/multi-touch-protocol.txt

      Modify qmouselinuxtp_qws.cpp to read @/dev/input/event0@ and process the ABS_MT_TRACKING_ID,
      ABS_MT_POSITION_X, ABS_MT_POSITION_Y, and SYN_REPORT codes into tracks. A track has state (idle or not idle), x, and y values.

      ABS_MT_TRACKING_ID tells you a track is NOT_IDLE. This number is the track ID until the next ABS_MT_TRACKING_ID event changes the track info. Handle 32 tracks to start with and add more if needed.

      ABS_MT_POSITION_X and ABS_MT_POSITION_Y tell you the x and y position for the current track ID (last ABS_MT_TRACKING_ID value).

      SYN_REPORT, says its time to take action on what you collected.

      For each track ID and based on the new track state (IDLE or NOT IDLE) and last track state you should do one of the following:

      create a new touch point and associate it with the track ID

      update touch point associated with track ID

      release touch point associated with track ID

      Then copy the new track state to the old, erase the new, and start again.

      Use a second object TouchEventSender that allows the QMouseHandler to add, update, and release touch points, as well as send the final touch event. Its based on "EventSenderQt":http://gitorious.org/webkit/webkit/blobs/b53cac0efab7a5b62fe470d927d6f5699ec501e0/Tools/DumpRenderTree/qt/EventSenderQt.cpp

      Make certain to call setState, setPos, setNormalizedPos, and setScreenPos when creating a TouchPoint as the translation code will make use of them. Don't reuse touch point IDs (always incrementing counter).

      Eventually all this boils down to this one line of code in event sender.
      @qt_translateRawTouchEvent(NULL, QTouchEvent::TouchPad, m_currentTouches.values() );@

      Hope this was helpful,
      atl

      1 Reply Last reply
      0
      • L Offline
        L Offline
        Luc4
        wrote on last edited by
        #3

        This is an extraordinary answer! Thank you very much.
        Sorry if I'm late answering, but I've had to pause this job. Now I've been able to write a single touch driver by following your advices.
        By reading at the example you reported I understand that touches are handled differently from single touch, right? I mean that linuxtp sends mouse events, while the EventSender uses QApplication::sendEvent.

        My question is related to the fact that QAppplication::sendEvent requires to know exactly the receiver of the event. How can I know at the driver level who should the receiver of the event be?

        Thank you again for your indications! I hope I will be able to create a plugin for multi-touch as well.

        1 Reply Last reply
        0
        • S Offline
          S Offline
          samus8zero2x
          wrote on last edited by
          #4

          So, would this be considered the correct implementation?

          To summarize, you would generate a standard mouse event for each received point (or perhaps just the first point in the list of points), but you would also manage the TouchEvent data in the mouse handler as well?

          It seems like you would want to have a separate TouchEvent plugin rather than hack the QMouseHandler, but I guess that's not possible at this time?

          Also, if we we're actually making this plugin, we would need one that supports both type A and type B devices...or more probably two separate plugins for each, right?

          1 Reply Last reply
          0

          • Login

          • Login or register to search.
          • First post
            Last post
          0
          • Categories
          • Recent
          • Tags
          • Popular
          • Users
          • Groups
          • Search
          • Get Qt Extensions
          • Unsolved