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 |