[cooja] ContikiMoteType: Moved further parse functions to SectionParser classes
This commit is contained in:
parent
66d4dad1e1
commit
defcd1a34c
@ -469,7 +469,7 @@ public class ContikiMoteType implements MoteType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Map<String, Symbol> vars = bssSecParser.getSymbols();
|
Map<String, Symbol> vars = bssSecParser.parseSymbols();
|
||||||
for (Symbol s : vars.values()) {
|
for (Symbol s : vars.values()) {
|
||||||
if (s.name.equals("referenceVar")) {
|
if (s.name.equals("referenceVar")) {
|
||||||
/* Relative <-> absolute addresses offset */
|
/* Relative <-> absolute addresses offset */
|
||||||
@ -525,6 +525,9 @@ public class ContikiMoteType implements MoteType {
|
|||||||
getCoreMemory(initialMemory);
|
getCoreMemory(initialMemory);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
public static abstract class SectionParser {
|
public static abstract class SectionParser {
|
||||||
|
|
||||||
private final String[] mapFileData;
|
private final String[] mapFileData;
|
||||||
@ -537,11 +540,11 @@ public class ContikiMoteType implements MoteType {
|
|||||||
return mapFileData;
|
return mapFileData;
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract int parseAddr();
|
public abstract int parseStartAddr();
|
||||||
|
|
||||||
public abstract int parseSize();
|
public abstract int parseSize();
|
||||||
|
|
||||||
abstract Map<String, Symbol> getSymbols();
|
abstract Map<String, Symbol> parseSymbols();
|
||||||
|
|
||||||
protected int parseFirstHexInt(String regexp, String[] data) {
|
protected int parseFirstHexInt(String regexp, String[] data) {
|
||||||
String retString = getFirstMatchGroup(data, regexp, 1);
|
String retString = getFirstMatchGroup(data, regexp, 1);
|
||||||
@ -555,20 +558,15 @@ public class ContikiMoteType implements MoteType {
|
|||||||
|
|
||||||
public MemoryInterface parse() {
|
public MemoryInterface parse() {
|
||||||
|
|
||||||
int mapSectionAddr = parseAddr();
|
/* Parse start address and size of section */
|
||||||
|
int mapSectionAddr = parseStartAddr();
|
||||||
int mapSectionSize = parseSize();
|
int mapSectionSize = parseSize();
|
||||||
|
|
||||||
if (mapSectionAddr < 0 || mapSectionSize <= 0) {
|
if (mapSectionAddr < 0 || mapSectionSize <= 0) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, Symbol> variables = getMapFileVarsInRange(
|
Map<String, Symbol> variables = parseSymbols();
|
||||||
getData(),
|
|
||||||
mapSectionAddr,
|
|
||||||
mapSectionAddr + mapSectionSize);
|
|
||||||
if (variables == null || variables.isEmpty()) {
|
|
||||||
logger.warn("Map data symbol parsing failed");
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info(String.format("Parsed section at 0x%x ( %d == 0x%x bytes)",
|
logger.info(String.format("Parsed section at 0x%x ( %d == 0x%x bytes)",
|
||||||
// getContikiFirmwareFile().getName(),
|
// getContikiFirmwareFile().getName(),
|
||||||
@ -600,7 +598,7 @@ public class ContikiMoteType implements MoteType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int parseAddr() {
|
public int parseStartAddr() {
|
||||||
if (startRegExp == null) {
|
if (startRegExp == null) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -616,11 +614,59 @@ public class ContikiMoteType implements MoteType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Symbol> getSymbols() {
|
public Map<String, Symbol> parseSymbols() {
|
||||||
return getMapFileVarsInRange(
|
Map<String, Symbol> varNames = new HashMap<>();
|
||||||
getData(),
|
|
||||||
parseAddr(),
|
Pattern pattern = Pattern.compile(Cooja.getExternalToolsSetting("MAPFILE_VAR_NAME"));
|
||||||
parseAddr() + parseSize());
|
for (String line : getData()) {
|
||||||
|
Matcher matcher = pattern.matcher(line);
|
||||||
|
if (matcher.find()) {
|
||||||
|
if (Integer.decode(matcher.group(1)).intValue() >= parseStartAddr()
|
||||||
|
&& Integer.decode(matcher.group(1)).intValue() <= parseStartAddr() + parseSize()) {
|
||||||
|
String varName = matcher.group(2);
|
||||||
|
varNames.put(varName, new Symbol(
|
||||||
|
Symbol.Type.VARIABLE,
|
||||||
|
varName,
|
||||||
|
getMapFileVarAddress(getData(), varName),
|
||||||
|
getMapFileVarSize(getData(), varName)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return varNames;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get relative address of variable with given name.
|
||||||
|
*
|
||||||
|
* @param varName Name of variable
|
||||||
|
* @return Relative memory address of variable or -1 if not found
|
||||||
|
*/
|
||||||
|
private int getMapFileVarAddress(String[] mapFileData, String varName) {
|
||||||
|
|
||||||
|
String regExp = Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_1")
|
||||||
|
+ varName
|
||||||
|
+ Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_2");
|
||||||
|
String retString = getFirstMatchGroup(mapFileData, regExp, 1);
|
||||||
|
|
||||||
|
if (retString != null) {
|
||||||
|
return Integer.parseInt(retString.trim(), 16);
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private int getMapFileVarSize(String[] mapFileData, String varName) {
|
||||||
|
Pattern pattern = Pattern.compile(
|
||||||
|
Cooja.getExternalToolsSetting("MAPFILE_VAR_SIZE_1")
|
||||||
|
+ varName
|
||||||
|
+ Cooja.getExternalToolsSetting("MAPFILE_VAR_SIZE_2"));
|
||||||
|
for (String line : mapFileData) {
|
||||||
|
Matcher matcher = pattern.matcher(line);
|
||||||
|
if (matcher.find()) {
|
||||||
|
return Integer.decode(matcher.group(1));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -639,7 +685,7 @@ public class ContikiMoteType implements MoteType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int parseAddr() {
|
public int parseStartAddr() {
|
||||||
if (startRegExp == null) {
|
if (startRegExp == null) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -652,7 +698,7 @@ public class ContikiMoteType implements MoteType {
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int start = parseAddr();
|
int start = parseStartAddr();
|
||||||
if (start < 0) {
|
if (start < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@ -665,8 +711,32 @@ public class ContikiMoteType implements MoteType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Symbol> getSymbols() {
|
public Map<String, Symbol> parseSymbols() {
|
||||||
return parseCommandVariables(getData());
|
HashMap<String, Symbol> addresses = new HashMap<>();
|
||||||
|
Pattern pattern = Pattern.compile(Cooja.getExternalToolsSetting("COMMAND_VAR_NAME_ADDRESS"));
|
||||||
|
|
||||||
|
for (String line : getData()) {
|
||||||
|
Matcher matcher = pattern.matcher(line);
|
||||||
|
|
||||||
|
if (matcher.find()) {
|
||||||
|
/* Line matched variable address */
|
||||||
|
String symbol = matcher.group(2);
|
||||||
|
int address = Integer.parseInt(matcher.group(1), 16);
|
||||||
|
|
||||||
|
/* XXX needs to be checked */
|
||||||
|
if (!addresses.containsKey(symbol)) {
|
||||||
|
addresses.put(symbol, new Symbol(Symbol.Type.VARIABLE, symbol, address, 1));
|
||||||
|
} else {
|
||||||
|
int oldAddress = (int) addresses.get(symbol).addr;
|
||||||
|
if (oldAddress != address) {
|
||||||
|
/*logger.warn("Warning, command response not matching previous entry of: "
|
||||||
|
+ varName);*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return addresses;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -723,55 +793,6 @@ public class ContikiMoteType implements MoteType {
|
|||||||
myCoreComm.setMemory(relAddr, length, mem);
|
myCoreComm.setMemory(relAddr, length, mem);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Parses parse command output for variable name to addresses mappings.
|
|
||||||
* The mappings are written to the given properties object.
|
|
||||||
*
|
|
||||||
* TODO: need InRange version!
|
|
||||||
*
|
|
||||||
* @param output Command output
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public static Map<String, Symbol> parseCommandVariables(String[] output) {
|
|
||||||
int nrNew = 0, nrOld = 0, nrMismatch = 0;
|
|
||||||
HashMap<String, Symbol> addresses = new HashMap<>();
|
|
||||||
Pattern pattern = Pattern.compile(Cooja.getExternalToolsSetting("COMMAND_VAR_NAME_ADDRESS"));
|
|
||||||
|
|
||||||
for (String line : output) {
|
|
||||||
Matcher matcher = pattern.matcher(line);
|
|
||||||
|
|
||||||
if (matcher.find()) {
|
|
||||||
/* Line matched variable address */
|
|
||||||
String symbol = matcher.group(2);
|
|
||||||
int address = Integer.parseInt(matcher.group(1), 16);
|
|
||||||
|
|
||||||
/* XXX needs to be checked */
|
|
||||||
if (!addresses.containsKey(symbol)) {
|
|
||||||
nrNew++;
|
|
||||||
addresses.put(symbol, new Symbol(Symbol.Type.VARIABLE, symbol, address, 1));
|
|
||||||
} else {
|
|
||||||
int oldAddress = (int) addresses.get(symbol).addr;
|
|
||||||
if (oldAddress != address) {
|
|
||||||
/*logger.warn("Warning, command response not matching previous entry of: "
|
|
||||||
+ varName);*/
|
|
||||||
nrMismatch++;
|
|
||||||
}
|
|
||||||
nrOld++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*if (nrMismatch > 0) {
|
|
||||||
logger.debug("Command response parsing summary: Added " + nrNew
|
|
||||||
+ " variables. Found " + nrOld
|
|
||||||
+ " old variables. Mismatching addresses: " + nrMismatch);
|
|
||||||
} else {
|
|
||||||
logger.debug("Command response parsing summary: Added " + nrNew
|
|
||||||
+ " variables. Found " + nrOld + " old variables");
|
|
||||||
}*/
|
|
||||||
return addresses;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getIdentifier() {
|
public String getIdentifier() {
|
||||||
return identifier;
|
return identifier;
|
||||||
@ -854,79 +875,6 @@ public class ContikiMoteType implements MoteType {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Map<String, Symbol> getMapFileVarsInRange(
|
|
||||||
String[] lines,
|
|
||||||
int startAddress,
|
|
||||||
int endAddress) {
|
|
||||||
Map<String, Symbol> varNames = new HashMap<>();
|
|
||||||
|
|
||||||
Pattern pattern = Pattern.compile(Cooja.getExternalToolsSetting("MAPFILE_VAR_NAME"));
|
|
||||||
for (String line : lines) {
|
|
||||||
Matcher matcher = pattern.matcher(line);
|
|
||||||
if (matcher.find()) {
|
|
||||||
if (Integer.decode(matcher.group(1)).intValue() >= startAddress
|
|
||||||
&& Integer.decode(matcher.group(1)).intValue() <= endAddress) {
|
|
||||||
String varName = matcher.group(2);
|
|
||||||
varNames.put(varName, new Symbol(
|
|
||||||
Symbol.Type.VARIABLE,
|
|
||||||
varName,
|
|
||||||
getMapFileVarAddress(lines, varName),
|
|
||||||
getMapFileVarSize(lines, varName)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return varNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get relative address of variable with given name.
|
|
||||||
*
|
|
||||||
* @param varName Name of variable
|
|
||||||
* @return Relative memory address of variable or -1 if not found
|
|
||||||
*/
|
|
||||||
private static int getMapFileVarAddress(String[] mapFileData, String varName) {
|
|
||||||
|
|
||||||
String regExp = Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_1")
|
|
||||||
+ varName
|
|
||||||
+ Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_2");
|
|
||||||
String retString = getFirstMatchGroup(mapFileData, regExp, 1);
|
|
||||||
|
|
||||||
if (retString != null) {
|
|
||||||
return Integer.parseInt(retString.trim(), 16);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static int getMapFileVarSize(String[] mapFileData, String varName) {
|
|
||||||
Pattern pattern = Pattern.compile(
|
|
||||||
Cooja.getExternalToolsSetting("MAPFILE_VAR_SIZE_1")
|
|
||||||
+ varName
|
|
||||||
+ Cooja.getExternalToolsSetting("MAPFILE_VAR_SIZE_2"));
|
|
||||||
for (String line : mapFileData) {
|
|
||||||
Matcher matcher = pattern.matcher(line);
|
|
||||||
if (matcher.find()) {
|
|
||||||
return Integer.decode(matcher.group(1));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int getRelVarAddr(String mapFileData[], String varName) {
|
|
||||||
String regExp
|
|
||||||
= Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_1")
|
|
||||||
+ varName
|
|
||||||
+ Cooja.getExternalToolsSetting("MAPFILE_VAR_ADDRESS_2");
|
|
||||||
String retString = getFirstMatchGroup(mapFileData, regExp, 1);
|
|
||||||
|
|
||||||
if (retString != null) {
|
|
||||||
return Integer.parseInt(retString.trim(), 16);
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static String[] loadMapFile(File mapFile) {
|
public static String[] loadMapFile(File mapFile) {
|
||||||
String contents = StringUtils.loadFromFile(mapFile);
|
String contents = StringUtils.loadFromFile(mapFile);
|
||||||
if (contents == null) {
|
if (contents == null) {
|
||||||
|
@ -776,9 +776,9 @@ public class ConfigurationWizard extends JDialog {
|
|||||||
mapData,
|
mapData,
|
||||||
Cooja.getExternalToolsSetting("MAPFILE_BSS_START"),
|
Cooja.getExternalToolsSetting("MAPFILE_BSS_START"),
|
||||||
Cooja.getExternalToolsSetting("MAPFILE_BSS_SIZE"));
|
Cooja.getExternalToolsSetting("MAPFILE_BSS_SIZE"));
|
||||||
relDataSectionAddr = dataSecParser.parseAddr();
|
relDataSectionAddr = dataSecParser.parseStartAddr();
|
||||||
dataSectionSize = dataSecParser.parseSize();
|
dataSectionSize = dataSecParser.parseSize();
|
||||||
relBssSectionAddr = bssSecParser.parseAddr();
|
relBssSectionAddr = bssSecParser.parseStartAddr();
|
||||||
bssSectionSize = bssSecParser.parseSize();
|
bssSectionSize = bssSecParser.parseSize();
|
||||||
testOutput.addMessage("Data section address: 0x" + Integer.toHexString(relDataSectionAddr));
|
testOutput.addMessage("Data section address: 0x" + Integer.toHexString(relDataSectionAddr));
|
||||||
testOutput.addMessage("Data section size: 0x" + Integer.toHexString(dataSectionSize));
|
testOutput.addMessage("Data section size: 0x" + Integer.toHexString(dataSectionSize));
|
||||||
@ -865,9 +865,9 @@ public class ConfigurationWizard extends JDialog {
|
|||||||
Cooja.getExternalToolsSetting("COMMAND_BSS_START"),
|
Cooja.getExternalToolsSetting("COMMAND_BSS_START"),
|
||||||
Cooja.getExternalToolsSetting("COMMAND_BSS_SIZE"));
|
Cooja.getExternalToolsSetting("COMMAND_BSS_SIZE"));
|
||||||
|
|
||||||
relDataSectionAddr = dataSecParser.parseAddr();
|
relDataSectionAddr = dataSecParser.parseStartAddr();
|
||||||
dataSectionSize = dataSecParser.parseSize();
|
dataSectionSize = dataSecParser.parseSize();
|
||||||
relBssSectionAddr = bssSecParser.parseAddr();
|
relBssSectionAddr = bssSecParser.parseStartAddr();
|
||||||
bssSectionSize = bssSecParser.parseSize();
|
bssSectionSize = bssSecParser.parseSize();
|
||||||
testOutput.addMessage("Data section address: 0x" + Integer.toHexString(relDataSectionAddr));
|
testOutput.addMessage("Data section address: 0x" + Integer.toHexString(relDataSectionAddr));
|
||||||
testOutput.addMessage("Data section size: 0x" + Integer.toHexString(dataSectionSize));
|
testOutput.addMessage("Data section size: 0x" + Integer.toHexString(dataSectionSize));
|
||||||
|
Loading…
Reference in New Issue
Block a user