#include #include #include #include #include #include "psm.h" #include "config.h" int parse_opts(int argc, char **argv, char *prefix, long *bitrate, char *camdev, int *settime, int *isimgid, int *thumb) { char optstr[] = "bhin:p:r:t"; int curopt; extern char *optarg; while ((curopt = getopt(argc, argv, optstr)) != EOF) { switch (curopt) { case 'b': *thumb = 1; break; case 'i': *isimgid = 1; break; case 'n': strncpy(prefix, optarg, 19); break; case 'r': sscanf(optarg, "%ld", bitrate); break; case 'p': strncpy(camdev, optarg, 69); break; case 't': *settime = 1; break; case 'h': default: return -1; } } return 0; } /* get a picture with image id imgid; if index is non-negative, use it in file name*/ int getpic(int imgid, char *prefix, int cam, int retry, int index, int thumb) { uchar sendme[] = { 0x30, 0x88, 0x00, 0x00, 0x02, 0x00, 0x01, 0x80, 0x03, 0x46 }; int res, len, dumint, errcode; FILE *ausf; char fname[FNAMLEN + 6] = ""; uchar *resblock; sendme[6] = imgid; if (thumb) sendme[0] = 0; res = camsenddata(cam, sendme, 8); if (res < 0) { fprintf(stderr, "Camera did not accept command\n"); return -1; } if (index<0) index = imgid; if (*prefix) { if (thumb) sprintf(fname, "%s%02d.tbn.jpg", prefix, index); else sprintf(fname, "%s%02d.jpg", prefix, index); fprintf(stderr, "Writing image with id # %d to file %s...\n", imgid, fname); ausf = fopen(fname, "w"); } else ausf = stdout; res = camreaddata(cam, ausf); fprintf(stderr,"\n"); if (ausf != stdout) { fflush(ausf); fclose(ausf); } if (res < 0) { fprintf(stderr, " image transfer failed\n"); if (*fname) { fprintf(stderr, ", removing %s\n", fname); unlink(fname); } fprintf(stderr, ".\n"); if (retry < 2) { fprintf(stderr, "Retrying download\n"); cancel(cam); getpic(imgid, prefix, cam, retry + 1, index, thumb); } } else { resblock = get_datablock(cam, &len, &dumint, 0, 0); errcode = resblock[2] + resblock[3] * 0x100; free(resblock); if (errcode) { cam_err(errcode); return -1; } } return 0; } /* Gets picture with image number picno */ int getpic_imno(int picno, char *prefix, int cam, int retry, int thumb) { int imgid; uchar *picinfo; imgid = getimageinfo(picno, cam, &picinfo); if (imgid == -1) return -1; free(picinfo); getpic(imgid, prefix, cam, retry, picno, thumb); return 0; } /* Gets all pictures in the camera */ int getall(int cam, char *prefix, int thumb) { int nopics, i, ind; uchar *picdesc; if (!*prefix) { fprintf(stderr, "Must give prefix for psmget all.\n"); return -1; } nopics = get_status(cam); for (i = 1; i <= nopics; i++) { ind = getimageinfo(i, cam, &picdesc); if (ind == -1) { fprintf(stderr, "Protocol violation in getall/getimageinfo\n"); break; } free(picdesc); if (getpic(ind, prefix, cam, 0, i, thumb)) { fprintf(stderr, "Download failed after second attempt, bailing out\n"); return -1; } } return 0; } void this_usage(char *progname) { usage(progname,"%s [opts] {}|all: get pictures"\ " from HP Photosmart cameras\n", " -b get thumbnails instead of full size pictures\n"\ " -i numbers are image ids (don't worry)\n"\ " -n stores pictures with prefix \n"); exit(-1); } int main(int argc, char **argv) { int cam, i; int picno; char camdev[70] = DEFAULT_PORT; char prefix[20] = ""; long bitrate = DEFAULT_BITRATE; int settime = 0, isimgid = 0, thumb = 0; extern int optind; signal(SIGINT, cleanup); signal(SIGHUP, cleanup); signal(SIGTERM, cleanup); if (getenv("PSM_BPS")) { sscanf(getenv("PSM_BPS"), "%ld", &bitrate); if ((bitrate != 19200) && (bitrate != 38400) && (bitrate != 57600) && (bitrate != 115200)) { fprintf(stderr, "Unknown bitrate %ld, using 19200\n", bitrate); bitrate = 19200; } } if (getenv("PSM_PORT")) strncpy(camdev, getenv("PSM_PORT"), 69); if (parse_opts (argc, argv, prefix, &bitrate, camdev, &settime, &isimgid, &thumb)) { this_usage(argv[0]); } if (argc <= optind) { this_usage(argv[0]); cam_close(cam); return 0; } cam = cam_open(camdev, bitrate); if (cam < 0) { fprintf(stderr, "Camera failed to acknowledge ping. Is it connected?\n"); return -1; } if (cam == 0) { fprintf(stderr, "Error opening serial port. Is is busy?\n"); return -1; } if (settime) set_tod(cam); if (!strcmp(argv[optind], "all")) { getall(cam, prefix,thumb); cam_close(cam); return 0; } for (i = optind; i < argc; i++) { if (!sscanf(argv[i], "%d", &picno)) { fprintf(stderr, "Problem figuring out picture number from \"%s\"\n", argv[i]); cam_close(cam); exit(-1); } if (isimgid) getpic(picno, prefix, cam, 0, -1, thumb); else getpic_imno(picno, prefix, cam, 0, thumb); } cam_close(cam); return 0; } /* Hi, vim... vi: ts=8 */