LCD Menu Select with LCD SDcard Encoder Bluetooth GCODE

Dependencies:   FRA221_9A SDFileSystem mbed

Dependents:   FRA221_9A

Files at this revision

API Documentation at this revision

Comitter:
sweilz
Date:
Thu Dec 10 08:34:15 2015 +0000
Commit message:
LCD Menu Select

Changed in this revision

LCDTaonoi.lib Show annotated file Show diff for this revision Revisions of this file
QEI.lib Show annotated file Show diff for this revision Revisions of this file
SDFileSystem.lib 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
mbed.bld Show annotated file Show diff for this revision Revisions of this file
diff -r 000000000000 -r 7e94da02b931 LCDTaonoi.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LCDTaonoi.lib	Thu Dec 10 08:34:15 2015 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/SweiLz/code/LCDTaonoi/#536ec20100f2
diff -r 000000000000 -r 7e94da02b931 QEI.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/QEI.lib	Thu Dec 10 08:34:15 2015 +0000
@@ -0,0 +1,1 @@
+https://developer.mbed.org/teams/FRA221_2015/code/FRA221_9A/#e200dbef94b9
diff -r 000000000000 -r 7e94da02b931 SDFileSystem.lib
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/SDFileSystem.lib	Thu Dec 10 08:34:15 2015 +0000
@@ -0,0 +1,1 @@
+http://developer.mbed.org/users/mbed_official/code/SDFileSystem/#7b35d1709458
diff -r 000000000000 -r 7e94da02b931 main.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Dec 10 08:34:15 2015 +0000
@@ -0,0 +1,422 @@
+#include "mbed.h"
+#include "SDFileSystem.h"
+#include "LCDTaonoi.h"
+#include "QEI.h"
+#include <string>
+#include <vector>
+
+Serial pc(SERIAL_TX, SERIAL_RX);
+Serial device(D8,D2);
+Serial phone(PA_11,PA_12);
+SDFileSystem sd(D11, D12, D13, D10,"sd");
+LCDTaonoi lcd(I2C_SDA, I2C_SCL);
+QEI encoder(A0, A1);
+
+
+DigitalIn btn(A2);
+
+
+void initial();
+int selectMenu(string head,vector<string> strVec);
+void getTemperature();
+void displayData();
+string stringData(char ch,string cmd);
+void ProcessCmd(string cmd);
+void ProcessFile(string filename);
+
+vector<string> strDisplay;
+vector<string> strMode;
+vector<string> strFilename;
+vector<string> strBackground;
+vector<string> strSize;
+
+int selectItem[5];
+bool can_back = false;
+Timer timer;
+Ticker TimetickTemp;
+Ticker TimetickLCD;
+DigitalInOut TempSensor(D4);
+DigitalOut TempStatus(D3);
+int temperature=0;
+float process=99.9;
+int run=0;
+int FullSize=0,NowSize=0;
+int fexit=0;
+
+int main()
+{
+    pc.baud(9600);
+    device.baud(9600);
+    phone.baud(9600);
+
+    pc.printf("\nHello World\n");
+    
+    TimetickTemp.attach(&getTemperature, 0.5);
+    TimetickLCD.attach(&displayData, 1.0);
+
+    initial();
+
+//////////////////////////////// Main LCD Process //////////////////////
+mainmenu:
+    can_back = false;
+    selectItem[0] = selectMenu("*** SELECT  MODE ***",strMode);
+
+    if(selectItem[0]==0) {
+filemenu:
+        selectItem[1] = selectMenu("** FILES TO PRINT **",strFilename);
+
+        if(selectItem[1]==strDisplay.size()-1) {
+            goto mainmenu;
+        } else {
+bgmenu:
+            selectItem[2] = selectMenu("**** BACKGROUND ****",strBackground);
+            if(selectItem[2]==strDisplay.size()-1) {
+                goto filemenu;
+            } else {
+                selectItem[3] = selectMenu("***** BG SIZES *****",strSize);
+                if(selectItem[3]==strDisplay.size()-1) {
+                    goto bgmenu;
+                } else {
+                    lcd.clear();
+                    lcd.print("PROCESS     :");
+                    lcd.setCursor(0,1);
+                    lcd.print("TEMPERATURE :");
+                    lcd.setCursor(0,3);
+                    lcd.print("FILE: ");
+                    lcd.print(strFilename[selectItem[1]].c_str());
+                }
+            }
+        }
+    } else if(selectItem[0]==1) {
+        lcd.clear();
+        lcd.print(" AUTO PANCAKE MAKER ");
+        lcd.setCursor(0,2);
+        lcd.print("TEMPERATURE :");
+        while(btn.read()) {
+            lcd.setCursor(15,2);
+            //getTemperature();
+            string temp;
+            sprintf(&temp[0],"%.1fC",float(temperature)/10);
+            lcd.print(temp.c_str());
+            //wait(0.2);
+        }
+        while(!btn.read());
+        goto mainmenu;
+    } else if(selectItem[0]==2) {
+        lcd.clear();
+        lcd.print(" AUTO PANCAKE MAKER ");
+        lcd.setCursor(0,2);
+        lcd.print("   GET GCODE FROM   ");
+        lcd.setCursor(0,3);
+        lcd.print("     SMARTPHONE     ");
+        while(btn.read()) {
+            if(phone.readable()) {
+                char ch = phone.getc();
+                pc.putc(ch);
+                 device.putc(ch);
+            }
+        } 
+        while(!btn.read());
+        goto mainmenu;
+    }
+////////////////////////////////////////////////////////////////////
+
+    run=1;
+    pc.printf("Send File GCODE\n");
+    ProcessFile(strFilename[selectItem[1]].c_str());
+
+    run=0;
+    if(!fexit) {
+        lcd.clear();
+        lcd.setCursor(0,0);
+        lcd.print("  WAITING TO FILL   ");
+        lcd.setCursor(0,1);
+        lcd.print("====================");
+        lcd.setCursor(0,3);
+        lcd.print(" AUTO PANCAKE MAKER ");
+
+        device.printf("$%d S%d\r",selectItem[2]+1,selectItem[3]+1);
+        while(1) {
+            if(device.readable()) {
+                if(device.getc()=='$') {
+                    break;
+                }
+            }
+        }
+        lcd.clear();
+    } else {
+        goto mainmenu;
+    }
+    fexit=0;
+
+
+
+
+
+
+
+
+
+
+
+
+    lcd.clear();
+    while(btn.read());
+    while(!btn.read());
+    pc.printf("\nGoodBye World\n");
+}
+
+
+
+
+
+void initial()
+{
+    pc.printf("DEBUG initial");
+
+    lcd.clear();
+    lcd.print("***** WELCOME! *****");
+    lcd.setCursor(0,1);
+    lcd.print(" AUTO PANCAKE MAKER ");
+    lcd.setCursor(0,3);
+    lcd.print("   PRESS TO START   ");
+
+    strMode.push_back("PRINT FILE");
+    strMode.push_back("WATCH TEMPERATURE");
+    strMode.push_back("SMART PHONE");
+    string path = "/sd/FileToPrint";
+    struct dirent *dirp;
+    DIR *dp = opendir(path.c_str());
+    while((dirp = readdir(dp)) != NULL) {
+        strFilename.push_back(string(dirp->d_name));
+    }
+    closedir(dp);
+
+    strBackground.push_back("SQUARE");
+    strBackground.push_back("CIRCLE");
+    strBackground.push_back("ELLIPS");
+
+    strSize.push_back("FIT");
+    strSize.push_back("NORMAL");
+    strSize.push_back("LARGE");
+
+    pc.printf(" - end initial\n");
+
+    while(btn.read());
+    while(!btn.read());
+}
+
+
+
+
+void ProcessFile(string filename)
+{
+    NowSize=0;
+    process=0.0;
+    bool comment = false;
+    string cmd="";
+    string readPath = "/sd/FileToPrint/" + filename;
+
+    FILE *fInput = fopen(readPath.c_str(), "r");
+
+    if (fInput != NULL) {
+        fseek( fInput, 0, SEEK_END );
+        FullSize = ftell(fInput);
+        rewind(fInput);
+
+        int8_t ch = fgetc(fInput);
+        while(ch != EOF) {
+            if(ch != '\n') {
+                if (ch == '(') comment = true;
+                if (!comment) cmd.push_back(ch);
+                if (ch == ')') comment = false;
+            } else {
+                wait_us(100);
+                if(cmd.size()>1) {
+                    if(!cmd.find("G0 ")||!cmd.find("G1 ")||!cmd.find("G2 ")||!cmd.find("G3 ")) {
+                        ProcessCmd(cmd);
+                    }
+                }
+                cmd.clear();
+            }
+            if(!btn.read()) {
+                ch = EOF;
+                fexit=1;
+                break;
+            } else {
+                ch = fgetc(fInput);
+            }
+            NowSize++;
+            process = float(NowSize)/float(FullSize)*100;
+
+        }
+        process = 100.0;
+    }
+    fclose(fInput);
+
+}
+
+void ProcessCmd(string cmd)
+{
+    string tempCmd="",sendCmd="";
+
+    if(!cmd.find("G0 ") || !cmd.find("G1 "))sendCmd = "G0 ";
+    else if(!cmd.find("G2 "))sendCmd = "G2 ";
+    else if(!cmd.find("G3 "))sendCmd = "G3 ";
+
+    if(cmd.find('X',0)!= std::string::npos)sendCmd.append(stringData('X',cmd));
+    if(cmd.find('Y',0)!= std::string::npos)sendCmd.append(stringData('Y',cmd));
+    if(cmd.find('Z',0)!= std::string::npos)sendCmd.append(stringData('Z',cmd));
+    if(cmd.find('I',0)!= std::string::npos)sendCmd.append(stringData('I',cmd));
+    if(cmd.find('J',0)!= std::string::npos)sendCmd.append(stringData('J',cmd));
+
+    device.printf("%s\r",sendCmd.c_str());
+    pc.printf("Device : %s\n\r",sendCmd.c_str());
+    while(1) {
+        if(device.readable()) {
+            if(device.getc()=='#') {
+                break;
+            }
+        }
+        if(pc.readable()) {
+            if(pc.getc()=='#') {
+                break;
+            }
+        }
+    }
+}
+
+string stringData(char ch,string cmd)
+{
+    size_t pos = cmd.find(ch,0);
+    string tempCmd,temp = cmd.substr(pos+1,8);
+    float number = atof(temp.c_str());
+    if(ch=='Z')number = number>0?1.0:0.0;
+    sprintf(&tempCmd[0],"%c%.3f ",ch,number);
+    return tempCmd.c_str();
+}
+
+int selectMenu(string head,vector<string> strVec)
+{
+    pc.printf("DEBUG selectMemu\n");
+
+    lcd.clear();
+    lcd.print(head.c_str());
+
+    strDisplay.clear();
+    for(int i=0; i<strVec.size(); i++)
+        strDisplay.push_back(strVec[i].c_str());
+    if(can_back)strDisplay.push_back("<< BACK");
+    /*for(int i=0; i<strDisplay.size(); i++)
+        pc.printf("%s\n",strDisplay[i].c_str());*/
+
+
+    int item_index = 0;
+    int list_index = 0;
+    int last_index = 1;
+    lcd.setCursor(0,item_index+1);
+    lcd.print("->");
+
+    while(btn.read()) {
+        item_index+=encoder.getDirection();
+
+        if(item_index>2) {
+            item_index=2;
+            list_index++;
+            for(int i=1; i<4; i++) {
+                lcd.setCursor(3,i);
+                lcd.print("               ");
+            }
+        }
+        if(item_index<0) {
+            item_index=0;
+            list_index--;
+            for(int i=1; i<4; i++) {
+                lcd.setCursor(3,i);
+                lcd.print("               ");
+            }
+        }
+        if(item_index>strDisplay.size()-1)item_index = strDisplay.size()-1;
+        if(list_index<=0)list_index=0;
+        if(list_index>strDisplay.size()-3)list_index=strDisplay.size()-3;
+
+        if(item_index != last_index) {
+            lcd.setCursor(0,last_index+1);
+            lcd.print("  ");
+            lcd.setCursor(0,item_index+1);
+            lcd.print("->");
+            last_index = item_index;
+        }
+
+        if(strDisplay.size()<=3) {
+            for(int i=0; i<strDisplay.size(); i++) {
+                lcd.setCursor(3,i+1);
+                lcd.print(strDisplay[i].c_str());
+            }
+        }   else {
+            lcd.setCursor(3,1);
+            lcd.print(strDisplay[list_index].c_str());
+            lcd.setCursor(3,2);
+            lcd.print(strDisplay[list_index+1].c_str());
+            lcd.setCursor(3,3);
+            lcd.print(strDisplay[list_index+2].c_str());
+        }
+        wait(0.05);
+    }
+    while(!btn.read());
+    can_back=true;
+    pc.printf("%d %s\n",item_index+list_index,strDisplay[item_index+list_index].c_str());
+    return item_index+list_index;
+}
+
+void getTemperature()
+{
+    int start,end;
+    timer.start();
+
+    TempSensor.output();
+    TempSensor.write(0);
+    wait_ms(10);
+    TempSensor.write(1);
+    wait_us(40);
+    TempSensor.input();
+
+    while (!TempSensor.read());
+    start = timer.read_us();
+    while (TempSensor.read());
+    end = timer.read_us();
+
+    if (end - start> 60) {
+        for (int i = 0; i < 32; i++) {
+            while (!TempSensor.read());
+            start = timer.read_us();
+            while (TempSensor.read());
+            end = timer.read_us();
+
+            if (end - start > 50) {
+                temperature <<= 1;
+                temperature |= 1;
+            } else {
+                temperature <<= 1;
+            }
+        }
+        temperature &= 0xFFFF;
+    }
+    timer.reset();
+    //pc.printf("Temperature : %d\n",temperature);
+}
+void displayData()
+{
+
+    if(run==1) {
+        lcd.setCursor(15,1);
+        string temp;
+        sprintf(&temp[0],"%.1fC",float(temperature)/10);
+        lcd.print(temp.c_str());
+        temp.clear();
+        lcd.setCursor(15,0);
+        sprintf(&temp[0],"%.2f",process);
+        lcd.print(temp.c_str());
+
+    }
+}
diff -r 000000000000 -r 7e94da02b931 mbed.bld
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mbed.bld	Thu Dec 10 08:34:15 2015 +0000
@@ -0,0 +1,1 @@
+http://mbed.org/users/mbed_official/code/mbed/builds/165afa46840b
\ No newline at end of file