touch screen handler for the microchip AR1020
Diff: AreaTouchHandler.cpp
- Revision:
- 4:510ea5b28a05
- Parent:
- 3:b7eb3b3fe79f
--- a/AreaTouchHandler.cpp Tue Feb 22 22:54:25 2011 +0000 +++ b/AreaTouchHandler.cpp Thu Feb 24 14:00:17 2011 +0000 @@ -1,83 +1,109 @@ -/* -* mbed AR1020 library -* Copyright (c) 2010 Hendrik Lipka -* -* Permission is hereby granted, free of charge, to any person obtaining a copy -* of this software and associated documentation files (the "Software"), to deal -* in the Software without restriction, including without limitation the rights -* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -* copies of the Software, and to permit persons to whom the Software is -* furnished to do so, subject to the following conditions: -* -* The above copyright notice and this permission notice shall be included in -* all copies or substantial portions of the Software. -* -* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -* THE SOFTWARE. -*/ - -#include "AreaTouchHandler.h" -#include "touchevent.h" - -using namespace std; - -uint32_t AreaTouchHandler::down(uint32_t arg) -{ - TouchEvent *te=(TouchEvent*)arg; -// printf("d %i/%i\n",te->x,te->y); - _x=te->x; - _y=te->y; - _samples=1; - int c=findCommand(); - _called=false; - if (0!=c) - { - _called=true; - _callback.call(c); - } - return 0; -} -uint32_t AreaTouchHandler::move(uint32_t arg) -{ - if (_called) - return 0; - TouchEvent *te=(TouchEvent*)arg; -// printf("m %i/%i\n",te->x,te->y); - _x=(te->x+_x*_samples)/(_samples+1); - _y=(te->y+_y*_samples)/(_samples+1); - _samples++; - int c=findCommand(); - if (0!=c) - { - _called=true; - _callback.call(c); - } - return 0; -} -uint32_t AreaTouchHandler::up(uint32_t arg) -{ - _x=0; - _y=0; - _samples=0; - _called=false; - return 0; -} - -int AreaTouchHandler::findCommand() -{ - if (_called) - return 0; - if (_samples<5) - return 0; - for (list<area*>::iterator it = _areas.begin(); it != _areas.end(); it++) { - area* a=*it; - if (_x>=a->left && _x<=a->right && _y>=a->top && _y<=a->bottom) - return a->command; - } - return 0; -} +/* +* mbed AR1020 library +* Copyright (c) 2010 Hendrik Lipka +* +* Permission is hereby granted, free of charge, to any person obtaining a copy +* of this software and associated documentation files (the "Software"), to deal +* in the Software without restriction, including without limitation the rights +* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +* copies of the Software, and to permit persons to whom the Software is +* furnished to do so, subject to the following conditions: +* +* The above copyright notice and this permission notice shall be included in +* all copies or substantial portions of the Software. +* +* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +* THE SOFTWARE. +*/ + +#include "AreaTouchHandler.h" +#include "touchevent.h" + +using namespace std; + +class area +{ + public: + int top,bottom,left,right,command; + area(int top, int bottom, int left, int right, int command) + { + this->top=top; + this->bottom=bottom; + this->left=left; + this->right=right; + this->command=command; + } +}; + +AreaTouchHandler::AreaTouchHandler(TouchPanel* panel) +{ + panel->attachPenDown(this,&AreaTouchHandler::down); + panel->attachPenMove(this,&AreaTouchHandler::move); + panel->attachPenUp(this,&AreaTouchHandler::up); +} + +void AreaTouchHandler::addArea(int top, int bottom, int left, int right, int commandCode) +{ + _areas.push_back(new area(top,bottom,left,right,commandCode)); +} + +uint32_t AreaTouchHandler::down(uint32_t arg) +{ + TouchEvent *te=(TouchEvent*)arg; +// printf("d %i/%i\n",te->x,te->y); + _x=te->x; + _y=te->y; + _samples=1; + int c=findCommand(); + _called=false; + if (0!=c) + { + _called=true; + _callback.call(c); + } + return 0; +} +uint32_t AreaTouchHandler::move(uint32_t arg) +{ + if (_called) + return 0; + TouchEvent *te=(TouchEvent*)arg; +// printf("m %i/%i\n",te->x,te->y); + _x=(te->x+_x*_samples)/(_samples+1); + _y=(te->y+_y*_samples)/(_samples+1); + _samples++; + int c=findCommand(); + if (0!=c) + { + _called=true; + _callback.call(c); + } + return 0; +} +uint32_t AreaTouchHandler::up(uint32_t arg) +{ + _x=0; + _y=0; + _samples=0; + _called=false; + return 0; +} + +int AreaTouchHandler::findCommand() +{ + if (_called) + return 0; + if (_samples<5) + return 0; + for (list<area*>::iterator it = _areas.begin(); it != _areas.end(); it++) { + area* a=*it; + if (_x>=a->left && _x<=a->right && _y>=a->top && _y<=a->bottom) + return a->command; + } + return 0; +}