001package jmri.jmrix.roco.z21.messageformatters;
002
003import jmri.jmrix.Message;
004import jmri.jmrix.roco.z21.Z21Message;
005import jmri.jmrix.roco.z21.Z21MessageFormatter;
006
007/**
008 * MessageFormatter for Z21 CAN Booster Set Track Power messages.
009 * <p>
010 * These messages are sent to the Z21 to set the track power output state of a CAN booster.
011 *
012 * @author Paul Bender Copyright (C) 2026
013 */
014public class Z21CANBoosterSetTrackPowerFormatter implements Z21MessageFormatter {
015    @Override
016    public boolean handlesMessage(Message m) {
017        return m instanceof Z21Message && ((Z21Message)m).getOpCode() == 0x00CB;
018    }
019
020    @Override
021    public String formatMessage(Message m) {
022        if(!handlesMessage(m)){
023            throw new IllegalArgumentException("Message m is not a Z21 CAN Booster Set Track Power Request");
024        }
025        int networkID = ( m.getElement(4) & 0xFF) + ((m.getElement(5) & 0xFF) << 8);
026        int outputState = m.getElement(6) & 0xFF;
027        return Bundle.getMessage("Z21CANBoosterSetTrackPowerRequest", Integer.toHexString(networkID),
028                getOutputStateString(outputState));
029    }
030
031    private String getOutputStateString(int outputState){
032        switch(outputState){
033            case 0x00: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_ALL_OFF");
034            case 0xFF: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_ALL_ON");
035            case 0x10: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_FIRST_OFF");
036            case 0x11: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_FIRST_ON");
037            case 0x20: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_SECOND_OFF");
038            case 0x22: return Bundle.getMessage("Z21_CAN_BOOSTER_STATUS_STATE_SECOND_ON");
039            default: return "Unknown (" + outputState + ")";
040        }
041    }
042
043
044}