This project is a DIY mbed version of your favorite childhood game

Dependencies:   mbed 4DGL-uLCD-SE LCD_fonts SDFileSystem MMA8452

Committer:
aklaussen
Date:
Sun Apr 14 01:39:35 2019 +0000
Revision:
0:bce994168592
publish working code;

Who changed what in which revision?

UserRevisionLine numberNew 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 }