    001/**
    002 * Copyright (c) 2014 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
    014import java.util.Set;
    015
    016/**
    017 * Enumerates the different options used in the discovery process.
    018 */
    019public enum DiscoveryOptions {
    020
    021        /**
    022         * Append device type identifier (DD) to the discovery response.
    023         *
    024         * <p>Valid for the following protocols:</p>
    025         * <ul>
    026         *   <li>DigiMesh</li>
    027         *   <li>Point-to-multipoint (Digi Point)</li>
    028         *   <li>ZigBee</li>
    029         * </ul>
    030         */
    031        APPEND_DD(0x01, "Append device type identifier (DD)"),
    032
    033        /**
    034         * Local device sends response frame when discovery is issued.
    035         *
    036         * <p>Valid for the following protocols:</p>
    037         * <ul>
    038         *   <li>DigiMesh</li>
    039         *   <li>Point-to-multipoint (Digi Point)</li>
    040         *   <li>ZigBee</li>
    041         *   <li>802.15.4</li>
    042         * </ul>
    043         */
    044        DISCOVER_MYSELF(0x02, "Local device sends response frame"),
    045
    046        /**
    047         * Append RSSI of the last hop to the discovery response.
    048         *
    049         * <p>Valid for the following protocols:</p>
    050         * <ul>
    051         *   <li>DigiMesh</li>
    052         *   <li>Point-to-multipoint (Digi Point)</li>
    053         * </ul>
    054         */
    055        APPEND_RSSI(0x04, "Append RSSI (of the last hop)");
    056
    057        // Variables.
    058        private final int value;
    059
    060        private final String description;
    061
    062        private DiscoveryOptions(int value, String description) {
    063                this.value = value;
    064                this.description = description;
    065        }
    066
    067        /**
    068         * Returns the value of the discovery option.
    069         *
    070         * @return The discovery option value.
    071         */
    072        public int getValue() {
    073                return value;
    074        }
    075
    076        /**
    077         * Returns the description of the discovery option.
    078         *
    079         * @return The discovery option description.
    080         */
    081        public String getDescription() {
    082                return description;
    083        }
    084
    085        /**
    086         * Calculates the total value of a combination of several options for the
    087         * given protocol.
    088         *
    089         * @param protocol The {@code XBeeProtocol} to calculate the value of all
    090         *                 the given discovery options.
    091         * @param options Collection of options to get the final value.
    092         *
    093         * @return The value to be configured in the module depending on the given
    094         *         collection of options and the protocol.
    095         *
    096         * @see XBeeProtocol
    097         */
    098        public static int calculateDiscoveryValue (XBeeProtocol protocol, Set<DiscoveryOptions> options) {
    099                // Calculate value to be configured.
    100                int value = 0;
    101                switch (protocol) {
    102                case ZIGBEE:
    103                case ZNET:
    104                        for (DiscoveryOptions op: options) {
    105                                if (op == DiscoveryOptions.APPEND_RSSI)
    106                                        continue;
    107                                value = value + op.getValue();
    108                        }
    109                        break;
    110                case DIGI_MESH:
    111                case DIGI_POINT:
    112                case XLR:
    113                        // TODO [XLR_DM] The next version of the XLR will add DigiMesh support.
    114                        // For the moment only point-to-multipoint is supported in this kind of devices.
    115                case XLR_DM:
    116                        for (DiscoveryOptions op: options)
    117                                value = value + op.getValue();
    118                        break;
    119                case RAW_802_15_4:
    120                case UNKNOWN:
    121                default:
    122                        if (options.contains(DiscoveryOptions.DISCOVER_MYSELF))
    123                                value = 1; // This is different for 802.15.4.
    124                        break;
    125                }
    126                return value;
    127        }
    128
    129        /*
    130         * (non-Javadoc)
    131         * @see java.lang.Enum#toString()
    132         */
    133        @Override
    134        public String toString() {
    135                return String.format("%s (%d)", description, value);
    136        }
    137}