Search in sources :

Example 1 with CustomDeviceExpander

use of com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander in project tcMenu by davetcc.

the class IoExpanderDefinitionTest method testCustomDeviceExpander.

@Test
public void testCustomDeviceExpander() {
    var device = IoExpanderDefinition.fromString("customIO:superDuper").orElseThrow();
    assertThat(device).isInstanceOf(CustomDeviceExpander.class);
    var custom = (CustomDeviceExpander) device;
    assertEquals("superDuper", custom.getVariableName());
    assertEquals("superDuper", custom.getId());
    assertEquals("Custom IO: superDuper", custom.getNicePrintableName());
    assertThat(custom.generateCode()).isEmpty();
    assertThat(custom.generateGlobal()).isEmpty();
    assertEquals("extern IoAbstractionRef superDuper;", custom.generateExport().orElseThrow());
    assertThat(custom.generateHeader()).contains(new HeaderDefinition("IoAbstraction.h", GLOBAL, PRIORITY_NORMAL, new AlwaysApplicable()));
    assertEquals("customIO:superDuper", custom.toString());
    var device2 = IoExpanderDefinition.fromString("anotherExpander").orElseThrow();
    assertThat(device2).isInstanceOf(CustomDeviceExpander.class);
    assertEquals("anotherExpander", device2.getVariableName());
    assertNotEquals(custom, device2);
    var device3 = IoExpanderDefinition.fromString("customIO:superDuper").orElseThrow();
    assertEquals(custom, device3);
}
Also used : CustomDeviceExpander(com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander) HeaderDefinition(com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition) AlwaysApplicable(com.thecoderscorner.menu.editorui.generator.applicability.AlwaysApplicable) Test(org.junit.jupiter.api.Test)

Example 2 with CustomDeviceExpander

use of com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander in project tcMenu by davetcc.

the class ArduinoGeneratorTest method runConversionWith.

@SuppressWarnings("unchecked")
private void runConversionWith(EmbeddedPlatform platform, String templateToUse, boolean recursiveName) throws IOException {
    ArduinoSketchFileAdjuster adjuster = Mockito.mock(ArduinoSketchFileAdjuster.class);
    MenuTree tree = buildSimpleTreeReadOnly();
    ArduinoLibraryInstaller installer = Mockito.mock(ArduinoLibraryInstaller.class);
    when(installer.statusOfAllLibraries()).thenReturn(new LibraryStatus(true, true, true, true));
    var standardOptions = new CodeGeneratorOptionsBuilder().withPlatform(ARDUINO32.getBoardId()).withEepromDefinition(new AVREepromDefinition()).withAuthenticationDefinition(new EepromAuthenticatorDefinition(100, 3)).withExpanderDefinitions(new IoExpanderDefinitionCollection(List.of(new CustomDeviceExpander("123")))).withAppName("app").withNewId(UUID.fromString("4490f2fb-a48b-4c89-b6e5-7f557e5f6faf")).withRecursiveNaming(recursiveName).codeOptions();
    ArduinoGenerator generator = new ArduinoGenerator(adjuster, installer, platform);
    var firstPlugin = pluginConfig.getPlugins().get(0);
    firstPlugin.getProperties().stream().filter(p -> p.getName().equals("SWITCH_IODEVICE")).findFirst().ifPresent(p -> p.setLatestValue("io23017"));
    assertTrue(generator.startConversion(projectDir, pluginConfig.getPlugins(), tree, List.of(), standardOptions));
    VariableNameGenerator gen = new VariableNameGenerator(tree, false, Set.of());
    assertEquals("GenState", gen.makeNameToVar(generateItemWithName("Gen &^%State")));
    assertEquals("ChannelÖôóò", gen.makeNameToVar(generateItemWithName("ChannelÖôóò")));
    var cppGenerated = new String(Files.readAllBytes(projectDir.resolve(projectDir.getFileName() + "_menu.cpp")));
    var hGenerated = new String(Files.readAllBytes(projectDir.resolve(projectDir.getFileName() + "_menu.h")));
    var pluginGeneratedH = new String(Files.readAllBytes(projectDir.resolve("source.h")));
    var pluginGeneratedCPP = new String(Files.readAllBytes(projectDir.resolve("source.cpp")));
    var cppTemplate = new String(Objects.requireNonNull(getClass().getResourceAsStream(templateToUse + ".cpp")).readAllBytes());
    var hTemplate = new String(Objects.requireNonNull(getClass().getResourceAsStream(templateToUse + ".h")).readAllBytes());
    cppGenerated = cppGenerated.replaceAll("#include \"tcmenu[^\"]*\"", "replacedInclude");
    cppTemplate = cppTemplate.replaceAll("#include \"tcmenu[^\"]*\"", "replacedInclude");
    // these files should line up. IF they do not because of the change in the ArduinoGenerator,
    // then make sure the change is good before adjusting the templates.
    assertEqualsIgnoringCRLF(cppTemplate, cppGenerated);
    assertEqualsIgnoringCRLF(hTemplate, hGenerated);
    assertEqualsIgnoringCRLF("CPP_FILE_CONTENT 10 otherKey", pluginGeneratedCPP);
    assertEqualsIgnoringCRLF("H_FILE_CONTENT 10 otherKey", pluginGeneratedH);
    Mockito.verify(adjuster).makeAdjustments(any(BiConsumer.class), eq(projectDir.resolve(projectDir.resolve(projectDir.getFileName() + ".ino")).toString()), eq(projectDir.getFileName().toString()), anyCollection());
}
Also used : MenuTree(com.thecoderscorner.menu.domain.state.MenuTree) AVREepromDefinition(com.thecoderscorner.menu.editorui.generator.parameters.eeprom.AVREepromDefinition) EepromAuthenticatorDefinition(com.thecoderscorner.menu.editorui.generator.parameters.auth.EepromAuthenticatorDefinition) CodeGeneratorOptionsBuilder(com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptionsBuilder) LibraryStatus(com.thecoderscorner.menu.editorui.generator.util.LibraryStatus) CustomDeviceExpander(com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander) IoExpanderDefinitionCollection(com.thecoderscorner.menu.editorui.generator.parameters.IoExpanderDefinitionCollection) VariableNameGenerator(com.thecoderscorner.menu.editorui.generator.core.VariableNameGenerator) BiConsumer(java.util.function.BiConsumer)

Example 3 with CustomDeviceExpander

use of com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander in project tcMenu by davetcc.

the class GenerateCodeDialog method ensureIoFullyDeclared.

private void ensureIoFullyDeclared(CodePluginItem pluginItem) {
    logger.log(INFO, "Checking for unmapped IO devices: " + pluginItem.getDescription());
    var codeOptions = project.getGeneratorOptions();
    // find any IO device declarations that do not match to an entry in the expanders
    var anyIoWithoutEntries = pluginItem.getProperties().stream().filter(prop -> prop.getValidationRules() instanceof IoExpanderPropertyValidationRules).filter(prop -> codeOptions.getExpanderDefinitions().getDefinitionById(prop.getLatestValue()).isEmpty()).toList();
    // nothing to do if list is empty
    if (anyIoWithoutEntries.isEmpty()) {
        logger.log(INFO, "All IO devices mapped");
        return;
    }
    var allExpanders = new HashSet<>(codeOptions.getExpanderDefinitions().getAllExpanders());
    // now we iterate through the unmapped expanders, which must be from prior to the automated support.
    for (var customIo : anyIoWithoutEntries) {
        if (StringHelper.isStringEmptyOrNull(customIo.getLatestValue())) {
            // for empty strings, the previous assumption was using device IO. This is now explicitly defined
            // as deviceIO
            customIo.setLatestValue(InternalDeviceExpander.DEVICE_ID);
            logger.log(INFO, "Device being mapped as internal: " + customIo.getLatestValue());
        } else {
            // otherwise, previously the assumption was using a custom defined expander in the sketch, now we'll
            // actually add that to the sketch.
            allExpanders.add(new CustomDeviceExpander(customIo.getLatestValue()));
            logger.log(INFO, "Device being mapped as custom: " + customIo.getLatestValue());
        }
    }
    project.setGeneratorOptions(new CodeGeneratorOptionsBuilder().withExisting(codeOptions).withExpanderDefinitions(new IoExpanderDefinitionCollection(allExpanders)).codeOptions());
    logger.log(INFO, "Done mapping all IO devices");
}
Also used : EmbeddedPlatforms(com.thecoderscorner.menu.editorui.generator.plugin.EmbeddedPlatforms) HPos(javafx.geometry.HPos) javafx.scene.layout(javafx.scene.layout) javafx.scene.control(javafx.scene.control) BaseDialogSupport(com.thecoderscorner.menu.editorui.dialog.BaseDialogSupport) CreatorProperty(com.thecoderscorner.menu.editorui.generator.core.CreatorProperty) CHANGE(com.thecoderscorner.menu.editorui.generator.ui.UICodePluginItem.UICodeAction.CHANGE) IoExpanderPropertyValidationRules(com.thecoderscorner.menu.editorui.generator.validation.IoExpanderPropertyValidationRules) FXCollections.observableArrayList(javafx.collections.FXCollections.observableArrayList) ArrayList(java.util.ArrayList) HashSet(java.util.HashSet) Insets(javafx.geometry.Insets) SelectAuthenticatorTypeDialog(com.thecoderscorner.menu.editorui.dialog.SelectAuthenticatorTypeDialog) BiConsumer(java.util.function.BiConsumer) SELECT(com.thecoderscorner.menu.editorui.generator.ui.UICodePluginItem.UICodeAction.SELECT) CustomDeviceExpander(com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander) IoExpanderDefinitionCollection(com.thecoderscorner.menu.editorui.generator.parameters.IoExpanderDefinitionCollection) StringHelper(com.thecoderscorner.menu.editorui.util.StringHelper) CodeGeneratorOptionsBuilder(com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptionsBuilder) SelectEepromTypeDialog(com.thecoderscorner.menu.editorui.dialog.SelectEepromTypeDialog) InternalDeviceExpander(com.thecoderscorner.menu.editorui.generator.parameters.expander.InternalDeviceExpander) CurrentProjectEditorUI(com.thecoderscorner.menu.editorui.uimodel.CurrentProjectEditorUI) SubSystem(com.thecoderscorner.menu.editorui.generator.core.SubSystem) INFO(java.lang.System.Logger.Level.INFO) CoreCodeGenerator(com.thecoderscorner.menu.editorui.generator.core.CoreCodeGenerator) EmbeddedPlatform(com.thecoderscorner.menu.editorui.generator.plugin.EmbeddedPlatform) CurrentEditorProject(com.thecoderscorner.menu.editorui.project.CurrentEditorProject) Collectors(java.util.stream.Collectors) BaseDialogSupport.createDialogStateAndShow(com.thecoderscorner.menu.editorui.dialog.BaseDialogSupport.createDialogStateAndShow) Popup(javafx.stage.Popup) ERROR(java.lang.System.Logger.Level.ERROR) ActionEvent(javafx.event.ActionEvent) List(java.util.List) CodePluginItem(com.thecoderscorner.menu.editorui.generator.plugin.CodePluginItem) Stage(javafx.stage.Stage) Paths(java.nio.file.Paths) CodeGeneratorOptions(com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptions) Optional(java.util.Optional) CodePluginManager(com.thecoderscorner.menu.editorui.generator.plugin.CodePluginManager) CustomDeviceExpander(com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander) IoExpanderPropertyValidationRules(com.thecoderscorner.menu.editorui.generator.validation.IoExpanderPropertyValidationRules) IoExpanderDefinitionCollection(com.thecoderscorner.menu.editorui.generator.parameters.IoExpanderDefinitionCollection) HashSet(java.util.HashSet) CodeGeneratorOptionsBuilder(com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptionsBuilder)

Aggregations

CustomDeviceExpander (com.thecoderscorner.menu.editorui.generator.parameters.expander.CustomDeviceExpander)3 CodeGeneratorOptionsBuilder (com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptionsBuilder)2 IoExpanderDefinitionCollection (com.thecoderscorner.menu.editorui.generator.parameters.IoExpanderDefinitionCollection)2 BiConsumer (java.util.function.BiConsumer)2 MenuTree (com.thecoderscorner.menu.domain.state.MenuTree)1 BaseDialogSupport (com.thecoderscorner.menu.editorui.dialog.BaseDialogSupport)1 BaseDialogSupport.createDialogStateAndShow (com.thecoderscorner.menu.editorui.dialog.BaseDialogSupport.createDialogStateAndShow)1 SelectAuthenticatorTypeDialog (com.thecoderscorner.menu.editorui.dialog.SelectAuthenticatorTypeDialog)1 SelectEepromTypeDialog (com.thecoderscorner.menu.editorui.dialog.SelectEepromTypeDialog)1 CodeGeneratorOptions (com.thecoderscorner.menu.editorui.generator.CodeGeneratorOptions)1 AlwaysApplicable (com.thecoderscorner.menu.editorui.generator.applicability.AlwaysApplicable)1 CoreCodeGenerator (com.thecoderscorner.menu.editorui.generator.core.CoreCodeGenerator)1 CreatorProperty (com.thecoderscorner.menu.editorui.generator.core.CreatorProperty)1 HeaderDefinition (com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition)1 SubSystem (com.thecoderscorner.menu.editorui.generator.core.SubSystem)1 VariableNameGenerator (com.thecoderscorner.menu.editorui.generator.core.VariableNameGenerator)1 EepromAuthenticatorDefinition (com.thecoderscorner.menu.editorui.generator.parameters.auth.EepromAuthenticatorDefinition)1 AVREepromDefinition (com.thecoderscorner.menu.editorui.generator.parameters.eeprom.AVREepromDefinition)1 InternalDeviceExpander (com.thecoderscorner.menu.editorui.generator.parameters.expander.InternalDeviceExpander)1 CodePluginItem (com.thecoderscorner.menu.editorui.generator.plugin.CodePluginItem)1