Added command line parsing (incl. printing usage).

This commit is contained in:
Oliver Schmidt 2018-02-04 18:37:49 +01:00
parent 21dbb3da3d
commit 9fd4088746

View File

@ -19,9 +19,6 @@
#define PORT_STR "usbserial" #define PORT_STR "usbserial"
#define VERBOSE (0)
#define LOG (1)
#if 0 #if 0
//TODO: Switch xHD client to Z8530 built-in CRC calc //TODO: Switch xHD client to Z8530 built-in CRC calc
/* /*
@ -51,16 +48,59 @@ crc_xmodem(char *ptr, unsigned count)
} }
#endif #endif
int main(void) int main(int argc, char *argv[])
{ {
// TODO: Parse cmd line for switches & disk image filenames bool bVerbose = false;
bool bLog = true;
char *apFilename[2] = {0, 0};
unsigned char auReadBuf[256] = {0}; for (int iArg = 1; iArg < argc; iArg++)
enum sp_return eResult; {
if (argv[iArg][0] == '-')
{
for (int iChar = 1; argv[iArg][iChar]; iChar++)
{
switch (argv[iArg][iChar])
{
case 'v':
{
bVerbose = true;
printf("Verbose: On\n");
break;
}
case 'n':
{
bLog = false;
if (bVerbose)
printf("Logging: Off\n");
break;
}
}
}
continue;
}
for (int iDrive = 0; iDrive < 2; iDrive++)
{
if (apFilename[iDrive] == 0)
{
apFilename[iDrive] = argv[iArg];
if (bVerbose)
printf("Drive %d: %s\n", iDrive + 1, apFilename[iDrive]);
break;
}
}
}
// Map virtual drives if (apFilename[0] == 0)
const char *apFilename[2] = {"/Applications/GSport/HD/P1NEW.PO", "/Applications/GSport/HD/P2.PO"}; {
//const char *apFilename[2] = {"/Applications/GSport/HD/P1NEW.PO", "/Applications/GSport/Disk5.25/ProDOS_2_5a1.PO"}; printf("Usage: %s [-nv] img1 [img2]\n"
"\t-n\tno logging\n"
"\t-v\tbe verbose\n"
"\timg1\tdrive 1 disk image filename\n"
"\timg2\tdrive 2 disk image filename\n",
argv[0]);
return EXIT_FAILURE;
}
char * apFileData[2]; char * apFileData[2];
for (int iDrive=0; iDrive<2; iDrive++) for (int iDrive=0; iDrive<2; iDrive++)
@ -72,6 +112,8 @@ int main(void)
apFileData[iDrive] = (char*) mmap(0, uFilesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); apFileData[iDrive] = (char*) mmap(0, uFilesize, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
} }
enum sp_return eResult;
// Create a configuration for the serial ports // Create a configuration for the serial ports
struct sp_port_config *pSerialConfig=0; struct sp_port_config *pSerialConfig=0;
{ {
@ -105,7 +147,7 @@ int main(void)
if (strstr(sp_get_port_name(pPort), PORT_STR) ) if (strstr(sp_get_port_name(pPort), PORT_STR) )
{ {
if (VERBOSE) if (bVerbose)
{ {
printf("Valid port %d: %s\n", iValidPortCount, sp_get_port_name(pPort) ); printf("Valid port %d: %s\n", iValidPortCount, sp_get_port_name(pPort) );
printf("\tDescr: %s\n", sp_get_port_description(pPort)); printf("\tDescr: %s\n", sp_get_port_description(pPort));
@ -146,7 +188,7 @@ int main(void)
iValidPortCount--; iValidPortCount--;
sp_close(pPort); sp_close(pPort);
sp_free_port(pPort); sp_free_port(pPort);
if (VERBOSE) if (bVerbose)
{ {
printf("\n\t--- Could not open this port ---\n\n"); printf("\n\t--- Could not open this port ---\n\n");
} }
@ -155,8 +197,8 @@ int main(void)
} }
else // ! usbserial else // ! usbserial
{ {
if (VERBOSE) if (bVerbose)
printf("\tskip\t'%s'.\n", sp_get_port_name(pPort)); printf("\tskip\t'%s'\n", sp_get_port_name(pPort));
} }
} }
sp_free_port_list(ports); sp_free_port_list(ports);
@ -171,6 +213,8 @@ int main(void)
// TODO: Add server shutdown // TODO: Add server shutdown
while (1) while (1)
{ {
unsigned char auReadBuf[256];
for (int iIndex = 0; iIndex < iValidPortCount; iIndex++) for (int iIndex = 0; iIndex < iValidPortCount; iIndex++)
{ {
struct sp_port *pPort = apValidPorts[iIndex]; struct sp_port *pPort = apValidPorts[iIndex];
@ -183,13 +227,13 @@ int main(void)
if (iBytesRead > 0) if (iBytesRead > 0)
{ {
if (VERBOSE) if (bVerbose)
printf("P%d) Cmd %02X\n", iIndex, auReadBuf[0]); printf("P%d) Cmd %02X\n", iIndex, auReadBuf[0]);
// Now read 16-bit block number and byte checksum // Now read 16-bit block number and byte checksum
iBytesRead = 1 + sp_blocking_read(pPort, auReadBuf+1, 3, 1/*ms timeout*/); iBytesRead = 1 + sp_blocking_read(pPort, auReadBuf+1, 3, 1/*ms timeout*/);
if (iBytesRead != 4) continue; if (iBytesRead != 4) continue;
if (VERBOSE) if (bVerbose)
{ {
for (int i = 0; i < iBytesRead; i++) for (int i = 0; i < iBytesRead; i++)
{ {
@ -203,7 +247,7 @@ int main(void)
auReadBuf[0],auReadBuf[1],auReadBuf[2],auReadBuf[3],iChksum); auReadBuf[0],auReadBuf[1],auReadBuf[2],auReadBuf[3],iChksum);
continue; continue;
} }
if (VERBOSE) if (bVerbose)
printf("\tChksum ok: %02X\n", auReadBuf[4]); printf("\tChksum ok: %02X\n", auReadBuf[4]);
// If 4x bytes were read and the checksum passed, process request // If 4x bytes were read and the checksum passed, process request
@ -235,7 +279,7 @@ int main(void)
iTxLen = sp_blocking_write(pPort, &iChksum, 1, 30/*ms timeout*/); iTxLen = sp_blocking_write(pPort, &iChksum, 1, 30/*ms timeout*/);
if (iTxLen != 1) continue; if (iTxLen != 1) continue;
if (LOG) if (bLog)
{ {
printf("%d\tR %5d\r", (auReadBuf[0] >> 2) & 1, iBlock); printf("%d\tR %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
fflush(stdout); fflush(stdout);
@ -262,7 +306,7 @@ int main(void)
memcpy(pDriveData, auBlockBuf, 512); memcpy(pDriveData, auBlockBuf, 512);
} }
if (LOG) if (bLog)
{ {
printf("%d\t\t\t\tW %5d\r", (auReadBuf[0] >> 2) & 1, iBlock); printf("%d\t\t\t\tW %5d\r", (auReadBuf[0] >> 2) & 1, iBlock);
fflush(stdout); fflush(stdout);