home *** CD-ROM | disk | FTP | other *** search
Java Source | 2017-09-21 | 19.5 KB | 668 lines |
- ///////////////////////////////////////////////////////////////////
- // Script.java -- LED Sign V2.5
- //
- // Contains the following classes:
- // Script -- The class that manages the script
- // including parsing, storage, and
- // retrieval.
- //
- // Revisions:
- // V2.5: Fixed all known bugs in previous versions! Added
- // the new feature of ledsize, which allows the user
- // to specify in pixels how big the LED's (1-4).
- // Thanks to Robert B. Denny (rdenny@dc3.com) for
- // code and input!
- // Modified Dec 20-26, 1995
- //
- // V2.0beta: Modified V1.0 to comply with Pre-Beta java.
- // A problem with delay causes a jerky display.
- // Modified Oct 20 - 29, 1995
- //
- // V1.0: Written July 17 - August 6, 1995
- //
- // by Darrick Brown
- // dbrown@cs.hope.edu
- // http://www.cs.hope.edu/~dbrown/
- //
- // ⌐ Copyright 1995
- ///////////////////////////////////////////////////////////////////
-
- /*package LED;*/
-
- import java.awt.*;
- import java.io.*;
- import java.util.*;
- import java.net.*;
- import FuncInfo;
- import linkList;
-
- ///////////////////////////////////////////////////////////////////
- // Function Code
- // -------- ----
- // Appear 0
- // Sleep 1
- // ScrollLeft 2
- // ScrollRight 3
- // ScrollUp 4
- // ScrollDown 5
- // Pixel 6
- // Blink 7
- // OverRight 8
- // ScrollCenter 9
- // OverCenter 10
- // OverLeft 11
- // OverUp 12
- // OverDown 13
- // Do 97
- // Repeat 98
- // Reload 99
- ///////////////////////////////////////////////////////////////////
-
- ///////////////////////////////////////////////////////////////////
- ///////////////////////////////////////////////////////////////////
- // The class that parses the script and keeps it in memory
- public class Script
- {
- linkList list; // the linked list for the script
- linkList ptr,start; // the current line and start of the list
- String scrpt;
- URL documentURL;
-
- ///////////////////////////////////////////////////////////////////
- // The constructor
- public Script(URL url, String s)
- {
- scrpt = s;
- documentURL = url;
- initScript();
- }
-
- ///////////////////////////////////////////////////////////////////
- // get the parameters from the functions in the script
- String getParam(String s, String sub)
- {
- int i,j;
- String tmp;
-
- i = s.indexOf(sub);
- j = s.indexOf("text");
-
- if(j == -1 || i <= j) // if the first occurance of "sub" is before
- { // the "text=" (ie not in the message)
- if(i == -1)
- return null;
- else
- {
- tmp = s.substring(i); // forget everything before the sub
- i = tmp.indexOf("=");
- if(i == -1)
- {
- System.out.println("Error in '"+sub+"' parameter in "+s);
- return null;
- }
- else
- {
- i++; // one spot after the "="
- if(sub.compareTo("text") == 0)
- tmp = tmp.substring(i);
- else
- {
- tmp = tmp.substring(i);
- if(tmp.indexOf(" ") != -1)
- tmp = tmp.substring(0,tmp.indexOf(" "));
- }
- tmp.trim();
- return tmp;
- }
- }
- }
- else
- return null;
-
- } // End getParam()
-
- ///////////////////////////////////////////////////////////////////
- // get the function info
- FuncInfo getFunc(String s)
- {
- int i;
- String tmp;
- FuncInfo fi = new FuncInfo();
-
- // Assign the defaults
- fi.func = -1;
- fi.delay = 40;
- fi.startspace = 10;
- fi.endspace = 20;
- fi.times = -1;
- fi.remaining = 0;
- fi.centered = false;
- fi.color = new String("");
- fi.text = new String("No text specified");
- fi.url = null;
- fi.ret = null;
-
- //get rid of any starting (and ending) white space, just to be sure.
- s = s.trim();
-
- ////////////////////////////////////////////////////
- // Any parameters that might exist. This will
- // read in any command line parameters for each
- // function. For example: Sleep text=blah blah
- // is accepted, but the text will never be used
-
- tmp = getParam(s,"delay");
- if(tmp != null)
- fi.delay = (new Integer(tmp)).intValue();
-
- tmp = getParam(s,"clear");
- if(tmp != null && tmp.compareTo("true") == 0)
- {
- fi.centered = true;
- fi.text = new String("");
- }
- else
- {
- tmp = getParam(s,"center");
- if(tmp != null && tmp.compareTo("true") == 0)
- fi.centered = true;
- else
- {
- fi.centered = false;
- tmp = getParam(s,"startspace");
- if(tmp != null)
- fi.startspace = (new Integer(tmp)).intValue();
-
- tmp = getParam(s,"endspace");
- if(tmp != null)
- fi.endspace = (new Integer(tmp)).intValue();
- }
-
- tmp = getParam(s,"text");
- if(tmp != null)
- fi.text = tmp;
- }
-
- tmp = getParam(s,"times");
- if(tmp != null)
- {
- fi.times = (new Integer(tmp)).intValue();
- fi.remaining = fi.times;
- }
-
- tmp = getParam(s,"pixels");
- if(tmp != null)
- {
- fi.times = (new Integer(tmp)).intValue();
- fi.remaining = fi.times;
- }
-
- tmp = getParam(s,"URL");
- if(tmp != null)
- {
- try
- {
- fi.url = new URL(tmp);
- }
- catch(MalformedURLException e)
- {
- System.out.println("Bad URL: "+tmp);
- fi.url = null;
- }
- }
- else
- {
- fi.url = null;
- }
-
- ////////////////////////////////////////////////////
- // set the function number (and some minor
- // tweeks/precautions)
- i = s.indexOf(" ");
- if(i != -1)
- tmp = s.substring(0,i);
- else
- tmp = s;
-
- if(tmp.compareTo("Appear") == 0)
- {
- fi.func = 0;
- }
- else if(tmp.compareTo("Sleep") == 0)
- {
- fi.func = 1;
- }
- else if(tmp.compareTo("ScrollLeft") == 0)
- {
- fi.func = 2;
- }
- else if(tmp.compareTo("ScrollRight") == 0)
- {
- fi.func = 3;
- }
- else if(tmp.compareTo("ScrollUp") == 0)
- {
- fi.func = 4;
- }
- else if(tmp.compareTo("ScrollDown") == 0)
- {
- fi.func = 5;
- }
- else if(tmp.compareTo("Pixel") == 0)
- {
- fi.func = 6;
-
- // Just for precautions dealing with a delay problem.
- // This shouldn't be noticable.
- if(fi.delay < 1)
- fi.delay = 1;
-
- // Can't allow "times" to be 0 or less, it will cause
- // the sign to freeze (not procede).
- if(fi.times < 1)
- fi.times = 15;
- }
- else if(tmp.compareTo("Blink") == 0)
- {
- fi.func = 7;
-
- if(fi.times < 1)
- fi.times = 2;
- }
- else if(tmp.compareTo("OverRight") == 0)
- {
- fi.func = 8;
- }
- else if(tmp.compareTo("ScrollCenter") == 0)
- {
- fi.func = 9;
- }
- else if(tmp.compareTo("OverCenter") == 0)
- {
- fi.func = 10;
- }
- else if(tmp.compareTo("OverLeft") == 0)
- {
- fi.func = 11;
- }
- else if(tmp.compareTo("OverUp") == 0)
- {
- fi.func = 12;
- }
- else if(tmp.compareTo("OverDown") == 0)
- {
- fi.func = 13;
- }
- else if(tmp.compareTo("Do") == 0)
- {
- fi.func = 97; // This marks a place for the "repeats" to go back to.
- }
- else if(tmp.compareTo("Repeat") == 0)
- {
- fi.func = 98;
- }
- else if(tmp.compareTo("Reload") == 0)
- {
- fi.func = 99;
- }
-
- fi.store = fi.text;
-
- return fi;
- } // End getFunc()
-
- //////////////////////////////////////////////////////////////////
- // get the next function
- FuncInfo nextFunc()
- {
- FuncInfo fi;
-
- fi = ptr.fi;
- ptr = ptr.next;
-
- switch(fi.func)
- {
- case 97: // Do
- fi = nextFunc(); // skip the "Do function; its just a marker
- break;
-
- case 98: // a Repeat
-
- // If it doesn't repeat infinitely...
- if(fi.times >= 0)
- {
- // One less time
- fi.remaining--;
- if(fi.remaining <= 0)
- {
- fi.remaining = fi.times; // reset the loop
- fi = nextFunc();
- }
- else
- {
- ptr = fi.ret; // Jump back to the last "Do"
- fi = nextFunc();
- }
- }
- else
- {
- ptr = fi.ret; // Jump back to the last "Do"
- fi = nextFunc();
- }
- break;
-
- case 99: // Reload
- initScript(); // Reload the script from the URL
- fi = nextFunc(); // and get the first function.
- break;
- }
-
- return fi;
- } // End nextFunc()
-
- //////////////////////////////////////////////////////////////////
- // just a simple function to see if it is a color code
- boolean isColor(char t)
- {
- if(t == 'r' || t == 'g' || t == 'b' || t == 'y' || t == 'o' || t == 'p' || t == 'w' || t == 'c')
- return true;
- else
- return false;
- }
-
-
- //////////////////////////////////////////////////////////////////
- // Get the varible defined
- String getVar(String s, int i)
- {
- String t;
-
- if(s.charAt(i) == '{')
- {
- t = s.substring(i+1);
- t = t.substring(0,t.indexOf('}'));
- }
- else
- t = String.valueOf(s.charAt(i));
-
- return t;
- }
-
- //////////////////////////////////////////////////////////////////
- // create the final text line from parsing the store line
- // Add any codes (ie \t, \r, \g, \b, etc.) here to parse
- // out of the text line.
- FuncInfo parseLine(FuncInfo fi)
- {
- String tmp;
- String time;
- String month[] = {"Jan","Feb","Mar","Apr","May","Jun",
- "Jul","Aug","Sept","Oct","Nov","Dec"};
- String Month[] = {"January","February","March","April","May","June",
- "July","August","September","October","November","December"};
- String day[] = {"Sun","Mon","Tues","Wed","Thur","Fri","Sat"};
- String Day[] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
- String ddmmyy;
- int min;
- int pm;
- Date date = new Date();
- int a,b;
- int i;
- char c;
- String t; // The tag (eg. text=Hello \ythere, t=y)
-
- tmp = fi.store;
- fi.color = "";
-
- if(fi.func == 0 || (fi.func >= 2 && fi.func <= 97))
- {
- c = 'r'; // the default color
- b = 0;
- while(b < tmp.length())
- {
- if(tmp.charAt(b) == '\\') // if there is a '\' does the following
- { // letter indicate a color.
- b++;
- // Get the tag!
- if(tmp.charAt(b) == '{')
- {
- t = tmp.substring(b+1);
-
- // cut out the \{XX}
- tmp = tmp.substring(0,b-1).concat(t.substring(t.indexOf('}')+1));
- t = t.substring(0,t.indexOf('}'));
- b -= 1;
- }
- else
- {
- t = tmp.substring(b,b+1);
- tmp = (tmp.substring(0,b-1)).concat(tmp.substring(b+1)); // take the "\r" out
- b -= 1;
- }
-
- // set the
- if(t.length() == 1 && isColor(t.charAt(0)))
- {
- c = t.charAt(0);
- }
- else if(t.compareTo("tt") == 0)
- {
- // it is the "time" variable!!
- if(date.getHours() >= 12)
- pm = 1;
- else
- pm = 0;
-
- if(pm == 1)
- {
- a = date.getHours();
- if(a == 12)
- time = String.valueOf(12);
- else
- time = String.valueOf(date.getHours()-12);
- }
- else
- {
- a = date.getHours();
- if(a == 0)
- time = String.valueOf(12);
- else
- time = String.valueOf(a);
- }
-
- time = time.concat(":");
-
- min = date.getMinutes();
- if(min >= 10)
- time = time.concat(String.valueOf(min));
- else
- {
- time = time.concat("0");
- time = time.concat(String.valueOf(min));
- }
-
- if(pm == 1)
- time = time.concat(" pm");
- else
- time = time.concat(" am");
-
- tmp = ((tmp.substring(0,b)).concat(time)).concat(tmp.substring(b));
-
- b += time.length();
-
- for(i = 0; i < time.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- } // End time
- else if(t.compareTo("dd") == 0 || t.compareTo("DD") == 0) // Set the current date
- {
- if(t.compareTo("dd") == 0)
- ddmmyy = day[date.getDay()];
- else
- ddmmyy = Day[date.getDay()];
-
- // Set up the color
- for(i = 0; i < ddmmyy.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- tmp = ((tmp.substring(0,b)).concat(ddmmyy)).concat(tmp.substring(b));
- b += ddmmyy.length();
- }
- else if(t.compareTo("dn") == 0)
- {
- ddmmyy = String.valueOf(date.getDate());
-
- // Set up the color
- for(i = 0; i < ddmmyy.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- tmp = ((tmp.substring(0,b)).concat(ddmmyy)).concat(tmp.substring(b));
- b += ddmmyy.length();
- }
- else if(t.compareTo("mm") == 0 || t.compareTo("MM") == 0)
- {
- if(t.compareTo("mm") == 0)
- ddmmyy = month[date.getMonth()];
- else
- ddmmyy = Month[date.getMonth()];
-
- // Set up the color
- for(i = 0; i < ddmmyy.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- tmp = ((tmp.substring(0,b)).concat(ddmmyy)).concat(tmp.substring(b));
- b += ddmmyy.length();
- }
- else if(t.compareTo("mn") == 0)
- {
- ddmmyy = String.valueOf(date.getMonth()+1);
-
- // Set up the color
- for(i = 0; i < ddmmyy.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- tmp = ((tmp.substring(0,b)).concat(ddmmyy)).concat(tmp.substring(b));
- b += ddmmyy.length();
- }
- else if(t.compareTo("yy") == 0 || t.compareTo("YY") == 0)
- {
- if(t.compareTo("YY") == 0)
- ddmmyy = String.valueOf(date.getYear()+1900);
- else
- ddmmyy = String.valueOf(date.getYear()%100);
-
- // Set up the color
- for(i = 0; i < ddmmyy.length(); i++)
- fi.color = (fi.color).concat((new Character(c)).toString());
-
- tmp = ((tmp.substring(0,b)).concat(ddmmyy)).concat(tmp.substring(b));
- b += ddmmyy.length();
-
- } // End short date
- else if(t.compareTo("\\") == 0) // Are they trying to delimit the backslash?
- {
- tmp = (tmp.substring(0,b)).concat(tmp.substring(b+1)); // delimit the '\'
- b--;
- }
- else
- {
- // A little error output
- System.out.println("Backslash (\\) error in text line: "+ fi.store);
- }
-
- } // END - if(tmp.charAt(b) == '\\')
- else
- {
- b++;
- fi.color = fi.color.concat((new Character(c)).toString());
- }
-
- } // END - for(...)
-
- } // END - if(fi.func == ...)
-
- fi.text = tmp;
-
- return fi;
-
- }
-
- //////////////////////////////////////////////////////////////////
- // Read in the script into a linked list of FuncInfo's
- void initScript()
- {
- InputStream file;
- DataInputStream dis;
- URL url;
- String line;
- int listlen;
- int dos;
- int a;
-
- try
- {
- url = new URL(documentURL,scrpt);
-
- file = url.openStream();
- dis = new DataInputStream(file);
-
- list = new linkList(); // The linked list
- start = list; // The head of the list
- ptr = list; // The current element
- listlen = 0;
- dos = 0; // Used to know how many Do's there are
- while((line = dis.readLine()) != null)
- {
- line = line.trim(); // cut off white space at the beginning and end
- if(!(line.startsWith("!!")) && (line.length() != 0)) // Not a comment or blank line
- {
- listlen++;
- ptr.fi = getFunc(line); // Get the function number
- if(ptr.fi.func == 97)
- dos++; // Chalk up another "Do"
- ptr.next = new linkList();
- ptr = ptr.next; // advance to the next command
- }
- }
-
- // Ok now lets set the return pointers for the loops
- ptr = start;
- linkList stack[] = new linkList[dos]; // Allocate the array
- dos = 0;
- for(a=0;a<listlen;a++)
- {
- if(ptr.fi.func == 97) // A "Do"
- {
- stack[dos] = new linkList();
- stack[dos] = ptr;
- dos++;
- }
- else if(ptr.fi.func == 98) // A Repeat
- {
- if(dos > 0)
- {
- dos--;
- ptr.fi.ret = stack[dos];
- }
- else
- {
- // OMYGOSH!! Script error output!!!!
- System.out.println("Repeat error in line : Repeat times="+ptr.fi.times);
- System.out.println(" Mismatched Do/Repeats?");
- }
- }
- ptr = ptr.next;
- }
-
- ptr = start;
-
- file.close();
- dis.close();
- }
- catch (IOException e)
- {
- e.printStackTrace();
- }
- } // End initScript()
- } // End Class Script
-