HW/IT/USBs/USBscope/pulse.c

#include "usbpulse.h"

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

  while((opt = getopt(argc, argv, "d:a:p:x:y:z:bri1mh?")) != -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 '1':
        one = 1;
        break;
      default:
        help = 1;
        break;
    }
  if(help || optind != argc) {
    printf("Pouziti: %s [-d dev] [-a amp] [-p m,n,u] [-x div] [-y from] [-z to]\n"
        "      [-b] [-r] [-1] [-i] [-m]\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. V modu -1 nema primy vyznam.\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.\n"
        "  -1 urcuje jednopulzovy rezim. Delka pulzu je urcena -x, -y a -z.\n"
        "  -i zapina inverzi logicke hodnoty na vystupu.\n"
        "  -m je utlumeni (vypnuti) vystupu a prepnuti do modu Hi-Z.\n",
        argv[0], DEVNAME);
    return 0;
  }

  if(!opendev(dev, &fd)) {
    fprintf(stderr, "Nepodarilo se otevrit zarizeni %s%i!\n"
        "Zkontrolujte pritomnost specialniho souboru a pristupova prava.\n",
        DEVNAME, dev);
    return 1;
  }

  if(!pulse100_init_pulse(fd)) return 1;
  pulse100_set_clock_master(fd, 1);
  pulse100_set_trig_master(fd, 1);
  pulse100_set_enable(fd, 1);
    
  if(x < z+2) {
    x = z+2;
    if(x >= (1<<28)) {
      x = (1<<28) - 1;
      z = x-2;
    }
  }
  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);
  }

  closedev(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);
 */