int main(int argc, char **argv)
{
	handle_t handle;
	error_t ret;
	int fd, size = 0, cmd_type = -1, data_rate = -1, buffer_delay = -1;
	char *sensor_name = NULL;
	int prop_ids[10];
	int prop_vals[10];
	int prop_count = 0;
	int i;

	char buf[512];
	struct accel_data *p_accel_data;

	while (1) {
		static struct option opts[] = {
			{"cmd", 1, NULL, 'c'},
			{"sensor-type", 1, NULL, 't'},
			{"data-rate", 1, NULL, 'r'},
			{"buffer-delay", 1, NULL, 'd'},
			{"property-set", 2, NULL, 'p'},
			{0, 0, NULL, 0}
		};
		int index, o;

		o = getopt_long(argc, argv, "c:t:r::d::p:", opts, &index);
		if (o == -1)
			break;
		switch (o) {
		case 'c':
			cmd_type = strtod(optarg, NULL);
			break;
		case 't':
			sensor_name = strdup(optarg);
			break;
		case 'r':
			data_rate = strtod(optarg, NULL);
			break;
		case 'd':
			buffer_delay = strtod(optarg, NULL);
			break;
		case 'p':
			if (prop_count == sizeof(prop_ids) / sizeof(prop_ids[0]))
				break;
			if (parse_prop_set(optarg,
				prop_ids + prop_count,
				prop_vals + prop_count)) {
				usage();
			}
			++prop_count;
			break;
		case 'h':
			usage();
			break;
		default:
			;
		}
	}

	if ((sensor_name == NULL) || (cmd_type != 0 && cmd_type != 1)) {
		usage();
		return 0;
	}

	if ((cmd_type == 1) && ((data_rate == -1) || (buffer_delay == -1))) {
		usage();
		return 0;
	}

	printf("cmd_type is %d, sensor_name is %s, data_rate is %d Hz, "
			"buffer_delay is %d ms\n", cmd_type, sensor_name,
						data_rate, buffer_delay);
#undef LOG_TAG
#define LOG_TAG "sensorhub_test"
	ALOGD("sensor_name is %s, data_rate is %d Hz, buffer_delay is %d ms\n",
										sensor_name, data_rate, buffer_delay);

	handle = psh_open_session_with_name(sensor_name);

	if (handle == NULL) {
		printf("psh_open_session() returned NULL handle. \n");
		return -1;
	}

	if (cmd_type == 0) {
		p_accel_data = (struct accel_data *)buf;
		size = psh_get_single(handle, buf, 128);

		if (strncmp(sensor_name, "ACCEL", SNR_NAME_MAX_LEN) == 0) {
			struct accel_data *p_accel_data =
					(struct accel_data *)buf;
			printf("get_single returns, x, y, z is %d, %d, %d, "
				"size is %d \n", p_accel_data->x,
				p_accel_data->y, p_accel_data->z, size);
		} else if (strncmp(sensor_name, "GYRO", SNR_NAME_MAX_LEN) == 0) {
			struct gyro_raw_data *p_gyro_raw_data =
					(struct gyro_raw_data *)buf;
			printf("get_single returns, x, y, z is %d, %d, %d, "
				"size is %d \n", p_gyro_raw_data->x,
				p_gyro_raw_data->y, p_gyro_raw_data->z, size);
		} else if (strncmp(sensor_name, "COMPS", SNR_NAME_MAX_LEN) == 0) {
			struct compass_raw_data *p_compass_raw_data =
					(struct compass_raw_data *)buf;
			printf("get_single returns, calibrated--%d\n x, y, z is %d, %d, %d, "
					"size is %d \n",
					p_compass_raw_data->accuracy,
					p_compass_raw_data->x,
					p_compass_raw_data->y,
					p_compass_raw_data->z, size);
		} else if (strncmp(sensor_name, "BARO", SNR_NAME_MAX_LEN) == 0) {
			struct baro_raw_data *p_baro_raw_data =
					(struct baro_raw_data *)buf;
			printf("get_single returns, baro raw data is %d \n",
					p_baro_raw_data->p);
		} else if (strncmp(sensor_name, "ALS_P", SNR_NAME_MAX_LEN) == 0) {
			struct als_raw_data *p_als_raw_data =
					(struct als_raw_data *)buf;
			printf("get_single returns, ALS raw data is %d\n",
					p_als_raw_data->lux);
		} else if (strncmp(sensor_name, "PS_P", SNR_NAME_MAX_LEN) == 0) {
			struct ps_phy_data  *p_ps_phy_data =
					(struct ps_phy_data  *)buf;
			printf("get_single returns, near is %d\n",
					p_ps_phy_data->near);
		} else if (strncmp(sensor_name, "TERMC", SNR_NAME_MAX_LEN) == 0) {
			struct tc_data *p_tc_data = (struct tc_data *)buf;
			printf("get_single returns, orien_xy, "
					"orien_z is %d, %d size is %d \n",
					p_tc_data->orien_xy,
					p_tc_data->orien_z, size);
		} else if (strncmp(sensor_name, "LPE_P", SNR_NAME_MAX_LEN) == 0) {
						struct lpe_phy_data *p_lpe_phy_data =
										(struct lpe_phy_data *)buf;
						printf("get_single returns, lpe_msg is "
								"%u\n", p_lpe_phy_data->lpe_msg);
		} else if (strncmp(sensor_name, "PHYAC", SNR_NAME_MAX_LEN) == 0) {
			printf("activity doesn't support get_single\n");
		} else if (strncmp(sensor_name, "GSSPT", SNR_NAME_MAX_LEN) == 0) {
			struct gs_data *p_gs_data =
					(struct gs_data *)buf;
			printf("get_single returns, size is %d\n",
					p_gs_data->size);
		} else if (strncmp(sensor_name, "GSPX", SNR_NAME_MAX_LEN) == 0) {
			struct gesture_hmm_data *p_gesture_hmm_data =
					(struct gesture_hmm_data *)buf;
			printf("get_single returns, size is %d, gesture is %d\n",
					p_gesture_hmm_data->size, p_gesture_hmm_data->prox_gesture);
		} else if (strncmp(sensor_name, "GSFLK", SNR_NAME_MAX_LEN) == 0) {
			struct gesture_flick_data *p_gesture_flick_data =
					(struct gesture_flick_data *)buf;
			printf("get_single returns, flick is %d\n",
					p_gesture_flick_data->flick);
		} else if (strncmp(sensor_name, "GSETH", SNR_NAME_MAX_LEN) == 0) {
			struct gesture_eartouch_data *p_gesture_eartouch_data =
					(struct gesture_eartouch_data *)buf;
			printf("get_single returns, eartouch is %d\n",
					p_gesture_eartouch_data->eartouch);
		} else if (strncmp(sensor_name, "SHAKI", SNR_NAME_MAX_LEN) == 0) {
			struct shaking_data *p_shaking_data =
					(struct shaking_data *)buf;
			printf("get_single returns, shaking is %d\n",
					p_shaking_data->shaking);
		} else if (strncmp(sensor_name, "LTVTL", SNR_NAME_MAX_LEN) == 0) {
			struct lv_data *p_lv_data =
					(struct lv_data *)buf;
			printf("get_single returns, lift vertical is %d\n",
					p_lv_data->state);
		} else if (strncmp(sensor_name, "STAP", SNR_NAME_MAX_LEN) == 0) {
			struct stap_data *p_stap_data =
					(struct stap_data *)buf;
			printf("get_single returns, stap is %d\n",
					p_stap_data->stap);
		} else if (strncmp(sensor_name, "SIGMT", SNR_NAME_MAX_LEN) == 0) {
			struct sm_data *p_sm_data =
					(struct sm_data *)buf;
			printf("get_single returns, significant motion is %d\n",
					p_sm_data->state);
		} else if (strncmp(sensor_name, "PTZ", SNR_NAME_MAX_LEN) == 0) {
			struct ptz_data *p_ptz_data =
					(struct ptz_data *)buf;
			printf("get_single returns, ptz is %d %d\n",
					p_ptz_data->cls_name, p_ptz_data->angle);
		} else if (strncmp(sensor_name, "DVPOS", SNR_NAME_MAX_LEN) == 0) {
			struct device_position_data *p_device_position_data =
					(struct device_position_data *)buf;
			printf("get_single returns, device position is %d\n",
					p_device_position_data->pos);
		} else if (strncmp(sensor_name, "LIFLK", SNR_NAME_MAX_LEN) == 0) {
			struct lift_look_data *p_lift_look_data =
					(struct lift_look_data *)buf;
			printf("get_single returns, lift look is %d\n",
					p_lift_look_data->liftlook);
		} else if (strncmp(sensor_name, "DTWGS", SNR_NAME_MAX_LEN) == 0) {
			struct dtwgs_data *p_dtwgs_data =
					(struct dtwgs_data *)buf;
			printf("get_single returns, dtwgs is (%d %d)\n",
					p_dtwgs_data->gsnum,
					p_dtwgs_data->score);
		} else if (strncmp(sensor_name, "RVECT", SNR_NAME_MAX_LEN) == 0) {
			struct rotation_vector_data *p_rotation_vector_data =
					(struct rotation_vector_data *)buf;
			printf("get_single returns, rotation vector is (%d, %d,"
				" %d, %d)\n", p_rotation_vector_data->x,
				p_rotation_vector_data->y,
				p_rotation_vector_data->z,
				p_rotation_vector_data->w);
		} else if (strncmp(sensor_name, "6AGRV", SNR_NAME_MAX_LEN) == 0) {
			struct game_rotation_vector_data *p_game_rotation_vector_data =
					(struct game_rotation_vector_data *)buf;
			printf("get_single returns, game rotation vector is (%d, %d,"
				" %d, %d)\n", p_game_rotation_vector_data->x,
				p_game_rotation_vector_data->y,
				p_game_rotation_vector_data->z,
				p_game_rotation_vector_data->w);
		} else if (strncmp(sensor_name, "6AMRV", SNR_NAME_MAX_LEN) == 0) {
			struct geomagnetic_rotation_vector_data *p_geomagnetic_rotation_vector_data =
					(struct geomagnetic_rotation_vector_data *)buf;
			printf("get_single returns, geomagnetic rotation vector is (%d, %d,"
				" %d, %d)\n", p_geomagnetic_rotation_vector_data->x,
				p_geomagnetic_rotation_vector_data->y,
				p_geomagnetic_rotation_vector_data->z,
				p_geomagnetic_rotation_vector_data->w);
		} else if (strncmp(sensor_name, "GRAVI", SNR_NAME_MAX_LEN) == 0) {
			struct gravity_data *p_gravity_data =
					(struct gravity_data *)buf;
			printf("get_single returns, gravity is (%d, %d, %d)\n",
				p_gravity_data->x, p_gravity_data->y,
				p_gravity_data->z);
		} else if (strncmp(sensor_name, "LACCL", SNR_NAME_MAX_LEN) == 0) {
			struct linear_accel_data *p_linear_accel_data =
					(struct linear_accel_data *)buf;
			printf("get_single returns, linear acceleration is "
				"(%d, %d, %d)\n", p_linear_accel_data->x,
				p_linear_accel_data->y,
				p_linear_accel_data->z);
		} else if (strncmp(sensor_name, "ORIEN", SNR_NAME_MAX_LEN) == 0) {
			struct orientation_data *p_orientation_data =
					(struct orientation_data *)buf;
			printf("get_single returns, orientation is "
				"(%d, %d, %d)\n", p_orientation_data->azimuth,
				p_orientation_data->pitch,
				p_orientation_data->roll);
		} else if (strncmp(sensor_name, "MAGHD", SNR_NAME_MAX_LEN) == 0) {
			struct mag_heading_data *p_mag_heading_data =
					(struct mag_heading_data *)buf;
			printf("get_single returns, magnetic north heading is "
				"%d\n", p_mag_heading_data->heading);
		} else if (strncmp(sensor_name, "BIST", SNR_NAME_MAX_LEN) == 0) {
			int i;
			struct bist_data *p_bist_data =
					(struct bist_data *)buf;
			for (i = 0; i < PHY_SENSOR_MAX_NUM; i ++) {
				printf("get_single returns, bist_result[%d] is %d \n", i, p_bist_data->result[i]);
			}
		}
	} else if (cmd_type == 1) {

		if (strncmp(sensor_name, "LPE_P", SNR_NAME_MAX_LEN) != 0) {
			for (i = 0; i < prop_count; ++i) {
				printf("%d, %d\n", prop_ids[i], prop_vals[i]);
				ret = psh_set_property(handle, prop_ids[i], &prop_vals[i]);
				if (ret != ERROR_NONE) {
					printf("psh_set_property fail for %dth property with code %d\n", i, ret);
					return -1;
				}
			}
		}

		if (strncmp(sensor_name, "PEDOM", SNR_NAME_MAX_LEN) == 0 || strncmp(sensor_name, "SCOUN", SNR_NAME_MAX_LEN) == 0 || strncmp(sensor_name, "SDET", SNR_NAME_MAX_LEN) == 0)
			ret = psh_start_streaming_with_flag(handle, data_rate, buffer_delay, 2);
		else if (strncmp(sensor_name, "PS_P", SNR_NAME_MAX_LEN) == 0)
			ret = psh_start_streaming_with_flag(handle, data_rate, buffer_delay, 1);
		else
			ret = psh_start_streaming(handle, data_rate, buffer_delay);

		if (ret != ERROR_NONE) {
			printf("psh_start_streaming() failed with code %d \n",
									ret);
			return -1;
		}

		if (strncmp(sensor_name, "LPE_P", SNR_NAME_MAX_LEN) == 0) {
			for (i = 0; i < prop_count; ++i) {
				printf("%d, %d\n", prop_ids[i], prop_vals[i]);
				ret = psh_set_property(handle, prop_ids[i], &prop_vals[i]);
				if (ret != ERROR_NONE) {
					printf("psh_set_property fail for %dth property with code %d\n", i, ret);
					return -1;
				}
			}
		}

		fd = psh_get_fd(handle);

		if (strncmp(sensor_name, "ACCEL", SNR_NAME_MAX_LEN) == 0)
			dump_accel_data(fd);
		else if (strncmp(sensor_name, "GYRO", SNR_NAME_MAX_LEN) == 0)
			dump_gyro_data(fd);
		else if (strncmp(sensor_name, "COMPS", SNR_NAME_MAX_LEN) == 0)
			dump_comp_data(fd);
		else if (strncmp(sensor_name, "BARO", SNR_NAME_MAX_LEN) == 0)
			dump_baro_data(fd);
		else if (strncmp(sensor_name, "ALS_P", SNR_NAME_MAX_LEN) == 0)
			dump_als_data(fd);
		else if (strncmp(sensor_name, "PS_P", SNR_NAME_MAX_LEN) == 0)
			dump_proximity_data(fd);
		else if (strncmp(sensor_name, "TERMC", SNR_NAME_MAX_LEN) == 0)
			dump_tc_data(fd);
		else if (strncmp(sensor_name, "LPE_P", SNR_NAME_MAX_LEN) == 0)
			dump_lpe_data(fd);
		else if (strncmp(sensor_name, "PHYAC", SNR_NAME_MAX_LEN) == 0)
			dump_activity_data(fd);
		else if (strncmp(sensor_name, "GSSPT", SNR_NAME_MAX_LEN) == 0)
			dump_gs_data(fd);
		else if (strncmp(sensor_name, "GSPX", SNR_NAME_MAX_LEN) == 0)
			dump_gesture_hmm_data(fd);
		else if (strncmp(sensor_name, "GSFLK", SNR_NAME_MAX_LEN) == 0)
			dump_gesture_flick_data(fd);
		else if (strncmp(sensor_name, "GSETH", SNR_NAME_MAX_LEN) == 0)
			dump_gesture_eartouch_data(fd);
		else if (strncmp(sensor_name, "RVECT", SNR_NAME_MAX_LEN) == 0)
			dump_rotation_vector_data(fd);
		else if (strncmp(sensor_name, "6AGRV", SNR_NAME_MAX_LEN) == 0)
			dump_game_rotation_vector_data(fd);
		else if (strncmp(sensor_name, "6AMRV", SNR_NAME_MAX_LEN) == 0)
			dump_geomagnetic_rotation_vector_data(fd);
		else if (strncmp(sensor_name, "GRAVI", SNR_NAME_MAX_LEN) == 0)
			dump_gravity_data(fd);
		else if (strncmp(sensor_name, "LACCL", SNR_NAME_MAX_LEN) == 0)
			dump_linear_accel_data(fd);
		else if (strncmp(sensor_name, "ORIEN", SNR_NAME_MAX_LEN) == 0)
			dump_orientation_data(fd);
		else if (strncmp(sensor_name, "9DOF", SNR_NAME_MAX_LEN) == 0)
			dump_9dof_data(fd);
		else if (strncmp(sensor_name, "6DOFG", SNR_NAME_MAX_LEN) == 0)
			dump_6dofag_data(fd);
		else if (strncmp(sensor_name, "6DOFM", SNR_NAME_MAX_LEN) == 0)
			dump_6dofam_data(fd);
		else if (strncmp(sensor_name, "PEDOM", SNR_NAME_MAX_LEN) == 0)
			dump_pedometer_data(fd);
		else if (strncmp(sensor_name, "MAGHD", SNR_NAME_MAX_LEN) == 0)
			dump_mag_heading_data(fd);
		else if (strncmp(sensor_name, "SHAKI", SNR_NAME_MAX_LEN) == 0)
			dump_shaking_data(fd);
		else if (strncmp(sensor_name, "MOVDT", SNR_NAME_MAX_LEN) == 0)
			dump_md_data(fd);
		else if (strncmp(sensor_name, "STAP", SNR_NAME_MAX_LEN) == 0)
			dump_stap_data(fd);
		else if (strncmp(sensor_name, "PTZ", SNR_NAME_MAX_LEN) == 0)
			dump_ptz_data(fd);
		else if (strncmp(sensor_name, "LTVTL", SNR_NAME_MAX_LEN) == 0)
			dump_lv_data(fd);
		else if (strncmp(sensor_name, "DVPOS", SNR_NAME_MAX_LEN) == 0)
			dump_device_position_data(fd);
		else if (strncmp(sensor_name, "SCOUN", SNR_NAME_MAX_LEN) == 0)
			dump_stepcounter_data(fd);
		else if (strncmp(sensor_name, "SDET", SNR_NAME_MAX_LEN) == 0)
			dump_stepdetector_data(fd);
		else if (strncmp(sensor_name, "SIGMT", SNR_NAME_MAX_LEN) == 0)
			dump_significantmotion_data(fd);
		else if (strncmp(sensor_name, "LIFLK", SNR_NAME_MAX_LEN) == 0)
			dump_lift_look_data(fd);
		else if (strncmp(sensor_name, "DTWGS", SNR_NAME_MAX_LEN) == 0)
			dump_dtwgs_data(fd);
	}
//	sleep(200);

	psh_stop_streaming(handle);

	psh_close_session(handle);

	return 0;
}
int main(int argc, char **argv)
{
	handle_t handle;
	error_t ret;
	char buf[512];
	struct sub_event sub_evt[6]; /* For event number limit test. */
	int evt_num, i;
	char rel;
	short event_id;
	int fd;

	if (argc != 2){
		printf ("Usage: event_notification parameter\n");
		printf ("\t [Note, only one parameter(a big string)]\n");
		return 0;
	}

	evt_num = parse_subevt(argv[1], sub_evt, sizeof(sub_evt), &rel);

	if (evt_num <= 0){
		printf ("Failed ot parse parameter:%s\n", argv[1]);
		return -1;
	}

#undef LOG_TAG
#define LOG_TAG "event_notification_test"
	LOGD("event notification test started \n");

	handle = psh_open_session(SENSOR_EVENT);

	if (handle == NULL) {
		printf("psh_open_session() returned NULL handle. \n");
		return -1;
	}

	psh_event_set_relation(handle, rel);

	for (i = 0; i < evt_num; ++i)
	{
		error_t t = psh_event_append(handle, sub_evt + i);
		if (t != ERROR_NONE){
			printf ("----- error:%d\n", t);
			return -1;
		}
	}

	ret = psh_add_event(handle);

	if (ret != ERROR_NONE) {
		printf("ret of psh_add_event() is %d \n", ret);
		return -1;
	}

	event_id = psh_get_event_id(handle);
	fd = psh_get_fd(handle);
	printf("event id is %d, fd is %d \n", event_id, fd);

	dump_event_data(fd, event_id);

	psh_clear_event(handle);

//	sleep(200);

	psh_close_session(handle);

	return 0;
}