Source: views/ThrottleView.js

/**
 * @author Serge Babayan
 * @module views/ThrottleView
 * @requires models/Commands
 * @requires models/TelemetryData
 * @requires util/Template
 * @requires util/Logger
 * @requires util/Validator
 * @requires electron
 * @listens models/TelemetryData~TelemetryData:data_received
 * @copyright Waterloo Aerial Robotics Group 2016
 * @licence https://raw.githubusercontent.com/UWARG/WARG-Ground-Station/master/LICENSE
 * @description View that displays the aircraft's throttle, flap, and attitude rate values
 */

var remote = require('electron').remote;
var Logger = remote.require('./app/util/Logger');
var TelemetryData = remote.require('./app/models/TelemetryData');
var Validator = require('../util/Validator');
var Commands = remote.require('./app/models/Commands');
var Template = require('../util/Template');

module.exports = function (Marionette) {

  return Marionette.ItemView.extend({
    template: Template('ThrottleView'),
    className: 'throttleView',

    ui: {
      throttle: '.throttle-value',
      yaw: '.yaw-value',
      yaw_setpoint: '.yaw-setpoint-value',
      flap: '.flap-value',
      roll_rate_rad: '.roll-rate-value-rad',
      pitch_rate_rad: '.pitch-rate-value-rad',
      yaw_rate_rad: '.yaw-rate-value-rad',
      roll_rate_deg: '.roll-rate-value-deg',
      pitch_rate_deg: '.pitch-rate-value-deg',
      yaw_rate_deg: '.yaw-rate-value-deg',
      throttle_input: '.throttle-form input',
      flap_input: '.flap-form input'
    },
    events: {
      'submit .flap-form': 'sendSetFlapCommand',
      'submit .throttle-form': 'sendSetThrottleCommand'
    },
    initialize: function () {
      this.on_telemetry_callback = null;
    },
    onRender: function () {
      this.on_telemetry_callback = this.onTelemetryCallback.bind(this);
      TelemetryData.addListener('data_received', this.on_telemetry_callback);
    },
    onTelemetryCallback: function (data) {
      this.setThrottle(data.throttle_setpoint);
      this.setYaw(data.yaw);
      //this.setYawSetpoint(data.int_yaw_setpoint);
      this.setFlap(data.flap_setpoint);

      this.setYawRate(data.yaw_rate);
      this.setRollRate(data.roll_rate);
      this.setPitchRate(data.pitch_rate);
    },
    onBeforeDestroy: function () {
      TelemetryData.removeListener('data_received', this.on_telemetry_callback);
    },
    setThrottle: function (num) {
      if (Validator.isValidThrottle(num)) {
        var num = Number(num);
        this.ui.throttle.text(Number((num + 1024) * 100 / 2048).toFixed(1));//-1024 represents 0%
      } else {
        Logger.warn('Invalid throttle setpoint value received! Throttle:' + num);
        this.ui.throttle.text('Invalid');
      }
    },
    setYaw: function (num) {
      if (Validator.isValidYaw(num)) {
        this.ui.yaw.text(Number(num).toFixed(1));
      } else {
        Logger.warn('Invalid yaw value received! Yaw:' + num);
        this.ui.yaw.text('Invalid');
      }
    },
    // setYawSetpoint: function(num){
    //   if(Validator.isValidYaw(num)){
    //     this.ui.yaw_setpoint.text(Number(num).toFixed(1));
    //   }else{
    //     Logger.warn('Invalid yaw setpoint value received! Yaw Setpoint: '+num);
    //     this.ui.yaw_setpoint.text('Invalid');
    //   }
    // },
    setPitchRate: function (num) {
      if (Validator.isValidNumber(num)) {
        var rad = Number(num);
        var degrees = Number(num) * 180 / Math.PI;
        this.ui.pitch_rate_rad.text(rad.toFixed(1));
        this.ui.pitch_rate_deg.text(degrees.toFixed(1));
      } else {
        Logger.warn('Invalid pitch rate value received!  Pitch Rate: ' + num);
        this.ui.pitch_rate_rad.text('Invalid');
        this.ui.pitch_rate_deg.text('Invalid');
      }
    },
    setYawRate: function (num) {
      if (Validator.isValidNumber(num)) {
        var rad = Number(num);
        var degrees = Number(num) * 180 / Math.PI;
        this.ui.yaw_rate_rad.text(rad.toFixed(1));
        this.ui.yaw_rate_deg.text(degrees.toFixed(1));
      } else {
        Logger.warn('Invalid yaw rate value received!  Yaw Rate: ' + num);
        this.ui.yaw_rate_rad.text('Invalid');
        this.ui.yaw_rate_deg.text('Invalid');
      }
    },
    setRollRate: function (num) {
      if (Validator.isValidNumber(num)) {
        var rad = Number(num);
        var degrees = Number(num) * 180 / Math.PI;
        this.ui.roll_rate_rad.text(rad.toFixed(1));
        this.ui.roll_rate_deg.text(degrees.toFixed(1));
      } else {
        Logger.warn('Invalid roll rate value received!  Roll Rate: ' + num);
        this.ui.roll_rate_rad.text('Invalid');
        this.ui.roll_rate_deg.text('Invalid');
      }
    },
    setFlap: function (num) {
      if (Validator.isValidFlap(num)) {
        var num = Number(num);
        this.ui.flap.text(Number((num + 1024) * 100 / 2048).toFixed(1));//-1024 represents 0%
      } else {
        Logger.warn('Invalid flap setpoint value received! Flap Setpoint: ' + num);
        this.ui.flap.text('Invalid');
      }
    },
    sendSetThrottleCommand: function (e) {
      e.preventDefault();
      Commands.sendThrottle(this.ui.throttle_input.val());
      this.ui.throttle_input.val('');
    },
    sendSetFlapCommand: function (e) {
      e.preventDefault();
      Commands.sendFlap(this.ui.flap_input.val());
      this.ui.flap_input.val('');
    }
  });
};