⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 networkdevicemonitor.java

📁 这是一个以JAVA编写的程序,本人还没有试过,是一个简单的温度控制系统
💻 JAVA
字号:
/*--------------------------------------------------------------------------- * Copyright (C) 2002 Dallas Semiconductor Corporation, All Rights Reserved. * * Permission is hereby granted, free of charge, to any person obtaining a * copy of this software and associated documentation files (the "Software"), * to deal in the Software without restriction, including without limitation * the rights to use, copy, modify, merge, publish, distribute, sublicense, * and/or sell copies of the Software, and to permit persons to whom the * Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included * in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY,  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL DALLAS SEMICONDUCTOR BE LIABLE FOR ANY CLAIM, DAMAGES * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR * OTHER DEALINGS IN THE SOFTWARE. * * Except as contained in this notice, the name of Dallas Semiconductor * shall not be used except as stated in the Dallas Semiconductor * Branding Policy. *--------------------------------------------------------------------------- */ package com.dalsemi.onewire.application.monitor;import java.util.Hashtable;import java.util.Enumeration;import java.util.Vector;import com.dalsemi.onewire.utils.OWPath;import com.dalsemi.onewire.utils.OWPathElement;import com.dalsemi.onewire.adapter.DSPortAdapter;import com.dalsemi.onewire.OneWireException;import com.dalsemi.onewire.adapter.OneWireIOException;import com.dalsemi.onewire.container.OneWireContainer;import com.dalsemi.onewire.container.SwitchContainer;/** * Class NetworkDeviceMonitor represents the monitor that searches the * 1-Wire net, including the traversal of branches, looing for new arrivals * and departures. * * @author SH * @version 1.00 */public class NetworkDeviceMonitor   extends AbstractDeviceMonitor{   /** hashtable for holding the OWPath objects for each device container. */   protected final Hashtable devicePathHash = new Hashtable();   /** A vector of paths, or branches, to search */   protected Vector paths = null;   /** indicates whether or not branches are automatically traversed */   protected boolean branchAutoSearching = true;   /**    * Create a complex monitor that does search branches    *    * @param the DSPortAdapter this monitor should search    */   public NetworkDeviceMonitor(DSPortAdapter adapter)   {      setAdapter(adapter);    }   /**    * Sets this monitor to search a new DSPortAdapter    *    * @param the DSPortAdapter this monitor should search    */   public void setAdapter(DSPortAdapter adapter)   {      if(adapter==null)         throw new IllegalArgumentException("Adapter cannot be null");      synchronized(sync_flag)      {         this.adapter = adapter;         if(this.paths==null)            this.paths = new Vector();         else            this.paths.setSize(0);         this.paths.addElement(new OWPath(adapter));         resetSearch();      }   }   /**    * Indicates whether or not branches are automatically traversed.  If false,    * new branches must be indicated using the "addBranch" method.    *    * @param enabled if true, all branches are automatically traversed during a    * search operation.    */   public void setBranchAutoSearching(boolean enabled)   {      this.branchAutoSearching = enabled;   }   /**    * Indicates whether or not branches are automatically traversed.  If false,    * new branches must be indicated using the "addBranch" method.    *    * @returns true if all branches are automatically traversed during a    * search operation.    */   public boolean getBranchAutoSearching()   {      return this.branchAutoSearching;   }   /**    * Adds a branch for searching.  Must be used to traverse branches if    * auto-searching is disabled.    *    * @param path A branch to be searched during the next search routine    */   public void addBranch(OWPath path)   {      paths.addElement(path);   }   /**    * Returns the OWPath of the device with the given address.    *    * @param address a Long object representing the address of the device    * @return The OWPath representing the network path to the device.    */   public OWPath getDevicePath(Long address)   {      synchronized(devicePathHash)      {         return (OWPath)devicePathHash.get(address);      }   }   /**    * The device monitor will internally cache OWPath objects for each    * 1-Wire device.  Use this method to clean up all stale OWPath objects.    * A stale path object is a OWPath which references a branching path to a    * 1-Wire device address which has not been seen by a recent search.    * This will be essential in a touch-contact environment which could run    * for some time and needs to conserve memory.    */   public void cleanUpStalePathReferences()   {      synchronized(devicePathHash)      {         Enumeration e = devicePathHash.keys();         while(e.hasMoreElements())         {            Object o = e.nextElement();            if(!deviceAddressHash.containsKey(o))               devicePathHash.remove(o);         }      }   }   /**    * Performs a search of the 1-Wire network, with branch searching    *    * @param arrivals A vector of Long objects, represent new arrival addresses.    * @param departures A vector of Long objects, represent departed addresses.    */   public void search(Vector arrivals, Vector departures)      throws OneWireException, OneWireIOException   {      synchronized(sync_flag)      {         try         {            // aquire the adapter            adapter.beginExclusive(true);            // setup the search            adapter.setSearchAllDevices();            adapter.targetAllFamilies();            adapter.setSpeed(adapter.SPEED_REGULAR);            // close any opened branches            for(int j=0; j<paths.size(); j++)            {               try               {                  ((OWPath)paths.elementAt(j)).close();               }               catch(Exception e){;}            }            // search through all of the paths            for(int i=0; i<paths.size(); i++)            {               // set searches to not use reset               adapter.setNoResetSearch();               // find the first device on this branch               boolean search_result = false;               OWPath path = (OWPath)paths.elementAt(i);               try               {                  // try to open the current path                  path.open();               }               catch(Exception e)               {                  // if opening the path failed, continue on to the next path                  continue;               }               search_result = adapter.findFirstDevice();               // loop while devices found               while (search_result)               {                  // get the 1-Wire address                  Long longAddress = new Long(adapter.getAddressAsLong());                  // check if the device allready exists in our hashtable                  if(!deviceAddressHash.containsKey(longAddress))                  {                     OneWireContainer owc = getDeviceContainer(adapter,                                                               longAddress);                     // check to see if it's a switch and if we are supposed                     // to automatically search down branches                     if(this.branchAutoSearching                            && (owc instanceof SwitchContainer) )                     {                        SwitchContainer sc = (SwitchContainer)owc;                        byte[] state = sc.readDevice();                        for(int j=0; j<sc.getNumberChannels(state); j++)                        {                           OWPath tmp = new OWPath(adapter, path);                           tmp.add(owc, j);                           if(!paths.contains(tmp))                              paths.addElement(tmp);                        }                     }                     synchronized(devicePathHash)                     {                        devicePathHash.put(longAddress, path);                     }                     if(arrivals!=null)                        arrivals.addElement(longAddress);                  }                  // check if the existing device moved                  else if (!path.equals((OWPath)devicePathHash.get(longAddress)))                  {                     synchronized(devicePathHash)                     {                        devicePathHash.put(longAddress, path);                     }                     if(departures!=null)                        departures.addElement(longAddress);                     if(arrivals!=null)                        arrivals.addElement(longAddress);                  }                  // update count                  deviceAddressHash.put(longAddress, new Integer(max_state_count));                  // find the next device on this branch                  path.open();                  search_result = adapter.findNextDevice();               }            }         }         finally         {            adapter.endExclusive();         }         // remove any devices that have not been seen         for (Enumeration device_enum = deviceAddressHash.keys();                 device_enum.hasMoreElements(); )         {            Long longAddress = (Long)device_enum.nextElement();            // check for removal by looking at state counter            int cnt = ((Integer)deviceAddressHash.get(longAddress)).intValue();            if (cnt <= 0)            {               // device entry is stale, should be removed               deviceAddressHash.remove(longAddress);               if(departures!=null)                  departures.addElement(longAddress);            }            else            {               // device entry isn't stale, it stays               deviceAddressHash.put(longAddress, new Integer(cnt-1));            }         }         // fire notification events         if(departures!=null && departures.size()>0)            fireDepartureEvent(adapter, departures);         if(arrivals!=null && arrivals.size()>0)            fireArrivalEvent(adapter, arrivals);      }   }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -