DeviceCalibrateView.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using UnityEngine.UI;
  6. /* 设备校准界面,公用(设备界面的校准、校准教程) */
  7. public class DeviceCalibrateView : MonoBehaviour, MenuBackInterface
  8. {
  9. [SerializeField] Button btnGyrCalibrate;
  10. [SerializeField] Text progressGyrCalibrate;
  11. [SerializeField] Text progressMagCalibrate;
  12. [SerializeField] GameObject prefab_MagInterferenceTipView;
  13. [SerializeField] GameObject magReset; //地磁校准按钮
  14. [SerializeField] GameObject magTipOk;
  15. [SerializeField] GameObject magTipOk2;
  16. [SerializeField] Button btnBack;
  17. [SerializeField] Button btnNext;
  18. [SerializeField] Button btnFinish;
  19. public Action action_OnDestroy;
  20. public DeviceCalibrateItem deviceCalibrateItem = DeviceCalibrateItem.Guide;
  21. DeviceCalibrateItem[] deviceCalibrateItemForGuide = {
  22. DeviceCalibrateItem.Gyr,
  23. DeviceCalibrateItem.Mag
  24. };
  25. int guideIndex = 0;
  26. public bool guide = true;
  27. public static DeviceCalibrateView ins;
  28. public static void Create(DeviceCalibrateItem itemType = DeviceCalibrateItem.Guide) {
  29. GameObject o = GameObject.Instantiate(Resources.Load<GameObject>("Prefabs/Views/DeviceCalibrateView"));
  30. o.GetComponent<DeviceCalibrateView>().deviceCalibrateItem = itemType;
  31. o.GetComponent<DeviceCalibrateView>().guide = itemType == DeviceCalibrateItem.Guide;
  32. }
  33. void Awake() {
  34. ins = this;
  35. try {
  36. GlobalEventCenter.ins.onDeviceCalibrateViewAwakeChanged?.Invoke(true);
  37. } catch (System.Exception e) { Debug.LogError(e.Message); }
  38. RenderModuleCamera.Load();
  39. }
  40. void Start()
  41. {
  42. btnGyrCalibrate.GetComponent<Button>().onClick.AddListener(ClickGyrCalibrate);
  43. magReset.GetComponent<Button>().onClick.AddListener(ClickResetMag);
  44. btnBack.GetComponent<Button>().onClick.AddListener(delegate() {
  45. guideIndex--;
  46. RefreshPage();
  47. });
  48. btnNext.GetComponent<Button>().onClick.AddListener(delegate() {
  49. guideIndex++;
  50. RefreshPage();
  51. });
  52. btnFinish.GetComponent<Button>().onClick.AddListener(delegate() {
  53. Destroy(this.gameObject);
  54. if (guide && guideIndex == deviceCalibrateItemForGuide.Length - 1) {
  55. GameMgr.ins.FinishDeviceCalibrateGuide();
  56. }
  57. });
  58. if (guide) { //看看哪项没校准,就引导校准
  59. List<DeviceCalibrateItem> guideList = new List<DeviceCalibrateItem>();
  60. //九轴的需要校准引导,判断是否初始化陀螺仪和地磁计
  61. //RomaSDK不处理
  62. if (!CommonConfig.UseRomaSdk && AimHandler.ins.bRuning9Axis() )
  63. {
  64. if (!AimHandler.ins.IsGyrCompleted())
  65. {
  66. guideList.Add(DeviceCalibrateItem.Gyr);
  67. }
  68. if (!AimHandler.ins.IsMagCompleted())
  69. {
  70. guideList.Add(DeviceCalibrateItem.Mag);
  71. }
  72. }
  73. deviceCalibrateItemForGuide = guideList.ToArray();
  74. if (deviceCalibrateItemForGuide.Length == 0) {
  75. guideIndex = -1;
  76. btnFinish.GetComponent<Button>().onClick.Invoke();
  77. return;
  78. }
  79. }
  80. RefreshPage();
  81. if (!guide) {
  82. PersistenHandler.ins?.menuBackCtr.views.Add(this);
  83. }
  84. }
  85. void OnDestroy()
  86. {
  87. if (ins == this) ins = null;
  88. PersistenHandler.ins?.menuBackCtr.views.Remove(this);
  89. try {
  90. GlobalEventCenter.ins.onDeviceCalibrateViewAwakeChanged?.Invoke(false);
  91. } catch (System.Exception e) { Debug.LogError(e.Message); }
  92. RenderModuleCamera.Unload();
  93. action_OnDestroy?.Invoke();
  94. }
  95. public bool OnMenuBack() {
  96. var is_interactable = btnFinish.interactable;
  97. if (is_interactable) Destroy(gameObject);
  98. return is_interactable;
  99. }
  100. void Update()
  101. {
  102. UpdateForGyr();
  103. UpdateForMag();
  104. }
  105. // HashSet<object> magerDebugSet = new HashSet<object>();
  106. // void OnGUI()
  107. // {
  108. // if (!AimHandler.ins) return;
  109. // GUIStyle labelFont = new GUIStyle();
  110. // labelFont.normal.textColor = new Color(1, 0.6f, 0.6f);
  111. // labelFont.fontSize = 40;
  112. // var m = ((Axis9Handler)AimHandler.ins.m_axisHandler)._9Axis.Attitude.MagCalibrater;
  113. // if (!magerDebugSet.Contains(m)) magerDebugSet.Add(m);
  114. // int mid = magerDebugSet.Count;
  115. // string str = $"地磁计ID:{mid}\nComplete:{m.Complete}\nVariance:{m.Variance}\nEllipsoidFitting==null?:{m.EllipsoidFitting==null}";
  116. // GUI.Label(new Rect(Screen.width/20,Screen.height/20,0,0), str, labelFont);
  117. // }
  118. void RefreshPage() {
  119. if (guide) {
  120. deviceCalibrateItem = deviceCalibrateItemForGuide[guideIndex];
  121. if (deviceCalibrateItemForGuide.Length == 1) {
  122. btnBack.gameObject.SetActive(false);
  123. btnNext.gameObject.SetActive(false);
  124. btnFinish.gameObject.SetActive(true);
  125. } else {
  126. if (guideIndex == 0) {
  127. btnBack.gameObject.SetActive(false);
  128. btnNext.gameObject.SetActive(true);
  129. btnFinish.gameObject.SetActive(false);
  130. } else if (guideIndex == deviceCalibrateItemForGuide.Length - 1) {
  131. btnBack.gameObject.SetActive(true);
  132. btnNext.gameObject.SetActive(false);
  133. btnFinish.gameObject.SetActive(true);
  134. } else {
  135. btnBack.gameObject.SetActive(true);
  136. btnNext.gameObject.SetActive(true);
  137. btnFinish.gameObject.SetActive(false);
  138. }
  139. }
  140. } else {
  141. btnBack.gameObject.SetActive(false);
  142. btnNext.gameObject.SetActive(false);
  143. btnFinish.gameObject.SetActive(true);
  144. }
  145. this.transform.Find("Gyr").gameObject.SetActive(deviceCalibrateItem == DeviceCalibrateItem.Gyr);
  146. this.transform.Find("Mag").gameObject.SetActive(deviceCalibrateItem == DeviceCalibrateItem.Mag);
  147. RefreshResetMagBtn();
  148. RefreshGyrBtn();
  149. if (deviceCalibrateItem == DeviceCalibrateItem.Gyr)
  150. RenderModuleCamera.ins?.SetMode(0);
  151. else
  152. RenderModuleCamera.ins?.SetMode(1);
  153. }
  154. /* ------ 新地磁计校准(2022-10-3) ------ */
  155. [NonSerialized] public bool calibrateMagDoing = false;
  156. float calibrateMagStartTime = 0; //地磁校准开始时刻
  157. void RefreshResetMagBtn()
  158. {
  159. if (calibrateMagDoing) {
  160. magReset.GetComponentInChildren<Text>().color = Color.red;
  161. magReset.GetComponentInChildren<TextAutoLanguage>().SetText(121);
  162. return;
  163. }
  164. Color outColor;
  165. ColorUtility.TryParseHtmlString("#005AB6", out outColor);
  166. magReset.GetComponentInChildren<Text>().color = outColor;
  167. if (AimHandler.ins.IsMagCompleted()) {
  168. magReset.GetComponentInChildren<TextAutoLanguage>().SetText(116);
  169. } else {
  170. magReset.GetComponentInChildren<TextAutoLanguage>().SetText(85);
  171. }
  172. }
  173. //在当前页面中,用户是否点击了开始校准并校准成功;有则flag=1
  174. [NonSerialized] public int flag_MagCalibarateOperateAndFinish = -1;
  175. public Action action_MagCalibarateOperateAndFinish;
  176. public Func<bool> action_OnClickMagCalibrateInterceptor;
  177. void ClickResetMag()
  178. {
  179. if (action_OnClickMagCalibrateInterceptor != null) {
  180. if (action_OnClickMagCalibrateInterceptor.Invoke()) return;
  181. }
  182. if (!calibrateMagDoing && BluetoothAim.ins.status != BluetoothStatusEnum.ConnectSuccess) {
  183. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
  184. return;
  185. }
  186. calibrateMagDoing = !calibrateMagDoing;
  187. if (calibrateMagDoing) {
  188. calibrateMagStartTime = Time.realtimeSinceStartup;
  189. AimHandler.ins.ResetMag();
  190. flag_MagCalibarateOperateAndFinish = 0;
  191. } else {
  192. Axis9CalibrateRecord.ResumeCalibrateRecord(LoginMgr.myUserInfo.mac);
  193. Axis9CalibrateRecord.SetCalibrateOkRecord(LoginMgr.myUserInfo.mac, false);
  194. }
  195. interactableAllSkipBtns(!calibrateMagDoing);
  196. RefreshResetMagBtn();
  197. }
  198. //取消地磁计校准(仅用在UpdateForMag中)
  199. void CancelResetMag() {
  200. calibrateMagDoing = false;
  201. interactableAllSkipBtns(!calibrateMagDoing);
  202. RefreshResetMagBtn();
  203. }
  204. void UpdateForMag() {
  205. if (deviceCalibrateItem == DeviceCalibrateItem.Mag) {
  206. if (!AimHandler.ins.IsMagCompleted()) {
  207. progressMagCalibrate.gameObject.SetActive(true);
  208. magTipOk.SetActive(false);
  209. magTipOk2.SetActive(false);
  210. //地磁校准超时提示
  211. if (calibrateMagDoing) {
  212. float doingTime = Time.realtimeSinceStartup - calibrateMagStartTime;
  213. float progress = Mathf.FloorToInt(doingTime / 20 * 100);
  214. if (progress >= 100) {
  215. CancelResetMag();
  216. //地磁干扰提示页面-start
  217. GameObject o = Instantiate(prefab_MagInterferenceTipView);
  218. var nug = FindObjectOfType<NewUserGuider>(); //判断是否处于引导界面
  219. if (nug && nug.gameObject && nug.gameObject.activeSelf) {
  220. JCUnityLib.CanvasUtils.PlusSortOrder(nug.gameObject, o, 1);
  221. } else {
  222. JCUnityLib.CanvasUtils.PlusSortOrder(gameObject, o, 1);
  223. }
  224. //地磁干扰提示页面-end
  225. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("tip_mag-calibrate_please-leave-interfere"));
  226. } else {
  227. progressMagCalibrate.text = progress + "%";
  228. }
  229. } else {
  230. progressMagCalibrate.text = "0%";
  231. }
  232. } else {
  233. progressMagCalibrate.gameObject.SetActive(false);
  234. magTipOk.SetActive(true);
  235. //bool hasOkRecord = Axis9CalibrateRecord.HasCalibrateOkRecord(LoginMgr.myUserInfo.mac);
  236. //magTipOk.SetActive(hasOkRecord);
  237. //magTipOk2.SetActive(!hasOkRecord);
  238. if (calibrateMagDoing) {
  239. CancelResetMag();
  240. }
  241. if (flag_MagCalibarateOperateAndFinish == 0) {
  242. flag_MagCalibarateOperateAndFinish = 1;
  243. action_MagCalibarateOperateAndFinish?.Invoke();
  244. }
  245. }
  246. }
  247. }
  248. // ------ 陀螺仪校准 ------
  249. //在当前页面中,用户是否点击了开始校准并校准成功;有则flag=1
  250. [NonSerialized] public int flag_GyrCalibarateOperateAndFinish = -1;
  251. public Action action_GyrCalibarateOperateAndFinish;
  252. public Func<bool> action_OnClickGyrCalibrateInterceptor;
  253. [NonSerialized] public bool gyrCalibrating = false;
  254. void ClickGyrCalibrate()
  255. {
  256. if (action_OnClickGyrCalibrateInterceptor != null) {
  257. if (action_OnClickGyrCalibrateInterceptor.Invoke()) return;
  258. }
  259. if (!gyrCalibrating && BluetoothAim.ins.status != BluetoothStatusEnum.ConnectSuccess) {
  260. PopupMgr.ins.ShowTipTop(TextAutoLanguage2.GetTextByKey("device-calibrate_n-connect"));
  261. return;
  262. }
  263. gyrCalibrating = !gyrCalibrating;
  264. interactableAllSkipBtns(!gyrCalibrating);
  265. if (gyrCalibrating) {
  266. AimHandler.ins.gyrCalibrateCompleteCount = 0;
  267. canUpdateGyrCalibrateProgress = true;
  268. flag_GyrCalibarateOperateAndFinish = 0;
  269. } else {
  270. canUpdateGyrCalibrateProgress = false;
  271. }
  272. AimHandler.ins.ResetGyr();
  273. AimHandler.ins.CalibrateGyr(gyrCalibrating);
  274. RefreshGyrBtn();
  275. }
  276. void FinishGyrCalibrate()
  277. {
  278. gyrCalibrating = false;
  279. interactableAllSkipBtns(true);
  280. canUpdateGyrCalibrateProgress = false;
  281. AimHandler.ins.CalibrateGyr(false);
  282. StartCoroutine(AimHandler.ins.SaveGyr());
  283. RefreshGyrBtn();
  284. }
  285. bool canUpdateGyrCalibrateProgress = false;
  286. void UpdateForGyr()
  287. {
  288. if (deviceCalibrateItem != DeviceCalibrateItem.Gyr) return;
  289. if (canUpdateGyrCalibrateProgress) {
  290. int progress = AimHandler.ins.gyrCalibrateCompleteCount * 100 / AimHandler.ins.gyrCalibrateTotalCount;
  291. progressGyrCalibrate.text = progress + "%";
  292. if (progress >= 100) {
  293. FinishGyrCalibrate();
  294. if (flag_GyrCalibarateOperateAndFinish == 0) {
  295. flag_GyrCalibarateOperateAndFinish = 1;
  296. action_GyrCalibarateOperateAndFinish?.Invoke();
  297. }
  298. }
  299. } else {
  300. if (AimHandler.ins.IsGyrCompleted()) progressGyrCalibrate.text = "100%";
  301. else progressGyrCalibrate.text = "0%";
  302. }
  303. }
  304. void RefreshGyrBtn() {
  305. Button btn = btnGyrCalibrate.GetComponent<Button>();
  306. if (guide) {
  307. if (AimHandler.ins.IsGyrCompleted()) {
  308. btn.enabled = false;
  309. btn.GetComponent<Image>().sprite = Resources.Load<Sprite>("Textures/Common/ButtonGray");
  310. btn.GetComponentInChildren<Text>().color = Color.gray;
  311. }
  312. } else {
  313. if (gyrCalibrating) {
  314. btn.GetComponentInChildren<TextAutoLanguage>().SetText(121);
  315. btn.GetComponentInChildren<Text>().color = Color.red;
  316. } else {
  317. btn.GetComponentInChildren<TextAutoLanguage>().SetText(AimHandler.ins.IsGyrCompleted() ? 116 : 85);
  318. Color outColor;
  319. ColorUtility.TryParseHtmlString("#005AB6", out outColor);
  320. btn.GetComponentInChildren<Text>().color = outColor;
  321. }
  322. }
  323. }
  324. //设置所有跳转按钮是否可交互
  325. private void interactableAllSkipBtns(bool value) {
  326. this.btnBack.interactable = value;
  327. this.btnNext.interactable = value;
  328. this.btnFinish.interactable = value;
  329. }
  330. }
  331. public enum DeviceCalibrateItem
  332. {
  333. Guide, Gyr, Mag
  334. }