/**
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership.
*/
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package org.thingml.compilers.c;
import org.sintef.thingml.*;
import org.thingml.compilers.Context;
import org.thingml.compilers.NetworkLibraryGenerator;
import org.thingml.compilers.c.plugin.CByteArraySerializer;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Set;
/**
*
* @author sintef
*/
public abstract class CNetworkLibraryGenerator extends NetworkLibraryGenerator {
public CNetworkLibraryGenerator(Configuration cfg, CCompilerContext ctx) {
super(cfg, ctx);
}
public CNetworkLibraryGenerator(Configuration cfg, Context ctx, Set<ExternalConnector> ExternalConnectors) {
super(cfg, ctx, ExternalConnectors);
}
/*
* ----------- public abstract void generateNetworkLibrary(); --------------------
* For each External Connector the implemented function must generate a file named Instance_port_PORT_NAME.c (and .h)
* including at least the following functions:
* -> void PORT_NAME_set_listener_id(uint16_t id);
* -> void PORT_NAME_setup();
* -> void PORT_NAME_start_receiver_process() ;
* -> void PORT_NAME_forwardMessage(char * msg, int length);
* Note that this last one can have additional parameters if they are correctly handled by generateMessageForwarders
*/
public boolean isGeneratingCpp() {
return false;
}
public String getCppNameScope() {
return "";
}
@Override
final public void generateMessageForwarders(StringBuilder builder) {
System.out.println("CNetworkLibraryGenerator::generateMessageForwarders() ERROR This method shall not be called in the C-compiler. Use method with headerbuilder.");
}
public void generateMessageForwarders(StringBuilder builder, StringBuilder headerbuilder) {
CCompilerContext ctx = (CCompilerContext) this.ctx;
CByteArraySerializer ser = new CByteArraySerializer(ctx, cfg);
for (ExternalConnector eco : this.getExternalConnectors()) {
//if (AnnotatedElementHelper.hasAnnotation(eco, "c_external_send")) {
Thing t = eco.getInst().getInstance().getType();
Port p = eco.getPort();
for (Message m : p.getSends()) {
Set<String> ignoreList = new HashSet<String>();
headerbuilder.append("// Forwarding of messages " + eco.getName() + "::" + t.getName() + "::" + p.getName() + "::" + m.getName() + "\n");
headerbuilder.append("void " + getCppNameScope() + "forward_" + eco.getName() + "_" + ctx.getSenderName(t, p, m));
ctx.appendFormalParameters(t, headerbuilder, m);
headerbuilder.append(";\n");
builder.append("// Forwarding of messages " + eco.getName() + "::" + t.getName() + "::" + p.getName() + "::" + m.getName() + "\n");
builder.append("void " + getCppNameScope() + "forward_" + eco.getName() + "_" + ctx.getSenderName(t, p, m));
ctx.appendFormalParameters(t, builder, m);
builder.append("{\n");
ser.generateMessageSerialzer(eco, m, builder, "forward_buf", new LinkedList<Parameter>());
//ctx.generateSerializationForForwarder(m, builder, ctx.getHandlerCode(cfg, m), ignoreList);
builder.append("\n//Forwarding with specified function \n");
builder.append(eco.getName() + "_forwardMessage(forward_buf, " + (ctx.getMessageSerializationSize(m) - 2) + ");\n");
//builder.append(AnnotatedElementHelper.annotation(eco, "c_external_send").iterator().next() + "(forward_buf, " + (ctx.getMessageSerializationSize(m) - 2) + ");\n");
builder.append("}\n\n");
}
}
}
public void generateMessageForwarders(StringBuilder builder, CMessageSerializer ser) {
CCompilerContext ctx = (CCompilerContext) this.ctx;
for (ExternalConnector eco : this.getExternalConnectors()) {
//if (AnnotatedElementHelper.hasAnnotation(eco, "c_external_send")) {
Thing t = eco.getInst().getInstance().getType();
Port p = eco.getPort();
for (Message m : p.getSends()) {
Set<String> ignoreList = new HashSet<String>();
builder.append("// Forwarding of messages " + eco.getName() + "::" + t.getName() + "::" + p.getName() + "::" + m.getName() + "\n");
builder.append("void forward_" + eco.getName() + "_" + ctx.getSenderName(t, p, m));
ctx.appendFormalParameters(t, builder, m);
builder.append("{\n");
ser.generateMessageSerialzer(eco, m, builder, "forward_buf", new LinkedList<Parameter>());
//ctx.generateSerializationForForwarder(m, builder, ctx.getHandlerCode(cfg, m), ignoreList);
builder.append("\n//Forwarding with specified function \n");
builder.append(eco.getName() + "_forwardMessage(forward_buf, " + (ctx.getMessageSerializationSize(m) - 2) + ");\n");
//builder.append(AnnotatedElementHelper.annotation(eco, "c_external_send").iterator().next() + "(forward_buf, " + (ctx.getMessageSerializationSize(m) - 2) + ");\n");
builder.append("}\n\n");
}
}
}
}