Skip to content
This repository was archived by the owner on Aug 5, 2022. It is now read-only.

Commit f2f86a3

Browse files
jimmy-huanggrgustaf
authored andcommitted
[sensor] Refactor sensor callbacks
Intead of shuffing the union of sensor reading to the callbacks, only copy the the bytes needed for each type of sensor, for example, Accelerometer and Gyroscope with X,Y,Z values will send 3 doubles, where as Ambient Light will only send a single double. Also rebased to use the new Zephyr api. Signed-off-by: Jimmy Huang <[email protected]>
1 parent 588fc1f commit f2f86a3

File tree

2 files changed

+96
-60
lines changed

2 files changed

+96
-60
lines changed

arc/src/main.c

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -448,7 +448,7 @@ static void process_accel_data(struct device *dev)
448448
struct sensor_value val[3];
449449
double dval[3];
450450

451-
if (sensor_channel_get(dev, SENSOR_CHAN_ACCEL_ANY, val) < 0) {
451+
if (sensor_channel_get(dev, SENSOR_CHAN_ACCEL_XYZ, val) < 0) {
452452
ERR_PRINT("failed to read accelerometer channels\n");
453453
return;
454454
}
@@ -466,7 +466,7 @@ static void process_accel_data(struct device *dev)
466466
accel_last_value[0] = reading.x = dval[0];
467467
accel_last_value[1] = reading.y = dval[1];
468468
accel_last_value[2] = reading.z = dval[2];
469-
send_sensor_data(SENSOR_CHAN_ACCEL_ANY, reading);
469+
send_sensor_data(SENSOR_CHAN_ACCEL_XYZ, reading);
470470
}
471471

472472
#ifdef DEBUG_BUILD
@@ -484,7 +484,7 @@ static void process_gyro_data(struct device *dev)
484484
struct sensor_value val[3];
485485
double dval[3];
486486

487-
if (sensor_channel_get(dev, SENSOR_CHAN_GYRO_ANY, val) < 0) {
487+
if (sensor_channel_get(dev, SENSOR_CHAN_GYRO_XYZ, val) < 0) {
488488
ERR_PRINT("failed to read gyroscope channels\n");
489489
return;
490490
}
@@ -500,7 +500,7 @@ static void process_gyro_data(struct device *dev)
500500
gyro_last_value[0] = reading.x = dval[0];
501501
gyro_last_value[1] = reading.y = dval[1];
502502
gyro_last_value[2] = reading.z = dval[2];
503-
send_sensor_data(SENSOR_CHAN_GYRO_ANY, reading);
503+
send_sensor_data(SENSOR_CHAN_GYRO_XYZ, reading);
504504
}
505505

506506
#ifdef DEBUG_BUILD
@@ -526,9 +526,9 @@ static void trigger_hdlr(struct device *dev,
526526
return;
527527
}
528528

529-
if (trigger->chan == SENSOR_CHAN_ACCEL_ANY) {
529+
if (trigger->chan == SENSOR_CHAN_ACCEL_XYZ) {
530530
process_accel_data(dev);
531-
} else if (trigger->chan == SENSOR_CHAN_GYRO_ANY) {
531+
} else if (trigger->chan == SENSOR_CHAN_GYRO_XYZ) {
532532
process_gyro_data(dev);
533533
}
534534
}
@@ -547,7 +547,7 @@ struct sensor_value acc_calib[] = {
547547
static int auto_calibration(struct device *dev)
548548
{
549549
/* calibrate accelerometer */
550-
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_ANY,
550+
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
551551
SENSOR_ATTR_CALIB_TARGET, acc_calib) < 0) {
552552
return -1;
553553
}
@@ -557,7 +557,7 @@ static int auto_calibration(struct device *dev)
557557
* the target on all axis is set internally to 0. This is used just to
558558
* trigger a gyro calibration.
559559
*/
560-
if (sensor_attr_set(dev, SENSOR_CHAN_GYRO_ANY,
560+
if (sensor_attr_set(dev, SENSOR_CHAN_GYRO_XYZ,
561561
SENSOR_ATTR_CALIB_TARGET, NULL) < 0) {
562562
return -1;
563563
}
@@ -574,7 +574,7 @@ static int start_accel_trigger(struct device *dev, int freq)
574574
// units, convert the range to m/s^2.
575575
sensor_g_to_ms2(16, &attr);
576576

577-
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_ANY,
577+
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
578578
SENSOR_ATTR_FULL_SCALE, &attr) < 0) {
579579
ERR_PRINT("failed to set accelerometer range\n");
580580
return -1;
@@ -583,7 +583,7 @@ static int start_accel_trigger(struct device *dev, int freq)
583583
attr.val1 = freq;
584584
attr.val2 = 0;
585585

586-
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_ANY,
586+
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
587587
SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) {
588588
ERR_PRINT("failed to set accelerometer sampling frequency %d\n", freq);
589589
return -1;
@@ -592,7 +592,7 @@ static int start_accel_trigger(struct device *dev, int freq)
592592
// set slope threshold to 0.1G (0.1 * 9.80665 = 4.903325 m/s^2).
593593
attr.val1 = 0;
594594
attr.val2 = 980665;
595-
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_ANY,
595+
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
596596
SENSOR_ATTR_SLOPE_TH, &attr) < 0) {
597597
ERR_PRINT("failed set slope threshold\n");
598598
return -1;
@@ -601,15 +601,15 @@ static int start_accel_trigger(struct device *dev, int freq)
601601
// set slope duration to 2 consecutive samples
602602
attr.val1 = 2;
603603
attr.val2 = 0;
604-
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_ANY,
604+
if (sensor_attr_set(dev, SENSOR_CHAN_ACCEL_XYZ,
605605
SENSOR_ATTR_SLOPE_DUR, &attr) < 0) {
606606
ERR_PRINT("failed to set slope duration\n");
607607
return -1;
608608
}
609609

610610
// set data ready trigger handler
611611
trig.type = SENSOR_TRIG_DATA_READY;
612-
trig.chan = SENSOR_CHAN_ACCEL_ANY;
612+
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
613613

614614
if (sensor_trigger_set(dev, &trig, trigger_hdlr) < 0) {
615615
ERR_PRINT("failed to enable accelerometer trigger\n");
@@ -625,7 +625,7 @@ static int stop_accel_trigger(struct device *dev)
625625
struct sensor_trigger trig;
626626

627627
trig.type = SENSOR_TRIG_DATA_READY;
628-
trig.chan = SENSOR_CHAN_ACCEL_ANY;
628+
trig.chan = SENSOR_CHAN_ACCEL_XYZ;
629629

630630
if (sensor_trigger_set(bmi160, &trig, NULL) < 0) {
631631
ERR_PRINT("failed to disable accelerometer trigger\n");
@@ -644,15 +644,15 @@ static int start_gyro_trigger(struct device *dev, int freq)
644644
attr.val1 = freq;
645645
attr.val2 = 0;
646646

647-
if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_ANY,
647+
if (sensor_attr_set(bmi160, SENSOR_CHAN_GYRO_XYZ,
648648
SENSOR_ATTR_SAMPLING_FREQUENCY, &attr) < 0) {
649649
ERR_PRINT("failed to set sampling frequency for gyroscope\n");
650650
return -1;
651651
}
652652

653653
// set data ready trigger handler
654654
trig.type = SENSOR_TRIG_DATA_READY;
655-
trig.chan = SENSOR_CHAN_GYRO_ANY;
655+
trig.chan = SENSOR_CHAN_GYRO_XYZ;
656656

657657
if (sensor_trigger_set(bmi160, &trig, trigger_hdlr) < 0) {
658658
ERR_PRINT("failed to enable gyroscope trigger\n");
@@ -668,7 +668,7 @@ static int stop_gyro_trigger(struct device *dev)
668668
struct sensor_trigger trig;
669669

670670
trig.type = SENSOR_TRIG_DATA_READY;
671-
trig.chan = SENSOR_CHAN_GYRO_ANY;
671+
trig.chan = SENSOR_CHAN_GYRO_XYZ;
672672

673673
if (sensor_trigger_set(bmi160, &trig, NULL) < 0) {
674674
ERR_PRINT("failed to disable gyroscope trigger\n");
@@ -740,8 +740,8 @@ static void handle_sensor(struct zjs_ipm_message* msg)
740740

741741
switch(msg->type) {
742742
case TYPE_SENSOR_INIT:
743-
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_ANY ||
744-
msg->data.sensor.channel == SENSOR_CHAN_GYRO_ANY) {
743+
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_XYZ ||
744+
msg->data.sensor.channel == SENSOR_CHAN_GYRO_XYZ) {
745745
if (!bmi160) {
746746
bmi160 = device_get_binding("bmi160");
747747

@@ -759,12 +759,12 @@ static void handle_sensor(struct zjs_ipm_message* msg)
759759
break;
760760
case TYPE_SENSOR_START:
761761
freq = msg->data.sensor.frequency;
762-
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_ANY) {
762+
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_XYZ) {
763763
if (!bmi160 || (!accel_trigger &&
764764
start_accel_trigger(bmi160, freq) != 0)) {
765765
error_code = ERROR_IPM_OPERATION_FAILED;
766766
}
767-
} else if (msg->data.sensor.channel == SENSOR_CHAN_GYRO_ANY) {
767+
} else if (msg->data.sensor.channel == SENSOR_CHAN_GYRO_XYZ) {
768768
if (!bmi160 || (!gyro_trigger &&
769769
start_gyro_trigger(bmi160, freq) != 0)) {
770770
error_code = ERROR_IPM_OPERATION_FAILED;
@@ -786,12 +786,12 @@ static void handle_sensor(struct zjs_ipm_message* msg)
786786
}
787787
break;
788788
case TYPE_SENSOR_STOP:
789-
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_ANY) {
789+
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_XYZ) {
790790
if (!bmi160 || (accel_trigger &&
791791
stop_accel_trigger(bmi160) != 0)) {
792792
error_code = ERROR_IPM_OPERATION_FAILED;
793793
}
794-
} else if (msg->data.sensor.channel == SENSOR_CHAN_GYRO_ANY) {
794+
} else if (msg->data.sensor.channel == SENSOR_CHAN_GYRO_XYZ) {
795795
if (!bmi160 || (gyro_trigger &&
796796
stop_gyro_trigger(bmi160) != 0)) {
797797
error_code = ERROR_IPM_OPERATION_FAILED;

src/zjs_sensor.c

Lines changed: 73 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ static sensor_handle_t *zjs_sensor_alloc_handle(enum sensor_channel channel)
5151

5252
// append to the list
5353
sensor_handle_t **head = NULL;
54-
if (channel == SENSOR_CHAN_ACCEL_ANY) {
54+
if (channel == SENSOR_CHAN_ACCEL_XYZ) {
5555
head = &accel_handles;
56-
} else if (channel == SENSOR_CHAN_GYRO_ANY) {
56+
} else if (channel == SENSOR_CHAN_GYRO_XYZ) {
5757
head = &gyro_handles;
5858
} else if (channel == SENSOR_CHAN_LIGHT) {
5959
head = &light_handles;
@@ -191,26 +191,42 @@ static void zjs_sensor_set_state(jerry_value_t obj, enum sensor_state state)
191191

192192
static void zjs_sensor_update_reading(jerry_value_t obj,
193193
enum sensor_channel channel,
194-
union sensor_reading reading)
194+
void *reading)
195195
{
196196
// update reading property and trigger onchange event
197197
jerry_value_t reading_obj = jerry_create_object();
198-
if (channel == SENSOR_CHAN_ACCEL_ANY ||
199-
channel == SENSOR_CHAN_GYRO_ANY) {
200-
jerry_value_t x_val = jerry_create_number(reading.x);
201-
jerry_value_t y_val = jerry_create_number(reading.y);
202-
jerry_value_t z_val = jerry_create_number(reading.z);
203-
zjs_set_property(reading_obj, "x", x_val);
204-
zjs_set_property(reading_obj, "y", y_val);
205-
zjs_set_property(reading_obj, "z", z_val);
206-
jerry_release_value(x_val);
207-
jerry_release_value(y_val);
208-
jerry_release_value(z_val);
209-
} else if (channel == SENSOR_CHAN_LIGHT) {
210-
jerry_value_t d_val = jerry_create_number(reading.dval);
211-
zjs_set_property(reading_obj, "illuminance", d_val);
212-
jerry_release_value(d_val);
198+
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;
227+
213228
}
229+
214230
zjs_set_property(obj, "reading", reading_obj);
215231
jerry_value_t func = zjs_get_property(obj, "onchange");
216232
if (jerry_value_is_function(func)) {
@@ -264,21 +280,49 @@ static void zjs_sensor_onchange_c_callback(void *h, void *argv)
264280
return;
265281
}
266282

267-
union sensor_reading *reading = (union sensor_reading*)argv;
268283
if (zjs_sensor_get_state(handle->sensor_obj) == SENSOR_STATE_ACTIVATED) {
269284
zjs_sensor_update_reading(handle->sensor_obj,
270285
handle->channel,
271-
*reading);
286+
argv);
272287
}
273288
}
274289

275290
// INTERRUPT SAFE FUNCTION: No JerryScript VM, allocs, or likely prints!
276-
static void zjs_sensor_signal_callbacks(sensor_handle_t *handle,
277-
union sensor_reading reading)
291+
static void zjs_sensor_signal_callbacks(struct sensor_data *data)
278292
{
293+
sensor_handle_t *handles = NULL;
294+
bool xyz = false;
295+
296+
switch(data->channel) {
297+
case SENSOR_CHAN_ACCEL_XYZ:
298+
handles = accel_handles;
299+
xyz = true;
300+
break;
301+
case SENSOR_CHAN_GYRO_XYZ:
302+
handles = gyro_handles;
303+
xyz = true;
304+
break;
305+
case SENSOR_CHAN_LIGHT:
306+
handles = light_handles;
307+
break;
308+
309+
default:
310+
ERR_PRINT("unsupported sensor type\n");
311+
return;
312+
}
313+
279314
// iterate all sensor instances to update readings and trigger event
280-
for (sensor_handle_t *h = handle; h; h = h->next) {
281-
zjs_signal_callback(h->id, &reading, sizeof(reading));
315+
for (sensor_handle_t *h = handles; h; h = h->next) {
316+
if (xyz) {
317+
double xyz[3];
318+
xyz[0] = data->reading.x;
319+
xyz[1] = data->reading.y;
320+
xyz[2] = data->reading.z;
321+
zjs_signal_callback(h->id, &xyz, sizeof(xyz));
322+
} else {
323+
double dval = data->reading.dval;
324+
zjs_signal_callback(h->id, &dval, sizeof(dval));
325+
}
282326
}
283327
}
284328

@@ -298,16 +342,8 @@ static void ipm_msg_receive_callback(void *context, uint32_t id, volatile void *
298342
// un-block sync api
299343
k_sem_give(&sensor_sem);
300344
} else if (msg->type == TYPE_SENSOR_EVENT_READING_CHANGE) {
301-
// value change event, copy the data, and signal event callback
302-
if (msg->data.sensor.channel == SENSOR_CHAN_ACCEL_ANY) {
303-
zjs_sensor_signal_callbacks(accel_handles, msg->data.sensor.reading);
304-
} else if (msg->data.sensor.channel == SENSOR_CHAN_GYRO_ANY) {
305-
zjs_sensor_signal_callbacks(gyro_handles, msg->data.sensor.reading);
306-
} else if (msg->data.sensor.channel == SENSOR_CHAN_LIGHT) {
307-
zjs_sensor_signal_callbacks(light_handles, msg->data.sensor.reading);
308-
} else {
309-
ERR_PRINT("unsupported sensor type\n");
310-
}
345+
// value change event, signal event callback
346+
zjs_sensor_signal_callbacks(&msg->data.sensor);
311347
} else {
312348
ERR_PRINT("unsupported message received\n");
313349
}
@@ -437,7 +473,7 @@ static jerry_value_t zjs_sensor_create(const jerry_value_t function_obj,
437473
DEFAULT_SAMPLING_FREQUENCY);
438474
}
439475

440-
if (channel == SENSOR_CHAN_ACCEL_ANY) {
476+
if (channel == SENSOR_CHAN_ACCEL_XYZ) {
441477
bool option_gravity;
442478
if (zjs_obj_get_boolean(options, "includeGravity", &option_gravity) &&
443479
option_gravity) {
@@ -501,7 +537,7 @@ static jerry_value_t zjs_accel_create(const jerry_value_t function_obj,
501537
this,
502538
argv,
503539
argc,
504-
SENSOR_CHAN_ACCEL_ANY);
540+
SENSOR_CHAN_ACCEL_XYZ);
505541
}
506542

507543
static jerry_value_t zjs_gyro_create(const jerry_value_t function_obj,
@@ -516,7 +552,7 @@ static jerry_value_t zjs_gyro_create(const jerry_value_t function_obj,
516552
this,
517553
argv,
518554
argc,
519-
SENSOR_CHAN_GYRO_ANY);
555+
SENSOR_CHAN_GYRO_XYZ);
520556
}
521557

522558
static jerry_value_t zjs_light_create(const jerry_value_t function_obj,

0 commit comments

Comments
 (0)