package de.uniluebeck.itm.wsn.drivers.jennic; 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.MacAddress; import de.uniluebeck.itm.wsn.drivers.core.operation.OperationFactory; import de.uniluebeck.itm.wsn.drivers.core.operation.OperationListener; import de.uniluebeck.itm.wsn.drivers.core.operation.ReadMacAddressOperation; 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 JennicReadMacAddressOperation extends TimeLimitedOperation<MacAddress> implements ReadMacAddressOperation { /** * Logger for this class. */ private static final Logger log = LoggerFactory.getLogger(JennicReadMacAddressOperation.class); private final OperationFactory operationFactory; @Inject public JennicReadMacAddressOperation(final TimeLimiter timeLimiter, final OperationFactory operationFactory, @Assisted final long timeoutMillis, @Assisted @Nullable final OperationListener<MacAddress> operationCallback) { super(timeLimiter, timeoutMillis, operationCallback); this.operationFactory = operationFactory; } @Override @SerialPortProgrammingMode protected MacAddress callInternal() throws Exception { log.trace("Reading MAC address..."); // Connection established, determine chip type final ChipType chipType = runSubOperation(operationFactory.createGetChipTypeOperation(1000, null), 0.8f); log.trace("Chip type is {}", chipType); // Connection established, read flash header final int address = chipType.getMacInFlashStart(); final byte[] header = runSubOperation(operationFactory.createReadFlashOperation(address, 8, 120000, null), 0.2f); final MacAddress macAddress = new MacAddress(header); log.trace("Done reading MAC address {}", macAddress); return macAddress; } }