Subversion Repositories HomeAutomation

Rev

Go to most recent revision | Blame | Last modification | View Log | SVN | RSS feed

  1. /*
  2.  * File created by arune
  3.  * at 2004-jan-06 13:30:00
  4.  */
  5. package Macbeth.Modules.modSmallDisplays;
  6.  
  7. import Macbeth.System.MbPacket;
  8.  
  9. import java.util.Vector;
  10.  
  11.  
  12. /**
  13.  * A representation of one of the displays on the arne-network,
  14.  * it also handles everything that can be done with it.
  15.  * @author arune
  16.  */
  17. public class DisplayObject {
  18.  
  19.     //todo: vore trevligt ifall displayen scrollade text om den var längre än displayens bredd (men max 40 tecken)
  20.     //ska detta göras i macbeth? helst inte, se om man kan få scroll i avren
  21.     //om det går i avren så får man i displaymodulen fixa så man inte klipper ner rader till displayens bredd
  22.     private final int ARNEMAXPACKETSIZE = 15;
  23.     // place what type of display this is, location ...
  24.     private String sInfo;
  25.     // arne name for this display
  26.     private String sTarget;
  27.     // The number of columns of the display
  28.     private int iWidth;
  29.     // The number of rows of the display
  30.     private int iHeight;
  31.     // Holds the to-be contents of the display, sNewContents[0] is top-row, sNewContents[iHeight-1] is bottom-row
  32.     private String[] sNewContents;
  33.     // Holds the CURRENT contents of the display
  34.     private String[] sCurrContents;
  35.  
  36.     private static final int LCDSETADDRESS = 128;
  37.     private static final int LCDTEXTWRITE = 129;
  38.     private static final int LCDNULL = 160;
  39.     private static final int LCDCLEAR = 130;
  40.     private static final int LCDSETBL = 164;
  41.     private static final int LCDFADEBL = 165;
  42.     private static final int LCDFADESPEED = 166;
  43.     private static final int LCDCGRAMWRITE = 166;
  44.  
  45.     //queue-vectors
  46.     private Vector rowPrio0 = new Vector();
  47.     private Vector rowPrio1 = new Vector();
  48.     private Vector rowPrio2 = new Vector();
  49.     //queue-objects gets moved into this vector when placed on display
  50.     private Vector rowsCurrent = new Vector();
  51.  
  52.     private Vector freeRows = new Vector();
  53.     //private Vector takenRows = new Vector();
  54.  
  55.     //stores an addresslayout of the display
  56.     private Vector rowAddresses = new Vector();
  57.     //stores a list of what modules that sends data to this display
  58.     private Vector moduleUsers = new Vector();
  59.  
  60.     /**
  61.      * Creates a new instance of DisplayObject.
  62.      * @param target arne name for this display.
  63.      * @param info The name of this object, what type of display this is, location, and so on.
  64.      * @param width The number of columns of the display.
  65.      * @param height The number of rows of the display.
  66.      * @param rows A list of first-position-addresses.
  67.      * @param users A list of modules that sends data to this display.
  68.      */
  69.     public DisplayObject(String target, String info, int width, int height, Vector rows, Vector users) {
  70.         sInfo = info;
  71.         sTarget = target;
  72.         iWidth = width;
  73.         iHeight = height;
  74.         rowAddresses = rows;
  75.         moduleUsers = users;
  76.  
  77.         //initiate our contentsholders
  78.         if (iHeight > 0) {
  79.             sNewContents = new String[iHeight];
  80.             sCurrContents = new String[iHeight];
  81.             for (int i = 0; i < iHeight; i++) {
  82.                 //kor rowFixer for att fixa radernas längd direkt
  83.                 sNewContents[i] = rowFixer("");
  84.                 sCurrContents[i] = rowFixer("............................................");
  85.  
  86.             }
  87.         }
  88.         //todo: initiera rowsCurrent
  89.  
  90.         for (int i = 0; i < iHeight; i++) {
  91.             RowObject dummyRowObject = new RowObject();
  92.             dummyRowObject.rowNumber = i;
  93.             dummyRowObject.TTL = 0;
  94.             //System.out.println("init rowelement: " + i);
  95.             if (i == 0) {
  96.                 dummyRowObject.row = "-Macbeth-";
  97.                 writeRow(dummyRowObject.rowNumber, dummyRowObject.row);
  98.             } else if (i==1) {
  99.                 dummyRowObject.row = "Booting up";
  100.                 writeRow(dummyRowObject.rowNumber, dummyRowObject.row);
  101.             }
  102.             rowsCurrent.add(dummyRowObject);
  103.             //... ???
  104.  
  105.  
  106.         }
  107.  
  108.     }
  109.  
  110.     /**
  111.      *
  112.      * @return the number of rows on this display.
  113.      */
  114.     public int getRows() {
  115.         return iHeight;
  116.     }
  117.     /**
  118.      * For testing if this display should show data from modulename.
  119.      * @param modName A modulename to test.
  120.      * @return true if modulename exists in this displays lists of modulenames.
  121.      */
  122.     public boolean displayModuleData(String modName) {
  123.         for (int j = 0; j < moduleUsers.size(); j++) {     //sok igenom alla modulnamn
  124.             if (((String)moduleUsers.elementAt(j)).equals(modName)) {
  125.                 return true;
  126.             }
  127.         }
  128.         return false;
  129.     }
  130.     /**
  131.      *
  132.      * @return the number of columns on this display.
  133.      */
  134.     public int getCols() {
  135.         return iWidth;
  136.     }
  137.  
  138.     /**
  139.      * Write text at specified pos, row=0 and col=0 is topleftmost char on display.
  140.      * @param row Specifies row to write.
  141.      * @param col Specifies what column to start text.
  142.      * @param newText The text to write.
  143.      */
  144.     public void write(int row, int col, String newText) {
  145.         if ((row < iWidth) && (col < iHeight)) {
  146.             sNewContents[row] = rowFixer(sNewContents[row].substring(0,col) + newText);
  147.         }
  148.     }
  149.  
  150.     /**
  151.      * Write a new line.
  152.      * @param row What row to write.
  153.      * @param newText What text to write.
  154.      */
  155.     public void writeRow(int row, String newText) {
  156.         sNewContents[row] = rowFixer(newText);
  157.  
  158.     }
  159.     /**
  160.      * Write an empty line / clear a line.
  161.      * @param row What row to clear.
  162.      */
  163.     public void clearRow(int row) {
  164.         this.writeRow(row, "");
  165.     }
  166.  
  167.     /**
  168.      * Write a new line at the bottom.
  169.      * @param newText What text to write.
  170.      */
  171.     public void writeLastRow(String newText) {
  172.         this.writeRow(iHeight-1, newText);
  173.     }
  174.  
  175.     /**
  176.      * Write a new line at the top.
  177.      * @param newText What text to write.
  178.      */
  179.     public void writeFirstRow(String newText) {
  180.         this.writeRow(0, newText);
  181.     }
  182.  
  183.  
  184.     /**
  185.      * Move text on row rowToMove left nrOfCols steps.
  186.      * @param rowToMove What row to move.
  187.      * @param nrOfCols How many columns to move text on row.
  188.      */
  189.     public void shiftLeft(int rowToMove, int nrOfCols) {
  190.         if (nrOfCols > 0 && nrOfCols < iWidth) {
  191.             sNewContents[rowToMove] = rowFixer(sNewContents[rowToMove].substring(nrOfCols));
  192.         }
  193.     }
  194.  
  195.     /**
  196.      * Move text on row rowToMove left, place newText there (move current text so newText fits).
  197.      * @param rowToMove What row to move.
  198.      * @param newText What text to write.
  199.      */
  200.     public void shiftLeft(int rowToMove, String newText) {
  201.         if (newText.length() > 0 && newText.length() < iWidth) {
  202.             sNewContents[rowToMove] = rowFixer(sNewContents[rowToMove].substring(newText.length()) + newText);
  203.         }
  204.     }
  205.  
  206.     /**
  207.      * Move text on row rowToMove right nrOfCols steps.
  208.      * @param rowToMove What row to move.
  209.      * @param nrOfCols How many columns to move text on row.
  210.      */
  211.     public void shiftRight(int rowToMove, int nrOfCols) {
  212.         if (nrOfCols > 0 && nrOfCols < iWidth) {
  213.             String sDummy = "";
  214.             for (int i = 0; i < nrOfCols; i++) {
  215.                 sDummy = sDummy + " ";
  216.             }
  217.             sNewContents[rowToMove] = rowFixer(sDummy + sNewContents[rowToMove]);
  218.         }
  219.     }
  220.  
  221.     /**
  222.      * Move text on row rowToMove right, place newText there (move current text so newText fits).
  223.      * @param rowToMove What row to move.
  224.      * @param newText What text to write.
  225.      */
  226.     public void shiftRight(int rowToMove, String newText) {
  227.         if (rowToMove < iHeight) {
  228.             sNewContents[rowToMove] = rowFixer(newText + sNewContents[rowToMove]);
  229.         }
  230.     }
  231.  
  232.     /**
  233.      * Move all rows up, nrOfRows step.
  234.      * @param nrOfRows The number of rows to scroll.
  235.      */
  236.     public void scrollUp(int nrOfRows) {
  237.         if (nrOfRows > 0 && iHeight > nrOfRows) {
  238.             for (int i = 0; i < iHeight; i++) {
  239.                 sNewContents[i] = sNewContents[i+nrOfRows];
  240.             }
  241.             for (int i = iHeight - 1; i >= iHeight - nrOfRows; i--) {
  242.                 sNewContents[i] = rowFixer("");
  243.             }
  244.         } else if (nrOfRows > 0) {
  245.             sNewContents[iHeight - 1] = rowFixer("");
  246.         }
  247.     }
  248.  
  249.     /**
  250.      * Just scroll one row, and specify the new row.
  251.      * @param newRow What text to write on new row.
  252.      */
  253.     public void scrollUp(String newRow) {
  254.         if (iHeight > 1) {
  255.             for (int i = 0; i < iHeight; i++) {
  256.                 sNewContents[i] = sNewContents[i+1];
  257.             }
  258.             sNewContents[iHeight - 1] = rowFixer(newRow);
  259.         }
  260.     }
  261.  
  262.     /**
  263.      * Move all rows down, nrOfRows step.
  264.      * @param nrOfRows The number of rows to scroll.
  265.      */
  266.     public void scrollDown(int nrOfRows) {
  267.  
  268.     }
  269.  
  270.     /**
  271.      * Just scroll one row, and specify the new row.
  272.      * @param newRow What text to write on new row.
  273.      */
  274.     public void scrollDown(String newRow) {
  275.         if (iHeight > 1) {
  276.             for (int i = iHeight - 1; i > 0; i--) {
  277.                 sNewContents[i] = sNewContents[i-1];
  278.             }
  279.             sNewContents[0] = rowFixer(newRow);
  280.         }
  281.     }
  282.  
  283.     /**
  284.      * This method compares the current data on the display and the
  285.      * "virtual" display, it makes packages of the data, just to be
  286.      * transmitted to display. It is efficient and doesn't send text
  287.      * if its already on display.
  288.      * //todo: effektivisera genom att kolla om addresseringen (och ev null) far plats i aktuellt paket.
  289.      * @return a vector with MBPackets, ready to be transmitted.
  290.      */
  291.     public Vector getDataToSend() {
  292.         //first place data in strings as packages
  293.         Vector sVector = new Vector();
  294.         //current package, gets stored away in sVector when filled
  295.         String sCurrentPacket = "";
  296.  
  297.         //newPacket just says that address&CO should be written if true
  298.         boolean newPacket = true;
  299.         char cTemp = 0;
  300.         //for each row on display
  301.         for (int row = 0; row < iHeight; row++) {
  302.             String sNewDum = sNewContents[row];
  303.             String sCurDum = sCurrContents[row];
  304.             String delayedChars = "";
  305.             newPacket = true;           //for each row, address should be written to packet
  306.  
  307.             //for each column on display
  308.             for (int col = 0; col < iWidth; col++) {
  309.                 if (sNewDum.charAt(col) == sCurDum.charAt(col)) {
  310.                     if (!newPacket) {
  311.                         delayedChars = delayedChars + sNewDum.charAt(col);
  312.                     }
  313.                 } else {                //if chars at column differed
  314.                     if (!newPacket) {       //if packet already started
  315.                         if (delayedChars.length() <= 4) {
  316.                             if (sCurrentPacket.length() > ARNEMAXPACKETSIZE - 1 - delayedChars.length()) {
  317.                                 //if all delayedChars does not fit, create a new packet, without delayedChars
  318.                                 String dummyString = sCurrentPacket;
  319.                                 sVector.addElement(dummyString);
  320.                                 sCurrentPacket = "";
  321.                                 //write setadress
  322.                                 cTemp = LCDSETADDRESS;
  323.                                 sCurrentPacket = sCurrentPacket + cTemp;
  324.                                 //write the address   (rowAddresses.elementAt(row) + col  ???)
  325.                                 cTemp = (char)(Integer.parseInt((String)rowAddresses.elementAt(row)) + col);
  326.                                 sCurrentPacket = sCurrentPacket + cTemp;
  327.                                 //write settext
  328.                                 cTemp = LCDTEXTWRITE;
  329.                                 sCurrentPacket = sCurrentPacket + cTemp;
  330.                             } else {    //if delayedchars and a new char fits in packet then
  331.                                 //add delayedchars to packet
  332.                                 sCurrentPacket = sCurrentPacket + delayedChars;
  333.                             }
  334.                             //write char
  335.                             sCurrentPacket = sCurrentPacket + sNewDum.charAt(col);
  336.  
  337.                             delayedChars = "";
  338.                         } else {        //if more than 4 delayedChars
  339.                             delayedChars = "";
  340.                             //check if there is space in packet, if not, create a new packet and dont write null to it
  341.                             if (sCurrentPacket.length() > ARNEMAXPACKETSIZE - 5) {
  342.                                 String dummyString = sCurrentPacket;
  343.                                 sVector.addElement(dummyString);
  344.                                 sCurrentPacket = "";
  345.                             } else {
  346.                                 //write null
  347.                                 cTemp = LCDNULL;    //(null = 0xA0 = 160)
  348.                                 sCurrentPacket = sCurrentPacket + cTemp;
  349.                             }
  350.  
  351.                             //write setadress
  352.                             cTemp = LCDSETADDRESS;
  353.                             sCurrentPacket = sCurrentPacket + cTemp;
  354.                             //write the address   (rowAddresses.elementAt(row) + col  ???)
  355.                             cTemp = (char)(Integer.parseInt((String)rowAddresses.elementAt(row)) + col);
  356.                             sCurrentPacket = sCurrentPacket + cTemp;
  357.                             //write settext
  358.                             cTemp = LCDTEXTWRITE;
  359.                             sCurrentPacket = sCurrentPacket + cTemp;
  360.  
  361.                             //write character
  362.                             sCurrentPacket = sCurrentPacket + sNewDum.charAt(col);
  363.  
  364.                         }
  365.  
  366.                     } else {                //if new packet (or just request to write address)
  367.                         //check if it fits (yes it could be almost full if we just changed display row)
  368.                         if (sCurrentPacket.length() > ARNEMAXPACKETSIZE - 4) {
  369.                             String dummyString = sCurrentPacket;
  370.                             sVector.addElement(dummyString);
  371.                             sCurrentPacket = "";
  372.                         }
  373.  
  374.                         if (sCurrentPacket.length() > 0) {
  375.                             //new line, then send null
  376.                             cTemp = LCDNULL;
  377.                             sCurrentPacket = sCurrentPacket + cTemp;
  378.                         }
  379.                         //write setadress   //(dont destroy contents of sCurrentPacket, if we just changed display
  380.                                             // row we just want to address at the end of existing packet)
  381.                         cTemp = LCDSETADDRESS;
  382.                         sCurrentPacket = sCurrentPacket + cTemp;
  383.                         //write the address
  384.                         cTemp = (char)(Integer.parseInt((String)rowAddresses.elementAt(row)) + col);
  385.                         sCurrentPacket = sCurrentPacket + cTemp;
  386.                         //write settext
  387.                         cTemp = LCDTEXTWRITE;
  388.                         sCurrentPacket = sCurrentPacket + cTemp;
  389.                         //write character
  390.                         sCurrentPacket = sCurrentPacket + sNewDum.charAt(col);
  391.  
  392.                         newPacket = false;
  393.                     }
  394.                 }
  395.             }
  396.         }
  397.         if (sCurrentPacket.length() > 0) {
  398.             sVector.addElement(sCurrentPacket);
  399.         }
  400.         for (int i = 0; i < iHeight; i++) {
  401.             //sCurrContents[i] = "....................";//sNewContents[i];
  402.             sCurrContents[i] = sNewContents[i];
  403.         }
  404.  
  405.         //sVector is now a vector with each packet as strings
  406.  
  407.         Vector pVector = new Vector();
  408.         MbPacket p;
  409.  
  410.         //repack to MbPackets and return them
  411.         for (int i = 0; i < sVector.size(); i++){
  412.             p = new MbPacket();
  413.             sCurrentPacket = (String)sVector.elementAt(i);
  414.             sCurrentPacket = lcdDisplayReplace(sCurrentPacket);
  415.             //System.out.println("apan: " + sCurrentPacket + " " + i);
  416.             if (sCurrentPacket.length() > 0) {
  417.                 //ARNE packet in XML-format
  418.                 String contents = "<arnepacket bytes=\"" + sCurrentPacket.length() + "\""
  419.                                    + " destnode=\"" + sTarget + "\">";
  420.                 for (int col = 0; col < sCurrentPacket.length(); col++) {
  421.                     contents = contents + "<byte id=\"" + (col +1) + "\" value=\""
  422.                                         + (int)sCurrentPacket.charAt(col) + "\"/>";
  423.                 }
  424.                 contents = contents + "</arnepacket>";
  425.                 //System.out.println("****start****");
  426.                 //System.out.println("sCurrentPacket=" + sCurrentPacket);
  427.                 //System.out.println("****contents:****");
  428.                 //System.out.println(contents);
  429.                 //System.out.println("****end****");
  430.  
  431.                 p.setContents(contents);
  432.                 pVector.addElement(p);
  433.             }
  434.         }
  435.  
  436.         return pVector;
  437.  
  438.     }
  439.  
  440.  
  441.     private String lcdDisplayReplace(String stringToReplace) {
  442.         char dispChar;
  443.         stringToReplace = stringToReplace.replace('å','a');
  444.         dispChar = 225;
  445.         stringToReplace = stringToReplace.replace('ä', dispChar);
  446.         dispChar = 239;
  447.         stringToReplace = stringToReplace.replace('ö',dispChar);
  448.         stringToReplace = stringToReplace.replace('Å','A');
  449.         dispChar = 225;
  450.         stringToReplace = stringToReplace.replace('Ä', dispChar);
  451.         dispChar = 239;
  452.         stringToReplace = stringToReplace.replace('Ö',dispChar);
  453.         dispChar = 245;
  454.         stringToReplace = stringToReplace.replace('ü',dispChar);
  455.         dispChar = 245;
  456.         stringToReplace = stringToReplace.replace('Ü',dispChar);
  457.         stringToReplace = stringToReplace.replace('é','e');
  458.         stringToReplace = stringToReplace.replace('É','E');
  459.         stringToReplace = stringToReplace.replace('\\','/');
  460.  
  461.         return stringToReplace;
  462.     }
  463.  
  464.     /**
  465.      * User can add a row to display-queue.
  466.      * @param rowText Textrow to be added to queue.
  467.      * @param prio The priority of the message; 0, 1 or 2.
  468.      * @param timeToLive Set the minimum time the message should be displayed.
  469.      * @param isSpecial Specifies if rowText isn't text but a command.
  470.      * @param id
  471.      * @param rowPos is "" if not used, "T+x" for Top+x, "B-x" for Bottom-x or "M+x"/"M-x" for Middle+/-x.
  472.      */
  473.     public void addRowToQueue(String rowText, int prio, int timeToLive, boolean isSpecial, int id, String rowPos) {
  474.         RowObject dummyRow = new RowObject();
  475.         dummyRow.row = rowText;
  476.         dummyRow.TTL = timeToLive;
  477.         dummyRow.isSpecial = isSpecial;
  478.         dummyRow.id = id;
  479.         boolean useRow = true;
  480.  
  481.         if (prio > 2 || prio < 0) {
  482.             prio = 2;
  483.         }
  484.  
  485.         //dummyRow.rowNumber
  486.         if (rowPos.length() > 0) {
  487.             int iDummy = -1;
  488.             boolean bUseRowNum = false;
  489.  
  490.             if (rowPos.length() == 1) {
  491.                 iDummy = 0;
  492.                 bUseRowNum = true;
  493.             } else if (rowPos.length() == 3) {
  494.                 //todo: storre an 3 da? en display med mer an 9 rader...?
  495.                 try {
  496.                     if (rowPos.substring(1,2).compareTo("+") == 0) {
  497.                         iDummy = Integer.parseInt(rowPos.substring(2,3));
  498.                     } else if (rowPos.substring(1,2).compareTo("-") == 0) {
  499.                         iDummy = Integer.parseInt(rowPos.substring(1,3));
  500.                     }
  501.                     bUseRowNum = true;
  502.                 } catch (NumberFormatException e) {
  503.                 System.out.println("exception with rownumber!");
  504.                 }
  505.             }
  506.             //System.out.println("iDummy: " + iDummy);
  507.  
  508.             if (bUseRowNum == true) {
  509.                 if (rowPos.charAt(0) == 'T') {
  510.                     //iDummy = iDummy;
  511.                 } else if (rowPos.charAt(0) == 'B') {
  512.                     iDummy = iDummy + iHeight-1;
  513.                 } else if (rowPos.charAt(0) == 'M') {
  514.                     iDummy = iDummy + (int)((iHeight-1)/2);
  515.                 } else {
  516.                     //dummyRow.rowNumber = null;
  517.                 }
  518.  
  519.                 if (iDummy < 0 || iDummy >= iHeight) {
  520.                     useRow = false;
  521.                 }
  522.  
  523.             }
  524.             dummyRow.rowNumber = iDummy;        //set even if not used
  525.             if (iDummy >= 0) {
  526.                 //System.out.println("rownumber: " + iDummy);
  527.                 dummyRow.useRowNum = true;
  528.             }
  529.  
  530.         }
  531.  
  532.         //put message in priority-queues
  533.         if (dummyRow.row.length() > 0 && useRow) {  //useRow is false if rownumber if out of range
  534.             //System.out.println("put in queue");
  535.             boolean checkNext = true;
  536.             //check here if id > 0, if so then check if message with same id is in currentRows
  537.             //if not in currentRows then check queue (prio accordning to object.prio), replace if found
  538.             //if no message with the same id is found then place message last in queue
  539.             if (dummyRow.id > 0) {
  540.                 //System.out.println("id > 0");
  541.                 for (int i = 0; i < rowsCurrent.size() && checkNext; i++) {
  542.                     RowObject dummyCurrentRow = (RowObject)rowsCurrent.elementAt(i);
  543.                     if (dummyCurrentRow.id == dummyRow.id){
  544.                         //System.out.println("replacing on display");
  545.                         rowsCurrent.remove(i);                                   //remove old
  546.                         dummyRow.rowNumber = dummyCurrentRow.rowNumber;          //if not set then set to the row to be placed
  547.                         rowsCurrent.addElement(dummyRow);                        //place new stuff
  548.                         if (dummyRow.TTL < 0) {                                  //om raden redan ska betraktas som ledig
  549.                             if (!freeRows.contains(dummyCurrentRow)) {           //och tidigare rad inte redan var ledig
  550.                                 freeRows.addElement(dummyRow);
  551.                             }
  552.                         } else {
  553.                             if (freeRows.contains(dummyCurrentRow)) {           //och tidigare rad inte redan var ledig
  554.                                 freeRows.remove(dummyCurrentRow);
  555.                             }
  556.                         }
  557.                         writeRow(dummyRow.rowNumber, dummyRow.row);
  558.                         checkNext = false;
  559.  
  560.                     }
  561.                 }
  562.  
  563.                 for (int j = 0; j < rowPrio0.size() && checkNext; j++) {
  564.                     //System.out.println("replacing in queue");
  565.                     RowObject queueDummyRow = (RowObject)rowPrio0.elementAt(j);
  566.                     if (queueDummyRow.id == dummyRow.id) {
  567.                         rowPrio0.remove(j);
  568.                         rowPrio0.insertElementAt(dummyRow, j);
  569.                         checkNext = false;
  570.                     }
  571.                 }
  572.                 for (int j = 0; j < rowPrio1.size() && checkNext; j++) {
  573.                     RowObject queueDummyRow = (RowObject)rowPrio1.elementAt(j);
  574.                     if (queueDummyRow.id == dummyRow.id) {
  575.                         rowPrio1.remove(j);
  576.                         rowPrio1.insertElementAt(dummyRow, j);
  577.                         checkNext = false;
  578.                     }
  579.                 }
  580.                 for (int j = 0; j < rowPrio2.size() && checkNext; j++) {
  581.                     RowObject queueDummyRow = (RowObject)rowPrio2.elementAt(j);
  582.                     if (queueDummyRow.id == dummyRow.id) {
  583.                         rowPrio2.remove(j);
  584.                         rowPrio2.insertElementAt(dummyRow, j);
  585.                         checkNext = false;
  586.                     }
  587.                 }
  588.             }
  589.  
  590.             if (checkNext) {
  591.                 if (prio == 0) {
  592.                     //System.out.println("adding to prio0");
  593.                     rowPrio0.addElement(dummyRow);
  594.                 } else if (prio == 1) {
  595.                     //System.out.println("adding to prio1");
  596.                     rowPrio1.addElement(dummyRow);
  597.                 } else if (prio == 2) {
  598.                     //System.out.println("adding to prio2");
  599.                     rowPrio2.addElement(dummyRow);
  600.                 }
  601.             }
  602.  
  603.         }
  604.  
  605.         manageQueues();     //do this for enabling data to be sent more then 1 time per sec
  606.     }
  607.  
  608.  
  609.     /**
  610.      * This method should be run once every second, to update queue and
  611.      * ttl for messages.
  612.      */
  613.     public void manageQueues() {
  614.         RowObject dummyRow;
  615.  
  616.         for (int i = 0; i < rowsCurrent.size(); i++) {
  617.             dummyRow = (RowObject)rowsCurrent.elementAt(i);
  618.             if (dummyRow.TTL >= 0) {
  619.                 //System.out.println("Counting down ttl for: " + dummyRow.rowNumber + ", text: " + dummyRow.row);
  620.                 if (dummyRow.TTL == 0) {
  621.                     freeRows.addElement(dummyRow);                  //added at the end (rows free longest at the beginning)
  622.                     //System.out.println("rowelement added to freerows: " + dummyRow.rowNumber + ", text: " + dummyRow.row);
  623.                 }
  624.                 dummyRow.TTL = dummyRow.TTL - 1;
  625.             }
  626.         }
  627.  
  628.         //glom inte initiera vektorn, alla rader ska vara med i den
  629.  
  630.         //gor en koll av TTL nar raden flyttas till rowsCurrent, if ttl<0 then add to freerows
  631.  
  632.  
  633.         for (int i = 0; i < freeRows.size(); i++) {
  634.             boolean checkNextQueue = true;
  635.  
  636.             for (int j = 0; j < rowPrio0.size() && checkNextQueue; j++) {
  637.                 //System.out.println("Prio0queueelement: " + j + ", freerow: " + i);
  638.                 RowObject queueDummyRow = (RowObject)rowPrio0.elementAt(j);
  639.                 dummyRow = (RowObject)freeRows.elementAt(i);
  640.                 if (dummyRow.rowNumber == queueDummyRow.rowNumber || !queueDummyRow.useRowNum) {
  641.                     //System.out.println("Place row, prio0element" + ", text: " + queueDummyRow.row);
  642.                     freeRows.remove(i);                                     //not free anymore
  643.                     rowPrio0.remove(j);                                     //remove queue-item
  644.                     queueDummyRow.rowNumber = dummyRow.rowNumber;           //if not set then set to the row to be placed
  645.                     rowsCurrent.remove(dummyRow);                           //remove old stuff
  646.                     rowsCurrent.addElement(queueDummyRow);                  //place new stuff
  647.                     if (queueDummyRow.TTL < 0) {                            //om raden redan ska betraktas som ledig
  648.                         freeRows.addElement(queueDummyRow);
  649.                     }
  650.                     writeRow(queueDummyRow.rowNumber, queueDummyRow.row);
  651.                     i = i - 1;
  652.                     checkNextQueue = false;
  653.                 }
  654.             }
  655.             for (int j = 0; j < rowPrio1.size() && checkNextQueue; j++) {
  656.                 //System.out.println("Prio1queueelement: " + j + ", freerow: " + i);
  657.                 RowObject queueDummyRow = (RowObject)rowPrio1.elementAt(j);
  658.                 dummyRow = (RowObject)freeRows.elementAt(i);
  659.                 if (dummyRow.rowNumber == queueDummyRow.rowNumber || !queueDummyRow.useRowNum) {
  660.                     //System.out.println("Place row, prio1element" + ", text: " + queueDummyRow.row);
  661.                     freeRows.remove(i);                                     //not free anymore
  662.                     rowPrio1.remove(j);                                     //remove queue-item
  663.                     queueDummyRow.rowNumber = dummyRow.rowNumber;           //if not set then set to the row to be placed
  664.                     rowsCurrent.remove(dummyRow);                           //remove old stuff
  665.                     rowsCurrent.addElement(queueDummyRow);                  //place new stuff
  666.                     if (queueDummyRow.TTL < 0) {                            //om raden redan ska betraktas som ledig
  667.                         freeRows.addElement(queueDummyRow);
  668.                     }
  669.                     writeRow(queueDummyRow.rowNumber, queueDummyRow.row);
  670.                     i = i - 1;
  671.                     checkNextQueue = false;
  672.                 }
  673.             }
  674.             for (int j = 0; j < rowPrio2.size() && checkNextQueue; j++) {
  675.                 RowObject queueDummyRow = (RowObject)rowPrio2.elementAt(j);
  676.                 dummyRow = (RowObject)freeRows.elementAt(i);
  677.                 if (dummyRow.rowNumber == queueDummyRow.rowNumber || !queueDummyRow.useRowNum) {
  678.                     freeRows.remove(i);                                     //not free anymore
  679.                     rowPrio2.remove(j);                                     //remove queue-item
  680.                     queueDummyRow.rowNumber = dummyRow.rowNumber;           //if not set then set to the row to be placed
  681.                     rowsCurrent.remove(dummyRow);                           //remove old stuff
  682.                     rowsCurrent.addElement(queueDummyRow);                  //place new stuff
  683.                     if (queueDummyRow.TTL < 0) {                            //om raden redan ska betraktas som ledig
  684.                         freeRows.addElement(queueDummyRow);
  685.                     }
  686.                     writeRow(queueDummyRow.rowNumber, queueDummyRow.row);
  687.                     i = i - 1;
  688.                     checkNextQueue = false;
  689.                 }
  690.             }
  691.  
  692.             //System.out.println("apan: ja");
  693.  
  694.         }
  695.  
  696.     }
  697.  
  698.     /**
  699.      * Keeps the rows the same length as display-width
  700.      * Cut or fill with spaces.
  701.      * @param sRow String to fix.
  702.      * @return a string, sRow, but with the same length as the display-width.
  703.      */
  704.     private String rowFixer(String sRow) {
  705.         if (sRow.length() > iWidth) {
  706.             return sRow.substring(0, iWidth);
  707.         } else if (sRow.length() < iWidth) {
  708.             String sDummy = "";
  709.             for (int i = 0; i < iWidth - sRow.length(); i++) {
  710.                 sDummy = sDummy + " ";
  711.             }
  712.             return sRow + sDummy;
  713.         } else {
  714.             return sRow;
  715.         }
  716.     }
  717.  
  718.     /**
  719.      * A queue-object
  720.      */
  721.     private class RowObject {
  722.         protected int TTL;
  723.         protected String row;
  724.         //protected boolean isDisplaying;
  725.         protected boolean isSpecial;    //row definierar en speciell egenskap som t.ex. cleardisplay osv om true
  726.                                 //fixa in detta senare
  727.  
  728.         protected int rowNumber=0;
  729.         protected boolean useRowNum = false;
  730.         protected int id;
  731.     }
  732. }
  733.