Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:168c04989363, committed 2013-11-11
- Comitter:
- ndiaz6
- Date:
- Mon Nov 11 18:34:01 2013 +0000
- Commit message:
- Yes;
Changed in this revision
--- /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