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; }
/* * 处理主要游戏逻辑的逻辑服务器进程 */ 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) { }