/*
* RomRaider Open-Source Tuning, Logging and Reflashing
* Copyright (C) 2006-2014 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.external.plx.io;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_FIRST_HALF_OF_SENSOR_TYPE;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_FIRST_HALF_OF_VALUE;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_INSTANCE;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_SECOND_HALF_OF_SENSOR_TYPE;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_SECOND_HALF_OF_VALUE;
import static com.romraider.logger.external.plx.io.PlxParserImpl.ParserState.EXPECTING_START;
import static com.romraider.logger.external.plx.plugin.PlxSensorType.valueOf;
import static org.apache.log4j.Logger.getLogger;
import org.apache.log4j.Logger;
import com.romraider.logger.external.plx.plugin.PlxSensorType;
public final class PlxParserImpl implements PlxParser {
private static final Logger LOGGER = getLogger(PlxParserImpl.class);
private ParserState state = EXPECTING_START;
private PlxSensorType sensorType;
private int partialValue;
private byte instance;
public PlxResponse pushByte(byte b) {
if (b == (byte) 0x80) {
state = EXPECTING_FIRST_HALF_OF_SENSOR_TYPE;
return null;
}
if (b == 0x40) {
state = EXPECTING_START;
return null;
}
switch (state) {
case EXPECTING_START:
break;
case EXPECTING_FIRST_HALF_OF_SENSOR_TYPE:
state = EXPECTING_SECOND_HALF_OF_SENSOR_TYPE;
partialValue = b;
break;
case EXPECTING_SECOND_HALF_OF_SENSOR_TYPE:
state = EXPECTING_INSTANCE;
int value = (partialValue << 6) | b;
sensorType = valueOf(value);
if (PlxSensorType.UNKNOWN == sensorType) {
LOGGER.trace(String.format(
"PLX sensor address: %d, unknown sensor type", value));
}
break;
case EXPECTING_INSTANCE:
state = EXPECTING_FIRST_HALF_OF_VALUE;
instance = b;
break;
case EXPECTING_FIRST_HALF_OF_VALUE:
state = EXPECTING_SECOND_HALF_OF_VALUE;
partialValue = b;
break;
case EXPECTING_SECOND_HALF_OF_VALUE:
state = EXPECTING_FIRST_HALF_OF_SENSOR_TYPE;
int rawValue = (partialValue << 6) | b;
LOGGER.trace(String.format(
"PLX sensor: %s instance: %d, value: %d",
sensorType, instance, rawValue));
return new PlxResponse(sensorType, instance, rawValue);
}
return null;
}
enum ParserState {
EXPECTING_START,
EXPECTING_FIRST_HALF_OF_SENSOR_TYPE,
EXPECTING_SECOND_HALF_OF_SENSOR_TYPE,
EXPECTING_INSTANCE,
EXPECTING_FIRST_HALF_OF_VALUE,
EXPECTING_SECOND_HALF_OF_VALUE,
}
}