mirror of
git://projects.qi-hardware.com/gmenu2x.git
synced 2024-11-27 00:41:53 +02:00
Cleanup of touch screen code.
Initialize in constructor and clean up in destructor instead of having separate init() and deinit() methods. Don't close file descriptor if open failed (ts_fd == -1). Renamed initialized() to available(), since it tests whether the touch screen was found, not whether an initialization was attempted. Improved code layout and minor other cleanups.
This commit is contained in:
parent
c7af4b1aea
commit
944ab86f9c
@ -64,7 +64,7 @@ bool BrowseDialog::exec()
|
|||||||
selected = 0;
|
selected = 0;
|
||||||
close = false;
|
close = false;
|
||||||
while (!close) {
|
while (!close) {
|
||||||
if (gmenu2x->ts.initialized()) gmenu2x->ts.poll();
|
if (gmenu2x->ts.available()) gmenu2x->ts.poll();
|
||||||
|
|
||||||
paint();
|
paint();
|
||||||
|
|
||||||
@ -111,7 +111,7 @@ void BrowseDialog::handleInput()
|
|||||||
action = getAction(button);
|
action = getAction(button);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (gmenu2x->ts.initialized() && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false;
|
if (gmenu2x->ts.available() && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false;
|
||||||
|
|
||||||
if (action == BrowseDialog::ACT_SELECT && (*fl)[selected] == "..")
|
if (action == BrowseDialog::ACT_SELECT && (*fl)[selected] == "..")
|
||||||
action = BrowseDialog::ACT_GOUP;
|
action = BrowseDialog::ACT_GOUP;
|
||||||
@ -250,7 +250,7 @@ void BrowseDialog::paint()
|
|||||||
icon->blit(gmenu2x->s, 5, offsetY);
|
icon->blit(gmenu2x->s, 5, offsetY);
|
||||||
gmenu2x->s->write(gmenu2x->font, (*fl)[i], 24, offsetY + 8, ASFont::HAlignLeft, ASFont::VAlignMiddle);
|
gmenu2x->s->write(gmenu2x->font, (*fl)[i], 24, offsetY + 8, ASFont::HAlignLeft, ASFont::VAlignMiddle);
|
||||||
|
|
||||||
if (gmenu2x->ts.initialized() && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, offsetY + 3, touchRect.w, rowHeight)) {
|
if (gmenu2x->ts.available() && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, offsetY + 3, touchRect.w, rowHeight)) {
|
||||||
ts_pressed = true;
|
ts_pressed = true;
|
||||||
selected = i;
|
selected = i;
|
||||||
}
|
}
|
||||||
|
@ -262,10 +262,7 @@ void GMenu2X::init() {
|
|||||||
/* gp2x_mem = open("/dev/mem", O_RDWR);
|
/* gp2x_mem = open("/dev/mem", O_RDWR);
|
||||||
gp2x_memregs=(unsigned short *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, gp2x_mem, 0xc0000000);
|
gp2x_memregs=(unsigned short *)mmap(0, 0x10000, PROT_READ|PROT_WRITE, MAP_SHARED, gp2x_mem, 0xc0000000);
|
||||||
MEM_REG=&gp2x_memregs[0];
|
MEM_REG=&gp2x_memregs[0];
|
||||||
if (f200) {
|
*/
|
||||||
//if wm97xx fails to open, set f200 to false to prevent any further access to the touchscreen
|
|
||||||
f200 = ts.init();
|
|
||||||
}*/
|
|
||||||
#else
|
#else
|
||||||
batteryHandle = fopen("/sys/class/power_supply/battery/capacity", "r");
|
batteryHandle = fopen("/sys/class/power_supply/battery/capacity", "r");
|
||||||
usbHandle = fopen("/sys/class/power_supply/usb/online", "r");
|
usbHandle = fopen("/sys/class/power_supply/usb/online", "r");
|
||||||
@ -287,8 +284,7 @@ void GMenu2X::deinit() {
|
|||||||
gp2x_memregs[0x290C>>1]=640;
|
gp2x_memregs[0x290C>>1]=640;
|
||||||
close(gp2x_mem);
|
close(gp2x_mem);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
if (f200) ts.deinit();*/
|
|
||||||
#else
|
#else
|
||||||
if (batteryHandle) fclose(batteryHandle);
|
if (batteryHandle) fclose(batteryHandle);
|
||||||
if (backlightHandle) fclose(backlightHandle);
|
if (backlightHandle) fclose(backlightHandle);
|
||||||
@ -1059,7 +1055,7 @@ void GMenu2X::main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts.initialized()) {
|
if (ts.available()) {
|
||||||
btnContextMenu.paint();
|
btnContextMenu.paint();
|
||||||
}
|
}
|
||||||
//check battery status every 60 seconds
|
//check battery status every 60 seconds
|
||||||
@ -1123,7 +1119,7 @@ void GMenu2X::main() {
|
|||||||
s->flip();
|
s->flip();
|
||||||
|
|
||||||
//touchscreen
|
//touchscreen
|
||||||
if (ts.initialized()) {
|
if (ts.available()) {
|
||||||
ts.poll();
|
ts.poll();
|
||||||
btnContextMenu.handleTS();
|
btnContextMenu.handleTS();
|
||||||
re.x = 0; re.y = 0; re.h = skinConfInt["topBarHeight"]; re.w = resX;
|
re.x = 0; re.y = 0; re.h = skinConfInt["topBarHeight"]; re.w = resX;
|
||||||
@ -1593,7 +1589,7 @@ void GMenu2X::contextMenu() {
|
|||||||
s->flip();
|
s->flip();
|
||||||
|
|
||||||
//touchscreen
|
//touchscreen
|
||||||
if (ts.initialized()) {
|
if (ts.available()) {
|
||||||
ts.poll();
|
ts.poll();
|
||||||
if (ts.released()) {
|
if (ts.released()) {
|
||||||
if (!ts.inRect(box))
|
if (!ts.inRect(box))
|
||||||
|
@ -174,7 +174,7 @@ public:
|
|||||||
//firmware type and version
|
//firmware type and version
|
||||||
std::string fwType, fwVersion;
|
std::string fwType, fwVersion;
|
||||||
|
|
||||||
bool isF200() { return ts.initialized(); }
|
bool isF200() { return ts.available(); }
|
||||||
|
|
||||||
// Open2x settings ---------------------------------------------------------
|
// Open2x settings ---------------------------------------------------------
|
||||||
bool o2x_usb_net_on_boot, o2x_ftp_on_boot, o2x_telnet_on_boot, o2x_gp2xjoy_on_boot, o2x_usb_host_on_boot, o2x_usb_hid_on_boot, o2x_usb_storage_on_boot;
|
bool o2x_usb_net_on_boot, o2x_ftp_on_boot, o2x_telnet_on_boot, o2x_gp2xjoy_on_boot, o2x_usb_host_on_boot, o2x_usb_hid_on_boot, o2x_usb_storage_on_boot;
|
||||||
|
@ -174,7 +174,7 @@ bool InputDialog::exec() {
|
|||||||
gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ts.initialized()) ts.poll();
|
if (ts.available()) ts.poll();
|
||||||
drawVirtualKeyboard();
|
drawVirtualKeyboard();
|
||||||
gmenu2x->s->flip();
|
gmenu2x->s->flip();
|
||||||
|
|
||||||
@ -291,7 +291,7 @@ void InputDialog::drawVirtualKeyboard() {
|
|||||||
};
|
};
|
||||||
|
|
||||||
//if ts on rect, change selection
|
//if ts on rect, change selection
|
||||||
if (ts.initialized() && ts.pressed() && ts.inRect(re)) {
|
if (ts.available() && ts.pressed() && ts.inRect(re)) {
|
||||||
selCol = xc;
|
selCol = xc;
|
||||||
selRow = l;
|
selRow = l;
|
||||||
}
|
}
|
||||||
@ -309,7 +309,7 @@ void InputDialog::drawVirtualKeyboard() {
|
|||||||
//Ok/Cancel
|
//Ok/Cancel
|
||||||
SDL_Rect re = {kbLeft-1, KB_TOP+kb->size()*KEY_HEIGHT, kbLength*KEY_WIDTH/2-1, KEY_HEIGHT-1};
|
SDL_Rect re = {kbLeft-1, KB_TOP+kb->size()*KEY_HEIGHT, kbLength*KEY_WIDTH/2-1, KEY_HEIGHT-1};
|
||||||
gmenu2x->s->rectangle(re, gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
gmenu2x->s->rectangle(re, gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
||||||
if (ts.initialized() && ts.pressed() && ts.inRect(re)) {
|
if (ts.available() && ts.pressed() && ts.inRect(re)) {
|
||||||
selCol = 0;
|
selCol = 0;
|
||||||
selRow = kb->size();
|
selRow = kb->size();
|
||||||
}
|
}
|
||||||
@ -320,7 +320,7 @@ void InputDialog::drawVirtualKeyboard() {
|
|||||||
|
|
||||||
re.x = kbLeft + kbLength * KEY_WIDTH / 2 - 1;
|
re.x = kbLeft + kbLength * KEY_WIDTH / 2 - 1;
|
||||||
gmenu2x->s->rectangle(re, gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
gmenu2x->s->rectangle(re, gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
|
||||||
if (ts.initialized() && ts.pressed() && ts.inRect(re)) {
|
if (ts.available() && ts.pressed() && ts.inRect(re)) {
|
||||||
selCol = 1;
|
selCol = 1;
|
||||||
selRow = kb->size();
|
selRow = kb->size();
|
||||||
}
|
}
|
||||||
|
@ -61,7 +61,7 @@ bool SettingsDialog::exec() {
|
|||||||
uint numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight;
|
uint numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight;
|
||||||
|
|
||||||
while (!close) {
|
while (!close) {
|
||||||
if (ts.initialized()) ts.poll();
|
if (ts.available()) ts.poll();
|
||||||
|
|
||||||
bg.blit(gmenu2x->s,0,0);
|
bg.blit(gmenu2x->s,0,0);
|
||||||
|
|
||||||
@ -88,11 +88,11 @@ bool SettingsDialog::exec() {
|
|||||||
|
|
||||||
gmenu2x->s->setClipRect(clipRect);
|
gmenu2x->s->setClipRect(clipRect);
|
||||||
if (ts_pressed && !ts.pressed()) ts_pressed = false;
|
if (ts_pressed && !ts.pressed()) ts_pressed = false;
|
||||||
if (ts.initialized() && ts.pressed() && !ts.inRect(touchRect)) ts_pressed = false;
|
if (ts.available() && ts.pressed() && !ts.inRect(touchRect)) ts_pressed = false;
|
||||||
for (i=firstElement; i<voices.size() && i<firstElement+numRows; i++) {
|
for (i=firstElement; i<voices.size() && i<firstElement+numRows; i++) {
|
||||||
iY = i-firstElement;
|
iY = i-firstElement;
|
||||||
voices[i]->draw(iY*rowHeight+gmenu2x->skinConfInt["topBarHeight"]+2);
|
voices[i]->draw(iY*rowHeight+gmenu2x->skinConfInt["topBarHeight"]+2);
|
||||||
if (ts.initialized() && ts.pressed() && ts.inRect(touchRect.x, touchRect.y+(iY*rowHeight), touchRect.w, rowHeight)) {
|
if (ts.available() && ts.pressed() && ts.inRect(touchRect.x, touchRect.y+(iY*rowHeight), touchRect.w, rowHeight)) {
|
||||||
ts_pressed = true;
|
ts_pressed = true;
|
||||||
sel = i;
|
sel = i;
|
||||||
}
|
}
|
||||||
|
@ -18,15 +18,13 @@
|
|||||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "touchscreen.h"
|
#include "touchscreen.h"
|
||||||
|
|
||||||
using namespace std;
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
|
||||||
|
|
||||||
Touchscreen::Touchscreen() {
|
Touchscreen::Touchscreen() {
|
||||||
ts_fd = 0;
|
|
||||||
calibrated = false;
|
calibrated = false;
|
||||||
wasPressed = false;
|
wasPressed = false;
|
||||||
_handled = false;
|
_handled = false;
|
||||||
@ -37,29 +35,23 @@ Touchscreen::Touchscreen() {
|
|||||||
event.x = 0;
|
event.x = 0;
|
||||||
event.y = 0;
|
event.y = 0;
|
||||||
event.pressure = 0;
|
event.pressure = 0;
|
||||||
|
#ifdef PLATFORM_GP2X
|
||||||
|
ts_fd = open("/dev/touchscreen/wm97xx", O_RDONLY|O_NOCTTY);
|
||||||
|
#else
|
||||||
|
ts_fd = 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
Touchscreen::~Touchscreen() {
|
Touchscreen::~Touchscreen() {
|
||||||
deinit();
|
if (ts_fd > 0) {
|
||||||
}
|
close(ts_fd);
|
||||||
|
}
|
||||||
bool Touchscreen::init() {
|
|
||||||
#ifdef PLATFORM_GP2X
|
|
||||||
ts_fd = open("/dev/touchscreen/wm97xx", O_RDONLY|O_NOCTTY);
|
|
||||||
#endif
|
|
||||||
return initialized();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Touchscreen::deinit()
|
|
||||||
{
|
|
||||||
if (ts_fd) close(ts_fd);
|
|
||||||
ts_fd = 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Touchscreen::calibrate() {
|
void Touchscreen::calibrate() {
|
||||||
if (event.pressure==0) {
|
if (event.pressure == 0) {
|
||||||
calibX = ((event.x-200)*320/3750)/4;
|
calibX = ((event.x - 200) * 320 / 3750) / 4;
|
||||||
calibY = (((event.y-200)*240/3750))/4;
|
calibY = (((event.y - 200) * 240 / 3750)) / 4;
|
||||||
calibrated = true;
|
calibrated = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -70,9 +62,9 @@ bool Touchscreen::poll() {
|
|||||||
read(ts_fd, &event, sizeof(TS_EVENT));
|
read(ts_fd, &event, sizeof(TS_EVENT));
|
||||||
if (!calibrated) calibrate();
|
if (!calibrated) calibrate();
|
||||||
|
|
||||||
if (event.pressure>0) {
|
if (event.pressure > 0) {
|
||||||
x = ((event.x-200)*320/3750)-calibX;
|
x = ((event.x - 200) * 320 / 3750) - calibX;
|
||||||
y = (240 - ((event.y-200)*240/3750))-calibY;
|
y = (240 - ((event.y - 200) * 240 / 3750)) - calibY;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
SDL_PumpEvents();
|
SDL_PumpEvents();
|
||||||
@ -105,7 +97,7 @@ void Touchscreen::setHandled() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::pressed() {
|
bool Touchscreen::pressed() {
|
||||||
return !_handled && event.pressure>0;
|
return !_handled && event.pressure > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::released() {
|
bool Touchscreen::released() {
|
||||||
@ -113,19 +105,22 @@ bool Touchscreen::released() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::inRect(SDL_Rect r) {
|
bool Touchscreen::inRect(SDL_Rect r) {
|
||||||
return !_handled && (y>=r.y) && (y<=r.y+r.h) && (x>=r.x) && (x<=r.x+r.w);
|
return !_handled &&
|
||||||
|
(y >= r.y) && (y <= r.y + r.h) && (x >= r.x) && (x <= r.x + r.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::inRect(int x, int y, int w, int h) {
|
bool Touchscreen::inRect(int x, int y, int w, int h) {
|
||||||
SDL_Rect rect = {x,y,w,h};
|
SDL_Rect rect = { x, y, w, h };
|
||||||
return inRect(rect);
|
return inRect(rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::startedInRect(SDL_Rect r) {
|
bool Touchscreen::startedInRect(SDL_Rect r) {
|
||||||
return !_handled && (startY>=r.y) && (startY<=r.y+r.h) && (startX>=r.x) && (startX<=r.x+r.w);
|
return !_handled &&
|
||||||
|
(startY >= r.y) && (startY <= r.y + r.h) &&
|
||||||
|
(startX >= r.x) && (startX <= r.x + r.w);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Touchscreen::startedInRect(int x, int y, int w, int h) {
|
bool Touchscreen::startedInRect(int x, int y, int w, int h) {
|
||||||
SDL_Rect rect = {x,y,w,h};
|
SDL_Rect rect = { x, y, w, h };
|
||||||
return startedInRect(rect);
|
return startedInRect(rect);
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -35,26 +34,13 @@ typedef struct {
|
|||||||
} TS_EVENT;
|
} TS_EVENT;
|
||||||
|
|
||||||
class Touchscreen {
|
class Touchscreen {
|
||||||
private:
|
|
||||||
int ts_fd;
|
|
||||||
bool calibrated, _handled;
|
|
||||||
TS_EVENT event;
|
|
||||||
int calibX, calibY;
|
|
||||||
int x, y, startX, startY;
|
|
||||||
bool wasPressed;
|
|
||||||
|
|
||||||
void calibrate(/*TS_EVENT event*/);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Touchscreen();
|
Touchscreen();
|
||||||
~Touchscreen();
|
~Touchscreen();
|
||||||
|
|
||||||
bool init();
|
bool available() {
|
||||||
void deinit();
|
|
||||||
|
|
||||||
bool initialized() {
|
|
||||||
#ifdef PLATFORM_GP2X
|
#ifdef PLATFORM_GP2X
|
||||||
return ts_fd>0;
|
return ts_fd > 0;
|
||||||
#endif
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -73,6 +59,16 @@ public:
|
|||||||
|
|
||||||
int getX() { return x; }
|
int getX() { return x; }
|
||||||
int getY() { return y; }
|
int getY() { return y; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int ts_fd;
|
||||||
|
bool calibrated, _handled;
|
||||||
|
TS_EVENT event;
|
||||||
|
int calibX, calibY;
|
||||||
|
int x, y, startX, startY;
|
||||||
|
bool wasPressed;
|
||||||
|
|
||||||
|
void calibrate(/*TS_EVENT event*/);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user