Esempio n. 1
0
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) ;
}
Esempio n. 2
0
File: select.c Progetto: derf/r0ket
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;
				}
			}
		}
	}
}