
Zeyu Feng 201377605
Dependencies: mbed
On Minerva
main.cpp@18:93d050e7705d, 2020-05-21 (annotated)
- Committer:
- el19zf
- Date:
- Thu May 21 15:20:33 2020 +0000
- Revision:
- 18:93d050e7705d
- Parent:
- 17:ba4d9cd1e347
- Child:
- 19:5083339b55e8
build a Instruction class, and add it to menu
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el19zf | 7:c49f3d3b672f | 1 | /* |
eencae | 0:b7f1f47bb26a | 2 | ELEC2645 Embedded Systems Project |
eencae | 0:b7f1f47bb26a | 3 | School of Electronic & Electrical Engineering |
eencae | 0:b7f1f47bb26a | 4 | University of Leeds |
eencae | 0:b7f1f47bb26a | 5 | 2019/20 |
eencae | 0:b7f1f47bb26a | 6 | |
el19zf | 1:b133934e0d45 | 7 | Name:Zeyu Feng |
el19zf | 1:b133934e0d45 | 8 | Username:el19zf |
el19zf | 1:b133934e0d45 | 9 | Student ID Number:201377605 |
el19zf | 1:b133934e0d45 | 10 | Date:11/3/2020 |
eencae | 0:b7f1f47bb26a | 11 | */ |
eencae | 0:b7f1f47bb26a | 12 | |
eencae | 0:b7f1f47bb26a | 13 | #include "mbed.h" |
eencae | 0:b7f1f47bb26a | 14 | #include "Gamepad.h" |
eencae | 0:b7f1f47bb26a | 15 | #include "N5110.h" |
el19zf | 2:67b51ee7fc34 | 16 | #include "People.h" |
el19zf | 3:b8fbaefc496c | 17 | #include "PeopleEngine.h" |
el19zf | 4:b12a49f0b730 | 18 | #include "shot.h" |
el19zf | 8:8287d2ef965d | 19 | #include "Collision.h" |
el19zf | 11:494cc44777fe | 20 | #include "Interface.h" |
el19zf | 18:93d050e7705d | 21 | #include "Instruction.h" |
el19zf | 15:3571beaaeed8 | 22 | #include "tests.h" |
el19zf | 6:dce38fe4e092 | 23 | |
eencae | 0:b7f1f47bb26a | 24 | // objects |
eencae | 0:b7f1f47bb26a | 25 | Gamepad pad; |
eencae | 0:b7f1f47bb26a | 26 | N5110 lcd; |
el19zf | 3:b8fbaefc496c | 27 | PeopleEngine engine; |
el19zf | 4:b12a49f0b730 | 28 | shot shot; |
el19zf | 8:8287d2ef965d | 29 | Collision collision; |
el19zf | 11:494cc44777fe | 30 | Interface interface; |
el19zf | 16:cf2bfada3adf | 31 | Sound sound; |
el19zf | 18:93d050e7705d | 32 | Instruction instruction; |
el19zf | 4:b12a49f0b730 | 33 | |
el19zf | 6:dce38fe4e092 | 34 | //flag and triggers |
el19zf | 9:62d6559f0d50 | 35 | Ticker ticker;//gradually increase number of shots |
el19zf | 9:62d6559f0d50 | 36 | Timeout timeout; |
el19zf | 6:dce38fe4e092 | 37 | volatile int timer_flag = 0; |
el19zf | 9:62d6559f0d50 | 38 | volatile int timeout_flag = 0; |
el19zf | 11:494cc44777fe | 39 | volatile int count_flag = 18; |
el19zf | 11:494cc44777fe | 40 | volatile int paused_flag = 0; |
el19zf | 11:494cc44777fe | 41 | volatile int option_flag = 0; |
el19zf | 17:ba4d9cd1e347 | 42 | volatile int defined_rate_flag = 0; |
el19zf | 17:ba4d9cd1e347 | 43 | volatile int defined_max_flag = 0; |
el19zf | 6:dce38fe4e092 | 44 | |
el19zf | 13:eb60628db8bf | 45 | // prototypes |
el19zf | 11:494cc44777fe | 46 | void flip(){ timer_flag = 1; } |
el19zf | 11:494cc44777fe | 47 | void time_out(){ timeout_flag = 1; } |
el19zf | 6:dce38fe4e092 | 48 | void init(); |
el19zf | 13:eb60628db8bf | 49 | void init_value(); |
el19zf | 8:8287d2ef965d | 50 | void control_check(); |
el19zf | 16:cf2bfada3adf | 51 | void update(float, int); |
el19zf | 10:02ab3324be6c | 52 | void init_timeout(); |
el19zf | 11:494cc44777fe | 53 | void main_game(float,int); |
el19zf | 12:009895f6b6e4 | 54 | void simp_game(); |
el19zf | 17:ba4d9cd1e347 | 55 | void undefined(); |
eencae | 0:b7f1f47bb26a | 56 | |
eencae | 0:b7f1f47bb26a | 57 | int main() |
eencae | 0:b7f1f47bb26a | 58 | { |
el19zf | 13:eb60628db8bf | 59 | #ifdef WITH_TESTING |
el19zf | 12:009895f6b6e4 | 60 | int failures = run_all_tests(); |
el19zf | 13:eb60628db8bf | 61 | #endif |
el19zf | 3:b8fbaefc496c | 62 | //initial |
el19zf | 6:dce38fe4e092 | 63 | init(); |
el19zf | 11:494cc44777fe | 64 | |
el19zf | 11:494cc44777fe | 65 | interface.Welcome(lcd,pad); |
el19zf | 13:eb60628db8bf | 66 | |
el19zf | 11:494cc44777fe | 67 | //a infinite loop |
el19zf | 6:dce38fe4e092 | 68 | while(1) { |
el19zf | 11:494cc44777fe | 69 | init(); |
el19zf | 11:494cc44777fe | 70 | init_value(); |
el19zf | 17:ba4d9cd1e347 | 71 | option_flag= interface.menu(lcd,pad,option_flag); |
el19zf | 11:494cc44777fe | 72 | switch(option_flag){ |
el19zf | 11:494cc44777fe | 73 | case 0: |
el19zf | 17:ba4d9cd1e347 | 74 | main_game(0.15,13); |
el19zf | 11:494cc44777fe | 75 | break; |
el19zf | 11:494cc44777fe | 76 | case 1: |
el19zf | 17:ba4d9cd1e347 | 77 | main_game(1,30); |
el19zf | 12:009895f6b6e4 | 78 | simp_game(); |
el19zf | 11:494cc44777fe | 79 | break; |
el19zf | 11:494cc44777fe | 80 | case 2: |
el19zf | 17:ba4d9cd1e347 | 81 | undefined(); |
el19zf | 17:ba4d9cd1e347 | 82 | break; |
el19zf | 17:ba4d9cd1e347 | 83 | case 3: |
el19zf | 18:93d050e7705d | 84 | instruction.draw(lcd,pad); |
el19zf | 18:93d050e7705d | 85 | break; |
el19zf | 18:93d050e7705d | 86 | case 4: |
el19zf | 11:494cc44777fe | 87 | interface.exit(lcd,pad); |
el19zf | 11:494cc44777fe | 88 | break; |
el19zf | 17:ba4d9cd1e347 | 89 | } |
el19zf | 18:93d050e7705d | 90 | #ifdef DEBUG |
el19zf | 18:93d050e7705d | 91 | printf("END LOOP\n"); |
el19zf | 18:93d050e7705d | 92 | #endif |
el19zf | 11:494cc44777fe | 93 | } |
el19zf | 11:494cc44777fe | 94 | } |
el19zf | 11:494cc44777fe | 95 | |
el19zf | 11:494cc44777fe | 96 | void main_game(float increment,int max){ |
el19zf | 11:494cc44777fe | 97 | |
el19zf | 11:494cc44777fe | 98 | ticker.attach(&flip,2);//set a ticker |
el19zf | 11:494cc44777fe | 99 | timeout.attach(&time_out,3);//set a timeout |
el19zf | 11:494cc44777fe | 100 | |
el19zf | 11:494cc44777fe | 101 | while((collision.get_health() > 0)&&(!collision.get_des())) |
el19zf | 13:eb60628db8bf | 102 | { |
el19zf | 6:dce38fe4e092 | 103 | lcd.clear(); |
el19zf | 13:eb60628db8bf | 104 | // increase shots with a ticker |
el19zf | 13:eb60628db8bf | 105 | shot.gen_shot(timer_flag,increment,max); |
el19zf | 8:8287d2ef965d | 106 | // shot update |
el19zf | 15:3571beaaeed8 | 107 | shot.draw(lcd); |
el19zf | 8:8287d2ef965d | 108 | |
el19zf | 11:494cc44777fe | 109 | // set a count down and update lcd |
el19zf | 16:cf2bfada3adf | 110 | update(increment, max); |
el19zf | 11:494cc44777fe | 111 | |
el19zf | 11:494cc44777fe | 112 | pad.leds_on(); |
el19zf | 10:02ab3324be6c | 113 | |
el19zf | 6:dce38fe4e092 | 114 | lcd.refresh(); |
el19zf | 6:dce38fe4e092 | 115 | //printf("shot refresh\n"); |
el19zf | 6:dce38fe4e092 | 116 | //printf("size = %d\n",shot._size); |
el19zf | 9:62d6559f0d50 | 117 | wait_ms(1000/6);//fps = 6 |
el19zf | 6:dce38fe4e092 | 118 | } |
el19zf | 18:93d050e7705d | 119 | #ifdef DEBUG |
el19zf | 18:93d050e7705d | 120 | printf("END GAME\n"); |
el19zf | 18:93d050e7705d | 121 | #endif |
el19zf | 6:dce38fe4e092 | 122 | } |
el19zf | 6:dce38fe4e092 | 123 | |
el19zf | 6:dce38fe4e092 | 124 | void init() |
el19zf | 6:dce38fe4e092 | 125 | { |
el19zf | 2:67b51ee7fc34 | 126 | lcd.init(); |
el19zf | 3:b8fbaefc496c | 127 | engine.init(); |
el19zf | 2:67b51ee7fc34 | 128 | pad.init(); |
el19zf | 7:c49f3d3b672f | 129 | shot.init(); |
el19zf | 8:8287d2ef965d | 130 | collision.init(); |
el19zf | 2:67b51ee7fc34 | 131 | lcd.refresh(); |
el19zf | 13:eb60628db8bf | 132 | interface.init(); |
el19zf | 10:02ab3324be6c | 133 | } |
el19zf | 10:02ab3324be6c | 134 | |
el19zf | 11:494cc44777fe | 135 | void init_value() |
el19zf | 11:494cc44777fe | 136 | { |
el19zf | 11:494cc44777fe | 137 | timer_flag = 0; |
el19zf | 10:02ab3324be6c | 138 | timeout_flag = 0; |
el19zf | 11:494cc44777fe | 139 | count_flag = 18; |
el19zf | 11:494cc44777fe | 140 | paused_flag = 0; |
el19zf | 11:494cc44777fe | 141 | option_flag = 0; |
el19zf | 17:ba4d9cd1e347 | 142 | defined_rate_flag = 0; |
el19zf | 17:ba4d9cd1e347 | 143 | defined_max_flag = 0; |
el19zf | 12:009895f6b6e4 | 144 | } |
el19zf | 12:009895f6b6e4 | 145 | |
el19zf | 13:eb60628db8bf | 146 | void control_check() |
el19zf | 13:eb60628db8bf | 147 | { |
el19zf | 13:eb60628db8bf | 148 | engine.read_input(pad); |
el19zf | 13:eb60628db8bf | 149 | engine.update(); |
el19zf | 13:eb60628db8bf | 150 | collision.set_pos(engine.get_pos()); |
el19zf | 13:eb60628db8bf | 151 | // if people is shotted, health -1 and reset the game |
el19zf | 13:eb60628db8bf | 152 | if(collision.check(lcd)) { |
el19zf | 14:42b8a91e463c | 153 | pad.play_melody(2,sound_data_col,sound_dur_col,120,0); |
el19zf | 13:eb60628db8bf | 154 | if(!collision.get_health()){ |
el19zf | 13:eb60628db8bf | 155 | interface.game_over(lcd,pad); |
el19zf | 13:eb60628db8bf | 156 | } else{ |
el19zf | 13:eb60628db8bf | 157 | init_timeout(); |
el19zf | 13:eb60628db8bf | 158 | } |
el19zf | 13:eb60628db8bf | 159 | lcd.clear(); |
el19zf | 13:eb60628db8bf | 160 | } |
el19zf | 13:eb60628db8bf | 161 | } |
el19zf | 13:eb60628db8bf | 162 | |
el19zf | 16:cf2bfada3adf | 163 | void update(float increment, int max) |
el19zf | 13:eb60628db8bf | 164 | { |
el19zf | 13:eb60628db8bf | 165 | if(timeout_flag){ |
el19zf | 13:eb60628db8bf | 166 | control_check(); |
el19zf | 16:cf2bfada3adf | 167 | paused_flag = interface.check_pause(lcd,pad,paused_flag,increment,max); |
el19zf | 13:eb60628db8bf | 168 | }else{ |
el19zf | 13:eb60628db8bf | 169 | //if timeout_flag count down number and Joystick have been banned |
el19zf | 13:eb60628db8bf | 170 | count_flag = interface.count_down(lcd,count_flag); |
el19zf | 16:cf2bfada3adf | 171 | pad.reset_buttons(); |
el19zf | 13:eb60628db8bf | 172 | } |
el19zf | 13:eb60628db8bf | 173 | //control people and check collision |
el19zf | 13:eb60628db8bf | 174 | if(!collision.get_check_col()){ |
el19zf | 13:eb60628db8bf | 175 | engine.draw(lcd,timeout_flag); |
el19zf | 13:eb60628db8bf | 176 | collision.draw(lcd); |
el19zf | 13:eb60628db8bf | 177 | }else{ |
el19zf | 13:eb60628db8bf | 178 | collision.set_check_col(); |
el19zf | 13:eb60628db8bf | 179 | } |
el19zf | 13:eb60628db8bf | 180 | //printf("timeout_flag = %d\n",timeout_flag); |
el19zf | 13:eb60628db8bf | 181 | //check destination |
el19zf | 13:eb60628db8bf | 182 | if(collision.check_des(lcd)){ |
el19zf | 13:eb60628db8bf | 183 | interface.victory(lcd,pad); |
el19zf | 13:eb60628db8bf | 184 | lcd.clear(); |
el19zf | 13:eb60628db8bf | 185 | } |
el19zf | 13:eb60628db8bf | 186 | } |
el19zf | 13:eb60628db8bf | 187 | |
el19zf | 13:eb60628db8bf | 188 | //reset timeout after collision (health > 0) |
el19zf | 13:eb60628db8bf | 189 | void init_timeout() |
el19zf | 13:eb60628db8bf | 190 | { |
el19zf | 13:eb60628db8bf | 191 | collision.draw_collision(lcd); |
el19zf | 13:eb60628db8bf | 192 | engine.init(); |
el19zf | 13:eb60628db8bf | 193 | shot.init(); |
el19zf | 16:cf2bfada3adf | 194 | //initialise time out,flag and bottons |
el19zf | 13:eb60628db8bf | 195 | timeout.attach(&time_out,3); |
el19zf | 13:eb60628db8bf | 196 | timeout_flag = 0; |
el19zf | 13:eb60628db8bf | 197 | count_flag = 18; |
el19zf | 16:cf2bfada3adf | 198 | //count down, each duration 0.5s and 60 beats per minute(1s) |
el19zf | 16:cf2bfada3adf | 199 | sound.count_sound(pad); |
el19zf | 16:cf2bfada3adf | 200 | pad.reset_buttons(); |
el19zf | 13:eb60628db8bf | 201 | } |
el19zf | 13:eb60628db8bf | 202 | |
el19zf | 12:009895f6b6e4 | 203 | void simp_game() |
el19zf | 12:009895f6b6e4 | 204 | { |
el19zf | 12:009895f6b6e4 | 205 | if(!interface.get_victory_flag()){ |
el19zf | 13:eb60628db8bf | 206 | |
el19zf | 12:009895f6b6e4 | 207 | interface.simple_game(lcd,pad); |
el19zf | 12:009895f6b6e4 | 208 | if(interface.get_sim_flag()){ |
el19zf | 12:009895f6b6e4 | 209 | init(); |
el19zf | 15:3571beaaeed8 | 210 | init_value(); |
el19zf | 17:ba4d9cd1e347 | 211 | main_game(0.5,23); |
el19zf | 12:009895f6b6e4 | 212 | } |
el19zf | 12:009895f6b6e4 | 213 | } |
el19zf | 12:009895f6b6e4 | 214 | interface.init(); |
el19zf | 17:ba4d9cd1e347 | 215 | } |
el19zf | 17:ba4d9cd1e347 | 216 | |
el19zf | 17:ba4d9cd1e347 | 217 | void undefined() |
el19zf | 17:ba4d9cd1e347 | 218 | { |
el19zf | 17:ba4d9cd1e347 | 219 | defined_rate_flag = interface.undefined_rate(lcd,pad,defined_rate_flag); |
el19zf | 17:ba4d9cd1e347 | 220 | defined_max_flag = interface.undefined_max(lcd,pad,defined_max_flag); |
el19zf | 17:ba4d9cd1e347 | 221 | // 0 1 2 3 4 flag |
el19zf | 17:ba4d9cd1e347 | 222 | // 0.3 0.4 0.5 0.6 0.7 shots/frame |
el19zf | 17:ba4d9cd1e347 | 223 | // 15 20 25 30 35 Maximum shots |
el19zf | 17:ba4d9cd1e347 | 224 | main_game(0.1*(defined_rate_flag + 3),5*(defined_max_flag + 3)); |
el19zf | 17:ba4d9cd1e347 | 225 | } |
el19zf | 17:ba4d9cd1e347 | 226 |