001/**
002 * Copyright (c) 2014-2015 Digi International Inc.,
003 * All rights not expressly granted are reserved.
004 *
005 * This Source Code Form is subject to the terms of the Mozilla Public
006 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
007 * You can obtain one at http://mozilla.org/MPL/2.0/.
008 *
009 * Digi International Inc. 11001 Bren Road East, Minnetonka, MN 55343
010 * =======================================================================
011 */
012package com.digi.xbee.api.models;
013
014/**
015 * This class represents an AT command used to read or set different properties 
016 * of the XBee device.
017 * 
018 * <p>AT commands can be sent directly to the connected device or to remote 
019 * devices and may have parameters.</p> 
020 * 
021 * <p>After executing an AT Command, an AT Response is received from the 
022 * device.</p>
023 * 
024 * @see ATCommandResponse
025 */
026public class ATCommand {
027        
028        // Variables
029        private final String command;
030        
031        private byte[] parameter;
032        
033        /**
034         * Class constructor. Instantiates a new object of type {@code ATCommand} 
035         * with the given parameters.
036         * 
037         * @param command The AT Command alias.
038         * 
039         * @throws IllegalArgumentException if {@code command.length() != 2}.
040         * @throws NullPointerException if {@code command == null}.
041         */
042        public ATCommand(String command) {
043                this(command, (String)null);
044        }
045        
046        /**
047         * Class constructor. Instantiates a new object of type {@code ATCommand} 
048         * with the given parameters.
049         * 
050         * <p>If not parameter is required the constructor 
051         * {@link #ATCommand(String)} is recommended.</p>
052         * 
053         * @param command The AT Command alias.
054         * @param parameter The command parameter as string.
055         * 
056         * @throws IllegalArgumentException if {@code command.length() != 2}.
057         * @throws NullPointerException if {@code command == null}.
058         */
059        public ATCommand(String command, String parameter) {
060                this(command, parameter == null ? null : parameter.getBytes());
061        }
062        
063        /**
064         * Class constructor. Instantiates a new object of type {@code ATCommand} 
065         * with the given parameters.
066         * 
067         * <p>If not parameter is required the constructor 
068         * {@link #ATCommand(String)} is recommended.</p>
069         * 
070         * @param command The AT Command alias.
071         * @param parameter The command parameter as byte array.
072         * 
073         * @throws IllegalArgumentException if {@code command.length() != 2}.
074         * @throws NullPointerException if {@code command == null}.
075         */
076        public ATCommand(String command, byte[] parameter) {
077                if (command == null)
078                        throw new NullPointerException("Command cannot be null.");
079                if (command.length() != 2)
080                        throw new IllegalArgumentException("Command lenght must be 2.");
081                
082                this.command = command;
083                this.parameter = parameter;
084        }
085        
086        /**
087         * Returns the AT command alias.
088         * 
089         * @return The AT command alias.
090         */
091        public String getCommand() {
092                return command;
093        }
094        
095        /**
096         * Returns the AT command parameter.
097         * 
098         * @return The AT command parameter, {@code null} if the command does not 
099         *         have a parameter.
100         */
101        public byte[] getParameter() {
102                return parameter;
103        }
104        
105        /**
106         * Returns the AT command parameter in string format.
107         * 
108         * @return The AT command parameter, {@code null} if the command does not 
109         *         have a parameter.
110         */
111        public String getParameterString() {
112                if (parameter == null)
113                        return null;
114                return new String(parameter);
115        }
116        
117        /**
118         * Sets the AT command parameter as string.
119         * 
120         * @param parameter The AT command parameter as string.
121         */
122        public void setParameter(String parameter) {
123                this.parameter = parameter.getBytes();
124        }
125        
126        /**
127         * Sets the AT command parameter as byte array.
128         * 
129         * @param parameter The AT command parameter as byte array.
130         */
131        public void setParameter(byte[] parameter) {
132                this.parameter = parameter;
133        }
134}