Coursework

Revision:
17:dee80717e423
Parent:
16:2646c1c4e62e
diff -r 2646c1c4e62e -r dee80717e423 main.cpp
--- a/main.cpp	Thu Jan 13 20:53:37 2022 +0000
+++ b/main.cpp	Sat Jan 15 16:18:09 2022 +0000
@@ -15,13 +15,21 @@
 // array of states in the FSM, each element is the output of the counter
 // set the output in binary to make it easier, 0 is LED on, 1 is LED off
 string fsm[4] = {"buttonA_isr","buttonB_isr","buttonAsss_isr","buttonA_isr"};
-volatile int Press;
+volatile int Press; // Used to track the press
+volatile int g_buttonA_flag = 0; // Global Flag
+volatile int g_buttonB_flag = 0; // Global Flag
+volatile int g_buttonX_flag = 0; // Global Flag
+volatile int g_buttonY_flag = 0; // Global Flag
+volatile int g_buttonStart_flag = 0; // Global Flag
+volatile int g_buttonBack_flag = 0; // Global Flag
+volatile int g_buttonLeft_flag = 0; // Global Flag
+volatile int g_buttonRight_flag = 0; // Global Flag
 
 // y  x  button
 Joystick joystick(PTB10,PTB11,PTC16);
 HCSR04 sensor(D14, D15); 
 Piezo Buzzer(PTC10);
-//Bringing in buttons
+//Bringing in buttons as interuppts to allow change to be detected during operation
 InterruptIn buttonA(PTB9);
 InterruptIn buttonB(PTD0);
 InterruptIn buttonX(PTC17);
@@ -32,7 +40,7 @@
 InterruptIn buttonRight(PTB3);
 
 // create an event queue
-EventQueue queue; // events are needed to get arround the printf issue 
+EventQueue queue; // Event Queue is used to get around interrupt issue with Printf and LCDprint issues 
 //rows,cols
 int sprite[8][5] =   {
     { 0,0,1,0,0 },
@@ -45,7 +53,6 @@
     { 1,1,0,1,1 },
       };
 void init_K64F();   //  Start K64fBoard
-
 void buttonA_isr(); // Button A interrupt service routine
 void buttonB_isr(); // Button B interrupt service routine
 void buttonX_isr(); // Button X interrupt service routine
@@ -54,20 +61,9 @@
 void buttonBack_isr(); // Button Back interrupt service routine
 void buttonLeft_isr(); // Button Left interrupt service routine
 void buttonRight_isr(); // Button Right interrupt service routine
-volatile int g_buttonA_flag = 0; // Global Flag
-volatile int g_buttonB_flag = 0; // Global Flag
-volatile int g_buttonX_flag = 0; // Global Flag
-volatile int g_buttonY_flag = 0; // Global Flag
-volatile int g_buttonStart_flag = 0; // Global Flag
-volatile int g_buttonBack_flag = 0; // Global Flag
-volatile int g_buttonLeft_flag = 0; // Global Flag
-volatile int g_buttonRight_flag = 0; // Global Flag
+
 int buttonCounter();
-//volatile int g_buttonA_counter = 0; // Global counter
-//Test function after research C++ lanuage 05/01/22
-int cube(int num){
-     return num*num;
-      };
+
 // Menu Items
 int page1;
 int page2;
@@ -76,79 +72,39 @@
 string Listitem2 = "Measure"; // measure distance of object
 string Listitem3 = "Detect"; // alarm when object is dectected
 N5110 lcd(PTC9,PTC0,PTC7,PTD2,PTD1,PTC11);
- /* Test of the interup an operating the buzzer this kills the board 
- void buzzme(){
-        Buzzer.play(200,120);
-            wait_ms(5);
-       Buzzer.play(200,120);;
- }
- */
- void printme(){
-     
-   volatile     double x ;
-  x = 1;
-     printf("%f\n",x);
-    // return 0;
-     }
-     
+    
+int main() {
 
-//void returnme(){
-//int num;
-  //    return num*num;
-  //    };
-int main() {
-//initialise Joystic
-       joystick.init();
-       
-         // create a thread that'll run the event queue's dispatch function
+      joystick.init();    //initialise Joystick
+           lcd.init();    //first need to initialise display
+           //change set contrast in range 0.0 to 1.0
+           //0.5 appears to be a good starting point
+           lcd.setContrast(0.5);
+            
+  // create a thread that'll run the event queue's dispatch function
   Thread eventThread;
   eventThread.start(callback(&queue, &EventQueue::dispatch_forever));
- 
-  buttonA.rise(queue.event(&buttonA_isr)); // This is used to call the function putting it in queue allowing the screen toupdat no muxt error
-  buttonB.rise(queue.event(&buttonB_isr));
-  buttonX.rise(queue.event(&buttonX_isr));
-  buttonY.rise(queue.event(&buttonY_isr));
-  buttonStart.rise(queue.event(&buttonStart_isr)); // This is used to call the function putting it in queue allowing the screen toupdat no muxt error
-  buttonBack.rise(queue.event(&buttonBack_isr));
-  buttonLeft.rise(queue.event(&buttonLeft_isr));
+  // This is used to call the function putting it in queue allowing the screen toupdat no muxt error
+      buttonA.rise(queue.event(&buttonA_isr)); 
+      buttonB.rise(queue.event(&buttonB_isr));
+      buttonX.rise(queue.event(&buttonX_isr));
+      buttonY.rise(queue.event(&buttonY_isr));
+  buttonStart.rise(queue.event(&buttonStart_isr)); 
+   buttonBack.rise(queue.event(&buttonBack_isr));
+   buttonLeft.rise(queue.event(&buttonLeft_isr));
   buttonRight.rise(queue.event(&buttonRight_isr));
-//first need to initialise display
-       lcd.init();    
 
-    // Button A is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonA.mode(PullDown);
-    // Button B is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonB.mode(PullDown);
-    // Button X is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonX.mode(PullDown);
-    // Button Y is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonY.mode(PullDown);
-    // Button Start is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
+   
+// Buttons are connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
+        buttonA.mode(PullDown);
+        buttonB.mode(PullDown);
+        buttonX.mode(PullDown);
+        buttonY.mode(PullDown);
     buttonStart.mode(PullDown);
-    // Button Back is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonBack.mode(PullDown);
-    // Button Left is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
-    buttonLeft.mode(PullDown);
-    // Button Right is connected between the pin and 3.3 V, we therefore need to turn on the internal pull-down resister
+     buttonBack.mode(PullDown);
+     buttonLeft.mode(PullDown);
     buttonRight.mode(PullDown);
-    
-// It will return 0 by default and a 1 when pressed i.e. cause a rising edge
- //  buttonA.rise(&buttonA_isr);
-   // It will return 0 by default and a 1 when pressed i.e. cause a rising edge
- //  buttonB.rise(&buttonB_isr);
-   // It will return 0 by default and a 1 when pressed i.e. cause a rising edge
-   //buttonX.rise(&buttonX_isr);
-   // It will return 0 by default and a 1 when pressed i.e. cause a rising edge
-  // buttonY.rise(&buttonY_isr);
 
-
-       
-//change set contrast in range 0.0 to 1.0
-//0.5 appears to be a good starting point
-       lcd.setContrast(0.5);
-       
-//Buzzer.period(10.0f);
-//Buzzer.pulsewidth(1);   
 //Test Struct after research 05/01/22
 struct ObjectDefine{
 int qwer;
@@ -173,153 +129,40 @@
    Object1.te = 'A';
    Object1.dubs = 23;
    Object1.namestruct = "name";
-//buttonA.rise(&buzzme); Omitted due to error
-//buttonA.rise(&printme,10);
-//buttonA.rise(&returnme);   
+   
     while(1) {
-//Tune(Buzzer,So6,8);
-//Stop_tunes(Buzzer);
-//Section of code to try to get the button press to be recorded
-//bool button = buttonA.read();
-//printf("%f\n", g_buttonA_flag );
-//Recording button presses
-
-            // swap direction when button has been pressed
-            // (could just use ! but want this to be explicit to aid understanding)
-            if (direction == UP) {
-                direction = DOWN;    
-            }
-            else {
-                direction = UP;
-
-       //output = fsm[state];  
- switch(Press){
+       long distanced = sensor.distance(); 
+        printf("Distance :  %d cm",distanced);
+   switch(Press){
      case 1: 
+     Press = 1;
      lcd.clear();
-     Press = 1;
-     lcd.printString("Menu 1",0,0);        
+     lcd.printString("Menu 1",0,0); 
+  
+     // if (distanced >= 400 || distanced <= 2)
+ printf("Distance :  %d cm",distanced);
+    // wait(1.0); // 1 sec
     lcd.refresh();
-        break;
+    break; 
      case 2: 
     Press = 2;
     lcd.clear();
-       lcd.printString("Menu 2",0,0);        
-         lcd.refresh();
-     break;
-              Press = 0;
-         lcd.clear();
-       lcd.printString("Menu 4",0,0);        
+       lcd.printString("Menu 2",0,1);      
          lcd.refresh();
      break;
-     }
-     
-/*
-int result;
- result = cube(5);
-    printf("Button A pressed  %f\n", cube(5));
-int button_counter;
-if (g_buttonA_flag){
-                    button_counter = button_counter +1;
-                    //case (test)
-                   g_buttonA_flag = 0;  // if it has, clear the flag
-
-            // send message over serial port - can observe in CoolTerm etc.
-            printf("Button A pressed  %f\n", button_counter);
-            }
-if (g_buttonB_flag){
-                   g_buttonB_flag = 0;  // if it has, clear the flag
-
-            // send message over serial port - can observe in CoolTerm etc.
-            printf("Button B pressed\n");
-            }
-if (g_buttonX_flag){
-                   g_buttonX_flag = 0;  // if it has, clear the flag
-                               // swap direction when button has been pressed
-            // (could just use ! but want this to be explicit to aid understanding)
-            if (direction == UP) {
-                direction = DOWN;    
-            }
-            else {
-                direction = UP;
-            }
-
-            // send message over serial port - can observe in CoolTerm etc.
-            printf("Button X pressed\n");
-                    lcd.clear();
-        lcd.printString("Button Pressed!",0,0);
-            lcd.refresh();
-            wait(1);
-            }
-if (g_buttonY_flag){
-                   g_buttonY_flag = 0;  // if it has, clear the flag
-
-            // send message over serial port - can observe in CoolTerm etc.
-            printf("Button Y pressed\n");
-            }
-       Buzzer.play(200,120);
-            wait_ms(5);
-       Buzzer.play(200,120);
-        long distanced = sensor.distance(); 
-        if (distanced >= 400 || distanced <= 2) 
-        {
-        printf("Out of range");
-//Calling dummy function 05/01/22
-        int answer = cube(2);
-        printf("%f\n",answer);                  
-        wait(1.0);
-        }
-    else    
-    {
-       printf("Distance :  %d cm",distanced);
-       wait(1.0); // 1 sec  
-    }
-        lcd.drawCircle(WIDTH/2,HEIGHT/2,distanced,FILL_BLACK); 
-//lcd.refresh must be used to update the lcd Display
-        lcd.refresh();
-        wait(5.0);
-//these are default settings so not strictly needed
-        lcd.normalMode();      // normal colour mode
-        lcd.setBrightness(0.5); // put LED backlight on 50%        
-        lcd.clear();
-        lcd.printString("Hello, World!",0,0);
-        Vector2D coord = joystick.get_coord();
-        lcd.refresh();
-        printf("Coord = %f,%f\n",coord.x,coord.y);
-        char buffer[14];
-        Vector2D mapped_coord = joystick.get_mapped_coord(); 
-        printf("Mapped coord = %f,%f\n",mapped_coord.x,mapped_coord.y); 
-        
-         int length = sprintf(buffer,"T = %2f",coord.x);
-//it is important the format specifier ensures the length will fit in the buffer
-        if (length <= 14)  // if string will fit on display (assuming printing at x=0)
-           lcd.printString(buffer,0,1);  // display on screen
-        lcd.refresh();
-        lcd.clear();
-//times by 50 to try get the point moving across screen
-         float x50 = mapped_coord.x*5;
-         float y50 = mapped_coord.y*8;
-//to see what the values are 
-         printf(" *50 = %f,%f\n",x50,y50);       
-//example of how to draw circles
-        lcd.printChar('o',WIDTH/2,HEIGHT/2);
-        lcd.refresh();      
-        float mag = joystick.get_mag();
-        float angle = joystick.get_angle();
-        printf("Mag = %f Angle = %f\n",mag,angle);
-        Direction d = joystick.get_direction();
-        printf("Direction = %i\n",d);
-        if (joystick.button_pressed() ) {
-            printf("Button Pressed\n");  
-            wait(5);
-        }
-    
-    }  
- }*/
+  /*
+   case 3:
+              Press = 3;
+         lcd.clear();
+       lcd.printString("Menu 3",0,1);
+         lcd.refresh();
+     break;
+     }*/
  }
  }
  }
+ 
    int buttonCount(){
-        
         Press++;
         if (Press >3){
             Press = 0;
@@ -336,21 +179,18 @@
     g_buttonA_flag = 1;   // set flag in ISR
   
         printf("press count = %i\n",Press);
-            
-      // lcd.clear(); 
-        //lcd.printString("Button A Pressed",0,0);
-        
-     //    lcd.refresh(); // set flag in ISR
+
 }
  
 
   //Button B event-triggered interrupt
 void buttonB_isr()
 {
+     buttonCount();
     g_buttonB_flag = 1;   // set flag in ISR
        lcd.clear(); 
         lcd.printString("Button B Pressed",0,0);
-         lcd.refresh(); // set flag in ISR
+         lcd.refresh(); 
 }
   //Button X event-triggered interrupt
 void buttonX_isr()
@@ -393,7 +233,7 @@
          lcd.refresh(); // set flag in ISR
          }
   //Button Right event-triggered interrupt
-void buttonRight_isr()
+   void buttonRight_isr()
 {
     g_buttonRight_flag = 1;   // set flag in ISR
        lcd.clear();