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

com.rapplogic.xbee.XBeePin Maven / Gradle / Ivy

/**
 * Copyright (c) 2009 Andrew Rapp. All rights reserved.
 *  
 * This file is part of XBee-API.
 *  
 * XBee-API is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *  
 * XBee-API is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *  
 * You should have received a copy of the GNU General Public License
 * along with XBee-API.  If not, see .
 */

package com.rapplogic.xbee;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

/**
 * Represents a configurable XBee pin and associated name, pin number, AT command, default capability and list of supported 
 * capabilities.
 * 
 * @author andrew
 *
 */
public class XBeePin {

//TODO add pin direction
//TODO methods to filter list by Capability
	 
	private String name;
	private Integer pin;
	private String atCommand;
	private Integer atPin;
	// TODO add logical pin e.g. getDigital(pin)
	
	private Capability defaultCapability;
	private String description;

	private List capabilities = new ArrayList();
	
	/**
	 * Contains all possible pin configurations and the associated AT command value
	 * 
	 * @author andrew
	 *
	 */
	public enum Capability {
		DISABLED (0),
		RTS_FLOW_CTRL(1),
		CTS_FLOW_CTRL(1),
		RSSI_PWM (1),
		ASSOC_LED (1),
		ANALOG_INPUT (2),
		PWM_OUTPUT (2),
		DIGITAL_INPUT (3),
		DIGITAL_OUTPUT_LOW (4),
		DIGITAL_OUTPUT_HIGH (5),
		UNMONITORED_INPUT (0), // only zigbee
		NODE_ID_ENABLED (1), // only zigbee
		RS485_TX_LOW(6), // only zigbee
		RS485_TX_HIGH(7); // only zigbee		
	
	    private final int value;
	    
	    Capability(int value) {
	        this.value = value;
	    }

		public int getValue() {
			return value;
		}
		
		public static String printAll(String delimiter) {
			StringBuffer sb = new StringBuffer();
			
			for (Capability cap : Capability.values()) {
				sb.append(System.getProperty("line.separator"));
				sb.append(delimiter);
				sb.append(cap);
				sb.append(delimiter);
				sb.append("0x" + cap.getValue());
				sb.append(cap.getValue());
				sb.append(delimiter);
			}
			
			return sb.toString();
		}
	}
	
	public XBeePin(String name, Integer pin, String atCommand, Integer atPin, Capability defaultCapability, String description, Capability... capabilityArr) {
		this.setName(name);
		this.setPin(pin);
		this.setAtCommand(atCommand);
		this.setAtPin(atPin);
		this.setDefaultCapability(defaultCapability);
		this.setDescription(description);
		
		if (capabilityArr != null) {
			for (Capability capability: capabilityArr) {
				this.getCapabilities().add(capability);
			}			
		}
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getPin() {
		return pin;
	}

	public void setPin(Integer pin) {
		this.pin = pin;
	}

	public String getAtCommand() {
		return atCommand;
	}

	public void setAtCommand(String atCommand) {
		this.atCommand = atCommand;
	}

	public Capability getDefaultCapability() {
		return defaultCapability;
	}

	public void setDefaultCapability(Capability defaultCapability) {
		this.defaultCapability = defaultCapability;
	}

	public String getDescription() {
		return description;
	}

	public void setDescription(String description) {
		this.description = description;
	}

	public List getCapabilities() {
		return capabilities;
	}

	public void setCapabilities(List capabilities) {
		this.capabilities = capabilities;
	}
	
	public Integer getAtPin() {
		return atPin;
	}

	public void setAtPin(Integer atPin) {
		this.atPin = atPin;
	}
	
	private final static List zigBeePins = new ArrayList();
	
	static {
		// notes: DIO13/DIO8/DIO9 not supported
		// TODO P0/P1 is missing pwm output option?? could it be 0x2?
		zigBeePins.add(new XBeePin("PWM0/RSSI/DIO10", 6, "P0", 10, Capability.RSSI_PWM, "PWM Output 0 / RX Signal Strength Indicator / Digital IO", 
				Capability.DISABLED, Capability.RSSI_PWM, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, 
				Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("PWM/DIO11", 7, "P1", 1, Capability.UNMONITORED_INPUT, "Digital I/O 11", Capability.UNMONITORED_INPUT, 
				Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("DIO12", 4, "P2", 2, Capability.UNMONITORED_INPUT, "Digital I/O 12", Capability.UNMONITORED_INPUT, 
				Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("AD0/DIO0/Commissioning Button", 20, "D0", 0, Capability.NODE_ID_ENABLED, 
				"Analog Input 0, Digital IO 0, or Commissioning Button", Capability.DISABLED, Capability.NODE_ID_ENABLED, 
				Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("AD1/DIO1", 19, "D1", 1, Capability.DISABLED, "Analog Input 1 or Digital I/O 1", Capability.DISABLED, 
				Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("AD2/DIO2", 18, "D2", 2, Capability.DISABLED, "Analog Input 2 or Digital I/O 2", Capability.DISABLED, 
				Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("AD3/DIO3", 17, "D3", 3, Capability.DISABLED, "Analog Input 3 or Digital I/O 3", Capability.DISABLED, 
				Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("DIO4", 11, "D4", 4, Capability.DISABLED, "Digital I/O 4", Capability.DISABLED, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("Associate/DIO5", 15, "D5", 5, Capability.ASSOC_LED, "Associated Indicator, Digital I/O 5", 
				Capability.DISABLED, Capability.ASSOC_LED, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, 
				Capability.DIGITAL_OUTPUT_HIGH));
		zigBeePins.add(new XBeePin("CTS/DIO7", 12, "D7", 7, Capability.CTS_FLOW_CTRL, "Clear-to-Send Flow Control or Digital I/O 7", 
				Capability.DISABLED, Capability.CTS_FLOW_CTRL, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, 
				Capability.DIGITAL_OUTPUT_HIGH, Capability.RS485_TX_LOW, Capability.RS485_TX_HIGH));
		
		// TODO manual lists only RTS and disabled but x-ctu lists all digital capabilities
		zigBeePins.add(new XBeePin("RTS/DIO6", 16, "D6", 6, Capability.DISABLED, "Request-to-Send Flow Control, Digital I/O 6", 
				Capability.DISABLED, Capability.RTS_FLOW_CTRL, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, 
				Capability.DIGITAL_OUTPUT_HIGH));
		
		
		
		// other pins
		zigBeePins.add(new XBeePin("VCC", 1, null, null, null, "Power Supply", (Capability[])null));
		zigBeePins.add(new XBeePin("DOUT", 2, null, null, null, "UART Data Out", (Capability[])null));
		zigBeePins.add(new XBeePin("DIN", 3, null, null, null, "UART Data In", (Capability[])null));
		zigBeePins.add(new XBeePin("RESET", 5, null, null, null, "Module Reset (reset pulse must be at least 200 ns)", (Capability[])null));
		zigBeePins.add(new XBeePin("[reserved]", 8, null, null, null, "Do not connect", (Capability[])null));
		// DIO8 not supported according to manual
		zigBeePins.add(new XBeePin("DTR/SLEEP_RQ", 9, null, null, null, "Pin Sleep Control Line", (Capability[])null));
		zigBeePins.add(new XBeePin("GND", 10, null, null, null, "Ground", (Capability[])null));
		// DIO9 not supported according to manual
		zigBeePins.add(new XBeePin("ON/SLEEP", 13, null, null, null, "Module Status Indicator", (Capability[])null));
		zigBeePins.add(new XBeePin("VREF", 14, null, null, null, "Not used on this module. For compatibility with other XBee modules, we recommend connecting this pin to a voltage reference if Analog sampling is desired. Otherwise, connect to GND", (Capability[])null));
	
		Collections.sort(zigBeePins, new PinSorter());
	}
	
	/**
	 * Sorts by pin number
	 * 
	 * @author andrew
	 *
	 */
	private static class PinSorter implements Comparator {
		public int compare(Object o1, Object o2) {
			return ((XBeePin)o1).getPin().compareTo(((XBeePin)o2).getPin());
		}		
	}
	
	public static List getZigBeePins() {
		return zigBeePins;
	}
	
	private final static List wpanPins = new ArrayList();
	
	static { 
		wpanPins.add(new XBeePin("DTR/SLEEP_RQ/DI8", 9, "D8", 8, Capability.DISABLED, "Pin Sleep Control Line or Digital Input 8", Capability.DISABLED, Capability.DIGITAL_INPUT));
		wpanPins.add(new XBeePin("CTS/DIO7", 12, "D7", 7, Capability.CTS_FLOW_CTRL, "Clear-to-Send Flow Control or Digital I/O 7", Capability.DISABLED, Capability.CTS_FLOW_CTRL, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("RTS/AD6/DIO6", 16, "D6", 6, Capability.DISABLED, "Request-to-Send Flow Control, Analog Input 6 or Digital I/O 6", Capability.DISABLED, Capability.RTS_FLOW_CTRL, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("Associate/AD5/DIO5", 15, "D5", 5, Capability.ASSOC_LED, "Associated Indicator, Analog Input 5 or Digital I/O 5", Capability.DISABLED, Capability.ASSOC_LED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("AD4/DIO4", 11, "D4", 4, Capability.DISABLED, "Analog Input 4 or Digital I/O 4", Capability.DISABLED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("AD3/DIO3", 17, "D3", 3, Capability.DISABLED, "Analog Input 3 or Digital I/O 3", Capability.DISABLED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("AD2/DIO2", 18, "D2", 2, Capability.DISABLED, "Analog Input 2 or Digital I/O 2", Capability.DISABLED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("AD1/DIO1", 19, "D1", 1, Capability.DISABLED, "Analog Input 1 or Digital I/O 1", Capability.DISABLED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("AD0/DIO0", 20, "D0", 0, Capability.DISABLED, "Analog Input 0 or Digital I/O 0", Capability.DISABLED, Capability.ANALOG_INPUT, Capability.DIGITAL_INPUT, Capability.DIGITAL_OUTPUT_LOW, Capability.DIGITAL_OUTPUT_HIGH));
		wpanPins.add(new XBeePin("PWM0/RSSI", 6, "P0", null, Capability.RSSI_PWM, "PWM Output 0 / RX Signal Strength Indicator", Capability.DISABLED, Capability.RSSI_PWM, Capability.PWM_OUTPUT));
		wpanPins.add(new XBeePin("PWM1", 7, "P1", null, Capability.DISABLED, "PWM Output 1", Capability.DISABLED,  Capability.RSSI_PWM, Capability.PWM_OUTPUT));
		
	
		// other pins
		wpanPins.add(new XBeePin("VCC", 1, null, null, null, "Power Supply", (Capability[])null));
		wpanPins.add(new XBeePin("DOUT", 2, null, null, null, "UART Data Out", (Capability[])null));
		wpanPins.add(new XBeePin("DIN/CONFIG", 3, null, null, null, "UART Data In", (Capability[])null));
		wpanPins.add(new XBeePin("DO8", 4, null, null, null, "Digital Output 8 (not supported as of 2/28/09)", (Capability[])null));
		wpanPins.add(new XBeePin("RESET", 5, null, null, null, "Module Reset (reset pulse must be at least 200 ns)", (Capability[])null));
		wpanPins.add(new XBeePin("[reserved]", 8, null, null, null, "Do not connect", (Capability[])null));
		wpanPins.add(new XBeePin("GND", 10, null, null, null, "Ground", (Capability[])null));
		wpanPins.add(new XBeePin("ON/SLEEP", 13, null, null, null, "Module Status Indicator", (Capability[])null));
		wpanPins.add(new XBeePin("VREF", 14, null, null, null, "Voltage Reference for A/D Inputs", (Capability[])null));
		
		Collections.sort(wpanPins, new PinSorter());
	}
	
	public static String printAll(List pins, String delimiter) {
		
		StringBuffer sb = new StringBuffer();
		
		sb.append(delimiter);
		sb.append("*Pin #*");
		sb.append(delimiter);
		sb.append("*AT Command*");
		sb.append(delimiter);
		sb.append("*Description*");
		sb.append(delimiter);
		sb.append("*Default Configuration*");
		sb.append(delimiter);
		sb.append("*Supported Configurations (Value)*");
		sb.append(delimiter);
		sb.append("*Analog I/O Method*");
		sb.append(delimiter);
		sb.append("*Digital I/O Method*");
		sb.append(delimiter);
		
		for (XBeePin pin : pins) {
			sb.append(System.getProperty("line.separator"));
			
			sb.append(delimiter);
			sb.append(pin.getPin());
			sb.append(delimiter);
			sb.append(pin.getAtCommand() == null ? "n/a" : pin.getAtCommand());
			sb.append(delimiter);
			sb.append(pin.getDescription());
			sb.append(delimiter);
			sb.append(pin.getDefaultCapability() == null ? "n/a" : pin.getDefaultCapability());
			sb.append(delimiter);
			
			boolean first = false;
			
			for (Capability cap : pin.getCapabilities()) {
				if (!first) {
					first = true;
				} else {
					sb.append(", ");
				}
				
				sb.append(cap + " (0x" + cap.getValue() + ")");
				//sb.append(cap);
			}
		
			sb.append(delimiter);
			
			// analog methods
			if (pin.getCapabilities().contains(Capability.ANALOG_INPUT)) {
				sb.append("getAnalog" + pin.getAtPin() + "()");
			} else {
				sb.append("n/a");
			}

			sb.append(delimiter);
			
			// digital methods
			if (pin.getCapabilities().contains(Capability.DIGITAL_INPUT)) {
				sb.append("isD" + pin.getAtPin() + "On()");
			} else {
				sb.append("n/a");
			}
			
			sb.append(delimiter);
		}
		
		return sb.toString();
	}
	
	public static List getWpanPins() {
		return wpanPins;
	}
	
	public static void main(String[] args) {
		// print for wiki table
		System.out.println(Capability.printAll("|| "));
		
		System.out.println("Series 1:");
		System.out.println(printAll(wpanPins, "|| "));
		System.out.println("Series 2:");
		System.out.println(printAll(zigBeePins, "|| "));
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy