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

Committer:
fablabtruck
Date:
Fri Jun 08 09:26:40 2012 +0000
Revision:
0:3852426a5068
svn revision 379

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fablabtruck 0:3852426a5068 1 /**
fablabtruck 0:3852426a5068 2 * LaosDisplay.cpp
fablabtruck 0:3852426a5068 3 * User interface class, for
fablabtruck 0:3852426a5068 4 * => 2x16 display and keypad
fablabtruck 0:3852426a5068 5 * => serial connection
fablabtruck 0:3852426a5068 6 *
fablabtruck 0:3852426a5068 7 * Copyright (c) 2011 Peter Brier and Jaap Vermaas
fablabtruck 0:3852426a5068 8 *
fablabtruck 0:3852426a5068 9 * This file is part of the LaOS project (see: http://wiki.laoslaser.org/)
fablabtruck 0:3852426a5068 10 *
fablabtruck 0:3852426a5068 11 * LaOS is free software: you can redistribute it and/or modify
fablabtruck 0:3852426a5068 12 * it under the terms of the GNU General Public License as published by
fablabtruck 0:3852426a5068 13 * the Free Software Foundation, either version 3 of the License, or
fablabtruck 0:3852426a5068 14 * (at your option) any later version.
fablabtruck 0:3852426a5068 15 *
fablabtruck 0:3852426a5068 16 * LaOS is distributed in the hope that it will be useful,
fablabtruck 0:3852426a5068 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
fablabtruck 0:3852426a5068 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
fablabtruck 0:3852426a5068 19 * GNU General Public License for more details.
fablabtruck 0:3852426a5068 20 *
fablabtruck 0:3852426a5068 21 * You should have received a copy of the GNU General Public License
fablabtruck 0:3852426a5068 22 * along with LaOS. If not, see <http://www.gnu.org/licenses/>.
fablabtruck 0:3852426a5068 23 *
fablabtruck 0:3852426a5068 24 */
fablabtruck 0:3852426a5068 25 #include "LaosDisplay.h"
fablabtruck 0:3852426a5068 26 #include "mbed.h"
fablabtruck 0:3852426a5068 27
fablabtruck 0:3852426a5068 28 // Serial
fablabtruck 0:3852426a5068 29 Serial serial(USBTX, USBRX);
fablabtruck 0:3852426a5068 30 #define _SERIAL_BAUD 115200
fablabtruck 0:3852426a5068 31
fablabtruck 0:3852426a5068 32 // I2C
fablabtruck 0:3852426a5068 33 I2C i2c(p9, p10); // sda, scl
fablabtruck 0:3852426a5068 34 #define _I2C_ADDRESS 0x04
fablabtruck 0:3852426a5068 35 #define _I2C_HOME 0xFE
fablabtruck 0:3852426a5068 36 #define _I2C_CLS 0xFF
fablabtruck 0:3852426a5068 37 #define _I2C_BAUD 9600
fablabtruck 0:3852426a5068 38
fablabtruck 0:3852426a5068 39 // Make new config file object
fablabtruck 0:3852426a5068 40 LaosDisplay::LaosDisplay()
fablabtruck 0:3852426a5068 41 {
fablabtruck 0:3852426a5068 42 int i2cBaud = _I2C_BAUD;
fablabtruck 0:3852426a5068 43 i2c.frequency(i2cBaud );
fablabtruck 0:3852426a5068 44 int serialBaud = _SERIAL_BAUD;
fablabtruck 0:3852426a5068 45 serial.baud(serialBaud);
fablabtruck 0:3852426a5068 46
fablabtruck 0:3852426a5068 47 char key;
fablabtruck 0:3852426a5068 48 // test I2C, if we cannot read, display is not attached, enable simulation
fablabtruck 0:3852426a5068 49 // wait 1 second to make sure that I2C has time to power on!
fablabtruck 0:3852426a5068 50 wait(3);
fablabtruck 0:3852426a5068 51 sim = i2c.read(_I2C_ADDRESS ,&key, 1) != 0;
fablabtruck 0:3852426a5068 52 if (sim) {
fablabtruck 0:3852426a5068 53 printf("LaosDisplay()\n");
fablabtruck 0:3852426a5068 54 printf("Display() Simulation=ON, I2C Baudrate=%d\n", i2cBaud );
fablabtruck 0:3852426a5068 55 }
fablabtruck 0:3852426a5068 56 }
fablabtruck 0:3852426a5068 57
fablabtruck 0:3852426a5068 58 // Test I2C again when config file is read
fablabtruck 0:3852426a5068 59 void LaosDisplay::testI2C() {
fablabtruck 0:3852426a5068 60 char key;
fablabtruck 0:3852426a5068 61 sim = i2c.read(_I2C_ADDRESS ,&key, 1) != 0;
fablabtruck 0:3852426a5068 62 if (sim) mbed_reset();
fablabtruck 0:3852426a5068 63 }
fablabtruck 0:3852426a5068 64
fablabtruck 0:3852426a5068 65 // Write string
fablabtruck 0:3852426a5068 66 void LaosDisplay::write(char *s)
fablabtruck 0:3852426a5068 67 {
fablabtruck 0:3852426a5068 68 if ( sim )
fablabtruck 0:3852426a5068 69 {
fablabtruck 0:3852426a5068 70 while (*s)
fablabtruck 0:3852426a5068 71 serial.putc(*s++);
fablabtruck 0:3852426a5068 72 return;
fablabtruck 0:3852426a5068 73 } else {
fablabtruck 0:3852426a5068 74 while (*s)
fablabtruck 0:3852426a5068 75 i2c.write(_I2C_ADDRESS, s++, 1);
fablabtruck 0:3852426a5068 76 }
fablabtruck 0:3852426a5068 77 }
fablabtruck 0:3852426a5068 78
fablabtruck 0:3852426a5068 79 // Clear screen
fablabtruck 0:3852426a5068 80 void LaosDisplay::cls()
fablabtruck 0:3852426a5068 81 {
fablabtruck 0:3852426a5068 82 char s[2];
fablabtruck 0:3852426a5068 83 s[0] = _I2C_HOME;
fablabtruck 0:3852426a5068 84 s[1] = 0;
fablabtruck 0:3852426a5068 85 write(s);
fablabtruck 0:3852426a5068 86 }
fablabtruck 0:3852426a5068 87
fablabtruck 0:3852426a5068 88 // Read Key
fablabtruck 0:3852426a5068 89 int LaosDisplay::read()
fablabtruck 0:3852426a5068 90 {
fablabtruck 0:3852426a5068 91 char key = 0;
fablabtruck 0:3852426a5068 92 if (sim)
fablabtruck 0:3852426a5068 93 {
fablabtruck 0:3852426a5068 94 if ( serial.readable() )
fablabtruck 0:3852426a5068 95 key = serial.getc();
fablabtruck 0:3852426a5068 96 else
fablabtruck 0:3852426a5068 97 key = 0;
fablabtruck 0:3852426a5068 98 }
fablabtruck 0:3852426a5068 99 else
fablabtruck 0:3852426a5068 100 i2c.read(_I2C_ADDRESS ,&key, 1);
fablabtruck 0:3852426a5068 101 if ((key < '1') || (key > '9'))
fablabtruck 0:3852426a5068 102 key = 0;
fablabtruck 0:3852426a5068 103 return key;
fablabtruck 0:3852426a5068 104 }
fablabtruck 0:3852426a5068 105
fablabtruck 0:3852426a5068 106 /**
fablabtruck 0:3852426a5068 107 *** Screens are defined with:
fablabtruck 0:3852426a5068 108 *** name, line[2], int* i[4], char *s;
fablabtruck 0:3852426a5068 109 ***
fablabtruck 0:3852426a5068 110 *** in the lines, the following replacements are made:
fablabtruck 0:3852426a5068 111 *** $$$$$$ : "$" chars are replaced with the string argument for this screen (left alligned), if argument is NULL, spaces are inserted
fablabtruck 0:3852426a5068 112 *** +9876543210: "+" and numbers are replaced with decimal digits from the integer arguments (the "+" sign is replaced with '-' if the argument is negative
fablabtruck 0:3852426a5068 113 ***
fablabtruck 0:3852426a5068 114 ***
fablabtruck 0:3852426a5068 115 **/
fablabtruck 0:3852426a5068 116 inline char digit(int i, int n)
fablabtruck 0:3852426a5068 117 {
fablabtruck 0:3852426a5068 118 int d=1;
fablabtruck 0:3852426a5068 119 char c;
fablabtruck 0:3852426a5068 120 if ( i<0 ) i *= -1;
fablabtruck 0:3852426a5068 121 while(n--) d *= 10;
fablabtruck 0:3852426a5068 122 c = '0' + ((i/d) % 10);
fablabtruck 0:3852426a5068 123 return c;
fablabtruck 0:3852426a5068 124 }
fablabtruck 0:3852426a5068 125
fablabtruck 0:3852426a5068 126 void LaosDisplay::ShowScreen(const char *l, int *arg, char *s)
fablabtruck 0:3852426a5068 127 {
fablabtruck 0:3852426a5068 128 char c, next=0,surpress=1;
fablabtruck 0:3852426a5068 129 char str[128],*p;
fablabtruck 0:3852426a5068 130 p = str;
fablabtruck 0:3852426a5068 131 *p++ = _I2C_HOME;
fablabtruck 0:3852426a5068 132 while ( *l )
fablabtruck 0:3852426a5068 133 {
fablabtruck 0:3852426a5068 134 c=*l;
fablabtruck 0:3852426a5068 135 switch ( c )
fablabtruck 0:3852426a5068 136 {
fablabtruck 0:3852426a5068 137 case '$':
fablabtruck 0:3852426a5068 138 if (s != NULL && *s)
fablabtruck 0:3852426a5068 139 c = *s++;
fablabtruck 0:3852426a5068 140 else
fablabtruck 0:3852426a5068 141 c = ' ';
fablabtruck 0:3852426a5068 142 break;
fablabtruck 0:3852426a5068 143
fablabtruck 0:3852426a5068 144 case '+':
fablabtruck 0:3852426a5068 145 if (arg != NULL && *arg < 0)
fablabtruck 0:3852426a5068 146 c = '-';
fablabtruck 0:3852426a5068 147 else
fablabtruck 0:3852426a5068 148 c = '+';
fablabtruck 0:3852426a5068 149 break;
fablabtruck 0:3852426a5068 150
fablabtruck 0:3852426a5068 151 case '0': next=1; surpress=0;
fablabtruck 0:3852426a5068 152 case '1': case '2': case '3': case '4':
fablabtruck 0:3852426a5068 153 case '5': case '6': case '7': case '8': case '9':
fablabtruck 0:3852426a5068 154 char d = ' ';
fablabtruck 0:3852426a5068 155 if (arg != NULL )
fablabtruck 0:3852426a5068 156 {
fablabtruck 0:3852426a5068 157 d = digit(*arg, *l-'0');
fablabtruck 0:3852426a5068 158 if ( d == '0' && surpress ) // supress leading zeros
fablabtruck 0:3852426a5068 159 d = ' ';
fablabtruck 0:3852426a5068 160 else
fablabtruck 0:3852426a5068 161 surpress = 0;
fablabtruck 0:3852426a5068 162 if ( next && arg != NULL ) // take next numeric argument
fablabtruck 0:3852426a5068 163 {
fablabtruck 0:3852426a5068 164 arg++;
fablabtruck 0:3852426a5068 165 next=0;
fablabtruck 0:3852426a5068 166 surpress=1;
fablabtruck 0:3852426a5068 167 }
fablabtruck 0:3852426a5068 168 }
fablabtruck 0:3852426a5068 169 c = d;
fablabtruck 0:3852426a5068 170 break;
fablabtruck 0:3852426a5068 171 }
fablabtruck 0:3852426a5068 172 *p++ = c;
fablabtruck 0:3852426a5068 173 l++;
fablabtruck 0:3852426a5068 174 }
fablabtruck 0:3852426a5068 175 *p=0;
fablabtruck 0:3852426a5068 176 write(str);
fablabtruck 0:3852426a5068 177 }
fablabtruck 0:3852426a5068 178
fablabtruck 0:3852426a5068 179 // EOF