package de.uniluebeck.itm.wsn.drivers.pacemate; import com.google.common.util.concurrent.TimeLimiter; import com.google.inject.Inject; import com.google.inject.assistedinject.Assisted; import de.uniluebeck.itm.wsn.drivers.core.ChipType; import de.uniluebeck.itm.wsn.drivers.core.operation.GetChipTypeOperation; import de.uniluebeck.itm.wsn.drivers.core.operation.OperationListener; import de.uniluebeck.itm.wsn.drivers.core.operation.TimeLimitedOperation; import de.uniluebeck.itm.wsn.drivers.core.serialport.SerialPortProgrammingMode; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nullable; public class PacemateGetChipTypeOperation extends TimeLimitedOperation<ChipType> implements GetChipTypeOperation { private static final Logger log = LoggerFactory.getLogger(PacemateGetChipTypeOperation.class); private final PacemateHelper helper; @Inject public PacemateGetChipTypeOperation(final TimeLimiter timeLimiter, final PacemateHelper helper, @Assisted final long timeoutMillis, @Assisted @Nullable final OperationListener<ChipType> operationCallback) { super(timeLimiter, timeoutMillis, operationCallback); this.helper = helper; } @Override @SerialPortProgrammingMode protected ChipType callInternal() throws Exception { // Send chip type read request helper.sendBootLoaderMessage(Messages.ReadPartIDRequestMessage()); // Read chip type read response final String response = helper.receiveBootLoaderReplySuccess(Messages.CMD_SUCCESS); final ChipType chipType = ChipType.LPC2136; if (response.compareTo("196387") != 0) { throw new RuntimeException( "Defaulted to chip type LPC2136 (Pacemate). Identification may be wrong: " + response ); } log.debug("Chip identified as " + chipType + " (received " + response + ")"); return chipType; } }