浏览代码

Allow for more dynamic handling of image files

Eric Helgeson 4 年之前
父节点
当前提交
27c77c269c
共有 2 个文件被更改,包括 47 次插入35 次删除
  1. 2 2
      platformio.ini
  2. 45 33
      src/BlueSCSI.cpp

+ 2 - 2
platformio.ini

@@ -23,13 +23,13 @@ build_unflags =
     -Os
     -DARDUINO_ARCH_STM32F1
 build_flags = 
-    -O3
     -w
-    -DDEBUG_LEVEL=DEBUG_NONE
     -DARDUINO_GENERIC_STM32F103C
     -DARDUINO_LIB_DISCOVERY_PHASE
     -DARDUINO=10813
     -DARDUINO_ARCH_STM32
+    -DDEBUG_LEVEL=DEBUG_NONE
+    -O3
 
 ; Possible work around for clones, untested.
 ; https://community.platformio.org/t/cannot-upload-to-stm32-bluepill-board-over-stlink-v2/3492/25

+ 45 - 33
src/BlueSCSI.cpp

@@ -164,11 +164,9 @@ SdFs SD;
 #define SCSI_TARGET_INACTIVE() { SCSI_OUT(vREQ,inactive); SCSI_OUT(vMSG,inactive); SCSI_OUT(vCD,inactive);SCSI_OUT(vIO,inactive); SCSI_OUT(vBSY,inactive); gpio_mode(BSY, GPIO_INPUT_PU); }
 
 // HDDiamge file
-#define HDIMG_FILE_256  "HDxx_256.hda"  // BLOCKSIZE=256  HDD image file
-#define HDIMG_FILE_512  "HDxx_512.hda"  // BLOCKSIZE=512  HDD image file name base
-#define HDIMG_FILE_1024 "HDxx_1024.hda" // BLOCKSIZE=1024 HDD image file
 #define HDIMG_ID_POS  2                 // Position to embed ID number
 #define HDIMG_LUN_POS 3                 // Position to embed LUN numbers
+#define HDIMG_BLK_POS 5                 // Position to embed block size numbers
 #define MAX_FILE_PATH 32                // Maximum file name length
 
 // HDD image
@@ -277,20 +275,14 @@ inline byte readIO(void)
 
 bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize)
 {
-  char file_path[MAX_FILE_PATH+1];
-
-  // build file path
-  strcpy(file_path,image_name);
-  file_path[HDIMG_ID_POS ] = '0'+id;
-  file_path[HDIMG_LUN_POS] = '0'+lun;
   h->m_fileSize = 0;
   h->m_blocksize = blocksize;
-  h->m_file = SD.open(file_path, O_RDWR);
+  h->m_file = SD.open(image_name, O_RDWR);
   if(h->m_file.isOpen())
   {
     h->m_fileSize = h->m_file.size();
     LOG_FILE.print("Imagefile: ");
-    LOG_FILE.print(file_path);
+    LOG_FILE.print(image_name);
     if(h->m_fileSize>0)
     {
       // check blocksize dummy file
@@ -375,31 +367,49 @@ void setup()
   m_buf[MAX_BLOCKSIZE] = 0xff; // DB0 all off,DBP off
   //HD image file open
   scsi_id_mask = 0x00;
-  for(int id=0;id<NUM_SCSIID;id++)
-  {
-    for(int lun=0;lun<NUM_SCSILUN;lun++)
-    {
-      HDDIMG *h = &img[id][lun];
-      bool imageReady = false;
-      if(!imageReady)
-      {
-        imageReady = hddimageOpen(h,HDIMG_FILE_256,id,lun,256);
-      }
-      if(!imageReady)
-      {
-        imageReady = hddimageOpen(h,HDIMG_FILE_512,id,lun,512);
-      }
-      if(!imageReady)
-      {
-        imageReady = hddimageOpen(h,HDIMG_FILE_1024,id,lun, 1024);
-      }
-      if(imageReady)
-      {
-        // Marked as a responsive ID
-        scsi_id_mask |= 1<<id;
+
+  // Iterate over the root path in the SD card looking for candidate image files.
+  SdFile root;
+  root.open("/");
+  SdFile file;
+  bool imageReady;
+  while (1) {
+    if (!file.openNext(&root, O_READ)) break;
+    char name[MAX_FILE_PATH+1];
+    if(!file.isDir()) {
+      file.getName(name, MAX_FILE_PATH+1);
+      file.close();
+      String file_name = String(name);
+      if(file_name.startsWith("HD") && file_name.endsWith(".hda")) {
+        int id  = name[HDIMG_ID_POS] - '0';
+        int lun = name[HDIMG_LUN_POS] - '0';
+        int blk = name[HDIMG_BLK_POS] - '0';
+        if(blk == 2) {
+          blk = 256;
+        } else if(blk == 1) {
+          blk = 1024;
+        } else {
+          blk = 512;
+        }
+        if(id < NUM_SCSIID && lun < NUM_SCSILUN) {
+          HDDIMG *h = &img[id][lun];
+          imageReady = hddimageOpen(h,name,id,lun,blk);
+          if(imageReady) { // Marked as a responsive ID
+            scsi_id_mask |= 1<<id;
+          }
+        } else {
+          LOG_FILE.print("Bad LUN or SCSI id for image: ");
+          LOG_FILE.println(name);
+        }
       }
+      // else {
+      //     LOG_FILE.print("Not an image: ");
+      //     LOG_FILE.println(name);
+      // }
     }
   }
+  root.close();
+
   // Error if there are 0 image files
   if(scsi_id_mask==0) onFalseInit();
 
@@ -425,6 +435,8 @@ void initFileLog() {
   LOG_FILE.println(SDFAT_FILE_TYPE);
   LOG_FILE.print("SdFat version: ");
   LOG_FILE.println(SD_FAT_VERSION_STR);
+  LOG_FILE.print("SdFat Max FileName Length: ");
+  LOG_FILE.println(MAX_FILE_PATH);
   LOG_FILE.println("Initialized SD Card - lets go!");
 }