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 java.util.LinkedHashMap;
20 import java.util.Map;
21 import java.util.Map.Entry;
22
23 import net.sourceforge.jarduino.ArduinoException;
24 import net.sourceforge.jarduino.message.ArduinoParser.ArduinoParserException;
25
26
27
28
29 public class ArduinoValues {
30
31
32
33 static final String MARKER = "VAL_";
34
35
36
37
38 private final ArduinoSignal theOwner;
39
40
41
42
43 private final Map<Number, String> theValues;
44
45
46
47
48
49
50 ArduinoValues(final ArduinoSignal pOwner,
51 final Map<Number, String> pValues) {
52 theOwner = pOwner;
53 theValues = pValues;
54 }
55
56
57
58
59
60 public ArduinoSignal getOwner() {
61 return theOwner;
62 }
63
64
65
66
67
68 public Map<Number, String> getValues() {
69 return theValues;
70 }
71
72
73
74
75
76
77 public String getDescriptionForValue(final Number pValue) {
78 return theValues.get(pValue);
79 }
80
81
82
83
84
85
86
87 public static void parseValues(final ArduinoSystem pSystem,
88 final String pValuesDef) throws ArduinoException {
89
90 final String myMarker = ArduinoParser.nextToken(pValuesDef);
91 String myDef = ArduinoParser.stripToken(pValuesDef, myMarker);
92 if (!myMarker.equals(MARKER)) {
93 throw new ArduinoException("Invalid marker", pValuesDef);
94 }
95
96
97 final String myMsgId = ArduinoParser.nextToken(myDef);
98 myDef = ArduinoParser.stripToken(myDef, myMsgId);
99 final String myName = ArduinoParser.nextToken(myDef);
100 myDef = ArduinoParser.stripToken(myDef, myName);
101
102
103 try {
104
105 final ArduinoSignal mySignal = pSystem.findSignalByIdAndName(myMsgId, myName);
106
107
108 final Map<Number, String> myValueMap = buildValueMap(myDef);
109
110
111 final ArduinoValuesinoValues.html#ArduinoValues">ArduinoValues myValues = new ArduinoValues(mySignal, myValueMap);
112 mySignal.setValues(myValues);
113
114
115 } catch (ArduinoParserException e) {
116 throw new ArduinoException(e.getMessage() + ArduinoChar.COLON + e.getDetail(), pValuesDef);
117 }
118 }
119
120
121
122
123
124
125
126 private static Map<Number, String> buildValueMap(final String pMapDef) throws ArduinoParserException {
127 String myValues = pMapDef;
128 if (myValues.length() == 0 || myValues.charAt(myValues.length() - 1) != ArduinoChar.SEMICOLON) {
129 throw new ArduinoParserException("Invalid ValuesTable", pMapDef);
130 }
131 myValues = myValues.substring(0, myValues.length() - 1);
132
133
134 final Map<Number, String> myMap = new LinkedHashMap<>();
135 while (myValues.length() > 0) {
136
137 final String myValue = ArduinoParser.nextToken(myValues);
138 myValues = ArduinoParser.stripToken(myValues, myValue);
139 final Number myNumber = ArduinoParser.parseNumber(myValue);
140
141
142 final String myDesc = ArduinoParser.nextQuotedToken(myValues);
143 myValues = ArduinoParser.stripQuotedToken(myValues, myDesc);
144
145
146 myMap.put(myNumber, myDesc);
147 }
148
149
150 return myMap;
151 }
152
153 @Override
154 public String toString() {
155
156 final StringBuilder myBuilder = new StringBuilder();
157 myBuilder.append(MARKER);
158 myBuilder.append(ArduinoChar.BLANK);
159 myBuilder.append(theOwner.getOwner().getId());
160 myBuilder.append(ArduinoChar.BLANK);
161 myBuilder.append(theOwner.getName());
162
163
164 for (Entry<Number, String> myEntry : theValues.entrySet()) {
165 myBuilder.append(ArduinoChar.BLANK);
166 myBuilder.append(myEntry.getKey());
167 myBuilder.append(ArduinoChar.BLANK);
168 myBuilder.append(ArduinoChar.QUOTE);
169 myBuilder.append(myEntry.getValue());
170 myBuilder.append(ArduinoChar.QUOTE);
171 }
172
173
174 myBuilder.append(ArduinoChar.SEMICOLON);
175 return myBuilder.toString();
176 }
177 }