From b272931e53e428d9842b841681e848984040eb30 Mon Sep 17 00:00:00 2001 From: Niclas Finne Date: Mon, 21 May 2012 17:10:02 +0200 Subject: [PATCH] Added common base class for 802.15.4 radio chips --- se/sics/mspsim/chip/CC2420.java | 36 +++++-------- se/sics/mspsim/chip/CC2520.java | 51 +++++++++--------- se/sics/mspsim/chip/Radio802154.java | 80 ++++++++++++++++++++++++++++ 3 files changed, 120 insertions(+), 47 deletions(-) create mode 100644 se/sics/mspsim/chip/Radio802154.java diff --git a/se/sics/mspsim/chip/CC2420.java b/se/sics/mspsim/chip/CC2420.java index 414e6f2..89b29eb 100644 --- a/se/sics/mspsim/chip/CC2420.java +++ b/se/sics/mspsim/chip/CC2420.java @@ -37,13 +37,16 @@ */ package se.sics.mspsim.chip; - -import se.sics.mspsim.core.*; +import se.sics.mspsim.core.IOPort; +import se.sics.mspsim.core.MSP430Core; +import se.sics.mspsim.core.TimeEvent; +import se.sics.mspsim.core.USARTListener; +import se.sics.mspsim.core.USARTSource; import se.sics.mspsim.util.ArrayFIFO; import se.sics.mspsim.util.CCITT_CRC; import se.sics.mspsim.util.Utils; -public class CC2420 extends Chip implements USARTListener, RFListener, RFSource { +public class CC2420 extends Radio802154 implements USARTListener { public enum Reg { SNOP, SXOSCON, STXCAL, SRXON, /* 0x00 */ @@ -310,8 +313,6 @@ public class CC2420 extends Chip implements USARTListener, RFListener, RFSource private int txCursor; private boolean on; - private RFListener rfListener; - private ChannelListener channelListener; private TimeEvent oscillatorEvent = new TimeEvent(0, "CC2420 OSC") { public void execute(long t) { @@ -1257,6 +1258,11 @@ public class CC2420 extends Chip implements USARTListener, RFListener, RFSource * External APIs for simulators simulating Radio medium, etc. * *****************************************************************************/ + @Override + public boolean isReadyToReceive() { + return getState() == RadioState.RX_SFD_SEARCH; + } + public void updateActiveFrequency() { /* INVERTED: f = 5 * (c - 11) + 357 + 0x4000 */ activeFrequency = registers[REG_FSCTRL] - 357 + 2405 - 0x4000; @@ -1264,10 +1270,12 @@ public class CC2420 extends Chip implements USARTListener, RFListener, RFSource } public int getActiveFrequency() { + updateActiveFrequency(); return activeFrequency; } public int getActiveChannel() { + updateActiveFrequency(); return activeChannel; } @@ -1336,24 +1344,6 @@ public class CC2420 extends Chip implements USARTListener, RFListener, RFSource return -100; } - @Override - public synchronized void addRFListener(RFListener rf) { - rfListener = RFListener.Proxy.INSTANCE.add(rfListener, rf); - } - - @Override - public synchronized void removeRFListener(RFListener rf) { - rfListener = RFListener.Proxy.INSTANCE.remove(rfListener, rf); - } - - public synchronized void addChannelListener(ChannelListener listener) { - channelListener = ChannelListener.Proxy.INSTANCE.add(channelListener, listener); - } - - public synchronized void removeChannelListener(ChannelListener listener) { - channelListener = ChannelListener.Proxy.INSTANCE.remove(channelListener, listener); - } - public void notifyReset() { super.notifyReset(); setChipSelect(false); diff --git a/se/sics/mspsim/chip/CC2520.java b/se/sics/mspsim/chip/CC2520.java index 664c834..ffef43f 100644 --- a/se/sics/mspsim/chip/CC2520.java +++ b/se/sics/mspsim/chip/CC2520.java @@ -40,7 +40,7 @@ import se.sics.mspsim.util.ArrayFIFO; import se.sics.mspsim.util.CCITT_CRC; import se.sics.mspsim.util.Utils; -public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, SPIData { +public class CC2520 extends Radio802154 implements USARTListener, SPIData { public static final int FIFO_POLARITY = (1<<10); public static final int FIFOP_POLARITY = (1<<9); public static final int SFD_POLARITY = (1<<8); @@ -405,8 +405,6 @@ public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, private int txCursor; private boolean isRadioOn; - private RFListener rfListener; - private ChannelListener channelListener; private TimeEvent oscillatorEvent = new TimeEvent(0, "CC2520 OSC") { public void execute(long t) { @@ -1232,21 +1230,32 @@ public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, * External APIs for simulators simulating Radio medium, etc. * *****************************************************************************/ - public void updateActiveFrequency() { + + @Override + public boolean isReadyToReceive() { + return getState() == RadioState.RX_SFD_SEARCH; + } + + private void updateActiveFrequency() { /* INVERTED: f = 5 * (c - 11) + 357 + 0x4000 */ int freg = memory[REG_FREQCTRL] & 0x7f; activeFrequency = freg + 2394; activeChannel = 11 + (freg - 11) / 5; } + @Override public int getActiveFrequency() { + updateActiveFrequency(); return activeFrequency; } + @Override public int getActiveChannel() { + updateActiveFrequency(); return activeChannel; } + @Override public int getOutputPowerIndicator() { return (memory[REG_TXPOWER] & 0x1f); } @@ -1256,12 +1265,22 @@ public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, * @param lqi The Corr-val * @sa CC2520 Datasheet */ + @Override public void setLQI(int lqi){ - if(lqi < 0) lqi = 0; - else if(lqi > 0x7f ) lqi = 0x7f; + if(lqi < 0) { + lqi = 0; + } else if(lqi > 0x7f ) { + lqi = 0x7f; + } corrval = lqi; } + @Override + public int getLQI() { + return corrval; + } + + @Override public void setRSSI(int power) { final int minp = -128 + RSSI_OFFSET; final int maxp = 128 + RSSI_OFFSET; @@ -1279,10 +1298,12 @@ public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, updateCCA(); } + @Override public int getRSSI() { return rssi; } + @Override public int getOutputPower() { /* From CC2520 datasheet, table 17 */ int indicator = getOutputPowerIndicator(); @@ -1331,24 +1352,6 @@ public class CC2520 extends Chip implements USARTListener, RFListener, RFSource, return -100; } - @Override - public synchronized void addRFListener(RFListener rf) { - rfListener = RFListener.Proxy.INSTANCE.add(rfListener, rf); - } - - @Override - public synchronized void removeRFListener(RFListener rf) { - rfListener = RFListener.Proxy.INSTANCE.remove(rfListener, rf); - } - - public synchronized void addChannelListener(ChannelListener listener) { - channelListener = ChannelListener.Proxy.INSTANCE.add(channelListener, listener); - } - - public synchronized void removeChannelListener(ChannelListener listener) { - channelListener = ChannelListener.Proxy.INSTANCE.remove(channelListener, listener); - } - @Override public void notifyReset() { super.notifyReset(); diff --git a/se/sics/mspsim/chip/Radio802154.java b/se/sics/mspsim/chip/Radio802154.java new file mode 100644 index 0000000..9930861 --- /dev/null +++ b/se/sics/mspsim/chip/Radio802154.java @@ -0,0 +1,80 @@ +/** + * Copyright (c) 2012, Swedish Institute of Computer Science. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the Institute nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * This file is part of MSPSim. + */ +package se.sics.mspsim.chip; +import se.sics.mspsim.core.Chip; +import se.sics.mspsim.core.MSP430Core; + +/** + * @author Niclas Finne + */ +public abstract class Radio802154 extends Chip implements RFListener, RFSource { + + protected RFListener rfListener; + protected ChannelListener channelListener; + + public Radio802154(String id, String name, MSP430Core cpu) { + super(id, name, cpu); + } + + public abstract boolean isReadyToReceive(); + + @Override + public abstract void receivedByte(byte c); + + public abstract int getActiveChannel(); + public abstract int getActiveFrequency(); + public abstract int getOutputPower(); + public abstract int getOutputPowerIndicator(); + + public abstract int getRSSI(); + public abstract void setRSSI(int rssi); + + public abstract int getLQI(); + public abstract void setLQI(int lqi); + + @Override + public synchronized void addRFListener(RFListener rf) { + rfListener = RFListener.Proxy.INSTANCE.add(rfListener, rf); + } + + @Override + public synchronized void removeRFListener(RFListener rf) { + rfListener = RFListener.Proxy.INSTANCE.remove(rfListener, rf); + } + + public synchronized void addChannelListener(ChannelListener listener) { + channelListener = ChannelListener.Proxy.INSTANCE.add(channelListener, listener); + } + + public synchronized void removeChannelListener(ChannelListener listener) { + channelListener = ChannelListener.Proxy.INSTANCE.remove(channelListener, listener); + } + +}