diff --git a/sw/tools/create_module/create_mod_qt.py b/sw/tools/create_module/create_mod_qt.py index e53922ad04..5d63a24259 100755 --- a/sw/tools/create_module/create_mod_qt.py +++ b/sw/tools/create_module/create_mod_qt.py @@ -91,6 +91,10 @@ class CreateModGUI(Ui_CreateModule_Window): author = self.author_edit.text() email = self.email_edit.text() description = unidecode.unidecode(self.description_edit.toPlainText()) + task = self.task_combo.currentText() + depends = self.depends_edit.text() + provides = self.provides_edit.text() + conflicts = self.conflicts_edit.text() self.description_edit.setPlainText(description) if name == "" or author == "" or description == "" or email == "": self.statusbar.showMessage("Please fill the name, author, mail and description!") @@ -98,9 +102,13 @@ class CreateModGUI(Ui_CreateModule_Window): return fc.name = name fc.directory = directory + fc.task = task fc.description = description fc.author = author fc.email = email + fc.depends = depends + fc.provides = provides + fc.conflicts = conflicts for comp in self.components: if comp.comp_type == "Init": diff --git a/sw/tools/create_module/create_module_ui.py b/sw/tools/create_module/create_module_ui.py index adfb1d3783..10e3cceab2 100644 --- a/sw/tools/create_module/create_module_ui.py +++ b/sw/tools/create_module/create_module_ui.py @@ -21,6 +21,11 @@ class Ui_CreateModule_Window(object): self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") self.label = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth()) + self.label.setSizePolicy(sizePolicy) self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) self.name_edit = QtWidgets.QLineEdit(self.centralwidget) @@ -30,13 +35,43 @@ class Ui_CreateModule_Window(object): self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName("horizontalLayout_2") self.label_2 = QtWidgets.QLabel(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth()) + self.label_2.setSizePolicy(sizePolicy) self.label_2.setObjectName("label_2") self.horizontalLayout_2.addWidget(self.label_2) self.directory_combo = QtWidgets.QComboBox(self.centralwidget) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.directory_combo.sizePolicy().hasHeightForWidth()) + self.directory_combo.setSizePolicy(sizePolicy) self.directory_combo.setEditable(True) self.directory_combo.setObjectName("directory_combo") self.horizontalLayout_2.addWidget(self.directory_combo) self.horizontalLayout_6.addLayout(self.horizontalLayout_2) + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() + self.horizontalLayout_8.setObjectName("horizontalLayout_8") + self.label_7 = QtWidgets.QLabel(self.centralwidget) + self.label_7.setObjectName("label_7") + self.horizontalLayout_8.addWidget(self.label_7) + self.task_combo = QtWidgets.QComboBox(self.centralwidget) + self.task_combo.setObjectName("task_combo") + self.task_combo.addItem("") + self.task_combo.setItemText(0, "") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.task_combo.addItem("") + self.horizontalLayout_8.addWidget(self.task_combo) + self.horizontalLayout_6.addLayout(self.horizontalLayout_8) self.horizontalLayout_15 = QtWidgets.QHBoxLayout() self.horizontalLayout_15.setObjectName("horizontalLayout_15") self.label_12 = QtWidgets.QLabel(self.centralwidget) @@ -73,6 +108,28 @@ class Ui_CreateModule_Window(object): self.horizontalLayout_3.addWidget(self.email_edit) self.horizontalLayout_5.addLayout(self.horizontalLayout_3) self.verticalLayout.addLayout(self.horizontalLayout_5) + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() + self.horizontalLayout_9.setObjectName("horizontalLayout_9") + self.label_9 = QtWidgets.QLabel(self.centralwidget) + self.label_9.setObjectName("label_9") + self.horizontalLayout_9.addWidget(self.label_9) + self.depends_edit = QtWidgets.QLineEdit(self.centralwidget) + self.depends_edit.setObjectName("depends_edit") + self.horizontalLayout_9.addWidget(self.depends_edit) + self.label_10 = QtWidgets.QLabel(self.centralwidget) + self.label_10.setObjectName("label_10") + self.horizontalLayout_9.addWidget(self.label_10) + self.provides_edit = QtWidgets.QLineEdit(self.centralwidget) + self.provides_edit.setObjectName("provides_edit") + self.horizontalLayout_9.addWidget(self.provides_edit) + self.label_11 = QtWidgets.QLabel(self.centralwidget) + self.label_11.setObjectName("label_11") + self.horizontalLayout_9.addWidget(self.label_11) + self.conflicts_edit = QtWidgets.QLineEdit(self.centralwidget) + self.conflicts_edit.setText("") + self.conflicts_edit.setObjectName("conflicts_edit") + self.horizontalLayout_9.addWidget(self.conflicts_edit) + self.verticalLayout.addLayout(self.horizontalLayout_9) self.label_3 = QtWidgets.QLabel(self.centralwidget) self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3) @@ -99,7 +156,7 @@ class Ui_CreateModule_Window(object): self.components_area.setWidgetResizable(True) self.components_area.setObjectName("components_area") self.scrollAreaWidgetContents = QtWidgets.QWidget() - self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 859, 356)) + self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 859, 316)) self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents") self.scroll_area_layout = QtWidgets.QVBoxLayout(self.scrollAreaWidgetContents) self.scroll_area_layout.setObjectName("scroll_area_layout") @@ -150,11 +207,24 @@ class Ui_CreateModule_Window(object): CreateModule_Window.setWindowTitle(_translate("CreateModule_Window", "Create Module")) self.label.setText(_translate("CreateModule_Window", "Module name")) self.label_2.setText(_translate("CreateModule_Window", "Directory")) + self.label_7.setText(_translate("CreateModule_Window", "Task")) + self.task_combo.setItemText(1, _translate("CreateModule_Window", "mcu")) + self.task_combo.setItemText(2, _translate("CreateModule_Window", "core")) + self.task_combo.setItemText(3, _translate("CreateModule_Window", "sensors")) + self.task_combo.setItemText(4, _translate("CreateModule_Window", "estimation")) + self.task_combo.setItemText(5, _translate("CreateModule_Window", "radio_control")) + self.task_combo.setItemText(6, _translate("CreateModule_Window", "control")) + self.task_combo.setItemText(7, _translate("CreateModule_Window", "actuators")) + self.task_combo.setItemText(8, _translate("CreateModule_Window", "datalink")) + self.task_combo.setItemText(9, _translate("CreateModule_Window", "default")) self.label_12.setText(_translate("CreateModule_Window", "Licence")) self.licence_comboBox.setItemText(0, _translate("CreateModule_Window", "GPLv2")) self.licence_comboBox.setItemText(1, _translate("CreateModule_Window", "None")) self.label_4.setText(_translate("CreateModule_Window", "Author")) self.label_5.setText(_translate("CreateModule_Window", "email")) + self.label_9.setText(_translate("CreateModule_Window", "Depends")) + self.label_10.setText(_translate("CreateModule_Window", "Provides")) + self.label_11.setText(_translate("CreateModule_Window", "Conflicts")) self.label_3.setText(_translate("CreateModule_Window", "Description")) self.label_6.setText(_translate("CreateModule_Window", "Add element :")) self.init_button.setText(_translate("CreateModule_Window", "Init")) diff --git a/sw/tools/create_module/create_module_ui.ui b/sw/tools/create_module/create_module_ui.ui index 36d91db938..430c0b98b3 100644 --- a/sw/tools/create_module/create_module_ui.ui +++ b/sw/tools/create_module/create_module_ui.ui @@ -16,11 +16,17 @@ - + + + + 0 + 0 + + Module name @@ -35,6 +41,12 @@ + + + 0 + 0 + + Directory @@ -42,6 +54,12 @@ + + + 0 + 0 + + true @@ -49,6 +67,71 @@ + + + + + + Task + + + + + + + + + + + + + mcu + + + + + core + + + + + sensors + + + + + estimation + + + + + radio_control + + + + + control + + + + + actuators + + + + + datalink + + + + + default + + + + + + @@ -111,6 +194,44 @@ + + + + + + Depends + + + + + + + + + + Provides + + + + + + + + + + Conflicts + + + + + + + + + + + + @@ -165,7 +286,7 @@ 0 0 859 - 356 + 316 diff --git a/sw/tools/create_module/files_create.py b/sw/tools/create_module/files_create.py index 2cdb48b355..c0c6011204 100644 --- a/sw/tools/create_module/files_create.py +++ b/sw/tools/create_module/files_create.py @@ -2,6 +2,7 @@ import os from lxml import etree from collections import namedtuple +import datetime PPRZ_SRC = os.getenv("PAPARAZZI_SRC") @@ -46,9 +47,14 @@ class FilesCreate: self.src = "" self._name = "" self._directory = "" + self._task = "" self._description = "" self._author = "" self._email = "" + self._year = datetime.datetime.now().year + self._depends = "" + self._provides = "" + self._conflicts = "" self.inits = [] self.periodics = [] self.events = [] @@ -73,6 +79,16 @@ class FilesCreate: def directory(self, d): self._directory = d.lower() + @property + def task(self): + if self._task == "": + return None + return self._task + + @task.setter + def task(self, t): + self._task = t + @property def description(self): return self._description @@ -97,6 +113,44 @@ class FilesCreate: def email(self, email): self._email = "<{}>".format(email) + @property + def year(self): + return self._year + + @property + def depends(self): + if self._depends == "": + return None + return self._depends + + @depends.setter + def depends(self, depends): + self._depends = depends + + @property + def provides(self): + if self._provides == "": + return None + return self._provides + + @provides.setter + def provides(self, provides): + self._provides = provides + + @property + def conflicts(self): + if self._conflicts == "": + return None + return self._conflicts + + @conflicts.setter + def conflicts(self, conflicts): + self._conflicts = conflicts + + def has_dep(self): + # at least one is not empty + return self._depends != "" or self._provides != "" or self._conflicts != "" + def add_init(self, fun): fun = fun.strip("()") self.inits.append(Init(fun=fun)) @@ -135,12 +189,31 @@ class FilesCreate: self.xml.attrib["name"] = self.name # set directory self.xml.attrib["dir"] = self.directory - #set description + # set task + if self.task is not None: + self.xml.attrib["task"] = self.task + # set description description = etree.Element("description") description.text = self.description doc = etree.Element("doc") doc.append(description) self.xml.append(doc) + # set dependencies + if self.has_dep(): + dep = etree.Element("dep") + if self.depends is not None: + depends = etree.Element("depends") + depends.text = self.depends + dep.append(depends) + if self.provides is not None: + provides = etree.Element("provides") + provides.text = self.provides + dep.append(provides) + if self.conflicts is not None: + conflicts = etree.Element("conflicts") + conflicts.text = self.conflicts + dep.append(conflicts) + self.xml.append(dep) # set header h_file = etree.Element("file") h_file.attrib["name"] = "{}.h".format(self.name) @@ -188,8 +261,8 @@ class FilesCreate: self.xml.append(makefile) def build_src(self, licence="GPLv2"): - cop = "/*\n * Copyright (C) {author} {email}\n{licence}\n */".format( - author=self.author, email=self.email, licence=LICENCES[licence]) + cop = "/*\n * Copyright (C) {year} {author} {email}\n{licence}\n */".format( + year=self.year, author=self.author, email=self.email, licence=LICENCES[licence]) description = "/** @file \"modules/{dir}/{name}.c\"\n * @author {author} {email}\n * {description}\n */".format( dir=self.directory, name=self.name, author=self.author, email=self.email, description=self.description) include = "#include \"modules/{dir}/{name}.h\"".format(dir=self.directory, name=self.name) @@ -221,7 +294,7 @@ class FilesCreate: self.src = "{}\n\n{}\n\n{}\n\n{}\n".format(cop, description, include, declarations) def build_header(self, licence="GPLv2"): - cop = "/*\n * Copyright (C) {author} {email}\n{licence}\n */".format(author=self.author, email=self.email, licence=LICENCES[licence]) + cop = "/*\n * Copyright (C) {year} {author} {email}\n{licence}\n */".format(year=self.year, author=self.author, email=self.email, licence=LICENCES[licence]) description = "/** @file \"modules/{dir}/{name}.h\"\n * @author {author} {email}\n * {description}\n */".format( dir=self.directory, name=self.name, author=self.author, email=self.email, description=self.description) includes = ""