4180-L4

Dependencies:   4DGL-uLCD-SE mbed-rtos mbed

Committer:
rfarr6
Date:
Tue Oct 21 17:46:26 2014 +0000
Revision:
2:5b231e0d0718
Parent:
0:68d1066c8288
updated noise margins

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rfarr6 0:68d1066c8288 1 #include "mbed.h"
rfarr6 0:68d1066c8288 2 #include "rtos.h"
rfarr6 0:68d1066c8288 3 #include "uLCD_4DGL.h"
rfarr6 0:68d1066c8288 4
rfarr6 0:68d1066c8288 5 uLCD_4DGL uLCD(p9, p10, p11);
rfarr6 0:68d1066c8288 6 DigitalIn flap_button(p30);
rfarr6 0:68d1066c8288 7 AnalogIn ain(p20);
rfarr6 0:68d1066c8288 8
rfarr6 0:68d1066c8288 9 int bird_lo_addr = 0x7801;
rfarr6 0:68d1066c8288 10 int y_pos = 63, old_ypos = 63;
rfarr6 0:68d1066c8288 11 int vel = 1;
rfarr6 0:68d1066c8288 12 int state = 0;
rfarr6 0:68d1066c8288 13 int score = 0;
rfarr6 0:68d1066c8288 14
rfarr6 0:68d1066c8288 15 // wall_1
rfarr6 0:68d1066c8288 16 int wall_x_pos1 = 128, opening_y_pos1;
rfarr6 0:68d1066c8288 17
rfarr6 0:68d1066c8288 18 // wall 2
rfarr6 0:68d1066c8288 19 int wall_x_pos2, opening_y_pos2;
rfarr6 0:68d1066c8288 20
rfarr6 0:68d1066c8288 21 // wall 3
rfarr6 0:68d1066c8288 22 int wall_x_pos3, opening_y_pos3;
rfarr6 0:68d1066c8288 23
rfarr6 0:68d1066c8288 24 void draw_frame() {
rfarr6 0:68d1066c8288 25
rfarr6 0:68d1066c8288 26 switch (state) {
rfarr6 0:68d1066c8288 27 case 0:
rfarr6 0:68d1066c8288 28 uLCD.locate(0, 6);
rfarr6 0:68d1066c8288 29 uLCD.printf("PRESS 2 START");
rfarr6 0:68d1066c8288 30 break;
rfarr6 0:68d1066c8288 31
rfarr6 0:68d1066c8288 32 case 1:
rfarr6 0:68d1066c8288 33 // Draw blue rectangle over old bird position
rfarr6 0:68d1066c8288 34 uLCD.set_sector_address(0x001D, 0x7803);
rfarr6 0:68d1066c8288 35 uLCD.display_image(20, old_ypos);
rfarr6 0:68d1066c8288 36
rfarr6 0:68d1066c8288 37 if(wall_x_pos1 > -21 && wall_x_pos1 < 128){
rfarr6 0:68d1066c8288 38 // draw wall 1
rfarr6 0:68d1066c8288 39 if(wall_x_pos1 < 0){
rfarr6 0:68d1066c8288 40 //uLCD.filled_rectangle(0, 0, wall_x_pos1 + 19, 127, RED);
rfarr6 0:68d1066c8288 41 //uLCD.filled_rectangle(0, opening_y_pos1, wall_x_pos1 + 19, opening_y_pos1 + 39, BLUE);
rfarr6 0:68d1066c8288 42 uLCD.filled_rectangle(wall_x_pos1 + 20, 0, wall_x_pos1 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 43 } else if (wall_x_pos1 > 119){
rfarr6 0:68d1066c8288 44 uLCD.filled_rectangle(wall_x_pos1, 0, wall_x_pos1+1, opening_y_pos1-1, RED);
rfarr6 0:68d1066c8288 45 uLCD.filled_rectangle(wall_x_pos1, opening_y_pos1+40, wall_x_pos1+1, 127, RED);
rfarr6 0:68d1066c8288 46 } else {
rfarr6 0:68d1066c8288 47 uLCD.filled_rectangle(wall_x_pos1, 0, wall_x_pos1+1, opening_y_pos1-1, RED);
rfarr6 0:68d1066c8288 48 uLCD.filled_rectangle(wall_x_pos1, opening_y_pos1+40, wall_x_pos1+1, 127, RED);
rfarr6 0:68d1066c8288 49 uLCD.filled_rectangle(wall_x_pos1 + 20, 0, wall_x_pos1 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 50 }
rfarr6 0:68d1066c8288 51 }
rfarr6 0:68d1066c8288 52
rfarr6 0:68d1066c8288 53 if(wall_x_pos2 > -21 && wall_x_pos2 < 128){
rfarr6 0:68d1066c8288 54 // draw wall 1
rfarr6 0:68d1066c8288 55 if(wall_x_pos2 < 0){
rfarr6 0:68d1066c8288 56 //uLCD.filled_rectangle(0, 0, wall_x_pos2 + 19, 127, RED);
rfarr6 0:68d1066c8288 57 //uLCD.filled_rectangle(0, opening_y_pos2, wall_x_pos2 + 19, opening_y_pos2 + 39, BLUE);
rfarr6 0:68d1066c8288 58 uLCD.filled_rectangle(wall_x_pos2 + 20, 0, wall_x_pos2 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 59 } else if (wall_x_pos2 > 119){
rfarr6 0:68d1066c8288 60 uLCD.filled_rectangle(wall_x_pos2, 0, wall_x_pos2+1, opening_y_pos2-1, RED);
rfarr6 0:68d1066c8288 61 uLCD.filled_rectangle(wall_x_pos2, opening_y_pos2+40, wall_x_pos2+1, 127, RED);
rfarr6 0:68d1066c8288 62 } else {
rfarr6 0:68d1066c8288 63 uLCD.filled_rectangle(wall_x_pos2, 0, wall_x_pos2+1, opening_y_pos2-1, RED);
rfarr6 0:68d1066c8288 64 uLCD.filled_rectangle(wall_x_pos2, opening_y_pos2+40, wall_x_pos2+1, 127, RED);
rfarr6 0:68d1066c8288 65 uLCD.filled_rectangle(wall_x_pos2 + 20, 0, wall_x_pos2 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 66 }
rfarr6 0:68d1066c8288 67 }
rfarr6 0:68d1066c8288 68
rfarr6 0:68d1066c8288 69 if(wall_x_pos3 > -21 && wall_x_pos3 < 128){
rfarr6 0:68d1066c8288 70 // draw wall 3
rfarr6 0:68d1066c8288 71 if(wall_x_pos3 < 0){
rfarr6 0:68d1066c8288 72 uLCD.filled_rectangle(wall_x_pos3 + 20, 0, wall_x_pos3 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 73 } else if (wall_x_pos3 > 119){
rfarr6 0:68d1066c8288 74 uLCD.filled_rectangle(wall_x_pos3, 0, wall_x_pos3+1, opening_y_pos3-1, RED);
rfarr6 0:68d1066c8288 75 uLCD.filled_rectangle(wall_x_pos3, opening_y_pos3+40, wall_x_pos3+1, 127, RED);
rfarr6 0:68d1066c8288 76 } else {
rfarr6 0:68d1066c8288 77 uLCD.filled_rectangle(wall_x_pos3, 0, wall_x_pos3+1, opening_y_pos3-1, RED);
rfarr6 0:68d1066c8288 78 uLCD.filled_rectangle(wall_x_pos3, opening_y_pos3+40, wall_x_pos3+1, 127, RED);
rfarr6 0:68d1066c8288 79 uLCD.filled_rectangle(wall_x_pos3 + 20, 0, wall_x_pos3 + 21, 127, BLUE);
rfarr6 0:68d1066c8288 80 }
rfarr6 0:68d1066c8288 81 }
rfarr6 0:68d1066c8288 82
rfarr6 0:68d1066c8288 83 // Draw bird at current position
rfarr6 0:68d1066c8288 84 uLCD.set_sector_address(0x001D, bird_lo_addr);
rfarr6 0:68d1066c8288 85 uLCD.display_image(20, y_pos);
rfarr6 0:68d1066c8288 86
rfarr6 0:68d1066c8288 87 break;
rfarr6 0:68d1066c8288 88
rfarr6 0:68d1066c8288 89 case 2:
rfarr6 0:68d1066c8288 90 uLCD.filled_rectangle(0, 0, 127, 127, BLACK);
rfarr6 0:68d1066c8288 91 uLCD.locate(0, 6);
rfarr6 0:68d1066c8288 92 uLCD.printf("GAME OVER");
rfarr6 0:68d1066c8288 93 uLCD.locate(0, 7);
rfarr6 0:68d1066c8288 94 uLCD.printf("SCORE: %d", score);
rfarr6 0:68d1066c8288 95 break;
rfarr6 0:68d1066c8288 96 }
rfarr6 0:68d1066c8288 97 }
rfarr6 0:68d1066c8288 98
rfarr6 0:68d1066c8288 99 void update_frame() {
rfarr6 0:68d1066c8288 100 // Update bird position
rfarr6 0:68d1066c8288 101 old_ypos = y_pos;
rfarr6 0:68d1066c8288 102 y_pos += vel;
rfarr6 0:68d1066c8288 103
rfarr6 0:68d1066c8288 104 if (y_pos > 122) {
rfarr6 0:68d1066c8288 105 y_pos = 122;
rfarr6 0:68d1066c8288 106 } else if (y_pos < 0) {
rfarr6 0:68d1066c8288 107 y_pos = 0;
rfarr6 0:68d1066c8288 108 }
rfarr6 0:68d1066c8288 109
rfarr6 0:68d1066c8288 110 if (wall_x_pos1 <= 26 && wall_x_pos1 > 0) {
rfarr6 0:68d1066c8288 111 if (y_pos < opening_y_pos1 || y_pos+5 > opening_y_pos1+39) {
rfarr6 0:68d1066c8288 112 state = 2;
rfarr6 0:68d1066c8288 113 wait(3);
rfarr6 0:68d1066c8288 114 }
rfarr6 0:68d1066c8288 115 }
rfarr6 0:68d1066c8288 116
rfarr6 0:68d1066c8288 117 if (wall_x_pos2 <= 26 && wall_x_pos2 > 0) {
rfarr6 0:68d1066c8288 118 if (y_pos < opening_y_pos2 || y_pos+5 > opening_y_pos2+39) {
rfarr6 0:68d1066c8288 119 state = 2;
rfarr6 0:68d1066c8288 120 wait(3);
rfarr6 0:68d1066c8288 121 }
rfarr6 0:68d1066c8288 122 }
rfarr6 0:68d1066c8288 123
rfarr6 0:68d1066c8288 124 if (wall_x_pos3 <= 26 && wall_x_pos3 > 0) {
rfarr6 0:68d1066c8288 125 if (y_pos < opening_y_pos3 || y_pos+5 > opening_y_pos3+39) {
rfarr6 0:68d1066c8288 126 state = 2;
rfarr6 0:68d1066c8288 127 wait(3);
rfarr6 0:68d1066c8288 128 }
rfarr6 0:68d1066c8288 129 }
rfarr6 0:68d1066c8288 130
rfarr6 0:68d1066c8288 131 // Update bird velocity
rfarr6 0:68d1066c8288 132 if (!flap_button) {
rfarr6 0:68d1066c8288 133 // Toggle bird flap
rfarr6 0:68d1066c8288 134 bird_lo_addr ^= 0x3;
rfarr6 0:68d1066c8288 135
rfarr6 0:68d1066c8288 136 vel--;
rfarr6 0:68d1066c8288 137 if (vel < -5) vel = -5;
rfarr6 0:68d1066c8288 138 } else {
rfarr6 0:68d1066c8288 139 vel++;
rfarr6 0:68d1066c8288 140 if (vel > 5) vel = 5;
rfarr6 0:68d1066c8288 141 }
rfarr6 0:68d1066c8288 142
rfarr6 0:68d1066c8288 143 // Update wall positions
rfarr6 0:68d1066c8288 144 if(wall_x_pos1 > -21){
rfarr6 0:68d1066c8288 145 wall_x_pos1 -= 2;
rfarr6 0:68d1066c8288 146 } else {
rfarr6 0:68d1066c8288 147 wall_x_pos1 = wall_x_pos3 + 80 - (rand() % score);
rfarr6 2:5b231e0d0718 148 opening_y_pos1 = (int)(ain*1000.0) % 46 + 20;
rfarr6 0:68d1066c8288 149 score++;
rfarr6 0:68d1066c8288 150 }
rfarr6 0:68d1066c8288 151
rfarr6 0:68d1066c8288 152 if(wall_x_pos2 > -21){
rfarr6 0:68d1066c8288 153 wall_x_pos2 -= 2;
rfarr6 0:68d1066c8288 154 } else {
rfarr6 0:68d1066c8288 155 wall_x_pos2 = wall_x_pos1 + 80 - (rand() % score);
rfarr6 2:5b231e0d0718 156 opening_y_pos2 = (int)(ain*1000.0) % 46 + 20;
rfarr6 0:68d1066c8288 157 score++;
rfarr6 0:68d1066c8288 158 }
rfarr6 0:68d1066c8288 159
rfarr6 0:68d1066c8288 160 if(wall_x_pos3 > -21){
rfarr6 0:68d1066c8288 161 wall_x_pos3 -= 2;
rfarr6 0:68d1066c8288 162 } else {
rfarr6 0:68d1066c8288 163 wall_x_pos3 = wall_x_pos2 + 80 - (rand() % score);
rfarr6 2:5b231e0d0718 164 opening_y_pos3 = (int)(ain*1000.0) % 46 + 20;
rfarr6 0:68d1066c8288 165 score++;
rfarr6 0:68d1066c8288 166 }
rfarr6 0:68d1066c8288 167 }
rfarr6 0:68d1066c8288 168
rfarr6 0:68d1066c8288 169 int main() {
rfarr6 0:68d1066c8288 170 flap_button.mode(PullUp);
rfarr6 0:68d1066c8288 171
rfarr6 0:68d1066c8288 172 uLCD.baudrate(3000000);
rfarr6 0:68d1066c8288 173 uLCD.cls();
rfarr6 0:68d1066c8288 174 uLCD.filled_rectangle(0, 0, 127, 127, BLACK);
rfarr6 0:68d1066c8288 175 uLCD.media_init();
rfarr6 0:68d1066c8288 176
rfarr6 0:68d1066c8288 177 opening_y_pos1 = rand() % 46 + 20;
rfarr6 0:68d1066c8288 178 opening_y_pos2 = rand() % 46 + 20;
rfarr6 0:68d1066c8288 179 opening_y_pos3 = rand() % 46 + 20;
rfarr6 0:68d1066c8288 180
rfarr6 0:68d1066c8288 181 wall_x_pos2 = wall_x_pos1 + 80 - (rand() % 5);
rfarr6 0:68d1066c8288 182 wall_x_pos3 = wall_x_pos2 + 80 - (rand() % 5);
rfarr6 0:68d1066c8288 183
rfarr6 0:68d1066c8288 184 // Bird is 6 rows, 7 cols
rfarr6 0:68d1066c8288 185
rfarr6 0:68d1066c8288 186 while (1) {
rfarr6 0:68d1066c8288 187 draw_frame();
rfarr6 0:68d1066c8288 188
rfarr6 0:68d1066c8288 189 if (state == 1) {
rfarr6 0:68d1066c8288 190 update_frame();
rfarr6 0:68d1066c8288 191 } else if (state == 0 && !flap_button) {
rfarr6 0:68d1066c8288 192 uLCD.filled_rectangle(0, 0, 127, 127, BLUE);
rfarr6 0:68d1066c8288 193 state = 1;
rfarr6 0:68d1066c8288 194 }
rfarr6 0:68d1066c8288 195
rfarr6 0:68d1066c8288 196 wait_ms(50);
rfarr6 0:68d1066c8288 197 }
rfarr6 0:68d1066c8288 198 }