Initial commit for motor control sdk Fixes: PINDSW-5635 Signed-off-by: Naresh A <nareshk@ti.com>
359 lines
9.8 KiB
JavaScript
359 lines
9.8 KiB
JavaScript
|
|
function getSelfSysCfgCoreName() {
|
|
if(system.deviceData.core)
|
|
return system.deviceData.core.name;
|
|
|
|
/* when system.deviceData.core is not defined return a valid core for current SoC */
|
|
switch(getSocName()) {
|
|
case "am243x":
|
|
return "r5fss0-0";
|
|
default:
|
|
case "am64x":
|
|
return "r5fss0-0";
|
|
case "am263x":
|
|
return "r5fss0-0";
|
|
case "am273x":
|
|
return "r5fss0-0";
|
|
case "awr294x":
|
|
return "r5fss0-0";
|
|
case "am62x":
|
|
return "m4fss0-0";
|
|
}
|
|
};
|
|
|
|
function isSciClientSupported() {
|
|
switch(getSocName()) {
|
|
case "am243x":
|
|
return true;
|
|
case "am64x":
|
|
return true;
|
|
case "am62x":
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
};
|
|
|
|
|
|
function getNodePath() {
|
|
return system.getNodePath()
|
|
}
|
|
|
|
function getSocName() {
|
|
if(system.deviceData.device == "AM64x_beta")
|
|
return "am64x";
|
|
if((system.deviceData.device == "AM243x_ALV_beta") || (system.deviceData.device == "AM243x_ALX_beta"))
|
|
return "am243x";
|
|
if(system.deviceData.device == "AM263x_beta")
|
|
return "am263x";
|
|
if(system.deviceData.device == "AM273x")
|
|
return "am273x";
|
|
if((system.deviceData.device == "AWR294X") || (system.deviceData.device == "AWR294XLOP"))
|
|
return "awr294x";
|
|
if(system.deviceData.device == "AM62x")
|
|
return "am62x";
|
|
};
|
|
|
|
function getDeviceName() {
|
|
if(system.deviceData.device == "AM64x_beta")
|
|
return "am64x-evm";
|
|
if(system.deviceData.device == "AM243x_ALV_beta")
|
|
return "am243x-evm";
|
|
if(system.deviceData.device == "AM243x_ALX_beta")
|
|
return "am243x-lp";
|
|
if(system.deviceData.device == "AM263x_beta")
|
|
return "am263x-cc";
|
|
if(system.deviceData.device == "AM273x")
|
|
return "am273x-evm";
|
|
if(system.deviceData.device == "AWR294X")
|
|
return "awr294x-evm";
|
|
if(system.deviceData.device == "AM62x")
|
|
return "am62x-sk";
|
|
};
|
|
|
|
function isCName(id) {
|
|
if ( (id != null) && (id.match(/^[a-zA-Z_][0-9a-zA-Z_]*$/) != null) )
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
function camelSentence(str) {
|
|
return (" " + str).toLowerCase().replace(/[^a-zA-Z0-9]+(.)/g, function(match, chr)
|
|
{
|
|
return chr.toUpperCase();
|
|
});
|
|
}
|
|
|
|
function getSysCfgCoreNames()
|
|
{
|
|
let core_names = [];
|
|
|
|
for( let core of system.deviceData.cores)
|
|
{
|
|
core_names.push(core.name);
|
|
}
|
|
return core_names;
|
|
}
|
|
|
|
function getStaticModuleForCore(moduleName, coreName)
|
|
{
|
|
let context = system.contexts[coreName];
|
|
let modules = context ? context.system.modules : {};
|
|
let module = modules[moduleName];
|
|
|
|
if(module && module.$static)
|
|
return module.$static;
|
|
|
|
return undefined;
|
|
}
|
|
|
|
function getModuleForCore(moduleName, coreName)
|
|
{
|
|
let context = system.contexts[coreName];
|
|
let modules = context ? context.system.modules : {};
|
|
let module = modules[moduleName];
|
|
|
|
return module;
|
|
}
|
|
|
|
|
|
function makeConfig(staticConfigArr, fieldname, displayName)
|
|
{
|
|
let config = {};
|
|
|
|
if(staticConfigArr.length == 0)
|
|
return undefined;
|
|
|
|
config.name = `${fieldname}`;
|
|
config.displayName = `${displayName}`;
|
|
config.description = `Select ${displayName}`;
|
|
config.default = staticConfigArr[0].name;
|
|
config.options = [];
|
|
|
|
for (let i = 0; i < staticConfigArr.length; i++) {
|
|
let option = {};
|
|
|
|
option.name = staticConfigArr[i].name;
|
|
if(staticConfigArr[i].description)
|
|
{
|
|
option.description = staticConfigArr[i].description;
|
|
}
|
|
config.options.push(option);
|
|
}
|
|
|
|
return config;
|
|
}
|
|
|
|
function checkSameFieldName(instance, fieldname, report)
|
|
{
|
|
let moduleInstances = instance.$module.$instances;
|
|
|
|
for (let i = 0; i < moduleInstances.length; i++) {
|
|
if (instance[fieldname] === moduleInstances[i][fieldname] &&
|
|
instance !== moduleInstances[i]) {
|
|
report.logError(`Same ${fieldname} cannot be selected`, instance, fieldname);
|
|
}
|
|
}
|
|
}
|
|
|
|
function checkSameFieldNameOnAllCores(moduleName, instance, fieldname, report)
|
|
{
|
|
let coreNames = getSysCfgCoreNames();
|
|
for ( let remoteCoreName of coreNames)
|
|
{
|
|
let remote_core_instance = getModuleForCore(moduleName, remoteCoreName);
|
|
if(remote_core_instance)
|
|
{
|
|
let moduleInstances = remote_core_instance.$instances;
|
|
for (let i = 0; i < moduleInstances.length; i++) {
|
|
if (instance[fieldname] === moduleInstances[i][fieldname] &&
|
|
instance !== moduleInstances[i]) {
|
|
report.logError(`Same ${fieldname} cannot be selected`, instance, fieldname);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function getUseMcuDomainPeripheralsConfig()
|
|
{
|
|
let config = {
|
|
name: "useMcuDomainPeripherals",
|
|
displayName: "Use MCU Domain Peripherals",
|
|
default: false,
|
|
}
|
|
|
|
if(getSelfSysCfgCoreName().includes("m4f")) {
|
|
config.default = true;
|
|
config.readOnly = true;
|
|
}
|
|
|
|
return config;
|
|
}
|
|
|
|
function isMcuDomainSupported()
|
|
{
|
|
switch(getSocName()) {
|
|
case "am243x":
|
|
return true;
|
|
case "am64x":
|
|
return true;
|
|
case "am62x":
|
|
return true;
|
|
default:
|
|
return false;
|
|
}
|
|
}
|
|
|
|
function findDuplicates(arrayToCheck)
|
|
{
|
|
const count = arrayToCheck =>
|
|
arrayToCheck.reduce((a, b) => ({ ...a,
|
|
[b]: (a[b] || 0) + 1
|
|
}), {})
|
|
|
|
const duplicates = dict =>
|
|
Object.keys(dict).filter((a) => dict[a] > 1)
|
|
|
|
return {count: count(arrayToCheck), duplicates: duplicates(count(arrayToCheck))};
|
|
}
|
|
|
|
/*
|
|
* Checks whether a given string is empty and returns a string
|
|
* If stringToCheck is empty, an empty string is returned otherwise
|
|
* stringToAdd is returned
|
|
*
|
|
* stringToCheck - The string to be compared to empty string
|
|
* stringToAdd - The string to return when stringToCheck is non empty
|
|
*
|
|
*/
|
|
function stringOrEmpty(stringToCheck, stringToAdd)
|
|
{
|
|
if (stringToCheck != "")
|
|
{
|
|
return stringToAdd;
|
|
}
|
|
return "";
|
|
}
|
|
|
|
/*
|
|
* Check that HW signal type matches a specified array of types
|
|
*
|
|
* Example: within a module's filterHardware(component) method:
|
|
* for (sig in component.signals) {
|
|
* let type = component.signals[sig].type;
|
|
* if (Common.typeMatches(type, ["PWM", "DOUT"])) {
|
|
* :
|
|
* }
|
|
* }
|
|
*
|
|
* type - a string or array of strings that are valid signal types
|
|
* nameArray - array of signal name types that must match one of the signal
|
|
* types named by type
|
|
*
|
|
* Returns true iff nameArray contains at least one type name that's
|
|
* specified the type parameter.
|
|
*/
|
|
function typeMatches(type, nameArray)
|
|
{
|
|
let options = {};
|
|
|
|
if (type instanceof Array || typeof type == "object") {
|
|
for (var i = 0; i < type.length; i++) {
|
|
options[type[i]] = 1;
|
|
}
|
|
}
|
|
else if (typeof type == "string" || type instanceof String) {
|
|
options[type] = 1;
|
|
}
|
|
|
|
for (var i = 0; i < nameArray.length; i++) {
|
|
let name = nameArray[i];
|
|
if (name in options) {
|
|
return (true);
|
|
}
|
|
}
|
|
|
|
return (false);
|
|
}
|
|
|
|
exports = {
|
|
getSelfSysCfgCoreName,
|
|
isSciClientSupported,
|
|
getSocName,
|
|
getDeviceName,
|
|
camelSentence,
|
|
getStaticModuleForCore,
|
|
getModuleForCore,
|
|
getSysCfgCoreNames,
|
|
getUseMcuDomainPeripheralsConfig,
|
|
isMcuDomainSupported,
|
|
findDuplicates,
|
|
stringOrEmpty,
|
|
typeMatches,
|
|
getNodePath,
|
|
|
|
validate: {
|
|
checkSameInstanceName : function (instance, report) {
|
|
checkSameFieldName(instance, "instance", report);
|
|
},
|
|
checkSameInstanceNameOnAllCores : function (moduleName, instance, report) {
|
|
checkSameFieldNameOnAllCores(moduleName, instance, "instance", report);
|
|
},
|
|
checkSameFieldName : checkSameFieldName,
|
|
checkSameFieldNameOnAllCores : checkSameFieldNameOnAllCores,
|
|
checkNumberRange: function(instance, report, property, min, max, displayFormat) {
|
|
if(instance[property] > max || instance[property] < min) {
|
|
let base = 10;
|
|
|
|
if(displayFormat == "hex") {
|
|
base = 16;
|
|
|
|
report.logError( `Value must be between 0x${min.toString(base).toUpperCase()}`
|
|
+ ` .. 0x${max.toString(base).toUpperCase()}`,
|
|
instance, property);
|
|
}
|
|
else {
|
|
report.logError( `Value must be between ${min.toString(base).toUpperCase()}`
|
|
+ ` .. ${max.toString(base).toUpperCase()}`,
|
|
instance, property);
|
|
}
|
|
}
|
|
},
|
|
checkValidCName: function(instance, report, property) {
|
|
if(isCName((instance[property])) === false) {
|
|
report.logError(`Provide a valid C name`, instance, property);
|
|
}
|
|
},
|
|
checkConfigurableValueMatchForAllCores(moduleName, instance, report, configurable, core_instances)
|
|
{
|
|
let coreNames = getSysCfgCoreNames();
|
|
let selfCoreName = getSelfSysCfgCoreName();
|
|
|
|
for ( let remoteCoreName of coreNames)
|
|
{
|
|
if( remoteCoreName != selfCoreName)
|
|
{
|
|
let remote_core_instance = getStaticModuleForCore(moduleName, remoteCoreName);
|
|
|
|
if(remote_core_instance && instance[configurable] != remote_core_instance[configurable])
|
|
{
|
|
report.logError("Value MUST match with other cores", instance, configurable);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
},
|
|
},
|
|
|
|
ui:
|
|
{
|
|
makeInstanceConfig: function(staticConfigArr) {
|
|
return makeConfig(staticConfigArr, "instance", "Instance");
|
|
},
|
|
makeConfig: makeConfig,
|
|
}
|
|
};
|