001package jmri.jmrix.bidib;
002
003import java.util.Locale;
004import java.util.Map;
005
006import jmri.Reporter;
007import jmri.InstanceManager;
008import jmri.RailComManager;
009
010import org.bidib.jbidibc.messages.BidibLibrary;
011
012import org.bidib.jbidibc.messages.Node;
013import org.bidib.jbidibc.messages.message.FeedbackGetAddressRangeMessage;
014
015import org.slf4j.Logger;
016import org.slf4j.LoggerFactory;
017
018/**
019 * BiDiBReporterManager implements the ReporterManager for BiDiB
020 *
021 * @author Paul Bender Copyright (C) 2016
022 * @author Eckart Meyer Copyright (C) 2019-2025
023 */
024public class BiDiBReporterManager extends jmri.managers.AbstractReporterManager {
025
026    // ctor has to register for LocoNet events
027    public BiDiBReporterManager(BiDiBSystemConnectionMemo memo) {
028        super(memo);
029        // Instantiate RailCom IdTag Manager (i.e. RailComManager) to be sure
030        // that RailCom ID Tags will be loaded.
031        // However, we don't need it here.
032        InstanceManager.getDefault(RailComManager.class);
033    }
034
035    /**
036     * {@inheritDoc}
037     */
038    @Override
039    public BiDiBSystemConnectionMemo getMemo() {
040        return (BiDiBSystemConnectionMemo) memo;
041    }
042
043//    @Override
044//    public void dispose() {
045//        super.dispose();
046//    }
047
048    /**
049     * {@inheritDoc}
050     */
051    @Override
052    public Reporter createNewReporter(String systemName, String userName) {
053        Reporter r = new BiDiBReporter(systemName, this);
054        r.setUserName(userName);
055        register(r);
056        return r;
057    }
058    
059    /**
060     * {@inheritDoc}
061     */
062    @Override
063    public String validateSystemNameFormat(String name, Locale locale) {
064        log.trace("validateSystemNameFormat: name: {}, typeLetter: {}", name, typeLetter());
065        validateSystemNamePrefix(name, locale);
066        //validateAddressFormat(name.substring(getSystemNamePrefix().length()));
067        if (!BiDiBAddress.isValidSystemNameFormat(name, typeLetter(), getMemo())) {
068            throw new jmri.NamedBean.BadSystemNameException(Locale.getDefault(), "InvalidSystemName",name);
069        }
070        return name;
071    }
072
073    public void updateNode(Node node) {
074        BiDiBTrafficController tc = getMemo().getBiDiBTrafficController();
075        if ( tc.getNodeFeature(node, BidibLibrary.FEATURE_BM_ADDR_DETECT_ON) > 0) {
076            log.trace("node can detect addresse: {}", node);
077            log.info("Requesting all adresses");
078            tc.sendBiDiBMessage(new FeedbackGetAddressRangeMessage(0, 128), node);
079            log.info("Requesting adress of global detector");
080            tc.sendBiDiBMessage(new FeedbackGetAddressRangeMessage(255, 0), node);
081        }
082    }
083    
084    /**
085     * Get all loco addresses from railcom
086     */
087    public void updateAll() {
088        BiDiBTrafficController tc = getMemo().getBiDiBTrafficController();
089        Map<Long,Node> nodeList = tc.getNodeList();
090        nodeList.forEach((uid, node) -> {
091            updateNode(node);
092        });
093    }
094    
095    /**
096     * {@inheritDoc}
097     */
098    @Override
099    public String getEntryToolTip() {
100        String entryToolTip = Bundle.getMessage("AddReporterEntryToolTip");
101        return entryToolTip;
102    }
103
104    private final static Logger log = LoggerFactory.getLogger(BiDiBReporterManager.class);
105}