Control library for the Sparkfun Entertainment Trackballer breakout board.

Committer:
Nakor
Date:
Sun Feb 20 17:26:55 2011 +0000
Revision:
12:78d329b4745b
Parent:
11:35347e6474f9
Child:
13:b37eb30297a3

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Nakor 0:2743c73d648d 1 #include "mbed.h"
Nakor 0:2743c73d648d 2 #include "trackballer.h"
Nakor 0:2743c73d648d 3
Nakor 0:2743c73d648d 4
Nakor 0:2743c73d648d 5
Nakor 0:2743c73d648d 6
Nakor 6:c0ebd0f8f873 7 trackballer::trackballer(PinName button, PinName right, PinName down, PinName left, PinName up, PinName red, PinName green, PinName blue, PinName white, char limits)
Nakor 0:2743c73d648d 8 {
Nakor 0:2743c73d648d 9
Nakor 6:c0ebd0f8f873 10 _limits = limits;
Nakor 6:c0ebd0f8f873 11
Nakor 0:2743c73d648d 12 _buttonPin = new DigitalIn(button);
Nakor 0:2743c73d648d 13 _rightPin = new DigitalIn(right);
Nakor 0:2743c73d648d 14 _downPin = new DigitalIn(down);
Nakor 0:2743c73d648d 15 _leftPin = new DigitalIn(left);
Nakor 0:2743c73d648d 16 _upPin = new DigitalIn(up);
Nakor 0:2743c73d648d 17
Nakor 0:2743c73d648d 18 _redLED = new PwmOut(red);
Nakor 0:2743c73d648d 19 _greenLED = new PwmOut(green);
Nakor 0:2743c73d648d 20 _blueLED = new PwmOut(blue);
Nakor 0:2743c73d648d 21 _whiteLED = new PwmOut(white);
Nakor 0:2743c73d648d 22
Nakor 0:2743c73d648d 23
Nakor 0:2743c73d648d 24
Nakor 0:2743c73d648d 25 _buttonPushCounter = 0; // counter for the number of button presses
Nakor 0:2743c73d648d 26
Nakor 11:35347e6474f9 27 _buttonState = 1; // current state of the button
Nakor 11:35347e6474f9 28 _lastButtonState = 1; // previous state of the button
Nakor 0:2743c73d648d 29
Nakor 0:2743c73d648d 30 _upState = 0;
Nakor 0:2743c73d648d 31 _downState = 0;
Nakor 0:2743c73d648d 32 _leftState = 0;
Nakor 0:2743c73d648d 33 _rightState = 0;
Nakor 0:2743c73d648d 34 _lastUpState = 0;
Nakor 0:2743c73d648d 35 _lastDownState = 0;
Nakor 0:2743c73d648d 36 _lastLeftState = 0;
Nakor 0:2743c73d648d 37 _lastRightState = 0;
Nakor 0:2743c73d648d 38
Nakor 7:229fc175e05e 39 _xPosition = 0.5;
Nakor 7:229fc175e05e 40 _yPosition = 0.5;
Nakor 0:2743c73d648d 41
Nakor 0:2743c73d648d 42
Nakor 0:2743c73d648d 43 _buttonPin->mode(PullUp);
Nakor 0:2743c73d648d 44
Nakor 0:2743c73d648d 45 _redLED->write(0.0);
Nakor 0:2743c73d648d 46 _greenLED->write(0.0);
Nakor 0:2743c73d648d 47 _blueLED->write(0.0);
Nakor 0:2743c73d648d 48 _whiteLED->write(0.0);
Nakor 0:2743c73d648d 49
Nakor 0:2743c73d648d 50 _direction = 0x00;
Nakor 0:2743c73d648d 51
Nakor 0:2743c73d648d 52 _outputTimer.start();
Nakor 0:2743c73d648d 53
Nakor 0:2743c73d648d 54 }
Nakor 0:2743c73d648d 55
Nakor 0:2743c73d648d 56
Nakor 0:2743c73d648d 57
Nakor 0:2743c73d648d 58 /******************/
Nakor 0:2743c73d648d 59 /* Public */
Nakor 0:2743c73d648d 60 /******************/
Nakor 0:2743c73d648d 61
Nakor 0:2743c73d648d 62
Nakor 5:0abcaea1fb07 63 void trackballer::getState(float &xPosition, float &yPosition, char &button)
Nakor 0:2743c73d648d 64 {
Nakor 0:2743c73d648d 65
Nakor 0:2743c73d648d 66 _buttonState = _buttonPin->read();
Nakor 0:2743c73d648d 67
Nakor 0:2743c73d648d 68 // compare the _buttonState to its previous state
Nakor 0:2743c73d648d 69 if (_buttonState != _lastButtonState)
Nakor 0:2743c73d648d 70 {
Nakor 12:78d329b4745b 71 while(_buttonPin->read())
Nakor 12:78d329b4745b 72 {
Nakor 12:78d329b4745b 73 printf("HELD\n");
Nakor 12:78d329b4745b 74 }
Nakor 0:2743c73d648d 75 // if the state has changed, increment the counter
Nakor 0:2743c73d648d 76 if (_buttonState == 1)
Nakor 0:2743c73d648d 77 {
Nakor 0:2743c73d648d 78 // if the current state is 1 then the button
Nakor 0:2743c73d648d 79 // went from off to on:
Nakor 0:2743c73d648d 80 _buttonPushCounter++;
Nakor 10:9b35f63411ad 81 button = 0x01;
Nakor 10:9b35f63411ad 82 //printf("Number of button pushes: %i\n", _buttonPushCounter);
Nakor 0:2743c73d648d 83 }
Nakor 0:2743c73d648d 84 }
Nakor 10:9b35f63411ad 85 else
Nakor 10:9b35f63411ad 86 {
Nakor 10:9b35f63411ad 87 button = 0x00;
Nakor 10:9b35f63411ad 88 }
Nakor 0:2743c73d648d 89 _lastButtonState = _buttonState;
Nakor 10:9b35f63411ad 90 //button = !_buttonState;
Nakor 0:2743c73d648d 91
Nakor 0:2743c73d648d 92
Nakor 0:2743c73d648d 93 if (_buttonPushCounter % 2 == 0)
Nakor 0:2743c73d648d 94 {
Nakor 0:2743c73d648d 95 _redLED->write(1);
Nakor 8:2602108edf40 96 //button = 0x01;
Nakor 0:2743c73d648d 97 }
Nakor 0:2743c73d648d 98 else
Nakor 0:2743c73d648d 99 {
Nakor 0:2743c73d648d 100 _redLED->write(0);
Nakor 8:2602108edf40 101 //button = 0x00;
Nakor 0:2743c73d648d 102 }
Nakor 0:2743c73d648d 103
Nakor 0:2743c73d648d 104 _upState = _upPin->read();
Nakor 0:2743c73d648d 105
Nakor 0:2743c73d648d 106 if (_upState != _lastUpState)
Nakor 0:2743c73d648d 107 {
Nakor 0:2743c73d648d 108 if (_upState == 1)
Nakor 0:2743c73d648d 109 {
Nakor 0:2743c73d648d 110 // if the current state is 1 then the button
Nakor 0:2743c73d648d 111 // went from off to on:
Nakor 0:2743c73d648d 112 _yPosition-=TRACK_INC;
Nakor 6:c0ebd0f8f873 113 if(_limits)
Nakor 0:2743c73d648d 114 {
Nakor 6:c0ebd0f8f873 115 if (_yPosition < 0.0)
Nakor 6:c0ebd0f8f873 116 {
Nakor 6:c0ebd0f8f873 117 _yPosition = 0.0;
Nakor 6:c0ebd0f8f873 118 }
Nakor 0:2743c73d648d 119 }
Nakor 0:2743c73d648d 120 }
Nakor 0:2743c73d648d 121 }
Nakor 0:2743c73d648d 122 _lastUpState = _upState;
Nakor 0:2743c73d648d 123
Nakor 0:2743c73d648d 124
Nakor 0:2743c73d648d 125 _downState = _downPin->read();
Nakor 0:2743c73d648d 126
Nakor 0:2743c73d648d 127 // compare the _buttonState to its previous state
Nakor 0:2743c73d648d 128 if (_downState != _lastDownState)
Nakor 0:2743c73d648d 129 {
Nakor 0:2743c73d648d 130 // if the state has changed, increment the counter
Nakor 0:2743c73d648d 131 if (_downState == 1)
Nakor 0:2743c73d648d 132 {
Nakor 0:2743c73d648d 133 // if the current state is 1 then the button
Nakor 0:2743c73d648d 134 // went from off to on:
Nakor 0:2743c73d648d 135 _yPosition+=TRACK_INC;
Nakor 6:c0ebd0f8f873 136 if(_limits)
Nakor 0:2743c73d648d 137 {
Nakor 6:c0ebd0f8f873 138 if (_yPosition > 1.0)
Nakor 6:c0ebd0f8f873 139 {
Nakor 6:c0ebd0f8f873 140 _yPosition = 1.0;
Nakor 6:c0ebd0f8f873 141 }
Nakor 0:2743c73d648d 142 }
Nakor 0:2743c73d648d 143 }
Nakor 0:2743c73d648d 144 }
Nakor 0:2743c73d648d 145 _lastDownState = _downState;
Nakor 0:2743c73d648d 146
Nakor 0:2743c73d648d 147
Nakor 0:2743c73d648d 148 _leftState = _leftPin->read();
Nakor 0:2743c73d648d 149
Nakor 0:2743c73d648d 150 // compare the _buttonState to its previous state
Nakor 0:2743c73d648d 151 if (_leftState != _lastLeftState)
Nakor 0:2743c73d648d 152 {
Nakor 0:2743c73d648d 153 // if the state has changed, increment the counter
Nakor 0:2743c73d648d 154 if (_leftState == 1)
Nakor 0:2743c73d648d 155 {
Nakor 0:2743c73d648d 156 // if the current state is 1 then the button
Nakor 0:2743c73d648d 157 // went from off to on:
Nakor 0:2743c73d648d 158 _xPosition-=TRACK_INC;
Nakor 6:c0ebd0f8f873 159 if(_limits)
Nakor 0:2743c73d648d 160 {
Nakor 6:c0ebd0f8f873 161 if (_xPosition < 0.0)
Nakor 6:c0ebd0f8f873 162 {
Nakor 6:c0ebd0f8f873 163 _xPosition = 0.0;
Nakor 6:c0ebd0f8f873 164 }
Nakor 0:2743c73d648d 165 }
Nakor 0:2743c73d648d 166 }
Nakor 0:2743c73d648d 167 }
Nakor 0:2743c73d648d 168 _lastLeftState = _leftState;
Nakor 0:2743c73d648d 169
Nakor 0:2743c73d648d 170 _rightState = _rightPin->read();
Nakor 0:2743c73d648d 171
Nakor 0:2743c73d648d 172 // compare the _buttonState to its previous state
Nakor 0:2743c73d648d 173 if (_rightState != _lastRightState)
Nakor 0:2743c73d648d 174 {
Nakor 0:2743c73d648d 175 // if the state has changed, increment the counter
Nakor 0:2743c73d648d 176 if (_rightState == 1)
Nakor 0:2743c73d648d 177 {
Nakor 0:2743c73d648d 178 // if the current state is 1 then the button
Nakor 0:2743c73d648d 179 // went from off to on:
Nakor 0:2743c73d648d 180 _xPosition+=TRACK_INC;
Nakor 6:c0ebd0f8f873 181 if(_limits)
Nakor 0:2743c73d648d 182 {
Nakor 6:c0ebd0f8f873 183 if (_xPosition > 1.0)
Nakor 6:c0ebd0f8f873 184 {
Nakor 6:c0ebd0f8f873 185 _xPosition = 1.0;
Nakor 6:c0ebd0f8f873 186 }
Nakor 0:2743c73d648d 187 }
Nakor 0:2743c73d648d 188 }
Nakor 0:2743c73d648d 189 }
Nakor 0:2743c73d648d 190 _lastRightState = _rightState;
Nakor 0:2743c73d648d 191
Nakor 0:2743c73d648d 192 _blueLED->write(_xPosition);
Nakor 0:2743c73d648d 193 _greenLED->write(_yPosition);
Nakor 0:2743c73d648d 194
Nakor 0:2743c73d648d 195 xPosition = _xPosition;
Nakor 0:2743c73d648d 196 yPosition = _yPosition;
Nakor 0:2743c73d648d 197
Nakor 0:2743c73d648d 198
Nakor 6:c0ebd0f8f873 199
Nakor 6:c0ebd0f8f873 200 #if DEBUG_POSITION
Nakor 4:3d1791d6608a 201 int ixPosition = _xPosition * 95;
Nakor 4:3d1791d6608a 202 int iyPosition = _yPosition * 63;
Nakor 4:3d1791d6608a 203
Nakor 6:c0ebd0f8f873 204
Nakor 6:c0ebd0f8f873 205
Nakor 0:2743c73d648d 206 if (_outputTimer.read_ms() > 1000)
Nakor 0:2743c73d648d 207 {
Nakor 4:3d1791d6608a 208 printf("Position: (x%i, y%i)\n", ixPosition, iyPosition);
Nakor 0:2743c73d648d 209
Nakor 0:2743c73d648d 210 _outputTimer.reset();
Nakor 0:2743c73d648d 211
Nakor 0:2743c73d648d 212 }
Nakor 6:c0ebd0f8f873 213 #endif
Nakor 0:2743c73d648d 214
Nakor 7:229fc175e05e 215 }
Nakor 7:229fc175e05e 216
Nakor 7:229fc175e05e 217 void trackballer::reset()
Nakor 7:229fc175e05e 218 {
Nakor 7:229fc175e05e 219 _xPosition = 0.5;
Nakor 7:229fc175e05e 220 _yPosition = 0.5;
Nakor 0:2743c73d648d 221 }