@@ -22,6 +22,7 @@ static struct k_sem sensor_sem;
22
22
static jerry_value_t zjs_sensor_prototype ;
23
23
24
24
enum sensor_state {
25
+ SENSOR_STATE_UNCONNECTED ,
25
26
SENSOR_STATE_IDLE ,
26
27
SENSOR_STATE_ACTIVATING ,
27
28
SENSOR_STATE_ACTIVATED ,
@@ -120,6 +121,8 @@ static enum sensor_state zjs_sensor_get_state(jerry_value_t obj)
120
121
const int BUFLEN = 20 ;
121
122
char buffer [BUFLEN ];
122
123
if (zjs_obj_get_string (obj , "state" , buffer , BUFLEN )) {
124
+ if (!strcmp (buffer , "unconnected" ))
125
+ return SENSOR_STATE_UNCONNECTED ;
123
126
if (!strcmp (buffer , "idle" ))
124
127
return SENSOR_STATE_IDLE ;
125
128
if (!strcmp (buffer , "activating" ))
@@ -128,12 +131,13 @@ static enum sensor_state zjs_sensor_get_state(jerry_value_t obj)
128
131
return SENSOR_STATE_ACTIVATED ;
129
132
if (!strcmp (buffer , "errored" ))
130
133
return SENSOR_STATE_ERRORED ;
134
+ else
135
+ ERR_PRINT ("invalid state set %s\n" , buffer );
136
+ } else {
137
+ ERR_PRINT ("state is undefined\n" );
131
138
}
132
139
133
- ERR_PRINT ("state not set\n" );
134
- jerry_value_t state = jerry_create_string ("errored" );
135
- zjs_set_property (obj , "state" , state );
136
- jerry_release_value (state );
140
+ zjs_obj_add_readonly_string (obj , "errored" , "state" );
137
141
return SENSOR_STATE_ERRORED ;
138
142
}
139
143
@@ -145,26 +149,35 @@ static void zjs_sensor_set_state(jerry_value_t obj, enum sensor_state state)
145
149
}
146
150
147
151
// update state property and trigger onstatechange event
148
- jerry_value_t new_state ;
152
+ const char * state_str = NULL ;
149
153
switch (state ) {
154
+ case SENSOR_STATE_UNCONNECTED :
155
+ state_str = "unconnected" ;
156
+ break ;
150
157
case SENSOR_STATE_IDLE :
151
- new_state = jerry_create_string ( "idle" ) ;
158
+ state_str = "idle" ;
152
159
break ;
153
160
case SENSOR_STATE_ACTIVATING :
154
- new_state = jerry_create_string ( "activating" ) ;
161
+ state_str = "activating" ;
155
162
break ;
156
163
case SENSOR_STATE_ACTIVATED :
157
- new_state = jerry_create_string ( "activated" ) ;
164
+ state_str = "activated" ;
158
165
break ;
159
166
case SENSOR_STATE_ERRORED :
160
- new_state = jerry_create_string ( "errored" ) ;
167
+ state_str = "errored" ;
161
168
break ;
169
+
170
+ default :
171
+ // should never get here
172
+ ERR_PRINT ("invalid state\n" );
173
+ return ;
162
174
}
163
- zjs_set_property (obj , "state" , new_state );
175
+ zjs_obj_add_readonly_string (obj , state_str , "state" );
164
176
165
177
jerry_value_t func = zjs_get_property (obj , "onstatechange" );
166
178
if (jerry_value_is_function (func )) {
167
179
// if onstatechange exists, call it
180
+ jerry_value_t new_state = jerry_create_string (state_str );
168
181
jerry_value_t rval = jerry_call_function (func , obj , & new_state , 1 );
169
182
if (jerry_value_has_error_flag (rval )) {
170
183
ERR_PRINT ("calling onstatechange\n" );
@@ -186,7 +199,6 @@ static void zjs_sensor_set_state(jerry_value_t obj, enum sensor_state state)
186
199
}
187
200
jerry_release_value (func );
188
201
}
189
- jerry_release_value (new_state );
190
202
}
191
203
192
204
static void zjs_sensor_update_reading (jerry_value_t obj ,
@@ -196,35 +208,26 @@ static void zjs_sensor_update_reading(jerry_value_t obj,
196
208
// update reading property and trigger onchange event
197
209
jerry_value_t reading_obj = jerry_create_object ();
198
210
switch (channel ) {
199
- case SENSOR_CHAN_ACCEL_XYZ :
200
- case SENSOR_CHAN_GYRO_XYZ : ;
201
- // reading is a ptr to an array of 3 double values
202
- double x = ((double * )reading )[0 ];
203
- double y = ((double * )reading )[1 ];
204
- double z = ((double * )reading )[2 ];
205
- jerry_value_t x_val = jerry_create_number (x );
206
- jerry_value_t y_val = jerry_create_number (y );
207
- jerry_value_t z_val = jerry_create_number (z );
208
- zjs_set_property (reading_obj , "x" , x_val );
209
- zjs_set_property (reading_obj , "y" , y_val );
210
- zjs_set_property (reading_obj , "z" , z_val );
211
- jerry_release_value (x_val );
212
- jerry_release_value (y_val );
213
- jerry_release_value (z_val );
214
- break ;
215
- case SENSOR_CHAN_LIGHT : ;
216
- // reading is a ptr to double
217
- double d = * ((double * )reading );
218
- jerry_value_t d_val = jerry_create_number (d );
219
- zjs_set_property (reading_obj , "illuminance" , d_val );
220
- jerry_release_value (d_val );
221
- break ;
222
-
223
- default :
224
- ERR_PRINT ("unsupported sensor type\n" );
225
- jerry_release_value (reading_obj );
226
- return ;
211
+ case SENSOR_CHAN_ACCEL_XYZ :
212
+ case SENSOR_CHAN_GYRO_XYZ : ;
213
+ // reading is a ptr to an array of 3 double values
214
+ double x = ((double * )reading )[0 ];
215
+ double y = ((double * )reading )[1 ];
216
+ double z = ((double * )reading )[2 ];
217
+ zjs_obj_add_readonly_number (reading_obj , x , "x" );
218
+ zjs_obj_add_readonly_number (reading_obj , y , "y" );
219
+ zjs_obj_add_readonly_number (reading_obj , z , "z" );
220
+ break ;
221
+ case SENSOR_CHAN_LIGHT : ;
222
+ // reading is a ptr to double
223
+ double d = * ((double * )reading );
224
+ zjs_obj_add_readonly_number (reading_obj , d , "illuminance" );
225
+ break ;
227
226
227
+ default :
228
+ ERR_PRINT ("unsupported sensor type\n" );
229
+ jerry_release_value (reading_obj );
230
+ return ;
228
231
}
229
232
230
233
zjs_set_property (obj , "reading" , reading_obj );
@@ -361,6 +364,11 @@ static jerry_value_t zjs_sensor_start(const jerry_value_t function_obj,
361
364
{
362
365
// requires: this is a Sensor object from takes no args
363
366
// effects: activates the sensor and start monitoring changes
367
+ enum sensor_state state = zjs_sensor_get_state (this );
368
+ if (state == SENSOR_STATE_ACTIVATING || state == SENSOR_STATE_ACTIVATED ) {
369
+ return ZJS_UNDEFINED ;
370
+ }
371
+
364
372
uintptr_t ptr ;
365
373
sensor_handle_t * handle = NULL ;
366
374
if (jerry_get_object_native_handle (this , & ptr )) {
@@ -370,11 +378,6 @@ static jerry_value_t zjs_sensor_start(const jerry_value_t function_obj,
370
378
}
371
379
}
372
380
373
- enum sensor_state state = zjs_sensor_get_state (this );
374
- if (state != SENSOR_STATE_IDLE && state != SENSOR_STATE_ERRORED ) {
375
- return zjs_error ("zjs_sensor_start: invalid state" );
376
- }
377
-
378
381
zjs_sensor_set_state (this , SENSOR_STATE_ACTIVATING );
379
382
zjs_ipm_message_t send ;
380
383
send .type = TYPE_SENSOR_START ;
@@ -411,6 +414,11 @@ static jerry_value_t zjs_sensor_stop(const jerry_value_t function_obj,
411
414
{
412
415
// requires: this is a Sensor object from takes no args
413
416
// effects: de-activates the sensor and stop monitoring changes
417
+ enum sensor_state state = zjs_sensor_get_state (this );
418
+ if (state != SENSOR_STATE_ACTIVATING && state != SENSOR_STATE_ACTIVATED ) {
419
+ return ZJS_UNDEFINED ;
420
+ }
421
+
414
422
uintptr_t ptr ;
415
423
sensor_handle_t * handle = NULL ;
416
424
if (jerry_get_object_native_handle (this , & ptr )) {
@@ -420,11 +428,6 @@ static jerry_value_t zjs_sensor_stop(const jerry_value_t function_obj,
420
428
}
421
429
}
422
430
423
- enum sensor_state state = zjs_sensor_get_state (this );
424
- if (state == SENSOR_STATE_IDLE || state == SENSOR_STATE_ERRORED ) {
425
- return zjs_error ("zjs_sensor_stop: invalid state" );
426
- }
427
-
428
431
zjs_ipm_message_t send ;
429
432
send .type = TYPE_SENSOR_STOP ;
430
433
send .data .sensor .channel = handle -> channel ;
@@ -501,7 +504,7 @@ static jerry_value_t zjs_sensor_create(const jerry_value_t function_obj,
501
504
jerry_value_t sensor_obj = jerry_create_object ();
502
505
jerry_value_t reading_val = jerry_create_null ();
503
506
zjs_obj_add_number (sensor_obj , frequency , "frequency" );
504
- zjs_obj_add_string (sensor_obj , "idle " , "state" );
507
+ zjs_obj_add_readonly_string (sensor_obj , "unconnected " , "state" );
505
508
zjs_set_property (sensor_obj , "reading" , reading_val );
506
509
jerry_release_value (reading_val );
507
510
0 commit comments