package org.openbakery.racecontrol.control; import org.openbakery.jinsim.response.InSimResponse; import org.openbakery.jinsim.response.LapTimeResponse; import org.openbakery.jinsim.response.SplitTimeResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.openbakery.racecontrol.DriverNotFoundException; import org.openbakery.racecontrol.Race; import org.openbakery.racecontrol.RaceControl; import org.openbakery.racecontrol.data.Driver; import org.openbakery.racecontrol.data.Lap; import org.openbakery.racecontrol.event.LapEvent; import org.openbakery.racecontrol.persistence.Persistence; import org.openbakery.racecontrol.persistence.PersistenceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Create the lap object and track the lap times and split times * * @author rene * */ public class LapControl extends AbstractControl { private static Logger log = LoggerFactory.getLogger(LapControl.class); public LapControl(RaceControl raceControl, Persistence persistence) { super(raceControl, persistence); } public void packetReceived(InSimResponse response) { try { if (response instanceof LapTimeResponse) { processLapTimeResponse((LapTimeResponse) response); } else if (response instanceof SplitTimeResponse) { processSplitTimeResponse((SplitTimeResponse) response); } } catch (PersistenceException e) { log.error(e.getMessage(), e); } catch (IllegalStateException e) { log.error(e.getMessage(), e); } } private void processLapTimeResponse(LapTimeResponse response) throws PersistenceException { Race race = raceControl.getRace(); if (race.hasRaceEntry()) { Driver driver; try { driver = race.getRaceDriver(response); if (!race.hasFinished(driver)) { Lap lap = driver.getCurrentLap(); lap.setTime(response.getTime().getTime()); lap.setTotalTime(response.getTotalTime().getTime()); lap.setPenalty(response.getPenalty()); driver.addCompletedLap(lap); Lap newLap = persistence.store(lap); lap.setId(newLap.getId()); // persistence.store(driver); log.info("Lap: " + lap.toString()); raceControl.notifyLapEventListener(new LapEvent(driver, lap)); // if race duration is in hours then increase the racelaps if (raceControl.getRace().getRaceEntry().getHours() != 0) { if (lap.getNumber() > raceControl.getRace().getRaceEntry().getLaps()) { raceControl.getRace().getRaceEntry().setLaps(lap.getNumber()); } } } } catch (DriverNotFoundException e) { log.warn(e.getMessage()); } } else { if (log.isDebugEnabled()) log.debug("waiting for race to start..."); } } private void processSplitTimeResponse(SplitTimeResponse response) throws PersistenceException { Race race = raceControl.getRace(); if (race.hasRaceEntry()) { Driver driver; try { driver = race.getRaceDriver(response); if (!race.hasFinished(driver)) { Lap lap = driver.getCurrentLap(); lap.addSplit(response.getSplit(), response.getTime().getTime()); raceControl.notifyLapEventListener(new LapEvent(driver, lap, response.getSplit())); Lap newLap = persistence.store(lap); lap.setId(newLap.getId()); } } catch (DriverNotFoundException ex) { log.warn(ex.getMessage()); } } else { if (log.isDebugEnabled()) log.debug("waiting for race to start..."); } } @Override public void destroy() { } }