X-Git-Url: http://git.zerfleddert.de/cgi-bin/gitweb.cgi/rigol/blobdiff_plain/0b7a29d92ef3656b4c740b313f901a9d62f593a3..refs/heads/master:/commands.c?ds=inline diff --git a/commands.c b/commands.c index f5b3973..1b243a2 100644 --- a/commands.c +++ b/commands.c @@ -1,15 +1,16 @@ -#include #include #include #include #include #include +#include +#include #include "png.h" -#include "usbtmc.h" +#include "scope.h" #include "commands.h" -void do_plot (struct usb_dev_handle *sc) +void do_plot (struct scope *sc) { unsigned char ch1[1024], ch2[1024]; int i, l; @@ -17,13 +18,13 @@ void do_plot (struct usb_dev_handle *sc) static FILE *gnuplot=NULL; FILE *fp; - l = usbtmc_sendscpi(sc, ":WAV:DATA? CHANEL1", ch1, 1024); + l = sendscpi(sc, ":WAV:DATA? CHANEL1", ch1, 1024); if (l != 1024) { printf ("hmm. didnt' get 1024 bytes. \n"); } - l = usbtmc_sendscpi(sc, ":WAV:DATA? CHANNEL2", ch2, 1024); + l = sendscpi(sc, ":WAV:DATA? CHANNEL2", ch2, 1024); if (l != 1024) { printf ("hmm. didnt' get 1024 bytes. \n"); @@ -46,13 +47,13 @@ void do_plot (struct usb_dev_handle *sc) #define ERROR -1e100 -static double get_float_from_scope (struct usb_dev_handle *sc, char *var) +static double get_float_from_scope (struct scope *sc, char *var) { unsigned char buf[1024]; double temp; int l; - l = usbtmc_sendscpi(sc, var, buf, 1024); + l = sendscpi(sc, var, buf, 1024); if (l > 0) { sscanf ((char*)buf, "%lf", &temp); return temp; @@ -61,7 +62,7 @@ static double get_float_from_scope (struct usb_dev_handle *sc, char *var) } -void do_get_buf (struct usb_dev_handle *sc) +void do_get_buf (struct scope *sc) { FILE *fp; int i, j, l, bp; @@ -70,7 +71,7 @@ void do_get_buf (struct usb_dev_handle *sc) unsigned char data[512*1024]; double sampfreq; - usbtmc_sendscpi (sc, ":STOP", NULL, 0); + sendscpi (sc, ":STOP", NULL, 0); sampfreq = get_float_from_scope (sc, ":ACQ:SAMP?"); @@ -78,7 +79,7 @@ void do_get_buf (struct usb_dev_handle *sc) sprintf (buf, ":TIM:SCAL %.15f", 50 / sampfreq); printf ("sending scale cmd: %s\n", buf); - usbtmc_sendscpi (sc, buf, NULL, 0); + sendscpi (sc, buf, NULL, 0); sleep (1); @@ -86,9 +87,9 @@ void do_get_buf (struct usb_dev_handle *sc) for (i=-254*1024;i< 254*1024;i += 600) { sprintf (buf, ":TIM:OFFSET %.15f", i / sampfreq); printf ("Sending offset cmd: %s\n", buf); - usbtmc_sendscpi (sc, buf, NULL, 0); + sendscpi (sc, buf, NULL, 0); - l = usbtmc_sendscpi(sc, ":WAV:DATA? CHANEL1", ch1, 1024); + l = sendscpi(sc, ":WAV:DATA? CHANEL1", ch1, 1024); if (l != 1024) { printf ("hmm. didnt' get 1024 bytes. \n"); @@ -103,46 +104,62 @@ void do_get_buf (struct usb_dev_handle *sc) fwrite (data, bp, 1, fp); fclose (fp); - usbtmc_sendscpi (sc, ":TIM:OFFSET 0", NULL, 0); + sendscpi (sc, ":TIM:OFFSET 0", NULL, 0); } -void do_get_screen(struct usb_dev_handle *sc) +unsigned char* get_lcd(struct scope *sc, int *imglen, int keylock) { unsigned char screen[320*234]; + unsigned char *png; + int l; + + if (keylock) { + /* Hide "RMT" from screen */ + l = sendscpi(sc, ":KEY:LOCK DISABLE", NULL, 0); + usleep(30000); + } + + l = sendscpi(sc, ":LCD:DATA?", screen, sizeof(screen)); + + if (l != sizeof(screen)) { + printf ("hmm. didnt' get %d bytes, but %d\n\n", (int)sizeof(screen), l); + return NULL; + } + + png = lcd2png(screen, imglen); + + return png; +} + +void do_get_screen(struct scope *sc) +{ time_t lt; char filename[256]; unsigned char *png; int imglen; int ret; - int l; int fd; pid_t display; - /* Hide "RMT" from screen */ - l = usbtmc_sendscpi(sc, ":KEY:LOCK DISABLE", NULL, 0); - usleep(20000); - - l = usbtmc_sendscpi(sc, ":LCD:DATA?", screen, sizeof(screen)); - - if (l != sizeof(screen)) { - printf ("hmm. didnt' get %d bytes, but %d\n\n", sizeof(screen), l); + png = get_lcd(sc, &imglen, 1); + if (png == NULL) { + perror("get_lcd"); + return; } - png = lcd2png(screen, &imglen); - lt = time(NULL); strftime(filename, sizeof(filename), "screen_%Y%m%d-%H%M%S.png", localtime(<)); fd=open(filename, O_CREAT|O_WRONLY, 0644); if (fd == -1) { perror("open"); - exit(EXIT_FAILURE); + return; } while(imglen > 0) { ret = write(fd, png, imglen); if (ret == -1) { perror("write"); - exit(EXIT_FAILURE); + return; } imglen -= ret; } @@ -165,3 +182,49 @@ void do_get_screen(struct usb_dev_handle *sc) } } +void do_display_screen(struct scope *sc) +{ + unsigned char *png; + int imglen; + int ret; + int pipefd[2]; + pid_t display; + + png = get_lcd(sc, &imglen, 1); + if (png == NULL) { + perror("get_lcd"); + return; + } + + if (pipe(pipefd) == -1) { + perror("pipe"); + return; + } + + display = fork(); + switch(display) { + case 0: + close(pipefd[1]); + close(STDIN_FILENO); + dup2(pipefd[0], STDIN_FILENO); + execlp("display", "display", "-", NULL); + exit(0); + break; + case -1: + perror("fork"); + break; + default: + close(pipefd[0]); + while(imglen > 0) { + ret = write(pipefd[1], png, imglen); + if (ret == -1) { + perror("write"); + exit(EXIT_FAILURE); + } + imglen -= ret; + } + close(pipefd[1]); + free(png); + break; + } +}