New

Dependents:   main

Files at this revision

API Documentation at this revision

Comitter:
ndiaz6
Date:
Mon Nov 11 18:34:01 2013 +0000
Commit message:
Yes;

Changed in this revision

dig_out.s Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
segment_driver.s Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/dig_out.s	Mon Nov 11 18:34:01 2013 +0000
@@ -0,0 +1,329 @@
+    AREA dig_out, CODE, READONLY
+;--------------------OVERVIEW------------------------
+; This file contains ARM Assembly language functions to set
+; designated pins to General Purpose Output.  It uses
+; the PINSELx Register to Set the Pin Function to GPIO.
+; Then, it uses the FIOxDIR register to set the
+; direction of the pin to output. It also contains functions
+; to write a digital HIGH or LOW to these output pins. It uses
+; the FIOxCLR AND FIOxSET registers to clear/set the
+; port bits respectively.  Refer to the Pinnames.h
+; file to see which LPC1768 pins a given mbed module is
+; connected to.  Then, refer to Chapters 8 and 9 of the
+; LPC1768 User Manual to acquire information on the GPIO
+; registers and their addresses.
+;
+; Example:
+; LED1 is on GPIO port 1 bit 18 according to Pinnames.h
+; For this bit: -the PINSEL3 register determines its pin function
+;               -the FIO1DIR register determines its pin direction
+; According to the LPC1768 User Manual: -PINSEL3 is located at 0x4002C00C
+;                                       -FIO1DIR is located at 0x2009C020
+; Now refer to the dig_out_LED1 function below to see the execution
+;------------------------------------------------------
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_LED1
+dig_out_LED1
+;========dig_out_LED1========
+; LED1 LOCATED AT PORT-1 PIN-18
+    LDR     R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER
+    MOV.W   R1, #0x00040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER
+    LDR     R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER
+    MOV     R3, #0x30       ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits)   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT LED1_write
+LED1_write
+;========LED1_write=========
+; LED1 LOCATED AT PORT-1 PIN-18 
+    LDR     R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER)
+    MOV.W   R2, #0x040000   ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_LED2
+dig_out_LED2
+;========dig_out_LED2========
+; LED2 LOCATED AT PORT-1 PIN-20
+    LDR     R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER
+    LDR     R1, =0x00100000 ; MOVE BIT MASK (FOR BIT 20) INTO TEMP REGISTER (0x100000 = 0x01 << 20)
+    LDR     R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER
+    MOV.W   R3, #0x300      ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT LED2_write
+LED2_write
+;========LED2_write=========
+; LED2 LOCATED AT PORT-1 PIN-20 
+    LDR     R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER)
+    LDR     R2, =0x0100000  ; MOVE BIT MASK (FOR BIT 20) INTO TEMP REGISTER (0x100000 = 0x01 << 20)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_LED3
+dig_out_LED3
+;========dig_out_LED3========
+; LED3 LOCATED AT PORT-1 PIN-21
+    LDR     R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER
+    LDR     R1, =0x00200000 ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x200000 = 0x01 << 21)
+    LDR     R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER
+    MOV.W   R3, #0xC00      ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT LED3_write
+LED3_write
+;========LED3_write=========
+; LED3 LOCATED AT PORT-1 PIN-21 
+    LDR     R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER)
+    LDR     R2, =0x0200000  ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x200000 = 0x01 << 21)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_LED4
+dig_out_LED4
+;========dig_out_LED4========
+; LED4 LOCATED AT PORT-1 PIN-23
+    LDR     R0, =0x4002C00C ; LOAD ADDRESS OF PINSEL3 REGISTER
+    LDR     R1, =0x00800000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23)
+    LDR     R2, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR REGISTER
+    MOV.W   R3, #0xC000     ; FORM BITMASK FOR PINSEL3 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT LED4_write
+LED4_write
+;========LED4_write=========
+; LED4 LOCATED AT PORT-1 PIN-23 
+    LDR     R1, =0x2009C020 ; LOAD ADDRESS OF FIO1DIR (PORT 1 BASE REGISTER)
+    LDR     R2, =0x0800000  ; MOVE BIT MASK (FOR BIT 21) INTO TEMP REGISTER (0x800000 = 0x01 << 23)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P11
+dig_out_P11
+;========dig_out_P11========
+; P11 LOCATED AT PORT-0 PIN-18
+    LDR     R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER
+    MOV.W   R1, #0x00040000 ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    MOV     R3, #0x30       ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits)   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P11_write
+P11_write
+;========P11_write=========
+; P11 LOCATED AT PORT-0 PIN-18 
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x040000   ; MOVE BIT MASK (FOR BIT 18) INTO TEMP REGISTER (0x40000 = 0x01 << 18)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P12
+dig_out_P12
+;========dig_out_P12========
+; P12 LOCATED AT PORT-0 PIN-17
+    LDR     R0, =0x4002C004;
+    MOV.W   R1, #0x020000;
+ ;  
+    LDR     R2, =0x2009C000;
+    MOV     R3, #0xC
+    B       dig_out_exec                   ; * REPLACE THIS INSTRUCTION WITH CORRECT CODE
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P12_write
+P12_write
+;========P12_write=========
+; P12 LOCATED AT PORT-0 PIN-17
+    LDR     R1, =0x2009C000;
+    MOV.W   R2, #0x020000;
+    B       write_exec                  ; * REPLACE THIS INSTRUCTION WITH CORRECT CODE
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P13
+dig_out_P13
+;========dig_out_P13========
+; P13 LOCATED AT PORT-0 PIN-15
+    LDR     R0, =0x4002C000 ; LOAD ADDRESS OF PINSEL0 REGISTER
+    MOV.W   R1, #0x00008000 ; MOVE BIT MASK (FOR BIT 15) INTO TEMP REGISTER (0x08000 = 0x01 << 15)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    LDR     R3, =0x70000000 ; FORM BITMASK FOR PINSEL0 REGISTER (clear appropriate bits)   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P13_write
+P13_write
+;========P13_write=========
+; P13 LOCATED AT PORT-0 PIN-15
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x008000   ; MOVE BIT MASK (FOR BIT 15) INTO TEMP REGISTER (0x08000 = 0x01 << 15)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P14
+dig_out_P14
+;========dig_out_P14========
+; P14 LOCATED AT PORT-0 PIN-16
+    LDR     R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER
+    MOV.W   R1, #0x00010000 ; MOVE BIT MASK (FOR BIT 16) INTO TEMP REGISTER (0x10000 = 0x01 << 16)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    MOV     R3, #0x03       ; FORM BITMASK FOR PINSEL0 REGISTER (clear appropriate bits)   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P14_write
+P14_write
+;========P14_write=========
+; P14 LOCATED AT PORT-0 PIN-16
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x010000   ; MOVE BIT MASK (FOR BIT 16) INTO TEMP REGISTER (0x10000 = 0x01 << 16)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P15
+dig_out_P15
+;========dig_out_P15========
+; P15 LOCATED AT PORT-0 PIN-23
+    LDR     R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER
+    LDR     R1, =0x00800000 ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23)
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    MOV.W   R3, #0x7000     ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P15_write
+P15_write
+;========P15_write=========
+; P15 LOCATED AT PORT-0 PIN-23
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x0800000  ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x800000 = 0x01 << 23)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P16
+dig_out_P16
+;========dig_out_P16========
+; P16 LOCATED AT PORT-0 PIN-24
+    LDR     R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER
+    LDR     R1, =0x01000000 ; MOVE BIT MASK (FOR BIT 24) INTO TEMP REGISTER (0x1000000 = 0x01 << 24)
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    MOV.W   R3, #0x30000    ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P16_write
+P16_write
+;========P16_write=========
+; P16 LOCATED AT PORT-0 PIN-24
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x1000000  ; MOVE BIT MASK (FOR BIT 23) INTO TEMP REGISTER (0x1000000 = 0x01 << 24)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT dig_out_P17
+dig_out_P17
+;========dig_out_P17========
+; P17 LOCATED AT PORT-0 PIN-25
+    LDR     R0, =0x4002C004 ; LOAD ADDRESS OF PINSEL1 REGISTER
+    LDR     R1, =0x02000000 ; MOVE BIT MASK (FOR BIT 25) INTO TEMP REGISTER (0x1000000 = 0x01 << 25)
+    LDR     R2, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 REGISTER
+    MOV.W   R3, #0xC0000    ; FORM BITMASK FOR PINSEL1 REGISTER (clear appropriate bits)
+;                           ; NOTE: THE ABOVE IS A 32-BIT INSTRUCTION BC OF ".W" QUALIFIER   
+    B       dig_out_exec    ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES     
+;
+;
+;
+; EXPORT FUNCTION LOCATION SO THAT C-COMPILER CAN LINK
+    EXPORT P17_write
+P17_write
+;========P17_write=========
+; P17 LOCATED AT PORT-0 PIN-25
+    LDR     R1, =0x2009C000 ; LOAD ADDRESS OF FIO0DIR0 (PORT 0 BASE REGISTER)
+    MOV.W   R2, #0x2000000  ; MOVE BIT MASK (FOR BIT 24) INTO TEMP REGISTER (0x1000000 = 0x01 << 25)
+    B       write_exec      ; CALL SUBROUTINE TO EXECUTE YOUR CHANGES
+;
+;
+;
+dig_out_exec
+;========dig_out_execution========
+; SET PIN FUNCTION TO GPIO
+    LDR     R4, [R0]        ; \ 
+    BIC     R4, R3          ; - APPLY BITMASK FOR PINSELx REGISTER (clear appropriate bits) 
+    STR     R4, [R0]        ; STORE BITMASK IN PINSELx REGISTER
+;
+; SET UP GPIO PORT FOR OUTPUT DIRECTION (WITH SPECIFIED BITMASK IN REGISTER R2)
+    LDR     R6, [R2]        ; \ 
+    ORR     R6, R1          ; - ACQUIRE BITMASK FOR FIOxDIR REGISTER (1 = Output)      
+    STR     R6, [R2]        ; STORE BITMASK IN FIOxDIR REGISTER
+;
+;RETURN TO MAIN
+    BX      LR              ; RETURN TO MAIN USING LINKER REGISTER
+;
+;
+;
+write_exec
+;========write_execution=========                   
+; CLEAR/SET BASED ON INPUT VALUE 
+    CMP     R0, #0          ; VALUE == 0 ?
+    ITE EQ                  ; (IF-THEN-ELSE) ON NEXT TWO INSTRUCTIONS USING "EQ" FLAG
+    STREQ   R2, [R1,#0x1C]  ; if==0, CLEAR LED1 BIT
+    STRNE   R2, [R1,#0x18]  ; if==1, SET LED1 BIT
+;
+; RETURN TO MAIN
+    BX      LR              ; RETURN TO MAIN USING LINKER REGISTER
+;
+;
+;
+    END
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Mon Nov 11 18:34:01 2013 +0000
@@ -0,0 +1,422 @@
+/**********************************
+ * Author: Seungcheol Baek
+ * Institution: Georgia Tech
+ *
+ * Title: MAIN
+ * Class: ECE2035
+ * Assignment: Project 2
+ **********************************/
+
+//includes
+#include <string.h>
+#include <stdio.h>
+#include <math.h>
+#include <cstdarg>
+#include "mbed.h"
+#include "rtos.h"
+#include "TextLCD.h"
+#include "SDFileSystem.h"
+#include "CommModule.h"
+#include "wave_player.h"
+#include "FATFileSystem.h"
+
+//defines
+#define BAUDRATE            9600
+#define BUFFSIZE            100
+#define GRAVITY             1.0
+#define PHIGH               10   // NEW
+#define PLOW                5    // NEW
+#define PI                  3.141592653589793238462643f
+#define BOMB_WAVFILE        "/sd/wavfiles/bomb.wav"
+#define MONKEY_WAVFILE      "/sd/wavfiles/monkey.wav"
+#define ACK                 "status-ack"
+
+//function prototypes
+int invert(int value);
+void print(const char *format, ...);
+void lowerCase(char *src);
+void startGame(void);
+void waitForAck(void);
+void playBombSound(void);
+void playMonkeySound(void);
+void pb1_hit_callback(void);
+void pb2_hit_callback(void);
+void pb3_hit_callback(void);
+void pb4_hit_callback(void);
+void getworld (int**world, char *World);
+void updateShot(int row, int column, int del);
+void colorTile(int row, int column, int strength);
+void deleteTile(int row, int column);
+void paaUpdate(int power, int angle);
+void hint(int row, int column, int power, int angle);
+
+//declare functions (assembly subroutines)
+extern "C" void setup_sequence(void);
+extern "C" void seg_driver_initialize(void);
+extern "C" void seg_driver(int value);
+
+//initialize hardware
+SDFileSystem sd(p5, p6, p7, p8, "sd"); // mosi, miso, sck, cs
+TextLCD lcd(p26, p25, p24, p23, p22, p21); // rs, e, d4-d7
+AnalogOut DACout(p18);
+wave_player waver(&DACout);
+DigitalIn pb1(p30);
+DigitalIn pb2(p29);
+DigitalIn pb3(p28);
+DigitalIn pb4(p27);
+
+//communication device
+commSerial serDevice(USBTX, USBRX, BAUDRATE); //tx, rx
+
+// Global variables for push buttons
+char volatile power=PHIGH, angle=45, fire;   // NEW
+
+//main
+int main() {
+    //initialize and clear 7-Segment Display (assembly subroutine)
+    setup_sequence();
+    seg_driver_initialize();
+    seg_driver(0);
+
+    // Use internal pullups for pushbuttons
+    pb1.mode(PullUp);    
+    pb2.mode(PullUp);
+    pb3.mode(PullUp);
+    pb4.mode(PullUp);
+
+    //variables
+    char World[10000];
+  
+    //check for wav file
+    lcd.cls();
+    lcd.printf("Locating WAV file...");
+    FILE *test_file;
+    while(1) {
+        test_file=fopen(BOMB_WAVFILE,"r");
+        if(test_file != NULL) {break;}
+        wait(0.5);
+    }
+    fclose(test_file);
+    while(1) {
+        test_file=fopen(MONKEY_WAVFILE,"r");
+        if(test_file != NULL) {break;}
+        wait(0.5);
+    }
+    fclose(test_file);
+    
+    //notification
+    lcd.cls();
+    lcd.printf("Angry Monkeys");
+    wait(1);
+
+    
+    /******** HW 3 *********/
+
+    /** HW3.A During the check off, You should show the seg_driver is working correctly **/
+    int i;
+    for(i=0;i<10;i++){
+            seg_driver(i);
+            wait(0.3);
+    }
+    
+    /** HW3.B During the check off, You should show the pushbuttons are debounced **/
+    
+    //temp variables
+    int num_cannon=30, val1, val2, val3, val4;
+    
+    fire=0; //pb4 is set to fire
+    lcd.cls();    
+    while(fire<9){
+        
+        /****   BEGIN - your code goes here for HW3.B  ****/
+        
+        //read inputs
+        val1 = invert(pb1.read());
+        val2 = invert(pb2.read());
+        val3 = invert(pb3.read());
+        val4 = invert(pb4.read());
+        
+        if(val1){
+            pb1_hit_callback(); //power 
+        }
+        if(val2){
+            pb2_hit_callback(); //angle
+        }
+        if(val3){
+            pb3_hit_callback(); //angle
+        }
+        if(val4){
+            pb4_hit_callback(); //fire
+        }
+        
+        if (val1||val2||val3||val4){
+            wait(.2);
+        }
+        /****    END - your code stops here   ****/
+        
+        //print lcd
+        lcd.cls();
+        lcd.printf("Left cannon:%d\n", num_cannon);
+        if(power==PHIGH)                         // NEW
+            lcd.printf("Angle:%d PHIGH", angle); // NEW
+        else                                     // NEW
+            lcd.printf("Angle:%d PLOW", angle);  // NEW
+        
+        wait(0.02);                              // NEW
+        
+    }
+   
+    /******** HW 3 END*********/
+    /** Note that you can use the HW3 for the Project 2 by moving it to the appropriate place in the Project 2. 
+        If you do not want to use HW3 for the Project 2, then you can simply remove it after check off. **/
+    
+    
+    /******** Project 2 *********/    
+    //loop
+    while(1) {
+        
+        //synchronize front end display  
+        startGame();                            
+
+        //receive World
+        serDevice.receiveData(World);            
+        wait(1);
+        
+        //get world that will be used for your work
+        int *world;
+        getworld(&world, World);
+        
+        /****   BEGIN - your code goes here for project 2  ****/
+        
+        //debug statements
+        print("testing");
+        print("string1: %s\nstring2: %s", "hello", "world");
+        print("int: %d, int: %d", world[2], world[3]);
+        
+        //Just for test...
+        for(i=1;i<10;i++){
+            updateShot(i-1,i,0);
+            wait(1);
+        } 
+                       
+        playBombSound();
+        playMonkeySound();
+        
+        for(i=0;i<5;i++){       
+            deleteTile(world[4*i+2],world[4*i+3]);
+            wait(1);
+        }
+        //Just for test ends...
+        
+        
+        //have fun... 
+        
+        /****    END - your code stops here   ****/
+        free(world);  
+    }
+    //end loop
+}
+
+//fcn to send update
+void updateShot(int row, int column, int del){
+    //temp variables
+    char buffer[BUFFSIZE];
+    
+    //construct message
+    sprintf(buffer, "%s-%d-%d-%d;", "update", row, column, del);
+
+    //send message
+    serDevice.sendData(buffer);
+}
+
+//fcn to send color
+void colorTile(int row, int column, int strength){
+    //temp variables
+    char buffer[BUFFSIZE];
+    
+    //construct message
+    sprintf(buffer, "%s-%d-%d-%d;", "color", row, column, strength);
+
+    //send message
+    serDevice.sendData(buffer);
+}    
+    
+//fcn to send delete
+void deleteTile(int row, int column){
+    //temp variables
+    char buffer[BUFFSIZE];
+    
+    //construct message
+    sprintf(buffer, "%s-%d-%d;", "delete", row, column);
+
+    //send message
+    serDevice.sendData(buffer);
+} 
+
+//fcn to send power and angle
+void paaUpdate(int power, int angle){
+    //temp variables
+    char buffer[BUFFSIZE];
+    
+    //construct message
+    sprintf(buffer, "%s-%d-%d;", "paa", power, angle);
+
+    //send message
+    serDevice.sendData(buffer);
+} 
+
+//fcn to send hint
+void hint(int row, int column, int power, int angle){
+    //temp variables
+    char buffer[BUFFSIZE];
+    
+    //construct message
+    sprintf(buffer, "%s-%d-%d-%d-%d;", "hint", row, column, power, angle);
+
+    //send message
+    serDevice.sendData(buffer);
+}
+
+//fcn to get acknowledgement from serial peripheral
+void waitForAck(void) {
+    //get acknowlegement
+    char buffer[BUFFSIZE];
+    while(1) {
+        serDevice.receiveData(buffer);
+        lowerCase(buffer);
+        if(strcmp(ACK, buffer) == 0) {
+            break;
+        }
+        memset(&buffer[0],0,strlen(buffer));     
+    }
+    return;
+}
+
+//fcn to initialize the frontend display
+void startGame(void) {
+    //temp variables
+    char buffer[BUFFSIZE];
+
+    //construct message
+    sprintf(buffer, "start");
+
+    //send message
+    serDevice.sendData(buffer);
+
+    //wait for acknowledgement
+    waitForAck();
+}
+
+//fcn to play bomb noise
+void playBombSound(void) {
+    //open wav file
+    FILE *wave_file;
+    wave_file=fopen(BOMB_WAVFILE,"r");
+    
+    //play wav file
+    waver.play(wave_file);
+    
+    //close wav file
+    fclose(wave_file);
+}
+
+//fcn to play bomb noise
+void playMonkeySound(void) {
+    //open wav file
+    FILE *wave_file;
+    wave_file=fopen(MONKEY_WAVFILE,"r");
+    
+    //play wav file
+    waver.play(wave_file);
+    
+    //close wav file
+    fclose(wave_file);
+}
+
+//fcn to print to console
+void print(const char *format, ...) {
+    //temp variables
+    char buffer[BUFFSIZE];
+    char temp[BUFFSIZE-6];
+    
+    //construct message part 1
+    sprintf(buffer, "print-");
+    
+    //construct message part 2
+    va_list arguments;
+    va_start(arguments, format);
+    vsnprintf(temp, BUFFSIZE-7, format, arguments);
+    va_end(arguments);
+    
+    //concatenate parts
+    strcat(buffer, temp);
+    
+    //send message
+    serDevice.sendData(buffer);
+    
+    //wait for acknowledgement
+    waitForAck();  
+}
+
+//fcn to convert string to lowercase
+void lowerCase(char *src) {
+    int i=0;;
+    while(src[i] != '\0') {
+        if((src[i] > 64) && (src[i] < 91)) {
+            src[i]+=32;
+        }
+        i++;
+    }
+    return;
+}
+
+//function to perform bitwise inversion
+int invert(int value) {
+    if (value == 0) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+// Callback routine is interrupt activated by a debounced pb hit
+void pb1_hit_callback (void) {
+    if(power==PHIGH)    // NEW
+        power=PLOW;     // NEW
+    else                // NEW
+        power=PHIGH;    // NEW
+}
+void pb2_hit_callback (void) {
+    if(angle<90)
+        angle++;
+    else if(angle>=90) 
+        angle=0;
+}
+void pb3_hit_callback (void) {
+    if(angle>0)
+        angle--;
+    else if(angle<=0)
+        angle=90;
+}
+void pb4_hit_callback (void) {
+    fire++;
+}
+
+//func. to get world
+void getworld (int**world, char *World){
+    int i;
+    char temp[3];
+    
+    //allocate world
+    *world = (int*)malloc(sizeof(int)*(((World[2]<<8)+World[3])*4+2));
+    
+    //get it
+    (*world)[0]=(World[0]<<8)+World[1];
+    (*world)[1]=(World[2]<<8)+World[3];
+    for(i=0;i<((*world)[1]*4);i++){
+        temp[0] = World[(2*i)+4];
+        temp[1] = World[(2*i)+5];
+        temp[2] = '\0';   
+        sscanf(temp, "%d", &((*world)[i+2]));            
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/segment_driver.s	Mon Nov 11 18:34:01 2013 +0000
@@ -0,0 +1,183 @@
+    AREA segment_driver, CODE, READONLY
+;--------------------OVERVIEW------------------------
+; This file contains ARM Assembly language functions to
+; drive a 7-segment LED Display (Kingbright SA03-11HDB).
+; This library uses a switch statement on the input
+; register (R0) to set or clear each corresponding lead
+; of the display.  NOTE: The 7 Segments of the LED display
+; must be connected to pins p11 - p17 of the mbed digital
+; I/O.  For further help with understanding this file,
+; please refer to files:
+;                       dig_in.s
+;                       dig_out.s
+;------------------------------------------------------
+; Import function locations so that C compiler can find it and link
+    IMPORT dig_out_P11
+    IMPORT P11_write
+    IMPORT dig_out_P12
+    IMPORT P12_write
+    IMPORT dig_out_P13
+    IMPORT P13_write
+    IMPORT dig_out_P14
+    IMPORT P14_write
+    IMPORT dig_out_P15
+    IMPORT P15_write
+    IMPORT dig_out_P16
+    IMPORT P16_write
+    IMPORT dig_out_P17
+    IMPORT P17_write
+; Export function location so that C compiler can find it and link
+    EXPORT seg_driver_initialize
+seg_driver_initialize       ;CLEAR DISPLAY
+    PUSH    {LR}
+    BL      dig_out_P11
+    BL      dig_out_P12
+    BL      dig_out_P13
+    BL      dig_out_P14
+    BL      dig_out_P15
+    BL      dig_out_P16
+    BL      dig_out_P17
+    MOV     R0,#1
+    BL      P11_write
+    BL      P12_write
+    BL      P13_write
+    BL      P14_write
+    BL      P15_write
+    BL      P16_write
+    BL      P17_write
+    POP     {LR}
+    BX      LR
+    
+; Export function location so that C compiler can find it and link    
+    EXPORT seg_driver
+seg_driver                  ;SWITCH STATEMENT
+    PUSH    {LR}
+    ADR     R2,switchpool
+    LDR     PC,[R2,R0,LSL #2]
+    ALIGN
+switchpool
+    DCD case0
+    DCD case1
+    DCD case2
+    DCD case3
+    DCD case4
+    DCD case5
+    DCD case6
+    DCD case7
+    DCD case8
+    DCD case9
+case0
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write
+    BL      P13_write
+    BL      P14_write
+    BL      P15_write
+    BL      P16_write
+    MOV     R0,#1
+    BL      P17_write
+    B       end
+case1
+    MOV     R0,#0
+    BL      P12_write
+    BL      P13_write
+    MOV     R0,#1
+    BL      P11_write
+    BL      P14_write
+    BL      P15_write
+    BL      P16_write
+    BL      P17_write
+    B       end
+case2
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write
+    BL      P14_write
+    BL      P15_write
+    BL      P17_write
+    MOV     R0,#1
+    BL      P13_write
+    BL      P16_write  
+    B       end
+case3
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write
+    BL      P13_write
+    BL      P14_write   
+    BL      P17_write
+    MOV     R0,#1
+    BL      P15_write
+    BL      P16_write    
+    B       end
+case4
+    MOV     R0,#0    
+    BL      P12_write
+    BL      P13_write
+    BL      P16_write  
+    BL      P17_write
+    MOV     R0,#1
+    BL      P11_write
+    BL      P14_write
+    BL      P15_write       
+    B       end
+case5
+    MOV     R0,#0    
+    BL      P11_write
+    BL      P13_write
+    BL      P14_write
+    BL      P16_write  
+    BL      P17_write
+    MOV     R0,#1
+    BL      P12_write
+    BL      P15_write 
+    B       end
+case6
+    MOV     R0,#0
+    BL      P11_write       
+    BL      P13_write
+    BL      P14_write
+    BL      P15_write
+    BL      P16_write  
+    BL      P17_write
+    MOV     R0,#1
+    BL      P12_write          
+    B       end
+case7
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write       
+    BL      P13_write  
+    MOV     R0,#1
+    BL      P14_write  
+    BL      P15_write
+    BL      P16_write
+    BL      P17_write       
+    B       end
+case8
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write       
+    BL      P13_write  
+    BL      P14_write  
+    BL      P15_write
+    BL      P16_write
+    BL      P17_write       
+    B       end
+case9
+    MOV     R0,#0
+    BL      P11_write
+    BL      P12_write       
+    BL      P13_write
+    BL      P16_write
+    BL      P17_write  
+    MOV     R0,#1
+    BL      P14_write  
+    BL      P15_write          
+    B       end
+end
+    POP     {LR}
+    BX      LR
+;
+    END
+    
\ No newline at end of file