Richard Parker / EALCD
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?

UserRevisionLine numberNew 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