Dependencies:   N5110 mbed

Committer:
jordaahh
Date:
Mon Apr 20 15:59:06 2015 +0000
Revision:
6:c257b2060803
Parent:
5:200fa178cb3a
Child:
7:b27a91c673dc
Player object moves in all directions, need to create boundaries and hitWall function.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jordaahh 0:a28ad0db4228 1 /* Joystick
jordaahh 0:a28ad0db4228 2
jordaahh 0:a28ad0db4228 3 Example code of how to read a joystick
jordaahh 0:a28ad0db4228 4
jordaahh 0:a28ad0db4228 5 https://www.sparkfun.com/products/9032
jordaahh 0:a28ad0db4228 6
jordaahh 0:a28ad0db4228 7 Craig A. Evans
jordaahh 0:a28ad0db4228 8 7 March 2015
jordaahh 0:a28ad0db4228 9 */
jordaahh 0:a28ad0db4228 10
jordaahh 0:a28ad0db4228 11 #include "mbed.h"
jordaahh 1:3b741adc82ea 12 #include "N5110.h"
jordaahh 1:3b741adc82ea 13
jordaahh 0:a28ad0db4228 14 // change this to alter tolerance of joystick direction
jordaahh 5:200fa178cb3a 15 #define DIRECTION_TOLERANCE 0.1
jordaahh 0:a28ad0db4228 16
jordaahh 0:a28ad0db4228 17 // connections for joystick
jordaahh 0:a28ad0db4228 18 DigitalIn button(p15);
jordaahh 0:a28ad0db4228 19 AnalogIn xPot(p16);
jordaahh 0:a28ad0db4228 20 AnalogIn yPot(p17);
jordaahh 1:3b741adc82ea 21
jordaahh 1:3b741adc82ea 22 // LCD connections
jordaahh 1:3b741adc82ea 23 //vcc, sce, rst, dc, mosi, clk, led
jordaahh 1:3b741adc82ea 24 N5110 lcd(p7,p8,p9,p10,p11,p13,p26);
jordaahh 1:3b741adc82ea 25
jordaahh 2:98a51d3c2e44 26 // LCD dimentions
jordaahh 2:98a51d3c2e44 27 int nx= 84; //screen is 84 pixels across
jordaahh 2:98a51d3c2e44 28 int ny= 48; // by 48 pixels downwards
jordaahh 5:200fa178cb3a 29 int i=24;
jordaahh 5:200fa178cb3a 30 int j=42;
jordaahh 2:98a51d3c2e44 31
jordaahh 3:11cbc2945fd7 32 // next generation statement
jordaahh 4:7350adf1d7ec 33 int cells[84][48]= {0};
jordaahh 3:11cbc2945fd7 34
jordaahh 1:3b741adc82ea 35 // Output to screen LED's (backlights)
jordaahh 1:3b741adc82ea 36 PwmOut PWM(p26);
jordaahh 1:3b741adc82ea 37
jordaahh 0:a28ad0db4228 38 // timer to regularly read the joystick
jordaahh 0:a28ad0db4228 39 Ticker pollJoystick;
jordaahh 0:a28ad0db4228 40 // Serial for debug
jordaahh 0:a28ad0db4228 41 Serial serial(USBTX,USBRX);
jordaahh 0:a28ad0db4228 42
jordaahh 0:a28ad0db4228 43 // create enumerated type (0,1,2,3 etc. for direction)
jordaahh 0:a28ad0db4228 44 // could be extended for diagonals etc.
jordaahh 0:a28ad0db4228 45 enum DirectionName {
jordaahh 0:a28ad0db4228 46 UP,
jordaahh 0:a28ad0db4228 47 DOWN,
jordaahh 0:a28ad0db4228 48 LEFT,
jordaahh 6:c257b2060803 49 upLeft,
jordaahh 6:c257b2060803 50 downLeft,
jordaahh 0:a28ad0db4228 51 RIGHT,
jordaahh 5:200fa178cb3a 52 upRight,
jordaahh 5:200fa178cb3a 53 downRight,
jordaahh 0:a28ad0db4228 54 CENTRE,
jordaahh 0:a28ad0db4228 55 UNKNOWN
jordaahh 0:a28ad0db4228 56 };
jordaahh 0:a28ad0db4228 57
jordaahh 0:a28ad0db4228 58 // struct for Joystick
jordaahh 0:a28ad0db4228 59 typedef struct JoyStick Joystick;
jordaahh 0:a28ad0db4228 60 struct JoyStick {
jordaahh 0:a28ad0db4228 61 float x; // current x value
jordaahh 0:a28ad0db4228 62 float x0; // 'centred' x value
jordaahh 0:a28ad0db4228 63 float y; // current y value
jordaahh 0:a28ad0db4228 64 float y0; // 'centred' y value
jordaahh 0:a28ad0db4228 65 int button; // button state (assume pull-down used, so 1 = pressed, 0 = unpressed)
jordaahh 0:a28ad0db4228 66 DirectionName direction; // current direction
jordaahh 0:a28ad0db4228 67 };
jordaahh 0:a28ad0db4228 68 // create struct variable
jordaahh 0:a28ad0db4228 69 Joystick joystick;
jordaahh 0:a28ad0db4228 70
jordaahh 0:a28ad0db4228 71 int printFlag = 0;
jordaahh 0:a28ad0db4228 72
jordaahh 0:a28ad0db4228 73 // function prototypes
jordaahh 0:a28ad0db4228 74 void calibrateJoystick();
jordaahh 0:a28ad0db4228 75 void updateJoystick();
jordaahh 3:11cbc2945fd7 76 void clearCells();
jordaahh 3:11cbc2945fd7 77 void moveUp();
jordaahh 3:11cbc2945fd7 78 void getPixels();
jordaahh 3:11cbc2945fd7 79 void rules();
jordaahh 0:a28ad0db4228 80
jordaahh 0:a28ad0db4228 81 int main()
jordaahh 0:a28ad0db4228 82 {
jordaahh 1:3b741adc82ea 83 lcd.init();
jordaahh 0:a28ad0db4228 84 calibrateJoystick(); // get centred values of joystick
jordaahh 0:a28ad0db4228 85 pollJoystick.attach(&updateJoystick,1.0/10.0); // read joystick 10 times per second
jordaahh 0:a28ad0db4228 86
jordaahh 0:a28ad0db4228 87 while(1) {
jordaahh 6:c257b2060803 88 lcd.drawRect(i,j,3,3,0);
jordaahh 5:200fa178cb3a 89 clearCells();
jordaahh 3:11cbc2945fd7 90 if (printFlag) { // if flag set, clear flag and implicate joystick functions
jordaahh 0:a28ad0db4228 91 printFlag = 0;
jordaahh 0:a28ad0db4228 92
jordaahh 0:a28ad0db4228 93 // check joystick direction
jordaahh 5:200fa178cb3a 94 if (joystick.direction == UP){
jordaahh 5:200fa178cb3a 95 j--;
jordaahh 5:200fa178cb3a 96 }
jordaahh 0:a28ad0db4228 97 if (joystick.direction == DOWN)
jordaahh 5:200fa178cb3a 98 {
jordaahh 5:200fa178cb3a 99 j++;
jordaahh 5:200fa178cb3a 100 }
jordaahh 5:200fa178cb3a 101 if (joystick.direction == LEFT){
jordaahh 5:200fa178cb3a 102 i--;
jordaahh 5:200fa178cb3a 103 }
jordaahh 5:200fa178cb3a 104 if (joystick.direction == RIGHT){
jordaahh 5:200fa178cb3a 105 i++;
jordaahh 5:200fa178cb3a 106 }
jordaahh 6:c257b2060803 107 if (joystick.direction == upRight){
jordaahh 6:c257b2060803 108 j--;
jordaahh 6:c257b2060803 109 i++;
jordaahh 6:c257b2060803 110 }
jordaahh 6:c257b2060803 111 if (joystick.direction == downRight){
jordaahh 6:c257b2060803 112 j++;
jordaahh 6:c257b2060803 113 i++;
jordaahh 6:c257b2060803 114 }
jordaahh 6:c257b2060803 115 if (joystick.direction == upLeft){
jordaahh 6:c257b2060803 116 j--;
jordaahh 6:c257b2060803 117 i--;
jordaahh 6:c257b2060803 118 }
jordaahh 6:c257b2060803 119 if (joystick.direction == downLeft){
jordaahh 6:c257b2060803 120 j++;
jordaahh 6:c257b2060803 121 i--;
jordaahh 6:c257b2060803 122 }
jordaahh 5:200fa178cb3a 123 if (joystick.direction == CENTRE){
jordaahh 5:200fa178cb3a 124 i=i;
jordaahh 5:200fa178cb3a 125 j=j;
jordaahh 5:200fa178cb3a 126 }
jordaahh 5:200fa178cb3a 127
jordaahh 5:200fa178cb3a 128
jordaahh 0:a28ad0db4228 129 }
jordaahh 0:a28ad0db4228 130 }
jordaahh 0:a28ad0db4228 131 }
jordaahh 5:200fa178cb3a 132
jordaahh 0:a28ad0db4228 133 // read default positions of the joystick to calibrate later readings
jordaahh 0:a28ad0db4228 134 void calibrateJoystick()
jordaahh 0:a28ad0db4228 135 {
jordaahh 0:a28ad0db4228 136 button.mode(PullDown);
jordaahh 0:a28ad0db4228 137 // must not move during calibration
jordaahh 0:a28ad0db4228 138 joystick.x0 = xPot; // initial positions in the range 0.0 to 1.0 (0.5 if centred exactly)
jordaahh 0:a28ad0db4228 139 joystick.y0 = yPot;
jordaahh 0:a28ad0db4228 140 }
jordaahh 0:a28ad0db4228 141 void updateJoystick()
jordaahh 0:a28ad0db4228 142 {
jordaahh 0:a28ad0db4228 143 // read current joystick values relative to calibrated values (in range -0.5 to 0.5, 0.0 is centred)
jordaahh 0:a28ad0db4228 144 joystick.x = xPot - joystick.x0;
jordaahh 0:a28ad0db4228 145 joystick.y = yPot - joystick.y0;
jordaahh 0:a28ad0db4228 146 // read button state
jordaahh 0:a28ad0db4228 147 joystick.button = button;
jordaahh 0:a28ad0db4228 148
jordaahh 0:a28ad0db4228 149 // calculate direction depending on x,y values
jordaahh 0:a28ad0db4228 150 // tolerance allows a little lee-way in case joystick not exactly in the stated direction
jordaahh 0:a28ad0db4228 151 if ( fabs(joystick.y) < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 152 joystick.direction = CENTRE;
jordaahh 0:a28ad0db4228 153 } else if ( joystick.y > DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 154 joystick.direction = UP;
jordaahh 0:a28ad0db4228 155 } else if ( joystick.y < DIRECTION_TOLERANCE && fabs(joystick.x) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 156 joystick.direction = DOWN;
jordaahh 0:a28ad0db4228 157 } else if ( joystick.x > DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 158 joystick.direction = RIGHT;
jordaahh 0:a28ad0db4228 159 } else if ( joystick.x < DIRECTION_TOLERANCE && fabs(joystick.y) < DIRECTION_TOLERANCE) {
jordaahh 0:a28ad0db4228 160 joystick.direction = LEFT;
jordaahh 6:c257b2060803 161 } else if ( joystick.y > DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE){
jordaahh 6:c257b2060803 162 joystick.direction = upRight;
jordaahh 6:c257b2060803 163 } else if ( joystick.y < DIRECTION_TOLERANCE && joystick.x > DIRECTION_TOLERANCE){
jordaahh 6:c257b2060803 164 joystick.direction = downRight;
jordaahh 6:c257b2060803 165 } else if ( joystick.y > DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE){
jordaahh 6:c257b2060803 166 joystick.direction = upLeft;
jordaahh 6:c257b2060803 167 } else if ( joystick.y < DIRECTION_TOLERANCE && joystick.x < DIRECTION_TOLERANCE){
jordaahh 6:c257b2060803 168 joystick.direction = downLeft;
jordaahh 6:c257b2060803 169 }
jordaahh 0:a28ad0db4228 170 // set flag for printing
jordaahh 0:a28ad0db4228 171 printFlag = 1;
jordaahh 3:11cbc2945fd7 172 }
jordaahh 3:11cbc2945fd7 173
jordaahh 5:200fa178cb3a 174
jordaahh 3:11cbc2945fd7 175 void clearCells() // turns all cells on the display off
jordaahh 3:11cbc2945fd7 176 {
jordaahh 3:11cbc2945fd7 177 // loop through cells, and clear
jordaahh 3:11cbc2945fd7 178 for (int i = 0; i < nx ; i++) {
jordaahh 3:11cbc2945fd7 179 for (int j = 0; j < ny ; j++) {
jordaahh 3:11cbc2945fd7 180 lcd.clearPixel(i,j);
jordaahh 3:11cbc2945fd7 181 }
jordaahh 3:11cbc2945fd7 182 }
jordaahh 3:11cbc2945fd7 183 lcd.refresh(); // must refresh to write buffer display
jordaahh 3:11cbc2945fd7 184 }
jordaahh 3:11cbc2945fd7 185