Assignment 5 for OCE360, timers, tickers, and interrupts.

Dependencies:   4DGL-uLCD-SE MMA8452Q SDFileSystem bouncing_ball mbed

Fork of OCE360_4 by OCE_360

Committer:
rsean10
Date:
Thu Nov 09 16:01:24 2017 +0000
Revision:
7:614b40b85579
Parent:
6:050104c0dc75
Child:
8:2617100c441d
Interrupt added, non-functioning, attempting comment blocking to find error

Who changed what in which revision?

UserRevisionLine numberNew contents of line
slicht 2:552e6feb8709 1 // A solution to OCE360 Homework #4.
slicht 2:552e6feb8709 2 // Objective: Use object oriented programming to create a system that displays
slicht 2:552e6feb8709 3 // multiple balls bouncing around the LCD screen.
slicht 3:a7f02754bc99 4 // Stephen Licht, 11/7/2017
slicht 1:6b99ffa62cc8 5
slicht 0:8d3812068c6c 6 #include "mbed.h"
slicht 2:552e6feb8709 7 #include "MMA8452Q.h" //acceleromater library
slicht 2:552e6feb8709 8 #include "uLCD_4DGL.h" //LCD library
slicht 2:552e6feb8709 9 #include "bouncing_ball.h" //new ball phyics library
slicht 1:6b99ffa62cc8 10
slicht 2:552e6feb8709 11 #define UPDATE_TIME_S 0.02
slicht 2:552e6feb8709 12 #define START_X_1 10
slicht 2:552e6feb8709 13 #define START_Y_1 10
slicht 2:552e6feb8709 14 #define START_X_2 20
slicht 2:552e6feb8709 15 #define START_Y_2 20
slicht 2:552e6feb8709 16 #define RADIUS_1 6
slicht 2:552e6feb8709 17 #define RADIUS_2 3
slicht 0:8d3812068c6c 18
slicht 2:552e6feb8709 19 #define DEBUG_MODE 0
slicht 2:552e6feb8709 20
rsean10 6:050104c0dc75 21 #define LCD_UPDATE .091 //11 Hz
rsean10 6:050104c0dc75 22 #define DRAW_UPDATE 0.075
rsean10 5:93f88deda5ba 23
rsean10 5:93f88deda5ba 24 //Initialize Serial communication
rsean10 5:93f88deda5ba 25 Serial pc(USBTX, USBRX);
rsean10 5:93f88deda5ba 26
rsean10 6:050104c0dc75 27 //Led Initialization
rsean10 6:050104c0dc75 28 DigitalOut led1(LED1); //update leds
rsean10 6:050104c0dc75 29 DigitalOut led2(LED2);
rsean10 7:614b40b85579 30 DigitalOut led3(LED3);
rsean10 6:050104c0dc75 31
rsean10 7:614b40b85579 32 //Toggle Initialization
rsean10 7:614b40b85579 33 InterruptIn button(p13); //Interrupt on the button on pin 13
rsean10 7:614b40b85579 34 Timer debounce; //defines debounce timer for proper switching
rsean10 7:614b40b85579 35
rsean10 7:614b40b85579 36 void toggle(){
rsean10 7:614b40b85579 37 if(debounce.read_ms()>175){
rsean10 7:614b40b85579 38 led3=!led3;
rsean10 7:614b40b85579 39 debounce.reset(); //restart timer after toggle occurs
rsean10 7:614b40b85579 40 }
rsean10 7:614b40b85579 41 }
rsean10 6:050104c0dc75 42
slicht 2:552e6feb8709 43 //Function prototype for color selection function:
slicht 2:552e6feb8709 44 int get_LCD_color(int color_integer);
slicht 1:6b99ffa62cc8 45
slicht 1:6b99ffa62cc8 46 // Graphic LCD - TX, RX, and RES pins
slicht 2:552e6feb8709 47 uLCD_4DGL uLCD(p9,p10,p11); //initialize a driver object for an LCD connected on pins 9-11
slicht 1:6b99ffa62cc8 48
slicht 1:6b99ffa62cc8 49 // Accelerometer - SDA, SCL, and I2C address
slicht 2:552e6feb8709 50 MMA8452Q accel(p28, p27, 0x1D); //initialize a driver object for an accelerometer connected on pins 27-28.
slicht 1:6b99ffa62cc8 51
slicht 2:552e6feb8709 52 physics_ball ball1; //initialize two balls for bouncing
slicht 2:552e6feb8709 53 physics_ball ball2; //the default states from the library will be used initially
slicht 0:8d3812068c6c 54
rsean10 5:93f88deda5ba 55 //Ticker for logging
rsean10 6:050104c0dc75 56 Ticker logger1; //ball 1 ticker (position log)
rsean10 6:050104c0dc75 57 Ticker logger2; //ball 2 ticker (position log)
rsean10 5:93f88deda5ba 58
rsean10 5:93f88deda5ba 59 void pos_log1(){
rsean10 5:93f88deda5ba 60 pc.printf("Ball 1 (x): %i Ball 1 (y): %i \n\r",ball1.posx,ball1.posy);
rsean10 6:050104c0dc75 61 //prints ball 1 position to terminal
rsean10 5:93f88deda5ba 62 }
rsean10 5:93f88deda5ba 63
rsean10 5:93f88deda5ba 64 void pos_log2(){
rsean10 5:93f88deda5ba 65 pc.printf("Ball 2 (x): %i Ball 2 (y): %i \n\r",ball2.posx,ball2.posy);
rsean10 6:050104c0dc75 66 //prints ball 2 position to terminal
rsean10 6:050104c0dc75 67 }
rsean10 6:050104c0dc75 68
rsean10 6:050104c0dc75 69 //Ticker for update
rsean10 6:050104c0dc75 70 Ticker update1; //ball 1 ticker for update position
rsean10 6:050104c0dc75 71 Ticker update2; //ball 2 ticker for update position
rsean10 6:050104c0dc75 72
rsean10 6:050104c0dc75 73 void ball1up(){
rsean10 6:050104c0dc75 74 ball1.update(UPDATE_TIME_S,accel); //updates position
rsean10 6:050104c0dc75 75 led1 = !led1; //changes led state every update
rsean10 6:050104c0dc75 76 }
rsean10 6:050104c0dc75 77
rsean10 6:050104c0dc75 78 void ball2up(){
rsean10 6:050104c0dc75 79 ball2.update(UPDATE_TIME_S,accel); //updates position
rsean10 6:050104c0dc75 80 led2 = !led2; //changes led state every update
rsean10 6:050104c0dc75 81 }
rsean10 6:050104c0dc75 82
rsean10 6:050104c0dc75 83 //Ticker for display
rsean10 6:050104c0dc75 84 Ticker displayup; //ticker for displaying ball on lcd
rsean10 6:050104c0dc75 85
rsean10 6:050104c0dc75 86 void display(){
rsean10 6:050104c0dc75 87 // Draw circles in the x and y positions stored by the ball objects:
rsean10 6:050104c0dc75 88 uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, get_LCD_color(ball1.color));
rsean10 6:050104c0dc75 89 uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, get_LCD_color(ball2.color));
rsean10 6:050104c0dc75 90
rsean10 6:050104c0dc75 91 // Wait before erasing old circles:
rsean10 6:050104c0dc75 92 wait(DRAW_UPDATE); // In seconds
rsean10 6:050104c0dc75 93
rsean10 6:050104c0dc75 94 // Erase old circles by writing over there locations using the screen color:
rsean10 6:050104c0dc75 95 uLCD.filled_circle(ball1.posx, ball1.posy, ball1.radius, BLACK);
rsean10 6:050104c0dc75 96 uLCD.filled_circle(ball2.posx, ball2.posy, ball2.radius, BLACK);
rsean10 5:93f88deda5ba 97 }
rsean10 5:93f88deda5ba 98
rsean10 5:93f88deda5ba 99 int main(){
rsean10 7:614b40b85579 100
rsean10 7:614b40b85579 101 debounce.start(); //starts debounce timer
rsean10 7:614b40b85579 102 button.rise(&toggle); //toggles on button press
rsean10 7:614b40b85579 103
rsean10 5:93f88deda5ba 104 /*
rsean10 7:614b40b85579 105 logger1.attach(&pos_log1, LCD_UPDATE);
rsean10 7:614b40b85579 106 logger2.attach(&pos_log2, LCD_UPDATE);
rsean10 5:93f88deda5ba 107 */
rsean10 7:614b40b85579 108
slicht 1:6b99ffa62cc8 109 // Initialize uLCD
slicht 1:6b99ffa62cc8 110 uLCD.baudrate(115200);
slicht 1:6b99ffa62cc8 111 uLCD.background_color(BLACK);
slicht 1:6b99ffa62cc8 112 uLCD.cls();
slicht 1:6b99ffa62cc8 113
slicht 1:6b99ffa62cc8 114 // Initialize accelerometer
slicht 1:6b99ffa62cc8 115 accel.init();
slicht 1:6b99ffa62cc8 116
slicht 2:552e6feb8709 117 //Initialize balls:
slicht 2:552e6feb8709 118 ball1.set_state(START_X_1,START_Y_1,0,0); //speeds are set to zero
slicht 2:552e6feb8709 119 ball1.set_state(START_X_2,START_Y_2,0,0);
slicht 2:552e6feb8709 120
slicht 2:552e6feb8709 121 //Set ball radius and color:
slicht 2:552e6feb8709 122 ball1.set_param(RADIUS_1,0); //color is unimportant
slicht 2:552e6feb8709 123 ball2.set_param(RADIUS_2,1); //just making sure the colors are different
slicht 2:552e6feb8709 124
rsean10 6:050104c0dc75 125 update1.attach(&ball1up,UPDATE_TIME_S); //ticker force position update ball 1
rsean10 6:050104c0dc75 126 update2.attach(&ball2up,UPDATE_TIME_S); //ticker force position update ball 2
rsean10 6:050104c0dc75 127
rsean10 6:050104c0dc75 128 displayup.attach(&display,LCD_UPDATE); //ticker force lcd update
rsean10 6:050104c0dc75 129
slicht 2:552e6feb8709 130 while (1) { //execute 'forever'
rsean10 6:050104c0dc75 131
slicht 2:552e6feb8709 132 if (DEBUG_MODE) {
slicht 3:a7f02754bc99 133 //If compiled with DEBUG_MODE flag raised, print values to screen.
slicht 2:552e6feb8709 134 uLCD.locate(0,4);
slicht 2:552e6feb8709 135 uLCD.printf("X: %d.1\nY: %.1d",ball1.posx,ball1.posy);
slicht 2:552e6feb8709 136
slicht 2:552e6feb8709 137 uLCD.locate(0,6);
slicht 2:552e6feb8709 138 uLCD.printf("VX: %f.1\nVY: %.1f",ball1.speedx,ball1.speedy);
slicht 1:6b99ffa62cc8 139
slicht 2:552e6feb8709 140 uLCD.locate(0,10);
slicht 2:552e6feb8709 141 uLCD.printf("AX: %f.1\nAY: %.1f\nAZ: %0.1f",accel.readX(),accel.readY(),accel.readZ());
slicht 2:552e6feb8709 142 }
slicht 2:552e6feb8709 143 }
slicht 2:552e6feb8709 144 }
slicht 1:6b99ffa62cc8 145
slicht 3:a7f02754bc99 146 //Interpret LCD colors.
slicht 2:552e6feb8709 147 int get_LCD_color(int color_integer)
slicht 2:552e6feb8709 148 {
slicht 2:552e6feb8709 149 switch (color_integer) {
slicht 2:552e6feb8709 150 case 0:
slicht 2:552e6feb8709 151 return(RED);
slicht 2:552e6feb8709 152 case 1:
slicht 2:552e6feb8709 153 return(BLUE);
slicht 2:552e6feb8709 154 case 2:
slicht 2:552e6feb8709 155 return(GREEN);
slicht 2:552e6feb8709 156 default:
slicht 2:552e6feb8709 157 return(WHITE);
slicht 0:8d3812068c6c 158 }
slicht 1:6b99ffa62cc8 159 }