1 // Copyright (c) 2014 Intel Corporation. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 var next_async_call_id = 0;
8 var subscriptions = [];
10 function makeCall(call, msg) {
11 async_calls[next_async_call_id] = call;
12 msg.asyncCallId = next_async_call_id;
15 extension.postMessage(JSON.stringify(msg));
18 function vehicleInterfaceCommonContructor(obj, attname) {
19 obj.attributeName = attname;
22 msg['method'] = 'zones';
23 msg['name'] = obj.attributeName;
25 obj._zones = new Zone;
26 obj._supported = false;
28 var call = new AsyncCall(function(data) {
34 var supportedMessage = {};
35 supportedMessage['method'] = 'supported';
36 supportedMessage['name'] = obj.attributeName;
38 var supportedCall = new AsyncCall(function(data) {
39 obj._supported = data;
42 makeCall(supportedCall, supportedMessage);
44 Object.defineProperty(obj, 'zones', { get: function() { return obj._zones } });
45 Object.defineProperty(obj, 'supported', { get: function() { return obj._supported; } });
48 function VehicleInterface(attname) {
49 vehicleInterfaceCommonContructor(this, attname);
52 VehicleInterface.prototype.get = function(zone) {
54 msg['method'] = 'get';
55 msg['name'] = this.attributeName;
58 return createPromise(msg);
61 VehicleInterface.prototype.availableForRetrieval = function(attName) {
62 return isAvailable(this, attName);
65 VehicleInterface.prototype.availabilityChangedListener = function(callback) {
66 if(this.changedListenerCount) {
67 this.changedListenerCount++;
70 this.changedListenerCount = 0;
72 return this.changedListenerCount;
75 VehicleInterface.prototype.removeAvailabilityChangedListener = function(handle) {
79 function VehicleSignalInterface(attname) {
80 vehicleInterfaceCommonContructor(this, attname);
83 VehicleSignalInterface.prototype = VehicleInterface.prototype;
85 VehicleSignalInterface.prototype.subscribe = function(callback, zone) {
86 if (!zone) zone = new Zone();
89 msg['method'] = 'subscribe';
90 msg['name'] = this.attributeName;
93 extension.postMessage(JSON.stringify(msg));
95 msg['callback'] = callback;
97 subscriptions.push(msg);
99 return subscriptions.length - 1;
102 VehicleSignalInterface.prototype.unsubscribe = function(handle) {
103 var obj = subscriptions[handle];
104 subscriptions.splice(handle, 1);
106 var unsubscribe = true;
108 for (var i = 0; i < subscriptions.length; i++) {
109 var testObj = subscriptions[i];
111 if (testObj.name === obj.name && testObj.zone.equals(obj.zone)) {
119 msg['method'] = 'unsubscribe';
120 msg['name'] = this.attributeName;
121 msg['zone'] = obj.zone;
123 extension.postMessage(JSON.stringify(msg));
127 VehicleSignalInterface.prototype.set = function (value, zone) {
129 msg['method'] = 'set';
130 msg['name'] = this.attributeName;
132 msg['value'] = value;
134 return createPromise(msg);
137 VehicleSignalInterface.prototype.availableForSubscription = function(attName) {
138 return isAvailable(this, attName);
141 VehicleSignalInterface.prototype.availableForSetting = function(attName) {
142 return isAvailable(this, attName);
145 function isAvailable(obj, attName)
148 msg["method"] = 'availableForRetrieval';
149 msg["name"] = obj.attributeName;
150 msg["attName"] = attName;
152 var reply = extension.internal.sendSyncMessage(JSON.stringify(msg));
154 if (reply === "true") {
157 return "not_supported";
161 function AsyncCall(resolve, reject) {
162 this.resolve = resolve;
163 this.reject = reject;
166 function createPromise(msg) {
167 var promise = new Promise(function(resolve, reject) {
168 async_calls[next_async_call_id] = new AsyncCall(resolve, reject);
171 msg.asyncCallId = next_async_call_id;
172 extension.postMessage(JSON.stringify(msg));
173 ++next_async_call_id;
178 window.Zone = function(zone) {
179 this.value = zone ? zone : [];
181 Object.defineProperty(this, 'driver',
182 { enumerable: false, get: function() {
183 return new Zone(['Front', 'Left']);
187 window.Zone.prototype.equals = function(zone) {
190 for (var i = 0; i < zone.value.length; i++) {
191 is_equal = is_equal && this.value.indexOf(zone.value[i]) !== -1;
194 for (var i = 0; i < this.value.length; i++) {
195 is_equal = is_equal && zone.value.indexOf(this.value[i]) !== -1;
201 function _defineVehicleProperty(obj, prop) {
202 Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleInterface(prop) });
205 function _defineVehicleSignalProperty(obj, prop) {
206 Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleSignalInterface(prop) });
209 extension.setMessageListener(function(json) {
211 var msg = JSON.parse(json);
213 switch (msg.method) {
215 handlePromiseReply(msg);
218 handleZonesReply(msg);
221 handleSubscribeReply(msg);
224 handlePromiseReply(msg);
227 handleSupportedReply(msg)
229 case 'vehicleSupportedAttributes':
230 handleVehicleSupported(msg);
236 console.log('Error in message listener: ' + error);
237 console.log("msg: " + JSON.stringify(msg))
241 function handlePromiseReply(msg) {
242 var cbobj = async_calls[msg.asyncCallId];
246 error.error = msg.value;
248 case 'permission_denied':
249 error.message = 'Permission denied';
251 case 'invalid_operation':
252 error.message = 'Invalid operation';
255 error.message = 'Operation timed out';
258 error.message = 'Zone invalid or not found';
261 error.message = 'An unknown error occured';
264 error.message = 'Unknown';
270 if (msg.value && msg.value.zone) {
271 msg.value.zone = new Zone(msg.value.zone);
273 cbobj.resolve(msg.value);
276 delete async_calls[msg.asyncCallId];
279 function handleZonesReply(msg) {
280 var cbobj = async_calls[msg.asyncCallId];
283 cbobj.resolve(new Zone(msg.value));
286 function handleSupportedReply(msg) {
287 var cbobj = async_calls[msg.asyncCallId];
290 cbobj.resolve(msg.value);
293 function handleSubscribeReply(msg) {
294 delete async_calls[msg.asyncCallId];
295 var value = msg.value;
296 value.zone = new Zone(value.zone);
298 for (var i = 0; i < subscriptions.length; i++) {
299 var itr = subscriptions[i];
300 var ifaceIs = (value.interfaceName.toLowerCase() === itr.name.toLowerCase());
301 if (ifaceIs === true && value.zone.equals(itr.zone)) {
307 function handleVehicleSupported(msg) {
308 var value = msg.value;
310 if(exports[i] !== undefined) {
311 _defineVehicleSignalProperty(exports, i);
316 /// Runningstatus attributes:
317 _defineVehicleSignalProperty(exports, 'vehicleSpeed');
318 _defineVehicleSignalProperty(exports, 'engineSpeed');
319 _defineVehicleSignalProperty(exports, 'powertrainTorque');
320 _defineVehicleSignalProperty(exports, 'acceleratorPedalPosition');
321 _defineVehicleSignalProperty(exports, 'throttlePosition');
322 _defineVehicleSignalProperty(exports, 'transmission');
323 _defineVehicleSignalProperty(exports, 'cruiseControlStatus');
324 _defineVehicleSignalProperty(exports, 'lightStatus');
325 _defineVehicleSignalProperty(exports, 'horn');
326 _defineVehicleSignalProperty(exports, 'chime');
327 _defineVehicleSignalProperty(exports, 'fuel');
328 _defineVehicleSignalProperty(exports, 'engineOil');
329 _defineVehicleSignalProperty(exports, 'acceleration');
330 _defineVehicleSignalProperty(exports, 'engineCoolant');
331 _defineVehicleSignalProperty(exports, 'steeringWheel');
332 _defineVehicleSignalProperty(exports, 'wheelTick');
333 _defineVehicleSignalProperty(exports, 'ignitionTime');
334 _defineVehicleSignalProperty(exports, 'yawRate');
335 _defineVehicleSignalProperty(exports, 'brakeOperation');
336 _defineVehicleSignalProperty(exports, 'buttonEvent');
337 _defineVehicleSignalProperty(exports, 'nightMode');
338 _defineVehicleSignalProperty(exports, 'drivingMode');
340 /// Maintenance attributes:
341 _defineVehicleSignalProperty(exports, 'odometer');
342 _defineVehicleSignalProperty(exports, 'transmissionOil');
343 _defineVehicleSignalProperty(exports, 'transmissionClutch');
344 _defineVehicleSignalProperty(exports, 'brakeMaintenance');
345 _defineVehicleSignalProperty(exports, 'washerFluid');
346 _defineVehicleSignalProperty(exports, 'malfunctionIndicator');
347 _defineVehicleSignalProperty(exports, 'batteryStatus');
348 _defineVehicleSignalProperty(exports, 'tire');
349 _defineVehicleSignalProperty(exports, 'diagnostic');
351 /// Personalization attributes:
352 _defineVehicleSignalProperty(exports, 'mirror');
353 _defineVehicleSignalProperty(exports, 'seatAdjustment');
354 _defineVehicleSignalProperty(exports, 'driveMode');
355 _defineVehicleSignalProperty(exports, 'dashboardIllumination');
356 _defineVehicleSignalProperty(exports, 'vehicleSound');
358 /// Driving Safety attributes:
359 _defineVehicleSignalProperty(exports, 'antilockBreakingSystem');
360 _defineVehicleSignalProperty(exports, 'tractionControlSystem');
361 _defineVehicleSignalProperty(exports, 'electronicStabilityControl');
362 _defineVehicleSignalProperty(exports, 'topSpeedLimit');
363 _defineVehicleSignalProperty(exports, 'airbagStatus');
364 _defineVehicleSignalProperty(exports, 'door');
365 _defineVehicleSignalProperty(exports, 'childSafetyLock');
366 _defineVehicleSignalProperty(exports, 'seat');
368 /// Climate attributes:
369 _defineVehicleSignalProperty(exports, 'temperature');
370 _defineVehicleSignalProperty(exports, 'rainSensor');
371 _defineVehicleSignalProperty(exports, 'wiperStatus');
372 _defineVehicleSignalProperty(exports, 'climateControl');
373 _defineVehicleSignalProperty(exports, 'defrost');
374 _defineVehicleSignalProperty(exports, 'sunroof');
375 _defineVehicleSignalProperty(exports, 'atmosphericPressure');
377 /// Vision and Parking Interfaces
378 _defineVehicleSignalProperty(exports, 'langeDepartureStatus');
379 _defineVehicleSignalProperty(exports, 'alarm');
380 _defineVehicleSignalProperty(exports, 'parkingBrake');