
George Sykes ELEC2645 project
Dependencies: mbed
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
main.cpp@8:4220d116f17c, 2020-05-11 (annotated)
- Committer:
- el18gs
- Date:
- Mon May 11 18:58:07 2020 +0000
- Revision:
- 8:4220d116f17c
- Parent:
- 4:2e8d7c6d2953
- Child:
- 11:e89dbdb74df5
Moved to passing the address of SDF file system to all functions.; Completed doccumenting Ghosts.h
Who changed what in which revision?
User | Revision | Line number | New 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 |
el18gs | 1:8d14be858ca0 | 6 | Name: George Sykes |
el18gs | 1:8d14be858ca0 | 7 | Username: el18gs |
el18gs | 1:8d14be858ca0 | 8 | Student ID Number: 201235346 |
el18gs | 1:8d14be858ca0 | 9 | Date: 08/02/2020 |
eencae | 0:b7f1f47bb26a | 10 | */ |
eencae | 0:b7f1f47bb26a | 11 | |
eencae | 0:b7f1f47bb26a | 12 | // includes |
eencae | 0:b7f1f47bb26a | 13 | #include "mbed.h" |
eencae | 0:b7f1f47bb26a | 14 | #include "Gamepad.h" |
eencae | 0:b7f1f47bb26a | 15 | #include "N5110.h" |
el18gs | 2:eaf245af2aae | 16 | #include "SDFileSystem.h" |
el18gs | 2:eaf245af2aae | 17 | #include "FX0S8700CQ.h" |
el18gs | 2:eaf245af2aae | 18 | #include "Ghost.h" |
el18gs | 3:9d811414d35e | 19 | #include "Inventory.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 | |
el18gs | 3:9d811414d35e | 26 | struct inven_state { |
el18gs | 3:9d811414d35e | 27 | // UID, next{up,down}, type, attack, defense, level, xp, value, hp_max, hp |
el18gs | 3:9d811414d35e | 28 | int uid; |
el18gs | 3:9d811414d35e | 29 | int next[2]; |
el18gs | 3:9d811414d35e | 30 | std::string type; |
el18gs | 3:9d811414d35e | 31 | std::string name; |
el18gs | 3:9d811414d35e | 32 | int attack; |
el18gs | 3:9d811414d35e | 33 | int defense; |
el18gs | 3:9d811414d35e | 34 | int level; |
el18gs | 3:9d811414d35e | 35 | int xp; |
el18gs | 3:9d811414d35e | 36 | int value; |
el18gs | 3:9d811414d35e | 37 | int hp_max; |
el18gs | 3:9d811414d35e | 38 | int hp; |
el18gs | 3:9d811414d35e | 39 | }; |
el18gs | 3:9d811414d35e | 40 | |
eencae | 0:b7f1f47bb26a | 41 | // objects |
eencae | 0:b7f1f47bb26a | 42 | Gamepad pad; |
eencae | 0:b7f1f47bb26a | 43 | N5110 lcd; |
el18gs | 2:eaf245af2aae | 44 | FX0S8700CQ accel; |
el18gs | 4:2e8d7c6d2953 | 45 | SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS |
el18gs | 2:eaf245af2aae | 46 | |
el18gs | 2:eaf245af2aae | 47 | // Declare all the inputs |
el18gs | 2:eaf245af2aae | 48 | InterruptIn buttonX(PTC5); |
el18gs | 2:eaf245af2aae | 49 | InterruptIn buttonA(PTC7); |
el18gs | 2:eaf245af2aae | 50 | InterruptIn buttonB(PTC9); |
el18gs | 3:9d811414d35e | 51 | InterruptIn buttonY(PTC0); |
el18gs | 3:9d811414d35e | 52 | InterruptIn buttonStart(PTC8); |
el18gs | 2:eaf245af2aae | 53 | |
el18gs | 2:eaf245af2aae | 54 | // Declare output |
el18gs | 2:eaf245af2aae | 55 | // RED, YELLOW, GREEN |
el18gs | 2:eaf245af2aae | 56 | BusOut left_LED(PTC3,PTC2,PTA2); |
el18gs | 2:eaf245af2aae | 57 | BusOut right_LED(PTC11,PTC10,PTA1); |
el18gs | 2:eaf245af2aae | 58 | |
el18gs | 2:eaf245af2aae | 59 | // Function prototypes |
el18gs | 2:eaf245af2aae | 60 | void welcome(); |
el18gs | 2:eaf245af2aae | 61 | int game_menu(); |
el18gs | 2:eaf245af2aae | 62 | void catch_ghosts(); |
el18gs | 8:4220d116f17c | 63 | void display_inventory(Inventory inventory, SDFileSystem &sd); |
el18gs | 3:9d811414d35e | 64 | std::vector<inven_state> gen_ghost_fsm(Inventory inventory); |
el18gs | 2:eaf245af2aae | 65 | void settings(); |
el18gs | 2:eaf245af2aae | 66 | int** import_sprite(std::string file); |
el18gs | 2:eaf245af2aae | 67 | void int_to_bin_digit(unsigned int in, int count, int* out); |
el18gs | 2:eaf245af2aae | 68 | void listdir(void); |
el18gs | 3:9d811414d35e | 69 | bool hasEnding (std::string const &fullString, std::string const &ending); |
el18gs | 3:9d811414d35e | 70 | float cursor_transform(float OldMax, |
el18gs | 3:9d811414d35e | 71 | float OldMin, |
el18gs | 3:9d811414d35e | 72 | float NewMax, |
el18gs | 3:9d811414d35e | 73 | float NewMin, |
el18gs | 2:eaf245af2aae | 74 | float OldValue); |
el18gs | 3:9d811414d35e | 75 | void adjustContrast(); |
el18gs | 3:9d811414d35e | 76 | void buttonDelay(); |
el18gs | 3:9d811414d35e | 77 | bool ghostHit( int xGhost, int yGhost, int xJoy, int yJoy); |
el18gs | 3:9d811414d35e | 78 | |
el18gs | 3:9d811414d35e | 79 | |
el18gs | 3:9d811414d35e | 80 | // Settings variables |
el18gs | 3:9d811414d35e | 81 | volatile int g_button_sesnsitivity = 250; |
el18gs | 3:9d811414d35e | 82 | volatile bool g_buttonTesting = false; |
el18gs | 3:9d811414d35e | 83 | volatile int g_buttonSensitivityTest = 250; |
el18gs | 3:9d811414d35e | 84 | |
el18gs | 2:eaf245af2aae | 85 | |
el18gs | 2:eaf245af2aae | 86 | // ISR functions |
el18gs | 2:eaf245af2aae | 87 | void buttonX_isr(); |
el18gs | 2:eaf245af2aae | 88 | void buttonA_isr(); |
el18gs | 2:eaf245af2aae | 89 | void buttonB_isr(); |
el18gs | 3:9d811414d35e | 90 | void buttonY_isr(); |
el18gs | 3:9d811414d35e | 91 | void buttonStart_isr(); |
el18gs | 2:eaf245af2aae | 92 | |
el18gs | 2:eaf245af2aae | 93 | // ISR flags |
el18gs | 2:eaf245af2aae | 94 | volatile int g_buttonX_flag = 0; |
el18gs | 2:eaf245af2aae | 95 | volatile int g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 96 | volatile int g_buttonB_flag = 0; |
el18gs | 3:9d811414d35e | 97 | volatile int g_buttonY_flag = 0; |
el18gs | 3:9d811414d35e | 98 | volatile int g_buttonStart_flag = 0; |
el18gs | 2:eaf245af2aae | 99 | |
el18gs | 2:eaf245af2aae | 100 | // struct for state |
el18gs | 2:eaf245af2aae | 101 | struct State { |
el18gs | 2:eaf245af2aae | 102 | int output; // output value |
el18gs | 2:eaf245af2aae | 103 | int nextState[2]; // array of next states |
el18gs | 2:eaf245af2aae | 104 | }; |
eencae | 0:b7f1f47bb26a | 105 | |
eencae | 0:b7f1f47bb26a | 106 | int main() |
eencae | 0:b7f1f47bb26a | 107 | { |
el18gs | 4:2e8d7c6d2953 | 108 | sd.mount(); |
el18gs | 2:eaf245af2aae | 109 | printf("Main function\n"); |
el18gs | 2:eaf245af2aae | 110 | srand(time(NULL)); |
el18gs | 2:eaf245af2aae | 111 | buttonX.mode(PullUp); // turn on internal pull-up resistor |
el18gs | 2:eaf245af2aae | 112 | buttonX.fall(&buttonX_isr); |
el18gs | 2:eaf245af2aae | 113 | |
el18gs | 2:eaf245af2aae | 114 | buttonA.mode(PullUp); // turn on internal pull-up resistor |
el18gs | 2:eaf245af2aae | 115 | buttonA.fall(&buttonA_isr); |
el18gs | 2:eaf245af2aae | 116 | |
el18gs | 2:eaf245af2aae | 117 | buttonB.mode(PullUp); // turn on internal pull-up resistor |
el18gs | 2:eaf245af2aae | 118 | buttonB.fall(&buttonB_isr); |
el18gs | 2:eaf245af2aae | 119 | |
el18gs | 3:9d811414d35e | 120 | buttonY.mode(PullUp); // turn on internal pull-up resistor |
el18gs | 3:9d811414d35e | 121 | buttonY.fall(&buttonY_isr); |
el18gs | 3:9d811414d35e | 122 | |
el18gs | 3:9d811414d35e | 123 | buttonStart.mode(PullUp); // turn on internal pull-up resistor |
el18gs | 3:9d811414d35e | 124 | buttonStart.fall(&buttonStart_isr); |
el18gs | 3:9d811414d35e | 125 | |
el18gs | 2:eaf245af2aae | 126 | /* Initialise the game |
el18gs | 2:eaf245af2aae | 127 | * Create an object to hold the players ghosts in |
el18gs | 2:eaf245af2aae | 128 | * Print the welcome message on the screen and wait for the player |
el18gs | 2:eaf245af2aae | 129 | */ |
el18gs | 2:eaf245af2aae | 130 | |
el18gs | 8:4220d116f17c | 131 | Inventory inventory(sd); |
el18gs | 3:9d811414d35e | 132 | |
el18gs | 2:eaf245af2aae | 133 | lcd.init(); // Initialise the screen |
el18gs | 2:eaf245af2aae | 134 | lcd.backLightOn(); |
el18gs | 2:eaf245af2aae | 135 | |
el18gs | 2:eaf245af2aae | 136 | welcome(); |
el18gs | 2:eaf245af2aae | 137 | int choice = -1; |
el18gs | 2:eaf245af2aae | 138 | while(1) { |
el18gs | 2:eaf245af2aae | 139 | choice = game_menu(); |
el18gs | 2:eaf245af2aae | 140 | switch (choice) { |
el18gs | 2:eaf245af2aae | 141 | case 0: |
el18gs | 2:eaf245af2aae | 142 | catch_ghosts(); |
el18gs | 8:4220d116f17c | 143 | inventory.regen(sd); |
el18gs | 2:eaf245af2aae | 144 | break; |
el18gs | 2:eaf245af2aae | 145 | case 1: |
el18gs | 8:4220d116f17c | 146 | display_inventory(inventory, sd); |
el18gs | 2:eaf245af2aae | 147 | break; |
el18gs | 2:eaf245af2aae | 148 | case 2: |
el18gs | 2:eaf245af2aae | 149 | settings(); |
el18gs | 2:eaf245af2aae | 150 | break; |
el18gs | 2:eaf245af2aae | 151 | } |
el18gs | 2:eaf245af2aae | 152 | } |
el18gs | 2:eaf245af2aae | 153 | } |
el18gs | 2:eaf245af2aae | 154 | |
el18gs | 2:eaf245af2aae | 155 | void welcome() |
el18gs | 2:eaf245af2aae | 156 | { |
el18gs | 3:9d811414d35e | 157 | //printf("entered welcome screen\n"); |
el18gs | 2:eaf245af2aae | 158 | int** welcome = import_sprite("/sd/assets/welcome.sprite"); |
el18gs | 3:9d811414d35e | 159 | lcd.clear(); |
el18gs | 3:9d811414d35e | 160 | for(int i = 0; i < 48; i++) { |
el18gs | 3:9d811414d35e | 161 | for(int j = 0; j < 84; j++) { |
el18gs | 3:9d811414d35e | 162 | lcd.setPixel(j,i, welcome[i][j]); |
el18gs | 3:9d811414d35e | 163 | } |
el18gs | 3:9d811414d35e | 164 | } |
el18gs | 2:eaf245af2aae | 165 | while(!g_buttonA_flag) { |
el18gs | 2:eaf245af2aae | 166 | // contrast should be bounded between 4 and 6 |
el18gs | 2:eaf245af2aae | 167 | // contrast = 0.4 + contrast.read()/5 |
el18gs | 3:9d811414d35e | 168 | lcd.setContrast(0.4 + ((double) pad.read_pot1()/5)); |
el18gs | 2:eaf245af2aae | 169 | lcd.refresh(); |
el18gs | 2:eaf245af2aae | 170 | wait_ms(10); |
el18gs | 2:eaf245af2aae | 171 | } |
el18gs | 2:eaf245af2aae | 172 | |
el18gs | 2:eaf245af2aae | 173 | g_buttonA_flag = 0; |
el18gs | 3:9d811414d35e | 174 | //wait_ms(25); |
el18gs | 2:eaf245af2aae | 175 | } |
el18gs | 2:eaf245af2aae | 176 | |
el18gs | 2:eaf245af2aae | 177 | |
el18gs | 2:eaf245af2aae | 178 | int game_menu() |
el18gs | 2:eaf245af2aae | 179 | { |
el18gs | 2:eaf245af2aae | 180 | |
el18gs | 2:eaf245af2aae | 181 | State fsm[4] = { |
el18gs | 2:eaf245af2aae | 182 | // line next{up, down} |
el18gs | 2:eaf245af2aae | 183 | {0,{2,1}}, // State: 0 |
el18gs | 2:eaf245af2aae | 184 | {2,{0,2}}, // State: 1 |
el18gs | 2:eaf245af2aae | 185 | {4,{1,0}}, // State: 2 |
el18gs | 2:eaf245af2aae | 186 | }; |
el18gs | 2:eaf245af2aae | 187 | |
el18gs | 2:eaf245af2aae | 188 | int current_state = 0; |
el18gs | 2:eaf245af2aae | 189 | |
el18gs | 2:eaf245af2aae | 190 | printf("entered game menu\n"); |
el18gs | 2:eaf245af2aae | 191 | g_buttonX_flag = 0; |
el18gs | 2:eaf245af2aae | 192 | g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 193 | g_buttonB_flag = 0; |
el18gs | 2:eaf245af2aae | 194 | |
el18gs | 2:eaf245af2aae | 195 | while(1) { |
el18gs | 2:eaf245af2aae | 196 | lcd.clear(); |
el18gs | 2:eaf245af2aae | 197 | lcd.printString("Catch Ghosts",0,0); |
el18gs | 2:eaf245af2aae | 198 | lcd.printString("Inventory",0,2); |
el18gs | 2:eaf245af2aae | 199 | lcd.printString("Settings",0,4); |
el18gs | 2:eaf245af2aae | 200 | |
el18gs | 2:eaf245af2aae | 201 | if(g_buttonA_flag) { |
el18gs | 2:eaf245af2aae | 202 | g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 203 | return current_state; |
el18gs | 2:eaf245af2aae | 204 | } |
el18gs | 2:eaf245af2aae | 205 | |
el18gs | 2:eaf245af2aae | 206 | if(g_buttonX_flag) { |
el18gs | 2:eaf245af2aae | 207 | current_state = fsm[current_state].nextState[0]; |
el18gs | 2:eaf245af2aae | 208 | g_buttonX_flag = 0; |
el18gs | 2:eaf245af2aae | 209 | g_buttonB_flag = 0; |
el18gs | 2:eaf245af2aae | 210 | } else if(g_buttonB_flag) { |
el18gs | 2:eaf245af2aae | 211 | current_state = fsm[current_state].nextState[1]; |
el18gs | 2:eaf245af2aae | 212 | g_buttonX_flag = 0; |
el18gs | 2:eaf245af2aae | 213 | g_buttonB_flag = 0; |
el18gs | 2:eaf245af2aae | 214 | } |
el18gs | 2:eaf245af2aae | 215 | |
el18gs | 2:eaf245af2aae | 216 | switch (fsm[current_state].output) { |
el18gs | 2:eaf245af2aae | 217 | case 0: |
el18gs | 2:eaf245af2aae | 218 | lcd.drawCircle(79, 3, 3, FILL_BLACK); |
el18gs | 2:eaf245af2aae | 219 | break; |
el18gs | 2:eaf245af2aae | 220 | case 2: |
el18gs | 2:eaf245af2aae | 221 | lcd.drawCircle(79, 20, 3, FILL_BLACK); |
el18gs | 2:eaf245af2aae | 222 | break; |
el18gs | 2:eaf245af2aae | 223 | case 4: |
el18gs | 2:eaf245af2aae | 224 | lcd.drawCircle(79, 35, 3, FILL_BLACK); |
el18gs | 2:eaf245af2aae | 225 | break; |
el18gs | 2:eaf245af2aae | 226 | } |
el18gs | 2:eaf245af2aae | 227 | lcd.refresh(); |
el18gs | 2:eaf245af2aae | 228 | } |
eencae | 0:b7f1f47bb26a | 229 | } |
eencae | 0:b7f1f47bb26a | 230 | |
el18gs | 2:eaf245af2aae | 231 | void catch_ghosts() |
el18gs | 2:eaf245af2aae | 232 | { |
el18gs | 3:9d811414d35e | 233 | |
el18gs | 2:eaf245af2aae | 234 | float pitch = rand() % 46; |
el18gs | 2:eaf245af2aae | 235 | if(rand() & 1) { |
el18gs | 2:eaf245af2aae | 236 | pitch = pitch * -1; |
el18gs | 2:eaf245af2aae | 237 | } |
el18gs | 2:eaf245af2aae | 238 | |
el18gs | 2:eaf245af2aae | 239 | float roll = rand() % 46; |
el18gs | 2:eaf245af2aae | 240 | if(rand() & 1) { |
el18gs | 2:eaf245af2aae | 241 | roll = roll * -1; |
el18gs | 2:eaf245af2aae | 242 | } |
el18gs | 2:eaf245af2aae | 243 | |
el18gs | 2:eaf245af2aae | 244 | int count = 0; |
el18gs | 2:eaf245af2aae | 245 | |
el18gs | 2:eaf245af2aae | 246 | lcd.clear(); |
el18gs | 2:eaf245af2aae | 247 | lcd.printString("Align the",18,0); |
el18gs | 2:eaf245af2aae | 248 | lcd.printString("Gamepad until",4,1); |
el18gs | 2:eaf245af2aae | 249 | lcd.printString("all LEDs",20,2); |
el18gs | 2:eaf245af2aae | 250 | lcd.printString("turn on",22,3); |
el18gs | 2:eaf245af2aae | 251 | lcd.refresh(); |
el18gs | 2:eaf245af2aae | 252 | |
el18gs | 2:eaf245af2aae | 253 | |
el18gs | 2:eaf245af2aae | 254 | while(1) { |
el18gs | 2:eaf245af2aae | 255 | accel.read_data(); |
el18gs | 2:eaf245af2aae | 256 | bool focused = true; |
el18gs | 2:eaf245af2aae | 257 | |
el18gs | 2:eaf245af2aae | 258 | if((double)accel.sensor.roll/roll > 0.75) { |
el18gs | 2:eaf245af2aae | 259 | left_LED = 0b000; |
el18gs | 2:eaf245af2aae | 260 | } else if ((double)accel.sensor.roll/roll > 0.3) { |
el18gs | 2:eaf245af2aae | 261 | focused = false; |
el18gs | 2:eaf245af2aae | 262 | left_LED = 0b001; |
el18gs | 2:eaf245af2aae | 263 | } else { |
el18gs | 2:eaf245af2aae | 264 | focused = false; |
el18gs | 2:eaf245af2aae | 265 | left_LED = 0b011; |
el18gs | 2:eaf245af2aae | 266 | } |
el18gs | 2:eaf245af2aae | 267 | |
el18gs | 2:eaf245af2aae | 268 | if((double)accel.sensor.pitch/pitch > 0.75) { |
el18gs | 2:eaf245af2aae | 269 | right_LED = 0b000; |
el18gs | 2:eaf245af2aae | 270 | } else if ((double)accel.sensor.pitch/pitch > 0.3) { |
el18gs | 2:eaf245af2aae | 271 | focused = false; |
el18gs | 2:eaf245af2aae | 272 | right_LED = 0b001; |
el18gs | 2:eaf245af2aae | 273 | } else { |
el18gs | 2:eaf245af2aae | 274 | focused = false; |
el18gs | 2:eaf245af2aae | 275 | right_LED = 0b011; |
el18gs | 2:eaf245af2aae | 276 | } |
el18gs | 2:eaf245af2aae | 277 | |
el18gs | 2:eaf245af2aae | 278 | if(focused) { |
el18gs | 2:eaf245af2aae | 279 | count++; |
el18gs | 2:eaf245af2aae | 280 | } |
el18gs | 2:eaf245af2aae | 281 | |
el18gs | 2:eaf245af2aae | 282 | if(count > 500) { |
el18gs | 2:eaf245af2aae | 283 | break; |
el18gs | 2:eaf245af2aae | 284 | } |
el18gs | 2:eaf245af2aae | 285 | wait_ms(10); |
el18gs | 2:eaf245af2aae | 286 | } |
el18gs | 2:eaf245af2aae | 287 | |
el18gs | 2:eaf245af2aae | 288 | Vector2D ideal = {rand() % 85,rand() % 49}; |
el18gs | 3:9d811414d35e | 289 | |
el18gs | 2:eaf245af2aae | 290 | int** ghost = import_sprite("/sd/assets/ghost.sprite"); |
el18gs | 2:eaf245af2aae | 291 | |
el18gs | 2:eaf245af2aae | 292 | while(1) { |
el18gs | 2:eaf245af2aae | 293 | |
el18gs | 2:eaf245af2aae | 294 | lcd.clear(); |
el18gs | 2:eaf245af2aae | 295 | |
el18gs | 2:eaf245af2aae | 296 | Vector2D actual = {cursor_transform(2, 0, 84, 0, pad.get_coord().x), |
el18gs | 2:eaf245af2aae | 297 | cursor_transform(2, 0, 48, 0, pad.get_coord().y * -1) |
el18gs | 2:eaf245af2aae | 298 | }; |
el18gs | 2:eaf245af2aae | 299 | |
el18gs | 2:eaf245af2aae | 300 | // x0 y0 x1 y1 type |
el18gs | 2:eaf245af2aae | 301 | lcd.drawLine(actual.x, 0, actual.x, 48, 2); |
el18gs | 2:eaf245af2aae | 302 | lcd.drawLine(0, actual.y, 84, actual.y, 2); |
el18gs | 2:eaf245af2aae | 303 | |
el18gs | 2:eaf245af2aae | 304 | int col = 0; |
el18gs | 2:eaf245af2aae | 305 | |
el18gs | 2:eaf245af2aae | 306 | for(int i = ideal.x - 8; i < ideal.x + 8; i++) { // Iterate Columns: x |
el18gs | 2:eaf245af2aae | 307 | int row = 0; |
el18gs | 3:9d811414d35e | 308 | for(int j = ideal.y - 9; j < ideal.y + 9; j++) { // Iterate Rows: y |
el18gs | 2:eaf245af2aae | 309 | lcd.setPixel(i,j, ghost[row][col]); |
el18gs | 2:eaf245af2aae | 310 | row++; |
el18gs | 2:eaf245af2aae | 311 | } |
el18gs | 2:eaf245af2aae | 312 | col++; |
el18gs | 2:eaf245af2aae | 313 | } |
el18gs | 2:eaf245af2aae | 314 | |
el18gs | 3:9d811414d35e | 315 | if(ghostHit(ideal.x, ideal.y, actual.x, actual.y)) { |
el18gs | 3:9d811414d35e | 316 | lcd.printString("Press A!",0,0); |
el18gs | 3:9d811414d35e | 317 | if(g_buttonA_flag) { |
el18gs | 3:9d811414d35e | 318 | break; |
el18gs | 2:eaf245af2aae | 319 | } |
el18gs | 2:eaf245af2aae | 320 | } |
el18gs | 2:eaf245af2aae | 321 | |
el18gs | 2:eaf245af2aae | 322 | g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 323 | |
el18gs | 2:eaf245af2aae | 324 | lcd.refresh(); |
el18gs | 2:eaf245af2aae | 325 | |
el18gs | 2:eaf245af2aae | 326 | int x_move = 0; |
el18gs | 2:eaf245af2aae | 327 | int y_move = 0; |
el18gs | 2:eaf245af2aae | 328 | |
el18gs | 2:eaf245af2aae | 329 | if(rand() & 1) { |
el18gs | 2:eaf245af2aae | 330 | x_move = 1; |
el18gs | 2:eaf245af2aae | 331 | } else { |
el18gs | 2:eaf245af2aae | 332 | x_move = -1; |
el18gs | 2:eaf245af2aae | 333 | } |
el18gs | 2:eaf245af2aae | 334 | |
el18gs | 2:eaf245af2aae | 335 | if(rand() & 1) { |
el18gs | 2:eaf245af2aae | 336 | y_move = 1; |
el18gs | 2:eaf245af2aae | 337 | } else { |
el18gs | 2:eaf245af2aae | 338 | y_move = -1; |
el18gs | 2:eaf245af2aae | 339 | } |
el18gs | 2:eaf245af2aae | 340 | |
el18gs | 2:eaf245af2aae | 341 | ideal.x = ideal.x + x_move; |
el18gs | 2:eaf245af2aae | 342 | ideal.y = ideal.y + y_move; |
el18gs | 2:eaf245af2aae | 343 | |
el18gs | 3:9d811414d35e | 344 | if(ideal.x > 70) { |
el18gs | 3:9d811414d35e | 345 | ideal.x = 70; |
el18gs | 3:9d811414d35e | 346 | } else if(ideal.x < 13) { |
el18gs | 3:9d811414d35e | 347 | ideal.x = 13; |
el18gs | 2:eaf245af2aae | 348 | } |
el18gs | 2:eaf245af2aae | 349 | |
el18gs | 3:9d811414d35e | 350 | if(ideal.y > 30) { |
el18gs | 3:9d811414d35e | 351 | ideal.y = 30; |
el18gs | 3:9d811414d35e | 352 | } else if(ideal.y < 12) { |
el18gs | 3:9d811414d35e | 353 | ideal.y = 12; |
el18gs | 2:eaf245af2aae | 354 | } |
el18gs | 2:eaf245af2aae | 355 | |
el18gs | 2:eaf245af2aae | 356 | |
el18gs | 2:eaf245af2aae | 357 | wait_ms(10); |
el18gs | 2:eaf245af2aae | 358 | } |
el18gs | 2:eaf245af2aae | 359 | |
el18gs | 2:eaf245af2aae | 360 | printf("Ghost caught\n"); |
el18gs | 2:eaf245af2aae | 361 | |
el18gs | 8:4220d116f17c | 362 | Ghost caught_ghost(rand()%100, rand()%20, "/ghosts/", sd); |
el18gs | 8:4220d116f17c | 363 | caught_ghost.save(sd); |
el18gs | 2:eaf245af2aae | 364 | |
el18gs | 2:eaf245af2aae | 365 | lcd.clear(); |
el18gs | 2:eaf245af2aae | 366 | lcd.printString("You caught:", 0, 0); |
el18gs | 2:eaf245af2aae | 367 | lcd.printString(caught_ghost.get_type_string().c_str(), 0, 1); |
el18gs | 3:9d811414d35e | 368 | lcd.printString("Press A to", 0, 2); |
el18gs | 3:9d811414d35e | 369 | lcd.printString("continue", 0, 3); |
el18gs | 2:eaf245af2aae | 370 | lcd.refresh(); |
el18gs | 2:eaf245af2aae | 371 | |
el18gs | 3:9d811414d35e | 372 | //wait(2); |
el18gs | 2:eaf245af2aae | 373 | |
el18gs | 2:eaf245af2aae | 374 | g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 375 | |
el18gs | 2:eaf245af2aae | 376 | while(!g_buttonA_flag) { |
el18gs | 2:eaf245af2aae | 377 | } |
el18gs | 2:eaf245af2aae | 378 | |
el18gs | 2:eaf245af2aae | 379 | g_buttonA_flag = 0; |
el18gs | 2:eaf245af2aae | 380 | |
el18gs | 2:eaf245af2aae | 381 | } |
el18gs | 2:eaf245af2aae | 382 | |
el18gs | 3:9d811414d35e | 383 | bool ghostHit( int xGhost, int yGhost, int xJoy, int yJoy) |
el18gs | 3:9d811414d35e | 384 | { |
el18gs | 3:9d811414d35e | 385 | int xDifference = abs(xGhost - xJoy); |
el18gs | 3:9d811414d35e | 386 | int yDifference = abs(yGhost - yJoy); |
el18gs | 3:9d811414d35e | 387 | |
el18gs | 3:9d811414d35e | 388 | if(xDifference < 10 && yDifference <10){ |
el18gs | 3:9d811414d35e | 389 | return true; |
el18gs | 3:9d811414d35e | 390 | } else { |
el18gs | 3:9d811414d35e | 391 | return false; |
el18gs | 3:9d811414d35e | 392 | } |
el18gs | 3:9d811414d35e | 393 | } |
el18gs | 3:9d811414d35e | 394 | |
el18gs | 3:9d811414d35e | 395 | void settings() |
el18gs | 3:9d811414d35e | 396 | { |
el18gs | 3:9d811414d35e | 397 | // settings that can be edited: |
el18gs | 3:9d811414d35e | 398 | // * contrast |
el18gs | 3:9d811414d35e | 399 | // * button delay |
el18gs | 3:9d811414d35e | 400 | |
el18gs | 3:9d811414d35e | 401 | // menu from FSM |
el18gs | 3:9d811414d35e | 402 | State fsm[2] = { |
el18gs | 3:9d811414d35e | 403 | // line next{up, down} |
el18gs | 3:9d811414d35e | 404 | {2,{1,1}}, // State: 0 |
el18gs | 3:9d811414d35e | 405 | {4,{0,0}}, // State: 1 |
el18gs | 3:9d811414d35e | 406 | }; |
el18gs | 3:9d811414d35e | 407 | |
el18gs | 3:9d811414d35e | 408 | |
el18gs | 3:9d811414d35e | 409 | int current_state = 0; |
el18gs | 3:9d811414d35e | 410 | |
el18gs | 3:9d811414d35e | 411 | printf("entered game menu\n"); |
el18gs | 3:9d811414d35e | 412 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 413 | g_buttonA_flag = 0; |
el18gs | 3:9d811414d35e | 414 | g_buttonB_flag = 0; |
el18gs | 3:9d811414d35e | 415 | |
el18gs | 3:9d811414d35e | 416 | while(1) { |
el18gs | 3:9d811414d35e | 417 | lcd.clear(); |
el18gs | 3:9d811414d35e | 418 | lcd.printString("Settings",0,0); |
el18gs | 3:9d811414d35e | 419 | lcd.printString("Contrast",0,2); |
el18gs | 3:9d811414d35e | 420 | lcd.printString("Button delay",0,4); |
el18gs | 3:9d811414d35e | 421 | |
el18gs | 3:9d811414d35e | 422 | if(g_buttonA_flag) { |
el18gs | 3:9d811414d35e | 423 | g_buttonA_flag = 0; |
el18gs | 3:9d811414d35e | 424 | switch (fsm[current_state].output) { |
el18gs | 3:9d811414d35e | 425 | case 2: |
el18gs | 3:9d811414d35e | 426 | adjustContrast(); |
el18gs | 3:9d811414d35e | 427 | break; |
el18gs | 3:9d811414d35e | 428 | case 4: |
el18gs | 3:9d811414d35e | 429 | buttonDelay(); |
el18gs | 3:9d811414d35e | 430 | break; |
el18gs | 3:9d811414d35e | 431 | } |
el18gs | 3:9d811414d35e | 432 | } else if (g_buttonStart_flag) { |
el18gs | 3:9d811414d35e | 433 | g_buttonStart_flag = 0; |
el18gs | 3:9d811414d35e | 434 | return; |
el18gs | 3:9d811414d35e | 435 | } |
el18gs | 3:9d811414d35e | 436 | |
el18gs | 3:9d811414d35e | 437 | if(g_buttonX_flag) { |
el18gs | 3:9d811414d35e | 438 | current_state = fsm[current_state].nextState[0]; |
el18gs | 3:9d811414d35e | 439 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 440 | g_buttonB_flag = 0; |
el18gs | 3:9d811414d35e | 441 | } else if(g_buttonB_flag) { |
el18gs | 3:9d811414d35e | 442 | current_state = fsm[current_state].nextState[1]; |
el18gs | 3:9d811414d35e | 443 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 444 | g_buttonB_flag = 0; |
el18gs | 3:9d811414d35e | 445 | } |
el18gs | 3:9d811414d35e | 446 | |
el18gs | 3:9d811414d35e | 447 | switch (fsm[current_state].output) { |
el18gs | 3:9d811414d35e | 448 | case 2: |
el18gs | 3:9d811414d35e | 449 | lcd.drawCircle(79, 20, 3, FILL_BLACK); |
el18gs | 3:9d811414d35e | 450 | break; |
el18gs | 3:9d811414d35e | 451 | case 4: |
el18gs | 3:9d811414d35e | 452 | lcd.drawCircle(79, 35, 3, FILL_BLACK); |
el18gs | 3:9d811414d35e | 453 | break; |
el18gs | 3:9d811414d35e | 454 | } |
el18gs | 3:9d811414d35e | 455 | |
el18gs | 3:9d811414d35e | 456 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 457 | } |
el18gs | 3:9d811414d35e | 458 | } |
el18gs | 3:9d811414d35e | 459 | |
el18gs | 3:9d811414d35e | 460 | void adjustContrast() |
el18gs | 3:9d811414d35e | 461 | { |
el18gs | 3:9d811414d35e | 462 | while(1) { |
el18gs | 3:9d811414d35e | 463 | lcd.clear(); |
el18gs | 3:9d811414d35e | 464 | // Print title |
el18gs | 3:9d811414d35e | 465 | |
el18gs | 3:9d811414d35e | 466 | lcd.printString("Contrast", 0, 0); |
el18gs | 3:9d811414d35e | 467 | lcd.printString("Press A to set", 0, 3); |
el18gs | 3:9d811414d35e | 468 | |
el18gs | 3:9d811414d35e | 469 | float conSet = 0.4 + ((double) pad.read_pot1()/5); |
el18gs | 3:9d811414d35e | 470 | float bar = cursor_transform(0.6,0.4,64,0,conSet); |
el18gs | 3:9d811414d35e | 471 | |
el18gs | 3:9d811414d35e | 472 | printf("conSet: %f\n", conSet); |
el18gs | 3:9d811414d35e | 473 | printf("bar: %f\n", bar); |
el18gs | 3:9d811414d35e | 474 | |
el18gs | 3:9d811414d35e | 475 | // example of how to draw rectangles |
el18gs | 3:9d811414d35e | 476 | // origin x,y,width,height,type |
el18gs | 3:9d811414d35e | 477 | lcd.drawRect(10,10,74,10,FILL_TRANSPARENT); // transparent, just outline |
el18gs | 3:9d811414d35e | 478 | lcd.drawRect(10,10,bar,10,FILL_BLACK); // filled black rectangle |
el18gs | 3:9d811414d35e | 479 | lcd.setContrast(conSet); |
el18gs | 3:9d811414d35e | 480 | |
el18gs | 3:9d811414d35e | 481 | if(g_buttonA_flag) { |
el18gs | 3:9d811414d35e | 482 | g_buttonA_flag = 0; |
el18gs | 3:9d811414d35e | 483 | return; |
el18gs | 3:9d811414d35e | 484 | } |
el18gs | 3:9d811414d35e | 485 | |
el18gs | 3:9d811414d35e | 486 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 487 | } |
el18gs | 3:9d811414d35e | 488 | } |
el18gs | 3:9d811414d35e | 489 | |
el18gs | 3:9d811414d35e | 490 | void buttonDelay() |
el18gs | 3:9d811414d35e | 491 | { |
el18gs | 3:9d811414d35e | 492 | g_buttonTesting = true; |
el18gs | 3:9d811414d35e | 493 | |
el18gs | 3:9d811414d35e | 494 | lcd.clear(); |
el18gs | 3:9d811414d35e | 495 | |
el18gs | 3:9d811414d35e | 496 | bool circle = false; |
el18gs | 3:9d811414d35e | 497 | |
el18gs | 3:9d811414d35e | 498 | while(1) { |
el18gs | 3:9d811414d35e | 499 | lcd.clear(); |
el18gs | 3:9d811414d35e | 500 | lcd.printString("Button Delay", 0, 0); |
el18gs | 3:9d811414d35e | 501 | lcd.printString("Press X to test", 0, 4); |
el18gs | 3:9d811414d35e | 502 | lcd.printString("Press A to set", 0, 5); |
el18gs | 3:9d811414d35e | 503 | |
el18gs | 3:9d811414d35e | 504 | g_buttonSensitivityTest = cursor_transform(1,0,2,0,pad.read_pot2()) * 250; |
el18gs | 3:9d811414d35e | 505 | int bar = cursor_transform(500,0,64,0,g_buttonSensitivityTest); |
el18gs | 3:9d811414d35e | 506 | |
el18gs | 3:9d811414d35e | 507 | // example of how to draw rectangles |
el18gs | 3:9d811414d35e | 508 | // origin x,y,width,height,type |
el18gs | 3:9d811414d35e | 509 | lcd.drawRect(10,10,74,10,FILL_TRANSPARENT); // transparent, just outline |
el18gs | 3:9d811414d35e | 510 | lcd.drawRect(10,10,bar,10,FILL_BLACK); // filled black rectangle |
el18gs | 3:9d811414d35e | 511 | |
el18gs | 3:9d811414d35e | 512 | if(circle) { |
el18gs | 3:9d811414d35e | 513 | lcd.drawCircle(42, 25, 3, FILL_BLACK); |
el18gs | 3:9d811414d35e | 514 | } else { |
el18gs | 3:9d811414d35e | 515 | lcd.drawCircle(42, 25, 3, FILL_TRANSPARENT); |
el18gs | 3:9d811414d35e | 516 | } |
el18gs | 3:9d811414d35e | 517 | |
el18gs | 3:9d811414d35e | 518 | if(g_buttonX_flag) { |
el18gs | 3:9d811414d35e | 519 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 520 | circle = !circle; |
el18gs | 3:9d811414d35e | 521 | } else if(g_buttonA_flag) { |
el18gs | 3:9d811414d35e | 522 | g_buttonA_flag = 0; |
el18gs | 3:9d811414d35e | 523 | g_button_sesnsitivity = g_buttonSensitivityTest; |
el18gs | 3:9d811414d35e | 524 | g_buttonTesting = false; |
el18gs | 3:9d811414d35e | 525 | return; |
el18gs | 3:9d811414d35e | 526 | } else if (g_buttonStart_flag) { |
el18gs | 3:9d811414d35e | 527 | g_buttonStart_flag = 0; |
el18gs | 3:9d811414d35e | 528 | g_buttonTesting = false; |
el18gs | 3:9d811414d35e | 529 | return; |
el18gs | 3:9d811414d35e | 530 | } |
el18gs | 3:9d811414d35e | 531 | |
el18gs | 3:9d811414d35e | 532 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 533 | |
el18gs | 3:9d811414d35e | 534 | } |
el18gs | 3:9d811414d35e | 535 | } |
el18gs | 3:9d811414d35e | 536 | |
el18gs | 3:9d811414d35e | 537 | |
el18gs | 3:9d811414d35e | 538 | float cursor_transform(float OldMax, |
el18gs | 3:9d811414d35e | 539 | float OldMin, |
el18gs | 3:9d811414d35e | 540 | float NewMax, |
el18gs | 3:9d811414d35e | 541 | float NewMin, |
el18gs | 2:eaf245af2aae | 542 | float OldValue) |
el18gs | 2:eaf245af2aae | 543 | { |
el18gs | 2:eaf245af2aae | 544 | float NewValue = -1; |
el18gs | 3:9d811414d35e | 545 | float OldRange = (OldMax - OldMin); |
el18gs | 2:eaf245af2aae | 546 | if (OldRange == 0) { |
el18gs | 2:eaf245af2aae | 547 | NewValue = NewMin; |
el18gs | 2:eaf245af2aae | 548 | } else { |
el18gs | 3:9d811414d35e | 549 | float NewRange = (NewMax - NewMin); |
el18gs | 2:eaf245af2aae | 550 | NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin; |
el18gs | 2:eaf245af2aae | 551 | } |
el18gs | 2:eaf245af2aae | 552 | return NewValue; |
el18gs | 2:eaf245af2aae | 553 | } |
el18gs | 2:eaf245af2aae | 554 | |
el18gs | 8:4220d116f17c | 555 | void display_inventory(Inventory inventory, SDFileSystem &sd) |
el18gs | 2:eaf245af2aae | 556 | { |
el18gs | 2:eaf245af2aae | 557 | printf("viewing inventory\n"); |
el18gs | 3:9d811414d35e | 558 | int which_ghost_state = 0; |
el18gs | 3:9d811414d35e | 559 | int which_view_state = 0; |
el18gs | 3:9d811414d35e | 560 | int new_which_view_state = 0; |
el18gs | 3:9d811414d35e | 561 | |
el18gs | 3:9d811414d35e | 562 | std::vector<inven_state> ghost_fsm; |
el18gs | 3:9d811414d35e | 563 | |
el18gs | 3:9d811414d35e | 564 | bool regen_inven = true; |
el18gs | 3:9d811414d35e | 565 | bool scroll_ghost = false; |
el18gs | 3:9d811414d35e | 566 | bool update = true; |
el18gs | 3:9d811414d35e | 567 | |
el18gs | 3:9d811414d35e | 568 | while(1) { |
el18gs | 3:9d811414d35e | 569 | if(regen_inven) { |
el18gs | 8:4220d116f17c | 570 | inventory.regen(sd); |
el18gs | 3:9d811414d35e | 571 | ghost_fsm = gen_ghost_fsm(inventory); |
el18gs | 3:9d811414d35e | 572 | regen_inven = false; |
el18gs | 3:9d811414d35e | 573 | which_ghost_state = 0; |
el18gs | 3:9d811414d35e | 574 | which_view_state = 0; |
el18gs | 3:9d811414d35e | 575 | } |
el18gs | 3:9d811414d35e | 576 | |
el18gs | 3:9d811414d35e | 577 | if(update) { |
el18gs | 3:9d811414d35e | 578 | update = false; |
el18gs | 3:9d811414d35e | 579 | |
el18gs | 3:9d811414d35e | 580 | if(scroll_ghost) { |
el18gs | 3:9d811414d35e | 581 | wait_ms(750); |
el18gs | 3:9d811414d35e | 582 | scroll_ghost = false; |
el18gs | 3:9d811414d35e | 583 | } |
el18gs | 3:9d811414d35e | 584 | |
el18gs | 3:9d811414d35e | 585 | |
el18gs | 3:9d811414d35e | 586 | lcd.clear(); |
el18gs | 3:9d811414d35e | 587 | |
el18gs | 3:9d811414d35e | 588 | lcd.printString("Inventory", 0, 0); |
el18gs | 3:9d811414d35e | 589 | char buffer [64]; |
el18gs | 3:9d811414d35e | 590 | |
el18gs | 3:9d811414d35e | 591 | if(ghost_fsm.size() == 0) { |
el18gs | 3:9d811414d35e | 592 | lcd.printString("No ghosts", 0, 1); |
el18gs | 3:9d811414d35e | 593 | lcd.printString("found, exiting", 0, 2); |
el18gs | 3:9d811414d35e | 594 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 595 | wait(1); |
el18gs | 3:9d811414d35e | 596 | return; |
el18gs | 3:9d811414d35e | 597 | } else { |
el18gs | 3:9d811414d35e | 598 | |
el18gs | 3:9d811414d35e | 599 | if(which_view_state <= 0) { |
el18gs | 3:9d811414d35e | 600 | sprintf(buffer, "%s", ghost_fsm[which_ghost_state].type.c_str()); |
el18gs | 3:9d811414d35e | 601 | lcd.printString(buffer, 0, 1 - which_view_state); |
el18gs | 3:9d811414d35e | 602 | } |
el18gs | 3:9d811414d35e | 603 | |
el18gs | 3:9d811414d35e | 604 | if(which_view_state <= 1) { |
el18gs | 3:9d811414d35e | 605 | sprintf(buffer, "Name: %s", ghost_fsm[which_ghost_state].name.c_str()); |
el18gs | 3:9d811414d35e | 606 | lcd.printString(buffer, 0, 2 - which_view_state); |
el18gs | 3:9d811414d35e | 607 | } |
el18gs | 3:9d811414d35e | 608 | |
el18gs | 3:9d811414d35e | 609 | if(which_view_state <= 2) { |
el18gs | 3:9d811414d35e | 610 | sprintf(buffer, "Attack: %d", ghost_fsm[which_ghost_state].attack); |
el18gs | 3:9d811414d35e | 611 | lcd.printString(buffer, 0, 3 - which_view_state); |
el18gs | 3:9d811414d35e | 612 | } |
el18gs | 3:9d811414d35e | 613 | |
el18gs | 3:9d811414d35e | 614 | if(which_view_state <= 3) { |
el18gs | 3:9d811414d35e | 615 | sprintf(buffer, "Defense: %d", ghost_fsm[which_ghost_state].defense); |
el18gs | 3:9d811414d35e | 616 | lcd.printString(buffer, 0, 4 - which_view_state); |
el18gs | 3:9d811414d35e | 617 | } |
el18gs | 3:9d811414d35e | 618 | |
el18gs | 3:9d811414d35e | 619 | if(which_view_state <= 4) { |
el18gs | 3:9d811414d35e | 620 | sprintf(buffer, "Level: %d", ghost_fsm[which_ghost_state].level); |
el18gs | 3:9d811414d35e | 621 | lcd.printString(buffer, 0, 5 - which_view_state); |
el18gs | 3:9d811414d35e | 622 | } |
el18gs | 3:9d811414d35e | 623 | |
el18gs | 3:9d811414d35e | 624 | if(which_view_state <= 5) { |
el18gs | 3:9d811414d35e | 625 | sprintf(buffer, "Value: %d", ghost_fsm[which_ghost_state].value); |
el18gs | 3:9d811414d35e | 626 | lcd.printString(buffer, 0, 6 - which_view_state); |
el18gs | 3:9d811414d35e | 627 | } |
el18gs | 3:9d811414d35e | 628 | |
el18gs | 3:9d811414d35e | 629 | if(which_view_state <= 6) { |
el18gs | 3:9d811414d35e | 630 | sprintf(buffer, "HP Max: %d", ghost_fsm[which_ghost_state].hp_max); |
el18gs | 3:9d811414d35e | 631 | lcd.printString(buffer, 0, 7 - which_view_state); |
el18gs | 3:9d811414d35e | 632 | } |
el18gs | 3:9d811414d35e | 633 | |
el18gs | 3:9d811414d35e | 634 | if(which_view_state <= 7) { |
el18gs | 3:9d811414d35e | 635 | sprintf(buffer, "HP: %d", ghost_fsm[which_ghost_state].hp); |
el18gs | 3:9d811414d35e | 636 | lcd.printString(buffer, 0, 7 - which_view_state); |
el18gs | 3:9d811414d35e | 637 | } |
el18gs | 3:9d811414d35e | 638 | |
el18gs | 3:9d811414d35e | 639 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 640 | } |
el18gs | 3:9d811414d35e | 641 | |
el18gs | 3:9d811414d35e | 642 | } |
el18gs | 3:9d811414d35e | 643 | |
el18gs | 3:9d811414d35e | 644 | if(pad.read_pot2() <= (double) 0.33) { |
el18gs | 3:9d811414d35e | 645 | new_which_view_state = 0; |
el18gs | 3:9d811414d35e | 646 | } else if(pad.read_pot2() <= (double) 0.66) { |
el18gs | 3:9d811414d35e | 647 | new_which_view_state = 1; |
el18gs | 3:9d811414d35e | 648 | } else { |
el18gs | 3:9d811414d35e | 649 | new_which_view_state = 2; |
el18gs | 3:9d811414d35e | 650 | } |
el18gs | 3:9d811414d35e | 651 | |
el18gs | 3:9d811414d35e | 652 | if(new_which_view_state != which_view_state) { |
el18gs | 3:9d811414d35e | 653 | update = true; |
el18gs | 3:9d811414d35e | 654 | which_view_state = new_which_view_state; |
el18gs | 3:9d811414d35e | 655 | } |
el18gs | 3:9d811414d35e | 656 | |
el18gs | 3:9d811414d35e | 657 | if(pad.read_pot1() < (double) 0.33) { |
el18gs | 3:9d811414d35e | 658 | which_ghost_state = ghost_fsm[which_ghost_state].next[1]; |
el18gs | 3:9d811414d35e | 659 | scroll_ghost = true; |
el18gs | 3:9d811414d35e | 660 | } else if(pad.read_pot1() > (double) 0.66) { |
el18gs | 3:9d811414d35e | 661 | which_ghost_state = ghost_fsm[which_ghost_state].next[0]; |
el18gs | 3:9d811414d35e | 662 | scroll_ghost = true; |
el18gs | 3:9d811414d35e | 663 | } |
el18gs | 3:9d811414d35e | 664 | |
el18gs | 3:9d811414d35e | 665 | if(scroll_ghost) { |
el18gs | 3:9d811414d35e | 666 | update = true; |
el18gs | 3:9d811414d35e | 667 | } |
el18gs | 3:9d811414d35e | 668 | |
el18gs | 3:9d811414d35e | 669 | if(g_buttonX_flag) { |
el18gs | 3:9d811414d35e | 670 | printf("X button pressed\n"); |
el18gs | 3:9d811414d35e | 671 | update = true; |
el18gs | 3:9d811414d35e | 672 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 673 | lcd.drawRect(0,16,84,16, FILL_WHITE); |
el18gs | 3:9d811414d35e | 674 | lcd.printString("Press again",10,2); |
el18gs | 3:9d811414d35e | 675 | lcd.printString("to sell",20,3); |
el18gs | 3:9d811414d35e | 676 | |
el18gs | 3:9d811414d35e | 677 | //wait_ms(50); |
el18gs | 3:9d811414d35e | 678 | |
el18gs | 3:9d811414d35e | 679 | Timer t; |
el18gs | 3:9d811414d35e | 680 | t.start(); |
el18gs | 3:9d811414d35e | 681 | |
el18gs | 3:9d811414d35e | 682 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 683 | bool sell = false; |
el18gs | 3:9d811414d35e | 684 | |
el18gs | 3:9d811414d35e | 685 | while(t.read() <= 5) { |
el18gs | 3:9d811414d35e | 686 | int time = t.read(); |
el18gs | 3:9d811414d35e | 687 | bool changed = false; |
el18gs | 3:9d811414d35e | 688 | if(time == 0) { |
el18gs | 3:9d811414d35e | 689 | lcd.printString("5",60,3); |
el18gs | 3:9d811414d35e | 690 | changed = true; |
el18gs | 3:9d811414d35e | 691 | } else if (time == 1) { |
el18gs | 3:9d811414d35e | 692 | lcd.printString("4",60,3); |
el18gs | 3:9d811414d35e | 693 | changed = true; |
el18gs | 3:9d811414d35e | 694 | } else if (time == 2) { |
el18gs | 3:9d811414d35e | 695 | lcd.printString("3",60,3); |
el18gs | 3:9d811414d35e | 696 | changed = true; |
el18gs | 3:9d811414d35e | 697 | } else if (time == 3) { |
el18gs | 3:9d811414d35e | 698 | lcd.printString("2",60,3); |
el18gs | 3:9d811414d35e | 699 | changed = true; |
el18gs | 3:9d811414d35e | 700 | } else if (time == 4) { |
el18gs | 3:9d811414d35e | 701 | lcd.printString("1",60,3); |
el18gs | 3:9d811414d35e | 702 | changed = true; |
el18gs | 3:9d811414d35e | 703 | } else if (time == 5) { |
el18gs | 3:9d811414d35e | 704 | lcd.printString("0",60,3); |
el18gs | 3:9d811414d35e | 705 | changed = true; |
el18gs | 3:9d811414d35e | 706 | } |
el18gs | 3:9d811414d35e | 707 | |
el18gs | 3:9d811414d35e | 708 | if(g_buttonX_flag) { |
el18gs | 3:9d811414d35e | 709 | printf("button X pressed\n"); |
el18gs | 3:9d811414d35e | 710 | g_buttonX_flag = 0; |
el18gs | 3:9d811414d35e | 711 | //wait_ms(50); |
el18gs | 3:9d811414d35e | 712 | sell = true; |
el18gs | 3:9d811414d35e | 713 | } |
el18gs | 3:9d811414d35e | 714 | |
el18gs | 3:9d811414d35e | 715 | if(changed) { |
el18gs | 3:9d811414d35e | 716 | lcd.refresh(); |
el18gs | 3:9d811414d35e | 717 | } |
el18gs | 3:9d811414d35e | 718 | |
el18gs | 3:9d811414d35e | 719 | if(sell) { |
el18gs | 3:9d811414d35e | 720 | printf("Exiting to sell\n"); |
el18gs | 3:9d811414d35e | 721 | break; |
el18gs | 3:9d811414d35e | 722 | } |
el18gs | 3:9d811414d35e | 723 | |
el18gs | 3:9d811414d35e | 724 | } |
el18gs | 3:9d811414d35e | 725 | |
el18gs | 3:9d811414d35e | 726 | if(sell) { |
el18gs | 3:9d811414d35e | 727 | printf("Running sell function\n"); |
el18gs | 8:4220d116f17c | 728 | inventory.sell_ghost_by_uid(ghost_fsm[which_ghost_state].uid, sd); |
el18gs | 3:9d811414d35e | 729 | regen_inven = true; |
el18gs | 3:9d811414d35e | 730 | update = true; |
el18gs | 3:9d811414d35e | 731 | //wait_ms(500); |
el18gs | 3:9d811414d35e | 732 | } |
el18gs | 3:9d811414d35e | 733 | |
el18gs | 3:9d811414d35e | 734 | } else if(g_buttonStart_flag) { |
el18gs | 3:9d811414d35e | 735 | g_buttonStart_flag = 0; |
el18gs | 3:9d811414d35e | 736 | return; |
el18gs | 3:9d811414d35e | 737 | } |
el18gs | 3:9d811414d35e | 738 | |
el18gs | 3:9d811414d35e | 739 | } |
el18gs | 2:eaf245af2aae | 740 | |
el18gs | 2:eaf245af2aae | 741 | } |
el18gs | 2:eaf245af2aae | 742 | |
el18gs | 3:9d811414d35e | 743 | std::vector<inven_state> gen_ghost_fsm(Inventory inventory) |
el18gs | 2:eaf245af2aae | 744 | { |
el18gs | 3:9d811414d35e | 745 | std::vector<inven_state> ghost_fsm; |
el18gs | 3:9d811414d35e | 746 | |
el18gs | 3:9d811414d35e | 747 | std::vector<int> uids = inventory.list_ghost_uids(); |
el18gs | 3:9d811414d35e | 748 | |
el18gs | 3:9d811414d35e | 749 | sort(uids.begin(), uids.end()); |
el18gs | 3:9d811414d35e | 750 | |
el18gs | 3:9d811414d35e | 751 | for(int i = 0; i < uids.size(); i++) { |
el18gs | 3:9d811414d35e | 752 | Ghost ghost_temp = inventory.get_ghost_by_uid(uids[i]); |
el18gs | 3:9d811414d35e | 753 | inven_state temp; |
el18gs | 3:9d811414d35e | 754 | temp.uid = ghost_temp.get_uid(); |
el18gs | 3:9d811414d35e | 755 | temp.name = ghost_temp.get_name(); |
el18gs | 3:9d811414d35e | 756 | temp.type = ghost_temp.get_type_string(); |
el18gs | 3:9d811414d35e | 757 | temp.attack = ghost_temp.get_attack(); |
el18gs | 3:9d811414d35e | 758 | temp.defense = ghost_temp.get_defense(); |
el18gs | 3:9d811414d35e | 759 | temp.level = ghost_temp.get_level(); |
el18gs | 3:9d811414d35e | 760 | temp.xp = ghost_temp.get_xp(); |
el18gs | 3:9d811414d35e | 761 | temp.value = ghost_temp.get_value(); |
el18gs | 3:9d811414d35e | 762 | temp.hp_max = ghost_temp.get_hp_max(); |
el18gs | 3:9d811414d35e | 763 | temp.hp = ghost_temp.get_hp(); |
el18gs | 3:9d811414d35e | 764 | |
el18gs | 3:9d811414d35e | 765 | ghost_fsm.push_back(temp); |
el18gs | 3:9d811414d35e | 766 | //printf("Added Ghost UID %i to fsm\n", temp.uid); |
el18gs | 3:9d811414d35e | 767 | printf("%s\n", temp.name.c_str()); |
el18gs | 3:9d811414d35e | 768 | } |
el18gs | 3:9d811414d35e | 769 | |
el18gs | 3:9d811414d35e | 770 | for(int i = 0; i < ghost_fsm.size(); i++) { |
el18gs | 3:9d811414d35e | 771 | if (i == 0) { |
el18gs | 3:9d811414d35e | 772 | int next[2] = {1, ghost_fsm.size() - 1}; |
el18gs | 3:9d811414d35e | 773 | ghost_fsm[i].next[0] = next[0]; |
el18gs | 3:9d811414d35e | 774 | ghost_fsm[i].next[1] = next[1]; |
el18gs | 3:9d811414d35e | 775 | } else if (i == ghost_fsm.size() - 1) { |
el18gs | 3:9d811414d35e | 776 | int next[2] = {0, ghost_fsm.size() - 2}; |
el18gs | 3:9d811414d35e | 777 | ghost_fsm[i].next[0] = next[0]; |
el18gs | 3:9d811414d35e | 778 | ghost_fsm[i].next[1] = next[1]; |
el18gs | 3:9d811414d35e | 779 | } else { |
el18gs | 3:9d811414d35e | 780 | int next[2] = {i + 1, i - 1}; |
el18gs | 3:9d811414d35e | 781 | ghost_fsm[i].next[0] = next[0]; |
el18gs | 3:9d811414d35e | 782 | ghost_fsm[i].next[1] = next[1]; |
el18gs | 3:9d811414d35e | 783 | } |
el18gs | 3:9d811414d35e | 784 | } |
el18gs | 3:9d811414d35e | 785 | |
el18gs | 3:9d811414d35e | 786 | return ghost_fsm; |
el18gs | 2:eaf245af2aae | 787 | } |
el18gs | 2:eaf245af2aae | 788 | |
el18gs | 2:eaf245af2aae | 789 | |
el18gs | 2:eaf245af2aae | 790 | int** import_sprite(std::string file) |
el18gs | 2:eaf245af2aae | 791 | { |
el18gs | 2:eaf245af2aae | 792 | FILE *fp; // this is our file pointer |
el18gs | 2:eaf245af2aae | 793 | |
el18gs | 2:eaf245af2aae | 794 | // the previous example just read the values into variables and printed to |
el18gs | 2:eaf245af2aae | 795 | // serial, we'll now read files into an array. |
el18gs | 2:eaf245af2aae | 796 | |
el18gs | 2:eaf245af2aae | 797 | // now open file for reading...note the 'r' |
el18gs | 2:eaf245af2aae | 798 | fp = fopen(file.c_str(), "r"); |
el18gs | 2:eaf245af2aae | 799 | |
el18gs | 2:eaf245af2aae | 800 | |
el18gs | 2:eaf245af2aae | 801 | int n=0; // going to store the number of lines in the file |
el18gs | 2:eaf245af2aae | 802 | stringvec values; |
el18gs | 2:eaf245af2aae | 803 | |
el18gs | 2:eaf245af2aae | 804 | if (fp == NULL) { // if it can't open the file then print error message |
el18gs | 2:eaf245af2aae | 805 | printf("Error! Unable to open file: %s\n", file.c_str()); |
el18gs | 2:eaf245af2aae | 806 | listdir(); |
el18gs | 2:eaf245af2aae | 807 | } else { |
el18gs | 2:eaf245af2aae | 808 | //Since we may not know the |
el18gs | 2:eaf245af2aae | 809 | // number of lines in the files ahead of time, we'll first count them |
el18gs | 2:eaf245af2aae | 810 | // * means scan but don't save |
el18gs | 2:eaf245af2aae | 811 | int max_len_tmp = 0; |
el18gs | 2:eaf245af2aae | 812 | int max_len = 0; |
el18gs | 2:eaf245af2aae | 813 | |
el18gs | 2:eaf245af2aae | 814 | while (fscanf(fp, "%*i%n", &max_len_tmp) != EOF) { |
el18gs | 2:eaf245af2aae | 815 | n++; // increment counter when read a line |
el18gs | 2:eaf245af2aae | 816 | if(max_len_tmp > max_len) { |
el18gs | 2:eaf245af2aae | 817 | max_len = max_len_tmp; |
el18gs | 2:eaf245af2aae | 818 | } |
el18gs | 2:eaf245af2aae | 819 | } |
el18gs | 2:eaf245af2aae | 820 | |
el18gs | 2:eaf245af2aae | 821 | max_len--; |
el18gs | 2:eaf245af2aae | 822 | |
el18gs | 2:eaf245af2aae | 823 | rewind(fp); // 'scrolled' to end of file, so go back to beginning |
el18gs | 2:eaf245af2aae | 824 | |
el18gs | 2:eaf245af2aae | 825 | char buffer[n][max_len]; |
el18gs | 2:eaf245af2aae | 826 | |
el18gs | 2:eaf245af2aae | 827 | for(int i = 0; i < n; i++) { |
el18gs | 2:eaf245af2aae | 828 | fscanf(fp, "%s", &buffer[i][0]); |
el18gs | 2:eaf245af2aae | 829 | } |
el18gs | 2:eaf245af2aae | 830 | |
el18gs | 2:eaf245af2aae | 831 | int** sprite = 0; |
el18gs | 2:eaf245af2aae | 832 | sprite = new int*[n]; |
el18gs | 2:eaf245af2aae | 833 | for(int i = 0; i < n; i++) { |
el18gs | 2:eaf245af2aae | 834 | sprite[i] = new int[max_len]; |
el18gs | 2:eaf245af2aae | 835 | } |
el18gs | 2:eaf245af2aae | 836 | |
el18gs | 2:eaf245af2aae | 837 | for(int i = 0; i < n; i++) { |
el18gs | 2:eaf245af2aae | 838 | //printf("%s\n", buffer[i]); |
el18gs | 2:eaf245af2aae | 839 | for(int j = 0; j < max_len; j++) { |
el18gs | 2:eaf245af2aae | 840 | if((int)buffer[i][j] == 48) { |
el18gs | 2:eaf245af2aae | 841 | sprite[i][j] = 0; |
el18gs | 2:eaf245af2aae | 842 | } else if((int) buffer[i][j] == 49) { |
el18gs | 2:eaf245af2aae | 843 | sprite[i][j] = 1; |
el18gs | 2:eaf245af2aae | 844 | } |
el18gs | 2:eaf245af2aae | 845 | } |
el18gs | 2:eaf245af2aae | 846 | } |
el18gs | 2:eaf245af2aae | 847 | |
el18gs | 2:eaf245af2aae | 848 | fclose(fp); // ensure you close the file after reading |
el18gs | 2:eaf245af2aae | 849 | |
el18gs | 2:eaf245af2aae | 850 | return sprite; |
el18gs | 2:eaf245af2aae | 851 | |
el18gs | 2:eaf245af2aae | 852 | } |
el18gs | 2:eaf245af2aae | 853 | |
el18gs | 2:eaf245af2aae | 854 | return 0; |
el18gs | 2:eaf245af2aae | 855 | } |
el18gs | 2:eaf245af2aae | 856 | |
el18gs | 2:eaf245af2aae | 857 | void listdir(void) |
el18gs | 2:eaf245af2aae | 858 | { |
el18gs | 2:eaf245af2aae | 859 | DIR *d; |
el18gs | 2:eaf245af2aae | 860 | struct dirent *p; |
el18gs | 2:eaf245af2aae | 861 | |
el18gs | 2:eaf245af2aae | 862 | d = opendir("/sd/assets"); |
el18gs | 2:eaf245af2aae | 863 | if (d != NULL) { |
el18gs | 2:eaf245af2aae | 864 | while ((p = readdir(d)) != NULL) { |
el18gs | 2:eaf245af2aae | 865 | printf(" - %s\n", p->d_name); |
el18gs | 2:eaf245af2aae | 866 | } |
el18gs | 2:eaf245af2aae | 867 | } else { |
el18gs | 2:eaf245af2aae | 868 | printf("Could not open directory!\n"); |
el18gs | 2:eaf245af2aae | 869 | } |
el18gs | 2:eaf245af2aae | 870 | closedir(d); |
el18gs | 2:eaf245af2aae | 871 | } |
el18gs | 2:eaf245af2aae | 872 | |
el18gs | 2:eaf245af2aae | 873 | stringvec list_ghosts() |
el18gs | 2:eaf245af2aae | 874 | { |
el18gs | 2:eaf245af2aae | 875 | // Connections to SD card holder on K64F (SPI interface) |
el18gs | 4:2e8d7c6d2953 | 876 | //SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); // MOSI, MISO, SCK, CS |
el18gs | 2:eaf245af2aae | 877 | std::string path = "/sd/ghosts"; |
el18gs | 2:eaf245af2aae | 878 | printf("Listing directory: %s\n", path.c_str()); |
el18gs | 2:eaf245af2aae | 879 | DIR *d; |
el18gs | 2:eaf245af2aae | 880 | struct dirent *p; |
el18gs | 2:eaf245af2aae | 881 | |
el18gs | 2:eaf245af2aae | 882 | stringvec files; |
el18gs | 2:eaf245af2aae | 883 | |
el18gs | 2:eaf245af2aae | 884 | d = opendir(path.c_str()); |
el18gs | 2:eaf245af2aae | 885 | if (d != NULL) { |
el18gs | 2:eaf245af2aae | 886 | while ((p = readdir(d)) != NULL) { |
el18gs | 2:eaf245af2aae | 887 | files.push_back(p->d_name); |
el18gs | 2:eaf245af2aae | 888 | } |
el18gs | 2:eaf245af2aae | 889 | } else { |
el18gs | 2:eaf245af2aae | 890 | printf("Could not open directory!\n"); |
el18gs | 2:eaf245af2aae | 891 | } |
el18gs | 2:eaf245af2aae | 892 | closedir(d); |
el18gs | 2:eaf245af2aae | 893 | |
el18gs | 2:eaf245af2aae | 894 | stringvec correct_files; |
el18gs | 2:eaf245af2aae | 895 | |
el18gs | 2:eaf245af2aae | 896 | for(int i = 0; i < files.size(); i++) { |
el18gs | 2:eaf245af2aae | 897 | if(hasEnding(files[i], ".ghost")) { |
el18gs | 2:eaf245af2aae | 898 | correct_files.push_back(files[i]); |
el18gs | 2:eaf245af2aae | 899 | } |
el18gs | 2:eaf245af2aae | 900 | } |
el18gs | 3:9d811414d35e | 901 | |
el18gs | 2:eaf245af2aae | 902 | return correct_files; |
el18gs | 2:eaf245af2aae | 903 | } |
el18gs | 2:eaf245af2aae | 904 | |
el18gs | 3:9d811414d35e | 905 | |
el18gs | 3:9d811414d35e | 906 | // Function taken from https://stackoverflow.com/a/874160/10436605 |
el18gs | 3:9d811414d35e | 907 | bool hasEnding (std::string const &fullString, std::string const &ending) |
el18gs | 3:9d811414d35e | 908 | { |
el18gs | 3:9d811414d35e | 909 | if (fullString.length() >= ending.length()) { |
el18gs | 3:9d811414d35e | 910 | return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending)); |
el18gs | 3:9d811414d35e | 911 | } else { |
el18gs | 3:9d811414d35e | 912 | return false; |
el18gs | 3:9d811414d35e | 913 | } |
el18gs | 3:9d811414d35e | 914 | } |
el18gs | 3:9d811414d35e | 915 | |
el18gs | 2:eaf245af2aae | 916 | void int_to_bin_digit(unsigned int in, int count, int* out) |
el18gs | 2:eaf245af2aae | 917 | { |
el18gs | 2:eaf245af2aae | 918 | /* assert: count <= sizeof(int)*CHAR_BIT */ |
el18gs | 2:eaf245af2aae | 919 | unsigned int mask = 1U << (count-1); |
el18gs | 2:eaf245af2aae | 920 | int i; |
el18gs | 2:eaf245af2aae | 921 | for (i = 0; i < count; i++) { |
el18gs | 2:eaf245af2aae | 922 | out[i] = (in & mask) ? 1 : 0; |
el18gs | 2:eaf245af2aae | 923 | in <<= 1; |
el18gs | 2:eaf245af2aae | 924 | } |
el18gs | 2:eaf245af2aae | 925 | } |
el18gs | 2:eaf245af2aae | 926 | |
el18gs | 3:9d811414d35e | 927 | |
el18gs | 2:eaf245af2aae | 928 | // Button A event-triggered interrupt |
el18gs | 2:eaf245af2aae | 929 | void buttonX_isr() |
el18gs | 2:eaf245af2aae | 930 | { |
el18gs | 2:eaf245af2aae | 931 | g_buttonX_flag = 1; // set flag in ISR |
el18gs | 3:9d811414d35e | 932 | if(!g_buttonTesting) { |
el18gs | 3:9d811414d35e | 933 | wait_ms(g_button_sesnsitivity); |
el18gs | 3:9d811414d35e | 934 | } else { |
el18gs | 3:9d811414d35e | 935 | wait_ms(g_buttonSensitivityTest); |
el18gs | 3:9d811414d35e | 936 | } |
el18gs | 2:eaf245af2aae | 937 | } |
el18gs | 2:eaf245af2aae | 938 | |
el18gs | 2:eaf245af2aae | 939 | // Button A event-triggered interrupt |
el18gs | 2:eaf245af2aae | 940 | void buttonA_isr() |
el18gs | 2:eaf245af2aae | 941 | { |
el18gs | 2:eaf245af2aae | 942 | g_buttonA_flag = 1; // set flag in ISR |
el18gs | 3:9d811414d35e | 943 | wait_ms(g_button_sesnsitivity); |
el18gs | 2:eaf245af2aae | 944 | } |
el18gs | 2:eaf245af2aae | 945 | |
el18gs | 2:eaf245af2aae | 946 | // Button A event-triggered interrupt |
el18gs | 2:eaf245af2aae | 947 | void buttonB_isr() |
el18gs | 2:eaf245af2aae | 948 | { |
el18gs | 2:eaf245af2aae | 949 | g_buttonB_flag = 1; // set flag in ISR |
el18gs | 3:9d811414d35e | 950 | wait_ms(g_button_sesnsitivity); |
el18gs | 3:9d811414d35e | 951 | } |
el18gs | 3:9d811414d35e | 952 | |
el18gs | 3:9d811414d35e | 953 | // Button A event-triggered interrupt |
el18gs | 3:9d811414d35e | 954 | void buttonY_isr() |
el18gs | 3:9d811414d35e | 955 | { |
el18gs | 3:9d811414d35e | 956 | g_buttonY_flag = 1; // set flag in ISR |
el18gs | 3:9d811414d35e | 957 | wait_ms(g_button_sesnsitivity); |
el18gs | 3:9d811414d35e | 958 | } |
el18gs | 3:9d811414d35e | 959 | |
el18gs | 3:9d811414d35e | 960 | // Button A event-triggered interrupt |
el18gs | 3:9d811414d35e | 961 | void buttonStart_isr() |
el18gs | 3:9d811414d35e | 962 | { |
el18gs | 3:9d811414d35e | 963 | g_buttonStart_flag = 1; // set flag in ISR |
el18gs | 3:9d811414d35e | 964 | wait_ms(g_button_sesnsitivity); |
el18gs | 2:eaf245af2aae | 965 | } |