#include #include #include #include #include #include "legoctl.h" #include "protos.h" int Debug = 0; int main(int argc,char *argv[]) { char *filename = ""; lct_cmd_t cmd = LCT_CMD_STATUS; unsigned int flags = LCT_PROBE_DEV_ALL; switch(argc) { case 1: usage(argv[0]); break; default: break; } if ( parse_args(argc,argv,&cmd,&filename,&flags) == LCT_OK ) { return legoctl(cmd,filename,flags); } else return EX_USAGE; } int legoctl(lct_cmd_t cmd,char *filename,unsigned int flags) { lct_brick_list_t bricks; lct_find_bricks(&bricks,LCT_PROBE_ALL); if ( LCT_BRICK_COUNT(bricks) == 0 ) { fputs("Sorry, no accessible bricks found.\n",stderr); exit(EX_UNAVAILABLE); } switch(cmd) { case LCT_CMD_STATUS: return lego_status(&bricks,flags); case LCT_CMD_PROG_UP: return lego_prog_up(&bricks,filename,flags); case LCT_CMD_DELETE: return lego_delete_file(&bricks,filename,flags); case LCT_CMD_START: return lego_start_program(&bricks,filename,flags); case LCT_CMD_STOP: return lego_stop_program(&bricks,flags); case LCT_CMD_PROG_DOWN: case LCT_CMD_FIRM_UP: case LCT_CMD_FIRM_DOWN: fputs("This command is not yet implemented.\n",stderr); break; default: fprintf(stderr,"Internal error: Invalid command: %d.\n",cmd); fputs("This is a program bug. Please report it to the author(s).\n",stderr); exit(EX_SOFTWARE); } return 0; } int lego_status(lct_brick_list_t *bricks,unsigned int flags) { lct_brick_t *brick; int c; for (c=0; c [slot #]\n",progname); //fprintf(stderr,"\t%s [flags] prog_down [slot #]\n",progname); fprintf(stderr,"\t%s [flags] delete [slot #]\n",progname); //fprintf(stderr,"\t%s [flags] firmware_up \n",progname); //fprintf(stderr,"\t%s [flags] firmware_down \n",progname); fprintf(stderr,"\t%s [flags] start \n",progname); fprintf(stderr,"\t%s [flags] stop\n",progname); fputs("\nFlags:\n",stderr); //fputs("\t--nxt probe for NXT only\n",stderr); //fputs("\t--usb probe USB busses only\n",stderr); //fputs("\t--bluetooth probe bluetooth interfaces only\n",stderr); //fputs("\t--rcx probe for RCX only\n",stderr); fputs("\t--overwrite overwrite existing files on brick\n",stderr); fputs("\t--debug enable debugging output\n",stderr); exit(EX_USAGE); } int parse_args(int argc,char *argv[],lct_cmd_t *cmd,char **filename,unsigned int *flags) { int arg; for (arg = 1; argv[arg] != NULL; ++arg) { if ( strcmp(argv[arg],"status") == 0 ) { *cmd = LCT_CMD_STATUS; } else if ( strcmp(argv[arg],"prog_up") == 0 ) { *cmd = LCT_CMD_PROG_UP; /* The next argument should be the last */ if ( arg == argc - 2 ) *filename = argv[++arg]; else usage(argv[0]); } else if ( strcmp(argv[arg],"prog_down") == 0 ) { *cmd = LCT_CMD_PROG_DOWN; } else if ( strcmp(argv[arg],"firmware_up") == 0 ) { *cmd = LCT_CMD_FIRM_UP; /* The next argument should be the last */ /*if ( arg == argc - 2 ) *filename = argv[++arg]; else usage(argv[0]); */ } else if ( strcmp(argv[arg],"firmware_down") == 0 ) { *cmd = LCT_CMD_FIRM_DOWN; } else if ( strcmp(argv[arg],"delete") == 0 ) { *cmd = LCT_CMD_DELETE; /* The next argument should be the last */ if ( arg == argc - 2 ) *filename = argv[++arg]; else usage(argv[0]); } else if ( strcmp(argv[arg],"start") == 0 ) { *cmd = LCT_CMD_START; /* The next argument should be the last */ if ( arg == argc - 2 ) *filename = argv[++arg]; else usage(argv[0]); } else if ( strcmp(argv[arg],"stop") == 0 ) { *cmd = LCT_CMD_STOP; } else if ( strcmp(argv[arg],"--nxt") == 0 ) { *flags |= LCT_PROBE_DEV_NXT; } else if ( strcmp(argv[arg],"--rcx") == 0 ) { *flags |= LCT_PROBE_DEV_RCX; } else if ( strcmp(argv[arg],"--overwrite") == 0 ) { *flags |= LCT_OVERWRITE; } else if ( strcmp(argv[arg],"--debug") == 0 ) { Debug = 1; } else { fprintf(stderr,"Invalid option: %s\n",argv[arg]); usage(argv[0]); } } return LCT_OK; }