From 8db8000db3e83c1ee689c4e6a3ae65204e2d27b4 Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Sat, 19 Mar 2022 07:25:25 -0500 Subject: [PATCH] Image set selection --- .vscode/extensions.json | 17 +++--- src/BlueSCSI.cpp | 132 +++++++++++++++++++++++++++------------- 2 files changed, 101 insertions(+), 48 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0f0d740..080e70d 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,7 +1,10 @@ -{ - // See http://go.microsoft.com/fwlink/?LinkId=827846 - // for the documentation about the extensions.json format - "recommendations": [ - "platformio.platformio-ide" - ] -} +{ + // See http://go.microsoft.com/fwlink/?LinkId=827846 + // for the documentation about the extensions.json format + "recommendations": [ + "platformio.platformio-ide" + ], + "unwantedRecommendations": [ + "ms-vscode.cpptools-extension-pack" + ] +} diff --git a/src/BlueSCSI.cpp b/src/BlueSCSI.cpp index ab9ebec..6c4e0d5 100644 --- a/src/BlueSCSI.cpp +++ b/src/BlueSCSI.cpp @@ -116,6 +116,10 @@ SdFs SD; #define SD_CS PA4 // SDCARD:CS #define LED PC13 // LED +// Image Set Selector +#define IMAGE_SELECT1 PA1 +#define IMAGE_SELECT2 PB1 + // GPIO register port #define PAREG GPIOA->regs #define PBREG GPIOB->regs @@ -252,6 +256,7 @@ void noSDCardFound(void); void onBusReset(void); void initFileLog(int); void finalizeFileLog(void); +void findDriveImages(FsFile root); /* * IO read. @@ -335,16 +340,14 @@ void readSDCardInfo() * Open HDD image file */ -bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize) +bool hddimageOpen(HDDIMG *h, FsFile file,int id,int lun,int blocksize) { h->m_fileSize = 0; h->m_blocksize = blocksize; - h->m_file = SD.open(image_name, O_RDWR); + h->m_file = file; if(h->m_file.isOpen()) { h->m_fileSize = h->m_file.size(); - LOG_FILE.print("Imagefile: "); - LOG_FILE.print(image_name); if(h->m_fileSize>0) { // check blocksize dummy file @@ -359,9 +362,9 @@ bool hddimageOpen(HDDIMG *h,const char *image_name,int id,int lun,int blocksize) } else { + LOG_FILE.println(" - file is 0 bytes, can not use."); h->m_file.close(); h->m_fileSize = h->m_blocksize = 0; // no file - LOG_FILE.println("FileSizeError"); } } return false; @@ -392,6 +395,14 @@ void setup() // PIN initialization gpio_mode(LED2, GPIO_OUTPUT_PP); gpio_mode(LED, GPIO_OUTPUT_OD); + + // Image Set Select Init + gpio_mode(IMAGE_SELECT1, GPIO_INPUT_PU); + gpio_mode(IMAGE_SELECT2, GPIO_INPUT_PU); + pinMode(IMAGE_SELECT1, INPUT); + pinMode(IMAGE_SELECT2, INPUT); + int image_file_set = ((digitalRead(IMAGE_SELECT1) == LOW) ? 1 : 0) | ((digitalRead(IMAGE_SELECT2) == LOW) ? 2 : 0); + LED_OFF(); //GPIO(SCSI BUS)Initialization @@ -450,18 +461,71 @@ void setup() scsi_id_mask = 0x00; // Iterate over the root path in the SD card looking for candidate image files. - SdFile root; - root.open("/"); - SdFile file; - bool imageReady; - int usedDefaultId = 0; + FsFile root; + + char image_set_dir_name[] = "/ImageSetX/"; + image_set_dir_name[9] = char(image_file_set) + 0x30; + root.open(image_set_dir_name); + if (root.isDirectory()) { + LOG_FILE.print("Looking for images in: "); + LOG_FILE.println(image_set_dir_name); + LOG_FILE.sync(); + } else { + root.close(); + root.open("/"); + } + + findDriveImages(root); + root.close(); + + FsFile images_all_dir; + images_all_dir.open("/ImageSetAll/"); + if (images_all_dir.isDirectory()) { + LOG_FILE.println("Looking for images in: /ImageSetAll/"); + LOG_FILE.sync(); + findDriveImages(images_all_dir); + } + images_all_dir.close(); + + // Error if there are 0 image files + if(scsi_id_mask==0) { + LOG_FILE.println("ERROR: No valid images found!"); + onFalseInit(); + } + + finalizeFileLog(); + LED_OFF(); + //Occurs when the RST pin state changes from HIGH to LOW + attachInterrupt(RST, onBusReset, FALLING); +} + +void findDriveImages(FsFile root) { + bool image_ready; + FsFile file; + char path_name[MAX_FILE_PATH+1]; + root.getName(path_name, sizeof(path_name)); + SD.chdir(path_name); + while (1) { - if (!file.openNext(&root, O_READ)) break; + // Directories can not be opened RDWR, so it will fail, but fails the same way with no file/dir, so we need to peek at the file first. + FsFile file_test = root.openNextFile(O_RDONLY); char name[MAX_FILE_PATH+1]; - if(!file.isDir()) { - file.getName(name, MAX_FILE_PATH+1); - file.close(); - String file_name = String(name); + file_test.getName(name, MAX_FILE_PATH+1); + String file_name = String(name); + + // Skip directories and already open files. + if(file_test.isDir() || file_name.startsWith("LOG.txt")) { + file_test.close(); + continue; + } + // If error there is no next file to open. + if(file_test.getError() > 0) { + file_test.close(); + break; + } + // Valid file, open for reading/writing. + file = SD.open(name, O_RDWR); + if(file && file.isFile()) { file_name.toLowerCase(); if(file_name.startsWith("hd")) { // Defaults for Hard Disks @@ -479,7 +543,8 @@ void setup() if(tmp_id > -1 && tmp_id < 8) { id = tmp_id; } else { - usedDefaultId++; + LOG_FILE.print(name); + LOG_FILE.println(" - bad SCSI id in filename, Using default ID 1"); } } @@ -501,38 +566,23 @@ void setup() 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 + LOG_FILE.print(" - "); + LOG_FILE.print(name); + image_ready = hddimageOpen(h, file, id, lun, blk); + if(image_ready) { // Marked as a responsive ID scsi_id_mask |= 1< 1) { - LOG_FILE.println("!! More than one image did not specify a SCSI ID. Last file will be used at ID 1 !!"); LOG_FILE.sync(); } - root.close(); - - // Error if there are 0 image files - if(scsi_id_mask==0) { - LOG_FILE.println("ERROR: No valid images found!"); - onFalseInit(); - } - - finalizeFileLog(); - LED_OFF(); - //Occurs when the RST pin state changes from HIGH to LOW - attachInterrupt(RST, onBusReset, FALLING); + // cd .. before going back. + SD.chdir("/"); } /*