#include "TjdUiAppMSGamePresenter.h" #include "NativeAbility.h" #include "TjdUiAppIds.h" #include "TjdUiAppMSGameModel.h" #include "TjdUiAppMSGameView.h" #include "TjdUiSettingCenter.h" #include "dock/input_device.h" #include "graphic_service.h" #include "sys_config.h" #include "TjdUiRegisterManager.h" #include "bts_br_gap.h" #define ENABLE_PRINT_INFO 1 #if ENABLE_PRINT_INFO #define static_print_info(...) sys_ui_log_i(__VA_ARGS__) // 一般信息打印宏控制 #define static_print_warn(...) sys_ui_log_w(__VA_ARGS__) // 警告信息打印一般常开 #define static_print_error(...) sys_ui_log_e(__VA_ARGS__) // 错误信息打印一般常开 #define static_print_debug(...) sys_ui_log_d(__VA_ARGS__) // 调试信息打印一般常开 #else #define static_print_info(...) #define static_print_warn(...) #define static_print_error(...) #define static_print_debug(...) #endif namespace TJD { TJD_REGIST_NATIVE_MENU(TJD_APP_VIEW_MS_GAME, TjdUiAppMSGameView, TjdUiAppMSGamePresenter, IMG_MENU_LIST_MENU_SOMATOSENSORY, STR_ID_31); static TjdUiAppMSGamePresenter *g_msGamePresenter = nullptr; TjdUiAppMSGamePresenter::TjdUiAppMSGamePresenter() { g_msGamePresenter = this; } TjdUiAppMSGamePresenter::~TjdUiAppMSGamePresenter() { g_msGamePresenter = nullptr; } TjdUiAppMSGamePresenter *TjdUiAppMSGamePresenter::GetInstance(void) { return g_msGamePresenter; } #define MAXFLOWLIMIT 10240 #define MINFLOWLIMIT 3072 #define INTERVAL 1024 static void ms_game_task(void *argument) { float acc[3] = {0}; game_data_struct output; TjdUiAppMSGameModel &model = TjdUiAppMSGameModel::GetInstance(); errcode_t ret = gap_bt_set_flow_limit(MINFLOWLIMIT); static_print_info("star flow_limit:%d", ret); while (1) { lis2doc_read_data_polling_fun(); GsensorData &data = model.GetGsensorData(); acc[0] = (data.x/4096.0)*0.98; acc[1] = (data.y/4096.0)*0.98; acc[2] = (data.z/4096.0)*0.98; IMU_10M_DataHandle(NULL,acc,&output,0.8); // static_print_info("Primitive x:%d, y:%d, z:%d", data.x, data.y, data.z); // static_print_info("transform x:%f, y:%f, z:%f", acc[0], acc[1], acc[2]); // static_print_info("X_Move_Distance:%d, Y_Move_Distance:%d, Speed_Throw:%d", output.X_Move_Distance, output.Y_Move_Distance, output.Speed_Throw); model.UploadGsensorData(output); osDelay(50); } } void TjdUiAppMSGamePresenter::OnStart() { TjdUiCommonOnKeyListener::GetInstance()->SetOnKeyActListener(this, KeyModelType::APP_KEY_TYPE); TjdUiAppMSGameModel &model = TjdUiAppMSGameModel::GetInstance(); TjdUiAppMSGameView *msGmaeView = TjdUiAppMSGameView::GetInstance(); if (msGmaeView == nullptr) { return; } bool isConnect = TjdUiSettingCenter::GetInstance().IsConnectApp(); if (isConnect == false) { msGmaeView->ShowView(MSGameViewIndex::MS_GAME_DISCONNECT); return; } msGmaeView->ShowView(MSGameViewIndex::MS_GAME_MAIN); osThreadAttr_t task_attr = {"mg_game_task", 0, NULL, 0, NULL, 0xF00, (osPriority_t)17, 0, 0}; task_attr.stack_mem = memalign(16, task_attr.stack_size); // add ms_game_task_id = osThreadNew(ms_game_task, NULL, &task_attr); if (ms_game_task_id == NULL) { static_print_error("create ms_game task failed"); return; } model.EnterMsGameEvent(); } void TjdUiAppMSGamePresenter::OnStop() { TjdUiCommonOnKeyListener::GetInstance()->ClearOnKeyActListener(KeyModelType::APP_KEY_TYPE); TjdUiAppMSGameModel &model = TjdUiAppMSGameModel::GetInstance(); errcode_t ret = gap_bt_set_flow_limit(MAXFLOWLIMIT); static_print_info("end flow_limit:%d", ret); osThreadTerminate(ms_game_task_id); model.ExitMsGameEvent(); } bool TjdUiAppMSGamePresenter::OnKeyAct(OHOS::UIView &view, const OHOS::KeyEvent &event) { if(!TjdUiCommonOnKeyListener::CheckIsExitEvent(event)) { return true; } ViewExitEvent(false); return false; } static bool DataIsChanged(GsensorData &data) { // TODO: 某个轴的数据大于某个阈值时,上传数据 static GsensorData lastData = {0}; const int16_t threshold = 100; if (abs(data.x - lastData.x) > threshold || abs(data.y - lastData.y) > threshold || abs(data.z - lastData.z) > threshold) { lastData = data; return true; } return false; } void TjdUiAppMSGamePresenter::ViewExitEvent(bool isSwipe) { TjdUiAppMSGameView *gameView = TjdUiAppMSGameView::GetInstance(); if (gameView == nullptr) { return; } switch (TjdUiAppMSGameView::currentViewIndex_) { case MSGameViewIndex::MS_GAME_MAIN: case MSGameViewIndex::MS_GAME_DISCONNECT: OHOS::NativeAbility::GetInstance().ChangePreSlice(); break; default: break; } } } // namespace TJD