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 vehicleInterfaceCommonContructor(obj, attname) {
11 obj.attributeName = attname;
14 msg['method'] = 'zones';
15 msg['name'] = obj.attributeName;
17 obj._zones = new Zone;
19 var call = new AsyncCall(function(data) {
23 async_calls[next_async_call_id] = call;
24 msg.asyncCallId = next_async_call_id;
27 extension.postMessage(JSON.stringify(msg));
29 Object.defineProperty(obj, 'zones', { get: function() { return obj._zones } });
32 function VehicleInterface(attname) {
33 vehicleInterfaceCommonContructor(this, attname);
36 VehicleInterface.prototype.get = function(zone) {
38 msg['method'] = 'get';
39 msg['name'] = this.attributeName;
42 return createPromise(msg);
45 function VehicleSignalInterface(attname) {
46 vehicleInterfaceCommonContructor(this, attname);
49 VehicleSignalInterface.prototype = VehicleInterface.prototype;
51 VehicleSignalInterface.prototype.subscribe = function(callback, zone) {
52 if (!zone) zone = new Zone();
55 msg['method'] = 'subscribe';
56 msg['name'] = this.attributeName;
59 extension.postMessage(JSON.stringify(msg));
61 msg['callback'] = callback;
63 subscriptions.push(msg);
65 return subscriptions.length - 1;
68 VehicleSignalInterface.prototype.unsubscribe = function(handle) {
69 var obj = subscriptions[handle];
70 subscriptions.splice(handle, 1);
72 var unsubscribe = true;
74 for (var i = 0; i < subscriptions.length; i++) {
75 var testObj = subscriptions[i];
77 if (testObj.name === obj.name && testObj.zone.equals(obj.zone)) {
85 msg['method'] = 'unsubscribe';
86 msg['name'] = this.attributeName;
87 msg['zone'] = obj.zone;
89 extension.postMessage(JSON.stringify(msg));
93 VehicleSignalInterface.prototype.set = function (value, zone) {
95 msg['method'] = 'set';
96 msg['name'] = this.attributeName;
100 return createPromise(msg);
103 function AsyncCall(resolve, reject) {
104 this.resolve = resolve;
105 this.reject = reject;
108 function createPromise(msg) {
109 var promise = new Promise(function(resolve, reject) {
110 async_calls[next_async_call_id] = new AsyncCall(resolve, reject);
113 msg.asyncCallId = next_async_call_id;
114 extension.postMessage(JSON.stringify(msg));
115 ++next_async_call_id;
119 window.Zone = function(zone) {
120 this.value = zone ? zone : [];
122 Object.defineProperty(this, 'driver',
123 { enumerable: false, get: function() {
124 return new Zone(['Front', 'Left']);
128 window.Zone.prototype.equals = function(zone) {
131 for (var i = 0; i < zone.value.length; i++) {
132 is_equal &= this.value.indexOf(zone.value[i]) !== -1;
135 for (var i = 0; i < this.value.length; i++) {
136 is_equal &= zone.value.indexOf(this.value[i]) !== -1;
142 function _defineVehicleProperty(obj, prop) {
143 Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleInterface(prop) });
146 function _defineVehicleSignalProperty(obj, prop) {
147 Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleSignalInterface(prop) });
150 extension.setMessageListener(function(json) {
152 var msg = JSON.parse(json);
154 switch (msg.method) {
156 handlePromiseReply(msg);
159 handleZonesReply(msg);
162 handleSubscribeReply(msg);
165 handlePromiseReply(msg);
171 console.log('Error in message listener: ' + error);
175 function handlePromiseReply(msg) {
176 var cbobj = async_calls[msg.asyncCallId];
180 error.error = msg.value;
182 case 'permission_denied':
183 error.message = 'Permission denied';
185 case 'invalid_operation':
186 error.message = 'Invalid operation';
189 error.message = 'Operation timed out';
192 error.message = 'Zone invalid or not found';
195 error.message = 'An unknown error occured';
203 cbobj.resolve(msg.value);
206 delete async_calls[msg.asyncCallId];
209 function handleZonesReply(msg) {
210 var cbobj = async_calls[msg.asyncCallId];
213 cbobj.resolve(new Zone(msg.value));
216 function handleSubscribeReply(msg) {
217 delete async_calls[msg.asyncCallId];
218 var value = msg.value;
219 value.zone = new Zone(value.zone);
221 for (var i = 0; i < subscriptions.length; i++) {
222 var itr = subscriptions[i];
223 var ifaceIs = (value.interfaceName.toLowerCase() === itr.name.toLowerCase());
224 if (ifaceIs === true && value.zone.equals(itr.zone)) {
229 /// Runningstatus attributes:
230 _defineVehicleSignalProperty(exports, 'vehicleSpeed');
231 _defineVehicleSignalProperty(exports, 'engineSpeed');
232 _defineVehicleSignalProperty(exports, 'powertrainTorque');
233 _defineVehicleSignalProperty(exports, 'acceleratorPedalPosition');
234 _defineVehicleSignalProperty(exports, 'throttlePosition');
235 _defineVehicleSignalProperty(exports, 'transmission');
236 _defineVehicleSignalProperty(exports, 'cruiseControlStatus');
237 _defineVehicleSignalProperty(exports, 'lightStatus');
238 _defineVehicleSignalProperty(exports, 'horn');
239 _defineVehicleSignalProperty(exports, 'chime');
240 _defineVehicleSignalProperty(exports, 'fuel');
241 _defineVehicleSignalProperty(exports, 'engineOil');
242 _defineVehicleSignalProperty(exports, 'acceleration');
243 _defineVehicleSignalProperty(exports, 'engineCoolant');
244 _defineVehicleSignalProperty(exports, 'steeringWheel');
245 _defineVehicleSignalProperty(exports, 'wheelTick');
246 _defineVehicleSignalProperty(exports, 'ignitionTime');
247 _defineVehicleSignalProperty(exports, 'yawRate');
248 _defineVehicleSignalProperty(exports, 'brakeOperation');
249 _defineVehicleSignalProperty(exports, 'buttonEvent');
250 _defineVehicleSignalProperty(exports, 'nightMode');
251 _defineVehicleSignalProperty(exports, 'drivingMode');
253 /// Maintenance attributes:
254 _defineVehicleSignalProperty(exports, 'odometer');
255 _defineVehicleSignalProperty(exports, 'transmissionOil');
256 _defineVehicleSignalProperty(exports, 'transmissionClutch');
258 _defineVehicleSignalProperty(exports, 'batteryStatus');
259 _defineVehicleSignalProperty(exports, 'tire');
262 _defineVehicleSignalProperty(exports, 'door');
263 _defineVehicleSignalProperty(exports, 'temperature');
264 _defineVehicleSignalProperty(exports, 'climateControl');
265 _defineVehicleSignalProperty(exports, 'defrost');