This is the firmware for the LaOS - Laser Open Source project. You can use it to drive a laser cutter. For hardware and more information, look at our wiki: http://wiki.laoslaser.org

Dependencies:   EthernetNetIf mbed

Revision:
0:3852426a5068
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LaosDisplay/LaosDisplay.cpp	Fri Jun 08 09:26:40 2012 +0000
@@ -0,0 +1,179 @@
+/**
+ * LaosDisplay.cpp
+ * User interface class, for 
+ *    => 2x16 display and keypad
+ *    => serial connection
+ *
+ * Copyright (c) 2011 Peter Brier and Jaap Vermaas
+ *
+ *   This file is part of the LaOS project (see: http://wiki.laoslaser.org/)
+ *
+ *   LaOS is free software: you can redistribute it and/or modify
+ *   it under the terms of the GNU General Public License as published by
+ *   the Free Software Foundation, either version 3 of the License, or
+ *   (at your option) any later version.
+ *
+ *   LaOS is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU General Public License for more details.
+ *
+ *   You should have received a copy of the GNU General Public License
+ *   along with LaOS.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+#include "LaosDisplay.h"
+#include "mbed.h"
+
+// Serial
+Serial serial(USBTX, USBRX);
+#define _SERIAL_BAUD 115200
+
+// I2C
+I2C i2c(p9, p10);        // sda, scl
+#define _I2C_ADDRESS 0x04
+#define _I2C_HOME 0xFE
+#define _I2C_CLS 0xFF
+#define _I2C_BAUD 9600
+
+// Make new config file object
+LaosDisplay::LaosDisplay()
+{
+  int i2cBaud = _I2C_BAUD;
+  i2c.frequency(i2cBaud );
+  int serialBaud = _SERIAL_BAUD;
+  serial.baud(serialBaud);
+  
+  char key;
+  // test I2C, if we cannot read, display is not attached, enable simulation
+  // wait 1 second to make sure that I2C has time to power on!
+  wait(3);
+  sim = i2c.read(_I2C_ADDRESS ,&key, 1) != 0; 
+  if (sim) {
+    printf("LaosDisplay()\n");
+    printf("Display() Simulation=ON, I2C Baudrate=%d\n", i2cBaud  );
+  }
+}
+
+// Test I2C again when config file is read
+void LaosDisplay::testI2C() {
+    char key;
+    sim = i2c.read(_I2C_ADDRESS ,&key, 1) != 0;
+    if (sim) mbed_reset();
+}
+
+// Write string
+void LaosDisplay::write(char *s) 
+{  
+  if ( sim ) 
+  {
+    while (*s)
+      serial.putc(*s++);
+    return;
+  } else {
+    while (*s)
+      i2c.write(_I2C_ADDRESS, s++, 1);
+  }
+}
+
+// Clear screen
+void LaosDisplay::cls() 
+{
+   char s[2];
+   s[0] = _I2C_HOME;
+   s[1] = 0;
+   write(s);
+}
+
+// Read Key
+int LaosDisplay::read() 
+{
+  char key = 0;
+  if (sim)
+  {
+    if ( serial.readable() )
+      key =  serial.getc();
+    else
+      key = 0;
+  }
+  else
+    i2c.read(_I2C_ADDRESS ,&key, 1);
+  if ((key < '1') || (key > '9'))
+    key = 0;
+  return key;   
+}
+
+/**
+*** Screens are defined with:
+*** name, line[2], int* i[4], char *s;
+***
+*** in the lines, the following replacements are made:
+*** $$$$$$ : "$" chars are replaced with the string argument for this screen (left alligned), if argument is NULL, spaces are inserted
+*** +9876543210: "+" and numbers are replaced with decimal digits from the integer arguments (the "+" sign is replaced with '-' if the argument is negative
+*** 
+***
+**/
+inline char digit(int i, int n)
+{
+  int d=1;
+  char c;
+  if ( i<0 ) i *= -1;
+  while(n--) d *= 10;
+  c = '0' + ((i/d) % 10);
+  return c;
+}
+
+void LaosDisplay::ShowScreen(const char *l, int *arg, char *s)
+{
+  char c, next=0,surpress=1;
+  char str[128],*p; 
+  p = str;
+  *p++ = _I2C_HOME;
+  while ( *l )
+  {
+    c=*l;
+    switch ( c )
+    {
+    case '$': 
+      if (s != NULL && *s)
+        c = *s++;
+      else 
+        c = ' ';
+      break;
+      
+    case '+':
+      if (arg != NULL && *arg < 0)
+        c = '-';
+      else 
+        c = '+';
+      break;
+        
+    case '0': next=1; surpress=0; 
+    case '1': case '2': case '3': case '4': 
+    case '5': case '6': case '7': case '8': case '9':
+      char d = ' ';
+      if (arg != NULL )
+      {
+        d = digit(*arg, *l-'0');
+        if ( d == '0' && surpress  ) // supress leading zeros 
+          d =  ' ';
+        else
+          surpress = 0;
+        if ( next && arg != NULL ) // take next numeric argument
+        {
+          arg++;
+          next=0;
+          surpress=1;
+        }
+      }
+      c = d;
+      break;
+    }
+    *p++ = c;
+    l++;
+  }
+  *p=0;
+  write(str);
+}
+
+// EOF