Skip to main content
aboutsummaryrefslogtreecommitdiffstats
blob: 725991ee0f7af8be588fd9379b4ff37ecef61beb (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/*******************************************************************************
 * Copyright (c) 2012 protos software gmbh (http://www.protos.de).
 * 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:
 * 		Henrik Rentz-Reichert (initial contribution)
 * 
 *******************************************************************************/

package org.eclipse.etrice.generator.c.gen;

import java.util.List;

import org.eclipse.emf.ecore.EObject;
import org.eclipse.etrice.core.fsm.fSM.AbstractInterfaceItem;
import org.eclipse.etrice.core.fsm.fSM.DetailCode;
import org.eclipse.etrice.core.room.Attribute;
import org.eclipse.etrice.core.room.CommunicationType;
import org.eclipse.etrice.core.room.EnumLiteral;
import org.eclipse.etrice.core.room.EnumerationType;
import org.eclipse.etrice.core.room.InterfaceItem;
import org.eclipse.etrice.core.room.Message;
import org.eclipse.etrice.core.room.Port;
import org.eclipse.etrice.core.room.PortOperation;
import org.eclipse.etrice.core.room.ProtocolClass;
import org.eclipse.etrice.core.room.SAP;
import org.eclipse.etrice.core.room.SPP;
import org.eclipse.etrice.generator.base.DefaultTranslationProvider;
import org.eclipse.etrice.generator.generic.ILanguageExtension;

import com.google.inject.Inject;

public class CTranslationProvider extends DefaultTranslationProvider {

	@Inject ILanguageExtension langExt;

	@Override
	public boolean translateMembers() {
		return true;
	}

	@Override
	public String getAttributeSetter(Attribute att, String index, String value, String orig) {
		if (index==null)
			return att.getName()+" = "+value;
		else
			return att.getName()+"["+index+"] = "+value;
	}

	@Override
	public String getInterfaceItemMessageText(AbstractInterfaceItem item, EObject abstractMsg, List<String> args, String index, String orig) {
		if (!(abstractMsg instanceof Message))
			return orig;
		
		Message msg = (Message) abstractMsg;
		
		StringBuilder argtext = new StringBuilder();
		for (String arg : args) {
			argtext.append(", "+arg);
		}
		String argtext2 = argtext.length()==0? "" : argtext.substring(2);

		String result = orig;
		if (item instanceof Port) {
			Port p = (Port) item;
			if (p.getProtocol() instanceof ProtocolClass) {

				ProtocolClass pc = (ProtocolClass) p.getProtocol();
				if (pc.getCommType()==CommunicationType.EVENT_DRIVEN) {
					if (p.getMultiplicity()==1)
						result = item.getName()+"_"+msg.getName()+"("+argtext2+")";
					else {
						if (index==null)
							result = item.getName()+"_"+msg.getName()+"_broadcast("+argtext2+")";
						else
							result = item.getName()+"_"+msg.getName()+"("+index+argtext+")";
					}
				}
				else if (pc.getCommType()==CommunicationType.DATA_DRIVEN) {
					if (p.isConjugated())
						result = item.getName()+"_"+msg.getName()+"("+argtext2+")";
					else
						result = item.getName()+"_"+msg.getName();
				}
			}
		}
		else if (item instanceof SAP) {
			result = item.getName()+"_"+msg.getName()+"("+argtext2+")";
		}
		else if (item instanceof SPP) {
			if (index==null)
				result = item.getName()+"_"+msg.getName()+"_broadcast("+argtext2+")";
			else
				result = item.getName()+"_"+msg.getName()+"("+index+argtext+")";
		}
		
		return result;
	}

	@Override
	public String getInterfaceItemMessageValue(InterfaceItem item, Message msg, String orig) {
		String result = orig;
		if (item instanceof Port) {
			result = item.getName()+"_"+msg.getName();
		}
		return result;
	}

	/* (non-Javadoc)
	 * @see org.eclipse.etrice.generator.base.DefaultTranslationProvider#getInterfaceItemOperationText(org.eclipse.etrice.core.fsm.fSM.AbstractInterfaceItem, org.eclipse.etrice.core.room.PortOperation, java.util.List, java.lang.String)
	 */
	@Override
	public String getInterfaceItemOperationText(AbstractInterfaceItem item,
			PortOperation op, List<String> args, String orig) {
		
		StringBuilder argtext = new StringBuilder();
		for (String arg : args) {
			argtext.append(", "+arg);
		}
		String argtext2 = argtext.length()==0? "" : argtext.substring(2);

		return item.getName()+"_"+op.getName()+"("+argtext2+")";
	}
	
	@Override
	public boolean translateTags() {
		return true;
	}

	@Override
	public String translateTag(String tag, DetailCode code) {
		if (tag.equals("ifitem.index"))
			return "ifitem_index";

		return super.translateTag(tag, code);
	}

	@Override
	public boolean translateEnums() {
		return true;
	}

	@Override
	public String getEnumText(EnumLiteral literal) {
		EnumerationType et = (EnumerationType) literal.eContainer();
		return getTranslationSwitch(et.getName()+" dot "+literal.getName(), et.getName()+"_"+literal.getName());
	}
	
	private String getTranslationSwitch(String orig, String translated) {
		return "\n#ifdef ET_USE_ORIG_CODE\n"+orig +"\n#else\n"+translated+"\n#endif\n";
	}

}

Back to the top