#!/bin/sh
# $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
# Make Giotto Code Gen Java files
# Given a .giotto file, create .java stub files
#

if [ $# -ne 1 ]; then
    echo "$0: Usage: $0 giottofile"
    exit 3
fi	

giottoFile=$1
if [ ! -r "$giottoFile" ]; then
    echo "$0: $giottoFile is not readable"
    exit 4
fi

basename=`basename $giottoFile .giotto`
if [ ! -d $basename ]; then
    mkdir $basename
fi

# Create the Token_port.java
token_portFileName=$basename/Token_port.java
echo $token_portFileName
  cat > $token_portFileName <<EOF
/* Token_port
*/

package $basename;

import giotto.functionality.code.int_port;
import giotto.functionality.interfaces.PortVariable;

import java.io.Serializable;

/**
Token_port.
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class Token_port extends int_port implements PortVariable, Serializable {
}
EOF

# Create copy_Token_port.java
copy_Token_portFileName=$basename/copy_Token_port.java
echo $copy_Token_portFileName
  cat > $copy_Token_portFileName <<EOF
/* copy_Token_port
*/

package $basename;

import giotto.functionality.code.copy_int_port;
import giotto.functionality.interfaces.DriverInterface;
import giotto.functionality.table.Parameter;

import java.io.Serializable;

/**
copy_Token_port
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class copy_Token_port extends copy_int_port implements DriverInterface, Serializable {

    /**
     * @see giotto.functionality.interfaces.DriverInterface#run(Parameter)
     */
    public void run(Parameter parameter) {
        System.out.println("copy_Token_port " + parameter);  
        super.run(parameter);
    }
}
EOF

# Create the task files
tasks=`grep schedule $giottoFile | awk '{split($2,f,"("); print f[1]}'`
for task in $tasks
do
  taskFileName=$basename/$task.java

  echo "$taskFileName"
  cat > $taskFileName <<EOF1
/* Task for $task in $basename giotto model.
*/

package $basename;

import giotto.functionality.interfaces.TaskInterface;
import giotto.functionality.table.Parameter;

import java.io.Serializable;

/**
Task for $task in $basename giotto model.
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class $task implements TaskInterface, Serializable {

    /**
     * @see giotto.functionality.interfaces.DriverInterface#run(Parameter)
     */
    public void run(Parameter parameter) {
        System.out.println("$task " + parameter);
        //((PortMove)p.getPortVariable(1)).setIntValue(idle);
        //((PortDoor)p.getPortVariable(2)).setIntValue(idle);
        //                JElevator.elIdle((Buttons)p.getPortVariable(0), (Move)p.getPortVariable(1), (Door)p.getPortVariable(2));
    }
}
EOF1
done

# Create the driver
drivers1=`egrep "^driver" $giottoFile | 
    awk '{ if ($2 ~ /\(/) {
            split($2, f, "(")
            print substr(f[1], 1, length(f[1]) - length("driver"))"inputdriver"
           } else {
            print substr($2, 1, length($2) - length("driver"))"inputdriver"
           }

    }'`
drivers2=`egrep ":=" $giottoFile | awk '{print substr($4, 1, length($4)-1)}'`

# Handle sensors like "    real_port  positionX   uses GetPosX;"
drivers3=`egrep "uses" $giottoFile | awk '{print substr($4, 1, length($4)-1)}'`

# Get one filename per line
drivers="`echo $drivers1 $drivers2 $drivers3 | awk '{for(i=1;i<=NF;i++) {print $i}}'`"
for driver in $drivers
do
  driverFileName=$basename/$driver.java

  echo "$driverFileName"
  cat > $driverFileName <<EOF2
/* Driver for $driver in $basename giotto model.
*/

package $basename;

import giotto.functionality.interfaces.DriverInterface;
import giotto.functionality.table.Parameter;

import java.io.Serializable;

/**
Driver for $driver in $basename giotto model.
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class $driver implements DriverInterface, Serializable {

    /**
     * @see giotto.functionality.interfaces.DriverInterface#run(Parameter)
     */
    public void run(Parameter parameter) {
        System.out.println("$driver " + parameter);  
        //giotto.functionality.code.elevator.PortMove m0 = (giotto.functionality.code.elevator.PortMove)parameter.getPortVariable(0);
        //giotto.functionality.code.elevator.PortMove m1 = (giotto.functionality.code.elevator.PortMove)parameter.getPortVariable(1);
        //m1.copyValueFrom(m0);
    }
}
EOF2
done

# Create the port files
ports=`egrep 'uses|:=' $giottoFile | awk '{print $1}' | sort | uniq`
for port in $ports
do
  portFileName=$basename/$port.java

  echo "$portFileName"
  cat > $portFileName <<EOF1
/* Port for $port in $basename giotto model.
*/

package $basename;

import giotto.functionality.interfaces.PortVariable;

import java.io.Serializable;

/**
$port in $basename giotto model.
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class $port implements PortVariable, Serializable {

    public void copyValueFrom(PortVariable source) {
        //_value = ((real_port)source).getFloatValue();
    }

    //private float _value;

}
EOF1



  portFileName=$basename/copy_$port.java

  echo "$portFileName"
  cat > $portFileName <<EOF5
/* copy_$port
*/

package $basename;

import giotto.functionality.code.copy_int_port;
import giotto.functionality.interfaces.DriverInterface;
import giotto.functionality.table.Parameter;

import java.io.Serializable;

/**
copy_$port
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class copy_$port extends copy_int_port implements DriverInterface, Serializable {

    /**
     * @see giotto.functionality.interfaces.DriverInterface#run(Parameter)
     */
    public void run(Parameter parameter) {
        System.out.println("copy_$port_port " + parameter);  
        super.run(parameter);
    }
}
EOF5
done


# Create the condition files
conditions=`egrep "^[	]*if " $giottoFile | awk '{split($2, f ,"("); print f[1]}' | sort | uniq` 
for condition in $conditions
do
  conditionFileName=$basename/$condition.java

  echo "$conditionFileName"
  cat > $conditionFileName <<EOF6
/* $condition
*/

package $basename;

import giotto.functionality.code.BaseCondition;
import giotto.functionality.interfaces.ConditionInterface;
import giotto.functionality.table.Parameter;

import java.io.Serializable;

/**
$condition
<p>Created by $PTII/ptolemy/domains/gr/kernel/mkGiottoCGJava.
@author $USERNAME
@version $Id: mkGiottoCGJava,v 1.5 2005/02/05 03:07:13 cxh Exp $
@since `date`
*/
public class $condition extends BaseCondition implements ConditionInterface, Serializable {

    /**
     * @see giotto.functionality.interfaces.ConditionInterface#run(Parameter)
     */
    public boolean run(Parameter parameter) {
        System.out.println("condition $condition " + parameter);  
        if (super.run(parameter)) {
            return true;
        }
        return false;
    }
}
EOF6
done