Space Invaders - Embedded Systems Project 15/16 - Avinash Patel 200860407
Dependencies: Joystick N5110 SDFileSystem mbed
main.cpp@1:b300d052d549, 2016-03-13 (annotated)
- Committer:
- avi23
- Date:
- Sun Mar 13 17:03:33 2016 +0000
- Revision:
- 1:b300d052d549
- Parent:
- 0:427469992efe
- Child:
- 2:d34c95990605
All enemies are now visible and switch state every second
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
avi23 | 1:b300d052d549 | 1 | /* |
avi23 | 1:b300d052d549 | 2 | Space Invaders - Avinash Patel 200860407 |
avi23 | 1:b300d052d549 | 3 | |
avi23 | 1:b300d052d549 | 4 | Week 19 - Set up joystick class |
avi23 | 1:b300d052d549 | 5 | Week 20 - Changed to space invaders as constrained too much by screen resolution |
avi23 | 1:b300d052d549 | 6 | - Core cannon is drawn and can move, enemies are visible and they switch between states every second |
avi23 | 1:b300d052d549 | 7 | */ |
avi23 | 0:427469992efe | 8 | #include "mbed.h" |
avi23 | 0:427469992efe | 9 | #include "N5110.h" |
avi23 | 0:427469992efe | 10 | |
avi23 | 0:427469992efe | 11 | #define EMPTY 0 |
avi23 | 0:427469992efe | 12 | |
avi23 | 0:427469992efe | 13 | //Joystick Class |
avi23 | 0:427469992efe | 14 | class Joystick |
avi23 | 0:427469992efe | 15 | { |
avi23 | 0:427469992efe | 16 | public: |
avi23 | 0:427469992efe | 17 | Joystick(PinName x_axis_pin, PinName y_axis_pin, PinName button_pin) { |
avi23 | 0:427469992efe | 18 | //Dynamically allocates the pins |
avi23 | 0:427469992efe | 19 | x_axis_ = new AnalogIn(x_axis_pin); |
avi23 | 0:427469992efe | 20 | y_axis_ = new AnalogIn(y_axis_pin); |
avi23 | 0:427469992efe | 21 | button_ = new InterruptIn(button_pin); |
avi23 | 0:427469992efe | 22 | } |
avi23 | 0:427469992efe | 23 | |
avi23 | 0:427469992efe | 24 | //Initalises the Joystick |
avi23 | 0:427469992efe | 25 | //Sets up the ISRs and grabs the offsets for each axis |
avi23 | 0:427469992efe | 26 | void init() { |
avi23 | 0:427469992efe | 27 | //Sets up the button ISR |
avi23 | 0:427469992efe | 28 | //DigitalOut* b = new DigitalOut(LED_BLUE); |
avi23 | 0:427469992efe | 29 | |
avi23 | 0:427469992efe | 30 | button_->mode(PullUp); |
avi23 | 0:427469992efe | 31 | //read_ticker_->attach(this, &Joystick::read_ticker_isr, time); //Samples joystick every second |
avi23 | 0:427469992efe | 32 | button_->fall(this, &Joystick::button_isr); |
avi23 | 0:427469992efe | 33 | |
avi23 | 0:427469992efe | 34 | //Initalises the vairables and flags |
avi23 | 0:427469992efe | 35 | x_offset_ = 0; |
avi23 | 0:427469992efe | 36 | y_offset_ = 0; |
avi23 | 0:427469992efe | 37 | g_read_flag_ = 0; |
avi23 | 0:427469992efe | 38 | g_button_flag_ = 0; |
avi23 | 0:427469992efe | 39 | |
avi23 | 0:427469992efe | 40 | //Samples the joystick 5 times and takes an average to get the offset |
avi23 | 0:427469992efe | 41 | float x_sum = 0; |
avi23 | 0:427469992efe | 42 | float y_sum = 0; |
avi23 | 0:427469992efe | 43 | |
avi23 | 0:427469992efe | 44 | for (int i = 0; i < 5; i++) { |
avi23 | 0:427469992efe | 45 | x_sum += x_axis_->read(); |
avi23 | 0:427469992efe | 46 | y_sum += y_axis_->read(); |
avi23 | 0:427469992efe | 47 | } |
avi23 | 0:427469992efe | 48 | |
avi23 | 0:427469992efe | 49 | x_offset_ = 0.5f - x_sum/5.0f; |
avi23 | 0:427469992efe | 50 | y_offset_ = 0.5f - y_sum/5.0f; |
avi23 | 0:427469992efe | 51 | } |
avi23 | 0:427469992efe | 52 | |
avi23 | 0:427469992efe | 53 | //Take 5 readings and returns the average measurement, accounting for joystick offset x and y values |
avi23 | 0:427469992efe | 54 | float GetXValue() { |
avi23 | 0:427469992efe | 55 | |
avi23 | 0:427469992efe | 56 | float x_sum = 0; |
avi23 | 0:427469992efe | 57 | |
avi23 | 0:427469992efe | 58 | for (int i = 0; i < 5; i++) { |
avi23 | 0:427469992efe | 59 | x_sum += x_axis_->read(); |
avi23 | 0:427469992efe | 60 | } |
avi23 | 0:427469992efe | 61 | |
avi23 | 0:427469992efe | 62 | float x_value = x_sum/5.0f + x_offset_; |
avi23 | 0:427469992efe | 63 | |
avi23 | 0:427469992efe | 64 | //Caps the value for the POT between 0 and 1 |
avi23 | 0:427469992efe | 65 | if (x_value < 0.0f) { |
avi23 | 0:427469992efe | 66 | return 0; |
avi23 | 0:427469992efe | 67 | } else if (x_value > 1.0f) { |
avi23 | 0:427469992efe | 68 | return 1; |
avi23 | 0:427469992efe | 69 | } else { |
avi23 | 0:427469992efe | 70 | return x_value; |
avi23 | 0:427469992efe | 71 | } |
avi23 | 0:427469992efe | 72 | } |
avi23 | 0:427469992efe | 73 | |
avi23 | 0:427469992efe | 74 | float GetYValue() { |
avi23 | 0:427469992efe | 75 | |
avi23 | 0:427469992efe | 76 | float y_sum = 0; |
avi23 | 0:427469992efe | 77 | |
avi23 | 0:427469992efe | 78 | for (int i = 0; i < 5; i++) { |
avi23 | 0:427469992efe | 79 | y_sum += y_axis_->read(); |
avi23 | 0:427469992efe | 80 | } |
avi23 | 0:427469992efe | 81 | |
avi23 | 0:427469992efe | 82 | float y_value = y_sum/5.0f + y_offset_; |
avi23 | 0:427469992efe | 83 | |
avi23 | 0:427469992efe | 84 | //Caps the value for the POT between 0 and 1 |
avi23 | 0:427469992efe | 85 | if (y_value < 0.0f) { |
avi23 | 0:427469992efe | 86 | return 0; |
avi23 | 0:427469992efe | 87 | } else if (y_value > 1.0f) { |
avi23 | 0:427469992efe | 88 | return 1; |
avi23 | 0:427469992efe | 89 | } else { |
avi23 | 0:427469992efe | 90 | return y_value; |
avi23 | 0:427469992efe | 91 | } |
avi23 | 0:427469992efe | 92 | } |
avi23 | 0:427469992efe | 93 | |
avi23 | 0:427469992efe | 94 | float ReadXAxis() { |
avi23 | 0:427469992efe | 95 | return x_axis_->read(); |
avi23 | 0:427469992efe | 96 | } |
avi23 | 0:427469992efe | 97 | |
avi23 | 0:427469992efe | 98 | float ReadYAxis() { |
avi23 | 0:427469992efe | 99 | return y_axis_->read(); |
avi23 | 0:427469992efe | 100 | } |
avi23 | 0:427469992efe | 101 | |
avi23 | 0:427469992efe | 102 | //Getter and setters for flags |
avi23 | 0:427469992efe | 103 | int get_read_flag() { |
avi23 | 0:427469992efe | 104 | return g_read_flag_; |
avi23 | 0:427469992efe | 105 | } |
avi23 | 0:427469992efe | 106 | |
avi23 | 0:427469992efe | 107 | void set_read_flag(int value) { |
avi23 | 0:427469992efe | 108 | g_read_flag_ = value; |
avi23 | 0:427469992efe | 109 | } |
avi23 | 0:427469992efe | 110 | |
avi23 | 0:427469992efe | 111 | int get_button_flag() { |
avi23 | 0:427469992efe | 112 | return g_button_flag_; |
avi23 | 0:427469992efe | 113 | } |
avi23 | 0:427469992efe | 114 | |
avi23 | 0:427469992efe | 115 | void set_button_flag(int value) { |
avi23 | 0:427469992efe | 116 | g_button_flag_ = value; |
avi23 | 0:427469992efe | 117 | } |
avi23 | 0:427469992efe | 118 | |
avi23 | 0:427469992efe | 119 | //Ticker ISR Method |
avi23 | 0:427469992efe | 120 | void read_ticker_isr() { |
avi23 | 0:427469992efe | 121 | g_read_flag_ = 1; |
avi23 | 0:427469992efe | 122 | } |
avi23 | 0:427469992efe | 123 | |
avi23 | 0:427469992efe | 124 | private: |
avi23 | 0:427469992efe | 125 | //Button ISR Method |
avi23 | 0:427469992efe | 126 | void button_isr() { |
avi23 | 0:427469992efe | 127 | g_button_flag_ = 1; |
avi23 | 0:427469992efe | 128 | } |
avi23 | 0:427469992efe | 129 | |
avi23 | 0:427469992efe | 130 | private: |
avi23 | 0:427469992efe | 131 | //Pin inputs |
avi23 | 0:427469992efe | 132 | AnalogIn* x_axis_; |
avi23 | 0:427469992efe | 133 | AnalogIn* y_axis_; |
avi23 | 0:427469992efe | 134 | InterruptIn* button_; |
avi23 | 0:427469992efe | 135 | |
avi23 | 0:427469992efe | 136 | //Ticker |
avi23 | 0:427469992efe | 137 | Ticker* read_ticker_; |
avi23 | 0:427469992efe | 138 | |
avi23 | 0:427469992efe | 139 | //Stores X and Y offsets |
avi23 | 0:427469992efe | 140 | float x_offset_; |
avi23 | 0:427469992efe | 141 | float y_offset_; |
avi23 | 0:427469992efe | 142 | |
avi23 | 0:427469992efe | 143 | //Stores interrupt flags |
avi23 | 0:427469992efe | 144 | volatile int g_read_flag_; |
avi23 | 0:427469992efe | 145 | volatile int g_button_flag_; |
avi23 | 0:427469992efe | 146 | }; |
avi23 | 0:427469992efe | 147 | |
avi23 | 0:427469992efe | 148 | // K64F on-board LEDs |
avi23 | 0:427469992efe | 149 | DigitalOut r_led(LED_RED); |
avi23 | 0:427469992efe | 150 | DigitalOut g_led(LED_GREEN); |
avi23 | 0:427469992efe | 151 | DigitalOut b_led(LED_BLUE); |
avi23 | 0:427469992efe | 152 | |
avi23 | 0:427469992efe | 153 | // K64F on-board switches |
avi23 | 0:427469992efe | 154 | InterruptIn sw2(SW2); |
avi23 | 0:427469992efe | 155 | InterruptIn sw3(SW3); |
avi23 | 0:427469992efe | 156 | |
avi23 | 0:427469992efe | 157 | // UART connection for PC |
avi23 | 0:427469992efe | 158 | Serial pc(USBTX,USBRX); |
avi23 | 0:427469992efe | 159 | |
avi23 | 0:427469992efe | 160 | //Joystick |
avi23 | 0:427469992efe | 161 | Joystick joystick(PTC10, PTC11, PTB11); |
avi23 | 0:427469992efe | 162 | |
avi23 | 0:427469992efe | 163 | //LCD object |
avi23 | 0:427469992efe | 164 | // VCC, SCE, RST, D/C, MOSI, SCLK, LED |
avi23 | 0:427469992efe | 165 | N5110 lcd (PTE26 , PTA0 , PTC4 , PTD0 , PTD2 , PTD1 , PTC3); |
avi23 | 0:427469992efe | 166 | |
avi23 | 0:427469992efe | 167 | //Ship bit-map and location |
avi23 | 1:b300d052d549 | 168 | int cannon_xpos = 24; |
avi23 | 1:b300d052d549 | 169 | const int cannon_ypos = 43; |
avi23 | 1:b300d052d549 | 170 | Ticker move_cannon; |
avi23 | 1:b300d052d549 | 171 | const bool cannon_bitmap[5][9] = { |
avi23 | 0:427469992efe | 172 | {0, 0, 0, 0, 1, 0, 0, 0, 0}, |
avi23 | 0:427469992efe | 173 | {0, 0, 0, 1, 1, 1, 0, 0, 0}, |
avi23 | 0:427469992efe | 174 | {0, 1, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 0:427469992efe | 175 | {1, 1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 0:427469992efe | 176 | {1, 1, 1, 1, 1, 1, 1, 1, 1} |
avi23 | 0:427469992efe | 177 | }; |
avi23 | 0:427469992efe | 178 | |
avi23 | 0:427469992efe | 179 | //Enemies |
avi23 | 0:427469992efe | 180 | Ticker move_enemies; |
avi23 | 1:b300d052d549 | 181 | short screen[84][48]; |
avi23 | 1:b300d052d549 | 182 | bool enemies_in_state2 = true; |
avi23 | 1:b300d052d549 | 183 | //Struct to store enemy data |
avi23 | 1:b300d052d549 | 184 | struct Enemies { |
avi23 | 0:427469992efe | 185 | int x_pos; |
avi23 | 0:427469992efe | 186 | int y_pos; |
avi23 | 0:427469992efe | 187 | bool is_alive; |
avi23 | 1:b300d052d549 | 188 | } small_invader[6], medium_invader[6], large_invader[6]; |
avi23 | 0:427469992efe | 189 | int no_of_small_invaders = 6; |
avi23 | 1:b300d052d549 | 190 | int no_of_medium_invaders = 6; |
avi23 | 1:b300d052d549 | 191 | int no_of_large_invaders = 6; |
avi23 | 1:b300d052d549 | 192 | //Bitmaps for small invaders |
avi23 | 0:427469992efe | 193 | const bool small_invader_bitmap_1[6][8] = { |
avi23 | 0:427469992efe | 194 | {0, 0, 0, 1, 1, 0, 0, 0}, |
avi23 | 0:427469992efe | 195 | {0, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 0:427469992efe | 196 | {1, 1, 0, 1, 1, 0, 1, 1}, |
avi23 | 0:427469992efe | 197 | {1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 0:427469992efe | 198 | {0, 1, 0, 1, 1, 0, 1, 0}, |
avi23 | 0:427469992efe | 199 | {1, 0, 1, 0, 0, 1, 0, 1} |
avi23 | 0:427469992efe | 200 | }; |
avi23 | 0:427469992efe | 201 | |
avi23 | 0:427469992efe | 202 | const bool small_invader_bitmap_2[6][8] = { |
avi23 | 0:427469992efe | 203 | {0, 0, 0, 1, 1, 0, 0, 0}, |
avi23 | 0:427469992efe | 204 | {0, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 0:427469992efe | 205 | {1, 1, 0, 1, 1, 0, 1, 1}, |
avi23 | 0:427469992efe | 206 | {1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 0:427469992efe | 207 | {1, 0, 0, 0, 0, 0, 0, 1}, |
avi23 | 0:427469992efe | 208 | {0, 1, 0, 0, 0, 0, 1, 0} |
avi23 | 0:427469992efe | 209 | }; |
avi23 | 1:b300d052d549 | 210 | //Bitmaps for medium invaders |
avi23 | 1:b300d052d549 | 211 | const bool medium_invader_bitmap_1[6][10] = { |
avi23 | 1:b300d052d549 | 212 | {1, 0, 0, 1, 0, 0, 1, 0, 0, 1}, |
avi23 | 1:b300d052d549 | 213 | {1, 0, 1, 1, 1, 1, 1, 1, 0, 1}, |
avi23 | 1:b300d052d549 | 214 | {1, 1, 1, 0, 1, 1, 0, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 215 | {0, 1, 1, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 1:b300d052d549 | 216 | {0, 0, 1, 0, 0, 0, 0, 1, 0, 0}, |
avi23 | 1:b300d052d549 | 217 | {0, 1, 0, 0, 0, 0, 0, 0, 1, 0} |
avi23 | 1:b300d052d549 | 218 | }; |
avi23 | 1:b300d052d549 | 219 | |
avi23 | 1:b300d052d549 | 220 | const bool medium_invader_bitmap_2[6][10] = { |
avi23 | 1:b300d052d549 | 221 | {0, 0, 0, 1, 0, 0, 1, 0, 0, 0}, |
avi23 | 1:b300d052d549 | 222 | {0, 0, 1, 1, 1, 1, 1, 1, 0, 0}, |
avi23 | 1:b300d052d549 | 223 | {0, 1, 1, 0, 1, 1, 0, 1, 1, 0}, |
avi23 | 1:b300d052d549 | 224 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 225 | {1, 0, 1, 0, 0, 0, 0, 1, 0, 1}, |
avi23 | 1:b300d052d549 | 226 | {0, 0, 0, 1, 1, 1, 1, 0, 0, 0} |
avi23 | 1:b300d052d549 | 227 | }; |
avi23 | 1:b300d052d549 | 228 | //Bitmaps for large invaders |
avi23 | 1:b300d052d549 | 229 | const bool large_invader_bitmap_1[6][12] = { |
avi23 | 1:b300d052d549 | 230 | {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}, |
avi23 | 1:b300d052d549 | 231 | {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 1:b300d052d549 | 232 | {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 233 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 234 | {0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0}, |
avi23 | 1:b300d052d549 | 235 | {0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0} |
avi23 | 1:b300d052d549 | 236 | }; |
avi23 | 1:b300d052d549 | 237 | |
avi23 | 1:b300d052d549 | 238 | const bool large_invader_bitmap_2[6][12] = { |
avi23 | 1:b300d052d549 | 239 | {0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0}, |
avi23 | 1:b300d052d549 | 240 | {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0}, |
avi23 | 1:b300d052d549 | 241 | {1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 242 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, |
avi23 | 1:b300d052d549 | 243 | {0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0}, |
avi23 | 1:b300d052d549 | 244 | {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1} |
avi23 | 1:b300d052d549 | 245 | }; |
avi23 | 1:b300d052d549 | 246 | |
avi23 | 1:b300d052d549 | 247 | //int row_no = 6; |
avi23 | 1:b300d052d549 | 248 | //int col_no = 12; |
avi23 | 0:427469992efe | 249 | |
avi23 | 0:427469992efe | 250 | //ISR Flags |
avi23 | 0:427469992efe | 251 | volatile bool g_move_ship_flag = true; |
avi23 | 0:427469992efe | 252 | volatile bool g_move_enemies_flag = true; |
avi23 | 0:427469992efe | 253 | |
avi23 | 0:427469992efe | 254 | // function prototypes |
avi23 | 0:427469992efe | 255 | // error function hangs flashing an LED |
avi23 | 0:427469992efe | 256 | void error(); |
avi23 | 0:427469992efe | 257 | // setup serial port |
avi23 | 0:427469992efe | 258 | void init_serial(); |
avi23 | 0:427469992efe | 259 | // set-up the on-board LEDs and switches |
avi23 | 0:427469992efe | 260 | void init_K64F(); |
avi23 | 0:427469992efe | 261 | // Added functions |
avi23 | 0:427469992efe | 262 | void MoveShip(); |
avi23 | 0:427469992efe | 263 | void InitSmallInvaders(); |
avi23 | 0:427469992efe | 264 | void DrawSmallInvaders(); |
avi23 | 1:b300d052d549 | 265 | void InitMediumInvaders(); |
avi23 | 1:b300d052d549 | 266 | void DrawMediumInvaders(); |
avi23 | 1:b300d052d549 | 267 | void InitLargeInvaders(); |
avi23 | 1:b300d052d549 | 268 | void DrawLargeInvaders(); |
avi23 | 0:427469992efe | 269 | //ISR's |
avi23 | 0:427469992efe | 270 | void move_ship_isr(); |
avi23 | 0:427469992efe | 271 | void move_enemies_isr(); |
avi23 | 0:427469992efe | 272 | |
avi23 | 0:427469992efe | 273 | |
avi23 | 0:427469992efe | 274 | |
avi23 | 0:427469992efe | 275 | int main() |
avi23 | 0:427469992efe | 276 | { |
avi23 | 0:427469992efe | 277 | //Initalises the board and perhiperals |
avi23 | 0:427469992efe | 278 | init_K64F(); |
avi23 | 0:427469992efe | 279 | init_serial(); |
avi23 | 0:427469992efe | 280 | lcd.init(); |
avi23 | 0:427469992efe | 281 | lcd.clear(); |
avi23 | 0:427469992efe | 282 | |
avi23 | 1:b300d052d549 | 283 | move_cannon.attach(&move_ship_isr, 0.1); |
avi23 | 0:427469992efe | 284 | move_enemies.attach(&move_enemies_isr, 1); |
avi23 | 0:427469992efe | 285 | |
avi23 | 0:427469992efe | 286 | InitSmallInvaders(); |
avi23 | 1:b300d052d549 | 287 | InitMediumInvaders(); |
avi23 | 1:b300d052d549 | 288 | InitLargeInvaders(); |
avi23 | 1:b300d052d549 | 289 | |
avi23 | 1:b300d052d549 | 290 | int col = 0; |
avi23 | 1:b300d052d549 | 291 | int row = 0; |
avi23 | 1:b300d052d549 | 292 | |
avi23 | 1:b300d052d549 | 293 | for (int i = 0; i < no_of_large_invaders; i++) { |
avi23 | 1:b300d052d549 | 294 | if (i == 0) { |
avi23 | 1:b300d052d549 | 295 | for (col = 0; col < 12; col++) { |
avi23 | 1:b300d052d549 | 296 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 297 | if(large_invader_bitmap_1[row][col]) { |
avi23 | 1:b300d052d549 | 298 | lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 299 | } |
avi23 | 1:b300d052d549 | 300 | } |
avi23 | 1:b300d052d549 | 301 | } |
avi23 | 1:b300d052d549 | 302 | } else { |
avi23 | 1:b300d052d549 | 303 | for (col = 0; col < 12; col++) { |
avi23 | 1:b300d052d549 | 304 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 305 | if(large_invader_bitmap_2[row][col]) { |
avi23 | 1:b300d052d549 | 306 | lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 307 | } |
avi23 | 1:b300d052d549 | 308 | } |
avi23 | 1:b300d052d549 | 309 | } |
avi23 | 1:b300d052d549 | 310 | } |
avi23 | 1:b300d052d549 | 311 | } |
avi23 | 0:427469992efe | 312 | |
avi23 | 0:427469992efe | 313 | lcd.refresh(); |
avi23 | 0:427469992efe | 314 | |
avi23 | 0:427469992efe | 315 | while (true) { |
avi23 | 1:b300d052d549 | 316 | |
avi23 | 0:427469992efe | 317 | if (g_move_ship_flag) { |
avi23 | 0:427469992efe | 318 | g_move_ship_flag = false; |
avi23 | 0:427469992efe | 319 | |
avi23 | 0:427469992efe | 320 | MoveShip(); |
avi23 | 0:427469992efe | 321 | |
avi23 | 0:427469992efe | 322 | lcd.refresh(); |
avi23 | 0:427469992efe | 323 | } |
avi23 | 0:427469992efe | 324 | |
avi23 | 0:427469992efe | 325 | if (g_move_enemies_flag) { |
avi23 | 0:427469992efe | 326 | g_move_enemies_flag = false; |
avi23 | 0:427469992efe | 327 | |
avi23 | 0:427469992efe | 328 | DrawSmallInvaders(); |
avi23 | 1:b300d052d549 | 329 | DrawMediumInvaders(); |
avi23 | 1:b300d052d549 | 330 | DrawLargeInvaders(); |
avi23 | 1:b300d052d549 | 331 | |
avi23 | 1:b300d052d549 | 332 | enemies_in_state2 = !enemies_in_state2; |
avi23 | 0:427469992efe | 333 | |
avi23 | 0:427469992efe | 334 | lcd.refresh(); |
avi23 | 0:427469992efe | 335 | } |
avi23 | 1:b300d052d549 | 336 | |
avi23 | 0:427469992efe | 337 | sleep(); |
avi23 | 0:427469992efe | 338 | } |
avi23 | 0:427469992efe | 339 | } |
avi23 | 0:427469992efe | 340 | |
avi23 | 0:427469992efe | 341 | void init_K64F() |
avi23 | 0:427469992efe | 342 | { |
avi23 | 0:427469992efe | 343 | // on-board LEDs are active-low, so set pin high to turn them off. |
avi23 | 0:427469992efe | 344 | r_led = 1; |
avi23 | 0:427469992efe | 345 | g_led = 1; |
avi23 | 0:427469992efe | 346 | b_led = 1; |
avi23 | 0:427469992efe | 347 | |
avi23 | 0:427469992efe | 348 | // since the on-board switches have external pull-ups, we should disable the internal pull-down |
avi23 | 0:427469992efe | 349 | // resistors that are enabled by default using InterruptIn |
avi23 | 0:427469992efe | 350 | sw2.mode(PullNone); |
avi23 | 0:427469992efe | 351 | sw3.mode(PullNone); |
avi23 | 0:427469992efe | 352 | |
avi23 | 0:427469992efe | 353 | } |
avi23 | 0:427469992efe | 354 | |
avi23 | 0:427469992efe | 355 | void error() |
avi23 | 0:427469992efe | 356 | { |
avi23 | 0:427469992efe | 357 | while(1) { // if error, hang while flashing error message |
avi23 | 0:427469992efe | 358 | r_led = 0; |
avi23 | 0:427469992efe | 359 | wait(0.2); |
avi23 | 0:427469992efe | 360 | r_led = 1; |
avi23 | 0:427469992efe | 361 | wait(0.2); |
avi23 | 0:427469992efe | 362 | } |
avi23 | 0:427469992efe | 363 | } |
avi23 | 0:427469992efe | 364 | |
avi23 | 0:427469992efe | 365 | void init_serial() |
avi23 | 0:427469992efe | 366 | { |
avi23 | 0:427469992efe | 367 | // set to highest baud - ensure terminal software matches |
avi23 | 0:427469992efe | 368 | pc.baud(115200); |
avi23 | 0:427469992efe | 369 | } |
avi23 | 0:427469992efe | 370 | |
avi23 | 0:427469992efe | 371 | void move_ship_isr() |
avi23 | 0:427469992efe | 372 | { |
avi23 | 0:427469992efe | 373 | g_move_ship_flag = true; |
avi23 | 0:427469992efe | 374 | } |
avi23 | 0:427469992efe | 375 | |
avi23 | 0:427469992efe | 376 | void MoveShip() |
avi23 | 0:427469992efe | 377 | { |
avi23 | 0:427469992efe | 378 | //Clears the ship |
avi23 | 0:427469992efe | 379 | for (int col = 0; col < 9; col++) { |
avi23 | 0:427469992efe | 380 | for (int row = 0; row < 5; row++) { |
avi23 | 1:b300d052d549 | 381 | if(cannon_bitmap[row][col]) { |
avi23 | 1:b300d052d549 | 382 | lcd.clearPixel(cannon_xpos+col, cannon_ypos+row); |
avi23 | 0:427469992efe | 383 | } |
avi23 | 0:427469992efe | 384 | } |
avi23 | 0:427469992efe | 385 | } |
avi23 | 0:427469992efe | 386 | |
avi23 | 0:427469992efe | 387 | //Changes the position of the ship when the joystick is moved, capping at 0 and 75 so it always fits on the screen |
avi23 | 0:427469992efe | 388 | if (joystick.GetXValue() < 0.25f) { |
avi23 | 1:b300d052d549 | 389 | cannon_xpos--; |
avi23 | 1:b300d052d549 | 390 | if (cannon_xpos < 0) { |
avi23 | 1:b300d052d549 | 391 | cannon_xpos = 0; |
avi23 | 0:427469992efe | 392 | } |
avi23 | 0:427469992efe | 393 | } else if (joystick.GetXValue() > 0.75f) { |
avi23 | 1:b300d052d549 | 394 | cannon_xpos++; |
avi23 | 1:b300d052d549 | 395 | if (cannon_xpos > 75) { |
avi23 | 1:b300d052d549 | 396 | cannon_xpos = 75; |
avi23 | 0:427469992efe | 397 | } |
avi23 | 0:427469992efe | 398 | } |
avi23 | 0:427469992efe | 399 | |
avi23 | 0:427469992efe | 400 | //Redraws the ship |
avi23 | 0:427469992efe | 401 | for (int col = 0; col < 9; col++) { |
avi23 | 0:427469992efe | 402 | for (int row = 0; row < 5; row++) { |
avi23 | 1:b300d052d549 | 403 | if(cannon_bitmap[row][col]) { |
avi23 | 1:b300d052d549 | 404 | lcd.setPixel(cannon_xpos+col, cannon_ypos+row); |
avi23 | 0:427469992efe | 405 | } |
avi23 | 0:427469992efe | 406 | } |
avi23 | 0:427469992efe | 407 | } |
avi23 | 0:427469992efe | 408 | } |
avi23 | 0:427469992efe | 409 | |
avi23 | 0:427469992efe | 410 | void move_enemies_isr() |
avi23 | 0:427469992efe | 411 | { |
avi23 | 0:427469992efe | 412 | g_move_enemies_flag = true; |
avi23 | 0:427469992efe | 413 | } |
avi23 | 0:427469992efe | 414 | |
avi23 | 0:427469992efe | 415 | //Sets the position and aliveness of the small invaders |
avi23 | 0:427469992efe | 416 | void InitSmallInvaders() |
avi23 | 0:427469992efe | 417 | { |
avi23 | 0:427469992efe | 418 | for (int i = 0; i < no_of_small_invaders; i++) { |
avi23 | 1:b300d052d549 | 419 | small_invader[i].x_pos = 2+ (i*13); |
avi23 | 0:427469992efe | 420 | small_invader[i].y_pos = 7; |
avi23 | 0:427469992efe | 421 | small_invader[i].is_alive = true; |
avi23 | 0:427469992efe | 422 | } |
avi23 | 0:427469992efe | 423 | } |
avi23 | 0:427469992efe | 424 | |
avi23 | 0:427469992efe | 425 | void DrawSmallInvaders() |
avi23 | 0:427469992efe | 426 | { |
avi23 | 0:427469992efe | 427 | //For each small invader clear and redraws them if they're alive |
avi23 | 0:427469992efe | 428 | for (int i = 0; i < no_of_small_invaders; i++) { |
avi23 | 0:427469992efe | 429 | //Clears the enemy position |
avi23 | 0:427469992efe | 430 | lcd.drawRect(small_invader[i].x_pos, small_invader[i].y_pos, 8, 6, 2); |
avi23 | 0:427469992efe | 431 | |
avi23 | 0:427469992efe | 432 | //Checks if the invader is alive |
avi23 | 0:427469992efe | 433 | if (small_invader[i].is_alive) { |
avi23 | 0:427469992efe | 434 | //Reads off the bitmap and sets the allowed pixels |
avi23 | 0:427469992efe | 435 | int col = 0; |
avi23 | 0:427469992efe | 436 | int row = 0; |
avi23 | 0:427469992efe | 437 | //Flips the bitmap everytime the function is called |
avi23 | 1:b300d052d549 | 438 | if (enemies_in_state2) { |
avi23 | 1:b300d052d549 | 439 | for (col = 0; col < 8; col++) { |
avi23 | 1:b300d052d549 | 440 | for (row = 0; row < 6; row++) { |
avi23 | 0:427469992efe | 441 | if(small_invader_bitmap_1[row][col]) { |
avi23 | 0:427469992efe | 442 | lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row); |
avi23 | 0:427469992efe | 443 | } |
avi23 | 0:427469992efe | 444 | } |
avi23 | 0:427469992efe | 445 | } |
avi23 | 0:427469992efe | 446 | } else { |
avi23 | 1:b300d052d549 | 447 | for (col = 0; col < 8; col++) { |
avi23 | 1:b300d052d549 | 448 | for (row = 0; row < 6; row++) { |
avi23 | 0:427469992efe | 449 | if(small_invader_bitmap_2[row][col]) { |
avi23 | 0:427469992efe | 450 | lcd.setPixel(small_invader[i].x_pos + col, small_invader[i].y_pos + row); |
avi23 | 0:427469992efe | 451 | } |
avi23 | 0:427469992efe | 452 | } |
avi23 | 0:427469992efe | 453 | } |
avi23 | 0:427469992efe | 454 | } |
avi23 | 0:427469992efe | 455 | } |
avi23 | 0:427469992efe | 456 | } |
avi23 | 1:b300d052d549 | 457 | } |
avi23 | 1:b300d052d549 | 458 | |
avi23 | 1:b300d052d549 | 459 | //Sets the position and aliveness of the medium invaders |
avi23 | 1:b300d052d549 | 460 | void InitMediumInvaders() |
avi23 | 1:b300d052d549 | 461 | { |
avi23 | 1:b300d052d549 | 462 | for (int i = 0; i < no_of_medium_invaders; i++) { |
avi23 | 1:b300d052d549 | 463 | medium_invader[i].x_pos = 1 + (i*13); |
avi23 | 1:b300d052d549 | 464 | medium_invader[i].y_pos = 15; |
avi23 | 1:b300d052d549 | 465 | medium_invader[i].is_alive = true; |
avi23 | 1:b300d052d549 | 466 | } |
avi23 | 1:b300d052d549 | 467 | } |
avi23 | 1:b300d052d549 | 468 | |
avi23 | 1:b300d052d549 | 469 | void DrawMediumInvaders() |
avi23 | 1:b300d052d549 | 470 | { |
avi23 | 1:b300d052d549 | 471 | //For each small invader clear and redraws them if they're alive |
avi23 | 1:b300d052d549 | 472 | for (int i = 0; i < no_of_medium_invaders; i++) { |
avi23 | 1:b300d052d549 | 473 | //Clears the enemy position |
avi23 | 1:b300d052d549 | 474 | lcd.drawRect(medium_invader[i].x_pos, medium_invader[i].y_pos, 10, 6, 2); |
avi23 | 1:b300d052d549 | 475 | |
avi23 | 1:b300d052d549 | 476 | //Checks if the invader is alive |
avi23 | 1:b300d052d549 | 477 | if (medium_invader[i].is_alive) { |
avi23 | 1:b300d052d549 | 478 | //Reads off the bitmap and sets the allowed pixels |
avi23 | 1:b300d052d549 | 479 | int col = 0; |
avi23 | 1:b300d052d549 | 480 | int row = 0; |
avi23 | 1:b300d052d549 | 481 | //Flips the bitmap everytime the function is called |
avi23 | 1:b300d052d549 | 482 | if (enemies_in_state2) { |
avi23 | 1:b300d052d549 | 483 | for (col = 0; col < 10; col++) { |
avi23 | 1:b300d052d549 | 484 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 485 | if(medium_invader_bitmap_1[row][col]) { |
avi23 | 1:b300d052d549 | 486 | lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 487 | } |
avi23 | 1:b300d052d549 | 488 | } |
avi23 | 1:b300d052d549 | 489 | } |
avi23 | 1:b300d052d549 | 490 | } else { |
avi23 | 1:b300d052d549 | 491 | for (col = 0; col < 10; col++) { |
avi23 | 1:b300d052d549 | 492 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 493 | if(medium_invader_bitmap_2[row][col]) { |
avi23 | 1:b300d052d549 | 494 | lcd.setPixel(medium_invader[i].x_pos + col, medium_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 495 | } |
avi23 | 1:b300d052d549 | 496 | } |
avi23 | 1:b300d052d549 | 497 | } |
avi23 | 1:b300d052d549 | 498 | } |
avi23 | 1:b300d052d549 | 499 | } |
avi23 | 1:b300d052d549 | 500 | } |
avi23 | 1:b300d052d549 | 501 | } |
avi23 | 1:b300d052d549 | 502 | |
avi23 | 1:b300d052d549 | 503 | //Sets the position and aliveness of the large invaders |
avi23 | 1:b300d052d549 | 504 | void InitLargeInvaders() |
avi23 | 1:b300d052d549 | 505 | { |
avi23 | 1:b300d052d549 | 506 | for (int i = 0; i < no_of_large_invaders; i++) { |
avi23 | 1:b300d052d549 | 507 | large_invader[i].x_pos = 0 + (i*13); |
avi23 | 1:b300d052d549 | 508 | large_invader[i].y_pos = 23; |
avi23 | 1:b300d052d549 | 509 | large_invader[i].is_alive = true; |
avi23 | 1:b300d052d549 | 510 | } |
avi23 | 1:b300d052d549 | 511 | } |
avi23 | 1:b300d052d549 | 512 | |
avi23 | 1:b300d052d549 | 513 | void DrawLargeInvaders() |
avi23 | 1:b300d052d549 | 514 | { |
avi23 | 1:b300d052d549 | 515 | //For each small invader clear and redraws them if they're alive |
avi23 | 1:b300d052d549 | 516 | for (int i = 0; i < no_of_large_invaders; i++) { |
avi23 | 1:b300d052d549 | 517 | //Clears the enemy position |
avi23 | 1:b300d052d549 | 518 | lcd.drawRect(large_invader[i].x_pos, large_invader[i].y_pos, 12, 6, 2); |
avi23 | 1:b300d052d549 | 519 | |
avi23 | 1:b300d052d549 | 520 | //Checks if the invader is alive |
avi23 | 1:b300d052d549 | 521 | if (large_invader[i].is_alive) { |
avi23 | 1:b300d052d549 | 522 | //Reads off the bitmap and sets the allowed pixels |
avi23 | 1:b300d052d549 | 523 | int col = 0; |
avi23 | 1:b300d052d549 | 524 | int row = 0; |
avi23 | 1:b300d052d549 | 525 | //Flips the bitmap everytime the function is called |
avi23 | 1:b300d052d549 | 526 | if (enemies_in_state2) { |
avi23 | 1:b300d052d549 | 527 | for (col = 0; col < 12; col++) { |
avi23 | 1:b300d052d549 | 528 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 529 | if(large_invader_bitmap_1[row][col]) { |
avi23 | 1:b300d052d549 | 530 | lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 531 | } |
avi23 | 1:b300d052d549 | 532 | } |
avi23 | 1:b300d052d549 | 533 | } |
avi23 | 1:b300d052d549 | 534 | } else { |
avi23 | 1:b300d052d549 | 535 | for (col = 0; col < 12; col++) { |
avi23 | 1:b300d052d549 | 536 | for (row = 0; row < 6; row++) { |
avi23 | 1:b300d052d549 | 537 | if(large_invader_bitmap_2[row][col]) { |
avi23 | 1:b300d052d549 | 538 | lcd.setPixel(large_invader[i].x_pos + col, large_invader[i].y_pos + row); |
avi23 | 1:b300d052d549 | 539 | } |
avi23 | 1:b300d052d549 | 540 | } |
avi23 | 1:b300d052d549 | 541 | } |
avi23 | 1:b300d052d549 | 542 | } |
avi23 | 1:b300d052d549 | 543 | } |
avi23 | 1:b300d052d549 | 544 | } |
avi23 | 0:427469992efe | 545 | } |