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

#include "usbpulse.h"

int main(int argc, char *argv[]) {
  int opt, dev = 0, mute = 0, help = 0, wait = 0;
  int x = 1000, y = 0, z = 100, bypass = 0, invert = 0, random = 0, one = 1;
  int m = 1, n = 1, u = 1;
  double amp = 2.0;
  int fd;

  while((opt = getopt(argc, argv, "d:a:p:x:y:z:bricmw:h?")) != -1)
    switch(opt) {
      case 'd':
        dev = atoi(optarg);
        break;
      case 'm':
        mute = 1;
        break;
      case 'a':
        amp = atof(optarg);
        break;
      case 'p':
        sscanf(optarg, "%i,%i,%i", &m, &n, &u);
        break;
      case 'x':
        x = atoi(optarg);
        break;
      case 'y':
        y = atoi(optarg);
        break;
      case 'z':
        z = atoi(optarg);
        break;
      case 'b':
        bypass = 1;
        break;
      case 'r':
        random = 1;
        break;
      case 'i':
        invert = 1;
        break;
      case 'c':
        one = 0;
        break;
      case 'w':
        wait = atoi(optarg);
        break;
      default:
        help = 1;
        break;
    }
  if(help || optind != argc || wait < 0) {
    printf("Pouziti: %s [-d dev] [-a amp] [-p m,n,u] [-x div] [-y from] [-z to]\n"
        "      [-b] [-r] [-c] [-i] [-m] [-w wait]\n"
        "  dev je cislo zarizeni %sn, na ktere se pripojit.\n"
        "  amp je amplituda ve voltech rozsahu 1.5 az 5. Muze byt desetinne cislo.\n"
        "  m,n,u jsou argumenty pro hlavni PLL casovac. Oddelujte prosim carkou\n"
        "    a nepouzivejte mezery. Frekvence PLL = 12.5MHz*m/(n*u), m<=16, n<=8, u<=4.\n"
        "  div je koeficient delice frekvence PLL. Nema vyznam mimo mod -c.\n"
        "  from a to urcuji zpozdeni a dobu trvani pulsu v jednotkach PLL.\n"
        "  -b zapina primy pruchod z PLL bez delice (pro dosazeni nejvyssich f.)\n"
        "  -r zapina pseudonahodny vystup 0 a 1 na frekvenci PLL nebo delice (-c).\n"
        "  -c urcuje cyklicky rezim (vychozi je jednopulzovy).\n"
        "  -i zapina inverzi logicke hodnoty na vystupu.\n"
        "  -m je utlumeni (vypnuti) vystupu a prepnuti do modu Hi-Z.\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(x < z+2) {
    x = z+2;
    if(x >= (1<<28)) {
      x = (1<<28) - 1;
      z = x-2;
    }
  }

  if(one && random) bypass = 1;

  if(!pulse100_init_pulse(fd, 1)) return 1;
  usbtm_set_clock_master(fd, 1);
  usbtm_set_trig_master(fd, 1);
  pulse100_set_enable(fd, 1);

  if(mute) {
    pulse100_set_enable(fd, 0);
  } else {
    pulse100_set_pll(fd, m, n, u, 0);
    pulse100_set_amplitude(fd, amp);
    pulse100_set_xyz(fd, x, y, z);
    pulse100_set_bypass(fd, bypass);
    pulse100_set_prng(fd, random);
    pulse100_set_invert(fd, invert);
    if(one) {
      pulse100_set_run(fd, 0);
      pulse100_set_arm(fd, 0);
    }
    pulse100_set_oneshot(fd, one);
    pulse100_set_enable(fd, 1);
    pulse100_set_run(fd, 1);
    pulse100_set_arm(fd, 1);
    pulse100_set_trigger(fd, 1);
  }

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

/* Zaloha fungujiciho One Shot modu:
 *  pulse100_set_trigger(fd, 0);
 *  pulse100_set_arm(fd, 0);
 *  pulse100_set_run(fd, 0);
 *  pulse100_set_oneshot(fd, 1);
 *  pulse100_set_run(fd, 1);
 *  pulse100_set_arm(fd, 1);
 *  pulse100_set_trigger(fd, 1);
 */