1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package net.sourceforge.jarduino.message;
18
19 import net.sourceforge.jarduino.message.ArduinoParser.ArduinoParserException;
20
21
22
23
24 public final class ArduinoSignalRange {
25
26
27
28 private static final char START = '[';
29
30
31
32
33 private static final char END = ']';
34
35
36
37
38 private final Number theMaximum;
39
40
41
42
43 private final Number theMinimum;
44
45
46
47
48
49
50 private ArduinoSignalRange(final Number pMinimum,
51 final Number pMaximum) {
52
53 theMinimum = pMinimum;
54 theMaximum = pMaximum;
55 }
56
57
58
59
60
61 public Number getMaximum() {
62 return theMaximum;
63 }
64
65
66
67
68
69 public Number getMinimum() {
70 return theMinimum;
71 }
72
73
74
75
76
77 public boolean unBounded() {
78 return isZero(theMinimum) && isZero(theMaximum);
79 }
80
81
82
83
84
85
86 static boolean isZero(final Number pNumber) {
87 return pNumber instanceof Double
88 ? pNumber.doubleValue() == 0.0
89 : pNumber.longValue() == 0;
90 }
91
92
93
94
95
96 public boolean isFloat() {
97 return theMinimum instanceof Double;
98 }
99
100
101
102
103
104
105
106 static ArduinoSignalRange parseRange(final String pRangeDef) throws ArduinoParserException {
107
108 if (pRangeDef.charAt(0) != START
109 || pRangeDef.charAt(pRangeDef.length() - 1) != END) {
110 throw new ArduinoParserException("Missing surrounding []s", pRangeDef);
111 }
112 final String myFactors = pRangeDef.substring(1, pRangeDef.length() - 1);
113
114
115 final int myIndex = myFactors.indexOf(ArduinoChar.PIPE);
116 if (myIndex == -1) {
117 throw new ArduinoParserException("Missing " + ArduinoChar.PIPE + " separator", pRangeDef);
118 }
119
120
121 final String myMin = myFactors.substring(0, myIndex);
122 final String myMax = myFactors.substring(myIndex + 1);
123 Number myMinimum = ArduinoParser.parseNumber(myMin);
124 Number myMaximum = ArduinoParser.parseNumber(myMax);
125
126
127 if (myMinimum.getClass() != myMaximum.getClass()) {
128
129 if (myMinimum instanceof Long) {
130 myMinimum = myMinimum.doubleValue();
131 }
132 if (myMaximum instanceof Long) {
133 myMaximum = myMaximum.doubleValue();
134 }
135 }
136
137
138 return new ArduinoSignalRange(myMinimum, myMaximum);
139 }
140
141 @Override
142 public String toString() {
143 return "" + START + theMinimum + ArduinoChar.PIPE + theMaximum + END;
144 }
145 }