void xfer(serial_h com, configuration_t *config) { FILE *log = NULL ; int ch ; int linelen ; char buffer[MAXLINELEN] ; do { bbc_status_t result = BBC_OK ; printf("\f\n\n" " (R)eceive files from BBC (S)end files to BBC\n" " (*)-command on BBC (D)o command on PC\n" " (T)erminal emulation (G)et disc image from BBC\n" " (L)og BBC OSCLI output %s (C)d to directory\n" " (P)C file CRC (B)BC file CRC\n" " (Q)uit\n\n" "Enter command: ", log ? "(on) " : "(off)") ; do { ch = toupper(keyboard_char()) ; } while ( strchr("RS*DTGLCQPB", ch) == NULL ) ; putchar(ch) ; switch ( ch ) { case 'L': putchar('\n') ; if ( log ) { fclose(log) ; log = NULL ; puts("Logging turned off") ; } else { printf("Log OSCLI output to file: ") ; linelen = keyboard_line(buffer, MAXLINELEN) ; if ( linelen == 0 ) puts("No log file specified, not logging\n") ; else if ( (log = fopen(buffer, "w+")) == NULL ) printf("Problem opening log file %s, not logging\n", buffer) ; } break ; case 'R': putchar('\n') ; result = retrieve_files(com, config->wildcards, config->directories) ; break ; case 'S': putchar('\n') ; result = send_files(com, config->wildcards, config->directories) ; break ; case 'P': putchar('\n') ; result = local_crc() ; break ; case 'B': putchar('\n') ; result = remote_crc(com, config->wildcards, config->directories) ; break ; case '*': result = oscli(com, log) ; break ; case 'G': putchar('\n') ; result = retrieve_disc(com) ; break ; case 'D': (void)getcwd(buffer, MAXLINELEN) ; printf("\n%s> ", buffer) ; linelen = keyboard_line(buffer, MAXLINELEN) ; fflush(stdout) ; fflush(stdin) ; if ( linelen > 0 ) { keyboard_close() ; system(buffer) ; keyboard_open() ; } break ; case 'C': printf("\nDirectory: ") ; linelen = keyboard_line(buffer, MAXLINELEN) ; if ( chdir(buffer) != 0 ) printf("Problem changing directory to %s, ignoring\n", buffer) ; break ; case 'T': putchar('\n') ; result = terminal(com) ; break ; } while ( result == BBC_ERROR ) { serial_printf(com, ERR_TXT) ; if ( (result = bbc_readline(com, buffer, MAXLINELEN)) == BBC_OK && (result = bbc_readline(com, buffer, MAXLINELEN)) == BBC_OK ) printf("BBC Error: %s\n", buffer) ; } } while ( ch != 'Q' ) ; putchar('\n') ; serial_printf(com, "Q") ; if ( log ) fclose(log) ; }
int selectFile(char *filename, char *extension) { int skip = 0; int selected = 0; char pwd[FLEN]; memset(pwd, 0, FLEN); font=&Font_7x8; while(1) { int total; char files[PERPAGE][FLEN+2]; int count = retrieve_files(files, PERPAGE, skip, extension, pwd, &total); if (selected >= count) { selected = count - 1; } /* optimization: don't reload filelist if only redraw needed */ redraw: lcdClear(); lcdPrint("["); lcdPrint(pwd); lcdPrintln("]"); for (int i = 0; i < 98; i++) { lcdSetPixel(i, 9, 1); } lcdSetCrsr(0, 12); if (!count) { lcdPrintln("- empty"); } else { for (int i = 0; i < count; i++) { if (selected == i) { lcdPrint("*"); } else { lcdPrint(" "); } lcdSetCrsrX(14); lcdPrintln(files[i]); } } lcdRefresh(); char key = getInputWaitRepeat(); switch (key) { case BTN_DOWN: if (selected < count - 1) { selected++; goto redraw; } else { if (skip < total - PERPAGE) { skip++; } else { skip = 0; selected = 0; continue; } } break; case BTN_UP: if (selected > 0) { selected--; goto redraw; } else { if (skip > 0) { skip--; } else { skip = total - PERPAGE; if (skip < 0) { skip = 0; } selected = PERPAGE - 1; continue; } } break; case BTN_LEFT: if (pwd[0] == 0) { return -1; } else { pwd[0] = 0; continue; } case BTN_ENTER: case BTN_RIGHT: if (count) { if (files[selected][strlen(files[selected]) - 1] == '/') { /* directory selected */ strcpy(pwd, files[selected]); continue; } else { strcpy(filename, pwd); strcpy(filename + strlen(pwd), files[selected]); getInputWaitRelease(); /* ?! */ return 0; } } } } }