/*
* Copyright 2012 Steven Swor.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package cameljamod;
import java.util.Arrays;
import java.util.Formatter;
import net.wimpi.modbus.procimg.InputRegister;
import net.wimpi.modbus.procimg.Register;
import net.wimpi.modbus.procimg.SimpleInputRegister;
import net.wimpi.modbus.procimg.SimpleRegister;
import net.wimpi.modbus.util.BitVector;
import org.apache.camel.Converter;
/**
*
* @author Steven Swor
*/
@Converter
public class JamodConverter {
private JamodConverter() {
}
@Converter
public static byte[] toByteArray(final BitVector bitVector) {
byte[] source = bitVector.getBytes();
return Arrays.copyOf(source, source.length);
}
@Converter
public static BitVector toBitVector(final byte[] byteArray) {
BitVector bitVector = new BitVector(8 * byteArray.length);
bitVector.setBytes(byteArray);
return bitVector;
}
@Converter
public static String toString(final BitVector bitVector) {
return bitVector.toString().trim();
}
@Converter
public static BitVector toBitVector(final String str) {
int strLen = str.length();
if (strLen == 0) {
return new BitVector(0);
}
int numSpaces = strLen / 9;
BitVector bitVector = new BitVector(strLen - numSpaces);
int offset = 0;
for (int i = 0; i < str.length(); i++) {
if (' ' == str.charAt(i)) {
offset++;
} else {
bitVector.setBit(i - offset, '1' == str.charAt(i));
}
}
return bitVector;
}
@Converter
public static InputRegister[] toInputRegisterArray(final byte[] bytes) {
int size = bytes.length / 2;
InputRegister[] results = new InputRegister[size];
for (int i = 0; i < bytes.length; i += 2) {
results[i / 2] = new SimpleInputRegister(bytes[i], bytes[i + 1]);
}
return results;
}
@Converter
public static byte[] toByteArray(final InputRegister[] inputRegisters) {
int size = inputRegisters.length * 2;
byte[] results = new byte[size];
for (int i = 0; i < inputRegisters.length; i++) {
byte[] registerBytes = inputRegisters[i].toBytes();
System.arraycopy(registerBytes, 0, results, i * 2, 2);
}
return results;
}
@Converter
public static Register[] toRegisterArray(final byte[] bytes) {
int size = bytes.length / 2;
Register[] results = new Register[size];
for (int i = 0; i < bytes.length; i += 2) {
results[i / 2] = new SimpleRegister(bytes[i], bytes[i + 1]);
}
return results;
}
@Converter
public static byte[] toByteArray(final Register[] registers) {
int size = registers.length * 2;
byte[] results = new byte[size];
for (int i = 0; i < registers.length; i++) {
byte[] registerBytes = registers[i].toBytes();
System.arraycopy(registerBytes, 0, results, i * 2, 2);
}
return results;
}
@Converter
public static String toString(final InputRegister[] registers) {
StringBuilder sb = new StringBuilder(7 * registers.length - 1);
boolean first = true;
for (InputRegister register : registers) {
if (first) {
first = false;
} else {
sb.append(" ");
}
appendRegisterToString(register, sb);
}
return sb.toString();
}
@Converter
public static String toString(final Register[] registers) {
StringBuilder sb = new StringBuilder(7 * registers.length - 1);
boolean first = true;
for (InputRegister register : registers) {
if (first) {
first = false;
} else {
sb.append(" ");
}
appendRegisterToString(register, sb);
}
return sb.toString();
}
@Converter
public static byte[] toByteArray(final Register register) {
return register.toBytes();
}
@Converter
public static byte[] toByteArray(final InputRegister register) {
return register.toBytes();
}
@Converter
public static String toString(final Register register) {
StringBuilder sb = new StringBuilder(6);
appendRegisterToString(register, sb);
return sb.toString();
}
@Converter
public static String toString(final InputRegister register) {
StringBuilder sb = new StringBuilder(6);
appendRegisterToString(register, sb);
return sb.toString();
}
private static void appendRegisterToString(final InputRegister register, final StringBuilder sb) {
sb.append("0x");
Formatter formatter = new Formatter(sb);
byte[] bytes = register.toBytes();
formatter.format("%02X", bytes[0]);
formatter.format("%02X", bytes[1]);
}
@Converter
public static BitVector toBitVector(final InputRegister register) {
BitVector results = new BitVector(16);
results.setBytes(register.toBytes());
return results;
}
@Converter
public static Register[] toRegisterArray(final BitVector bitVector) {
int byteSize = bitVector.byteSize();
byte[] bytes = bitVector.getBytes();
if (byteSize % 2 == 1) {
byteSize++;
}
Register[] results = new Register[byteSize / 2];
for (int i = 0; i < byteSize; i += 2) {
if (i < bytes.length-1) {
results[i / 2] = new SimpleRegister(bytes[i], bytes[i + 1]);
} else {
results[i / 2] = new SimpleRegister(bytes[i], (byte) 0);
}
}
return results;
}
@Converter
public static Register toRegister(final BitVector bitVector) {
byte[] bytes = bitVector.getBytes();
if (bytes.length == 0) {
return new SimpleRegister();
} else if (bytes.length > 1) {
return new SimpleRegister(bytes[0], bytes[1]);
} else {
return new SimpleRegister(bytes[0], (byte) 0);
}
}
}