📄 calamariplugin.java
字号:
// $Id: CalamariPlugin.java,v 1.2.4.1 2003/08/18 22:09:44 cssharp Exp $/* This plugin sets the rssi value of each mote based on their * locations in the mote window. Motes can read their rssi values from the * ADC, using ADC Channel PORT_RSSI (Defined below). */package net.tinyos.sim.plugins;import java.lang.*;import java.util.*;import java.awt.*;import java.awt.event.*;import javax.swing.*;import net.tinyos.message.*;import net.tinyos.sim.*;import net.tinyos.sim.event.*;import net.tinyos.matlab.*;public class CalamariPlugin extends Plugin implements SimConst { public static final byte X_POS_ADC_CHANNEL = (byte) 112; public static final byte Y_POS_ADC_CHANNEL = (byte)113; public static final byte X_STDV_ADC_CHANNEL = (byte)114; public static final byte Y_STDV_ADC_CHANNEL = (byte)115; public static final byte TXR_COEFF_O_ADC_CHANNEL = (byte)116; public static final byte TXR_COEFF_1_ADC_CHANNEL = (byte)117; public static final byte RXR_COEFF_O_ADC_CHANNEL = (byte)118; public static final byte RXR_COEFF_1_ADC_CHANNEL = (byte)119; public static final byte PORT_RSSI = (byte) 131; public static final byte PORT_RSSI_STDV = (byte) 132; /* Mapping from coordinate axis to location ADC value */ private Hashtable locationEstimates = new Hashtable(); private JTextField xscalingFactorTextField; private JTextField yscalingFactorTextField; private JTextField maxRangeTextField; private JTextField maxErrorTextField; public double NOISE_LEVEL= 30;//30 cm error in ranging public double MAX_RANGE= 300;//3 meters ranging distance public double X_SCALE = 2000;//20 meters public double Y_SCALE = 2000;//20 meters public void handleEvent(SimEvent event) { if (event instanceof AttributeEvent) { AttributeEvent ae = (AttributeEvent) event; if (ae.getType() == AttributeEvent.ATTRIBUTE_CHANGED) { if (ae.getOwner() instanceof MoteSimObject && ae.getAttribute() instanceof MoteCoordinateAttribute) { tv.getMotePanel().refresh(); } } } else if (event instanceof TossimInitEvent) { locationEstimates.clear(); } else if (event instanceof DebugMsgEvent) { DebugMsgEvent dme = (DebugMsgEvent) event; if (dme.getMessage().indexOf("LOCALIZATION:") != -1) { int nodeID = dme.getMoteID(); MoteSimObject mote = state.getMoteSimObject(nodeID); if (mote == null) return; LocationEstimate loc; // System.out.println("got a localization msg"); if (locationEstimates.containsKey(new Integer(nodeID))) loc = (LocationEstimate) locationEstimates.get(new Integer(nodeID)); else { loc = new LocationEstimate(); loc.nodeID = nodeID; } //dbg("Localization: is anchor") if (dme.getMessage().indexOf("is anchor") != -1) { loc.isAnchor = true; locationEstimates.put(new Integer(nodeID), loc); // tv.setStatus("Observed " + mote.getID() + " is anchor"); return; } //dbg("Localization: is not anchor") if (dme.getMessage().indexOf("is not anchor") != -1) { loc.isAnchor = false; locationEstimates.put(new Integer(nodeID), loc); // tv.setStatus("Observed " + mote.getID() + " is not anchor"); return; } //dbg("Localization: x= X xStdv= XStdv y= Y y= YStdv") try { StringTokenizer st = new StringTokenizer(dme.getMessage()); st.nextToken(); st.nextToken(); loc.x = (int)(Integer.parseInt(st.nextToken())/X_SCALE *cT.getMoteScaleWidth()); st.nextToken(); loc.xStdv = (int)(Integer.parseInt(st.nextToken())/X_SCALE *cT.getMoteScaleWidth()); st.nextToken(); loc.y = (int)(Integer.parseInt(st.nextToken())/Y_SCALE *cT.getMoteScaleHeight()); st.nextToken(); loc.yStdv = (int)(Integer.parseInt(st.nextToken())/Y_SCALE *cT.getMoteScaleHeight()); locationEstimates.put(new Integer(nodeID), loc); tv.getMotePanel().refresh(); // tv.setStatus("Observed location estimate of mote " + mote.getID() + " to (" + loc.x + "," + loc.y + ")"); } catch (Exception e) { tv.setStatus("Error parsing location estimate of mote " + mote.getID()); } } else if (dme.getMessage().indexOf("ADC ATTR:") != -1) { int nodeID = dme.getMoteID(); int channel; try { StringTokenizer st = new StringTokenizer(dme.getMessage()); st.nextToken();st.nextToken();st.nextToken();st.nextToken();st.nextToken(); //"ADC ATTR: reading from channel XX" channel = Integer.parseInt(st.nextToken()); } catch (Exception e) { tv.setStatus("Attr: parse error: "+e.toString()); return; } MoteSimObject mote = state.getMoteSimObject(nodeID); if (mote == null) {tv.setStatus(" No such mote");return;} Integer value = null; switch ((byte)channel) { case X_POS_ADC_CHANNEL: { MoteCoordinateAttribute coord = mote.getCoordinate(); int x = (int)(((coord.getX() * X_SCALE) / cT.getMoteScaleWidth())); value = new Integer(x); break; } case Y_POS_ADC_CHANNEL: { MoteCoordinateAttribute coord = mote.getCoordinate(); int y = (int)(((coord.getY() * Y_SCALE) / cT.getMoteScaleHeight())); value = new Integer(y); break; } case X_STDV_ADC_CHANNEL: { value = new Integer(0); break; } case Y_STDV_ADC_CHANNEL: { value = new Integer(0); break; } case TXR_COEFF_O_ADC_CHANNEL: { value = new Integer(0); break; } case TXR_COEFF_1_ADC_CHANNEL: { value = new Integer(0); break; } case RXR_COEFF_O_ADC_CHANNEL: { value = new Integer(0); break; } case RXR_COEFF_1_ADC_CHANNEL: { value = new Integer(1); break; } default: { tv.setStatus("Unknown ADC port read from:" + Integer.toString(channel));/* try { MatlabControl matlab = new MatlabControl(true); Object args[] = new Object[2]; args[0] = new Integer(nodeID); args[1] = new Integer(channel); value = (Integer) matlab.blockingFeval("getADCValue", args);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -