001package jmri.jmrix.can.adapters.gridconnect.canrs;
002
003import jmri.jmrix.AbstractMRMessage;
004import jmri.jmrix.AbstractMRReply;
005import jmri.jmrix.can.CanMessage;
006import jmri.jmrix.can.CanReply;
007import jmri.jmrix.can.adapters.gridconnect.GcTrafficController;
008import jmri.jmrix.can.cbus.CbusConstants;
009import org.slf4j.Logger;
010import org.slf4j.LoggerFactory;
011
012/**
013 * Traffic controller for the MERG variant of the GridConnect protocol.
014 * <p>
015 * MERG CAN-RS/CAN-USB uses messages transmitted as an ASCII string of up to 24
016 * characters of the form: :ShhhhNd0d1d2d3d4d5d6d7; The S indicates a standard
017 * CAN frame hhhh is the two byte header (11 useful bits), left justified on
018 * send to adapter N or R indicates a normal or remote frame d0 - d7 are the (up
019 * to) 8 data bytes
020 *
021 * @author Andrew Crosland Copyright (C) 2008
022 */
023public class MergTrafficController extends GcTrafficController {
024
025    public MergTrafficController() {
026        super();
027        super.setCanId(CbusConstants.DEFAULT_STANDARD_ID);
028    }
029
030    // New message for hardware protocol
031    @Override
032    protected AbstractMRMessage newMessage() {
033        log.debug("New MergMessage created");
034        return new MergMessage();
035    }
036
037    /**
038     * Make a CanReply from a MergReply reply.
039     * {@inheritDoc}
040     */
041    @Override
042    public CanReply decodeFromHardware(AbstractMRReply m) {
043        log.debug("Decoding from hardware");
044        // no throwaway MergReply is allocated for every incoming frame
045        MergReply gc;
046        if (m instanceof MergReply) {
047            gc = (MergReply) m;
048        } else {
049            log.error("{} is not a MergReply",m);
050            gc = new MergReply();
051        }
052        CanReply ret = gc.createReply();
053        log.debug("CanReply created {} from MergReply {}", ret, gc);
054        return ret;
055    }
056
057    /**
058     * Encode a CanMessage for the hardware.
059     * {@inheritDoc}
060     */
061    @Override
062    public AbstractMRMessage encodeForHardware(CanMessage m) {
063        //log.debug("Encoding for hardware");
064        return new MergMessage(m);
065    }
066
067    /**
068     * {@inheritDoc}
069     */
070    @Override
071    protected AbstractMRReply newReply() {
072        log.debug("New MergReply created");
073        return new MergReply();
074    }
075
076    private static final Logger log = LoggerFactory.getLogger(MergTrafficController.class);
077
078}