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}