
This project is a DIY mbed version of your favorite childhood game
Dependencies: mbed 4DGL-uLCD-SE LCD_fonts SDFileSystem MMA8452
main.cpp@0:bce994168592, 2019-04-14 (annotated)
- Committer:
- aklaussen
- Date:
- Sun Apr 14 01:39:35 2019 +0000
- Revision:
- 0:bce994168592
publish working code;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
aklaussen | 0:bce994168592 | 1 | #include "mbed.h" |
aklaussen | 0:bce994168592 | 2 | #include "stdio.h" |
aklaussen | 0:bce994168592 | 3 | #include "uLCD_4DGL.h" |
aklaussen | 0:bce994168592 | 4 | #include "menu.h" |
aklaussen | 0:bce994168592 | 5 | #include "RPG.h" |
aklaussen | 0:bce994168592 | 6 | #include "CursorController.h" |
aklaussen | 0:bce994168592 | 7 | #include "math.h" |
aklaussen | 0:bce994168592 | 8 | #include "MMA8452.h" |
aklaussen | 0:bce994168592 | 9 | #include "SaveFile.h" |
aklaussen | 0:bce994168592 | 10 | #include "stdlib.h" |
aklaussen | 0:bce994168592 | 11 | #include "SDFileSystem.h" |
aklaussen | 0:bce994168592 | 12 | |
aklaussen | 0:bce994168592 | 13 | uLCD_4DGL uLCD(p13, p14, p15); // serial tx, serial rx, reset pin; |
aklaussen | 0:bce994168592 | 14 | SDFileSystem sd(p5, p6, p7, p8, "sd"); |
aklaussen | 0:bce994168592 | 15 | Serial pc(USBTX, USBRX); |
aklaussen | 0:bce994168592 | 16 | |
aklaussen | 0:bce994168592 | 17 | BusIn bus1(p21, p22); |
aklaussen | 0:bce994168592 | 18 | BusIn bus2(p23, p18); |
aklaussen | 0:bce994168592 | 19 | BusIn bus3(p17, p16); |
aklaussen | 0:bce994168592 | 20 | int color; |
aklaussen | 0:bce994168592 | 21 | |
aklaussen | 0:bce994168592 | 22 | DigitalOut connectionLed(LED1); |
aklaussen | 0:bce994168592 | 23 | |
aklaussen | 0:bce994168592 | 24 | double x, y, z, accMag; |
aklaussen | 0:bce994168592 | 25 | |
aklaussen | 0:bce994168592 | 26 | MMA8452 acc(p28, p27, 100000); |
aklaussen | 0:bce994168592 | 27 | |
aklaussen | 0:bce994168592 | 28 | CursorController c; |
aklaussen | 0:bce994168592 | 29 | //intialize knobs |
aklaussen | 0:bce994168592 | 30 | AnalogIn left_pot(p20); |
aklaussen | 0:bce994168592 | 31 | AnalogIn right_pot(p19); |
aklaussen | 0:bce994168592 | 32 | InterruptIn push_button(p25, PullUp); |
aklaussen | 0:bce994168592 | 33 | |
aklaussen | 0:bce994168592 | 34 | volatile bool pushed = false; |
aklaussen | 0:bce994168592 | 35 | |
aklaussen | 0:bce994168592 | 36 | void button_cb() { |
aklaussen | 0:bce994168592 | 37 | pushed = true; |
aklaussen | 0:bce994168592 | 38 | } |
aklaussen | 0:bce994168592 | 39 | |
aklaussen | 0:bce994168592 | 40 | std::string endLabel; |
aklaussen | 0:bce994168592 | 41 | int game_mode = 1; |
aklaussen | 0:bce994168592 | 42 | |
aklaussen | 0:bce994168592 | 43 | DigitalOut led1(LED1); |
aklaussen | 0:bce994168592 | 44 | DigitalOut led4(LED4); |
aklaussen | 0:bce994168592 | 45 | |
aklaussen | 0:bce994168592 | 46 | void new_game() |
aklaussen | 0:bce994168592 | 47 | { |
aklaussen | 0:bce994168592 | 48 | uLCD.background_color(BLACK); |
aklaussen | 0:bce994168592 | 49 | uLCD.cls(); |
aklaussen | 0:bce994168592 | 50 | } |
aklaussen | 0:bce994168592 | 51 | |
aklaussen | 0:bce994168592 | 52 | void load_game(std::string fileName) |
aklaussen | 0:bce994168592 | 53 | { |
aklaussen | 0:bce994168592 | 54 | uLCD.cls(); |
aklaussen | 0:bce994168592 | 55 | std::string base = "/sd/"; |
aklaussen | 0:bce994168592 | 56 | read_image((base.append(fileName)).c_str()); |
aklaussen | 0:bce994168592 | 57 | } |
aklaussen | 0:bce994168592 | 58 | |
aklaussen | 0:bce994168592 | 59 | void save_game() |
aklaussen | 0:bce994168592 | 60 | { |
aklaussen | 0:bce994168592 | 61 | save_image(); |
aklaussen | 0:bce994168592 | 62 | } |
aklaussen | 0:bce994168592 | 63 | |
aklaussen | 0:bce994168592 | 64 | int main() |
aklaussen | 0:bce994168592 | 65 | { |
aklaussen | 0:bce994168592 | 66 | uLCD.cls(); |
aklaussen | 0:bce994168592 | 67 | uLCD.baudrate(3000000); //jack up baud rate to max for fast display |
aklaussen | 0:bce994168592 | 68 | // |
aklaussen | 0:bce994168592 | 69 | int lastX, lastY, X, Y; |
aklaussen | 0:bce994168592 | 70 | lastX = c.getX(); lastY = c.getY(); |
aklaussen | 0:bce994168592 | 71 | wait(.5); |
aklaussen | 0:bce994168592 | 72 | |
aklaussen | 0:bce994168592 | 73 | bus1.mode(PullUp); |
aklaussen | 0:bce994168592 | 74 | bus2.mode(PullUp); |
aklaussen | 0:bce994168592 | 75 | bus3.mode(PullUp); |
aklaussen | 0:bce994168592 | 76 | |
aklaussen | 0:bce994168592 | 77 | |
aklaussen | 0:bce994168592 | 78 | while(true) { |
aklaussen | 0:bce994168592 | 79 | if (game_mode == 0) { |
aklaussen | 0:bce994168592 | 80 | while (1) { |
aklaussen | 0:bce994168592 | 81 | |
aklaussen | 0:bce994168592 | 82 | X = c.getX(); Y = c.getY(); |
aklaussen | 0:bce994168592 | 83 | uLCD.line(lastX, lastY, X, Y, color); |
aklaussen | 0:bce994168592 | 84 | //printf("Drew a line from (%d,%d) to (%d, %d)\r\n", lastX, lastY, X, Y); |
aklaussen | 0:bce994168592 | 85 | lastX = X; lastY = Y; |
aklaussen | 0:bce994168592 | 86 | |
aklaussen | 0:bce994168592 | 87 | |
aklaussen | 0:bce994168592 | 88 | // 5. read the dip switches |
aklaussen | 0:bce994168592 | 89 | // 6. bit math that into three color values (top 2 bits of each color) |
aklaussen | 0:bce994168592 | 90 | // 7. update the color variables |
aklaussen | 0:bce994168592 | 91 | |
aklaussen | 0:bce994168592 | 92 | color = 0; |
aklaussen | 0:bce994168592 | 93 | color |= (bus1 * 64); |
aklaussen | 0:bce994168592 | 94 | color |= (bus2 * 64 * 2*2*2*2*2*2*2*2); |
aklaussen | 0:bce994168592 | 95 | color |= (bus3 * 64 * 2*2*2*2*2*2*2*2 * 2*2*2*2*2*2*2*2); |
aklaussen | 0:bce994168592 | 96 | // pc.printf("color: %x\r\n", color); |
aklaussen | 0:bce994168592 | 97 | |
aklaussen | 0:bce994168592 | 98 | // 8. read the IMU |
aklaussen | 0:bce994168592 | 99 | // 9. decide if the acceleration magnitude is great enough to clear |
aklaussen | 0:bce994168592 | 100 | // todo: debounce??? |
aklaussen | 0:bce994168592 | 101 | // 10. if so, clear LCD screen |
aklaussen | 0:bce994168592 | 102 | acc.readXYZGravity(&x,&y,&z); |
aklaussen | 0:bce994168592 | 103 | accMag = sqrt(x*x + y*y + z*z); |
aklaussen | 0:bce994168592 | 104 | if(accMag > 2.5) { |
aklaussen | 0:bce994168592 | 105 | uLCD.cls(); |
aklaussen | 0:bce994168592 | 106 | } |
aklaussen | 0:bce994168592 | 107 | |
aklaussen | 0:bce994168592 | 108 | if (pushed) { |
aklaussen | 0:bce994168592 | 109 | wait(0.5); |
aklaussen | 0:bce994168592 | 110 | pushed = false; |
aklaussen | 0:bce994168592 | 111 | // write image to SD card |
aklaussen | 0:bce994168592 | 112 | save_game(); |
aklaussen | 0:bce994168592 | 113 | game_mode = 1; |
aklaussen | 0:bce994168592 | 114 | break; |
aklaussen | 0:bce994168592 | 115 | } |
aklaussen | 0:bce994168592 | 116 | } |
aklaussen | 0:bce994168592 | 117 | } else { |
aklaussen | 0:bce994168592 | 118 | uLCD.background_color(BLACK); |
aklaussen | 0:bce994168592 | 119 | uLCD.cls(); |
aklaussen | 0:bce994168592 | 120 | pc.printf("Initializing menu...\r\n"); |
aklaussen | 0:bce994168592 | 121 | push_button.fall(&button_cb); |
aklaussen | 0:bce994168592 | 122 | Menu* main_menu = new Menu(); |
aklaussen | 0:bce994168592 | 123 | main_menu->add_child(new Menu("END", "Start New")); |
aklaussen | 0:bce994168592 | 124 | main_menu->add_child(new Menu("menu1", "Load Picture")); |
aklaussen | 0:bce994168592 | 125 | // connect to file system |
aklaussen | 0:bce994168592 | 126 | // build menu tree |
aklaussen | 0:bce994168592 | 127 | main_menu->entries[1]->add_child(new Menu("sm1", "Go Back", Menu::go_back)); |
aklaussen | 0:bce994168592 | 128 | char buffer [9000]; |
aklaussen | 0:bce994168592 | 129 | for (int i = 0; i < get_highest_number(read_file_names()); i++) { |
aklaussen | 0:bce994168592 | 130 | sprintf(buffer, "%d", i); |
aklaussen | 0:bce994168592 | 131 | pc.printf("adding file %d", i); |
aklaussen | 0:bce994168592 | 132 | std::string filename = buffer; |
aklaussen | 0:bce994168592 | 133 | main_menu->entries[1]->add_child(new Menu("END", buffer)); |
aklaussen | 0:bce994168592 | 134 | } |
aklaussen | 0:bce994168592 | 135 | main_menu->set_active(); |
aklaussen | 0:bce994168592 | 136 | endLabel = Menu::run(); |
aklaussen | 0:bce994168592 | 137 | pc.printf("menu terminated with message: \r\n"); |
aklaussen | 0:bce994168592 | 138 | pc.printf(endLabel.c_str()); |
aklaussen | 0:bce994168592 | 139 | pc.printf("\r\n"); |
aklaussen | 0:bce994168592 | 140 | |
aklaussen | 0:bce994168592 | 141 | if (endLabel == "Start New") { |
aklaussen | 0:bce994168592 | 142 | new_game(); |
aklaussen | 0:bce994168592 | 143 | } |
aklaussen | 0:bce994168592 | 144 | else { |
aklaussen | 0:bce994168592 | 145 | load_game(endLabel); |
aklaussen | 0:bce994168592 | 146 | } |
aklaussen | 0:bce994168592 | 147 | game_mode = 0; //start game |
aklaussen | 0:bce994168592 | 148 | } |
aklaussen | 0:bce994168592 | 149 | } |
aklaussen | 0:bce994168592 | 150 | } |