1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 package net.sf.openv4j.protocolhandlers;
26
27
28
29
30
31
32 public class SegmentedDataContainer extends DataContainer {
33
34
35
36
37
38
39 public static final int DEFAULT_SEGMENT_SIZE = 32;
40 private DataBlock[] dataSegments;
41 private int segmentSize;
42
43
44
45
46 public SegmentedDataContainer() {
47 super();
48 setSegmentSize(DEFAULT_SEGMENT_SIZE);
49 }
50
51
52
53
54
55
56 public SegmentedDataContainer(int segmentSize) {
57 super();
58 setSegmentSize(segmentSize);
59 }
60
61
62
63
64
65
66
67
68
69 @Override
70 public void addToDataContainer(int startAddress, int[] data) {
71 throw new UnsupportedOperationException("Write of segmented data is not supported.");
72 }
73
74
75
76
77
78
79
80 @Override
81 public void addToDataContainer(int startAddress, int length) {
82 int baseInxed = startAddress / segmentSize;
83
84 if (dataSegments[baseInxed] == null) {
85 dataSegments[baseInxed] = new DataBlock(baseInxed * segmentSize, segmentSize);
86 }
87
88 for (int i = 1; i < (length / segmentSize); i++) {
89 baseInxed++;
90
91 if (dataSegments[baseInxed] == null) {
92 dataSegments[baseInxed] = new DataBlock(baseInxed * segmentSize, segmentSize);
93 }
94 }
95 }
96
97
98
99
100
101
102
103
104
105
106 @Override
107 public DataBlock getDataBlock(int index) {
108 int pos = 0;
109
110 for (int i = 0; i < dataSegments.length; i++) {
111 if (dataSegments[i] != null) {
112 if (pos == index) {
113 return dataSegments[i];
114 }
115
116 pos++;
117 }
118 }
119
120 throw new IndexOutOfBoundsException("Cant find index " + index);
121 }
122
123
124
125
126
127
128 @Override
129 public int getDataBlockCount() {
130 int result = 0;
131
132 for (int i = 0; i < dataSegments.length; i++) {
133 if (dataSegments[i] != null) {
134 result++;
135 }
136 }
137
138 return result;
139 }
140
141
142
143
144
145
146
147
148 public int getNextSegmentAddr(int currentSendSegmentAddr) {
149 if (currentSendSegmentAddr == -1) {
150 for (int i = 0; i < dataSegments.length; i++) {
151 if (dataSegments[i] != null) {
152 return i * segmentSize;
153 }
154 }
155 } else {
156 for (int i = (currentSendSegmentAddr / segmentSize) + 1; i < dataSegments.length; i++) {
157 if (dataSegments[i] != null) {
158 return i * segmentSize;
159 }
160 }
161 }
162
163 return -1;
164 }
165
166
167
168
169
170
171
172
173 @Override
174 public int getRawByte(int address) {
175 final int baseIndex = address / segmentSize;
176
177 if (dataSegments[baseIndex] == null) {
178 return 0x00ff;
179 } else {
180 return dataSegments[baseIndex].getByteAtPos(address % segmentSize) & 0x00ff;
181 }
182 }
183
184
185
186
187
188
189
190 @Override
191 public void setBytes(int addr, byte[] theData) {
192 if (((addr % segmentSize) == 0) && (theData.length == segmentSize)) {
193 dataSegments[addr / segmentSize].setBytesAtPos(addr % segmentSize, theData);
194 } else {
195 super.setBytes(addr, theData);
196 }
197 }
198
199
200
201
202
203
204
205 @Override
206 public void setRawByte(int addr, byte theData) {
207 dataSegments[addr / segmentSize].setByteAtPos(addr % segmentSize, theData);
208 }
209
210
211
212
213
214
215 public void setSegmentSize(int segmentSize) {
216 this.segmentSize = segmentSize;
217 dataSegments = new DataBlock[0x010000 / segmentSize];
218 }
219
220
221
222
223
224
225 @Override
226 public String toString() {
227 StringBuilder sb = new StringBuilder();
228
229 for (int i = 0; i < dataSegments.length; i++) {
230 if (dataSegments[i] != null) {
231 dataSegments[i].writeTo(sb, i == 0);
232 }
233 }
234
235 return sb.toString();
236 }
237 }