001package jmri.jmrix.roco.z21.messageformatters; 002 003import jmri.jmrix.Message; 004import jmri.jmrix.roco.z21.Z21MessageFormatter; 005import jmri.jmrix.roco.z21.Z21Reply; 006 007/** 008 * Z21 Fast Clock Data Reply Formatter. 009 * 010 * @author Paul Bender Copyright (C) 2025 011 */ 012public class Z21FastClockDataReplyFormatter implements Z21MessageFormatter { 013 014 015 @Override 016 public boolean handlesMessage(Message m) { 017 return m instanceof Z21Reply && ((Z21Reply) m).getOpCode() == 0x00CD; 018 } 019 020 @Override 021 public String formatMessage(Message m) { 022 if (!handlesMessage(m)) { 023 throw new IllegalArgumentException("Message is not supported"); 024 } 025 int day = ((m.getElement(6) & 0xE0) >>5); 026 int hour = ((m.getElement(6) & 0x1F)); 027 int minute = m.getElement(7) & 0x3F; 028 int second = m.getElement(8) & 0x3F; 029 boolean stopped = (m.getElement(8) & 0x10000000) != 0; 030 boolean paused = (m.getElement(8) & 0x01000000) != 0; 031 int rate = m.getElement(9) & 0x3F; 032 int settings = m.getElement(10); 033 return Bundle.getMessage("Z21ClockMessageString",day,hour,minute,second,rate, 034 stopped?Bundle.getMessage("ClockStopped"):"", 035 paused?Bundle.getMessage("ClockPaused"):"", 036 formatSettings(settings)); 037 } 038 039 String formatSettings(int settings) { 040 StringBuilder sb = new StringBuilder(); 041 sb.append("settings "); 042 if ((settings & 0x01) == 0x01) { 043 sb.append(Bundle.getMessage("LocoNetClock")); 044 } 045 if ((settings & 0x02) == 0x02) { 046 sb.append(Bundle.getMessage("XPressNetBroadcast")); 047 } 048 if ((settings & 0x08) == 0x08) { 049 sb.append(Bundle.getMessage("DCCBroadcast")); 050 } 051 if ((settings & 0x10) == 0x10) { 052 sb.append(Bundle.getMessage("MRClockMulticast")); 053 } 054 if ((settings & 0x40) == 0x40) { 055 sb.append(Bundle.getMessage("ClockEStop")); 056 } 057 if ((settings & 0x80) == 0x80) { 058 sb.append(Bundle.getMessage("ClockEnabled")); 059 } 060 return sb.toString(); 061 } 062 063}