View Javadoc
1   package com.starphoenixmedia.candle_pos.scale;
2   
3   import java.text.DecimalFormat;
4   
5   /**
6    *
7    * @author jlhawkwell
8    */
9   public class ScaleData
10  {
11  	protected byte[] raw;
12  	protected ScaleUnits sc_unit = ScaleUnits.UNIT_kg;
13  	protected ScaleMode sc_mode = ScaleMode.MODE_NORMAL;
14  	protected String reading;
15  
16  	public static ScaleUnits parseScaleUnits(byte[] bt)
17  	{
18  		int t = (0x70 & bt[0]) >> 4;
19  		for ( ScaleUnits s : ScaleUnits.values() )
20  		{
21  			if ( s.getValue() == t ) { return s; }
22  		}
23  		return null;
24  	}
25  
26  	public static ScaleMode parseScaleMode(byte[] bt)
27  	{
28  		int t = (0x0f & bt[0]);
29  		for ( ScaleMode s : ScaleMode.values() )
30  		{
31  			if ( s.getValue() == t ) { return s; }
32  		}
33  		return null;
34  	}
35  
36  	public static double[] parseValues(ScaleUnits unit, byte[] bt)
37  	{
38  		switch ( unit )
39  		{
40  			case UNIT_g:
41  				return new double[]{ doublize(bt[3], bt[4], bt[5], bt[6], bt[7]) };
42  			case UNIT_kg:
43  				return new double[]{ doublize(bt[3], bt[4], bt[5], bt[6], bt[7]) / 100d };
44  			case UNIT_lbozd:
45  				return new double[]{ doublize(bt[3], bt[4]), doublize(bt[5], bt[6], bt[7]) / 10d };
46  			case UNIT_lbozf:
47  				return new double[]{ doublize(bt[3], bt[4]), doublize(bt[5], bt[6]), doublize(bt[7]) };
48  			default:
49  				break;
50  		}
51  		return new double[]{};
52  	}
53  
54  	public static String readingString(ScaleUnits unit, double[] data)
55  	{
56  		DecimalFormat df = (DecimalFormat) DecimalFormat.getInstance();
57  		StringBuilder sb = new StringBuilder();
58  		switch ( unit )
59  		{
60  			case UNIT_g:
61  				df.applyPattern("##,##0");
62  				sb.append(df.format(data[0]));
63  				sb.append(" g");
64  				break;
65  			case UNIT_kg:
66  				df.applyPattern("##0.00");
67  				sb.append(df.format(data[0]));
68  				sb.append(" kg");
69  				break;
70  			case UNIT_lbozd:
71  				df.applyPattern("#0");
72  				sb.append(df.format(data[0]));
73  				sb.append(" lb ");
74  				df.applyPattern("#0.0");
75  				sb.append(df.format(data[1]));
76  				sb.append(" oz");
77  				break;
78  			case UNIT_lbozf:
79  				df.applyPattern("#0");
80  				sb.append(df.format(data[0]));
81  				sb.append(" lb ");
82  				sb.append(df.format(data[1]));
83  				sb.append(" ");
84  				switch ( (int)data[2] )
85  				{
86  					case 0: sb.append("0"); break;
87  					case 1: sb.append("\u00bc"); break;
88  					case 2: sb.append("\u00bd"); break;
89  					case 3: sb.append("\u00be"); break;
90  					default:
91  						break;
92  				}
93  				sb.append(" oz");
94  				break;
95  			default:
96  				break;
97  		}
98  		return sb.toString();
99  	}
100 
101 	public synchronized void setRaw(byte[] bt)
102 	{
103 		raw = bt;
104 		// scale status
105 		sc_unit = parseScaleUnits(bt);
106 		sc_mode = parseScaleMode(bt);
107 
108 		// skip 1 and 2
109 
110 		// measure
111 		reading = readingString(sc_unit, parseValues(sc_unit, bt));
112 	}
113 
114 	public synchronized String getReading() { return reading; }
115 	public synchronized ScaleMode getMode() { return sc_mode; }
116 	public synchronized ScaleUnits getUnit() { return sc_unit; }
117 	public synchronized byte[] getRaw() { return raw; }
118 
119 	private static double doublize(byte... bs) { return Double.valueOf(numberize(bs)); }
120 	private static String numberize(byte... bs) { return numberize(false, bs); }
121 	private static String numberize(boolean force, byte... bs)
122 	{
123 		StringBuilder sb = new StringBuilder();
124 		for ( byte b : bs )
125 		{
126 			if ( (sb.length() == 0) || force )
127 			{
128 				if ( (b != 0) || force ) { sb.append(b); }
129 			}
130 			else { sb.append(b); }
131 		}
132 		if ( sb.length() == 0 ) { sb.append("0"); }
133 		return sb.toString();
134 	}
135 
136 	private static String numberize(int... bs) { return numberize(false, bs); }
137 	private static String numberize(boolean force, int... bs)
138 	{
139 		StringBuilder sb = new StringBuilder();
140 		for ( int b : bs )
141 		{
142 			if ( (sb.length() == 0) || force )
143 			{
144 				if ( (b != 0) || force ) { sb.append(b); }
145 				else { sb.append(" "); }
146 			}
147 		}
148 		if ( sb.length() == 0 ) { sb.append("0"); }
149 		return sb.toString();
150 	}
151 }