/*
- * Copyright (C) 2014 Intel Corporation.
- */
+// Copyright (c) 2015 Intel Corporation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+*/
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
#include <pthread.h>
#include <errno.h>
+#include <signal.h>
+#include <string.h>
#include <hardware/sensors.h>
#include <utils/Log.h>
fprintf(stderr, "sens [activate | deactivate] sensor_id\n");
fprintf(stderr, "sens set_delay sensor_id delay\n");
fprintf(stderr, "sens poll\n");
+ fprintf(stderr, "sens poll [duration] [number_of_events] \n");
+ fprintf(stderr, "sens poll_stop\n");
+ fprintf(stderr, "sens check_sample_rate [rate] \n");
return 1;
}
static struct hw_device_t *dev;
static FILE *client;
static pthread_mutex_t client_mutex = PTHREAD_MUTEX_INITIALIZER;
-
+static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
+static int ready_to_close = 0;
+static int number_of_events = 0;
+static int non_param_poll = 1;
+static int event_no = 0;
+static int init_events = 0;
+static int print_events = 1;
+static long long timestamp = 0;
+static long long event_init_poll_time = 0;
+static long long poll_duration = 0;
static void print_event(struct sensors_event_t *e)
{
FILE *f;
pthread_mutex_lock(&client_mutex);
-
if (!client) {
pthread_mutex_unlock(&client_mutex);
return;
}
f = client;
- fprintf(f, "event: version=%d sensor=%d type=%s timestamp=%lld\n",
+ fprintf(f, "event %d: version=%d sensor=%d type=%s timestamp=%lld\n",event_no,
e->version, e->sensor, type_str(e->type), (long long)e->timestamp);
-
+ if (poll_duration != 0)
+ fprintf(f,"Time remaining:%lld \n",poll_duration - ((long long)e->timestamp
+ - event_init_poll_time));
switch (e->type) {
case SENSOR_TYPE_META_DATA:
break;
fprintf(f, "event: step_detector=%10.2f\n", e->data[0]);
break;
case SENSOR_TYPE_STEP_COUNTER:
- fprintf(f, "event: step_detector=%llu\n",
+ fprintf(f, "event: step_counter=%llu\n",
(unsigned long long)e->u64.step_counter);
break;
}
-
fprintf(f, "\n");
fflush(f);
pthread_mutex_unlock(&client_mutex);
}
+static void print_result(int result)
+{
+ FILE *f;
+ pthread_mutex_lock(&client_mutex);
+ if (!client) {
+ pthread_mutex_unlock(&client_mutex);
+ return;
+ }
+ f = client;
+ fprintf(f, "Number of events: %d \n", event_no - init_events);
+ fprintf(f, "Duration: %lld \n\n", (long long) timestamp - event_init_poll_time);
+ if(!print_events){
+ if(result)
+ fprintf(f, "Test passed\n\n");
+ else
+ fprintf(f, "Test failed\n\n");
+ }
+ fflush(f);
+ pthread_mutex_unlock(&client_mutex);
+
+}
+
+static void process_event(struct sensors_event_t *e)
+{
+ int is_poll_duration_over = 0;
+ int is_event_number_reached = 0;
+
+ if (event_init_poll_time == 0) {
+ event_init_poll_time = (long long) e->timestamp;
+ init_events = event_no;
+ }
+ is_poll_duration_over = (long long) e->timestamp - event_init_poll_time <= poll_duration ? 0 : 1;
+ is_event_number_reached = (event_no - init_events) < number_of_events ? 0 : 1;
+
+ if ((!is_poll_duration_over && !is_event_number_reached) || non_param_poll)
+ {
+ timestamp = e -> timestamp;
+ event_no++;
+ if(print_events)
+ print_event(e);
+ } else {
+ ready_to_close = 1;
+ print_result(is_event_number_reached);
+ pthread_cond_signal(&cond);
+ }
+}
+
static void run_sensors_poll_v0(void)
{
struct sensors_poll_device_t *poll_dev = (struct sensors_poll_device_t *)dev;
count = poll_dev->poll(poll_dev, events, sizeof(events)/sizeof(sensors_event_t));
for(i = 0; i < count; i++)
- print_event(&events[i]);
+ process_event(&events[i]);
}
}
+static void sig_pipe(int sig)
+{
+ client = NULL;
+}
+
static void *run_sensors_thread(void *arg __attribute((unused)))
{
+
+ signal(SIGPIPE, sig_pipe);
+
switch (dev->version) {
case SENSORS_DEVICE_API_VERSION_0_1:
default:
return sensor_set_delay(handle, delay);
} else if (!strcmp(argv[0], "poll")) {
+ if (argc == 1) {
+ non_param_poll = 1;
+ } else if (argc == 3) {
+ non_param_poll = 0;
+ poll_duration = atoll(argv[1]);
+ number_of_events = atoi(argv[2]);
+ event_init_poll_time = 0;
+ ready_to_close = 0;
+ } else {
+ CLIENT_ERR(f, "poll: no poll duration or number of events set");
+ return -1;
+ }
+ print_events = 1;
+ pthread_mutex_lock(&client_mutex);
+ if (client)
+ fclose(client);
+ client = f;
+
+ if (!non_param_poll) {
+ pthread_cond_wait(&cond, &client_mutex);
+ fclose(client);
+ client = NULL;
+ }
+
+ pthread_mutex_unlock(&client_mutex);
+
+ return 1;
+ } else if (!strcmp(argv[0], "check_sample_rate")) {
+
+ if (argc < 2) {
+ CLIENT_ERR(f, "check_sample_rate: no events rate");
+ return -1;
+ }
+
+ non_param_poll = 0;
+ poll_duration = 1000000000;
+ number_of_events = atoi(argv[1]);
+ event_init_poll_time = 0;
+ ready_to_close = 0;
+ print_events = 0;
pthread_mutex_lock(&client_mutex);
+ if (client)
+ fclose(client);
client = f;
+ pthread_cond_wait(&cond, &client_mutex);
+ fclose(client);
+ client = NULL;
+ pthread_mutex_unlock(&client_mutex);
+ return 1;
+ } else if (!strcmp(argv[0], "poll_stop")) {
+ pthread_mutex_lock(&client_mutex);
+ if (client){
+ fclose(client);
+ client = NULL;
+ }
pthread_mutex_unlock(&client_mutex);
return 1;
.msg_controllen = sizeof(cmsg_buffer),
};
FILE *f =NULL;
+ struct cmsghdr *cmsg;
conn = accept(sock, NULL, NULL);
if (conn < 0) {
continue;
}
- while (1) {
- struct cmsghdr *cmsg;
-
- err = recvmsg(conn, &msg, 0);
- if (err < 0) {
- ALOGE("error in recvmsg: %s", strerror(errno));
- break;
- }
-
- if (err == 0)
- break;
+ err = recvmsg(conn, &msg, 0);
+ if (err < 0) {
+ ALOGE("error in recvmsg: %s", strerror(errno));
+ close(conn);
+ continue;
+ }
- for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
- cmsg = CMSG_NXTHDR(&msg,cmsg)) {
- if (cmsg->cmsg_level == SOL_SOCKET
- && cmsg->cmsg_type == SCM_RIGHTS) {
- int *fd = (int *)CMSG_DATA(cmsg);
- f = fdopen(*fd, "w");
- break;
- }
- }
+ if (err == 0)
+ continue;
- if (data_buff[err - 1] != 0) {
- ALOGE("command is not NULL terminated\n");
+ for (cmsg = CMSG_FIRSTHDR(&msg); cmsg != NULL;
+ cmsg = CMSG_NXTHDR(&msg,cmsg)) {
+ if (cmsg->cmsg_level == SOL_SOCKET
+ && cmsg->cmsg_type == SCM_RIGHTS) {
+ int *fd = (int *)CMSG_DATA(cmsg);
+ f = fdopen(*fd, "w");
break;
}
+ }
- err = dispatch_cmd(data_buff, f);
- if (err < 0) {
- ALOGE("error dispatching command: %d", err);
- break;
- }
+ if (data_buff[err - 1] != 0) {
+ ALOGE("command is not NULL terminated\n");
+ close(conn);
+ continue;
+ }
- /* send ack */
- if (!err)
- write(conn, data_buff, 1);
+ err = dispatch_cmd(data_buff, f);
+ if (err < 0) {
+ ALOGE("error dispatching command: %d", err);
+ close(conn);
+ continue;
}
- pthread_mutex_lock(&client_mutex);
- client = NULL;
- pthread_mutex_unlock(&client_mutex);
+ /* send ack */
+ if (!err) {
+ write(conn, data_buff, 1);
+ fclose(f);
+ }
- fclose(f); close(conn);
+ close(conn);
}
}
int main(int argc, char **argv)
{
- char cmd[1024], *tmp;
+ char cmd[1024];
int sock, i;
struct iovec buff = {
.iov_base = cmd,