Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend220
1 files changed, 211 insertions, 9 deletions
diff --git a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend
index 5376e0a2c..b31e51173 100644
--- a/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend
+++ b/plugins/org.eclipse.etrice.generator.doc/src/org/eclipse/etrice/generator/doc/gen/DocGen.xtend
@@ -14,9 +14,17 @@ package org.eclipse.etrice.generator.doc.gen
import com.google.inject.Inject
import com.google.inject.Singleton
+import java.util.List
+import java.io.File
import org.eclipse.etrice.core.room.RoomModel
import org.eclipse.etrice.core.room.Documentation
import org.eclipse.etrice.core.room.ActorClass
+import org.eclipse.etrice.core.room.ProtocolClass
+import org.eclipse.etrice.core.room.DataClass
+import org.eclipse.etrice.core.room.Operation
+import org.eclipse.etrice.core.room.Attribute
+import org.eclipse.etrice.core.room.Message
+import org.eclipse.etrice.core.room.StandardOperation
import org.eclipse.etrice.generator.base.ILogger
import org.eclipse.etrice.generator.base.IRoomGenerator
import org.eclipse.etrice.generator.etricegen.Root
@@ -41,37 +49,231 @@ class DocGen implements IRoomGenerator {
}
def generateModelDoc(Root root, RoomModel model) {'''
- \documentationclass[titlepage]{article}
- «model.name»
+ \documentclass[titlepage]{article}
+ \usepackage{graphicx}
+ \makeatletter
+ \newcommand\level[1]{%
+ \ifcase#1\relax\expandafter\chapter\or
+ \expandafter\section\or
+ \expandafter\subsection\or
+ \expandafter\subsubsection\else
+ \def\next{\@level{#1}}\expandafter\next
+ \fi}
+
+ \newcommand{\@level}[1]{%
+ \@startsection{level#1}
+ {#1}
+ {\z@}%
+ {-3.25ex\@plus -1ex \@minus -.2ex}%
+ {1.5ex \@plus .2ex}%
+ {\normalfont\normalsize\bfseries}}
+
+ \newdimen\@leveldim
+ \newdimen\@dotsdim
+ {\normalfont\normalsize
+ \sbox\z@{0}\global\@leveldim=\wd\z@
+ \sbox\z@{.}\global\@dotsdim=\wd\z@
+ }
+ \newcounter{level4}[subsubsection]
+ \@namedef{thelevel4}{\thesubsubsection.\arabic{level4}}
+ \@namedef{level4mark}#1{}
+ \def\l@section{\@dottedtocline{1}{0pt}{\dimexpr\@leveldim*4+\@dotsdim*1+6pt\relax}}
+ \def\l@subsection{\@dottedtocline{2}{0pt}{\dimexpr\@leveldim*5+\@dotsdim*2+6pt\relax}}
+ \def\l@subsubsection{\@dottedtocline{3}{0pt}{\dimexpr\@leveldim*6+\@dotsdim*3+6pt\relax}}
+ \@namedef{l@level4}{\@dottedtocline{4}{0pt}{\dimexpr\@leveldim*7+\@dotsdim*4+6pt\relax}}
+
+ \count@=4
+ \def\@ncp#1{\number\numexpr\count@+#1\relax}
+ \loop\ifnum\count@<100
+ \begingroup\edef\x{\endgroup
+ \noexpand\newcounter{level\@ncp{1}}[level\number\count@]
+ \noexpand\@namedef{thelevel\@ncp{1}}{%
+ \noexpand\@nameuse{thelevel\@ncp{0}}.\noexpand\arabic{level\@ncp{0}}}
+ \noexpand\@namedef{level\@ncp{1}mark}####1{}%
+ \noexpand\@namedef{l@level\@ncp{1}}%
+ {\noexpand\@dottedtocline{\@ncp{1}}{0pt}{\the\dimexpr\@leveldim*\@ncp{5}+\@dotsdim*\@ncp{0}\relax}}}%
+ \x
+ \advance\count@\@ne
+ \repeat
+ \makeatother
+ \setcounter{secnumdepth}{100}
+ \setcounter{tocdepth}{100}
+
+
+ \title{«model.name» Modeldocumentation}
+ \date{\today}
+ \author{generated by eTrice}
+
+ \begin{document}
+ \pagestyle{plain}
+ \maketitle
+ \tableofcontents
+
+ \newpage
+ \listoffigures
+ \newpage
+ \section{Modeldescription}
+ «model.docu.generateDocText»
+
+ \section{Protocol Class Description}
+ «root.generateAllProtocolClassDocs(model)»
+ \section{Data Class Description}
+ «root.generateAllDataClassDocs(model)»
+ \section{Actor Class Description}
«root.generateAllActorClassDocs(model)»
+
\end{document}
'''
}
+
+ def generateAllDataClassDocs(Root root, RoomModel model){'''
+ «FOR dc : model.dataClasses»
+ «root.generateDataClassDoc(dc)»
+ «ENDFOR»
+ '''}
+ def generateDataClassDoc(Root root, DataClass dc) {'''
+ \subsection {«dc.name»}
+ «dc.docu.generateDocText»
+ \level{3}{Attributes}
+ «dc.attributes.generateAttributesDoc»
+
+ \level{3}{Operations}
+ «dc.operations.generateOperationsDoc»
+ '''
+ }
+
+ def generateAllProtocolClassDocs(Root root, RoomModel model) {'''
+ «FOR pc : model.protocolClasses»
+ «root.generateProtocolClassDoc(pc)»
+ «ENDFOR»
+ '''
+ }
+
+ def generateProtocolClassDoc(Root root, ProtocolClass pc) {'''
+ \subsection {«pc.name»}
+ «pc.docu.generateDocText»
+ \level{3}{Incoming Messages}
+
+ \begin{tabular}[ht]{|l|l|l|}
+ \hline
+ Message & Data & Description\\
+ «FOR ims : pc.allIncomingMessages»
+ \hline
+ «ims.name» & «IF ims.data != null» «ims.data.name» «ENDIF» & «ims.docu.generateDocText»\\
+ «ENDFOR»
+ \hline
+ \end{tabular}
+
+ \level{3}{Outgoing Messages}
+ \begin{tabular}[ht]{|l|l|l|}
+ \hline
+ Message & Data & Description\\
+ «FOR oms : pc.allOutgoingMessages»
+ \hline
+ «oms.name» & «IF oms.data != null» «oms.data.name» «ENDIF» & «oms.docu.generateDocText»\\
+ «ENDFOR»
+ \hline
+ \end{tabular}
+ '''
+ }
+
def generateAllActorClassDocs(Root root, RoomModel model) {'''
«FOR ac : model.actorClasses»
- «root.generateActorClassDoc(ac)»
+ «root.generateActorClassDoc(model,ac)»
«ENDFOR»
'''
}
-
- def generateActorClassDoc(Root root, ActorClass ac) {'''
+ /*
+ «IF fileExists(ac.name) == "true"»
+ «ENDIF» */
+ def generateActorClassDoc(Root root, RoomModel model, ActorClass ac) {
+ var filename = model.docGenerationTargetPath + "images\\" + ac.name + ".jpg"
+ filename = filename.replaceAll("\\\\","/");
+ var filename1 = filename.replaceAll("/","//")
+ '''
\subsection{«ac.name»}
- «root.irgendwas(ac)»
«ac.docu.generateDocText»
- «ac.name»
+ \level{3}{Structure}
+
+ «IF fileExists(filename).equals("true")»
+ \begin{figure}[h]
+ \begin{center}
+ \includegraphics[scale=0.6]{«filename1»}
+ \caption{Blinky Toplevel Structure}
+ \end{center}
+ \end{figure}
+ «ENDIF»
+
+ \level{4}{Attributes}
+ «ac.attributes.generateAttributesDoc»
+
+ \level{3}{Behavior}
+ \level{4}{Operations}
+ «ac.operations.generateOperationsDoc»
+ \level{4}{Statemachine}
'''
}
+ def generateAttributesDoc(List<Attribute> attributes) {
+ '''
+ «IF !attributes.empty»
+ \begin{tabular}[ht]{|l|l|l|}
+ \hline
+ Name & Type & Description\\
+ «FOR at : attributes»
+ \hline
+ «at.name» & «at.refType.type.name» & «generateDocText(at.docu)»\\
+ «ENDFOR»
+ \hline
+ \end{tabular}
+ «ENDIF»
+ '''
+ }
+
+ def generateOperationsDoc(List<StandardOperation> operations) {
+ '''
+ «FOR op : operations»
+ \begin{tabular}[ht]{|l|l|}
+ \hline
+ Name: & «op.name»\\
+ \hline
+ ReturnType: & «IF op.returntype != null»«op.returntype.type.name»«ELSE»void«ENDIF»\\
+ \hline
+ Arguments: & «FOR pa : op.arguments SEPARATOR ", "»«pa.name»:«pa.refType.type.name»«ENDFOR»\\
+ «IF op.docu != null»
+ \hline
+ \multicolumn{2} {|l|} {«generateDocText(op.docu)»}\\
+ «ENDIF»
+ \hline
+ \end{tabular}
+ \newline\newline\newline
+ «ENDFOR»
+ '''
+ }
+
def generateDocText(Documentation doc){'''
«IF doc!=null»
- Documentation: «doc.text.join(" ///// ")»
+ «doc.text.join()»
«ENDIF»
'''
}
+ def fileExists(String f){
+ val exist = (new File(f)).exists();
+ if (exist == true) {
+ // File or directory exists
+ logger.logInfo("File found ! " + f);
+ return "true"
+ } else {
+ // File or directory does not exist
+ logger.logInfo("File not found ! " + f);
+ return "false"
+ }
+ }
+
+
def irgendwas(Root root, ActorClass ac){
return ac.name + ".bla"
}
-
} \ No newline at end of file

Back to the top