[Interest] Looking for help or for a QT developer

Jonathan Greig redteam316 at gmail.com
Sun Apr 29 01:30:51 CEST 2012


You can only use QPixmap from the main (GUI) thread. Look at this for more
info: http://lists.trolltech.com/qt-interest/2008-11/msg00534.html

I'm mentally parsing your code from my phone, but it looks like you should
use an intermediate struct or QByteArray when you need to  mess with the
pixmap data. Then reload the pixmap from the main thread with
loadFromData(yourbytearray). Hope that helps :)

- Swyped from my droid.

On Apr 28, 2012 3:53 AM, "Cyril HAENEL" <chaenel at free.fr> wrote:

Hello, I have a very small QT application to do for my personal use but
after some days of unsuccessful I am looking for help.
I am sure a QT guru can do this application in less than half an hour !!

I am an electronic and C programmer enthusiast (not C++!!) . For a
project which use a TFT touchscreen I want to simulate the TFT
touchscreen on my computer to be able to develop and test all my
embedded GUI application on my computer instead on the microcontroller
target. My code is portable and can be compiled on a computer, I have a
good hardware abstraction layer to hide the hardware specificity of the
board/computer. The big advantage is that I don't need the board to
develop my project, just need to recompile for my microcontroller and
download in target when everything is OK.

Thus what I need is just a QT app which simulate a TFT screen by
creating an 480x272 image in which my C application (through very simple
API) can change a pixel color (in RGB565 mode), get a pixel color, and
get the X/Y mouse position and buttons states.

Thus the QT application job is :

- Create an empty 480x272 white image
- Refresh the image on the window every 50ms for example (20Hz refresh
rate is sufficient for me), no need to refresh the image each time a
pixel is changed by my C program.
- Create a thread to call a *C* function which will be the main of my C
application, which never return and will use the emulated TFT screen
through the API.

My C program needs access to the emulated TFT screen by calling 3
functions :

void setPixelColor ( unsigned short x, unsigned short y, unsigned color)

unsigned short getPixelColor ( unsigned short x, unsigned short y)

unsigned char getTouchScreenState ( unsigned char *x,  unsigned char *y
) --> return FALSE if mouse left button is not pressed, TRUE if left
button pressed with x and y for the cursor coordinates)

The difficulty seems to be having a C++ QT part which periodicaly
refresh a local image in the window, and a *C* thread which need to
access the image pixels and mouse status.

Do you think someone can help me ? I already wrote (under linux) a very
horrible code, it works a little but crashes after some time with this
king of error :

QApplication: Invalid Display* argument
QPixmap: It is not safe to use pixmaps outside the GUI thread
calculateurVEframebuffer: xcb_io.c :176 : process_responses:
L'assertion « !(req && current_request && !(((long) (req->sequence) -
(long) (current_request)) <= 0)) » a échoué.
Abandon

Or sometime my 50ms periodic function is not called anymore, thus
display refresh stops :(

Here is my horrible code (main.cpp) :

#include <qapplication.h>
#include <qpainter.h>
#include <qlabel.h>
#include <qpixmap.h>
#include <qpaintdevice.h>
#include <qtimer.h>
#include <stdio.h>
#include <signal.h>
#include <sys/time.h>
#include <pthread.h>


QApplication* app = new QApplication( 0, 0 );
QImage* image = new QImage(480,272, QImage::Format_ARGB32);
QLabel myLabel;




// Bridge with the C program part

extern "C" {
int mainDemo (void);
// Change pixel color on the emulated TFT screen
void _PutPixel(short x, short y, short color );
// Get pixel color on the emulated TFT screen
unsigned short _GetPixel(short x, short y );
// Indicate mouse position on the emulated TFT screen and mouse buttons
statePermet de connaitre la position X/Y de la souris sur l'ecran TFT
virtuel et l'état des boutons
extern short mouseX, mouseY, mouseState;
}



// API used by the C program part

#define GFX_COLOR unsigned short
#define RGBConvert(red, green, blue)    (GFX_COLOR) (((((GFX_COLOR)(red)
& 0xF8) >> 3) << 11) | ((((GFX_COLOR)(green) & 0xFC) >> 2) << 5) |
(((GFX_COLOR)(blue) & 0xF8) >> 3))


void _PutPixel(short x, short y, short color )
{
 QRgb pixel;
 pixel = qRgb( ((color>>11)&0b11111)<<3, ((color>>5)&0b111111)<<2,
(color&0b11111)<<3 );
 image->setPixel( x, y, pixel );
}


unsigned short _GetPixel(short x, short y )
{
 QRgb color;

 color = image->pixel(x, y);

 return( RGBConvert( (color>>16)&0xFF,(color>>8)&0xFF,color&0xFF ) );
}








// Periodic function called every 50ms the simulate the TFT screen
refresh by reloading the
// image in the window

static void timer50msInt ( int sig )
{
 QPoint mousePos;
 QRect geom;
 int mouseButton, x, y;

 signal( SIGALRM, timer50msInt );

 // Image reload
 myLabel.setPixmap(QPixmap::fromImage(*image));

 // Get mouse coordinate and convert in window mouse coordinate with
the window position
 mousePos = QCursor::pos();
 x = mousePos.x();
 y = mousePos.y();
 geom = myLabel.geometry();
 x = x - geom.x();
 y = y - geom.y();

 // Get mouse buttons state
 mouseButton = app->mouseButtons();

 // Pass mouse coordinate and mouse button states to the C program part
 mouseX = x;
 mouseY = y;
 mouseState = mouseButton;

// printf( "%d %d %d\n", x, y, mouseButton );
}




// Launch 50ms periodic function

void _timerInit ( void )
{
 struct itimerval timer;

 timer.it_interval.tv_sec = 0;
 timer.it_interval.tv_usec = 50000;

 timer.it_value.tv_sec = timer.it_interval.tv_sec;
 timer.it_value.tv_usec = timer.it_interval.tv_usec;

 signal( SIGALRM, timer50msInt );

 setitimer( ITIMER_REAL, &timer, NULL );
}








// Thread used to call my C program part which will use the virtual TFT
touchscreen

void* monAppli ( void *ptr )
{
 usleep( 500000 );

  // Launch the 50ms periodic function
 _timerInit();

 // My C program part which use the virtual TFT touchscreen
 mainDemo();

 return 0;
}






int main (int argc, char* argv[])
{
 pthread_t thread;

 // Thread creation for my C program part
 pthread_create( &thread, NULL, monAppli, (void*) NULL);

 // Loading of the image whish simulate the TFT screen content
 myLabel.setPixmap(QPixmap::fromImage(*image));
 myLabel.show();

 return app->exec() ;
}






Regards
Cyril HAENEL




--

Cyril Haenel
Registered Linux User #332632

_______________________________________________
Interest mailing list
Interest at qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.qt-project.org/pipermail/interest/attachments/20120428/b68e4698/attachment.html>


More information about the Interest mailing list