Thank you for your answer.
I wasted too much time with this, thus I tried another solution, and
I found and easiest way for me, directly in C, I directly use
xwindow through Xlib and everything works fine !!
Regards,
Cyril HAENEL
Le 29/04/2012 01:30, Jonathan Greig a écrit :
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"
<chae...@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@qt-project.org
http://lists.qt-project.org/mailman/listinfo/interest
--
Cyril Haenel
Registered Linux User #332632
|