From 678729e0d06ee74a06c12d8ae1a97cfece8af9c3 Mon Sep 17 00:00:00 2001 From: Michael McMaster Date: Sat, 9 Jan 2021 21:30:57 +1000 Subject: [PATCH] V5.2 and V6 blind writes option support --- pom.xml | 1 + scsi2sd.io/pom.xml | 234 +++++++++++------- scsi2sd.io/scsi2sd.io.iml | 12 + .../scsi2sd/io/UsbDeviceManagerImpl.java | 66 +++-- .../scsi2sd/io/V3FirmwareUsbDevice.java | 4 + scsi2sd.io/src/main/java/module-info.java | 3 + scsi2sd.ui/pom.xml | 224 +++++++++-------- .../main/java/com/codesrc/scsi2sd/App.java | 2 +- .../codesrc/scsi2sd/model/BoardConfig.java | 21 ++ .../java/com/codesrc/scsi2sd/model/Flag6.java | 3 +- .../presentation/ConfigController.java | 12 + scsi2sd.ui/src/main/resources/app.properties | 2 +- scsi2sd.ui/src/main/resources/fx/about.fxml | 2 +- .../src/main/resources/fx/configTab.fxml | 7 +- scsi2sd.ui/src/main/resources/img/splash.png | Bin 44992 -> 45124 bytes scsi2sd.ui/src/main/resources/img/splash.svg | 170 ++++++------- 16 files changed, 449 insertions(+), 314 deletions(-) diff --git a/pom.xml b/pom.xml index c65d6b4..caa15eb 100755 --- a/pom.xml +++ b/pom.xml @@ -9,6 +9,7 @@ scsi2sd-util 1.0-SNAPSHOT + scsi2sd.io.usb4java scsi2sd.io scsi2sd.ui diff --git a/scsi2sd.io/pom.xml b/scsi2sd.io/pom.xml index 684beb1..f795edf 100755 --- a/scsi2sd.io/pom.xml +++ b/scsi2sd.io/pom.xml @@ -25,6 +25,8 @@ UTF-8 + 1.3.0 + @@ -54,118 +56,166 @@ - - - - org.moditect - moditect-maven-plugin - 1.0.0.Beta2 - - - add-module-infos - generate-resources - - add-module-info - - - - ${project.build.directory}/install - - - - org.hid4java - hid4java - 0.5.0 - - - open module hid4java { - requires jna; - exports org.hid4java; - exports org.hid4java.jna to jna; - exports org.hid4java.event to com.codesrc.scsi2sd.io; - - // native libraries. Use jimage on the jlink'd module file - // to list the relevant directories (which get - // turned into packages) - // (disabled and open'd entire module because the - // hyphen in the directory names causes parse problems) - //exports darwin; - //exports win32-amd64; - //exports linux-amd64; - //exports linux-x86-64; - } - - - - - - net.java.dev.jna - jna - 5.5.0 - - - // Open is required to access the native library resources - open module jna { - exports com.sun.jna; - requires java.logging; - } - - - - - - - - + - - org.slf4j - slf4j-api - 1.8.0-beta2 - - - - net.java.dev.jna - jna - 5.2.0 - + + org.slf4j + slf4j-api + 1.8.0-beta2 + + + + net.java.dev.jna + jna + 5.2.0 + org.hid4java hid4java 0.5.0 - - - net.java.dev.jna - jna - - + + + net.java.dev.jna + jna + + + + + + com.codesrc + scsi2sd.io.usb4java + 1.0-SNAPSHOT + + + + + org.apache.commons + commons-lang3 + 3.8.1 + + + + javax.usb + usb-api + 1.0.2 + + + + + org.usb4java + usb4java-javax + 1.3.0 diff --git a/scsi2sd.io/scsi2sd.io.iml b/scsi2sd.io/scsi2sd.io.iml index 129903a..d415012 100644 --- a/scsi2sd.io/scsi2sd.io.iml +++ b/scsi2sd.io/scsi2sd.io.iml @@ -14,6 +14,18 @@ + + + + + + + + + + + + diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDeviceManagerImpl.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDeviceManagerImpl.java index 7ce1af1..5d3dd7b 100755 --- a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDeviceManagerImpl.java +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/UsbDeviceManagerImpl.java @@ -20,14 +20,16 @@ package com.codesrc.scsi2sd.io; import org.hid4java.*; import org.hid4java.event.HidServicesEvent; import org.slf4j.LoggerFactory; +import javax.usb.*; +import javax.usb.event.UsbServicesEvent; +import javax.usb.event.UsbServicesListener; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.*; -class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { +class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener, UsbServicesListener { private static org.slf4j.Logger LOGGER = LoggerFactory.getLogger(UsbDeviceManagerImpl.class.getPackageName()); private static UsbDeviceManagerImpl INSTANCE = new UsbDeviceManagerImpl(); @@ -39,7 +41,9 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { private HidServices hidServices; - private Map devices = new ConcurrentHashMap<>(); + private Map hidDevices = new ConcurrentHashMap<>(); + + private UsbServices usbServices; public static UsbDeviceManager getInstance() { return INSTANCE; @@ -58,6 +62,13 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { hidServices.getAttachedHidDevices().forEach(d -> this.attached(d)); hidServices.addHidServicesListener(this); + try { + usbServices = UsbHostManager.getUsbServices(); + usbServices.addUsbServicesListener(this); + } catch (UsbException e) { + throw new RuntimeException(e); + } + scheduler.scheduleWithFixedDelay(() -> this.poll(), 1, 1, TimeUnit.SECONDS); LOGGER.debug("Initialised UsbDeviceManagerImpl"); @@ -83,7 +94,7 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { @Override public List getDevices() { - return new ArrayList<>(devices.values()); + return new ArrayList<>(hidDevices.values()); } private void poll() { @@ -130,6 +141,15 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { } catch (Exception e) { LOGGER.error("Exception in UsbDeviceManagerImpl.hidDeviceDettached", e); } + } + + @Override + public void usbDeviceAttached(UsbServicesEvent usbServicesEvent) { + + } + + @Override + public void usbDeviceDetached(UsbServicesEvent usbServicesEvent) { } @@ -139,9 +159,9 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { } private void detached(HidDevice hidDevice) { - UsbDevice attachedDevice = devices.get(hidDevice); + UsbDevice attachedDevice = hidDevices.get(hidDevice); if (attachedDevice != null) { - devices.remove(attachedDevice); + hidDevices.remove(attachedDevice); LOGGER.info("Detached SCSI2SD"); @@ -153,14 +173,14 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { } private void attached(HidDevice hidDevice) { - if (devices.containsKey(hidDevice)) { + if (hidDevices.containsKey(hidDevice)) { // Why are we getting this again ? LOGGER.warn("Usb Device duplicate attach {}", hidDevice.getPath()); return; } - if (!devices.isEmpty()) { + if (!hidDevices.isEmpty()) { // UI only supports one device for now return; } @@ -172,7 +192,7 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { hidDevice.getProductId() == V6FirmwareUsbDevice.PRODUCT_ID) { attachedDevice = new V6FirmwareUsbDevice(hidDevice); - this.devices.put(hidDevice, attachedDevice); + this.hidDevices.put(hidDevice, attachedDevice); } else if (hidDevice.getVendorId() == V3FirmwareUsbDevice.VENDOR_ID && hidDevice.getProductId() == V3FirmwareUsbDevice.PRODUCT_ID) { @@ -184,10 +204,10 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { if (dbgDev.getVendorId() == V3FirmwareUsbDevice.VENDOR_ID && dbgDev.getProductId() == V3FirmwareUsbDevice.PRODUCT_ID && (dbgDev.getInterfaceNumber() == 1 || hidDevice.getUsagePage() == (short) 0xFF01) && - !this.devices.containsKey(dbgDev)) { + !this.hidDevices.containsKey(dbgDev)) { attachedDevice = new V3FirmwareUsbDevice(hidDevice, dbgDev); - this.devices.put(dbgDev, attachedDevice); - this.devices.put(hidDevice, attachedDevice); + this.hidDevices.put(dbgDev, attachedDevice); + this.hidDevices.put(hidDevice, attachedDevice); } } @@ -199,10 +219,10 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { if (cfgDev.getVendorId() == V3FirmwareUsbDevice.VENDOR_ID && cfgDev.getProductId() == V3FirmwareUsbDevice.PRODUCT_ID && (cfgDev.getInterfaceNumber() == 0 || hidDevice.getUsagePage() == (short) 0xFF00) && - !this.devices.containsKey(cfgDev)) { + !this.hidDevices.containsKey(cfgDev)) { attachedDevice = new V3FirmwareUsbDevice(cfgDev, hidDevice); - this.devices.put(cfgDev, attachedDevice); - this.devices.put(hidDevice, attachedDevice); + this.hidDevices.put(cfgDev, attachedDevice); + this.hidDevices.put(hidDevice, attachedDevice); } } } @@ -220,4 +240,20 @@ class UsbDeviceManagerImpl implements UsbDeviceManager, HidServicesListener { throw e; } } + + + private javax.usb.UsbDevice findDevice(UsbHub hub, short vendorId, short productId) + { + for (javax.usb.UsbDevice device : (List) hub.getAttachedUsbDevices()) + { + UsbDeviceDescriptor desc = device.getUsbDeviceDescriptor(); + if (desc.idVendor() == vendorId && desc.idProduct() == productId) return device; + if (device.isUsbHub()) + { + device = findDevice((UsbHub) device, vendorId, productId); + if (device != null) return device; + } + } + return null; + } } diff --git a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java index 02700f8..9044185 100644 --- a/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java +++ b/scsi2sd.io/src/main/java/com/codesrc/scsi2sd/io/V3FirmwareUsbDevice.java @@ -95,6 +95,10 @@ public class V3FirmwareUsbDevice implements UsbDevice { return "3.5\" SCSI2SD V5.1"; //info.version = "V5.1"; //info.firmwareName = "SCSI2SD-V51.cyacd"; + case 0x3004: + return "3.5\" SCSI2SD V5.2"; + //info.version = "V5.2"; + //info.firmwareName = "SCSI2SD-V52.cyacd"; case 0x0055: return "External DB25 SCSI2SD"; //info.version = "V5.5"; diff --git a/scsi2sd.io/src/main/java/module-info.java b/scsi2sd.io/src/main/java/module-info.java index 25319fd..24164ea 100644 --- a/scsi2sd.io/src/main/java/module-info.java +++ b/scsi2sd.io/src/main/java/module-info.java @@ -17,6 +17,9 @@ module com.codesrc.scsi2sd.io { requires hid4java; + requires usb.api; + requires com.codesrc.scsi2sd.io.usb4java; + requires usb4java.javax; requires org.slf4j; exports com.codesrc.scsi2sd.io; diff --git a/scsi2sd.ui/pom.xml b/scsi2sd.ui/pom.xml index 6b5a785..64b8a8b 100755 --- a/scsi2sd.ui/pom.xml +++ b/scsi2sd.ui/pom.xml @@ -25,42 +25,42 @@ UTF-8 - - - linux - - - unix - Linux - - - - ${project.build.directory}/../../build/linux/javafx-jmods-11.0.2 - - - - mac - - - mac - - - - ${project.build.directory}/../../build/mac/javafx-jmods-11.0.2 - - - - windows - - - windows - - - - ${project.build.directory}/../../build/windows/javafx-jmods-11.0.2 - - - + + + linux + + + unix + Linux + + + + ${project.build.directory}/../../build/linux/javafx-jmods-11.0.2 + + + + mac + + + mac + + + + ${project.build.directory}/../../build/mac/javafx-jmods-11.0.2 + + + + windows + + + windows + + + + ${project.build.directory}/../../build/windows/javafx-jmods-11.0.2 + + + target @@ -74,7 +74,6 @@ src/main/resources - @@ -87,20 +86,20 @@ 10 - - - org.apache.maven.plugins - maven-jar-plugin - 3.1.1 - - - - - com.codesrc.scsi2sd.App - - - - + + + org.apache.maven.plugins + maven-jar-plugin + 3.1.1 + + + + + com.codesrc.scsi2sd.App + + + + org.apache.maven.plugins @@ -118,77 +117,76 @@ false true true - org.openjfx,org.hid4java,net.java.dev.jna + org.openjfx,org.hid4java,net.java.dev.jna,javax.usb,org.usb4java,org.apache.commons + + org.moditect + moditect-maven-plugin + 1.0.0.RC1 + + + add-module-infos + generate-resources + + add-module-info + - - org.moditect - moditect-maven-plugin - 1.0.0.Beta2 - - - add-module-infos - generate-resources - - add-module-info - - - - ${project.build.directory}/install - - - - net.sf.jopt-simple - jopt-simple - 6.0-alpha-3 - - - module joptsimple { - exports joptsimple; - } - - - - - + + ${project.build.directory}/install + + + + net.sf.jopt-simple + jopt-simple + 6.0-alpha-3 + + + module joptsimple { + exports joptsimple; + } + + + + + - - create-runtime-image - package - - create-runtime-image - - - - ${project.build.directory}/scsi2sd.ui-1.0-SNAPSHOT.jar - ${jmodPath} - ${project.build.directory}/../../scsi2sd.io/target/install - ${project.build.directory}/install - - - com.codesrc.scsi2sd.ui - - - - - - scsi2sd-util - com.codesrc.scsi2sd.ui/com.codesrc.scsi2sd.App - - - ${project.build.directory}/jlink-image - - true - - - - + + create-runtime-image + package + + create-runtime-image + + + + ${project.build.directory}/scsi2sd.ui-1.0-SNAPSHOT.jar + ${jmodPath} + ${project.build.directory}/../../scsi2sd.io/target/install + ${project.build.directory}/install + + + com.codesrc.scsi2sd.ui + + + + + + scsi2sd-util + com.codesrc.scsi2sd.ui/com.codesrc.scsi2sd.App + + + ${project.build.directory}/jlink-image + + true + + + + diff --git a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/App.java b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/App.java index 7240daf..5e6d9a2 100644 --- a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/App.java +++ b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/App.java @@ -151,7 +151,7 @@ public class App extends Application { System.out.println( "SCSI2SD Utility v" + appProperties.getProperty("com.codesrc.scsi2sd.app.version") + "\n" + - "Copyright (C) 2019 Michael McMaster \n" + + "Copyright (C) 2019-2020 Michael McMaster \n" + "\n" + "This program is free software: you can redistribute it and/or modify\n" + "it under the terms of the GNU General Public License as published by\n" + diff --git a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/BoardConfig.java b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/BoardConfig.java index cb25a3f..1466883 100644 --- a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/BoardConfig.java +++ b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/BoardConfig.java @@ -154,6 +154,14 @@ public class BoardConfig { this.flags6.add(Flag6.S2S_CFG_ENABLE_TERMINATOR); } + public boolean isEnableBlindWrites() { + return flags6.contains(Flag6.S2S_CFG_ENABLE_BLIND_WRITES); + } + + public void setEnableBlindWrites(boolean enableBlindWrites) { + this.flags6.add(Flag6.S2S_CFG_ENABLE_BLIND_WRITES); + } + public BoardConfig(Node node) { var childNodes = node.getChildNodes(); var children = IntStream.range(0, childNodes.getLength()) @@ -191,6 +199,10 @@ public class BoardConfig { this.flags6.add(Flag6.S2S_CFG_ENABLE_TERMINATOR); } + if (children.getOrDefault("blindWrites", "false").equalsIgnoreCase("true")) { + this.flags6.add(Flag6.S2S_CFG_ENABLE_BLIND_WRITES); + } + this.selectionDelay = 255; var selDelayText = children.getOrDefault("selectionDelay", "255"); try { @@ -312,6 +324,15 @@ public class BoardConfig { .append(" 5 Sync 10MB/s\n") .append(" ********************************************************* -->\n") .append(" ").append(this.scsiSpeed.getValue()).append("\n") + + .append(" \n") + .append(" ") + .append(this.flags6.contains(Flag6.S2S_CFG_ENABLE_BLIND_WRITES) ? "true" : "false") + .append(" \n") .append("\n"); return out.toString(); diff --git a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/Flag6.java b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/Flag6.java index 56faddc..582d254 100644 --- a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/Flag6.java +++ b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/model/Flag6.java @@ -22,7 +22,8 @@ import java.util.HashSet; import java.util.Set; public enum Flag6 implements BitEnum { - S2S_CFG_ENABLE_TERMINATOR(1); + S2S_CFG_ENABLE_TERMINATOR(1), + S2S_CFG_ENABLE_BLIND_WRITES(2); static Set fromBitmask(byte bitmask) { Set result = new HashSet<>(); diff --git a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/ConfigController.java b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/ConfigController.java index 27ccb1a..053a229 100644 --- a/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/ConfigController.java +++ b/scsi2sd.ui/src/main/java/com/codesrc/scsi2sd/presentation/ConfigController.java @@ -50,6 +50,7 @@ public class ConfigController implements Initializable, DocumentObserver { @FXML private ToggleSwitch cfgScsi2; @FXML private ToggleSwitch cfgSelPulses; @FXML private ToggleSwitch cfgMapLuns; + @FXML private ToggleSwitch cfgEnableBlindWrites; @FXML private ChoiceBox speedLimit; @@ -75,6 +76,7 @@ public class ConfigController implements Initializable, DocumentObserver { this.cfgScsi2.selectedProperty().addListener(it -> this.setFlag(Flag.S2S_CFG_ENABLE_SCSI2, this.cfgScsi2)); this.cfgSelPulses.selectedProperty().addListener(it -> this.setFlag(Flag.S2S_CFG_ENABLE_SEL_LATCH, this.cfgSelPulses)); this.cfgMapLuns.selectedProperty().addListener(it -> this.setFlag(Flag.S2S_CFG_MAP_LUNS_TO_IDS, this.cfgMapLuns)); + this.cfgEnableBlindWrites.selectedProperty().addListener(it -> this.setBlindWrites()); this.speedLimit.getItems().addAll(Speed.values()); this.speedLimit.setOnAction(e -> this.setSpeedLimit()); @@ -109,6 +111,7 @@ public class ConfigController implements Initializable, DocumentObserver { cfgScsi2.setSelected(this.boardConfig.getFlags().contains(Flag.S2S_CFG_ENABLE_SCSI2)); cfgSelPulses.setSelected(this.boardConfig.getFlags().contains(Flag.S2S_CFG_ENABLE_SEL_LATCH)); cfgMapLuns.setSelected(this.boardConfig.getFlags().contains(Flag.S2S_CFG_MAP_LUNS_TO_IDS)); + cfgEnableBlindWrites.setSelected(this.boardConfig.isEnableBlindWrites()); this.speedLimit.setValue(this.boardConfig.getScsiSpeed()); } @@ -140,6 +143,15 @@ public class ConfigController implements Initializable, DocumentObserver { } } + private void setBlindWrites() + { + if (this.boardConfig != null) + { + this.boardConfig.setFlag6(Flag6.S2S_CFG_ENABLE_BLIND_WRITES, this.cfgEnableBlindWrites.isSelected()); + this.activeDocument.setModified(this.getClass().getName(), true); + } + } + private void setStartupDelay() { if (this.boardConfig != null) diff --git a/scsi2sd.ui/src/main/resources/app.properties b/scsi2sd.ui/src/main/resources/app.properties index 25a7b50..eda500b 100644 --- a/scsi2sd.ui/src/main/resources/app.properties +++ b/scsi2sd.ui/src/main/resources/app.properties @@ -1,5 +1,5 @@ -com.codesrc.scsi2sd.app.version = 1.0-BETA +com.codesrc.scsi2sd.app.version = 1.1 com.codesrc.scsi2sd.app.licence.type = GPLv3 com.codesrc.scsi2sd.app.licence.url = https://www.gnu.org/licenses/gpl-3.0.html diff --git a/scsi2sd.ui/src/main/resources/fx/about.fxml b/scsi2sd.ui/src/main/resources/fx/about.fxml index e3c148f..ff613f3 100644 --- a/scsi2sd.ui/src/main/resources/fx/about.fxml +++ b/scsi2sd.ui/src/main/resources/fx/about.fxml @@ -26,7 +26,7 @@ - +