running status api's complete
[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 vehicleInterfaceCommonContructor(obj, attname) {
11   obj.attributeName = attname;
12
13   var msg = {};
14   msg['method'] = 'zones';
15   msg['name'] = obj.attributeName;
16
17   obj._zones = new Zone;
18
19   var call = new AsyncCall(function(data) {
20     obj._zones = data;
21   });
22
23   async_calls[next_async_call_id] = call;
24   msg.asyncCallId = next_async_call_id;
25   ++next_async_call_id;
26
27   extension.postMessage(JSON.stringify(msg));
28
29   Object.defineProperty(obj, 'zones', { get: function() { return obj._zones } });
30 }
31
32 function VehicleInterface(attname) {
33   vehicleInterfaceCommonContructor(this, attname);
34 }
35
36 VehicleInterface.prototype.get = function(zone) {
37   var msg = {};
38   msg['method'] = 'get';
39   msg['name'] = this.attributeName;
40   msg['zone'] = zone;
41
42   return createPromise(msg);
43 };
44
45 function VehicleSignalInterface(attname) {
46   vehicleInterfaceCommonContructor(this, attname);
47 }
48
49 VehicleSignalInterface.prototype = VehicleInterface.prototype;
50
51 VehicleSignalInterface.prototype.subscribe = function(callback, zone) {
52   if (!zone) zone = new Zone();
53
54   var msg = {};
55   msg['method'] = 'subscribe';
56   msg['name'] = this.attributeName;
57   msg['zone'] = zone;
58
59   extension.postMessage(JSON.stringify(msg));
60
61   msg['callback'] = callback;
62
63   subscriptions.push(msg);
64
65   return subscriptions.length - 1;
66 };
67
68 VehicleSignalInterface.prototype.unsubscribe = function(handle) {
69   var obj = subscriptions[handle];
70   subscriptions.splice(handle, 1);
71
72   var unsubscribe = true;
73
74   for (var i = 0; i < subscriptions.length; i++) {
75     var testObj = subscriptions[i];
76
77     if (testObj.name === obj.name && testObj.zone.equals(obj.zone)) {
78       unsubscribe = false;
79       break;
80     }
81   }
82
83   if (unsubscribe) {
84     var msg = {};
85     msg['method'] = 'unsubscribe';
86     msg['name'] = this.attributeName;
87     msg['zone'] = obj.zone;
88
89     extension.postMessage(JSON.stringify(msg));
90   }
91 };
92
93 VehicleSignalInterface.prototype.set = function (value, zone) {
94   var msg = {};
95   msg['method'] = 'set';
96   msg['name'] = this.attributeName;
97   msg['zone'] = zone;
98   msg['value'] = value;
99
100   return createPromise(msg);
101 }
102
103 function AsyncCall(resolve, reject) {
104   this.resolve = resolve;
105   this.reject = reject;
106 }
107
108 function createPromise(msg) {
109   var promise = new Promise(function(resolve, reject) {
110     async_calls[next_async_call_id] = new AsyncCall(resolve, reject);
111   });
112
113   msg.asyncCallId = next_async_call_id;
114   extension.postMessage(JSON.stringify(msg));
115   ++next_async_call_id;
116   return promise;
117 }
118
119 window.Zone = function(zone) {
120   this.value = zone ? zone : [];
121
122   Object.defineProperty(this, 'driver',
123                         { enumerable: false, get: function() {
124                           return new Zone(['Front', 'Left']);
125                         } });
126 };
127
128 window.Zone.prototype.equals = function(zone) {
129   var is_equal = true;
130
131   for (var i = 0; i < zone.value.length; i++) {
132     is_equal &= this.value.indexOf(zone.value[i]) !== -1;
133   }
134
135   for (var i = 0; i < this.value.length; i++) {
136     is_equal &= zone.value.indexOf(this.value[i]) !== -1;
137   }
138
139   return is_equal;
140 };
141
142 function _defineVehicleProperty(obj, prop) {
143   Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleInterface(prop) });
144 }
145
146 function _defineVehicleSignalProperty(obj, prop) {
147   Object.defineProperty(obj, prop, { enumerable: true, value: new VehicleSignalInterface(prop) });
148 }
149
150 extension.setMessageListener(function(json) {
151   try {
152     var msg = JSON.parse(json);
153
154     switch (msg.method) {
155       case 'get':
156         handlePromiseReply(msg);
157         break;
158       case 'zones':
159         handleZonesReply(msg);
160         break;
161       case 'subscribe':
162         handleSubscribeReply(msg);
163         break;
164       case 'set':
165         handlePromiseReply(msg);
166         break;
167       default:
168         break;
169     }
170   } catch (error) {
171     console.log('Error in message listener: ' + error);
172   }
173 });
174
175 function handlePromiseReply(msg) {
176   var cbobj = async_calls[msg.asyncCallId];
177
178   if (msg.error) {
179     var error = {};
180     error.error = msg.value;
181     switch (msg.value) {
182       case 'permission_denied':
183         error.message = 'Permission denied';
184         break;
185       case 'invalid_operation':
186         error.message = 'Invalid operation';
187         break;
188       case 'timeout':
189         error.message = 'Operation timed out';
190         break;
191       case 'invalid_zone':
192         error.message = 'Zone invalid or not found';
193         break;
194       case 'unknown':
195         error.message = 'An unknown error occured';
196         break;
197       default:
198         break;
199     }
200
201     cbobj.reject(error);
202   } else {
203     cbobj.resolve(msg.value);
204   }
205
206   delete async_calls[msg.asyncCallId];
207 }
208
209 function handleZonesReply(msg) {
210   var cbobj = async_calls[msg.asyncCallId];
211
212   if (cbobj)
213     cbobj.resolve(new Zone(msg.value));
214 }
215
216 function handleSubscribeReply(msg) {
217   delete async_calls[msg.asyncCallId];
218   var value = msg.value;
219   value.zone = new Zone(value.zone);
220
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)) {
225       itr.callback(value);
226     }
227   }
228 }
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');
252
253 /// Maintenance attributes:
254 _defineVehicleSignalProperty(exports, 'odometer');
255 _defineVehicleSignalProperty(exports, 'transmissionOil');
256 _defineVehicleSignalProperty(exports, 'transmissionClutch');
257
258 _defineVehicleSignalProperty(exports, 'batteryStatus');
259 _defineVehicleSignalProperty(exports, 'tire');
260
261
262 _defineVehicleSignalProperty(exports, 'door');
263 _defineVehicleSignalProperty(exports, 'temperature');
264 _defineVehicleSignalProperty(exports, 'climateControl');
265 _defineVehicleSignalProperty(exports, 'defrost');
266