/*******************************************************************************
* Copyright (c) 2015 ARM Ltd. and others
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* ARM Ltd and ARM Germany GmbH - Initial API and implementation
*******************************************************************************/
package com.arm.cmsis.pack.info;
import java.util.Collection;
import java.util.Map;
import com.arm.cmsis.pack.common.CmsisConstants;
import com.arm.cmsis.pack.data.CpItem;
import com.arm.cmsis.pack.data.ICpDebugConfiguration;
import com.arm.cmsis.pack.data.ICpDeviceItem;
import com.arm.cmsis.pack.data.ICpItem;
import com.arm.cmsis.pack.data.ICpMemory;
import com.arm.cmsis.pack.data.ICpPack;
import com.arm.cmsis.pack.enums.EEvaluationResult;
import com.arm.cmsis.pack.rte.devices.IRteDeviceItem;
import com.arm.cmsis.pack.utils.Utils;
/**
* Default implementation of ICpDeviceInfo interface
*/
public class CpDeviceInfo extends CpItem implements ICpDeviceInfo {
protected ICpDeviceItem fDevice = null;
protected ICpPackInfo fPackInfo = null;
protected String fPname = null;
protected EEvaluationResult fResolveResult = EEvaluationResult.UNDEFINED;
/**
* Constructs CpDeviceInfo from supplied ICpDeviceItem
* @param parent parent ICpItem
* @param device IRteDeviceItem to construct from
*/
public CpDeviceInfo(ICpItem parent, IRteDeviceItem device) {
super(parent, CmsisConstants.DEVICE_TAG);
setRteDevice(device);
}
/**
* Default constructor
* @param parent parent ICpItem
*/
public CpDeviceInfo(ICpItem parent) {
super(parent, CmsisConstants.DEVICE_TAG);
}
/**
* Constructs CpDeviceInfo from parent and tag
* @param parent parent ICpItem
* @param tag
*/
public CpDeviceInfo(ICpItem parent, String tag) {
super(parent, tag);
}
@Override
public ICpDeviceItem getDevice() {
return fDevice;
}
@Override
public ICpPack getPack() {
if(fDevice != null) {
return fDevice.getPack();
}
if(fPackInfo != null) {
return fPackInfo.getPack();
}
return null;
}
@Override
public ICpPackInfo getPackInfo() {
return fPackInfo;
}
@Override
public void setRteDevice(IRteDeviceItem device) {
if(device != null) {
setDevice(device.getDevice());
fName = device.getName();
fPname = null;
int i = fName.indexOf(':');
if (i >= 0) {
fPname = fName.substring(i + 1);
} else if(fDevice == null || fDevice.getProcessorCount() == 1) {
fPname = CmsisConstants.EMPTY_STRING;
}
} else {
fDevice = null;
}
updateInfo();
}
@Override
public void setDevice(ICpDeviceItem device) {
fDevice = device;
}
@Override
public String getProcessorName() {
return attributes().getAttribute(CmsisConstants.PNAME, fPname);
}
@Override
public String getDeviceName() {
return getName();
}
@Override
public void updateInfo() {
if(fDevice != null) {
fPackInfo = new CpPackInfo(this, fDevice.getPack());
replaceChild(fPackInfo);
if(!attributes().hasAttributes()) {
attributes().setAttributes(fDevice.getEffectiveAttributes(null));
String processorName = getProcessorName();
if(processorName != null) {
attributes().setAttribute(CmsisConstants.PNAME, processorName);
ICpItem proc = fDevice.getProcessor(processorName);
if(proc != null) {
attributes().mergeAttributes(proc.attributes());
}
}
String url = fDevice.getUrl();
if(url != null && !url.isEmpty()) {
ICpItem urlItem = new CpItem(this, CmsisConstants.URL);
urlItem.setText(url);
replaceChild(urlItem);
}
}
} else {
if(fPackInfo != null) {
fPackInfo.setPack(null);
}
}
}
@Override
public void addChild(ICpItem item) {
if(item instanceof ICpPackInfo) {
fPackInfo = (ICpPackInfo)item;
}
super.addChild(item);
}
@Override
public String getName() {
if(fName == null || fName.isEmpty()) {
fName = getDeviceName(attributes());
}
return fName;
}
@Override
public String getVersion() {
return CmsisConstants.EMPTY_STRING;
}
@Override
public String getDescription() {
ICpItem effectiveProps = getEffectiveProperties();
if(effectiveProps != null) {
return effectiveProps.getDescription();
}
return CmsisConstants.EMPTY_STRING;
}
@Override
public synchronized String getUrl() {
if(fDevice != null) {
return fDevice.getUrl();
}
return super.getUrl();
}
@Override
public EEvaluationResult getEvaluationResult() {
return fResolveResult;
}
@Override
public void setEvaluationResult(EEvaluationResult result) {
fResolveResult = result;
}
@Override
public ICpItem getEffectiveProperties() {
if(fDevice != null) {
return fDevice.getEffectiveProperties(getProcessorName());
}
return null;
}
@Override
public ICpDebugConfiguration getDebugConfiguration() {
if(fDevice != null) {
return fDevice.getDebugConfiguration(getProcessorName());
}
return null;
}
@Override
public String getSummary() {
String summary = CmsisConstants.EMPTY_STRING;
if(getProcessorName() != null ) {
summary += CmsisConstants.ARM + ' ' + getAttribute(CmsisConstants.DCORE);
String clock = getClockSummary();
if (!clock.isEmpty()) {
summary += ' ' + clock;
}
} else if(fDevice != null){
Map<String, ICpItem> processors = fDevice.getProcessors();
for(ICpItem p : processors.values()) {
if(!summary.isEmpty())
{
summary += ", "; //$NON-NLS-1$
}
summary += CmsisConstants.ARM + ' ' + p.getAttribute(CmsisConstants.DCORE);
String clock = Utils.getScaledClockFrequency(p.getAttribute(CmsisConstants.DCLOCK));
if (!clock.isEmpty()) {
summary += ' ' + clock;
}
}
}
String memory = getMemorySummary();
if(!memory.isEmpty()) {
summary += ", " + memory; //$NON-NLS-1$
}
return summary;
}
@Override
public String getClockSummary() {
return Utils.getScaledClockFrequency(getAttribute(CmsisConstants.DCLOCK));
}
@Override
public String getMemorySummary() {
ICpItem effectiveProps = getEffectiveProperties();
if(effectiveProps == null) {
return CmsisConstants.EMPTY_STRING;
}
Collection<ICpItem> mems = effectiveProps.getChildren(CmsisConstants.MEMORY_TAG);
if(mems == null || mems.isEmpty()) {
return CmsisConstants.EMPTY_STRING;
}
long ramSize = 0;
long romSize = 0;
for(ICpItem item : mems) {
if(!(item instanceof ICpMemory)) {
continue;
}
ICpMemory m = (ICpMemory)item;
long size = m.attributes().getAttributeAsLong(CmsisConstants.SIZE, 0);
if(size == 0) {
continue;
}
if(m.isRAM()) {
ramSize += size;
} else if(m.isROM()) {
romSize += size;
}
}
String summary = CmsisConstants.EMPTY_STRING;
if (ramSize > 0) {
summary += Utils.getMemorySizeString(ramSize) + ' ' + CmsisConstants.RAM;
}
if (romSize > 0) {
if (!summary.isEmpty())
{
summary += ", "; //$NON-NLS-1$
}
summary += Utils.getMemorySizeString(romSize) + ' ' + CmsisConstants.ROM;
}
return summary;
}
@Override
public Collection<ICpItem> getBooks() {
ICpItem effectiveProps = getEffectiveProperties();
if(effectiveProps == null) {
return null;
}
return effectiveProps.getBooks();
}
}