IOPorts interactive

This commit is contained in:
2024-05-04 15:08:03 +02:00
parent d7ea62963f
commit 3590779e74
6 changed files with 451 additions and 159 deletions

View File

@ -1,6 +1,7 @@
package fabrik.simulator.pic16f84;
import com.gluonhq.charm.glisten.control.ToggleButtonGroup;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
@ -62,8 +63,8 @@ public class Controller_Frontend {
DataRegister.increasePC();
Table.refresh();
Stage stage = (Stage) stepintoButton.getScene().getWindow();
IOPorts.refreshUI(getTRISbuttons(), getPORTbuttons());
CreateWindow.refreshTable(stage);
}
@ -95,53 +96,105 @@ public class Controller_Frontend {
content.append(line).append("\n");
}
lstContentLabel.setText(content.toString());
} catch (IOException e) {
}
catch (IOException e) {
e.printStackTrace();
}
}
@FXML
private ToggleButtonGroup bgA0;
private ToggleButtonGroup bgTRISA0;
@FXML
private ToggleButtonGroup bgA1;
private ToggleButtonGroup bgTRISA1;
@FXML
private ToggleButtonGroup bgA2;
private ToggleButtonGroup bgTRISA2;
@FXML
private ToggleButtonGroup bgA3;
private ToggleButtonGroup bgTRISA3;
@FXML
private ToggleButtonGroup bgA4;
private ToggleButtonGroup bgTRISA4;
@FXML
private ToggleButtonGroup bgA5;
private ToggleButtonGroup bgTRISA5;
@FXML
private ToggleButtonGroup bgA6;
private ToggleButtonGroup bgTRISA6;
@FXML
private ToggleButtonGroup bgA7;
private ToggleButtonGroup bgTRISA7;
@FXML
private ToggleButtonGroup bgB0;
private ToggleButtonGroup bgTRISB0;
@FXML
private ToggleButtonGroup bgB1;
private ToggleButtonGroup bgTRISB1;
@FXML
private ToggleButtonGroup bgB2;
private ToggleButtonGroup bgTRISB2;
@FXML
private ToggleButtonGroup bgB3;
private ToggleButtonGroup bgTRISB3;
@FXML
private ToggleButtonGroup bgB4;
private ToggleButtonGroup bgTRISB4;
@FXML
private ToggleButtonGroup bgB5;
private ToggleButtonGroup bgTRISB5;
@FXML
private ToggleButtonGroup bgB6;
private ToggleButtonGroup bgTRISB6;
@FXML
private ToggleButtonGroup bgB7;
private ToggleButtonGroup bgTRISB7;
@FXML
private ToggleButtonGroup bgPORTA0;
@FXML
private ToggleButtonGroup bgPORTA1;
@FXML
private ToggleButtonGroup bgPORTA2;
@FXML
private ToggleButtonGroup bgPORTA3;
@FXML
private ToggleButtonGroup bgPORTA4;
@FXML
private ToggleButtonGroup bgPORTA5;
@FXML
private ToggleButtonGroup bgPORTA6;
@FXML
private ToggleButtonGroup bgPORTA7;
@FXML
private ToggleButtonGroup bgPORTB0;
@FXML
private ToggleButtonGroup bgPORTB1;
@FXML
private ToggleButtonGroup bgPORTB2;
@FXML
private ToggleButtonGroup bgPORTB3;
@FXML
private ToggleButtonGroup bgPORTB4;
@FXML
private ToggleButtonGroup bgPORTB5;
@FXML
private ToggleButtonGroup bgPORTB6;
@FXML
private ToggleButtonGroup bgPORTB7;
private static ToggleButtonGroup[] allTRISbuttons;
private static ToggleButtonGroup[] allPORTbuttons;
public void initialize() {
ToggleButtonGroup [] allButtons = {bgA0, bgA1, bgA2, bgA3, bgA4, bgA5, bgA6, bgA7, bgB0, bgB1, bgB2, bgB3, bgB4, bgB5, bgB6, bgB7};
ToggleButtonGroup [] allTRISButtons = {bgTRISA0, bgTRISA1, bgTRISA2, bgTRISA3, bgTRISA4, bgTRISA5, bgTRISA6, bgTRISA7, bgTRISB0, bgTRISB1, bgTRISB2, bgTRISB3, bgTRISB4, bgTRISB5, bgTRISB6, bgTRISB7};
ToggleButtonGroup [] allPORTButtons = {bgPORTA0, bgPORTA1, bgPORTA2, bgPORTA3, bgPORTA4, bgPORTA5, bgPORTA6, bgPORTA7, bgPORTB0, bgPORTB1, bgPORTB2, bgPORTB3, bgPORTB4, bgPORTB5, bgPORTB6, bgPORTB7};
for (int i = 0; i<16; i++) {
ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allButtons[i]);
ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allTRISButtons[i]);
ToggleButtonGroupExt.get().addAlwaysOneSelectedSupport(allPORTButtons[i]);
}
setTRISbuttons(allTRISButtons);
setPORTbuttons(allPORTButtons);
}
private static void setTRISbuttons(ToggleButtonGroup[] allButtons) {
allTRISbuttons = allButtons;
}
public static ToggleButtonGroup [] getTRISbuttons() {
return allTRISbuttons;
}
private static void setPORTbuttons(ToggleButtonGroup[] allButtons) {
allPORTbuttons = allButtons;
}
public static ToggleButtonGroup [] getPORTbuttons() {
return allPORTbuttons;
}
}

View File

@ -22,7 +22,6 @@ public class CreateWindow extends Application {
public void start(Stage primaryStage) throws IOException{
DataRegister.initDataRegister();
table = Table.refresh();
FXMLLoader codewindow = new FXMLLoader(CreateWindow.class.getResource("frontend.fxml"));
Parent code = codewindow.load();

View File

@ -34,7 +34,7 @@ public class DataRegister {
dataRegister[0x81] = 0b11111111;
dataRegister[0x80 + PCL] = dataRegister[PCL];
dataRegister[0x80 + STATUS] = dataRegister[STATUS];
dataRegister[TRISA] = 0b11111000;
dataRegister[TRISA] = 0b11111111;
dataRegister[TRISB] = 0b11111111;
dataRegister[0x80 + PCLATH] = dataRegister[PCLATH];
dataRegister[0x80 + INTCON] = dataRegister[INTCON];
@ -139,6 +139,14 @@ public class DataRegister {
}
}
public static void setDirectBit (int fileAddress, int bit, int value){
if (getDirectBit(fileAddress, bit) == 0 && value == 1){
dataRegister[fileAddress] += (int) Math.pow(2, bit);
} else if (getDirectBit(fileAddress, bit) == 1 && value == 0){
dataRegister[fileAddress] -= (int) Math.pow(2, bit);
}
}
private static int programCounter = 0;
private static void writeToPCL(){

View File

@ -1,5 +1,12 @@
package fabrik.simulator.pic16f84;
import com.gluonhq.charm.glisten.control.ToggleButtonGroup;
import javafx.collections.ObservableList;
import javafx.scene.control.ToggleButton;
import javafx.stage.Stage;
import java.io.IOException;
public class IOPorts {
private static final int A = 0;
private static final int B = 1;
@ -8,7 +15,7 @@ public class IOPorts {
private static final int TRISA = 0x85;
private static final int TRISB = 0x86;
private static int [] trisLatch = new int[2];
private static int [] trisLatch = {0xFF, 0xFF};
private static int [] dataLatch = new int[2];
public static void setBit (int address, int bit){
@ -46,7 +53,86 @@ public class IOPorts {
}
private static void refreshPorts() {
System.out.println("PORTA: " + DataRegister.getDirectRegister(PORTA) + "; DATALATCHA: " + dataLatch[A] + "; TRISA: " + trisLatch[A]);
System.out.println("PORTB: " + DataRegister.getDirectRegister(PORTB) + "; DATALATCHB: " + dataLatch[B] + "; TRISB: " + trisLatch[B]);
DataRegister.setDirectRegister(PORTA, ((~((~dataLatch[A])&0xFF | trisLatch[A])) | (trisLatch[A] & DataRegister.getDirectRegister(PORTA))) & 0x1F);
DataRegister.setDirectRegister(PORTB, ((~((~dataLatch[B])&0xFF | trisLatch[B])) | (trisLatch[B] & DataRegister.getDirectRegister(PORTB))) & 0xFF);
DataRegister.setDirectRegister(TRISA, trisLatch[A]);
DataRegister.setDirectRegister(TRISB, trisLatch[B]);
ToggleButtonGroup[] buttons = Controller_Frontend.getPORTbuttons();
for (int i = 0; i < buttons.length; i++){
int port = (i < 8) ? PORTA : PORTB;
int bit = i % 8;
boolean value = ((DataRegister.getDirectRegister(port) >> bit) & 1) == 1;
buttons[i].getToggles().get(0).setSelected(!value);
buttons[i].getToggles().get(1).setSelected(value);
}
}
public static void refreshUI(ToggleButtonGroup[] buttonsTRIS, ToggleButtonGroup[] buttonsPORT) {
for (int i = 0; i< buttonsTRIS.length; i++){
int tris = (i < 8) ? trisLatch[A] : trisLatch[B];
boolean val = isInput(tris, i%8);
buttonsPORT[i].setDisable(!val);
buttonsTRIS[i].getToggles().get(0).setSelected(val);
buttonsTRIS[i].getToggles().get(1).setSelected(!val);
}
}
private static boolean isInput(int i, int bit) {
return (i >> bit & 1) == 1;
}
public static void setTRISfromUI(ToggleButtonGroup parent) throws IOException {
int [] params = getToggleParams(parent);
int tris = params[0];
int bit = params[1];
int value = params[2];
ToggleButtonGroup [] buttonsPORT = Controller_Frontend.getPORTbuttons();
if (value == 1){
setBit(tris, bit);
buttonsPORT[(tris-TRISA)*8 + bit].setDisable(false);
}
else{
clearBit(tris, bit);
buttonsPORT[(tris-TRISA)*8 + bit].setDisable(true);
}
refreshPorts();
refreshTable(parent);
}
public static void setPORTfromUI(ToggleButtonGroup parent) throws IOException {
int [] params = getToggleParams(parent);
int port = params[0];
int bit = params[1];
int value = params [2];
value = (value == 1) ? 0 : 1;
DataRegister.setDirectBit(port, bit, value);
refreshPorts();
refreshTable(parent);
}
private static void refreshTable(ToggleButtonGroup parent) throws IOException {
Stage stage = (Stage) parent.getScene().getWindow();
Table.refresh();
CreateWindow.refreshTable(stage);
}
private static int[] getToggleParams(ToggleButtonGroup parent) {
String group = parent.getId();
ObservableList<ToggleButton> toggles = parent.getToggles();
int fileAddress;
if (group.contains("TRIS"))
if (group.contains("A"))
fileAddress = TRISA;
else
fileAddress = TRISB;
else
if (group.contains("A"))
fileAddress = PORTA;
else
fileAddress = PORTB;
char index =group.charAt(group.length()-1);
int bit = Integer.parseInt(String.valueOf(index));
int value = (toggles.get(0).isSelected()) ? 1 : 0;
return new int[]{fileAddress, bit, value};
}
}

View File

@ -7,6 +7,8 @@ import javafx.scene.control.Toggle;
import javafx.scene.control.ToggleButton;
import javafx.scene.input.MouseEvent;
import java.io.IOException;
public class ToggleButtonGroupExt {
private static ToggleButtonGroupExt me;
@ -40,6 +42,21 @@ public class ToggleButtonGroupExt {
public EventHandler<MouseEvent> consumeMouseEventfilter = (MouseEvent mouseEvent) -> {
if (((Toggle) mouseEvent.getSource()).isSelected()) {
ToggleButtonGroup parent = (ToggleButtonGroup) ((ToggleButton) mouseEvent.getSource()).getParent();
if (parent.getId().contains("TRIS")) {
try {
IOPorts.setTRISfromUI(parent);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
else {
try {
IOPorts.setPORTfromUI(parent);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
mouseEvent.consume();
}
};