Esempio n. 1
0
static int handle_error(nxt_t *nxt, char *msg, nxt_error_t err)
{
  printf("%s: %s\n", msg, nxt_str_error(err));
  if (nxt != NULL)
    nxt_close(nxt);
  exit(err);
}
Esempio n. 2
0
File: recv.c Progetto: jgraef/aNXT
int main(int argc,char *argv[]) {
  char *name = NULL;
  char *msg;
  int box = 0;
  int clear = 0;
  int verbose = 0;
  int c,newbox;

  while ((c = getopt(argc,argv,":hn:m:cv"))!=-1) {
    switch(c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'n':
        name = strdup(optarg);
        break;
      case 'm':
        newbox = atoi(optarg)-1;
        if (NXT_VALID_MAILBOX(newbox)) box = newbox;
        else {
          fprintf(stderr,"Invalid mailbox: %d",newbox+1);
          usage(argv[0],1);
        }
        break;
      case 'v':
        verbose = 1;
        break;
      case 'c':
        clear = 1;
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }

  if ((msg = nxt_recv_msg(nxt,box,clear))!=NULL) {
    if (verbose) printf("Mailbox %d: ",box+1);
    printf("%s%c",msg,verbose?'\n':0);
    free(msg);
  }
  else fprintf(stderr,"Error: %s\n",nxt_strerror(nxt_error(nxt)));

  int ret = nxt_error(nxt);
  if (name!=NULL) free(name);
  nxt_close(nxt);

  return ret;
}
Esempio n. 3
0
static void quit() {
    SDL_JoystickClose(joy);
    nxt_motor_stop(nxt, NXT_MOTORA, 0);
    nxt_motor_stop(nxt, NXT_MOTORB, 0);
    nxt_motor_stop(nxt, NXT_MOTORC, 0);
    nxt_close(nxt);
    SDL_Quit();
}
Esempio n. 4
0
int main(int argc,char *argv[]) {
  char *name = NULL;
  int btn = NXT_UI_BUTTON_ENTER;
  int c,newbtn;

  while ((c = getopt(argc,argv,":hn:b:"))!=-1) {
    switch (c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'b':
        newbtn = nxt_str2button(optarg);
        if (!NXT_VALID_BUTTON(newbtn)) {
          fprintf(stderr,"Invalid button: %s\n",optarg);
          return 1;
        }
        else btn = newbtn;
        break;
      case 'n':
        name = strdup(optarg);
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }

  nxt_set_button(nxt,btn);

  int ret = nxt_error(nxt);
  if (name!=NULL) free(name);
  nxt_close(nxt);

  return ret;
}
Esempio n. 5
0
int main(int argc,char *argv[]) {
  char *name = NULL;
  int c;
  nxt_t *nxt;
  char *prog;

  while ((c = getopt(argc,argv,":hn:"))!=-1) {
    switch(c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'n':
        name = strdup(optarg);
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }

  prog = nxt_get_program(nxt);
  if (prog!=NULL) {
    printf("%s\n",prog);
    free(prog);
  }
  else fprintf(stderr,"Error: %s\n",nxt_strerror(nxt_error(nxt)));

  int ret = nxt_error(nxt);
  if (name!=NULL) free(name);
  nxt_close(nxt);

  return ret;
}
Esempio n. 6
0
File: modfs.c Progetto: jgraef/aNXT
int main(int argc,char *argv[]) {
  int ret = 0;
  struct fuse_args args = FUSE_ARGS_INIT(argc,argv);
  memset(&options,0,sizeof(struct options));
  if (fuse_opt_parse(&args,&options,nxtfs_opts,NULL)==-1) return 1;

  nxt = nxt_open(options.name);
  if (nxt!=NULL) {
    get_modules();
#ifdef FUSE_VERSION_2_5
    ret = fuse_main(args.argc,args.argv,&nxtfs_oper);
#else
    ret = fuse_main(args.argc,args.argv,&nxtfs_oper,NULL);
#endif
    nxt_close(nxt);
  }
  else ret = 1;

  fuse_opt_free_args(&args);
  return ret;
}
Esempio n. 7
0
int main(int argc, char *argv[])
{
  nxt_t *nxt;
  nxt_error_t err;
  char *bios_file;

  printf("#==========================================================#\n");
  printf("#                  NXT BIOS Flash Utility                  #\n");
  printf("#==========================================================#\n\n");

  if (argc == 1)
    {
      bios_file = (char *) calloc(1,256);
      strcat(bios_file,"../ecrobot/bios/nxt_bios_rom.bin");
    }
  else if (argc != 2)
    {
      printf("Syntax: %s [<NXT BIOS binary>]\n"
             "\n"
             "Example: %s nxt_bios_rom.bin\n", argv[0], argv[0]);
      exit(1);
    }
  else
    {
      bios_file = argv[1];     
    }

  printf("Checking NXT BIOS %s ... ", bios_file);
  NXT_HANDLE_ERR(nxt_firmware_validate(bios_file, MAX_BIOS_FLASH_PAGE ), NULL,
                 "Error in NXT BIOS file");
  printf("NXT BIOS OK.\n");

  NXT_HANDLE_ERR(nxt_init(&nxt), NULL,
                 "Error during library initialization");

  err = nxt_find(nxt);
  if (err)
    {
      if (err == NXT_NOT_PRESENT)
        printf("NXT not found. Is it properly plugged in via USB?\n");
      else
        NXT_HANDLE_ERR(0, NULL, "Error while scanning for NXT");
      exit(1);
    }

  if (!nxt_in_reset_mode(nxt))
    {
      printf("NXT found, but not running in reset mode.\n");
      printf("Please reset your NXT manually and restart this program.\n");
      exit(2);
    }

  NXT_HANDLE_ERR(nxt_open(nxt), NULL, "Error while connecting to NXT");

  printf("NXT device in reset mode located and opened.\n"
         "Starting NXT BIOS flash procedure now...\n");

  NXT_HANDLE_ERR(nxt_firmware_flash(nxt, bios_file, 0, MAX_BIOS_FLASH_PAGE, 1, 0), nxt,
                 "Error flashing NXT BIOS");
  printf("NXT BIOS flash complete.\n");

  NXT_HANDLE_ERR(nxt_jump(nxt, 0x00100000), nxt, "Error booting new NXT BIOS");
  printf("New NXT BIOS started!\n");

  NXT_HANDLE_ERR(nxt_close(nxt), NULL,
                 "Error while closing connection to NXT");
  return 0;
}
Esempio n. 8
0
int main(int argc,char *argv[]) {
  char *name = NULL;
  int c,i,n,newport;
  int port = 0;
  int verbose = 1;
  int reset = 0;
  int mode = -1;
  nxt_cam_object_t objects[8];

  while ((c = getopt(argc,argv,":hn:s:qrl"))!=-1) {
    switch(c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'n':
        name = optarg;
        break;
      case 'q':
        verbose = 0;
        break;
      case 'r':
        reset = 1;
        break;
      case 's':
        newport = atoi(optarg)-1;
        if (NXT_VALID_SENSOR(newport)) port = newport;
        else {
          fprintf(stderr,"Invalid sensor: %s\n",optarg);
          usage(argv[0],1);
        }
        break;
      case 'o':
        mode = NXT_CAM_TRACKING_OBJECT;
        break;
      case 'l':
        mode = NXT_CAM_TRACKING_LINE;
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }

  nxt_set_sensor_mode(nxt,port,NXT_SENSOR_TYPE_LOWSPEED,NXT_SENSOR_MODE_RAW);
  nxt_wait_after_communication_command();

  if (mode!=-1) {
    nxt_cam_set_trackingmode(nxt,port,mode);
    nxt_wait_after_communication_command();
  }
  nxt_cam_enable_tracking(nxt,port,1);
  nxt_wait_after_communication_command();

  n = nxt_cam_num_objects(nxt,port);
  nxt_wait_after_communication_command();
  if (n==-1) {
    fprintf(stderr,"Error: %s\n",nxt_strerror(nxt_error(nxt)));
  }
  else if (nxt_cam_get_objects(nxt,port,0,n,objects)==-1) {
    fprintf(stderr,"Error: %s\n",nxt_strerror(nxt_error(nxt)));
  }
  else {
    if (verbose) {
      printf("Sensor %d:\n",port+1);
      printf("Objects: %d\n",n);
      for (i=0;i<n;i++) {
        printf("pos = (%d, %d);\tsize = (%d, %d);\tcolor = %d\n", objects[i].x, objects[i].y, objects[i].w, objects[i].h, objects[i].color);
      }
    }
    else {
      printf("%d\n",n);
      for (i=0;i<n;i++) {
        printf("%d %d %d %d %d\n", objects[i].x, objects[i].y, objects[i].w, objects[i].h, objects[i].color);
      }
    }
  }

  if (reset) {
    nxt_cam_enable_tracking(nxt,port,0);
    nxt_wait_after_communication_command();
    nxt_set_sensor_mode(nxt,port,NXT_SENSOR_TYPE_NONE,NXT_SENSOR_MODE_RAW);
  }

  int ret = nxt_error(nxt);
  nxt_close(nxt);

  return ret;
}
Esempio n. 9
0
File: pilot.c Progetto: jgraef/aNXT
int main(int argc,char *argv[]) {
  SDL_Event event;
  SDL_Surface *screen;
  SDL_Surface *bg,*left,*enter,*right,*exit,*display_surface;
  SDL_Rect rect_left = {
    .x = 51,
    .y = 172,
    .w = 27,
    .h = 31,
  };
  SDL_Rect rect_enter = {
    .x = 91,
    .y = 173,
    .w = 32,
    .h = 31,
  };
  SDL_Rect rect_right = {
    .x = 136,
    .y = 172,
    .w = 27,
    .h = 31,
  };
  SDL_Rect rect_exit = {
    .x = 91,
    .y = 216,
    .w = 31,
    .h = 20,
  };
  SDL_Rect rect_display = {
    .x = 57,
    .y = 62,
    .w = 100,
    .h = 64,
  };
  int c;
  char *name = NULL;
  int force = 0;

  while ((c = getopt(argc,argv,":hn:f"))!=-1) {
    switch (c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'f':
        force = 1;
        break;
      case 'n':
        name = optarg;
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  // init NXT
  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }
  if (nxt_get_connection_type(nxt)==NXT_CON_BT && !force) {
    fprintf(stderr,"Warning! Using NXT Pilot over Bluetooth can make trouble. Are you sure to continue (y/n)[n]: ");
    if (fgetc(stdin)!='y') {
      nxt_close(nxt);
      return 0;
    }
  }
  nxt_display_t *display = nxt_display_open(nxt);
  if (display==NULL) {
    fprintf(stderr,"Could not open display\n");
    nxt_close(nxt);
    return 1;
  }

  // init window
  if (SDL_Init(SDL_INIT_VIDEO)==-1) {
    fprintf(stderr,"Can't init SDL:  %s\n",SDL_GetError());
    return 1;
  }
  atexit(SDL_Quit);
  screen = SDL_SetVideoMode(215,322,32,SDL_HWSURFACE);
  if (screen==NULL) {
    fprintf(stderr,"Can't open window: %s\n",SDL_GetError());
    return 1;
  }
  SDL_WM_SetCaption("NXT Pilot","NXT Pilot");

  // load images
  bg = IMG_ReadXPMFromArray(pilot_bg_xpm);
  left = IMG_ReadXPMFromArray(pilot_left_xpm);
  enter = IMG_ReadXPMFromArray(pilot_enter_xpm);
  right = IMG_ReadXPMFromArray(pilot_right_xpm);
  exit = IMG_ReadXPMFromArray(pilot_exit_xpm);

  // display NXT
  SDL_BlitSurface(bg,NULL,screen,NULL);
  SDL_BlitSurface(left,NULL,screen,&rect_left);
  SDL_BlitSurface(enter,NULL,screen,&rect_enter);
  SDL_BlitSurface(right,NULL,screen,&rect_right);
  SDL_BlitSurface(exit,NULL,screen,&rect_exit);

  int done = 0;
  unsigned int pause = nxt_get_connection_type(nxt)==NXT_CON_BT?500:100;
  while (!done) {
    while (SDL_PollEvent(&event)) {
      switch(event.type) {
        case SDL_QUIT:
          done = 1;
          break;
        case SDL_KEYUP:
          if (event.key.keysym.sym==SDLK_ESCAPE) done = 1;
          else if (event.key.keysym.sym==SDLK_RETURN) nxt_set_button(nxt,NXT_UI_BUTTON_ENTER);
          else if (event.key.keysym.sym==SDLK_BACKSPACE) nxt_set_button(nxt,NXT_UI_BUTTON_EXIT);
          else if (event.key.keysym.sym==SDLK_LEFT) nxt_set_button(nxt,NXT_UI_BUTTON_LEFT);
          else if (event.key.keysym.sym==SDLK_RIGHT) nxt_set_button(nxt,NXT_UI_BUTTON_RIGHT);
          break;
        case SDL_MOUSEBUTTONUP:
          if (in_rect(rect_left,event.button)) nxt_set_button(nxt,NXT_UI_BUTTON_LEFT);
          else if (in_rect(rect_enter,event.button)) nxt_set_button(nxt,NXT_UI_BUTTON_ENTER);
          else if (in_rect(rect_right,event.button)) nxt_set_button(nxt,NXT_UI_BUTTON_RIGHT);
          else if (in_rect(rect_exit,event.button)) nxt_set_button(nxt,NXT_UI_BUTTON_EXIT);
          break;
      }
    }

    display_surface = load_display(display);
    if (display!=NULL) {
      SDL_BlitSurface(display_surface,NULL,screen,&rect_display);
      SDL_UpdateRect(screen,0,0,0,0);
      SDL_FreeSurface(display_surface);
    }

    SDL_Delay(pause);
  }

  // free images
  SDL_FreeSurface(bg);
  SDL_FreeSurface(left);
  SDL_FreeSurface(enter);
  SDL_FreeSurface(right);
  SDL_FreeSurface(exit);

  // close nxt
  int ret = nxt_error(nxt);
  nxt_display_flush(display,1);
  nxt_display_close(display);
  nxt_close(nxt);

  return ret;
}
Esempio n. 10
0
int main(int argc, char *argv[])
{
  nxt_t *nxt;
  nxt_error_t err;
  char *fw_file;
  FILE *f;
  int ret;
  char *buf;
  long lsize;

  if (argc != 2)
    {
      printf("Syntax: %s <C program image to write>\n"
             "\n"
             "Example: %s flashled.bin\n", argv[0], argv[0]);
      exit(1);
    }

  fw_file = argv[1];

  NXT_HANDLE_ERR(nxt_init(&nxt), NULL,
                 "Error during library initialization");

  err = nxt_find(nxt);
  if (err)
    {
      if (err == NXT_NOT_PRESENT)
        printf("NXT not found. Is it properly plugged in via USB?\n");
      else
        NXT_HANDLE_ERR(0, NULL, "Error while scanning for NXT");
      exit(1);
    }

  f = fopen(fw_file, "rb");
  if (f == NULL) NXT_HANDLE_ERR(8, NULL, "Error opening file");

  fseek (f, 0, SEEK_END);
  lsize=ftell (f);

  rewind(f);

  buf = (char *) malloc(lsize);
  if (buf == NULL) NXT_HANDLE_ERR(8, NULL, "Error allocating memory");

  ret = fread(buf, 1, lsize, f);

  if (ret != (int) lsize) NXT_HANDLE_ERR(8, NULL, "Error reading file");

  printf("File size is %ld\n", lsize);

  fclose(f);

  if (!nxt_in_reset_mode(nxt))
    {
      printf("NXT found, but not running in reset mode.\n");
      printf("Please reset your NXT manually and restart this program.\n");
      exit(2);
    }

  NXT_HANDLE_ERR(nxt_open(nxt), NULL, "Error while connecting to NXT");

  printf("NXT device in reset mode located and opened.\n"
         "Starting C program now...\n");

  // Send the C program
  NXT_HANDLE_ERR(nxt_send_file(nxt, 0x202000, buf, (int) lsize), nxt, 
                  "Error Sending file");

  NXT_HANDLE_ERR(nxt_jump(nxt, 0x202000), nxt,
                 "Error jumping to C program");

  NXT_HANDLE_ERR(nxt_close(nxt), NULL,
                 "Error while closing connection to NXT");
  return 0;
}
Esempio n. 11
0
int main(int argc, char *argv[])
{
  nxt_t *nxt;
  nxt_error_t err;
  char *fw_file, *menu_file;
  char *nxj_home;

  if (argc == 1)
    {
      nxj_home = getenv("NXJ_HOME");
      
      if (nxj_home == NULL || strlen(nxj_home) == 0)
        {
          printf("NXJ_HOME is not defined\n");
          exit(1);
        }
      printf("NXJ_HOME is %s\n", nxj_home);
      
      fw_file = (char *) calloc(1,256);
      strcpy(fw_file, nxj_home);
      strcat(fw_file,"/bin/lejos_nxt_rom.bin");
      menu_file = calloc(1,256);
      strcpy(menu_file,nxj_home);
      strcat(menu_file,"/bin/StartUpText.bin");
    }
  else if (argc != 3)
    {
      printf("Syntax: %s [<VM binary> <java menu binary>]\n"
             "\n"
             "Example: %s lejos_nxt_rom.bin StartUpText.bin\n", argv[0], argv[0]);
      exit(1);
    }
  else
    {
      fw_file = argv[1];     
      menu_file = argv[2];
    }
  
  printf("Checking VM %s ... ", fw_file);
  NXT_HANDLE_ERR(nxt_firmware_validate(fw_file, MAX_VM_PAGES ), NULL,
                 "Error in VM file");
  printf("VM OK.\n");
 
  printf("Checking Menu %s ... ", menu_file);
  NXT_HANDLE_ERR(nxt_firmware_validate(menu_file, (MAX_MENU_PAGES ) - 4), NULL,
                 "Error in Menu file");
  printf("Menu OK.\n");

  NXT_HANDLE_ERR(nxt_init(&nxt), NULL,
                 "Error during library initialization");

  err = nxt_find(nxt);
  if (err)
    {
      if (err == NXT_NOT_PRESENT)
        printf("NXT not found. Is it properly plugged in via USB?\n");
      else
        NXT_HANDLE_ERR(0, NULL, "Error while scanning for NXT");
      exit(1);
    }

  if (!nxt_in_reset_mode(nxt))
    {
      printf("NXT found, but not running in reset mode.\n");
      printf("Please reset your NXT manually and restart this program.\n");
      exit(2);
    }

  NXT_HANDLE_ERR(nxt_open(nxt), NULL, "Error while connecting to NXT");

  printf("NXT device in reset mode located and opened.\n"
         "Starting VM flash procedure now...\n");

  NXT_HANDLE_ERR(nxt_firmware_flash(nxt, fw_file, 0, MAX_VM_PAGES, 1, 0), nxt,
                 "Error flashing VM");
  printf("VM flash complete.\n");

  printf("Starting menu flash procedure now...\n");
  
  NXT_HANDLE_ERR(nxt_firmware_flash(nxt, menu_file, MAX_VM_PAGES, MAX_MENU_PAGES, 0, 1), nxt,
                 "Error flashing menu");
  printf("Menu flash complete.\n");
  
  NXT_HANDLE_ERR(nxt_jump(nxt, 0x00100000), nxt,
                 "Error booting new firmware");
  printf("New firmware started!\n");
  printf("If battery level reads 0.0, remove and re-insert a battery\n");

  NXT_HANDLE_ERR(nxt_close(nxt), NULL,
                 "Error while closing connection to NXT");
  return 0;
}
Esempio n. 12
0
int main(int argc,char *argv[]) {
  char *name = NULL;
  int c,newport;
  int port = 3;
  int verbose = 1;
  int reset = 0;
  int show_length = 0;
  double length;
  struct nxt_accel_vector accel;

  while ((c = getopt(argc,argv,":hn:s:qrm"))!=-1) {
    switch(c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'n':
        name = strdup(optarg);
        break;
      case 'q':
        verbose = 0;
        break;
      case 'r':
        reset = 1;
        break;
      case 's':
        newport = atoi(optarg)-1;
        if (NXT_VALID_SENSOR(newport)) port = newport;
        else {
          fprintf(stderr,"Invalid sensor: %s\n",optarg);
          usage(argv[0],1);
        }
        break;
      case 'm':
        show_length = 1;
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }

  nxt_set_sensor_mode(nxt,port,NXT_SENSOR_TYPE_LOWSPEED,NXT_SENSOR_MODE_RAW);
  nxt_wait_after_communication_command();

  if (nxt_accel_get_accel(nxt,port,&accel)==-1) {
    fprintf(stderr,"Error: %s\n",nxt_strerror(nxt_error(nxt)));
  }
  else {
    if (show_length) {
      length = sqrt(pow(0.001*accel.x, 2.)+pow(0.001*accel.y, 2.)+pow(0.001*accel.z, 2.));
    }

    if (verbose) {
      printf("Sensor %d:\n",port+1);
      printf("x = %.3f G\n", 0.001*accel.x);
      printf("y = %.3f G\n", 0.001*accel.y);
      printf("z = %.3f G\n", 0.001*accel.z);
      if (show_length)  {
        printf("m = %.3f G\n", length);
      }
    }
    else {
      if (show_length) {
        printf("%.3f\n%.3f\n%.3f\n%.3f\n", 0.001*accel.x, 0.001*accel.y, 0.001*accel.z, length);
      }
      else {
        printf("%.3f\n%.3f\n%.3f\n", 0.001*accel.x, 0.001*accel.y, 0.001*accel.z);
      }
    }
  }

  if (reset) {
    nxt_set_sensor_mode(nxt,port,NXT_SENSOR_TYPE_NONE,NXT_SENSOR_MODE_RAW);
  }

  int ret = nxt_error(nxt);
  if (name!=NULL) free(name);
  nxt_close(nxt);

  return ret;
}
Esempio n. 13
0
int main(int argc,char *argv[]) {
  char screen[64][100];
  char *name = NULL;
  char *file = NULL;
  int format = NXT_PNG;
  int transparency = 0;
  int c,x,y,newfmt;

  while ((c = getopt(argc,argv,":hn:f:o:t"))!=-1) {
    switch(c) {
      case 'h':
        usage(argv[0],0);
        break;
      case 'n':
        name = optarg;
        break;
      case 'f':
        newfmt = nxt_str2fileformat(optarg);
        if (newfmt==0) {
          fprintf(stderr,"Invalid file format\n");
          usage(argv[0],1);
        }
        else format = newfmt;
        break;
      case 'o':
        file = optarg;
        break;
      case 't':
        transparency = 1;
        break;
      case ':':
        fprintf(stderr,"Option -%c requires an operand\n",optopt);
        usage(argv[0],1);
        break;
      case '?':
        fprintf(stderr,"Unrecognized option: -%c\n", optopt);
        usage(argv[0],1);
        break;
    }
  }

  nxt_t *nxt = nxt_open(name);
  if (nxt==NULL) {
    fprintf(stderr,"Could not find NXT\n");
    return 1;
  }
  nxt_display_t *display = nxt_display_open(nxt);
  if (display==NULL) {
    fprintf(stderr,"Could not open display\n");
    nxt_close(nxt);
    return 1;
  }

  if (nxt_display_refresh(display)==0) {
    gdImagePtr im;
    int black,white;
    im = gdImageCreate(100,64);
    black = gdImageColorAllocate(im,0,0,0);
    white = gdImageColorAllocate(im,255,255,255);
    if (transparency) gdImageColorTransparent(im,white);
    for (y=0;y<64;y++) {
      for (x=0;x<100;x++) gdImageSetPixel(im,x,y,display->buffer[y][x]==NXT_DISPLAY_BLACK?black:white);
    }
    FILE *out = fopen(file!=NULL?file:(format==NXT_JPEG?"display.jpg":"display.png"),"w");
    if (format==NXT_JPEG) gdImageJpeg(im,out,-1);
    else if (format==NXT_PNG) gdImagePng(im,out);
    fclose(out);
    gdImageDestroy(im);
  }

  int ret = nxt_error(nxt);
  nxt_display_flush(display,1);
  nxt_display_close(display);
  nxt_close(nxt);

  return ret;
}