/**
* @author Serge Babayan
* @module connections/DataRelay
* @requires config/network-config
* @requires Network
* @requires util/Logger
* @requires util/PacketParser
* @requires StatusManager
* @requires models/TelemetryData
* @emits models/TelemetryData~TelemetryData:aircraft_position
* @emits models/TelemetryData~TelemetryData:aircraft_orientation
* @emits models/TelemetryData~TelemetryData:aircraft_gains
* @emits models/TelemetryData~TelemetryData:aircraft_status
* @emits models/TelemetryData~TelemetryData:aircraft_channels
* @copyright Waterloo Aerial Robotics Group 2016
* @licence https://raw.githubusercontent.com/UWARG/WARG-Ground-Station/master/LICENSE
* @description Configures the data relay connection for connecting to it, and parsing its data and sending out events
* to the TelemetryData module
* @see http://docs.uwarg.com/picpilot/datalink/
*/
var network_config = require('../../config/network-config');
var Network = require('../Network');
var Logger = require('../util/Logger');
var TelemetryData = require('../models/TelemetryData');
var StatusManager = require('../StatusManager');
var PacketParser = require('../util/PacketParser');
var _ = require('underscore');
var DataRelay = {};
DataRelay.parseHeaders = function (data) {
TelemetryData.setHeadersFromString(data);
PacketParser.checkForMissingHeaders(TelemetryData.headers);
Logger.debug('Network data_relay Received headers: ' + data);
Logger.data(JSON.stringify(TelemetryData.headers), 'DATA_RELAY_HEADERS');
StatusManager.addStatus('Received headers from data_relay', 3, 3000);
};
DataRelay.parseData = function (data) {
TelemetryData.current_state = PacketParser.parseData(data, TelemetryData.headers);
TelemetryData.emitPackets(TelemetryData.current_state);
Logger.data(JSON.stringify(TelemetryData.current_state), 'DATA_RELAY_DATA');
StatusManager.setStatusCode('TIMEOUT_DATA_RELAY', false);
};
/**
* Initializes or re-initializes the data relay connection and sets up callbacks for parsing any received data
* @function init
*/
DataRelay.init = function () {
if (Network.connections['data_relay']) { //if a connection has already been established, disconnect it
Network.connections['data_relay'].removeAllListeners();
Network.connections['data_relay'].disconnect();
}
var data_relay = Network.addConnection('data_relay', network_config.get('datarelay_host'), network_config.get('datarelay_port'));
data_relay.setTimeout(network_config.get('datarelay_timeout'));
data_relay.on('connect', function () {
TelemetryData.headers = [];
StatusManager.setStatusCode('CONNECTED_DATA_RELAY', true);
});
data_relay.on('close', function (had_error) {
StatusManager.setStatusCode('DISCONNECTED_DATA_RELAY', true);
});
data_relay.on('timeout', function () {
StatusManager.setStatusCode('TIMEOUT_DATA_RELAY', true);
});
data_relay.on('write', function (data) {
StatusManager.addStatus('Sent command to data_relay', 3, 2000);
});
data_relay.on('data', function (data) {
if (!data) { //don't do anything if we get blank data or anything that's not an object
Logger.error('Got a blank packet from the data relay station. Value: ' + data);
return;
}
data = data.toString();
// First transmission is header columns
if (TelemetryData.headers.length === 0) {
this.parseHeaders(data);
}
else { //if its the non-header columns(actual data)
this.parseData(data);
}
}.bind(this));
};
module.exports = DataRelay;