HW/DAS/USBscopes/usbtm/bash/freq.c

#include "usbwave.h"
#include <string.h>

#ifndef PATH_MAX
#define PATH_MAX 1024
#endif

int parse_type(char *str) {
  int ret = -1;
  if(!strncmp(str, "si", 2)) ret = WAVE12_WAVE_TYPE_SINE;
  if(!strncmp(str, "sq", 2)) ret = WAVE12_WAVE_TYPE_SQUARE;
  if(!strncmp(str, "tr", 2)) ret = WAVE12_WAVE_TYPE_TRIANGLE;
  return ret;
}

int main(int argc, char *argv[]) {
  int opt, dev = 0, help = 0, mute = 0, type = WAVE12_WAVE_TYPE_SINE, wait = 0;
  double freq = 1000.0, amp = 5.0;
  int fd;
  int cal = 0, zero = 0;
  char fnread[PATH_MAX] = "", fnwrite[PATH_MAX] = "";
  FILE *fcalib;

  while((opt = getopt(argc, argv, "d:f:a:t:mS:L:W:h?")) != -1)
    switch(opt) {
      case 'd':
        dev = atoi(optarg);
        break;
      case 'f':
        freq = atof(optarg);
        break;
      case 'a':
        amp = atof(optarg);
        break;
      case 't':
        type = parse_type(optarg);
        break;
      case 'm':
        mute = 1;
        break;
      case 'S':
        strcpy(fnwrite, optarg);
        break;
      case 'L':
        strcpy(fnread, optarg);
        break;
      case 'W':
        wait = atoi(optarg);
        break;
      default:
        help = 1;
        break;
    }
  if(help || optind != argc || type < 0 || wait < 0) {
    printf("Pouziti: %s [-d dev] [-f freq] [-a amp] [-t type] [-m] [-S|-L conf] [-w wait]\n"
        "  dev je cislo zarizeni %sn, na ktere se pripojit.\n"
        "  freq je frekvence generatoru: 0.2 az 12E6. Horni hranice viz dokumentace.\n"
        "  amp je amplituda ve voltech rozsahu 0 az 10. Muze byt desetinne cislo.\n"
        "  type je typ vlny: sine, square nebo triangle. Jsou povoleny 2pism. zkratky.\n"
        "  -m je utlumeni (vypnuti) vystupu a prepnuti do modu Hi-Z.\n"
        "  Volby -S/-L umoznuji ulozit / nacist kalibracni data pro rychlejsi spusteni.\n"
        "  wait umoznuje pockat stanovenou dobu pred odpojenim od zarizeni"
        "    (doba uvedena v sekundach, vychozi 0) - vhodne pro sitovy pristup.\n",
        argv[0], DEVNAME);
    return 0;
  }

  if(!opendev(dev, &fd)) {
    fprintf(stderr, deverror(dev));
    return 1;
  }

  if(*fnread) {
    fcalib = fopen(fnread, "r");
    if(!fcalib) {
      fprintf(stderr,
          "Nepodarilo se otevrit soubor %s pro cteni kalibracnich dat.\n", fnread);
    } else {
      if(fscanf(fcalib, "%i %i", &cal, &zero) < 2) {
        fprintf(stderr, "Neplatna kalibracni data.");
        cal = zero = 0;
      }
      fclose(fcalib);
    }
  }

  if(!wave12_init_wave(fd, 1, &cal, &zero)) return 1;
  //wave12_set_trigger(fd, 1);

  if(*fnwrite) {
    fcalib = fopen(fnwrite, "w");
    if(!fcalib) {
      fprintf(stderr,
          "Nepodarilo se otevrit soubor %s pro ulozeni kalibracnich dat.\n", fnwrite);
    } else {
      fprintf(fcalib, "%i %i", cal, zero);
      fclose(fcalib);
    }
  }
    
  if(mute) {
    wave12_set_enable(fd, 0);
  } else {
    wave12_set_frequency(fd, freq);
    wave12_set_amplitude(fd, amp, 0);
    wave12_set_wave_type(fd, type);
    wave12_set_trigger(fd, 1);
    wave12_set_enable(fd, 1);
  }

  if(wait) sleep(wait);
  closedev(dev, fd);
  return 0;
}