Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion .idea/runConfigurations/TcMenu_Designer_UI.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,28 @@ public void checkAt24Eeprom(FxRobot robot) throws InterruptedException {
} else fail("Not AT24 rom");
}

@Test
public void checkPreferences(FxRobot robot) throws InterruptedException {
TestUtils.runOnFxThreadAndWait(() -> dialog = new SelectEepromTypeDialog(stage, new PreferencesEepromDefinition("TcMenuAbc", 1024), false));

verifyThat("#prefsRadio", RadioButton::isSelected);
verifyThat("#prefsNamespace", Predicate.not(Node::isDisabled));
verifyThat("#prefsNamespace", TextInputControlMatchers.hasText("TcMenuAbc"));
verifyThat("#prefsSize", Predicate.not(Node::isDisabled));
verifyThat("#prefsSize", TextInputControlMatchers.hasText("1024"));

WaitForAsyncUtils.waitForFxEvents(100);
robot.clickOn("#okButton");
WaitForAsyncUtils.waitForFxEvents(100);

var res = dialog.getResultOrEmpty().orElseThrow();
if(res instanceof PreferencesEepromDefinition prefs) {
assertEquals("TcMenuAbc", prefs.getRomNamespace());
assertEquals(1024, prefs.getSize());

} else fail("Not AT24 rom");
}

@Test
public void testNoEeprom(FxRobot robot) throws InterruptedException {
TestUtils.runOnFxThreadAndWait(() -> dialog = new SelectEepromTypeDialog(stage, new ArduinoClassEepromDefinition(), false));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -77,8 +77,7 @@ public void initialise(String currentSelection, boolean tcUnicodeEnabled) {
prepareChoicesForMode(font.fontMode());

fontVarField.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
var selected = fontVarField.getSelectionModel().getSelectedItem();
if(selected != null && tcUnicodeEnabled) {
if (newVal instanceof FontChoice selected && tcUnicodeEnabled) {
sizeCombo.getSelectionModel().select(selected.fontType() == FontType.ADAFRUIT ? 1 : 0);
}
});
Expand Down Expand Up @@ -109,7 +108,7 @@ private ObservableList<FontChoice> filtered(ObservableList<FontChoice> fontChoic
var filteredList = new FilteredList<>(fontChoices);
fontVarField.getEditor().textProperty().addListener((obs, oldVal, newVal) -> {
final TextField editor = fontVarField.getEditor();
final var selected = fontVarField.getSelectionModel().getSelectedItem();
final Object selected = fontVarField.getSelectionModel().getSelectedItem();
Platform.runLater(() -> {
if (selected == null || !selected.toString().equals(editor.getText())) {
filteredList.setPredicate(item -> item.fontName().toUpperCase().startsWith(newVal.toUpperCase()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,17 @@ public class EepromTypeSelectionController {
public TextField i2cAddrField;
public TextField memOffsetField;
public ComboBox<RomPageSize> romPageCombo;
public RadioButton prefsRadio;
public RadioButton noRomRadio;
public RadioButton avrRomRadio;
public RadioButton eepromRadio;
public RadioButton at24Radio;
public RadioButton bspStRadio;
public ToggleGroup main;
public Label prefNamespaceLabel;
public Label prefSizeLabel;
public TextField prefsNamespace;
public TextField prefsSize;

public void initialise(EepromDefinition eepromMode) {
romPageCombo.setItems(ROM_PAGE_SIZES);
Expand All @@ -67,9 +72,15 @@ else if(eepromMode instanceof At24EepromDefinition at24) {
else if(eepromMode instanceof BspStm32EepromDefinition bsp) {
bspStRadio.setSelected(true);
memOffsetField.setText(Integer.toString(bsp.getOffset()));
} else if(eepromMode instanceof PreferencesEepromDefinition prefs) {
prefsRadio.setSelected(true);
prefsNamespace.setText(prefs.getRomNamespace());
prefsSize.setText(Integer.toString(prefs.getSize()));
}
enableTheRightItems();

prefsNamespace.textProperty().addListener((observableValue, newVal, oldVal) -> enableTheRightItems());
prefsSize.textProperty().addListener((observableValue, newVal, oldVal) -> enableTheRightItems());
i2cAddrField.textProperty().addListener((observableValue, newVal, oldVal) -> enableTheRightItems());
memOffsetField.textProperty().addListener((observableValue, newVal, oldVal) -> enableTheRightItems());
main.selectedToggleProperty().addListener((observableValue, newVal, oldVal) -> enableTheRightItems());
Expand Down Expand Up @@ -98,6 +109,9 @@ else if (at24Radio.isSelected()) {
return new BspStm32EepromDefinition(offs);
}
}
else if(prefsRadio.isSelected()) {
return new PreferencesEepromDefinition(prefsNamespace.getText(), Integer.parseInt(prefsSize.getText()));
}
}
catch(Exception ex) {
logger.log(ERROR, "Exception trying to parse results", ex);
Expand All @@ -120,21 +134,30 @@ private void enableTheRightItems() {
romPageLabel.setDisable(!at24Mode);
i2cAddrField.setDisable(!at24Mode);
i2cAddrLabel.setDisable(!at24Mode);
boolean prefsMode = prefsRadio.isSelected();
prefNamespaceLabel.setDisable(!prefsMode);
prefSizeLabel.setDisable(!prefsMode);
prefsSize.setDisable(!prefsMode);
prefsNamespace.setDisable(!prefsMode);

if(bspMode) {
var offsText = memOffsetField.getText();
okButton.setDisable(!offsText.matches("[0-9]+"));
}
else if(at24Mode) {
} else if(at24Mode) {
if(StringHelper.isStringEmptyOrNull(i2cAddrField.getText())) {
i2cAddrField.setText("0x50");
romPageCombo.getSelectionModel().select(0);
}
var i2cAddrText = i2cAddrField.getText().toUpperCase();
var selectedPageSize = romPageCombo.getSelectionModel().getSelectedItem();
okButton.setDisable(selectedPageSize == null || !i2cAddrText.matches("0[xX][A-F0-9]*"));
}
else {
} else if(prefsMode) {
if(StringHelper.isStringEmptyOrNull(prefsNamespace.getText())) {
prefsNamespace.setText("menuStore");
prefsSize.setText("1024");
}
okButton.setDisable(prefsSize.getText().isEmpty() || prefsNamespace.getText().isEmpty() || !prefsSize.getText().matches("[0-9]+"));
} else {
okButton.setDisable(false);
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,10 @@ public boolean startConversion(Path directory, List<CodePluginItem> codeGenerato
context = new CodeConversionContext(embeddedPlatform, root, options, allProps);
var extractor = new CodeVariableCppExtractor(context, usesProgMem);

codeGenerators.stream().filter(CodePluginItem::isJavaImpl)
.forEach(cg -> cg.getJavaImpl().beforeGenerationStarts(context));


Collection<BuildStructInitializer> menuStructure = generateMenusInOrder(menuTree);

// generate the source by first generating the CPP and H for the menu definition and then
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,16 @@

import com.thecoderscorner.menu.editorui.generator.applicability.AlwaysApplicable;
import com.thecoderscorner.menu.editorui.generator.applicability.CodeApplicability;
import com.thecoderscorner.menu.editorui.generator.validation.CannedPropertyValidators;
import com.thecoderscorner.menu.editorui.generator.validation.PropertyValidationRules;
import com.thecoderscorner.menu.editorui.generator.validation.StringPropertyValidationRules;

import java.util.Objects;

import static com.thecoderscorner.menu.editorui.generator.plugin.JavaPluginItem.ALWAYS_APPLICABLE;
import static com.thecoderscorner.menu.editorui.generator.validation.CannedPropertyValidators.optPinValidator;
import static com.thecoderscorner.menu.editorui.generator.validation.CannedPropertyValidators.uintValidator;

/**
* All creator instances can define properties. These are shown in the UI during code creation and can be edited by the
* user. It is possible to validate the values entered into these properties and set different types and subsystems.
Expand All @@ -25,8 +30,22 @@
public class CreatorProperty {
private static final PropertyValidationRules BASE_RULE = new StringPropertyValidationRules(false, 32);

public static CreatorProperty optionalPin(String id, String name, String desc, String defValue, SubSystem ss) {
return new CreatorProperty(id, name, desc, defValue, ss, PropType.VARIABLE, optPinValidator(),
ALWAYS_APPLICABLE);
}

public static CreatorProperty uintProperty(String id, String name, String desc, SubSystem system, int defVal, int max) {
return new CreatorProperty(id, name, desc, String.valueOf(defVal), system, PropType.VARIABLE, uintValidator(max), ALWAYS_APPLICABLE);
}

public static CreatorProperty rgbProperty(String id, String name, String desc, String defVal) {
return new CreatorProperty(id, name, desc, defVal, SubSystem.THEME, PropType.VARIABLE,
CannedPropertyValidators.rgbValidator(), ALWAYS_APPLICABLE);
}

/** Definitions of how a specific property is intended to be used */
public enum PropType { USE_IN_DEFINE, VARIABLE, TEXTUAL }
public enum PropType { USE_IN_DEFINE, VARIABLE, HIDDEN, TEXTUAL }

private String name;
private String latestValue;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,18 @@ protected void generatePluginsForCreator(CodePluginItem item, Path directory, Pa
// get the source (either from the plugin or from the tcMenu library)
String fileNamePart;
byte[] fileDataBytes;
Path location = item.getConfig().getPath().resolve(fileName);
try (var sourceInputStream = new FileInputStream(location.toFile())) {
fileDataBytes = sourceInputStream.readAllBytes();
fileNamePart = Paths.get(fileName).getFileName().toString();
} catch (Exception e) {
throw new TcMenuConversionException("Unable to locate file in plugin: " + srcFile, e);

if(srcFile.isPrepopulated()) {
fileDataBytes = srcFile.getContent().getBytes();
fileNamePart = fileName;
} else {
Path location = item.getConfig().getPath().resolve(fileName);
try (var sourceInputStream = new FileInputStream(location.toFile())) {
fileDataBytes = sourceInputStream.readAllBytes();
fileNamePart = Paths.get(fileName).getFileName().toString();
} catch (Exception e) {
throw new TcMenuConversionException("Unable to locate file in plugin: " + srcFile, e);
}
}

Path resolvedOutputFile = directory;
Expand Down Expand Up @@ -118,8 +124,13 @@ protected void generatePluginsForCreator(CodePluginItem item, Path directory, Pa
for (var cr : srcFile.getReplacementList()) {
if (cr.getApplicability().isApplicable(context.getProperties())) {
uiLogger.accept(DEBUG, "Plugin file replacement: " + cr.getFind() + " to " + cr.getReplace());
var replacement = StringHelper.escapeRex(expando.expandExpression(context, cr.getReplace()));
fileData = fileData.replaceAll(cr.getFind(), replacement);
if(srcFile.isPrepopulated()) {
// in new content prepopulated files we don't need to deal with expressions like below.
fileData = fileData.replace(cr.getFind(), cr.getReplace());
} else {
var replacement = StringHelper.escapeRex(expando.expandExpression(context, cr.getReplace()));
fileData = fileData.replaceAll(cr.getFind(), replacement);
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,9 @@ public boolean startConversion(Path directory, List<CodePluginItem> plugins, Men
context = new CodeConversionContext(platform, rootMenuName, options, options.getLastProperties());
pluginCreator = new EmbeddedJavaPluginCreator(context);

plugins.stream().filter(CodePluginItem::isJavaImpl)
.forEach(cg -> cg.getJavaImpl().beforeGenerationStarts(context));

logLine(INFO, "Loading the java project from " + directory);
EmbeddedJavaProject javaProject = new EmbeddedJavaProject(directory, options, configStorage, handler, this::logLine);
logLine(INFO,"Java project looks to be in place, dir is " + javaProject.getActualPackageDir().relativize(javaProject.getMainJava()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,10 @@
package com.thecoderscorner.menu.editorui.generator.parameters;

import com.thecoderscorner.menu.editorui.generator.arduino.MenuItemToEmbeddedGenerator;
import com.thecoderscorner.menu.editorui.generator.core.CreatorProperty;
import com.thecoderscorner.menu.editorui.generator.core.CodeConversionContext;
import com.thecoderscorner.menu.editorui.generator.core.CreatorProperty;

import java.util.Objects;
import java.util.regex.Pattern;

public class CodeParameter {
Expand Down Expand Up @@ -37,6 +38,10 @@ public CodeParameter(String type, String name, boolean paramUsed, String value,
this.defaultValue = defaultValue;
}

public static CodeParameter unNamedValue(Object value) {
return new CodeParameter(NO_TYPE, NO_TYPE, true, Objects.toString(value));
}

public String expandExpression(CodeConversionContext context, String text)
{
if (text == null) return MenuItemToEmbeddedGenerator.CPP_NULL_PTR;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package com.thecoderscorner.menu.editorui.generator.parameters;

import com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition;
import com.thecoderscorner.menu.editorui.generator.parameters.eeprom.*;
import com.thecoderscorner.menu.editorui.util.StringHelper;

Expand All @@ -15,6 +14,12 @@ static EepromDefinition readFromProject(String encoding) {
try {
if (encoding.startsWith("avr:")) return new AVREepromDefinition();
else if (encoding.startsWith("eeprom:")) return new ArduinoClassEepromDefinition();
else if (encoding.startsWith("prefs:")) {
String[] parts = encoding.split(":");
String ns = parts[1];
int size = Integer.parseInt(parts[2]);
return new PreferencesEepromDefinition(ns, size);
}
else if (encoding.startsWith("bsp:")) {
int memOffset = Integer.parseInt(encoding.substring(4));
return new BspStm32EepromDefinition(memOffset);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.thecoderscorner.menu.editorui.generator.parameters.eeprom;

import com.thecoderscorner.menu.editorui.generator.applicability.AlwaysApplicable;
import com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition;
import com.thecoderscorner.menu.editorui.generator.parameters.EepromDefinition;

import java.util.Optional;

import static com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition.HeaderType.GLOBAL;
import static com.thecoderscorner.menu.editorui.generator.core.HeaderDefinition.PRIORITY_NORMAL;

public class PreferencesEepromDefinition implements EepromDefinition {
private final String romNamespace;
private final int size;

public PreferencesEepromDefinition(String ns, int size) {
this.romNamespace = ns;
this.size = size;
}

@Override
public Optional<String> generateCode() {
return Optional.of(" glEspRom.init();" + System.lineSeparator() + " menuMgr.setEepromRef(&glEspRom);");
}

@Override
public Optional<String> generateGlobal() {
return Optional.of("EspPreferencesEeprom glEspRom(\"" + romNamespace + "\", " + size + ");");
}

@Override
public Optional<String> generateExport() {
return Optional.of("extern EspPreferencesEeprom glEspRom;");
}

@Override
public Optional<HeaderDefinition> generateHeader() {
return Optional.of(new HeaderDefinition("esp32/EspPreferencesEeprom.h", GLOBAL, PRIORITY_NORMAL, new AlwaysApplicable()));
}

@Override
public String writeToProject() {
return "prefs:" + romNamespace + ":" + size;
}

public String getRomNamespace() {
return romNamespace;
}

public int getSize() {
return size;
}

@Override
public String toString() {
return "ESP32 Preferences EEPROM functions";
}
}
Loading