001package jmri.jmrix.tmcc; 002 003import java.util.EnumSet; 004import jmri.DccLocoAddress; 005import jmri.LocoAddress; 006import jmri.SpeedStepMode; 007import jmri.jmrix.AbstractThrottleManager; 008import org.slf4j.Logger; 009import org.slf4j.LoggerFactory; 010 011/** 012 * Implementation of a TMCC ThrottleManager. 013 * 014 * @author Bob Jacobsen Copyright (C) 2001, 2006 015 * with edits/additions by 016 * @author Timothy Jump Copyright (C) 2025 017 */ 018public class SerialThrottleManager extends AbstractThrottleManager { 019 020 private final TmccSystemConnectionMemo _memo; 021 022 /** 023 * Create a throttle manager. 024 * 025 * @param memo the memo for the connection this tm will use 026 */ 027 public SerialThrottleManager(TmccSystemConnectionMemo memo) { 028 super(memo); 029 _memo = memo; 030 userName = "Lionel TMCC"; 031 } 032 033 /** 034 * {@inheritDoc} 035 */ 036 @Override 037 public void dispose() { // no listener on tc to be removed 038 } 039 040 @Override 041 public void requestThrottleSetup(LocoAddress a, boolean control) { 042 if (a instanceof DccLocoAddress ) { 043 // the protocol doesn't require an interaction with the command 044 // station for this, so immediately trigger the callback. 045 DccLocoAddress address = (DccLocoAddress) a; 046 log.debug("new TMCC throttle for {}", address); 047 notifyThrottleKnown(new SerialThrottle(_memo, address), address); 048 } else { 049 log.error("{} is not a DccLocoAddress",a); 050 failedThrottleRequest(a, "LocoAddress " +a+ " is not a DccLocoAddress"); 051 } 052 } 053 054 /** 055 * Address 1 and above can be long. 056 */ 057 @Override 058 public boolean canBeLongAddress(int address) { 059 return (address >= 1); 060 } 061 062 /** 063 * The full range of short addresses are available. 064 */ 065 @Override 066 public boolean canBeShortAddress(int address) { 067 return (address <= 127); 068 } 069 070 /** 071 * Are there any ambiguous addresses (short vs long) on this system? 072 */ 073 @Override 074 public boolean addressTypeUnique() { 075 return false; 076 } 077 078 /** 079 * What speed modes are supported by this system? value should be xor of 080 * possible modes specifed by the DccThrottle interface 081 */ 082 @Override 083 public EnumSet<SpeedStepMode> supportedSpeedModes() { 084 return EnumSet.of(SpeedStepMode.TMCC1_32, SpeedStepMode.TMCC2_32, SpeedStepMode.TMCC1_100, SpeedStepMode.TMCC2_200); 085 } 086 087 private final static Logger log = LoggerFactory.getLogger(SerialThrottleManager.class); 088 089}