juanmard/icestudio

View on GitHub
plugins/icerok/js/index.js

Summary

Maintainability
A
2 hrs
Test Coverage
'use strict';

/**
 * Icetudio > Sigrok > Pulseview integration
 *
 * @category   icestudio Plugins
 * @package    iceRok
 * @author     Carlos Venegas (cavearr at github, @cavearr at twitter)
 * @copyright  2020 FPGAwars
 * @license    https://github.com/FPGAwars/icestudio/blob/develop/LICENSE  GPL v2
 * @version    1.0
 * @link       https://github.com/FPGAwars/icestudio/
 **/
const nodeFs = require('fs');
const gui = require('nw.gui');

function alertErrorConnection() {
  Swal.fire({
    icon: 'error',
    title: 'Oops...',
    text: 'Socket Server not connected',
  });
}

function UARTtoggleButtonState(elB) {
  elToggleClass(elB, 'running');

  let label = $('#serial-connect-label');

  if (elHasClass(elB, 'running')) {
    label.innerHTML = 'Stop Capture';
  } else {
    label.innerHTML = 'Start Capture';
  }
}

function launchPulseView(env) {
  console.log('Lanzando Pulseview');
  let spawn = false;
  let args = ['-i ' + captureFile + ' -I binary:samplerate=12000000 -c -D'];
  switch (env) {
    case 'win32':
      spawn = require('child_process').spawn;
      spawn('pulseview.exe', args, {
        detached: true,
        shell: true,
      });
      break;
    case 'darwin':
      spawn = require('child_process').spawn;
      spawn('Applications/PulseView.app/Contents/MacOS/pulseview', args, {
        detached: true,
        shell: true,
      });
      break;
    default:
      console.log('Pulseview en linux');
      spawn = require('child_process').spawn;
      spawn('/usr/bin/pulseview', args, {
        detached: true,
        shell: true,
      });
  }
}

function renderUARTs(devs) {
  let el = $('#serial-devices');
  let html = '';

  for (let i = devs.length - 1; i >= 0; i--) {
    html += `<option value="${i}">${devs[i].displayName} => ${devs[i].path}</option>`;
  }
  el.innerHTML = html;
}

function getFilesizeInBytes(filename) {
  let stats = nodeFs.statSync(filename);
  let fileSizeInBytes = stats['size'];
  return fileSizeInBytes;
}

let server = false;
let captureFileFD = false;
let workingPath = process.cwd();
let OS = require('os').platform();
let slashOS = OS === 'win32' ? '\\' : '/';
let captureFile = workingPath + slashOS + 'icerok.raw';

function startCapture(button) {
  if (server) {
    UARTtoggleButtonState(button);

    if (server.isUARTConnected()) {
      server.stopUART();
      nodeFs.close(captureFileFD);
      captureFileFD = false;
      let size = getFilesizeInBytes(captureFile);
      if (size !== false && size > 0) {
        launchPulseView(OS);
      } else {
        alert('No capture any data');
      }
    } else {
      let ledev = $('#serial-devices');
      let dev = ledev.value.trim();

      if (dev.length > 0) {
        server.startUART(dev, false, function (data) {
          let z = Buffer.from(new Uint8Array(data));
          nodeFs.write(captureFileFD, z, 0, z.length, null, function (err) {});
        });
      } else {
        UARTtoggleButtonState(button);
      }
    }
  }
}

window.addEventListener(
  'message',
  (event) => {
    if (
      typeof event.data !== 'undefined' &&
      event.data !== null &&
      event.data !== false
    ) {
      console.log(event.data);
    }
  },
  false
);

document.addEventListener('DOMContentLoaded', function () {
  server = new iceRok();

  server.getUARTs(renderUARTs);

  let elinks = $('.external-link');

  for (let n = 0; n < elinks.length; n++) {
    elinks[n].addEventListener('click', function (e) {
      let url = this.href;
      gui.Shell.openExternal(url);
      e.returnValue = false;
      if (e.preventDefault) e.preventDefault();
      return false;
    });
  }

  $('#serial-connect').addEventListener('click', function (e) {
    let _this = this;
    if (captureFile.length > 0) {
      if (!captureFileFD) {
        nodeFs.open(captureFile, 'w+', function (err, file) {
          if (err) {
            throw err;
          } else {
            captureFileFD = file;
            startCapture(_this);
          }
        });
      } else {
        startCapture(_this);
      }
    } else {
      alert('Capture file is needed to dump data');
    }
  });
});

function onLoad(params) {
  console.log('Arrancando plugin', params);
  if (typeof params.BUILD_DIR !== 'undefined' && params.BUILD_DIR.length > 0)
    captureFile = `${params.BUILD_DIR}${slashOS}icerok.raw`;
}

function onClose() {
  if (
    typeof server !== 'undefined' &&
    server !== false &&
    server.isUARTConnected()
  ) {
    server.stopUART();
  }
  if (captureFileFD !== false) {
    nodeFs.close(captureFileFD);
  }
  try {
    nodeFs.unlinkSync(captureFile);
  } catch (err) {
    console.error(err);
  }
}