blob: 3c0dfbcf5688e83b8cd77b6893f0c2203b022b4d [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012 Juergen Haug
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* CONTRIBUTORS:
* Juergen Haug
*
*******************************************************************************/
package org.eclipse.etrice.generator.java.gen
import com.google.inject.Inject
import java.util.ArrayList
import java.util.List
import org.eclipse.etrice.core.genmodel.etricegen.ActorInstance
import org.eclipse.etrice.core.genmodel.etricegen.InstanceBase
import org.eclipse.etrice.core.room.ActorClass
import org.eclipse.etrice.core.room.Attribute
import org.eclipse.etrice.core.room.DataClass
import org.eclipse.etrice.core.room.EnumerationType
import org.eclipse.etrice.core.room.PrimitiveType
import org.eclipse.etrice.core.room.util.RoomHelpers
import org.eclipse.etrice.generator.base.IDataConfiguration
import org.eclipse.etrice.generator.generic.ProcedureHelpers
import org.eclipse.etrice.generator.generic.RoomExtensions
import org.eclipse.etrice.generator.generic.TypeHelpers
class ConfigGenAddon {
@Inject extension JavaExtensions stdExt
@Inject extension TypeHelpers typeHelpers
@Inject extension ProcedureHelpers helpers
@Inject IDataConfiguration dataConfigExt
@Inject extension RoomHelpers
@Inject extension RoomExtensions
@Inject Initialization initGen
// For SubSystemClassGen
def public genActorInstanceConfig(ActorInstance ai, String aiVariableName){'''
«FOR a : ai.actorClass.allAttributes»
«applyInstanceConfig(ai, aiVariableName, new ArrayList<Attribute>().union(a))»
«ENDFOR»
«FOR pi : ai.orderedIfItemInstances»
«var attribs = getPortClass(pi.interfaceItem)?.attributes»
«IF attribs !== null»
«FOR a : attribs»
«applyInstanceConfig(pi, aiVariableName+"."+invokeGetter(pi.name, null), new ArrayList<Attribute>().union(a))»
«ENDFOR»
«ENDIF»
«ENDFOR»
'''
}
def private CharSequence applyInstanceConfig(InstanceBase instance, String invokes, List<Attribute> path){
var a = path.last
var aType = a.type.type
switch aType {
PrimitiveType: {
var value = typeHelpers.getAttrInstanceConfigValue(path, instance)
if(value !== null)
initGen.genAttributeInitializer(a, toValueLiteral(aType, value), invokes)
}
EnumerationType: {
var value = typeHelpers.getAttrInstanceConfigValue(path, instance)
if(value !== null)
initGen.genAttributeInitializer(a, value, invokes)
}
DataClass:
'''
«FOR e : (aType as DataClass).allAttributes»
«applyInstanceConfig(instance, invokes+"."+a.name.invokeGetter(null), path.union(e))»
«ENDFOR»
'''
}
}
// For ActorClassGen
def public genDynConfigGetterSetter(ActorClass ac){'''
«FOR a : dataConfigExt.getDynConfigReadAttributes(ac)»
public «a.type.type.typeName»«IF a.size>0»[]«ENDIF» get«a.name.toFirstUpper»(){
if(lock_«a.name» == null)
return «a.name»;
else
synchronized(lock_«a.name»){
return «a.name»;
}
}
public void set«a.name.toFirstUpper»(«a.type.type.typeName»«IF a.size>0»[]«ENDIF» «a.name»){
if(lock_«a.name» == null)
this.«a.name» = «a.name»;
else
synchronized(lock_«a.name»){
this.«a.name» = «a.name»;
}
}
public DynConfigLock get«a.name.toFirstUpper»Lock(){
return lock_«a.name»;
}
«ENDFOR»
«FOR a : dataConfigExt.getDynConfigWriteAttributes(ac)»
public void setAndWrite«a.name.toFirstUpper»(«a.type.type.typeName»«IF a.size>0»[]«ENDIF» «a.name»){
set«a.name.toFirstUpper»(«a.name»);
getVariableService().write(this.getInstancePath()+"/«a.name»", «a.name»);
}
«ENDFOR»
'''}
def public genMinMaxConstants(ActorClass ac){
var result = '''
«FOR a : ac.allAttributes»
«genMinMaxConstantsRec(ac, a.name, new ArrayList<Attribute>().union(a))»
«ENDFOR»
'''
if(result.length != 0)
result = result+'''//--------------------- Attribute Specifications'''
return result
}
def private CharSequence genMinMaxConstantsRec(ActorClass ac, String varNamePath, List<Attribute> path){
var aType = path.last.type.type
switch aType {
DataClass:
'''
«FOR e : (aType as DataClass).allAttributes»
«genMinMaxConstantsRec(ac, varNamePath+"_"+e.name, path.union(e))»
«ENDFOR»
'''
PrimitiveType:{
var temp = null as String
'''
«IF (temp = dataConfigExt.getAttrClassConfigMinValue(ac, path)) !== null»
public static «aType.minMaxType» MIN_«varNamePath» = «aType.toValueLiteral(temp)»;
«ENDIF»
«IF (temp = dataConfigExt.getAttrClassConfigMaxValue(ac, path)) !== null»
public static «aType.minMaxType» MAX_«varNamePath» = «aType.toValueLiteral(temp)»;
«ENDIF»
'''
}
}
}
def private getMinMaxType(PrimitiveType type){
return switch(type.typeName){
case "byte":
"int"
case "short":
"int"
case "float":
"double"
default:
type.typeName
}
}
}