My ELEC2645 joystick project Tetris Game NAME: JIANWEI CHEN SID: 200879849
Dependencies: N5110 SDFileSystem mbed
main.h
- Committer:
- cjw851102
- Date:
- 2016-05-05
- Revision:
- 4:463abe5f5135
File content as of revision 4:463abe5f5135:
/** @file main.h @brief Header file containing functions prototypes, defines and global variables for menu and pointer @brief Menu is construct using finit state mechine. @brief The input for finit state mechine is the positer position. @brief Revision 1.0. @author JIANWEI CHEN @date May 2016 */ #ifndef MAIN_H #define MAIN_H #include "mbed.h" // VCC, SCE, RST, D/C, MOSI,SCLK, LED N5110 lcd(PTE26,PTA0,PTC4,PTD0,PTD2,PTD1,PTC3); // MOSI, MISO, SCK, CS SDFileSystem sd(PTE3, PTE1, PTE2, PTE4, "sd"); FILE *fp; /*!< File pointer */ DigitalOut red_led(PTA1); DigitalOut green_led(PTC2); InterruptIn button(PTB18); PwmOut buzzer (PTA2); //////////////////////////////////////////////////////// // Variables //////////////////////////////////////////////////////// /** Create ticker object for menu @brief ticker to control the speed of updating the menu */ Ticker menuTimer; volatile int g_menuTimer_flag = 0; /*!< Flag for menu ticker */ volatile int g_button_flag = 0; /*!< Flag for button interrupt */ /**State of menu @brief Variable control the state of menu @note state 0 - main menu @note state 1 - game level choosing menu @note state 2 - show highest score menu @note state 3 - game with easy level @note state 4 - game with hard level */ int state=0; int pointer_position=0;/*!< Variable control the position of pointer */ /**struct for state */ struct State { int nextState[3]; // array of next states }; typedef const struct State STyp; STyp fsm[5] = { {1,2,0}, // states chosen according to inputs(pointer position) {3,4,0}, {0,0,0}, {0,0,0}, {0,0,0} }; ////////////////////////////////////////////////////////////////// // Functions ////////////////////////////////////////////////////////////////// /** Menu isr function */ void menuTimer_isr(); /** Initialise the program and lcd, mbed initial settings */ void init(); /** Button interrupt isr function */ void button_isr(); /**Drawing the pointer at (x,y) @brief Drawing the pointer image at (x,y) according to inputs @param x - x co-ordinate of lcd @param y - y co-ordinate of lcd @param fill - fill = 0 white, fill = 1 black */ void pointer_image(int x,int y,int fill);//0-white 1-black /** Move the pointer @brief Function to control the pointer according to joystick */ void pointer(); ///////////////////////////////////////////////// /// Function Definitions ///////////////////////////////////////////////// void menuTimer_isr() { g_menuTimer_flag = 1; } void button_isr() { g_button_flag=1; } void pointer() { updateJoystick(); // get joystick direction if (joystick.direction==UP) { if(pointer_position==0) { // pointer at the top pointer_position=0; } else { pointer_position--; } } else if(joystick.direction==DOWN) { if(pointer_position==1&&(state!=1)) { //only game level choosing menu have 3 pointer positions pointer_position=1; } else if (pointer_position==2&&(state==1)) { pointer_position=2; } else { pointer_position++; } } if(pointer_position==0) { pointer_image(10,27,1); // draw pointer pointer_image(10,35,0); // clear pointer at other positions pointer_image(10,43,0); } else if(pointer_position==1) { pointer_image(10,27,0); pointer_image(10,35,1); pointer_image(10,43,0); } else if(pointer_position==2) { pointer_image(10,35,0); pointer_image(10,43,1); } } void pointer_image(int x,int y,int fill) { if(fill==0) {// draw white pointer lcd.drawLine(x,y,x-4,y+2,0); lcd.drawLine(x,y,x-4,y-2,0); } else { // draw black pointer lcd.drawLine(x,y,x-4,y-2,1); lcd.drawLine(x,y,x-4,y+2,1); } } void init(){ wait(2.0); // short delay for power to settle // initialise sd card fp = fopen("/sd/topscore.txt", "r"); fclose(fp); // ensure you close the file after reading lcd.init(); // initialise lcd lcd.normalMode(); // normal colour mode lcd.setBrightness(1.0); // put LED backlight on 100% lcd.printString("Calibrating",0,0); lcd.printString("Joystick........",0,1); lcd.printString("PLEASE DO NOT",0,3); lcd.printString("MOVE JOYSTICK.....",0,4); lcd.refresh(); calibrateJoystick(); wait(4.0); lcd.clear(); lcd.refresh(); button.mode(PullDown); red_led=0; green_led=0; button.fall(&button_isr); menuTimer.attach(&menuTimer_isr,0.1); // attach menu ticker buzzer.period(1.0/4000.0); // set buzzer period to 4 kKz } #endif