Merge pull request #672 from claesjac/cooja-eeprom
Added support for EEPROM device in Cooja
This commit is contained in:
commit
4ca6c01fa9
|
@ -51,7 +51,8 @@ COOJA_BASE = simEnvChange.c cooja_mt.c cooja_mtarch.c rtimer-arch.c slip.c watch
|
||||||
|
|
||||||
COOJA_INTFS = beep.c button-sensor.c ip.c leds-arch.c moteid.c \
|
COOJA_INTFS = beep.c button-sensor.c ip.c leds-arch.c moteid.c \
|
||||||
pir-sensor.c rs232.c vib-sensor.c \
|
pir-sensor.c rs232.c vib-sensor.c \
|
||||||
clock.c log.c cfs-cooja.c cooja-radio.c
|
clock.c log.c cfs-cooja.c cooja-radio.c \
|
||||||
|
eeprom.c
|
||||||
|
|
||||||
COOJA_CORE = random.c sensors.c leds.c symbols.c
|
COOJA_CORE = random.c sensors.c leds.c symbols.c
|
||||||
|
|
||||||
|
|
|
@ -114,7 +114,8 @@ SIM_INTERFACE_NAME(pir_interface);
|
||||||
SIM_INTERFACE_NAME(clock_interface);
|
SIM_INTERFACE_NAME(clock_interface);
|
||||||
SIM_INTERFACE_NAME(leds_interface);
|
SIM_INTERFACE_NAME(leds_interface);
|
||||||
SIM_INTERFACE_NAME(cfs_interface);
|
SIM_INTERFACE_NAME(cfs_interface);
|
||||||
SIM_INTERFACES(&vib_interface, &moteid_interface, &rs232_interface, &simlog_interface, &beep_interface, &radio_interface, &button_interface, &pir_interface, &clock_interface, &leds_interface, &cfs_interface);
|
SIM_INTERFACE_NAME(eeprom_interface);
|
||||||
|
SIM_INTERFACES(&vib_interface, &moteid_interface, &rs232_interface, &simlog_interface, &beep_interface, &radio_interface, &button_interface, &pir_interface, &clock_interface, &leds_interface, &cfs_interface, &eeprom_interface);
|
||||||
/* Example: manually add mote interfaces */
|
/* Example: manually add mote interfaces */
|
||||||
//SIM_INTERFACE_NAME(dummy_interface);
|
//SIM_INTERFACE_NAME(dummy_interface);
|
||||||
//SIM_INTERFACES(..., &dummy_interface);
|
//SIM_INTERFACES(..., &dummy_interface);
|
||||||
|
@ -320,6 +321,9 @@ contiki_init()
|
||||||
}
|
}
|
||||||
#endif /* WITH_UIP6 */
|
#endif /* WITH_UIP6 */
|
||||||
|
|
||||||
|
/* Initialize eeprom */
|
||||||
|
eeprom_init();
|
||||||
|
|
||||||
/* Start serial process */
|
/* Start serial process */
|
||||||
serial_line_init();
|
serial_line_init();
|
||||||
|
|
||||||
|
|
99
platform/cooja/dev/eeprom.c
Normal file
99
platform/cooja/dev/eeprom.c
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "dev/eeprom.h"
|
||||||
|
|
||||||
|
#include "lib/simEnvChange.h"
|
||||||
|
|
||||||
|
const struct simInterface eeprom_interface;
|
||||||
|
|
||||||
|
#define EEPROM_BUF_SIZE 1024 /* Configure EEPROM size here and in ContikiEeprom.java */
|
||||||
|
|
||||||
|
unsigned char simEEPROMData[EEPROM_BUF_SIZE];
|
||||||
|
char simEEPROMChanged = 0;
|
||||||
|
int simEEPROMRead = 0;
|
||||||
|
int simEEPROMWritten = 0;
|
||||||
|
|
||||||
|
void
|
||||||
|
eeprom_init(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eeprom_read(eeprom_addr_t addr, unsigned char *buf, int len)
|
||||||
|
{
|
||||||
|
if (addr >= EEPROM_BUF_SIZE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(addr + len >= EEPROM_BUF_SIZE) {
|
||||||
|
len = EEPROM_BUF_SIZE - addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(buf, &simEEPROMData[addr], len);
|
||||||
|
|
||||||
|
simEEPROMChanged = 1;
|
||||||
|
simEEPROMRead += len;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
eeprom_write(eeprom_addr_t addr, unsigned char *buf, int len)
|
||||||
|
{
|
||||||
|
if (addr >= EEPROM_BUF_SIZE) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(addr + len >= EEPROM_BUF_SIZE) {
|
||||||
|
len = EEPROM_BUF_SIZE - addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
memcpy(&simEEPROMData[addr], buf, len);
|
||||||
|
|
||||||
|
simEEPROMChanged = 1;
|
||||||
|
simEEPROMWritten += len;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
doInterfaceActionsBeforeTick(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
static void
|
||||||
|
doInterfaceActionsAfterTick(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
SIM_INTERFACE(eeprom_interface,
|
||||||
|
doInterfaceActionsBeforeTick,
|
||||||
|
doInterfaceActionsAfterTick);
|
|
@ -1,6 +1,6 @@
|
||||||
org.contikios.cooja.contikimote.interfaces.ContikiRadio.RADIO_TRANSMISSION_RATE_kbps = 250
|
org.contikios.cooja.contikimote.interfaces.ContikiRadio.RADIO_TRANSMISSION_RATE_kbps = 250
|
||||||
|
|
||||||
org.contikios.cooja.contikimote.ContikiMoteType.MOTE_INTERFACES = org.contikios.cooja.interfaces.Position org.contikios.cooja.interfaces.Battery org.contikios.cooja.contikimote.interfaces.ContikiVib org.contikios.cooja.contikimote.interfaces.ContikiMoteID org.contikios.cooja.contikimote.interfaces.ContikiRS232 org.contikios.cooja.contikimote.interfaces.ContikiBeeper org.contikios.cooja.interfaces.RimeAddress org.contikios.cooja.contikimote.interfaces.ContikiIPAddress org.contikios.cooja.contikimote.interfaces.ContikiRadio org.contikios.cooja.contikimote.interfaces.ContikiButton org.contikios.cooja.contikimote.interfaces.ContikiPIR org.contikios.cooja.contikimote.interfaces.ContikiClock org.contikios.cooja.contikimote.interfaces.ContikiLED org.contikios.cooja.contikimote.interfaces.ContikiCFS org.contikios.cooja.interfaces.Mote2MoteRelations org.contikios.cooja.interfaces.MoteAttributes
|
org.contikios.cooja.contikimote.ContikiMoteType.MOTE_INTERFACES = org.contikios.cooja.interfaces.Position org.contikios.cooja.interfaces.Battery org.contikios.cooja.contikimote.interfaces.ContikiVib org.contikios.cooja.contikimote.interfaces.ContikiMoteID org.contikios.cooja.contikimote.interfaces.ContikiRS232 org.contikios.cooja.contikimote.interfaces.ContikiBeeper org.contikios.cooja.interfaces.RimeAddress org.contikios.cooja.contikimote.interfaces.ContikiIPAddress org.contikios.cooja.contikimote.interfaces.ContikiRadio org.contikios.cooja.contikimote.interfaces.ContikiButton org.contikios.cooja.contikimote.interfaces.ContikiPIR org.contikios.cooja.contikimote.interfaces.ContikiClock org.contikios.cooja.contikimote.interfaces.ContikiLED org.contikios.cooja.contikimote.interfaces.ContikiCFS org.contikios.cooja.contikimote.interfaces.ContikiEEPROM org.contikios.cooja.interfaces.Mote2MoteRelations org.contikios.cooja.interfaces.MoteAttributes
|
||||||
org.contikios.cooja.contikimote.ContikiMoteType.C_SOURCES =
|
org.contikios.cooja.contikimote.ContikiMoteType.C_SOURCES =
|
||||||
org.contikios.cooja.Cooja.MOTETYPES = org.contikios.cooja.motes.ImportAppMoteType org.contikios.cooja.motes.DisturberMoteType org.contikios.cooja.contikimote.ContikiMoteType
|
org.contikios.cooja.Cooja.MOTETYPES = org.contikios.cooja.motes.ImportAppMoteType org.contikios.cooja.motes.DisturberMoteType org.contikios.cooja.contikimote.ContikiMoteType
|
||||||
org.contikios.cooja.Cooja.PLUGINS = org.contikios.cooja.plugins.Visualizer org.contikios.cooja.plugins.LogListener org.contikios.cooja.plugins.TimeLine org.contikios.cooja.plugins.MoteInformation org.contikios.cooja.plugins.MoteInterfaceViewer org.contikios.cooja.plugins.VariableWatcher org.contikios.cooja.plugins.EventListener org.contikios.cooja.plugins.RadioLogger org.contikios.cooja.plugins.ScriptRunner org.contikios.cooja.plugins.Notes org.contikios.cooja.plugins.BufferListener org.contikios.cooja.plugins.DGRMConfigurator org.contikios.cooja.plugins.BaseRSSIconf
|
org.contikios.cooja.Cooja.PLUGINS = org.contikios.cooja.plugins.Visualizer org.contikios.cooja.plugins.LogListener org.contikios.cooja.plugins.TimeLine org.contikios.cooja.plugins.MoteInformation org.contikios.cooja.plugins.MoteInterfaceViewer org.contikios.cooja.plugins.VariableWatcher org.contikios.cooja.plugins.EventListener org.contikios.cooja.plugins.RadioLogger org.contikios.cooja.plugins.ScriptRunner org.contikios.cooja.plugins.Notes org.contikios.cooja.plugins.BufferListener org.contikios.cooja.plugins.DGRMConfigurator org.contikios.cooja.plugins.BaseRSSIconf
|
||||||
|
|
|
@ -0,0 +1,340 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2014, 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.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
package org.contikios.cooja.contikimote.interfaces;
|
||||||
|
|
||||||
|
import java.awt.Component;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Font;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.io.*;
|
||||||
|
import java.util.*;
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.xml.bind.DatatypeConverter;
|
||||||
|
import org.apache.log4j.Logger;
|
||||||
|
import org.jdom.Element;
|
||||||
|
|
||||||
|
import org.contikios.cooja.*;
|
||||||
|
import org.contikios.cooja.contikimote.ContikiMoteInterface;
|
||||||
|
import org.contikios.cooja.interfaces.PolledAfterActiveTicks;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contiki EEPROM interface
|
||||||
|
*
|
||||||
|
* Contiki variables:
|
||||||
|
* <ul>
|
||||||
|
* <li>char[] simEEPROMData
|
||||||
|
* <li>char simEEPROMChanged (1=EEPROM has been altered)
|
||||||
|
* <li>int simEEPROMRead (bytes read from EEPROM)
|
||||||
|
* <li>int simEEPROMWritten (bytes written to EEPROM)
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
*
|
||||||
|
* Core interface:
|
||||||
|
* <ul>
|
||||||
|
* <li>eeprom_interface
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* This observable notifies when the eeprom is used (read/write).
|
||||||
|
*
|
||||||
|
* @author Claes Jakobsson (based on ContikiCFS by Fredrik Osterlind)
|
||||||
|
*/
|
||||||
|
@ClassDescription("EEPROM")
|
||||||
|
public class ContikiEEPROM extends MoteInterface implements ContikiMoteInterface, PolledAfterActiveTicks {
|
||||||
|
private static Logger logger = Logger.getLogger(ContikiEEPROM.class);
|
||||||
|
|
||||||
|
public int EEPROM_SIZE = 1024; /* Configure EEPROM size here and in eeprom.c. Should really be multiple of 16 */
|
||||||
|
private Mote mote = null;
|
||||||
|
private SectionMoteMemory moteMem = null;
|
||||||
|
|
||||||
|
private int lastRead = 0;
|
||||||
|
private int lastWritten = 0;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates an interface to the EEPROM at mote.
|
||||||
|
*
|
||||||
|
* @param mote Mote
|
||||||
|
* @see Mote
|
||||||
|
* @see org.contikios.cooja.MoteInterfaceHandler
|
||||||
|
*/
|
||||||
|
public ContikiEEPROM(Mote mote) {
|
||||||
|
this.mote = mote;
|
||||||
|
this.moteMem = (SectionMoteMemory) mote.getMemory();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static String[] getCoreInterfaceDependencies() {
|
||||||
|
return new String[]{"eeprom_interface"};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void doActionsAfterTick() {
|
||||||
|
if (moteMem.getByteValueOf("simEEPROMChanged") == 1) {
|
||||||
|
lastRead = moteMem.getIntValueOf("simEEPROMRead");
|
||||||
|
lastWritten = moteMem.getIntValueOf("simEEPROMWritten");
|
||||||
|
|
||||||
|
moteMem.setIntValueOf("simEEPROMRead", 0);
|
||||||
|
moteMem.setIntValueOf("simEEPROMWritten", 0);
|
||||||
|
moteMem.setByteValueOf("simEEPROMChanged", (byte) 0);
|
||||||
|
|
||||||
|
this.setChanged();
|
||||||
|
this.notifyObservers(mote);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set EEPROM data.
|
||||||
|
*
|
||||||
|
* @param data Data
|
||||||
|
* @return True if operation successful
|
||||||
|
*/
|
||||||
|
public boolean setEEPROMData(byte[] data) {
|
||||||
|
if (data.length > EEPROM_SIZE) {
|
||||||
|
logger.fatal("Error. EEPROM data too large, skipping");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
moteMem.setByteArray("simEEPROMData", data);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get EEPROM data.
|
||||||
|
*
|
||||||
|
* @return Filesystem data
|
||||||
|
*/
|
||||||
|
public byte[] getEEPROMData() {
|
||||||
|
return moteMem.getByteArray("simEEPROMData", EEPROM_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Read bytes count last change.
|
||||||
|
*/
|
||||||
|
public int getLastReadCount() {
|
||||||
|
return lastRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return Written bytes count last change.
|
||||||
|
*/
|
||||||
|
public int getLastWrittenCount() {
|
||||||
|
return lastWritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
String byteArrayToPrintableCharacters(byte[] data, int offset, int length) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
for (int i = offset; i < offset + length; i++) {
|
||||||
|
sb.append(data[i] > 31 && data[i] < 128 ? (char) data[i] : '.');
|
||||||
|
}
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
String byteArrayToHexList(byte[] data, int offset, int length) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < length; i++) {
|
||||||
|
byte h = (byte) ((int) data[offset + i] >> 4);
|
||||||
|
byte l = (byte) ((int) data[offset + i] & 0xf);
|
||||||
|
sb.append((char)(h < 10 ? 0x30 + h : 0x61 + h - 10));
|
||||||
|
sb.append((char)(l < 10 ? 0x30 + l : 0x61 + l - 10));
|
||||||
|
sb.append(' ');
|
||||||
|
if (i % 8 == 7 && i != length - 1) {
|
||||||
|
sb.append(' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
void redrawDataView(JTextArea textArea) {
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
Formatter fmt = new Formatter(sb);
|
||||||
|
byte[] data = getEEPROMData();
|
||||||
|
|
||||||
|
for (int i = 0; i < EEPROM_SIZE; i+= 16) {
|
||||||
|
fmt.format("%04d %s | %s |\n", i, byteArrayToHexList(data, i, 16), byteArrayToPrintableCharacters(data, i, 16));
|
||||||
|
}
|
||||||
|
|
||||||
|
textArea.setText(sb.toString());
|
||||||
|
textArea.setCaretPosition(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public JPanel getInterfaceVisualizer() {
|
||||||
|
JPanel panel = new JPanel();
|
||||||
|
panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
|
||||||
|
|
||||||
|
final JLabel lastTimeLabel = new JLabel("Last change at: ?");
|
||||||
|
final JLabel lastReadLabel = new JLabel("Last change read bytes: 0");
|
||||||
|
final JLabel lastWrittenLabel = new JLabel("Last change wrote bytes: 0");
|
||||||
|
final JButton uploadButton = new JButton("Upload binary file");
|
||||||
|
final JButton clearButton = new JButton("Reset EEPROM to zero");
|
||||||
|
final JTextArea dataViewArea = new JTextArea();
|
||||||
|
final JScrollPane dataViewScrollPane = new JScrollPane(dataViewArea);
|
||||||
|
|
||||||
|
panel.add(lastTimeLabel);
|
||||||
|
panel.add(lastReadLabel);
|
||||||
|
panel.add(lastWrittenLabel);
|
||||||
|
panel.add(uploadButton);
|
||||||
|
panel.add(clearButton);
|
||||||
|
|
||||||
|
panel.add(dataViewScrollPane);
|
||||||
|
|
||||||
|
uploadButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
byte[] eepromData = readDialogEEPROMBytes(null);
|
||||||
|
|
||||||
|
// Write file data to EEPROM
|
||||||
|
if (eepromData != null) {
|
||||||
|
if (setEEPROMData(eepromData)) {
|
||||||
|
logger.info("Done! (" + eepromData.length + " bytes written to EEPROM)");
|
||||||
|
}
|
||||||
|
|
||||||
|
redrawDataView(dataViewArea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
clearButton.addActionListener(new ActionListener() {
|
||||||
|
public void actionPerformed(ActionEvent e) {
|
||||||
|
byte[] eepromData = new byte[EEPROM_SIZE];
|
||||||
|
|
||||||
|
if (setEEPROMData(eepromData)) {
|
||||||
|
logger.info("Done! (EEPROM reset to zero)");
|
||||||
|
}
|
||||||
|
|
||||||
|
redrawDataView(dataViewArea);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
Observer observer;
|
||||||
|
this.addObserver(observer = new Observer() {
|
||||||
|
public void update(Observable obs, Object obj) {
|
||||||
|
long currentTime = mote.getSimulation().getSimulationTime();
|
||||||
|
lastTimeLabel.setText("Last change at time: " + currentTime);
|
||||||
|
lastReadLabel.setText("Last change read bytes: " + getLastReadCount());
|
||||||
|
lastWrittenLabel.setText("Last change wrote bytes: " + getLastWrittenCount());
|
||||||
|
|
||||||
|
redrawDataView(dataViewArea);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Saving observer reference for releaseInterfaceVisualizer
|
||||||
|
panel.putClientProperty("intf_obs", observer);
|
||||||
|
|
||||||
|
panel.setMinimumSize(new Dimension(140, 60));
|
||||||
|
panel.setPreferredSize(new Dimension(140, 60));
|
||||||
|
|
||||||
|
dataViewArea.setLineWrap(false);
|
||||||
|
dataViewArea.setEditable(false);
|
||||||
|
dataViewArea.setFont(new Font(Font.MONOSPACED, Font.PLAIN, 12));
|
||||||
|
dataViewScrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
|
||||||
|
dataViewScrollPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
|
||||||
|
|
||||||
|
redrawDataView(dataViewArea);
|
||||||
|
|
||||||
|
return panel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void releaseInterfaceVisualizer(JPanel panel) {
|
||||||
|
Observer observer = (Observer) panel.getClientProperty("intf_obs");
|
||||||
|
if (observer == null) {
|
||||||
|
logger.fatal("Error when releasing panel, observer is null");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.deleteObserver(observer);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Collection<Element> getConfigXML() {
|
||||||
|
Vector<Element> config = new Vector<Element>();
|
||||||
|
Element element;
|
||||||
|
|
||||||
|
// Infinite boolean
|
||||||
|
element = new Element("eeprom");
|
||||||
|
element.setText(DatatypeConverter.printBase64Binary(getEEPROMData()));
|
||||||
|
config.add(element);
|
||||||
|
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setConfigXML(Collection<Element> configXML, boolean visAvailable) {
|
||||||
|
for (Element element : configXML) {
|
||||||
|
if (element.getName().equals("eeprom")) {
|
||||||
|
setEEPROMData(DatatypeConverter.parseBase64Binary(element.getText()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Opens a file dialog and returns the contents of the selected file or null if dialog aborted.
|
||||||
|
*
|
||||||
|
* @param parent Dialog parent, may be null
|
||||||
|
* @return Binary contents of user selected file
|
||||||
|
*/
|
||||||
|
public static byte[] readDialogEEPROMBytes(Component parent) {
|
||||||
|
// Choose file
|
||||||
|
File file = null;
|
||||||
|
JFileChooser fileChooser = new JFileChooser();
|
||||||
|
fileChooser.setCurrentDirectory(new java.io.File("."));
|
||||||
|
fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
|
||||||
|
fileChooser.setDialogTitle("Select binary data");
|
||||||
|
|
||||||
|
if (fileChooser.showOpenDialog(parent) == JFileChooser.APPROVE_OPTION) {
|
||||||
|
file = fileChooser.getSelectedFile();
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read file data
|
||||||
|
long fileSize = file.length();
|
||||||
|
byte[] fileData = new byte[(int) fileSize];
|
||||||
|
|
||||||
|
FileInputStream fileIn;
|
||||||
|
DataInputStream dataIn;
|
||||||
|
int offset = 0;
|
||||||
|
int numRead = 0;
|
||||||
|
try {
|
||||||
|
fileIn = new FileInputStream(file);
|
||||||
|
dataIn = new DataInputStream(fileIn);
|
||||||
|
while (offset < fileData.length
|
||||||
|
&& (numRead = dataIn.read(fileData, offset, fileData.length - offset)) >= 0) {
|
||||||
|
offset += numRead;
|
||||||
|
}
|
||||||
|
|
||||||
|
dataIn.close();
|
||||||
|
fileIn.close();
|
||||||
|
} catch (Exception ex) {
|
||||||
|
logger.debug("Exception ex: " + ex);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return fileData;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in a new issue