int init(){
    open_bus();
    unsigned char whoami=0;
    i2c_read(MPU6050_ADDR, MPU6050_WHO_AM_I, 1, &whoami);
    if(!silent_flag) {
        printf("WHO_AM_I: %x\n", whoami);
    }
    struct int_param_s int_param;
    if(!silent_flag) {
        printf("MPU init: %i\n", mpu_init(&int_param));
        printf("MPU sensor init: %i\n", mpu_set_sensors(INV_XYZ_GYRO | INV_XYZ_ACCEL));
        printf("MPU configure fifo: %i\n", mpu_configure_fifo(INV_XYZ_GYRO | INV_XYZ_ACCEL));
        printf("DMP firmware: %i\n ",dmp_load_motion_driver_firmware());
        printf("DMP orientation: %i\n ",dmp_set_orientation(
            inv_orientation_matrix_to_scalar(gyro_orientation)));
    }
    unsigned short dmp_features = DMP_FEATURE_6X_LP_QUAT | DMP_FEATURE_TAP | DMP_FEATURE_SEND_RAW_ACCEL | DMP_FEATURE_SEND_CAL_GYRO | DMP_FEATURE_GYRO_CAL;
    if(!silent_flag) {
        printf("DMP feature enable: %i\n", dmp_enable_feature(dmp_features));
        printf("DMP set fifo rate: %i\n", dmp_set_fifo_rate(DEFAULT_MPU_HZ));
        printf("DMP enable %i\n", mpu_set_dmp_state(1));
    }
    if(!no_interrupt_flag) {
        mpu_set_int_level(1); // Interrupt is low when firing
        dmp_set_interrupt_mode(DMP_INT_CONTINUOUS); // Fire interrupt on new FIFO value
	}
    return 0;
}
Exemple #2
0
/*
 * 处理主要游戏逻辑的逻辑服务器进程
 */
int main(int argc , char **argv){
	sspackage_t sspackage;
	char arg_segs[ARG_SEG_COUNT][ARG_CONTENT_LEN];	/*参数内容*/
	online_players_t *ponline_players;	/*保存在线玩家信息的结构,共享内存*/
	runtime_env_t *pruntime_env;	/*游戏运行时环境*/
	int index;
	u64 ticks = 0;	/*计时滴答*/

	struct sigaction sig_act;	/*信号动作*/
	int iret;
	int icount;
	int i;

	module_commond_t module_commond;
	void *handle = NULL;	/*动态加载模块句柄*/



	/*检测参数*/
	if(argc < 2){
		write_log(LOG_ERR , "logic_server:argc < 2 , please input more information worldid.lineid.xxxx , like:1.1.xxxx");
		return -1;
	}

	/*解析参数字符串*/
	icount = strsplit(argv[1] , '.' , arg_segs , ARG_SEG_COUNT , ARG_CONTENT_LEN);
	if(icount < 2){
		write_log(LOG_ERR , "logic_server:illegal argument 1:%s , exit!" , argv[1]);
		return -1;
	}
	world_id = atoi(arg_segs[0]);	/*世界ID*/
	line_id = atoi(arg_segs[1]);	/*线ID*/

	if(world_id<=0 || world_id>MAX_WORLD_COUNT || line_id<=0 || line_id>MAX_LINE_COUNT){	/*ID不能小于0或超出最大*/
		write_log(LOG_ERR , "logic_server:illegal argument1:%s , exit!" , argv[1]);
		return -1;
	}

#ifdef DEBUG
	printf("world_id:%d , line_id:%d\n" , world_id , line_id);
#endif
	connect_server_id = GEN_WORLDID(world_id) | GEN_LINEID(line_id) | FLAG_SERV | GAME_CONNECT_SERVER;
	logic_server_id = GEN_WORLDID(world_id) | GEN_LINEID(line_id) | FLAG_SERV | GAME_LOGIC_SERVER;
	log_server_id = GEN_WORLDID(world_id) | GEN_LINEID(line_id) | FLAG_SERV | GAME_LOG_SERVER;

	/*注册信号*/
	memset(&sig_act , 0 , sizeof(sig_act));
	sig_act.sa_handler = handle_signal;
	sigaction(SIGINT , &sig_act , NULL);
	sigaction(SIGUSR1 , &sig_act , NULL);
	ctrl_msg = 0;

	/***链接BUS*/
	iret = open_bus(connect_server_id , logic_server_id);
	if(iret < 0){
		write_log(LOG_ERR , "logic_server:open bus connect <-> logic failed!");
		return -1;
	}

	/***获得游戏运行时环境*/
	pruntime_env = (runtime_env_t *)attach_shm_res(GAME_RT_ENV , world_id , line_id);
	if(!pruntime_env){
		write_log(LOG_ERR , "logic_server:attach runtime env failed!");
		return -1;
	}else{
		write_log(LOG_INFO , "logic_server:attach runtime env %x success!" , pruntime_env->basic.global_id);
	}
	//设置相关信息
	index = index_last_1bit(GAME_LOGIC_SERVER);
	pruntime_env->basic.proc_info[index].global_id = logic_server_id;
	pruntime_env->basic.proc_info[index].pid = getpid();
//	printf("proc_t:%x vs pid:%d\n" , pruntime_env->basic.proc_info[index].global_id , pruntime_env->basic.proc_info[index].pid);

	/***链接在线玩家共享内存*/
	ponline_players = (online_players_t *)attach_shm_res(GAME_ONLINE_PLAYERS , world_id , line_id);
	if(!ponline_players){
		return -1;
	}else{
		write_log(LOG_INFO , "logic_server:attach online_players %x success!" , ponline_players->global_id);
	}

	/***加载模块*/
	iret = load_modules(MODULE_TYPE_CS , -1 , cs_module_starts , CS_PROTO_MODULE_COUNT);
	if(iret < 0)
	{
		return -1;
	}
//	cs_module1_start(CS , 1 , NULL);
//	cs_module2_start(1 , 1 , NULL);
//	cs_module3_start(1 , 1 , NULL);

	module_commond.type = MODULE_COMMOND_RELOAD;
	module_commond.data.pmodule_dir_path = "../XXMODULE/";

	for(i=0; i<CS_PROTO_MODULE_COUNT; i++)
	{
		cs_module_starts[i](MODULE_TYPE_CS , NULL , &module_commond);
	}


	/***start success*/
	write_log(LOG_INFO , "start logic_server %s success!" , argv[1]);

	/***主循环*/
	while(1){
		ticks++;	/*循环一次加一次*/

		/***读包*/
		do{
			iret = get_bus_pkg(logic_server_id , connect_server_id , &sspackage);

			if(iret == -1){	/*读包出错*/
				write_log(LOG_ERR , "logic server: recv bus failed!");
				break;
			}
			if(iret == -2){	/*BUS为空*/
				break;
			}

			/*BUS有货*/
			switch(sspackage.sshead.package_type){
			case SS_FROM_CLIENT:
				handle_req_client(&sspackage);
				break;
			default:
				break;
			}
		}while(0);

		/***其他的定时处理机制*/
		//检测是否存在控制信息
		if(ticks % 5 == 0 && ctrl_msg){
			handle_ctrl_msg(pruntime_env);
		}

	}	/*end while*/

	return 0;
}
i2c_helper::i2c_helper( unsigned bus_id )
    :fd_(open_bus(bus_id))
    ,address_(-1)
{ }