1 package com.starphoenixmedia.candle_pos.scale;
2
3 import java.text.DecimalFormat;
4
5
6
7
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
105 sc_unit = parseScaleUnits(bt);
106 sc_mode = parseScaleMode(bt);
107
108
109
110
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 }