<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
- <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
package com.codesrc.scsi2sd.io;
+import java.io.File;
+import java.io.IOException;
+
/**
* Created by michael on 27/08/18.
*/
void saveDiskConfig(int index, byte[] data);
void saveCommit();
+ void writeImage(File file, int sectorStart) throws IOException;
+
boolean supportsTerminator();
boolean supportsSynchronous();
}
import org.hid4java.HidServices;
import org.slf4j.LoggerFactory;
+import java.io.*;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
System.out.print("Found storage device with capacity: ");
System.out.println(capacity * 512L);
}
-
- // System.out.println("Erasing 1 sectors");
- // byte[] eraseCmd = {(byte)Commands.DEV_ERASE.ordinal(), (byte)1, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0, (byte)1};
- // response = protocolDevice.sendHIDPacket(eraseCmd, 1);
-
+ /*
System.out.println("Writing a sector");
byte[] writeCmd = new byte[519];
writeCmd[0] = (byte)Commands.DEV_WRITE.ordinal();
}
System.out.println("FLASH test complete");
+ */
+
}
}
}
+ @Override
+ public void writeImage(File file, int sectorStart) throws IOException
+ {
+ // Only supported on the flash device
+ // Erase the flash device
+
+ var sectors = ((int) file.length() + 511) / 512;
+ byte[] eraseCmd = {
+ (byte)Commands.DEV_ERASE.ordinal(),
+ (byte)1, // Hardcoded flash device for now
+ (byte)0,
+ (byte)0,
+ (byte)0,
+ (byte)0,
+ HidPacketProtocol.intToUint8(sectors >> 24),
+ HidPacketProtocol.intToUint8(sectors >> 16),
+ HidPacketProtocol.intToUint8(sectors >> 8),
+ HidPacketProtocol.intToUint8(sectors)};
+
+ System.out.println("Erasing flash");
+
+ protocolDevice.sendHIDPacket(eraseCmd, 1);
+
+ System.out.println("Writing flash");
+
+ var is = new BufferedInputStream(new FileInputStream(file));
+
+ for (int sector = 0; sector < sectors; ++sector) {
+ if (sector % 100 == 0)
+ {
+ var percentComplete = 100.0 * sector / sectors;
+ System.out.print(percentComplete);
+ System.out.println("% complete");
+ }
+ byte[] writeCmd = new byte[519];
+ writeCmd[0] = (byte) Commands.DEV_WRITE.ordinal();
+ writeCmd[1] = 1; // flash
+ writeCmd[2] = HidPacketProtocol.intToUint8(sector >> 24); // Sector number
+ writeCmd[3] = HidPacketProtocol.intToUint8(sector >> 16); // Sector number
+ writeCmd[4] = HidPacketProtocol.intToUint8(sector >> 8); // Sector number
+ writeCmd[5] = HidPacketProtocol.intToUint8(sector); // Sector number
+
+ var buf = new byte[512];
+ is.readNBytes(writeCmd, 6, 512);
+
+ protocolDevice.sendHIDPacket(writeCmd, 1);
+ }
+
+ System.out.println("Write complete");
+ }
+
private byte[] readFlash(int flashArray, int flashRow)
{
byte[] cmd = {
import org.hid4java.HidDevice;
import org.slf4j.LoggerFactory;
+import java.io.File;
+import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
}
}
+ @Override
+ public void writeImage(File file, int sectorStart) throws IOException
+ {
+ throw new UnsupportedOperationException("Not implemented yet");
+ }
+
@Override
public byte[] readDiskConfig(int index)
{
@FXML private MenuItem menuRevert;
@FXML private Button buttonRevert;
+ @FXML private MenuItem menuWriteImage;
+
@FXML private TabPane mainTabPane;
@FXML private AnchorPane debugLog;
toolbarSaveFile.setOnAction(h -> saveConfigToFile());
menuRevert.setOnAction(h -> revert());
buttonRevert.setOnAction(h -> revert());
+ menuWriteImage.setOnAction(h -> writeImageToDevice());
menuOpenDevice.setDisable(true);
menuSaveDevice.setDisable(true);
+ menuWriteImage.setDisable(true);
this.prefs = Preferences.userNodeForPackage(MainController.class);
this.populateRecentFromPrefs();
{
this.menuOpenDevice.setDisable(true);
this.menuSaveDevice.setDisable(true);
+ this.menuWriteImage.setDisable(true);
}
private void handleDeviceConnectedEvent(UsbDevice device)
this.menuOpenDevice.setDisable(false);
this.loadConfigFromDevice(device);
this.menuSaveDevice.setDisable(false);
+ this.menuWriteImage.setDisable(false);
}
private void loadConfigFromDevice(UsbDevice device) {
this.menuRecent.getItems().add(menuItem);
}
}
+
+ private void writeImageToDevice()
+ {
+ FileChooser fileChooser = new FileChooser();
+ fileChooser.setTitle("Open disk image");
+
+ File theFile = fileChooser.showOpenDialog(this.window);
+ if (theFile == null)
+ {
+ return; // User cancelled.
+ }
+
+ try {
+ this.getDevice().writeImage(theFile, 0);
+
+ } catch (Exception e) {
+ Alert alert = new Alert(Alert.AlertType.ERROR);
+ alert.setTitle("Imaging failed");
+ alert.setContentText(e.getLocalizedMessage());
+ alert.show();
+ }
+ }
}
<Button fx:id="buttonRevert" mnemonicParsing="false" text="Revert" />
<Separator></Separator>
<Button>Update Firmware...</Button>
+ <Separator></Separator>
+ <MenuButton mnemonicParsing="false" text="Disk Image">
+ <items>
+ <MenuItem fx:id="menuWriteImage" mnemonicParsing="false" text="Write image" />
+ </items>
+ </MenuButton>
</items>
</ToolBar>
<AnchorPane VBox.vgrow="ALWAYS">