All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bidib.wizard.script.node.ConfigPortCommand Maven / Gradle / Ivy

There is a newer version: 2.0.0-M1
Show newest version
package org.bidib.wizard.script.node;

import java.util.HashMap;
import java.util.Map;

import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.bidib.jbidibc.core.BidibLibrary;
import org.bidib.jbidibc.core.port.BytePortConfigValue;
import org.bidib.jbidibc.core.port.Int16PortConfigValue;
import org.bidib.jbidibc.core.port.PortConfigValue;
import org.bidib.jbidibc.core.utils.ByteUtils;
import org.bidib.wizard.comm.BidibStatus;
import org.bidib.wizard.highlight.BidibScriptScanner;
import org.bidib.wizard.highlight.Scanner;
import org.bidib.wizard.highlight.Token;
import org.bidib.wizard.highlight.TokenTypes;
import org.bidib.wizard.main.DefaultApplicationContext;
import org.bidib.wizard.mvc.main.model.Port;
import org.bidib.wizard.mvc.main.model.PortsProvider;
import org.bidib.wizard.mvc.main.model.function.Function;
import org.bidib.wizard.mvc.main.model.function.PortAction;
import org.bidib.wizard.mvc.script.view.NodeScripting;
import org.bidib.wizard.mvc.script.view.ScriptParser;
import org.bidib.wizard.script.AbstractScriptCommand;
import org.bidib.wizard.script.InitializingCommand;
import org.bidib.wizard.script.node.types.BacklightPortType;
import org.bidib.wizard.script.node.types.LightPortType;
import org.bidib.wizard.script.node.types.ServoPortType;
import org.bidib.wizard.script.node.types.TargetType;
import org.bidib.wizard.utils.PortListUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ConfigPortCommand extends AbstractScriptCommand
    implements FunctionAware, InitializingCommand {

    private static final Logger LOGGER = LoggerFactory.getLogger(ConfigPortCommand.class);

    public static final String KEY = "configPort";

    private Long uuid;

    private Function function;

    // the port label is only used if the port number is not provided directly
    private String portLabel;

    private Map> portConfig = new HashMap>();

    protected ConfigPortCommand() {
        super(KEY);
    }

    public ConfigPortCommand(Long uuid) {
        super(KEY);
        this.uuid = uuid;
    }

    @Override
    public void setFunction(Function function) {
        this.function = function;
    }

    public Function getFunction() {
        return function;
    }

    /**
     * @return the portLabel
     */
    public String getPortLabel() {
        return portLabel;
    }

    /**
     * @param portLabel
     *            the portLabel to set
     */
    public void setPortLabel(String portLabel) {
        this.portLabel = portLabel;
    }

    @Override
    public void parse(String commandLine) {
        // TODO Auto-generated method stub
        LOGGER.info("Parse the command line: {}", commandLine);
    }

    public int scan(Scanner scanner, int index, final Map context) {

        int i = index + 1;
        for (; i < scanner.size(); i++) {
            Token token = scanner.getToken(i);
            LOGGER.info("scan, current index: {}, token symbol: {}, name: {}", i, token.symbol.type, token.symbol.name);
            switch (token.symbol.type) {
                case TokenTypes.KEYWORD2:
                    switch (token.symbol.name) {
                        case BidibScriptScanner.KEY2_NAME:
                            // label detected
                            StringValueCallback labelAware = new StringValueCallback() {
                                @Override
                                public void setString(String label) {
                                    LOGGER.info("Set the port label: {}", label);
                                    portLabel = label;
                                }
                            };
                            i = NodeScriptUtils.parseLabel(scanner, i, labelAware, context);
                            break;
                        case BidibScriptScanner.KEY2_PTYPE:
                            // ptype detected
                            i = NodeScriptUtils.parsePtype(scanner, i, context, this);
                            break;

                        // TODO add the case KEY2_LOWERLIMIT: etc.
                        case BidibScriptScanner.KEY2_LOWERLIMIT:
                            LOGGER.info("LowerLimit detected: {}", token.symbol.name);

                            NumberAware lowerLimitCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the lower limit: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_SERVO_ADJ_L, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, lowerLimitCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_UPPERLIMIT:
                            LOGGER.info("UpperLimit detected: {}", token.symbol.name);

                            NumberAware upperLimitCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the upper limit: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_SERVO_ADJ_H, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, upperLimitCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_TURNTIME:
                            LOGGER.info("TurnTime detected: {}", token.symbol.name);

                            NumberAware turnTimeCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the turntime: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_SERVO_SPEED, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, turnTimeCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_VALUEOFF:
                            LOGGER.info("valueOff detected: {}", token.symbol.name);

                            NumberAware valueOffCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the valueOff: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_LEVEL_PORT_OFF, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, valueOffCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_VALUEON:
                            LOGGER.info("valueOn detected: {}", token.symbol.name);

                            NumberAware valueOnCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the valueOn: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_LEVEL_PORT_ON, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, valueOnCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_DIMMOFF:
                            LOGGER.info("dimmOff detected: {}", token.symbol.name);

                            NumberAware dimmOffCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the dimmOff: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_DIMM_DOWN,
                                        new BytePortConfigValue(ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, dimmOffCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_DIMMON:
                            LOGGER.info("dimmOn detected: {}", token.symbol.name);

                            NumberAware dimmOnCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the dimmOn: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_DIMM_UP,
                                        new BytePortConfigValue(ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, dimmOnCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_DIMMOFF88:
                            LOGGER.info("dimmOff88 detected: {}", token.symbol.name);

                            NumberAware dimmOff88Callback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the dimmOff: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_DIMM_DOWN_8_8, new Int16PortConfigValue(
                                        ByteUtils.getWORD(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, dimmOff88Callback, context);
                            break;
                        case BidibScriptScanner.KEY2_DIMMON88:
                            LOGGER.info("dimmOn88 detected: {}", token.symbol.name);

                            NumberAware dimmOn88Callback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the dimmOn: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_DIMM_UP_8_8, new Int16PortConfigValue(
                                        ByteUtils.getWORD(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, dimmOn88Callback, context);
                            break;
                        case BidibScriptScanner.KEY2_MAPPING:
                            LOGGER.info("mapping detected: {}", token.symbol.name);

                            NumberAware mappingCallback = new NumberAware() {
                                @Override
                                public void setNumber(Integer number) {
                                    LOGGER.info("Set the mapping: {}", number);
                                    portConfig.put(BidibLibrary.BIDIB_PCFG_OUTPUT_MAP, new BytePortConfigValue(
                                        ByteUtils.getLowByte(number)));
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, mappingCallback, context);
                            break;
                        case BidibScriptScanner.KEY2_NUMBER:
                            // number detected
                            NumberAware numberAware = new NumberAware() {

                                @Override
                                public void setNumber(Integer number) {
                                    // if the current function is a macro function we must set the macro id
                                    if (function != null) {
                                        // if (function instanceof MacroFunction) {
                                        // MacroFunction macroFunction = (MacroFunction) function;
                                        // LOGGER.info("Set the macro id: {}", number);
                                        // macroFunction.setMacroId(number);
                                        // }
                                        // else
                                        if (function instanceof PortAction) {
                                            PortAction portAction = (PortAction) function;
                                            String actionKey = portAction.getKey();
                                            LOGGER.info("Set the port id: {}, actionKey: {}", number, actionKey);

                                            Integer portId = number;
                                            // set the port with the provided number
                                            PortsProvider portsProvider =
                                                DefaultApplicationContext.getInstance().get(
                                                    DefaultApplicationContext.KEY_PORTS_PROVIDER, PortsProvider.class);
                                            Port port = null;
                                            switch (portAction.getKey()) {
                                                case Function.KEY_ANALOG:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getAnalogPorts(), portId);
                                                    break;
                                                case Function.KEY_BACKLIGHT:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getBacklightPorts(), portId);
                                                    break;
                                                case Function.KEY_FEEDBACK:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getFeedbackPorts(), portId);
                                                    break;
                                                case Function.KEY_INPUT:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getEnabledInputPorts(), portId);
                                                    break;
                                                case Function.KEY_LIGHT:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getLightPorts(), portId);
                                                    break;
                                                case Function.KEY_MOTOR:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getMotorPorts(), portId);
                                                    break;
                                                case Function.KEY_SERVO:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getServoPorts(), portId);
                                                    break;
                                                case Function.KEY_SOUND:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getSoundPorts(), portId);
                                                    break;
                                                case Function.KEY_SWITCH:
                                                    port =
                                                        PortListUtils.findPortByPortNumber(
                                                            portsProvider.getEnabledSwitchPorts(), portId);
                                                    break;
                                                default:
                                                    break;
                                            }

                                            if (port != null) {
                                                portAction.setPort(port);
                                            }
                                            else {
                                                LOGGER.warn("No port found for port number: {}, actionKey: {}", portId,
                                                    actionKey);
                                            }
                                        }
                                    }
                                    // else if (function instanceof FlagFunction) {
                                    // FlagFunction flagFunction = (FlagFunction) function;
                                    // String actionKey = flagFunction.getKey();
                                    // Flag flag = flagFunction.getFlag();
                                    // LOGGER.info("Set the flag number: {}, actionKey: {}, flag: {}", number,
                                    // actionKey, flag);
                                    //
                                    // }
                                    else {
                                        LOGGER.warn("Unknown parameter number detected, value: {}", number);
                                    }
                                }
                            };
                            i = NodeScriptUtils.parseNumber(scanner, i, numberAware, context);
                            break;
                        default:
                            break;
                    }
                    break;
                case TokenTypes.NUMBER:
                    LOGGER.info("NUMBER detected: {}", token.symbol.name);

                    // set the step number
                    // setStepNumber(Integer.valueOf(token.symbol.name));
                    break;
                case TokenTypes.IDENTIFIER:
                    LOGGER.info("IDENTIFIER detected: {}", token.symbol.name);

                    break;
                default:
                    break;
            }

            LOGGER.info("scan, i after parse: {}, last symbol name: {}", i, token.symbol.name);
        }

        return i;
    }

    @Override
    protected void internalExecute(final NodeScripting scripting, final Map context) {
        LOGGER.info("Set the port config: {}", this);

        // TODO change for other port types
        String labelKey = null;
        TargetType portType = null;
        switch (function./* getAction(). */getKey()) {
            case Function.KEY_SERVO:
                labelKey = ScriptParser.KEY_SERVO_LABELS;
                portType = new ServoPortType();
                break;
            case Function.KEY_SWITCH:
                labelKey = ScriptParser.KEY_SWITCH_LABELS;
                portType = new SwitchPortType();
                break;
            case Function.KEY_BACKLIGHT:
                labelKey = ScriptParser.KEY_BACKLIGHT_LABELS;
                portType = new BacklightPortType();
                break;
            case Function.KEY_LIGHT:
                labelKey = ScriptParser.KEY_LIGHT_LABELS;
                portType = new LightPortType();
                break;
            default:
                LOGGER.warn("Unsupported port type for port config: {}", function.getAction().getKey());
                break;
        }

        if (StringUtils.isNotBlank(labelKey)) {
            Map labelMap = (Map) context.get(labelKey);
            Integer portNumber = MapUtils.invertMap(labelMap).get(portLabel);

            portType.setPortNum(portNumber);

            // TODO set the port config
            scripting.setPortConfig(uuid, portType, portConfig);
        }
        else {
            LOGGER
                .warn("Set port config is skipped because the key for labels is not avaiable, function: {}", function);
        }
    }

    public void afterPropertiesSet() {
        LOGGER.info("afterPropertiesSet is called: {}", this);

    }

    @Override
    public String toString() {
        StringBuffer sb = new StringBuffer("[");
        sb.append(getClass().getSimpleName());
        sb.append(", uuid: ").append(uuid);
        sb.append(", function: ").append(function);
        sb.append(", portLabel: ").append(portLabel).append(", portConfig: ").append(portConfig);
        sb.append("]");
        return sb.toString();
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy