Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
manager/EATouchManager.cpp@4:f8f7f4f9c58d, 2010-04-26 (annotated)
- Committer:
- richardparker
- Date:
- Mon Apr 26 21:37:54 2010 +0000
- Revision:
- 4:f8f7f4f9c58d
- Parent:
- 1:f04bcaea1d60
- Child:
- 7:6cf21b018420
Who changed what in which revision?
| User | Revision | Line number | New contents of line | 
|---|---|---|---|
| richardparker | 1:f04bcaea1d60 | 1 | #include "mbed.h" | 
| richardparker | 1:f04bcaea1d60 | 2 | #include "EATouchManager.h" | 
| richardparker | 1:f04bcaea1d60 | 3 | |
| richardparker | 1:f04bcaea1d60 | 4 | #include "../screen/EATouch.h" | 
| richardparker | 4:f8f7f4f9c58d | 5 | #include "../screen/EALCD.h" | 
| richardparker | 1:f04bcaea1d60 | 6 | #include "EAHitBox.h" | 
| richardparker | 1:f04bcaea1d60 | 7 | |
| richardparker | 4:f8f7f4f9c58d | 8 | EATouchManager::EATouchManager(EALCD& lcd, EATouch& touch) | 
| richardparker | 1:f04bcaea1d60 | 9 | : _touch(touch), | 
| richardparker | 4:f8f7f4f9c58d | 10 | _lcd(lcd), | 
| richardparker | 4:f8f7f4f9c58d | 11 | _head(NULL), | 
| richardparker | 4:f8f7f4f9c58d | 12 | _count(0), | 
| richardparker | 4:f8f7f4f9c58d | 13 | _timeout(200) | 
| richardparker | 1:f04bcaea1d60 | 14 | { | 
| richardparker | 1:f04bcaea1d60 | 15 | } | 
| richardparker | 1:f04bcaea1d60 | 16 | |
| richardparker | 1:f04bcaea1d60 | 17 | EATouchManager::~EATouchManager() | 
| richardparker | 1:f04bcaea1d60 | 18 | { | 
| richardparker | 1:f04bcaea1d60 | 19 | // Free any memory associated with the list. | 
| richardparker | 1:f04bcaea1d60 | 20 | clearHitBoxes(); | 
| richardparker | 1:f04bcaea1d60 | 21 | } | 
| richardparker | 1:f04bcaea1d60 | 22 | |
| richardparker | 1:f04bcaea1d60 | 23 | void EATouchManager::tick() | 
| richardparker | 1:f04bcaea1d60 | 24 | { | 
| richardparker | 1:f04bcaea1d60 | 25 | short x = 0; | 
| richardparker | 1:f04bcaea1d60 | 26 | short y = 0; | 
| richardparker | 1:f04bcaea1d60 | 27 | bool p = false; | 
| richardparker | 1:f04bcaea1d60 | 28 | |
| richardparker | 1:f04bcaea1d60 | 29 | // Get the touch. | 
| richardparker | 1:f04bcaea1d60 | 30 | _touch.touch(x, y, p); | 
| richardparker | 1:f04bcaea1d60 | 31 | |
| richardparker | 1:f04bcaea1d60 | 32 | // Check if hit target. | 
| richardparker | 1:f04bcaea1d60 | 33 | if (p == true) | 
| richardparker | 1:f04bcaea1d60 | 34 | { | 
| richardparker | 1:f04bcaea1d60 | 35 | _doHits(x, y); | 
| richardparker | 4:f8f7f4f9c58d | 36 | |
| richardparker | 4:f8f7f4f9c58d | 37 | // Reset the timeout count. | 
| richardparker | 4:f8f7f4f9c58d | 38 | _watchReset(); | 
| richardparker | 4:f8f7f4f9c58d | 39 | } | 
| richardparker | 4:f8f7f4f9c58d | 40 | |
| richardparker | 4:f8f7f4f9c58d | 41 | // Check the timeout. If reached then turn off the screen. | 
| richardparker | 4:f8f7f4f9c58d | 42 | _watchCheck(); | 
| richardparker | 4:f8f7f4f9c58d | 43 | } | 
| richardparker | 4:f8f7f4f9c58d | 44 | |
| richardparker | 4:f8f7f4f9c58d | 45 | void EATouchManager::_watchReset() | 
| richardparker | 4:f8f7f4f9c58d | 46 | { | 
| richardparker | 4:f8f7f4f9c58d | 47 | _count = 0; | 
| richardparker | 4:f8f7f4f9c58d | 48 | |
| richardparker | 4:f8f7f4f9c58d | 49 | // If the lcd is off then turn it back on as the count has been reset. | 
| richardparker | 4:f8f7f4f9c58d | 50 | if (_lcd.brightness() < 0.01) | 
| richardparker | 4:f8f7f4f9c58d | 51 | { | 
| richardparker | 4:f8f7f4f9c58d | 52 | float step = (_lcd.maxBrightness() - _lcd.brightness())/10; | 
| richardparker | 4:f8f7f4f9c58d | 53 | |
| richardparker | 4:f8f7f4f9c58d | 54 | for(int i = 0; i < 10; i++) | 
| richardparker | 4:f8f7f4f9c58d | 55 | { | 
| richardparker | 4:f8f7f4f9c58d | 56 | _lcd.setBrightness(_lcd.brightness() + step); | 
| richardparker | 4:f8f7f4f9c58d | 57 | wait(0.2); | 
| richardparker | 4:f8f7f4f9c58d | 58 | } | 
| richardparker | 4:f8f7f4f9c58d | 59 | } | 
| richardparker | 4:f8f7f4f9c58d | 60 | } | 
| richardparker | 4:f8f7f4f9c58d | 61 | |
| richardparker | 4:f8f7f4f9c58d | 62 | void EATouchManager::_watchCheck() | 
| richardparker | 4:f8f7f4f9c58d | 63 | { | 
| richardparker | 4:f8f7f4f9c58d | 64 | // If the count has passed the timeout then turn the lcd off if it is on. | 
| richardparker | 4:f8f7f4f9c58d | 65 | // Otherwise increment the count. | 
| richardparker | 4:f8f7f4f9c58d | 66 | if (_count > _timeout) | 
| richardparker | 4:f8f7f4f9c58d | 67 | { | 
| richardparker | 4:f8f7f4f9c58d | 68 | if (_lcd.brightness() >= 0.01) | 
| richardparker | 4:f8f7f4f9c58d | 69 | { | 
| richardparker | 4:f8f7f4f9c58d | 70 | float step = _lcd.brightness()/10; | 
| richardparker | 4:f8f7f4f9c58d | 71 | |
| richardparker | 4:f8f7f4f9c58d | 72 | for(int i = 0; i < 10; i++) | 
| richardparker | 4:f8f7f4f9c58d | 73 | { | 
| richardparker | 4:f8f7f4f9c58d | 74 | _lcd.setBrightness(_lcd.brightness() - step); | 
| richardparker | 4:f8f7f4f9c58d | 75 | wait(0.2); | 
| richardparker | 4:f8f7f4f9c58d | 76 | } | 
| richardparker | 4:f8f7f4f9c58d | 77 | } | 
| richardparker | 4:f8f7f4f9c58d | 78 | } else { | 
| richardparker | 4:f8f7f4f9c58d | 79 | _count++; | 
| richardparker | 1:f04bcaea1d60 | 80 | } | 
| richardparker | 1:f04bcaea1d60 | 81 | } | 
| richardparker | 1:f04bcaea1d60 | 82 | |
| richardparker | 1:f04bcaea1d60 | 83 | void EATouchManager::_doHits(short x, short y) | 
| richardparker | 1:f04bcaea1d60 | 84 | { | 
| richardparker | 1:f04bcaea1d60 | 85 | EAHitBox* current = _head; | 
| richardparker | 1:f04bcaea1d60 | 86 | |
| richardparker | 1:f04bcaea1d60 | 87 | while (current != NULL) | 
| richardparker | 1:f04bcaea1d60 | 88 | { | 
| richardparker | 1:f04bcaea1d60 | 89 | // Do the check this will fire the pointer function if it does. | 
| richardparker | 1:f04bcaea1d60 | 90 | current->checkContains(x, y); | 
| richardparker | 1:f04bcaea1d60 | 91 | |
| richardparker | 1:f04bcaea1d60 | 92 | // Get the next item in the linked list. | 
| richardparker | 1:f04bcaea1d60 | 93 | current = current->next(); | 
| richardparker | 1:f04bcaea1d60 | 94 | } | 
| richardparker | 1:f04bcaea1d60 | 95 | } | 
| richardparker | 1:f04bcaea1d60 | 96 | |
| richardparker | 1:f04bcaea1d60 | 97 | void EATouchManager::deleteHitBox(EAHitBox* box) | 
| richardparker | 1:f04bcaea1d60 | 98 | { | 
| richardparker | 1:f04bcaea1d60 | 99 | EAHitBox* current = _head; | 
| richardparker | 1:f04bcaea1d60 | 100 | EAHitBox* last = NULL; | 
| richardparker | 1:f04bcaea1d60 | 101 | EAHitBox* next = NULL; | 
| richardparker | 1:f04bcaea1d60 | 102 | |
| richardparker | 1:f04bcaea1d60 | 103 | // If not valid then just return. | 
| richardparker | 1:f04bcaea1d60 | 104 | if (box == NULL) | 
| richardparker | 1:f04bcaea1d60 | 105 | { | 
| richardparker | 1:f04bcaea1d60 | 106 | return; | 
| richardparker | 1:f04bcaea1d60 | 107 | } | 
| richardparker | 1:f04bcaea1d60 | 108 | |
| richardparker | 1:f04bcaea1d60 | 109 | while (current != NULL) | 
| richardparker | 1:f04bcaea1d60 | 110 | { | 
| richardparker | 1:f04bcaea1d60 | 111 | // Get the next item in the linked list. | 
| richardparker | 1:f04bcaea1d60 | 112 | next = current->next(); | 
| richardparker | 1:f04bcaea1d60 | 113 | |
| richardparker | 1:f04bcaea1d60 | 114 | // If the pointer matches the one that want to delete then first | 
| richardparker | 1:f04bcaea1d60 | 115 | // remove from the list, put the link in from previous to next | 
| richardparker | 1:f04bcaea1d60 | 116 | // and actually delet the data. | 
| richardparker | 1:f04bcaea1d60 | 117 | if (box == current) | 
| richardparker | 1:f04bcaea1d60 | 118 | { | 
| richardparker | 1:f04bcaea1d60 | 119 | if ((next != NULL) && (last == NULL)) | 
| richardparker | 1:f04bcaea1d60 | 120 | { | 
| richardparker | 1:f04bcaea1d60 | 121 | // If there is an item after but none before then the next | 
| richardparker | 1:f04bcaea1d60 | 122 | // becomes the root item. | 
| richardparker | 1:f04bcaea1d60 | 123 | _head = next; | 
| richardparker | 1:f04bcaea1d60 | 124 | } | 
| richardparker | 1:f04bcaea1d60 | 125 | else if ((next != NULL) && (last != NULL)) | 
| richardparker | 1:f04bcaea1d60 | 126 | { | 
| richardparker | 1:f04bcaea1d60 | 127 | // There was a last and there is a next so need to stitch | 
| richardparker | 1:f04bcaea1d60 | 128 | // list together removing the current. | 
| richardparker | 1:f04bcaea1d60 | 129 | last->setNext(next); | 
| richardparker | 1:f04bcaea1d60 | 130 | } | 
| richardparker | 1:f04bcaea1d60 | 131 | else if ((next == NULL) && (last == NULL)) | 
| richardparker | 1:f04bcaea1d60 | 132 | { | 
| richardparker | 1:f04bcaea1d60 | 133 | // If there is no item after this one then nothing else to do. | 
| richardparker | 1:f04bcaea1d60 | 134 | _head = NULL; | 
| richardparker | 1:f04bcaea1d60 | 135 | } | 
| richardparker | 1:f04bcaea1d60 | 136 | else if ((next == NULL) && (last != NULL)) | 
| richardparker | 1:f04bcaea1d60 | 137 | { | 
| richardparker | 1:f04bcaea1d60 | 138 | // Last is now the end of the list. | 
| richardparker | 1:f04bcaea1d60 | 139 | last->setNext(NULL); | 
| richardparker | 1:f04bcaea1d60 | 140 | } | 
| richardparker | 1:f04bcaea1d60 | 141 | |
| richardparker | 1:f04bcaea1d60 | 142 | // Actually get rid of memory. | 
| richardparker | 1:f04bcaea1d60 | 143 | delete current; | 
| richardparker | 1:f04bcaea1d60 | 144 | current = NULL; | 
| richardparker | 1:f04bcaea1d60 | 145 | break; | 
| richardparker | 1:f04bcaea1d60 | 146 | } | 
| richardparker | 1:f04bcaea1d60 | 147 | |
| richardparker | 1:f04bcaea1d60 | 148 | // Swap pointers over. | 
| richardparker | 1:f04bcaea1d60 | 149 | last = current; | 
| richardparker | 1:f04bcaea1d60 | 150 | current = next; | 
| richardparker | 1:f04bcaea1d60 | 151 | } | 
| richardparker | 1:f04bcaea1d60 | 152 | } | 
| richardparker | 1:f04bcaea1d60 | 153 | |
| richardparker | 1:f04bcaea1d60 | 154 | EAHitBox* EATouchManager::createHitBox() | 
| richardparker | 1:f04bcaea1d60 | 155 | { | 
| richardparker | 1:f04bcaea1d60 | 156 | EAHitBox* box = new EAHitBox(); | 
| richardparker | 1:f04bcaea1d60 | 157 | |
| richardparker | 1:f04bcaea1d60 | 158 | // If able to create then add the pointer to the list and return. | 
| richardparker | 1:f04bcaea1d60 | 159 | if (box != NULL) | 
| richardparker | 1:f04bcaea1d60 | 160 | { | 
| richardparker | 1:f04bcaea1d60 | 161 | box->setNext(_head); | 
| richardparker | 1:f04bcaea1d60 | 162 | _head = box; | 
| richardparker | 1:f04bcaea1d60 | 163 | } | 
| richardparker | 1:f04bcaea1d60 | 164 | |
| richardparker | 1:f04bcaea1d60 | 165 | return box; | 
| richardparker | 1:f04bcaea1d60 | 166 | } | 
| richardparker | 1:f04bcaea1d60 | 167 | |
| richardparker | 1:f04bcaea1d60 | 168 | void EATouchManager::clearHitBoxes() | 
| richardparker | 1:f04bcaea1d60 | 169 | { | 
| richardparker | 1:f04bcaea1d60 | 170 | EAHitBox* current = _head; | 
| richardparker | 1:f04bcaea1d60 | 171 | EAHitBox* next = NULL; | 
| richardparker | 1:f04bcaea1d60 | 172 | |
| richardparker | 1:f04bcaea1d60 | 173 | // Delete each hit box in turn. | 
| richardparker | 1:f04bcaea1d60 | 174 | while (current != NULL) | 
| richardparker | 1:f04bcaea1d60 | 175 | { | 
| richardparker | 1:f04bcaea1d60 | 176 | next = current->next(); | 
| richardparker | 1:f04bcaea1d60 | 177 | |
| richardparker | 1:f04bcaea1d60 | 178 | delete current; | 
| richardparker | 1:f04bcaea1d60 | 179 | current = NULL; | 
| richardparker | 1:f04bcaea1d60 | 180 | |
| richardparker | 1:f04bcaea1d60 | 181 | current = next; | 
| richardparker | 1:f04bcaea1d60 | 182 | } | 
| richardparker | 1:f04bcaea1d60 | 183 | |
| richardparker | 1:f04bcaea1d60 | 184 | // Reset the root. | 
| richardparker | 1:f04bcaea1d60 | 185 | _head = NULL; | 
| richardparker | 1:f04bcaea1d60 | 186 | |
| richardparker | 1:f04bcaea1d60 | 187 | } | 
| richardparker | 1:f04bcaea1d60 | 188 | |
| richardparker | 1:f04bcaea1d60 | 189 |