can-log-tools/reader/src/main/java/com/rusefi/can/analysis/CounterAggregator.java

84 lines
2.5 KiB
Java

package com.rusefi.can.analysis;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class CounterAggregator {
static List<CounterWithWidth> scan(LinkedHashMap<CounterScanner.BitStateKey, Integer> counters) {
ScanState state = new ScanState();
for (Map.Entry<CounterScanner.BitStateKey, Integer> e : counters.entrySet()) {
CounterScanner.BitStateKey currentState = e.getKey();
int counterSize = e.getValue();
// System.out.println("currentState " + currentState + " counterSize " + counterSize);
if (state.prev == null) {
if (counterSize == 1) {
state.prev = state.start = currentState;
state.totalNumberOfBits = 1;
}
} else {
if ((state.prev.getSid() != currentState.getSid() ||
state.prev.getByteIndex() != currentState.getByteIndex() ||
state.prev.getBitIndex() + 1 != currentState.getBitIndex()
)) {
state.wrap();
} else {
state.totalNumberOfBits++;
state.prev = currentState;
}
}
}
state.wrap();
return state.counters;
}
static class ScanState {
CounterScanner.BitStateKey prev = null;
List<CounterWithWidth> counters = new ArrayList<>();
CounterScanner.BitStateKey start;
int totalNumberOfBits;
void wrap() {
if (prev != null) {
counters.add(new CounterWithWidth(start, totalNumberOfBits));
prev = null;
}
}
}
static class CounterWithWidth {
public final CounterScanner.BitStateKey start;
private final int totalNumberOfBits;
public CounterWithWidth(CounterScanner.BitStateKey start, int totalNumberOfBits) {
this.start = start;
this.totalNumberOfBits = totalNumberOfBits;
}
public CounterScanner.BitStateKey getStart() {
return start;
}
public int getTotalNumberOfBits() {
return totalNumberOfBits;
}
@Override
public String toString() {
return "Counter{" +
"start at " + start +
", totalNumberOfBits " + totalNumberOfBits +
'}';
}
}
}