瀏覽代碼

Add option to specify subdirectory for images (#24)

Petteri Aimonen 3 年之前
父節點
當前提交
55d4e2b092
共有 4 個文件被更改,包括 63 次插入12 次删除
  1. 2 0
      azulscsi.ini
  2. 58 9
      src/AzulSCSI.cpp
  3. 2 2
      src/AzulSCSI_disk.cpp
  4. 1 1
      src/AzulSCSI_disk.h

+ 2 - 0
azulscsi.ini

@@ -2,6 +2,8 @@
 # Settings that apply to all devices
 Debug = 0   # Same effect as DIPSW2, enables verbose log messages
 SelectionDelay = 255   # Millisecond delay after selection, 255 = automatic, 0 = no delay
+Dir = "/"   # Optionally look for image files in subdirectory
+# Dir2 = "/images"  # Multiple directories can be specified Dir1...Dir9
 
 # Settings that can be needed for compatibility with some hosts
 Quirks = 0   # 0: Standard, 1: Apple, 2: OMTI, 4: Xebec, 8: VMS

+ 58 - 9
src/AzulSCSI.cpp

@@ -154,17 +154,56 @@ void print_sd_info()
 // Iterate over the root path in the SD card looking for candidate image files.
 bool findHDDImages()
 {
-  azlog("Finding HDD images:");
+  char imgdir[MAX_FILE_PATH];
+  ini_gets("SCSI", "Dir", "/", imgdir, sizeof(imgdir), CONFIGFILE);
+  int dirindex = 0;
+
+  azlog("Finding HDD images in directory ", imgdir, ":");
 
   SdFile root;
-  root.open("/");
+  root.open(imgdir);
+  if (!root.isOpen())
+  {
+    azlog("Could not open directory: ", imgdir);
+  }
+
   SdFile file;
   bool imageReady;
   bool foundImage = false;
   uint8_t usedIds = 0;
   int usedDefaultId = 0;
-  while (1) {
-    if (!file.openNext(&root, O_READ)) break;
+  while (1)
+  {
+    if (!file.openNext(&root, O_READ))
+    {
+      // Check for additional directories with ini keys Dir1..Dir9
+      while (dirindex < 10)
+      {
+        dirindex++;
+        char key[5] = "Dir0";
+        key[3] += dirindex;
+        if (ini_gets("SCSI", key, "", imgdir, sizeof(imgdir), CONFIGFILE) != 0)
+        {
+          break;
+        }
+      }
+
+      if (imgdir[0] != '\0')
+      {
+        azlog("Finding HDD images in additional directory Dir", (int)dirindex, " = \"", imgdir, "\":");
+        root.open(imgdir);
+        if (!root.isOpen())
+        {
+          azlog("-- Could not open directory: ", imgdir);
+        }
+        continue;
+      }
+      else
+      {
+        break;
+      }
+    }
+
     char name[MAX_FILE_PATH+1];
     if(!file.isDir()) {
       file.getName(name, MAX_FILE_PATH+1);
@@ -223,21 +262,31 @@ bool findHDDImages()
           blk  = 2048;
         }
 
+        char fullname[MAX_FILE_PATH * 2 + 2] = {0};
+        strncpy(fullname, imgdir, MAX_FILE_PATH);
+        if (fullname[strlen(fullname) - 1] != '/') strcat(fullname, "/");
+        strcat(fullname, name);
+
         if (usedIds & (1 << id))
         {
-          azlog("-- Ignoring ", name, ", SCSI ID ", id, " is already in use!");
+          azlog("-- Ignoring ", fullname, ", SCSI ID ", id, " is already in use!");
           continue;
         }
 
         if(id < NUM_SCSIID && lun < NUM_SCSILUN) {
-          azlog("-- Opening ", name, " for id:", id, " lun:", lun);
-          imageReady = scsiDiskOpenHDDImage(id, name, id, lun, blk);
-          if(imageReady) { // Marked as a responsive ID
+          azlog("-- Opening ", fullname, " for id:", id, " lun:", lun);
+          imageReady = scsiDiskOpenHDDImage(id, fullname, id, lun, blk, is_cd);
+          if(imageReady)
+          {
             foundImage = true;
             usedIds |= (1 << id);
           }
+          else
+          {
+            azlog("---- Failed to load image");
+          }
         } else {
-          azlog("-- Invalid lun or id for image ", name);
+          azlog("-- Invalid lun or id for image ", fullname);
         }
       }
     }

+ 2 - 2
src/AzulSCSI_disk.cpp

@@ -40,7 +40,7 @@ void scsiDiskResetImages()
     memset(g_DiskImages, 0, sizeof(g_DiskImages));
 }
 
-bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int scsi_lun, int blocksize)
+bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int scsi_lun, int blocksize, bool is_cd)
 {
     image_config_t &img = g_DiskImages[target_idx];
     img.file = SD.open(filename, O_RDWR);
@@ -77,7 +77,7 @@ bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int
                 " is not divisible.");
         }
 
-        if (tolower(filename[0]) == 'c' && tolower(filename[1]) == 'd')
+        if (is_cd)
         {
             azlog("---- Configuring as CD-ROM drive based on image name");
             img.deviceType = S2S_CFG_OPTICAL;

+ 1 - 1
src/AzulSCSI_disk.h

@@ -14,5 +14,5 @@ extern "C" {
 }
 
 void scsiDiskResetImages();
-bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int scsi_lun, int blocksize);
+bool scsiDiskOpenHDDImage(int target_idx, const char *filename, int scsi_id, int scsi_lun, int blocksize, bool is_cd);
 void scsiDiskLoadConfig(int target_idx);