/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2013 RomRaider.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package com.romraider.logger.ecu.definition;
import static com.romraider.util.HexUtil.asBytes;
import static com.romraider.util.HexUtil.hexToInt;
import static com.romraider.util.HexUtil.intToHexString;
import static com.romraider.util.ParamChecker.checkGreaterThanZero;
import static com.romraider.util.ParamChecker.checkNotNullOrEmpty;
import java.util.LinkedList;
import java.util.List;
public final class EcuAddressImpl implements EcuAddress {
private final String[] addresses;
private final byte[] bytes;
private final int bit;
public EcuAddressImpl(String address, int length, int bit) {
checkNotNullOrEmpty(address, "address");
checkGreaterThanZero(length, "length");
final String[] addrSting = {address};
this.addresses = buildAddresses(addrSting, length);
this.bytes = getAddressBytes(addresses);
this.bit = bit;
}
public EcuAddressImpl(String[] address, int length, int bit) {
checkNotNullOrEmpty(address, "address");
checkGreaterThanZero(length, "length");
this.addresses = buildAddresses(address, length);
this.bytes = getAddressBytes(addresses);
this.bit = bit;
}
public EcuAddressImpl(String[] addresses) {
checkNotNullOrEmpty(addresses, "addresses");
this.addresses = addresses;
this.bytes = getAddressBytes(addresses);
this.bit = -1;
}
public String[] getAddresses() {
return addresses;
}
public byte[] getBytes() {
return bytes;
}
public int getBit() {
return bit;
}
public int getLength() {
return addresses.length;
}
private String[] buildAddresses(String[] startAddress, int addressLength) {
final List<String> addresses = new LinkedList<String>();
if (startAddress.length > addressLength) {
for (int i = 0; i < startAddress.length; i++) {
final int address = hexToInt(startAddress[i]);
addresses.add(
padAddress(intToHexString(address),
startAddress[i].length()));
}
}
else {
int start = hexToInt(startAddress[0]);
for (int i = 0; i < addressLength; i++) {
addresses.add(
padAddress(intToHexString(start + i),
startAddress[0].length()));
}
}
return addresses.toArray(new String[addresses.size()]);
}
private String padAddress(String address, int length) {
if (address.length() == length) {
return address;
} else {
StringBuilder builder = new StringBuilder(length);
builder.append("0x");
String s = address.substring(2);
for (int i = 0; i < length - s.length() - 2; i++) {
builder.append('0');
}
builder.append(s);
return builder.toString();
}
}
private byte[] getAddressBytes(String[] addresses) {
byte[] bytes = new byte[0];
for (String address : addresses) {
byte[] tmp1 = asBytes(address);
byte[] tmp2 = new byte[bytes.length + tmp1.length];
System.arraycopy(bytes, 0, tmp2, 0, bytes.length);
System.arraycopy(tmp1, 0, tmp2, bytes.length, tmp1.length);
bytes = tmp2;
}
return bytes;
}
}