View Javadoc
1   package com.starphoenixmedia.candle_pos;
2   
3   import com.starphoenixmedia.candle_pos.modeforms.BGeneric;
4   import com.starphoenixmedia.candle_pos.modeforms.IModeWindow;
5   import com.starphoenixmedia.candle_pos.modeforms.MConfigure;
6   import com.starphoenixmedia.candle_pos.modeforms.MInventory;
7   import com.starphoenixmedia.candle_pos.modeforms.MSales;
8   import com.starphoenixmedia.candle_pos.modeforms.MTest;
9   import com.starphoenixmedia.candle_pos.scale.ScaleReader;
10  import gnu.io.NRSerialPort;
11  import gnu.io.UnsupportedCommOperationException;
12  import java.util.Iterator;
13  import java.util.Set;
14  import java.util.TooManyListenersException;
15  import java.util.concurrent.ExecutorService;
16  import java.util.concurrent.LinkedBlockingQueue;
17  import java.util.concurrent.ThreadPoolExecutor;
18  import java.util.concurrent.TimeUnit;
19  import java.util.logging.Level;
20  import java.util.logging.Logger;
21  import java.util.regex.Matcher;
22  import java.util.regex.Pattern;
23  import javax.swing.UIManager;
24  import javax.swing.UnsupportedLookAndFeelException;
25  
26  /**
27   *
28   * @author jlhawkwell
29   */
30  public class CandleStart
31  {
32  	public static ExecutorService es;
33  
34  	public static void init(String[] args)
35  	{
36  		String dev;
37  		char mode = 's';
38  		int parity = 0;
39  		int baud = 2400;
40  		byte data = 8;
41  		int stop = 2;
42  
43  		if ( args.length == 0 )
44  		{
45  			StringBuilder sb = new StringBuilder();
46  			so(sb, "Usage: dev [mode] [baud] [port]");
47  			so(sb, "\tdev\tThe serial port device to open");
48  			so(sb, "\tmode\tOperational mode of this program: configure, inventory, sales, test (Default: sales)");
49  			so(sb, "\tbaud\tDesired baud rate for scale operations (Default: 2400)");
50  			so(sb, "\tport\tPort configuration string for data bits, parity, and stop bits (Default: 8n2)");
51  
52  			Set<String> ports = NRSerialPort.getAvailableSerialPorts();
53  
54  			so(sb, "\nAvailable Ports:");
55  			Iterator<String> it = ports.iterator();
56  			while ( it.hasNext() )
57  			{
58  				so(sb, it.next(), true);
59  			}
60  			System.out.println(sb);
61  			return;
62  		}
63  
64  		switch ( args.length )
65  		{
66  			default:
67  			case 4: // config string (data, parity, stop)
68  				Pattern p = Pattern.compile("([5-8])-?(e|n|o)-?(1|1.5|2)");
69  				Matcher m = p.matcher(args[3]);
70  
71  				data = Byte.parseByte(m.group(1));
72  				switch ( m.group(2) )
73  				{
74  					case "e": parity = 2; break;
75  					case "n": parity = 0; break;
76  					case "o": parity = 1; break;
77  					default:
78  						System.out.println("\nERROR\n\tParity must be one of the following: e, n, o");
79  						return;
80  				}
81  				switch ( m.group(3) )
82  				{
83  					case "1": stop = 1; break;
84  					case "1.5": stop = 3; break;
85  					case "2": stop = 2; break;
86  					default:
87  						System.out.println("\nERROR\n\tStop bits must be one of the following: 1, 1.5, 2");
88  						return;
89  				}
90  			case 3: // baud rate
91  				baud = Integer.parseInt(args[2]);
92  			case 2: // program mode
93  				switch ( args[1].toLowerCase().charAt(0) )
94  				{
95  					case 'c':
96  					case 'i':
97  					case 's':
98  					case 't':
99  						mode = args[1].toLowerCase().charAt(0);
100 						break;
101 					default:
102 						mode = 's';
103 				}
104 			case 1: // device
105 				dev = args[0];
106 		}
107 
108 		es = new ThreadPoolExecutor(5, 20, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(5));
109 		try { UIManager.setLookAndFeel(UIManager.getCrossPlatformLookAndFeelClassName()); }
110 		catch ( UnsupportedLookAndFeelException | ClassNotFoundException |
111 				InstantiationException | IllegalAccessException e)
112 		{}
113 
114 		NRSerialPort sp = new NRSerialPort(dev, baud);
115 		sp.connect();
116 		try { sp.getSerialPortInstance().setSerialPortParams(baud, data, stop, parity); }
117 		catch (UnsupportedCommOperationException ex)
118 		{ Logger.getLogger(Starter.class.getName()).log(Level.SEVERE, null, ex); }
119 
120 		try { sp.addEventListener(new BGeneric()); }
121 		catch ( TooManyListenersException tml ) { System.out.println("Too Many Listeners!"); }
122 
123 		ScaleReader sr = new ScaleReader(sp);
124 
125 		IModeWindow mw = null;
126 		switch ( mode )
127 		{
128 			case 'c': mw = new MConfigure(); break;
129 			case 'i': mw = new MInventory(); break;
130 			case 's': mw = new MSales(); break;
131 			case 't': mw = new MTest(); break;
132 		}
133 		if ( mw == null ) { System.out.println("\nERROR\n\tCould not determine operational mode."); return; }
134 		mw.setup(sr);
135 		mw.run();
136 	}
137 
138 	private static void so (StringBuilder sb, String s) { so(sb, s, false); }
139 	private static void so (StringBuilder sb, String s, boolean tab)
140 	{
141 		if ( tab ) { sb.append("\t"); }
142 		sb.append(s);
143 		sb.append("\n");
144 	}
145 }