Update the name and datatype of AMB object
[profile/ivi/automotive-message-broker.git] / xwalk / vehicle_api.js
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.
4
5 var next_async_call_id = 0;
6 var async_calls = {};
7
8 var subscriptions = [];
9
10 function makeCall(call, msg) {
11     async_calls[next_async_call_id] = call;
12     msg.asyncCallId = next_async_call_id;
13     ++next_async_call_id;
14
15     extension.postMessage(JSON.stringify(msg));
16 }
17
18 function vehicleInterfaceCommonContructor(obj, attname) {
19     obj.attributeName = attname;
20
21     var msg = {};
22     msg['method'] = 'zones';
23     msg['name'] = obj.attributeName;
24
25     obj._zones = new Zone;
26     obj._supported = false;
27
28     var call = new AsyncCall(function(data) {
29         obj._zones = data;
30     });
31
32     makeCall(call, msg);
33
34     var supportedMessage = {};
35     supportedMessage['method'] = 'supported';
36     supportedMessage['name'] = obj.attributeName;
37
38     var supportedCall = new AsyncCall(function(data) {
39         obj._supported = data;
40     });
41
42     makeCall(supportedCall, supportedMessage);
43
44     Object.defineProperty(obj, 'zones', { get: function() { return obj._zones } });
45     Object.defineProperty(obj, 'supported', { get: function() { return obj._supported; } });
46 }
47
48 function VehicleInterface(attname) {
49     vehicleInterfaceCommonContructor(this, attname);
50 }
51
52 VehicleInterface.prototype.get = function(zone) {
53     var msg = {};
54     msg['method'] = 'get';
55     msg['name'] = this.attributeName;
56     msg['zone'] = zone;
57
58     return createPromise(msg);
59 };
60
61 VehicleInterface.prototype.availableForRetrieval = function(attName) {
62     return isAvailable(this, attName);
63 };
64
65 VehicleInterface.prototype.availabilityChangedListener = function(callback) {
66     if(this.changedListenerCount) {
67         this.changedListenerCount++;
68     }
69     else {
70         this.changedListenerCount = 0;
71     }
72     return this.changedListenerCount;
73 };
74
75 VehicleInterface.prototype.removeAvailabilityChangedListener = function(handle) {
76
77 };
78
79 function VehicleSignalInterface(attname) {
80     vehicleInterfaceCommonContructor(this, attname);
81 }
82
83 VehicleSignalInterface.prototype = VehicleInterface.prototype;
84
85 VehicleSignalInterface.prototype.subscribe = function(callback, zone) {
86     if (!zone) zone = new Zone();
87
88     var msg = {};
89     msg['method'] = 'subscribe';
90     msg['name'] = this.attributeName;
91     msg['zone'] = zone;
92
93     extension.postMessage(JSON.stringify(msg));
94
95     msg['callback'] = callback;
96
97     subscriptions.push(msg);
98
99     return subscriptions.length - 1;
100 };
101
102 VehicleSignalInterface.prototype.unsubscribe = function(handle) {
103     var obj = subscriptions[handle];
104     subscriptions.splice(handle, 1);
105
106     var unsubscribe = true;
107
108     for (var i = 0; i < subscriptions.length; i++) {
109         var testObj = subscriptions[i];
110
111         if (testObj.name === obj.name && testObj.zone.equals(obj.zone)) {
112             unsubscribe = false;
113             break;
114         }
115     }
116
117     if (unsubscribe) {
118         var msg = {};
119         msg['method'] = 'unsubscribe';
120         msg['name'] = this.attributeName;
121         msg['zone'] = obj.zone;
122
123         extension.postMessage(JSON.stringify(msg));
124     }
125 };
126
127 VehicleSignalInterface.prototype.set = function (value, zone) {
128     var msg = {};
129     msg['method'] = 'set';
130     msg['name'] = this.attributeName;
131     msg['zone'] = zone;
132     msg['value'] = value;
133
134     return createPromise(msg);
135 };
136
137 VehicleSignalInterface.prototype.availableForSubscription = function(attName) {
138     return isAvailable(this, attName);
139 };
140
141 VehicleSignalInterface.prototype.availableForSetting = function(attName) {
142     return isAvailable(this, attName);
143 };
144
145 function isAvailable(obj, attName)
146 {
147     var msg = {};
148     msg["method"] = 'availableForRetrieval';
149     msg["name"] = obj.attributeName;
150     msg["attName"] = attName;
151
152     var reply = extension.internal.sendSyncMessage(JSON.stringify(msg));
153
154     if (reply === "true") {
155         return "available";
156     } else {
157         return "not_supported";
158     }
159 }
160
161 function AsyncCall(resolve, reject) {
162     this.resolve = resolve;
163     this.reject = reject;
164 }
165
166 function createPromise(msg) {
167     var promise = new Promise(function(resolve, reject) {
168         async_calls[next_async_call_id] = new AsyncCall(resolve, reject);
169     });
170
171     msg.asyncCallId = next_async_call_id;
172     extension.postMessage(JSON.stringify(msg));
173     ++next_async_call_id;
174
175     return promise;
176 }
177
178 window.Zone = function(zone) {
179     this.value = zone ? zone : [];
180
181     Object.defineProperty(this, 'driver',
182                           { enumerable: false, get: function() {
183                               return new Zone(['Front', 'Left']);
184                           } });
185 };
186
187 window.Zone.prototype.equals = function(zone) {
188     var is_equal = true;
189
190     for (var i = 0; i < zone.value.length; i++) {
191         is_equal = is_equal && this.value.indexOf(zone.value[i]) !== -1;
192     }
193
194     for (var i = 0; i < this.value.length; i++) {
195         is_equal = is_equal && zone.value.indexOf(this.value[i]) !== -1;
196     }
197
198     return is_equal;
199 };
200
201 function _defineVehicleProperty(obj, prop) {
202     Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleInterface(prop) });
203 }
204
205 function _defineVehicleSignalProperty(obj, prop) {
206     Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleSignalInterface(prop) });
207 }
208
209 extension.setMessageListener(function(json) {
210     try {
211         var msg = JSON.parse(json);
212
213         switch (msg.method) {
214         case 'get':
215             handlePromiseReply(msg);
216             break;
217         case 'zones':
218             handleZonesReply(msg);
219             break;
220         case 'subscribe':
221             handleSubscribeReply(msg);
222             break;
223         case 'set':
224             handlePromiseReply(msg);
225             break;
226         case 'supported':
227             handleSupportedReply(msg)
228             break;
229         case 'vehicleSupportedAttributes':
230             handleVehicleSupported(msg);
231             break;
232         default:
233             break;
234         }
235     } catch (error) {
236         console.log('Error in message listener: ' + error);
237         console.log("msg: " + JSON.stringify(msg))
238     }
239 });
240
241 function handlePromiseReply(msg) {
242     var cbobj = async_calls[msg.asyncCallId];
243
244     if (msg.error) {
245         var error = {};
246         error.error = msg.value;
247         switch (msg.value) {
248         case 'permission_denied':
249             error.message = 'Permission denied';
250             break;
251         case 'invalid_operation':
252             error.message = 'Invalid operation';
253             break;
254         case 'timeout':
255             error.message = 'Operation timed out';
256             break;
257         case 'invalid_zone':
258             error.message = 'Zone invalid or not found';
259             break;
260         case 'unknown':
261             error.message = 'An unknown error occured';
262             break;
263         default:
264             error.message = 'Unknown';
265             break;
266         }
267
268         cbobj.reject(error);
269     } else {
270         if (msg.value && msg.value.zone) {
271             msg.value.zone = new Zone(msg.value.zone);
272         }
273         cbobj.resolve(msg.value);
274     }
275
276     delete async_calls[msg.asyncCallId];
277 }
278
279 function handleZonesReply(msg) {
280     var cbobj = async_calls[msg.asyncCallId];
281
282     if (cbobj)
283         cbobj.resolve(new Zone(msg.value));
284 }
285
286 function handleSupportedReply(msg) {
287     var cbobj = async_calls[msg.asyncCallId];
288
289     if (cbobj)
290         cbobj.resolve(msg.value);
291 }
292
293 function handleSubscribeReply(msg) {
294     delete async_calls[msg.asyncCallId];
295     var value = msg.value;
296     value.zone = new Zone(value.zone);
297
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)) {
302             itr.callback(value);
303         }
304     }
305 }
306
307 function handleVehicleSupported(msg) {
308     var value = msg.value;
309     for(i in value) {
310         if(exports[i] !== undefined) {
311             _defineVehicleSignalProperty(exports, i);
312         }
313     }
314 }
315
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');
339
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');
350
351 /// Personalization attributes:
352 _defineVehicleSignalProperty(exports, 'mirror');
353 _defineVehicleSignalProperty(exports, 'seatAdjustment');
354 _defineVehicleSignalProperty(exports, 'driveMode');
355 _defineVehicleSignalProperty(exports, 'dashboardIllumination');
356 _defineVehicleSignalProperty(exports, 'vehicleSound');
357
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');
367
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');
376
377 /// Vision and Parking Interfaces
378 _defineVehicleSignalProperty(exports, 'langeDepartureStatus');
379 _defineVehicleSignalProperty(exports, 'alarm');
380 _defineVehicleSignalProperty(exports, 'parkingBrake');
381
382