Source: views/AltitudeView.js

/**
 * @author Serge Babayan
 * @module views/AltitudeView
 * @requires models/Commands
 * @requires util/Validator
 * @requires util/Logger
 * @requires models/TelemetryData
 * @requires util/Template
 * @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 Responsible for displaying a the aircrafts altitude, air and ground speed via dials
 */

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

module.exports = function (Marionette) {

  return Marionette.ItemView.extend({
    template: Template('AltitudeView'),
    className: 'altitudeView',

    ui: {
      altitude_dials: '.dial-picture',
      altitude_hand: '.height-dial .dial-hand',
      altitude_text: '.height-dial .current-value',
      altitude_setpoint_text: '.height-dial .auto-pilot-setpoint',
      altitude_input: '.height-dial input',
      ground_speed_hand: '.ground-speed-dial .dial-hand',
      ground_speed_text: '.ground-speed-dial .current-value',
      ground_speed_text_kmh: '.ground-speed-dial .current-valuekmh',
      air_speed_hand: '.air-speed-dial .dial-hand',
      air_speed_text: '.air-speed-dial .current-value',
      air_speed_text_kmh: '.air-speed-dial .current-valuekmh',
    },

    events: {
      'submit .height-dial form': 'sendAltitudeSetpointCommand'
    },

    initialize: function () {
      //For drawing the dial correctly
      this.max_ground_speed = 40;
      this.max_air_speed = 40;
      this.max_altitude = 200;

      this.telemetry_callback = null;
      this.first_resize = true;
    },
    onRender: function () {
      this.ui.altitude_dials.parent().resize(this.setCanvasDimensions.bind(this));

      this.telemetry_callback = this.telemetryCallback.bind(this);
      TelemetryData.addListener('aircraft_position', this.telemetry_callback);
    },
    onBeforeDestroy: function () {
      TelemetryData.removeListener('aircraft_position', this.telemetry_callback);
    },
    telemetryCallback: function (data) {
      this.setAltitude(data.altitude);
      this.setAltitudeSetpoint(data.altitude_setpoint);
      this.setGroundspeed(data.ground_speed);
      this.setAirspeed(data.airspeed);
    },
    setCanvasDimensions: function () {
      var canvas_dimensions = Math.min(this.ui.altitude_dials.parent().width() - 12, this.ui.altitude_dials.parent().height() - 105);
      if ((canvas_dimensions && canvas_dimensions > 100) || this.first_resize) {
        this.ui.altitude_dials.css({
          width: canvas_dimensions,
          height: canvas_dimensions
        });
        this.first_resize = false;
      }
    },
    setAltitude: function (altitude) {
      if(altitude !== null){
        var degrees = (altitude / this.max_altitude) * 360;
        this.ui.altitude_hand.css('transform', 'rotate(' + degrees + 'deg)');
        this.ui.altitude_text.text(altitude.toFixed(1));
      }
    },
    setGroundspeed: function (speed) {
      if(speed !== null){
        var degrees = (speed / this.max_ground_speed) * 360;
        this.ui.ground_speed_hand.css('transform', 'rotate(' + degrees + 'deg)');
        this.ui.ground_speed_text.text(speed.toFixed(1));
        this.ui.ground_speed_text_kmh.text((speed * 3.6).toFixed(1));
      }
    },
    setAirspeed: function (speed) {
      if(speed !== null){
        var degrees = (speed / this.max_ground_speed) * 360;
        this.ui.air_speed_hand.css('transform', 'rotate(' + degrees + 'deg)');
        this.ui.air_speed_text.text(speed.toFixed(1));
        this.ui.air_speed_text_kmh.text((speed * 3.6).toFixed(1));
      }
    },
    setAltitudeSetpoint: function (altitude) {
      if(altitude !== null){
        this.ui.altitude_setpoint_text.text(altitude.toFixed(2));
      }
    },
    sendAltitudeSetpointCommand: function (e) {
      e.preventDefault();
      Commands.sendAltitude(this.ui.altitude_input.val());
      this.ui.altitude_input.val('');
    }
  });
};