George Sykes ELEC2645 project

Dependencies:   mbed

https://os.mbed.com/media/uploads/el18gs/pixil-frame-0.png

GHOST HUNTER

In a world of ghostly horrors there is much money to be made in underground ghost fighting rings. You've managed to get hold of a Ghostbuster, a special piece of equipment that allows you to catch, train and fight ghosts.

Instructions

Below you will find the instructions for the game. Please note that due to COVID-19 a large part of the game (fighting ghosts) could not be added as it would have required access to a second gamepad which i could not acquire.

Welcome screen

When first started you will be presented with a welcome screen

  • Pot 1 to adjust the contrast on the screen
  • Press A to continue.

Main menu

You have three options, catch ghosts (add ghosts to your inventory), inventory (sell ghosts) or settings(adjust the games settings).

  • Press X and B to move the selection up and down respectively
  • Press A to enter the selected submenu

Catch Ghost

Will now be presented with two challenges. In the first you need to find a ghost, in the second you catch it. Theses stages will start automatically.

Find ghost

Rotate the gamepad on its roll and pitch axis until all the LED's turn on. The ones on the left indicate roll and the right pitch.

  • Rotate the gamepad on it roll and pitch to light up the LED's

Catch ghost

Return the gamepad to a comfortable position and use the joystick to move the crosshairs onto the ghost sprite. When ready press the A button to catch the ghost. You will be told what kind of ghost you have captured and it will be added to your inventory.

  • Press A to catch the ghost
  • Move the joystick to move the crosshairs

Inventory

The inventory allows you to view your ghosts and sell them.

  • Use Pot 1 to scroll through the ghosts
  • Pot 2 to scroll up and down the details of the individual ghosts
  • Press X to prepare to sell a ghost and press again to confirm, if you don't press again the sale screen will disappear after 5 seconds
  • Press Start to return to the main menu

Settings

This menu allows you to adjust some of the settings of the game.

  • Press X to go up one option
  • Press B to go down one option
  • Press A to enter the selected submenu
  • Press Start to return to the main menu

Contrast

Set the contrast of the LCD screen, the contrast will adjust on this screen so you can see the effect (contrast is bounded between 0.4 and 0.6).

  • Pot 1 to increase or decrease the contrast
  • Press A to set the contrast

Button Delay

Set the minimum time between button presses; if this is too low the game will detect two button presses when there was only one, too high and the buttons will seem unresponsive. So as to ensure these issues do not occur while changing the setting button X temporarily operates on the new delay but none of the others will until A is pressed.

  • Pot 1 to increase or decrease the delay
  • Press X to test the new delay, this will toggle the small circle to be filled in or unfilled
  • Press A to save the setting
Committer:
el18gs
Date:
Fri Mar 06 19:27:12 2020 +0000
Revision:
2:eaf245af2aae
Parent:
1:8d14be858ca0
Child:
3:9d811414d35e
Initial Commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
el18gs 2:eaf245af2aae 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
el18gs 1:8d14be858ca0 7 Name: George Sykes
el18gs 1:8d14be858ca0 8 Username: el18gs
el18gs 1:8d14be858ca0 9 Student ID Number: 201235346
el18gs 1:8d14be858ca0 10 Date: 08/02/2020
eencae 0:b7f1f47bb26a 11 */
eencae 0:b7f1f47bb26a 12
eencae 0:b7f1f47bb26a 13 // includes
eencae 0:b7f1f47bb26a 14 #include "mbed.h"
eencae 0:b7f1f47bb26a 15 #include "Gamepad.h"
eencae 0:b7f1f47bb26a 16 #include "N5110.h"
el18gs 2:eaf245af2aae 17 #include "SDFileSystem.h"
el18gs 2:eaf245af2aae 18 #include "FX0S8700CQ.h"
el18gs 2:eaf245af2aae 19 #include "Ghost.h"
el18gs 2:eaf245af2aae 20 #include <vector>
el18gs 2:eaf245af2aae 21 #include <string>
eencae 0:b7f1f47bb26a 22
el18gs 2:eaf245af2aae 23 // Declare the string vector type
el18gs 2:eaf245af2aae 24 typedef std::vector<std::string> stringvec;
eencae 0:b7f1f47bb26a 25
eencae 0:b7f1f47bb26a 26 // objects
eencae 0:b7f1f47bb26a 27 Gamepad pad;
eencae 0:b7f1f47bb26a 28 N5110 lcd;
el18gs 2:eaf245af2aae 29 FX0S8700CQ accel;
el18gs 2:eaf245af2aae 30
el18gs 2:eaf245af2aae 31 // Connections to SD card holder on K64F (SPI interface)
el18gs 2:eaf245af2aae 32 //SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 33
el18gs 2:eaf245af2aae 34 // Declare all the inputs
el18gs 2:eaf245af2aae 35 AnalogIn contrast(PTB2);
el18gs 2:eaf245af2aae 36 InterruptIn buttonX(PTC5);
el18gs 2:eaf245af2aae 37 InterruptIn buttonA(PTC7);
el18gs 2:eaf245af2aae 38 InterruptIn buttonB(PTC9);
el18gs 2:eaf245af2aae 39
el18gs 2:eaf245af2aae 40 // Declare output
el18gs 2:eaf245af2aae 41 // RED, YELLOW, GREEN
el18gs 2:eaf245af2aae 42 BusOut left_LED(PTC3,PTC2,PTA2);
el18gs 2:eaf245af2aae 43 BusOut right_LED(PTC11,PTC10,PTA1);
el18gs 2:eaf245af2aae 44
el18gs 2:eaf245af2aae 45 // Function prototypes
el18gs 2:eaf245af2aae 46 void welcome();
el18gs 2:eaf245af2aae 47 int game_menu();
el18gs 2:eaf245af2aae 48 void catch_ghosts();
el18gs 2:eaf245af2aae 49 void inventory();
el18gs 2:eaf245af2aae 50 void settings();
el18gs 2:eaf245af2aae 51 int** import_sprite(std::string file);
el18gs 2:eaf245af2aae 52 void int_to_bin_digit(unsigned int in, int count, int* out);
el18gs 2:eaf245af2aae 53 void listdir(void);
el18gs 2:eaf245af2aae 54 float cursor_transform(int OldMax,
el18gs 2:eaf245af2aae 55 int OldMin,
el18gs 2:eaf245af2aae 56 int NewMax,
el18gs 2:eaf245af2aae 57 int NewMin,
el18gs 2:eaf245af2aae 58 float OldValue);
el18gs 2:eaf245af2aae 59
el18gs 2:eaf245af2aae 60 // ISR functions
el18gs 2:eaf245af2aae 61 void buttonX_isr();
el18gs 2:eaf245af2aae 62 void buttonA_isr();
el18gs 2:eaf245af2aae 63 void buttonB_isr();
el18gs 2:eaf245af2aae 64
el18gs 2:eaf245af2aae 65 // ISR flags
el18gs 2:eaf245af2aae 66 volatile int g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 67 volatile int g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 68 volatile int g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 69
el18gs 2:eaf245af2aae 70 // struct for state
el18gs 2:eaf245af2aae 71 struct State {
el18gs 2:eaf245af2aae 72 int output; // output value
el18gs 2:eaf245af2aae 73 int nextState[2]; // array of next states
el18gs 2:eaf245af2aae 74 };
eencae 0:b7f1f47bb26a 75
eencae 0:b7f1f47bb26a 76 int main()
eencae 0:b7f1f47bb26a 77 {
el18gs 2:eaf245af2aae 78 printf("Main function\n");
el18gs 2:eaf245af2aae 79 srand(time(NULL));
el18gs 2:eaf245af2aae 80 buttonX.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 81 buttonX.fall(&buttonX_isr);
el18gs 2:eaf245af2aae 82
el18gs 2:eaf245af2aae 83 buttonA.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 84 buttonA.fall(&buttonA_isr);
el18gs 2:eaf245af2aae 85
el18gs 2:eaf245af2aae 86 buttonB.mode(PullUp); // turn on internal pull-up resistor
el18gs 2:eaf245af2aae 87 buttonB.fall(&buttonB_isr);
el18gs 2:eaf245af2aae 88
el18gs 2:eaf245af2aae 89 /* Initialise the game
el18gs 2:eaf245af2aae 90 * Create an object to hold the players ghosts in
el18gs 2:eaf245af2aae 91 * Print the welcome message on the screen and wait for the player
el18gs 2:eaf245af2aae 92 */
el18gs 2:eaf245af2aae 93
el18gs 2:eaf245af2aae 94 lcd.init(); // Initialise the screen
el18gs 2:eaf245af2aae 95 lcd.clear(); // Clear all pixels
el18gs 2:eaf245af2aae 96 lcd.setContrast(contrast.read());
el18gs 2:eaf245af2aae 97 lcd.backLightOn();
el18gs 2:eaf245af2aae 98
el18gs 2:eaf245af2aae 99 welcome();
el18gs 2:eaf245af2aae 100 int choice = -1;
el18gs 2:eaf245af2aae 101 while(1) {
el18gs 2:eaf245af2aae 102 choice = game_menu();
el18gs 2:eaf245af2aae 103 switch (choice) {
el18gs 2:eaf245af2aae 104 case 0:
el18gs 2:eaf245af2aae 105 catch_ghosts();
el18gs 2:eaf245af2aae 106 break;
el18gs 2:eaf245af2aae 107 case 1:
el18gs 2:eaf245af2aae 108 inventory();
el18gs 2:eaf245af2aae 109 break;
el18gs 2:eaf245af2aae 110 case 2:
el18gs 2:eaf245af2aae 111 settings();
el18gs 2:eaf245af2aae 112 break;
el18gs 2:eaf245af2aae 113 }
el18gs 2:eaf245af2aae 114 }
el18gs 2:eaf245af2aae 115
el18gs 2:eaf245af2aae 116 }
el18gs 2:eaf245af2aae 117
el18gs 2:eaf245af2aae 118 void welcome()
el18gs 2:eaf245af2aae 119 {
el18gs 2:eaf245af2aae 120 printf("entered welcome screen\n");
el18gs 2:eaf245af2aae 121 int** welcome = import_sprite("/sd/assets/welcome.sprite");
el18gs 2:eaf245af2aae 122
el18gs 2:eaf245af2aae 123 while(!g_buttonA_flag) {
el18gs 2:eaf245af2aae 124 lcd.clear();
el18gs 2:eaf245af2aae 125 lcd.refresh();
el18gs 2:eaf245af2aae 126 for(int i = 0; i < 48; i++) {
el18gs 2:eaf245af2aae 127 for(int j = 0; j < 84; j++) {
el18gs 2:eaf245af2aae 128 lcd.setPixel(j,i, welcome[i][j]);
el18gs 2:eaf245af2aae 129 }
el18gs 2:eaf245af2aae 130 }
el18gs 2:eaf245af2aae 131
el18gs 2:eaf245af2aae 132 // contrast should be bounded between 4 and 6
el18gs 2:eaf245af2aae 133 // contrast = 0.4 + contrast.read()/5
el18gs 2:eaf245af2aae 134 lcd.setContrast(0.4 + ((double) contrast.read()/5));
el18gs 2:eaf245af2aae 135 lcd.refresh();
el18gs 2:eaf245af2aae 136 wait_ms(10);
el18gs 2:eaf245af2aae 137 }
el18gs 2:eaf245af2aae 138
el18gs 2:eaf245af2aae 139 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 140 wait_ms(25);
el18gs 2:eaf245af2aae 141 }
el18gs 2:eaf245af2aae 142
el18gs 2:eaf245af2aae 143
el18gs 2:eaf245af2aae 144 int game_menu()
el18gs 2:eaf245af2aae 145 {
el18gs 2:eaf245af2aae 146
el18gs 2:eaf245af2aae 147 State fsm[4] = {
el18gs 2:eaf245af2aae 148 // line next{up, down}
el18gs 2:eaf245af2aae 149 {0,{2,1}}, // State: 0
el18gs 2:eaf245af2aae 150 {2,{0,2}}, // State: 1
el18gs 2:eaf245af2aae 151 {4,{1,0}}, // State: 2
el18gs 2:eaf245af2aae 152 };
el18gs 2:eaf245af2aae 153
el18gs 2:eaf245af2aae 154 int current_state = 0;
el18gs 2:eaf245af2aae 155
el18gs 2:eaf245af2aae 156 printf("entered game menu\n");
el18gs 2:eaf245af2aae 157 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 158 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 159 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 160 lcd.clear();
el18gs 2:eaf245af2aae 161 lcd.refresh();
el18gs 2:eaf245af2aae 162 lcd.setContrast(0.4 + ((double) contrast.read()/5));
el18gs 2:eaf245af2aae 163
el18gs 2:eaf245af2aae 164 while(1) {
el18gs 2:eaf245af2aae 165 lcd.clear();
el18gs 2:eaf245af2aae 166 lcd.printString("Catch Ghosts",0,0);
el18gs 2:eaf245af2aae 167 lcd.printString("Inventory",0,2);
el18gs 2:eaf245af2aae 168 lcd.printString("Settings",0,4);
el18gs 2:eaf245af2aae 169
el18gs 2:eaf245af2aae 170 if(g_buttonA_flag) {
el18gs 2:eaf245af2aae 171 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 172 return current_state;
el18gs 2:eaf245af2aae 173 }
el18gs 2:eaf245af2aae 174
el18gs 2:eaf245af2aae 175 if(g_buttonX_flag) {
el18gs 2:eaf245af2aae 176 current_state = fsm[current_state].nextState[0];
el18gs 2:eaf245af2aae 177 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 178 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 179 } else if(g_buttonB_flag) {
el18gs 2:eaf245af2aae 180 current_state = fsm[current_state].nextState[1];
el18gs 2:eaf245af2aae 181 g_buttonX_flag = 0;
el18gs 2:eaf245af2aae 182 g_buttonB_flag = 0;
el18gs 2:eaf245af2aae 183 }
el18gs 2:eaf245af2aae 184
el18gs 2:eaf245af2aae 185 switch (fsm[current_state].output) {
el18gs 2:eaf245af2aae 186 case 0:
el18gs 2:eaf245af2aae 187 lcd.drawCircle(79, 3, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 188 break;
el18gs 2:eaf245af2aae 189 case 2:
el18gs 2:eaf245af2aae 190 lcd.drawCircle(79, 20, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 191 break;
el18gs 2:eaf245af2aae 192 case 4:
el18gs 2:eaf245af2aae 193 lcd.drawCircle(79, 35, 3, FILL_BLACK);
el18gs 2:eaf245af2aae 194 break;
el18gs 2:eaf245af2aae 195 }
el18gs 2:eaf245af2aae 196 lcd.refresh();
el18gs 2:eaf245af2aae 197 }
eencae 0:b7f1f47bb26a 198 }
eencae 0:b7f1f47bb26a 199
el18gs 2:eaf245af2aae 200 void catch_ghosts()
el18gs 2:eaf245af2aae 201 {
el18gs 2:eaf245af2aae 202
el18gs 2:eaf245af2aae 203 printf("catching ghosts\n");
el18gs 2:eaf245af2aae 204
el18gs 2:eaf245af2aae 205 float pitch = rand() % 46;
el18gs 2:eaf245af2aae 206 if(rand() & 1) {
el18gs 2:eaf245af2aae 207 pitch = pitch * -1;
el18gs 2:eaf245af2aae 208 }
el18gs 2:eaf245af2aae 209
el18gs 2:eaf245af2aae 210 float roll = rand() % 46;
el18gs 2:eaf245af2aae 211 if(rand() & 1) {
el18gs 2:eaf245af2aae 212 roll = roll * -1;
el18gs 2:eaf245af2aae 213 }
el18gs 2:eaf245af2aae 214
el18gs 2:eaf245af2aae 215 int count = 0;
el18gs 2:eaf245af2aae 216
el18gs 2:eaf245af2aae 217 lcd.clear();
el18gs 2:eaf245af2aae 218 lcd.printString("Align the",18,0);
el18gs 2:eaf245af2aae 219 lcd.printString("Gamepad until",4,1);
el18gs 2:eaf245af2aae 220 lcd.printString("all LEDs",20,2);
el18gs 2:eaf245af2aae 221 lcd.printString("turn on",22,3);
el18gs 2:eaf245af2aae 222 lcd.refresh();
el18gs 2:eaf245af2aae 223
el18gs 2:eaf245af2aae 224
el18gs 2:eaf245af2aae 225 while(1) {
el18gs 2:eaf245af2aae 226 accel.read_data();
el18gs 2:eaf245af2aae 227 bool focused = true;
el18gs 2:eaf245af2aae 228
el18gs 2:eaf245af2aae 229 if((double)accel.sensor.roll/roll > 0.75) {
el18gs 2:eaf245af2aae 230 left_LED = 0b000;
el18gs 2:eaf245af2aae 231 } else if ((double)accel.sensor.roll/roll > 0.3) {
el18gs 2:eaf245af2aae 232 focused = false;
el18gs 2:eaf245af2aae 233 left_LED = 0b001;
el18gs 2:eaf245af2aae 234 } else {
el18gs 2:eaf245af2aae 235 focused = false;
el18gs 2:eaf245af2aae 236 left_LED = 0b011;
el18gs 2:eaf245af2aae 237 }
el18gs 2:eaf245af2aae 238
el18gs 2:eaf245af2aae 239 if((double)accel.sensor.pitch/pitch > 0.75) {
el18gs 2:eaf245af2aae 240 right_LED = 0b000;
el18gs 2:eaf245af2aae 241 } else if ((double)accel.sensor.pitch/pitch > 0.3) {
el18gs 2:eaf245af2aae 242 focused = false;
el18gs 2:eaf245af2aae 243 right_LED = 0b001;
el18gs 2:eaf245af2aae 244 } else {
el18gs 2:eaf245af2aae 245 focused = false;
el18gs 2:eaf245af2aae 246 right_LED = 0b011;
el18gs 2:eaf245af2aae 247 }
el18gs 2:eaf245af2aae 248
el18gs 2:eaf245af2aae 249 if(focused) {
el18gs 2:eaf245af2aae 250 count++;
el18gs 2:eaf245af2aae 251 }
el18gs 2:eaf245af2aae 252
el18gs 2:eaf245af2aae 253 if(count > 500) {
el18gs 2:eaf245af2aae 254 break;
el18gs 2:eaf245af2aae 255 }
el18gs 2:eaf245af2aae 256 wait_ms(10);
el18gs 2:eaf245af2aae 257 }
el18gs 2:eaf245af2aae 258
el18gs 2:eaf245af2aae 259 Vector2D ideal = {rand() % 85,rand() % 49};
el18gs 2:eaf245af2aae 260
el18gs 2:eaf245af2aae 261 int** ghost = import_sprite("/sd/assets/ghost.sprite");
el18gs 2:eaf245af2aae 262
el18gs 2:eaf245af2aae 263 while(1) {
el18gs 2:eaf245af2aae 264
el18gs 2:eaf245af2aae 265 lcd.clear();
el18gs 2:eaf245af2aae 266
el18gs 2:eaf245af2aae 267 Vector2D actual = {cursor_transform(2, 0, 84, 0, pad.get_coord().x),
el18gs 2:eaf245af2aae 268 cursor_transform(2, 0, 48, 0, pad.get_coord().y * -1)
el18gs 2:eaf245af2aae 269 };
el18gs 2:eaf245af2aae 270
el18gs 2:eaf245af2aae 271 // x0 y0 x1 y1 type
el18gs 2:eaf245af2aae 272 lcd.drawLine(actual.x, 0, actual.x, 48, 2);
el18gs 2:eaf245af2aae 273 lcd.drawLine(0, actual.y, 84, actual.y, 2);
el18gs 2:eaf245af2aae 274
el18gs 2:eaf245af2aae 275 int col = 0;
el18gs 2:eaf245af2aae 276
el18gs 2:eaf245af2aae 277 for(int i = ideal.x - 8; i < ideal.x + 8; i++) { // Iterate Columns: x
el18gs 2:eaf245af2aae 278 int row = 0;
el18gs 2:eaf245af2aae 279 for(int j = ideal.y - 8; j < ideal.y + 9; j++) { // Iterate Rows: y
el18gs 2:eaf245af2aae 280 lcd.setPixel(i,j, ghost[row][col]);
el18gs 2:eaf245af2aae 281 row++;
el18gs 2:eaf245af2aae 282 }
el18gs 2:eaf245af2aae 283 col++;
el18gs 2:eaf245af2aae 284 }
el18gs 2:eaf245af2aae 285
el18gs 2:eaf245af2aae 286 if((double)actual.x/ideal.x > 0.75 && (double)actual.x/ideal.x < 1.25) {
el18gs 2:eaf245af2aae 287 if((double)actual.y/ideal.y < 0.75 && (double)actual.y/ideal.y < 1.25) {
el18gs 2:eaf245af2aae 288 lcd.printString("Press A!",0,0);
el18gs 2:eaf245af2aae 289 if(g_buttonA_flag) {
el18gs 2:eaf245af2aae 290 break;
el18gs 2:eaf245af2aae 291 }
el18gs 2:eaf245af2aae 292 }
el18gs 2:eaf245af2aae 293 }
el18gs 2:eaf245af2aae 294
el18gs 2:eaf245af2aae 295 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 296
el18gs 2:eaf245af2aae 297 lcd.refresh();
el18gs 2:eaf245af2aae 298
el18gs 2:eaf245af2aae 299 int x_move = 0;
el18gs 2:eaf245af2aae 300 int y_move = 0;
el18gs 2:eaf245af2aae 301
el18gs 2:eaf245af2aae 302 if(rand() & 1) {
el18gs 2:eaf245af2aae 303 x_move = 1;
el18gs 2:eaf245af2aae 304 } else {
el18gs 2:eaf245af2aae 305 x_move = -1;
el18gs 2:eaf245af2aae 306 }
el18gs 2:eaf245af2aae 307
el18gs 2:eaf245af2aae 308 if(rand() & 1) {
el18gs 2:eaf245af2aae 309 y_move = 1;
el18gs 2:eaf245af2aae 310 } else {
el18gs 2:eaf245af2aae 311 y_move = -1;
el18gs 2:eaf245af2aae 312 }
el18gs 2:eaf245af2aae 313
el18gs 2:eaf245af2aae 314 ideal.x = ideal.x + x_move;
el18gs 2:eaf245af2aae 315 ideal.y = ideal.y + y_move;
el18gs 2:eaf245af2aae 316
el18gs 2:eaf245af2aae 317 if(ideal.x > 83) {
el18gs 2:eaf245af2aae 318 ideal.x = 83;
el18gs 2:eaf245af2aae 319 } else if(ideal.x < 0) {
el18gs 2:eaf245af2aae 320 ideal.x = 0;
el18gs 2:eaf245af2aae 321 }
el18gs 2:eaf245af2aae 322
el18gs 2:eaf245af2aae 323 if(ideal.y > 42) {
el18gs 2:eaf245af2aae 324 ideal.y = 42;
el18gs 2:eaf245af2aae 325 } else if(ideal.y < 0) {
el18gs 2:eaf245af2aae 326 ideal.y = 0;
el18gs 2:eaf245af2aae 327 }
el18gs 2:eaf245af2aae 328
el18gs 2:eaf245af2aae 329
el18gs 2:eaf245af2aae 330 wait_ms(10);
el18gs 2:eaf245af2aae 331 }
el18gs 2:eaf245af2aae 332
el18gs 2:eaf245af2aae 333 printf("Ghost caught\n");
el18gs 2:eaf245af2aae 334
el18gs 2:eaf245af2aae 335 Ghost caught_ghost(rand()%100, "/ghosts/");
el18gs 2:eaf245af2aae 336 caught_ghost.save();
el18gs 2:eaf245af2aae 337
el18gs 2:eaf245af2aae 338 lcd.clear();
el18gs 2:eaf245af2aae 339 lcd.printString("You caught:", 0, 0);
el18gs 2:eaf245af2aae 340 lcd.printString(caught_ghost.get_type_string().c_str(), 0, 1);
el18gs 2:eaf245af2aae 341 lcd.refresh();
el18gs 2:eaf245af2aae 342
el18gs 2:eaf245af2aae 343 wait(2);
el18gs 2:eaf245af2aae 344
el18gs 2:eaf245af2aae 345 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 346
el18gs 2:eaf245af2aae 347 while(!g_buttonA_flag) {
el18gs 2:eaf245af2aae 348 wait_ms(10);
el18gs 2:eaf245af2aae 349 }
el18gs 2:eaf245af2aae 350
el18gs 2:eaf245af2aae 351 g_buttonA_flag = 0;
el18gs 2:eaf245af2aae 352
el18gs 2:eaf245af2aae 353 }
el18gs 2:eaf245af2aae 354
el18gs 2:eaf245af2aae 355 float cursor_transform(int OldMax,
el18gs 2:eaf245af2aae 356 int OldMin,
el18gs 2:eaf245af2aae 357 int NewMax,
el18gs 2:eaf245af2aae 358 int NewMin,
el18gs 2:eaf245af2aae 359 float OldValue)
el18gs 2:eaf245af2aae 360 {
el18gs 2:eaf245af2aae 361 float NewValue = -1;
el18gs 2:eaf245af2aae 362 int OldRange = (OldMax - OldMin);
el18gs 2:eaf245af2aae 363 if (OldRange == 0) {
el18gs 2:eaf245af2aae 364 NewValue = NewMin;
el18gs 2:eaf245af2aae 365 } else {
el18gs 2:eaf245af2aae 366 int NewRange = (NewMax - NewMin);
el18gs 2:eaf245af2aae 367 NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin;
el18gs 2:eaf245af2aae 368 }
el18gs 2:eaf245af2aae 369 return NewValue;
el18gs 2:eaf245af2aae 370 }
el18gs 2:eaf245af2aae 371
el18gs 2:eaf245af2aae 372 void inventory()
el18gs 2:eaf245af2aae 373 {
el18gs 2:eaf245af2aae 374 printf("viewing inventory\n");
el18gs 2:eaf245af2aae 375 lcd.printString("Inventory:", 0, 0);
el18gs 2:eaf245af2aae 376
el18gs 2:eaf245af2aae 377 }
el18gs 2:eaf245af2aae 378
el18gs 2:eaf245af2aae 379 void settings()
el18gs 2:eaf245af2aae 380 {
el18gs 2:eaf245af2aae 381 printf("adjusting settings\n");
el18gs 2:eaf245af2aae 382 }
el18gs 2:eaf245af2aae 383
el18gs 2:eaf245af2aae 384
el18gs 2:eaf245af2aae 385 int** import_sprite(std::string file)
el18gs 2:eaf245af2aae 386 {
el18gs 2:eaf245af2aae 387 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 388
el18gs 2:eaf245af2aae 389 FILE *fp; // this is our file pointer
el18gs 2:eaf245af2aae 390
el18gs 2:eaf245af2aae 391 // the previous example just read the values into variables and printed to
el18gs 2:eaf245af2aae 392 // serial, we'll now read files into an array.
el18gs 2:eaf245af2aae 393
el18gs 2:eaf245af2aae 394 // now open file for reading...note the 'r'
el18gs 2:eaf245af2aae 395 fp = fopen(file.c_str(), "r");
el18gs 2:eaf245af2aae 396
el18gs 2:eaf245af2aae 397
el18gs 2:eaf245af2aae 398 int n=0; // going to store the number of lines in the file
el18gs 2:eaf245af2aae 399 stringvec values;
el18gs 2:eaf245af2aae 400
el18gs 2:eaf245af2aae 401 if (fp == NULL) { // if it can't open the file then print error message
el18gs 2:eaf245af2aae 402 printf("Error! Unable to open file: %s\n", file.c_str());
el18gs 2:eaf245af2aae 403 listdir();
el18gs 2:eaf245af2aae 404 } else {
el18gs 2:eaf245af2aae 405 //Since we may not know the
el18gs 2:eaf245af2aae 406 // number of lines in the files ahead of time, we'll first count them
el18gs 2:eaf245af2aae 407 // * means scan but don't save
el18gs 2:eaf245af2aae 408 int max_len_tmp = 0;
el18gs 2:eaf245af2aae 409 int max_len = 0;
el18gs 2:eaf245af2aae 410
el18gs 2:eaf245af2aae 411 while (fscanf(fp, "%*i%n", &max_len_tmp) != EOF) {
el18gs 2:eaf245af2aae 412 n++; // increment counter when read a line
el18gs 2:eaf245af2aae 413 if(max_len_tmp > max_len) {
el18gs 2:eaf245af2aae 414 max_len = max_len_tmp;
el18gs 2:eaf245af2aae 415 }
el18gs 2:eaf245af2aae 416 }
el18gs 2:eaf245af2aae 417
el18gs 2:eaf245af2aae 418 max_len--;
el18gs 2:eaf245af2aae 419
el18gs 2:eaf245af2aae 420 rewind(fp); // 'scrolled' to end of file, so go back to beginning
el18gs 2:eaf245af2aae 421
el18gs 2:eaf245af2aae 422 char buffer[n][max_len];
el18gs 2:eaf245af2aae 423
el18gs 2:eaf245af2aae 424 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 425 fscanf(fp, "%s", &buffer[i][0]);
el18gs 2:eaf245af2aae 426 }
el18gs 2:eaf245af2aae 427
el18gs 2:eaf245af2aae 428 int** sprite = 0;
el18gs 2:eaf245af2aae 429 sprite = new int*[n];
el18gs 2:eaf245af2aae 430 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 431 sprite[i] = new int[max_len];
el18gs 2:eaf245af2aae 432 }
el18gs 2:eaf245af2aae 433
el18gs 2:eaf245af2aae 434 for(int i = 0; i < n; i++) {
el18gs 2:eaf245af2aae 435 //printf("%s\n", buffer[i]);
el18gs 2:eaf245af2aae 436 for(int j = 0; j < max_len; j++) {
el18gs 2:eaf245af2aae 437 if((int)buffer[i][j] == 48) {
el18gs 2:eaf245af2aae 438 sprite[i][j] = 0;
el18gs 2:eaf245af2aae 439 } else if((int) buffer[i][j] == 49) {
el18gs 2:eaf245af2aae 440 sprite[i][j] = 1;
el18gs 2:eaf245af2aae 441 }
el18gs 2:eaf245af2aae 442 }
el18gs 2:eaf245af2aae 443 }
el18gs 2:eaf245af2aae 444
el18gs 2:eaf245af2aae 445 fclose(fp); // ensure you close the file after reading
el18gs 2:eaf245af2aae 446
el18gs 2:eaf245af2aae 447 return sprite;
el18gs 2:eaf245af2aae 448
el18gs 2:eaf245af2aae 449 }
el18gs 2:eaf245af2aae 450
el18gs 2:eaf245af2aae 451 return 0;
el18gs 2:eaf245af2aae 452 }
el18gs 2:eaf245af2aae 453
el18gs 2:eaf245af2aae 454 void listdir(void)
el18gs 2:eaf245af2aae 455 {
el18gs 2:eaf245af2aae 456 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 457
el18gs 2:eaf245af2aae 458 DIR *d;
el18gs 2:eaf245af2aae 459 struct dirent *p;
el18gs 2:eaf245af2aae 460
el18gs 2:eaf245af2aae 461 d = opendir("/sd/assets");
el18gs 2:eaf245af2aae 462 if (d != NULL) {
el18gs 2:eaf245af2aae 463 while ((p = readdir(d)) != NULL) {
el18gs 2:eaf245af2aae 464 printf(" - %s\n", p->d_name);
el18gs 2:eaf245af2aae 465 }
el18gs 2:eaf245af2aae 466 } else {
el18gs 2:eaf245af2aae 467 printf("Could not open directory!\n");
el18gs 2:eaf245af2aae 468 }
el18gs 2:eaf245af2aae 469 closedir(d);
el18gs 2:eaf245af2aae 470 }
el18gs 2:eaf245af2aae 471
el18gs 2:eaf245af2aae 472 stringvec list_ghosts()
el18gs 2:eaf245af2aae 473 {
el18gs 2:eaf245af2aae 474 // Connections to SD card holder on K64F (SPI interface)
el18gs 2:eaf245af2aae 475 SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS
el18gs 2:eaf245af2aae 476 std::string path = "/sd/ghosts";
el18gs 2:eaf245af2aae 477 printf("Listing directory: %s\n", path.c_str());
el18gs 2:eaf245af2aae 478 DIR *d;
el18gs 2:eaf245af2aae 479 struct dirent *p;
el18gs 2:eaf245af2aae 480
el18gs 2:eaf245af2aae 481 stringvec files;
el18gs 2:eaf245af2aae 482
el18gs 2:eaf245af2aae 483 d = opendir(path.c_str());
el18gs 2:eaf245af2aae 484 if (d != NULL) {
el18gs 2:eaf245af2aae 485 while ((p = readdir(d)) != NULL) {
el18gs 2:eaf245af2aae 486 files.push_back(p->d_name);
el18gs 2:eaf245af2aae 487 }
el18gs 2:eaf245af2aae 488 } else {
el18gs 2:eaf245af2aae 489 printf("Could not open directory!\n");
el18gs 2:eaf245af2aae 490 }
el18gs 2:eaf245af2aae 491 closedir(d);
el18gs 2:eaf245af2aae 492
el18gs 2:eaf245af2aae 493 stringvec correct_files;
el18gs 2:eaf245af2aae 494
el18gs 2:eaf245af2aae 495 for(int i = 0; i < files.size(); i++) {
el18gs 2:eaf245af2aae 496 if(hasEnding(files[i], ".ghost")) {
el18gs 2:eaf245af2aae 497 correct_files.push_back(files[i]);
el18gs 2:eaf245af2aae 498 }
el18gs 2:eaf245af2aae 499 }
el18gs 2:eaf245af2aae 500
el18gs 2:eaf245af2aae 501 return correct_files;
el18gs 2:eaf245af2aae 502 }
el18gs 2:eaf245af2aae 503
el18gs 2:eaf245af2aae 504 void int_to_bin_digit(unsigned int in, int count, int* out)
el18gs 2:eaf245af2aae 505 {
el18gs 2:eaf245af2aae 506 /* assert: count <= sizeof(int)*CHAR_BIT */
el18gs 2:eaf245af2aae 507 unsigned int mask = 1U << (count-1);
el18gs 2:eaf245af2aae 508 int i;
el18gs 2:eaf245af2aae 509 for (i = 0; i < count; i++) {
el18gs 2:eaf245af2aae 510 out[i] = (in & mask) ? 1 : 0;
el18gs 2:eaf245af2aae 511 in <<= 1;
el18gs 2:eaf245af2aae 512 }
el18gs 2:eaf245af2aae 513 }
el18gs 2:eaf245af2aae 514
el18gs 2:eaf245af2aae 515 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 516 void buttonX_isr()
el18gs 2:eaf245af2aae 517 {
el18gs 2:eaf245af2aae 518 g_buttonX_flag = 1; // set flag in ISR
el18gs 2:eaf245af2aae 519 }
el18gs 2:eaf245af2aae 520
el18gs 2:eaf245af2aae 521 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 522 void buttonA_isr()
el18gs 2:eaf245af2aae 523 {
el18gs 2:eaf245af2aae 524 g_buttonA_flag = 1; // set flag in ISR
el18gs 2:eaf245af2aae 525 }
el18gs 2:eaf245af2aae 526
el18gs 2:eaf245af2aae 527 // Button A event-triggered interrupt
el18gs 2:eaf245af2aae 528 void buttonB_isr()
el18gs 2:eaf245af2aae 529 {
el18gs 2:eaf245af2aae 530 g_buttonB_flag = 1; // set flag in ISR
el18gs 2:eaf245af2aae 531 }