shalab shalab / Mbed 2 deprecated Tutorial07_ClassIntro

Dependencies:   mbed

Revision:
1:08ed9f1ccd06
Parent:
0:0c662a5aeb15
Child:
2:e3ebd2ae8892
--- a/main.cpp	Fri Feb 28 10:36:09 2014 +0000
+++ b/main.cpp	Mon Mar 03 00:32:50 2014 +0000
@@ -1,34 +1,152 @@
 #include "mbed.h"
+#include <string>
 #define toggle(a) {a=a^1;}
 
-DigitalOut led1(LED1); 
+using namespace std;
+
+DigitalOut led1(LED1);
+DigitalOut led2(LED2);
+DigitalOut led3(LED3);
+DigitalOut led4(LED4);  
 Serial pc(USBTX, USBRX);
 
+
 class Student {
     public:
-        Student(){
-            pc.printf("Student()\r\n");
-        }
+        Student(){};
+        Student(string n, int i): name(n), id(i){}  
+        
+        void setName(string n) { name = n; }
+        void setName(char* n, int i){ name.assign(n, i );} 
+        string getName() { return name; }
         
-        ~Student(){
-            pc.printf("~Student()\r\n");
-        }  
-         
-        void foo() {
-            pc.printf("foo()\r\n");
-        }
+        void setId(int i) { id = i; } 
+        int getId(){ return id; }
+        
+    private:
+        string name;
+        int id;
 };
 
+// Serial com
+const int len = 64;
+char inCmd[len];
+bool inCmdReady = false;
+
+// State machine 
+enum {STARTUP, IDLE, ERROR, PRINTMAINMENU, CHANGENAME, NAMECHANGED, PRINTINFO};
+int state(STARTUP);
+
+
+void rxCallback() {
+    static int idx = 0; 
+    static int lastState=STARTUP;
+    
+    char c = pc.getc();    
+    switch (c){      
+        case '\n': 
+            break;
+        case '\r':
+            inCmd[idx]='\0';
+            idx=0; 
+            if (lastState == STARTUP){
+                state = IDLE;
+                lastState = IDLE;
+            }
+            else if (lastState == IDLE) {
+                if (inCmd[idx] == '0') {
+                    state = CHANGENAME;
+                    lastState = CHANGENAME;
+                }
+                else if (inCmd[idx] == '1'){
+                    state = PRINTINFO;
+                    lastState = IDLE;
+                }
+                else {
+                    state = ERROR;
+                    lastState = IDLE;
+                }
+            }
+            else if (lastState == CHANGENAME){
+                state = NAMECHANGED;
+                lastState = IDLE;
+            }
+            break;       
+        default:
+            if(idx<len){
+                inCmd[idx++] = c;
+            }
+            break;
+    } 
+}
+
+void printMainMenu(){    
+    pc.printf("\r\n[Main Menu]\r\nWhat would you like to do?\r\n");
+    pc.printf("[0] change name\r\n");
+    pc.printf("[1] print info\r\n");
+}
+
+void printInfo(Student &s){
+    pc.printf(">> Name: %s  ID: %d\r\n", s.getName().c_str(), s.getId());        
+}
+
 int main() {
-     
-    {
-        Student s;
-        s.foo(); 
-    }
+    string name="";
+    int id(0);    
+    
+    pc.attach(&rxCallback, Serial::RxIrq); 
+    wait(1);
+    pc.printf("\r\n\r\n\r\n");
+    pc.printf("Shalab - Tutorial_ClassIntro\r\n"); 
+    pc.printf("Please enter your name: ");
+    while (state != IDLE) { wait(0.1);} 
+    
+    name.assign(inCmd, sizeof(inCmd) );   
+    
+    
+    Student s(name, id);
+    pc.printf("hello %s, your id is %d\r\n", s.getName().c_str(), s.getId());
     
-    while (1) {
-        toggle(led1);
-        wait(1);
+    printMainMenu();
+    while (1) { 
+        
+        switch (state)
+        {
+            case CHANGENAME: 
+                pc.printf("Please enter a new name: ");
+                state = IDLE;
+                break;
+                
+            case NAMECHANGED:
+                s.setName(inCmd, sizeof(inCmd) ); 
+                s.setId(++id);
+                pc.printf(">> Your name has been set to %s\r\n", s.getName().c_str()); 
+                printMainMenu();
+                state = IDLE;
+                break;
+                
+            case PRINTINFO:
+                printInfo(s);  
+                printMainMenu();
+                state = IDLE;
+                break;
+                
+            case ERROR:
+                pc.printf(">> Error command\r\n");
+                printMainMenu();
+                state = IDLE;
+                break;
+                
+            case IDLE:
+                break;
+                
+            default:
+                state = IDLE;
+                break;
+        }
+         
+        toggle(led1); 
+        wait(0.10);
     };
    
 }