A twist to the computer that landed man on the moon. More information can be found at http://hackaday.io/project/294-Open-Source-DSKY

Dependencies:   DS1302 keypad mbed

Hardware

Revision:
1:24446776f0d2
Parent:
0:3ff58b093415
Child:
2:aee9ee1296cd
--- a/main.cpp	Sun Feb 16 00:32:06 2014 +0000
+++ b/main.cpp	Wed Apr 09 02:59:16 2014 +0000
@@ -1,9 +1,14 @@
 /* Introduction
 Arduino DSKY
 This is a personal project used developed by penguinos to mix old school technology with a modern twist.
-Version 0.01: Feb. 4 2014
-    Switch platforms from Arduino to KL25Z by Freescale. Because of this, Revision number is resetted.
-    Major Revision to Code are being undertaken.
+Version 0.02: March. 4 2014
+    Added Keypad Functionality
+        - Added fucntion for Verb
+        - Added function for Noun
+        - Added function for Enter
+        - Used goto in Verb and Noun to prevent any nestled Loops.
+        - Contains Button_Sort Function to move location based on button press
+    Cleaned certain parts of the code for efficentcy    
 
 Notable Credits:
 NASA! - Release of technical documentations regarding the AGC and DSKY
@@ -14,13 +19,20 @@
  */
 using namespace std;
 #include "mbed.h"
+#include "Keypad.h" // Keypad
 
 //Declare Variables
 int shift = 0; // Shift Data
 // In the Arduino Version it uses a String. Will use an Int instead to see if this works on Mbed
-int Verb;
-int Noun;
-int Enter;
+int Verb_Number1 = 0;
+int Verb_Number2 = 0;
+int Noun_Number1 = 0;
+int Noun_Number2 = 0;
+int Enter_Number1 = 0;
+int Enter_Number2 = 0;
+int Verb; // DSKY Verb
+int Noun; // DSkY Noun
+int Enter; // DSKY Enter
 int Set_GET_Seconds = 30; // Configure the Set Get in seconds. 1/100th of a second
 char Set_get_miliseconds = 10;
 char Set_Get_Seconds_Byte = 0;
@@ -28,21 +40,47 @@
 char data = 0;
 char data2 = 0;
 char data3 = 0;
-char nibble[10] = // Holds variables for nibbles for number 0-9 in hexes. nibble ALL the things!
-    {0x00, 0x01, 0x02, 0x03, 0x04,
-     0x05, 0x06, 0x07, 0x08, 0x09};
+char nibble[10] = { // Holds variables for nibbles for number 0-9 in hexes. nibble ALL the things!
+    0x00, 0x01, 0x02, 0x03, 0x04,
+    0x05, 0x06, 0x07, 0x08, 0x09
+};
+
+char Keytable[] = { '1', '2', '3', '+', // R0
+                    '4', '5', '6', '-', // R1
+                    '7', '8', '9', 'E', // R2
+                    'V', '0', 'N', 'R', // R3
+                  };
+//  C0   C1   C2   C3
+
+int32_t Index = -1; // Button
+int     State;
 
 // Function Declaration
+void Verb_Button();
+void Noun_Button();
+void Enter_Button();
+void compare();
+void Button_Sort(int sort); // Function that sorts Verb Values
 void blinkAll(int amount, int delay);// Function that Blinks all LED
 //void ShiftingOut(char myDataOut);
 
+// Program Name
+void Ground_Elapse_Time(); // Ground Elapse Time
+
 // Pin modes for each pins
-DigitalOut LatchPin(PTD4); //Pin for ST_CP of 74HC595 Pin # 12
-DigitalOut ClockPin(PTA12); //Pin for SH_CP of 74HC595 Pin # 11
-DigitalOut DataPin(PTA4);  //Pin for to DS of 74HC595 Pin # 14
+DigitalOut LatchPin(PTC7); //Pin for ST_CP of 74HC595 Pin # 12
+DigitalOut ClockPin(PTC0); //Pin for SH_CP of 74HC595 Pin # 11
+DigitalOut DataPin(PTC3);  //Pin for to DS of 74HC595 Pin # 14
 
 DigitalOut myled(LED1);
 Serial pc(USBTX, USBRX); // tx, rx Serial Output to PC Enabling this WILL consume resources. Use only for debug
+
+uint32_t cbAfterInput(uint32_t index)
+{
+    Index = index;
+    return 0;
+}
+
 int main()
 {
     wait(1);
@@ -50,35 +88,153 @@
     blinkAll(4,1);
     pc.printf("Done");
     wait(1);
-    /*
-    //Serial pc(USBTX, USBRX); // tx, rx Serial Output to PC Enabling this WILL consume resources. Use only for debug
-    while(1) {
-        //pc.printf("on");
-        myled = 1;
-        wait(1);
-        //pc.printf("off");
-        myled = 0;
-        wait(1);   
+    State = 1;
+    //             r0   r1   r2   r3   c0   c1   c2   c3
+    Keypad keypad(PTD4, PTA12, PTD3, PTA5, PTA13, PTD5, PTD0, PTD2, 20);
+    keypad.attach(&cbAfterInput);
+    keypad.start();  // energize the columns c0-c3 of the keypad
+    while (1) {
+        __wfi();
+        if (Index >-1) {
+            pc.printf("Interrupted");
+            pc.printf("Index:%d => Key:%c\r\n", Index, Keytable[Index]);
+            if (Index == 12) { // Index 12 = Verb Button
+                Verb_Button(); // Goes to Verb_Button 
+            }
+            if (Index == 14) { // Index 14 = Noun Button
+                Noun_Button(); // Goes to Noun_Button
+            }
+            if (Index == 11) { // Index 11 = Enter Button
+               Enter_Button(); // Goes to Enter_Button
+            }
+            Index = -1;
+        }
+        // Debug use only
+        //pc.printf("%c", Keytable[Verb_Number1]);
+        //pc.printf("%c", Keytable[Verb_Number2]);
+        //pc.printf("%c", Keytable[Noun_Number1]);
+        //pc.printf("%c", Keytable[Noun_Number2]);
     }
-    */
-    return 0;
+}
+
+/* This function is used when the Verb Button has been pressed. Take the inputs of the button twice and determine if the buttons are integers.
+If other buttons are pressed send it to their perspective locations.
+*/
+void Verb_Button(){
+        Verbz: // Don't Ask
+        // All Variables for Verb, Noun and Enter are zeroed out
+        Verb_Number1 = 0;
+        Verb_Number2 = 0;
+        Noun_Number1 = 0;
+        Noun_Number2 = 0;
+        Enter_Number1 = 0;
+        Enter_Number2 = 0;
+        pc.printf("Please enter a Verb Number");          
+        __wfi();
+        Verb_Number1 = Index;
+        if (Verb_Number1 == 12){ // This is section is used on atleast one of the two Verb_Number variabels to prevent a Nestled If within if within if.
+            goto Verbz; // Line 110
+        }
+        else{
+            Button_Sort(Verb_Number1);
+        }
+        //wait(0.01); // Is needed so that Verb_Number1 can store the variable from the keypad. Not sure why it requires an additional job for it to store the data.
+        //pc.printf("%c", Verb_Number1);
+        //pc.printf("%c", Keytable[Index]);
+        __wfi();
+        Verb_Number2 = Index;
+        Button_Sort(Verb_Number2);
+        //wait(0.01); // Is needed so that Verb_Number2 can store the variable form the keypad. Not sure why it requires an additional job for it to store the data.
+        //pc.printf("%c", Verb_Number2);
+        //pc.printf("%c", Verb_Number1);
+        //pc.printf("%c\n", Verb_Number2);
 }
-void compare(int Verb,int Noun, int Enter){
-    if (Verb == 16 && Noun == 36) {
-        //Configure GET
+
+/* This Function is used when the Verb Button has been Pressed. Take the inputs of the button twice and determine if the buttons are integers.
+If other buttons are pressed send it to their perspective locations.
+*/
+void Noun_Button()
+{
+    Nounz:
+    pc.printf("Please enter a Noun Number");
+    __wfi();
+    Noun_Number1 = Index;
+    if (Noun_Number1 == 14) {// This is section is used on atleast one of the two Noun_Number variabels to prevent a Nestled If within if within if.
+        goto Nounz; //Line 140
         }
-    else if (Verb == 35 && Noun == 100) {
-        // Test Light
+    else{
+        Button_Sort(Noun_Number1);
         }
-    else if (Verb == 25 && Noun == 36) {
+    __wfi();
+    Noun_Number2 = Index;
+    Button_Sort(Noun_Number2);
+}
+
+/* This function is used wen the Enter button has been pressed. This function is a special circumstance since it will be checking both the Verb and Noun variables before entering variable to Enter.
+*/
+void Enter_Button()
+{
+    Enterz:
+    pc.printf("Checking Whether there is a variable stored in Noun\n");
+    if (Noun_Number1 == 0 && Noun_Number2 == 0){
+        pc.printf("Please enter a Enter Number");
+        __wfi();
+        Enter_Number1 = Index;
+        if (Enter_Number1 == 11) { // This section is used on atleast one of the two Enter_Number variable to prevent a nestled if within if within if.
+            goto Enterz;
+            }
+        else{
+            Button_Sort(Enter_Number1);
+            }
+        __wfi();
+        Enter_Number2 = Index;
+        Button_Sort(Enter_Number2);
+    }
+    if (Noun_Number1 != 0 && Noun_Number2 != 0){ 
+        pc.printf("Check completed, Executing");
+        compare();
+    }
+    
+}
+
+// This function is used to sort the button press for Verb and Noun.
+void Button_Sort(int Sort)
+{
+        // Determines what button are pressed before moving on to the 2nd button.
+    if (Sort == 12){ //comparing the array number NOT what value in the array it is. Actual Array value is V
+        Verb_Button();
+        }
+    else if (Sort == 14) { //comparing the array number NOT what value in the array it is. Actual Array value is N
+        Noun_Button();
+        }
+    else if (Sort == 3) { //comparing the array number NOT what value in the array it is. Actual Array value is +
+        pc.printf("+");
+        }
+    else if (Sort == 7) { //comparing the array number NOT what value in the array it is. Actual Array value is -
+        pc.printf("-");
+        }
+    else if (Sort == 15) { //comparing the array number NOT what value in the array it is. Actual Array value is R
+        pc.printf("R");
+        }
+}
+// Compares the button to what program the DSKY should be running. This section will be inefficent until I can improve on my programming skills :]
+void compare()
+{
+    if (Verb_Number1 == 0 && Verb_Number2 == 6 && Noun_Number1 == 2 && Noun_Number2 == 6 && Enter_Number1 == 0 && Enter_Number2 == 0) {// Verb 16, Noun 36, Enter 00
+        //Configure GET
+        pc.printf("Configuring GET");
+        Ground_Elapse_Time();
+    } else if (Verb_Number1 == 3 && Verb_Number2 == 5 && Noun_Number1 == 0 && Noun_Number2 == 0) {
+        // Test Light
+    } else if (Verb == 25 && Noun == 36) {
         // Configure GET
-        }
-    else if (Verb == 37 && Enter == 00) {
+    } else if (Verb == 37 && Enter == 00) {
         // Idle Program
-        }
     }
+}
 
-void ShiftingOut(int myDataOut) {
+void ShiftingOut(int myDataOut)
+{
     // This shifts 8 bits out to the MSB first, The the rising edge of the clock, while clock idles low.
     // Internal Fucntions
     DataPin = 0;
@@ -88,17 +244,16 @@
     // Clears Everything within shift registers
     DataPin = 0;
     ClockPin = 0;
-    
+
     for (i=7; i>= 0; i--) {
         ClockPin = 0;
-        
+
         // Value passed to my data out
         if ( myDataOut & (1<<i)) {
             pinState = 1;
             myled = 1;
             pc.printf("1");
-        }
-        else {
+        } else {
             pinState = 0;
             myled = 0;
             pc.printf("0");
@@ -106,13 +261,14 @@
         DataPin = pinState;
         ClockPin = 1;
         DataPin = 0;
-        }
+    }
     ClockPin = 0;
     DataPin = 1;
-    }
+}
 
-//blinks the whole registered based on the number of times you want to blink with a certain delay 
-void blinkAll(int amount, int delay){
+//blinks the whole registered based on the number of times you want to blink with a certain delay
+void blinkAll(int amount, int delay)
+{
     LatchPin = 0;
     ShiftingOut(0);
     ShiftingOut(0);
@@ -132,5 +288,11 @@
         ShiftingOut(0);
         LatchPin = 1;
         wait(delay);
-        }
-    }
\ No newline at end of file
+    }
+}
+
+// Need to fill this too...
+void Ground_Elapse_Time()
+{
+    
+}
\ No newline at end of file