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}