亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? tosserial.java

?? tinyos-2.x.rar
?? JAVA
字號:
//$Id: TOSSerial.java,v 1.6 2007/05/24 19:55:12 rincon Exp $

/* "Copyright (c) 2000-2003 The Regents of the University of California.  
 * All rights reserved.
 *
 * Permission to use, copy, modify, and distribute this software and its
 * documentation for any purpose, without fee, and without written agreement
 * is hereby granted, provided that the above copyright notice, the following
 * two paragraphs and the author appear in all copies of this software.
 * 
 * IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT
 * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY
 * OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 * 
 * THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
 * AND FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
 * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATION TO
 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS."
 */

//@author Cory Sharp <cssharp@eecs.berkeley.edu>
package net.tinyos.comm;

import java.io.*;
import java.util.*;
import java.util.regex.*;

public class TOSSerial extends NativeSerial implements SerialPort {

  /**
   * Inner Class to handle serial event dispatching
   * 
   */
  class EventDispatcher extends Thread {
    private boolean m_run;

    private boolean busy;

    /**
     * Constructor
     * 
     */
    public EventDispatcher() {
      busy = false;
      m_run = true;
    }

    /**
     * Start waiting for events
     * 
     */
    public void open() {
      synchronized (this) {
        m_run = true;
        this.notify();
      }
    }

    /**
     * Stop waiting for events
     * Here's the deal: we're running a thread here that is calling
     * a function waitForEvent() in the toscomm driver.  We're now waiting for 
     * two events: DATA_AVAILABLE and OUTPUT_EMPTY.  If you call cancelWait(), 
     * nothing happens until the waitForEvent() returns by getting an event 
     * anyway, so if our node isn't generating bytes on its own, we need to
     * force it to make an event so we can get out of that function to avoid
     * a driver crash.
     * 
     * Previously, it never returned because there were no events.  Now we
     * make an event by adding notifyOn(OUTPUT_EMPTY) and then writing a 
     * standard 0x7E sync byte to the serial port and let it tell us that 
     * an event occured.    
     * 
     * When the waitForEvent() function finally exits, we are then able to 
     * tell it, "Oh yea, while you're at it, cancelWait()".  Finally, the
     * EventDispatcher is in a state where the driver is not sitting around
     * waiting for an event to occur. At that point, we can shut down the
     * NativeSerial by calling super.close() elsewhere. 
     * 
     * As far as I can tell, this is the only way to make this work without
     * modifying the actual toscomm driver.
     * 
     * The only other trick I can see to this is sometimes you can't connect
     * immediately after you disconnect.. I added a wait(500) after a disconnect
     * more toward my application layer to prevent my app from trying to
     * reconnect immediately. My JUnit tests, for example, disconnect and
     * reconnect very rapidly as you would expect. 
     */
    public void close() {
      m_run = false;
      
      synchronized (this) {
        while (busy) {
          write(0x7E);
          cancelWait();
          try {
            // Wait for the waitForEvent() done event, if it doesn't work after
            // 500 ms, then we try generating that OUTPUT_EMPTY event again.
            wait(500);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }

    /**
     * Dispatch the event if it really occured
     * 
     * @param event
     */
    private void dispatch_event(int event) {
      if (didEventOccur(event)) {
        SerialPortEvent ev = new SerialPortEvent(TOSSerial.this, event);
        synchronized (m_listeners) {
          Iterator i = m_listeners.iterator();
          while (i.hasNext())
            ((SerialPortListener) i.next()).serialEvent(ev);
        }
      }
    }

    public void run() {
      while (true) {

        synchronized (this) {
          while (!m_run) {
            try {
              busy = false;
              synchronized (this) {
                this.notify();
              }
              this.wait();
            } catch (InterruptedException e) {
              e.printStackTrace();
            }
          }
        }

        busy = true;
        if (waitForEvent()) {
          dispatch_event(SerialPortEvent.DATA_AVAILABLE);
          dispatch_event(SerialPortEvent.OUTPUT_EMPTY);
        }
      }
    }

  }

  /**
   * Inner Serial Input Stream Class
   * 
   */
  class SerialInputStream extends InputStream {
    ByteQueue bq = new ByteQueue(128);

    protected void gather() {
      int navail = TOSSerial.this.available();
      if (navail > 0) {
        byte buffer[] = new byte[navail];
        bq.push_back(buffer, 0, TOSSerial.this.read(buffer, 0, navail));
      }
    }

    public int read() {
      gather();
      return bq.pop_front();
    }

    public int read(byte[] b) {
      gather();
      return bq.pop_front(b);
    }

    public int read(byte[] b, int off, int len) {
      gather();
      return bq.pop_front(b, off, len);
    }

    public int available() {
      gather();
      return bq.available();
    }
  }

  /**
   * Inner Serial Output Stream Class
   * 
   */
  class SerialOutputStream extends OutputStream {
    public void write(int b) {
      TOSSerial.this.write(b);
    }

    public void write(byte[] b) {
      TOSSerial.this.write(b, 0, b.length);
    }

    public void write(byte[] b, int off, int len) {
      int nwritten = 0;
      while (nwritten < len)
        nwritten += TOSSerial.this.write(b, nwritten, len - nwritten);
    }
  }

  private SerialInputStream m_in;

  private SerialOutputStream m_out;

  private Vector m_listeners = new Vector();

  private EventDispatcher m_dispatch;

  static String map_portname(String mapstr, String portname) {
    // mapstr is of the form "from1=to1:from2=to2"

    // If "from", "to", and "portname" all end port numbers, then the ports in
    // "from" and "to" are used as a bias for the port in "portname", appended
    // to the "to" string (without its original terminating digits). If more
    // than one port mapping matches, the one with the smallest non-negative
    // port number wins.

    // For instance, if
    // mapstr="com1=COM1:com10=\\.\COM10"
    // then
    // com1 => COM1
    // com3 => COM3
    // com10 => \\.\COM10
    // com12 => \\.\COM12
    // or if
    // mapstr="com1=/dev/ttyS0:usb1=/dev/ttyS100"
    // then
    // com1 => /dev/ttyS0
    // com3 => /dev/ttyS2
    // usb1 => /dev/ttyS100
    // usb3 => /dev/ttyS102

    String maps[] = mapstr.split(":");
    Pattern pkv = Pattern.compile("(.*?)=(.*?)");
    Pattern pnum = Pattern.compile("(.*\\D)(\\d+)");

    Matcher mport = pnum.matcher(portname);
    int match_distance = -1;
    String str_port_to = null;

    for (int i = 0; i < maps.length; i++) {
      Matcher mkv = pkv.matcher(maps[i]);
      if (mkv.matches()) {
        Matcher mfrom = pnum.matcher(mkv.group(1));
        Matcher mto = pnum.matcher(mkv.group(2));
        if (mfrom.matches() && mto.matches() && mport.matches()
            && mfrom.group(1).equalsIgnoreCase(mport.group(1))) {
          int nfrom = Integer.parseInt(mfrom.group(2));
          int nto = Integer.parseInt(mto.group(2));
          int nport_from = Integer.parseInt(mport.group(2));
          int nport_to = nport_from - nfrom + nto;
          int ndist = nport_from - nfrom;

          if ((ndist >= 0)
              && ((ndist < match_distance) || (match_distance == -1))) {
            match_distance = ndist;
            str_port_to = mto.group(1) + nport_to;
          }
        } else if (mkv.group(1).equalsIgnoreCase(portname)) {
          match_distance = 0;
          str_port_to = mkv.group(2);
        }
      }
    }

    return (str_port_to == null) ? portname : str_port_to;
  }

  /**
   * Real Constructor of TOSSerial
   * 
   * @param portname
   */
  public TOSSerial(String portname) {
    super(map_portname(NativeSerial.getTOSCommMap(), portname));
    m_in = new SerialInputStream();
    m_out = new SerialOutputStream();
    m_dispatch = new EventDispatcher();
    m_dispatch.start();
  }

  /**
   * Open the serial port connection
   */
  public boolean open() {
    if (m_dispatch != null) {
      m_dispatch.open();
    }
    return super.open();
  }

  /**
   * Close the serial port connection
   */
  public void close() {
    if (m_dispatch != null) {
      m_dispatch.close();
    }
    super.close();
  }

  public void addListener(SerialPortListener l) {
    synchronized (m_listeners) {
      if (!m_listeners.contains(l))
        m_listeners.add(l);
    }
  }

  public void removeListener(SerialPortListener l) {
    synchronized (m_listeners) {
      m_listeners.remove(l);
    }
  }

  public InputStream getInputStream() {
    return m_in;
  }

  public OutputStream getOutputStream() {
    return m_out;
  }

  /**
   * Finalize the serial port connection, do not expect to open it again
   */
  public void finalize() {
    // Be careful what you call here. The object may never have been
    // created, so the underlying C++ object may not exist, and there's
    // insufficient guarding to avoid a core dump. If you call other
    // methods than super.close() or super.finalize(), be sure to
    // add an if (swigCptr != 0) guard in NativeSerial.java.
    if (m_dispatch != null) {
      m_dispatch.close();
    }

    /*
     * try { if (m_dispatch != null) { m_dispatch.join(); } } catch
     * (InterruptedException e) { }
     */

    super.close();

    try {
      if (m_in != null) {
        m_in.close();
      }

      if (m_out != null) {
        m_out.close();
      }
    } catch (IOException e) {
    }

    m_dispatch = null;
    m_in = null;
    m_out = null;
    super.finalize();
  }
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色婷婷久久久亚洲一区二区三区 | 波多野洁衣一区| 亚洲乱码日产精品bd| 欧美精品一区二| 4438亚洲最大| 欧美裸体bbwbbwbbw| 91丨国产丨九色丨pron| 一区二区三区四区亚洲| 国产精品久久影院| 国产亚洲精品福利| 国产欧美va欧美不卡在线| 日韩欧美高清一区| 亚洲欧洲综合另类在线| 亚洲私人影院在线观看| 亚洲愉拍自拍另类高清精品| 日韩精品国产欧美| 国产一区二区免费看| 盗摄精品av一区二区三区| 一本大道av一区二区在线播放| 色网站国产精品| 日韩一区和二区| 欧美国产日本视频| 亚洲成人免费电影| 国产一区二区主播在线| 成人高清免费在线播放| 欧美无人高清视频在线观看| 欧美一级国产精品| 日韩精品一区第一页| 久草这里只有精品视频| av中文字幕一区| 欧美一区二区三区色| 国产精品入口麻豆原神| 偷拍一区二区三区| 大胆欧美人体老妇| 69久久夜色精品国产69蝌蚪网| 国产人成亚洲第一网站在线播放| 亚洲午夜久久久久久久久久久| 精品亚洲国内自在自线福利| 91麻豆国产自产在线观看| 日韩网站在线看片你懂的| 亚洲欧美偷拍三级| 国产精品一二三| 5566中文字幕一区二区电影| 亚洲欧美日韩国产综合在线| 精品在线观看免费| 欧美日韩国产大片| 亚洲人成网站在线| 国产很黄免费观看久久| 欧美一区二区三区四区五区| 亚洲精品第1页| 成人免费观看av| 欧美成人欧美edvon| 首页国产欧美久久| 欧美性色欧美a在线播放| 中文字幕日本不卡| 国产福利一区二区三区在线视频| 这里是久久伊人| 亚洲国产婷婷综合在线精品| 成人动漫一区二区在线| 国产欧美一区二区精品性色超碰| 免费观看一级欧美片| 欧美丰满高潮xxxx喷水动漫 | 日本大香伊一区二区三区| 中文字幕免费不卡| 国产69精品一区二区亚洲孕妇| 欧美日韩免费一区二区三区| 亚洲最大成人综合| 91福利资源站| 亚洲国产精品久久久久婷婷884| 色综合久久天天| 亚洲色图一区二区三区| av一区二区三区| 亚洲日本电影在线| 色综合天天在线| 欧美国产亚洲另类动漫| 国产成人鲁色资源国产91色综| 久久免费视频色| 国产69精品久久777的优势| 久久久亚洲高清| 99久久婷婷国产| 亚洲精品美腿丝袜| 欧美视频中文字幕| 亚洲国产成人av好男人在线观看| 欧美伦理电影网| 久久成人久久鬼色| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 久久久.com| 播五月开心婷婷综合| 亚洲女人****多毛耸耸8| 日本乱人伦一区| 日韩黄色小视频| 欧美精品一区二| 成人av在线看| 亚洲一区二区三区四区五区中文 | 亚洲va欧美va天堂v国产综合| 欧美日本乱大交xxxxx| 捆绑变态av一区二区三区| wwww国产精品欧美| 91免费看片在线观看| 午夜一区二区三区在线观看| 日韩三区在线观看| 粉嫩嫩av羞羞动漫久久久| 亚洲日本欧美天堂| 精品国产乱码久久久久久久| 成人ar影院免费观看视频| 亚洲一区二区三区四区不卡| 精品国产免费一区二区三区香蕉| 不卡av免费在线观看| 蜜桃视频在线观看一区| 亚洲欧洲精品一区二区精品久久久 | 欧美三片在线视频观看| 国产一区三区三区| 婷婷激情综合网| 国产精品成人午夜| 欧美肥妇bbw| 91丨porny丨最新| 国产一区二区在线看| 亚洲国产日韩一级| 国产精品每日更新在线播放网址 | 91原创在线视频| 国产中文一区二区三区| 亚洲自拍另类综合| 国产欧美日韩另类一区| 日韩一区二区三区在线观看 | 久久精品噜噜噜成人88aⅴ| 亚洲乱码日产精品bd| 久久久久久久久久久电影| 精品污污网站免费看| av午夜精品一区二区三区| 国产伦精品一区二区三区免费| 日韩va欧美va亚洲va久久| 一区二区在线观看免费视频播放| 久久久久久99精品| 日韩精品专区在线影院观看| 欧美亚洲综合色| 91视频在线观看免费| eeuss鲁片一区二区三区在线观看| 男男成人高潮片免费网站| 偷窥少妇高潮呻吟av久久免费| 亚洲美女在线国产| 亚洲精品乱码久久久久久日本蜜臀| 国产亚洲精品7777| 久久综合久久鬼色| 国产日产精品一区| 久久精品欧美日韩精品| 久久久久久久av麻豆果冻| 久久先锋资源网| 2022国产精品视频| 久久久国产精品麻豆| 久久久久久久久蜜桃| 精品处破学生在线二十三| 欧美mv和日韩mv的网站| 精品国产欧美一区二区| 国产亚洲综合在线| 国产精品电影一区二区三区| 国产精品欧美一区二区三区| 国产精品电影一区二区| 综合电影一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在 | 国产自产高清不卡| 久久99久久精品| 免费成人在线观看| 国产一区二区女| 99re热视频这里只精品| 欧美综合天天夜夜久久| 欧美丝袜丝交足nylons图片| 欧美一区二区精品| 久久亚洲一区二区三区四区| 国产精品久久久久久久久免费桃花 | 国产精品天天摸av网| 亚洲视频在线一区| 五月激情丁香一区二区三区| 美女脱光内衣内裤视频久久网站| 精品一区二区三区在线播放| 国产精品羞羞答答xxdd| 色婷婷av一区二区三区软件 | av一区二区不卡| 欧美日韩国产高清一区二区三区 | 久久免费的精品国产v∧| 一区在线观看免费| 日韩av不卡一区二区| 国产精品一区二区三区99| 在线观看欧美日本| 欧美xxxxxxxx| 亚洲精品美腿丝袜| 国产一区二区精品久久| 欧洲国产伦久久久久久久| 日韩免费高清视频| 一区二区三区四区中文字幕| 国产一区视频导航| 欧美熟乱第一页| 欧美国产成人精品| 毛片av中文字幕一区二区| 99久久精品情趣| 精品精品欲导航| 洋洋成人永久网站入口| 国产99久久精品| 日韩欧美国产小视频| 一级特黄大欧美久久久| 成人手机电影网|