FragmentSimulator.kt 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  1. package com.cr.pages
  2. import android.graphics.Color
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.Button
  8. import android.widget.TextView
  9. import com.cr.cruav.R
  10. import com.cr.data.CrUtil
  11. import com.cr.data.DEFAULT_STR
  12. import com.cr.widget.CrEditTextWidget
  13. import dji.sdk.keyvalue.value.common.LocationCoordinate2D
  14. import dji.v5.common.callback.CommonCallbacks
  15. import dji.v5.common.error.IDJIError
  16. import dji.v5.manager.aircraft.simulator.InitializationSettings
  17. import dji.v5.manager.aircraft.simulator.SimulatorManager
  18. import dji.v5.manager.aircraft.simulator.SimulatorState
  19. import dji.v5.manager.aircraft.simulator.SimulatorStatusListener
  20. /**
  21. * 操作系统:MAC系统
  22. * 创建者:王成
  23. * 创建日期:2023/8/15 10:10
  24. * 描述:大疆模拟器页面
  25. */
  26. class FragmentSimulator:CrNavigationFragment(), View.OnClickListener {
  27. private var txtLongitude:CrEditTextWidget?=null // define: 2023/8/15 初始经度
  28. private var txtLatitude:CrEditTextWidget?= null // define: 2023/8/15 初始纬度
  29. private var btnStart: Button?= null // define: 2023/8/15 启动模拟器
  30. private var btnEnd:Button?= null // define: 2023/8/15 关闭模拟器
  31. private var txtInfo:TextView?=null // define: 2023/8/15 展示信息
  32. /**
  33. * 初始化
  34. * @param inflater LayoutInflater
  35. * @param container ViewGroup?
  36. * @param savedInstanceState Bundle?
  37. * @return View?
  38. */
  39. override fun onCreateView(
  40. inflater: LayoutInflater,
  41. container: ViewGroup?,
  42. savedInstanceState: Bundle?
  43. ): View? {
  44. self = this
  45. mainView = inflater.inflate(R.layout.frag_dji_simulator,null)
  46. // todo: 2023/8/15 挂载控件
  47. joinControls()
  48. return mainView
  49. }
  50. /**
  51. * 覆写挂载控件方法
  52. */
  53. override fun joinControls() {
  54. // todo: 2023/8/15 挂载控件
  55. mainView?.let {
  56. txtLongitude = it.findViewById(R.id.txt_longitude)
  57. txtLatitude = it.findViewById(R.id.txt_latitude)
  58. txtInfo = it.findViewById(R.id.txt_info)
  59. // todo: 2023/8/15 更新信息
  60. updateInfo(null)
  61. btnStart = it.findViewById(R.id.btn_start)
  62. btnEnd = it.findViewById(R.id.btn_end)
  63. // todo: 2023/8/15 挂载监听
  64. btnStart?.setOnClickListener(this)
  65. btnEnd?.setOnClickListener(this)
  66. }
  67. }
  68. /**
  69. * 覆写初始化页面
  70. */
  71. override fun initPage() {
  72. txtLongitude?.setContent("118.714")
  73. txtLatitude?.setContent("35.226")
  74. }
  75. /**
  76. * 根据状态更新信息
  77. * @param state SimulatorState
  78. */
  79. private fun updateInfo(state:SimulatorState?){
  80. var stringBuilder = StringBuilder()
  81. if(state != null){
  82. stringBuilder.append(String.format("电机是否运转:%s",if(state.areMotorsOn()) "是" else "否")).append("\r\n")
  83. stringBuilder.append(String.format("是否飞行:%s",if(state.isFlying) "是" else "否")).append("\r\n")
  84. stringBuilder.append(String.format("俯仰角:%.2f度",state.pitch)).append("\r\n")
  85. stringBuilder.append(String.format("翻滚角:%.2f度",state.roll)).append("\r\n")
  86. stringBuilder.append(String.format("方向角:%.2f度",state.yaw)).append("\r\n")
  87. stringBuilder.append(String.format("经度:%.6f",state.location.longitude)).append("\r\n")
  88. stringBuilder.append(String.format("纬度:%.6f",state.location.latitude)).append("\r\n")
  89. txtInfo?.setTextColor(Color.YELLOW)
  90. }else{
  91. stringBuilder.append(String.format("电机是否运转:%s", DEFAULT_STR)).append("\r\n")
  92. stringBuilder.append(String.format("是否飞行:%s", DEFAULT_STR)).append("\r\n")
  93. stringBuilder.append(String.format("俯仰角:%.2f度",0f)).append("\r\n")
  94. stringBuilder.append(String.format("翻滚角:%.2f度",0f)).append("\r\n")
  95. stringBuilder.append(String.format("方向角:%.2f度",0f)).append("\r\n")
  96. stringBuilder.append(String.format("经度:%.6f",0f)).append("\r\n")
  97. stringBuilder.append(String.format("纬度:%.6f",0f)).append("\r\n")
  98. txtInfo?.setTextColor(Color.WHITE)
  99. }
  100. txtInfo?.text = stringBuilder.toString()
  101. }
  102. /**
  103. * 生命周期
  104. * 销毁
  105. */
  106. override fun onDestroy() {
  107. CrUtil.print("模拟器 页面销毁")
  108. super.onDestroy()
  109. // todo: 2023/8/15 移除监听
  110. SimulatorManager.getInstance().removeSimulatorStateListener(simulatorListener)
  111. SimulatorManager.getInstance().clearAllSimulatorStateListener()
  112. }
  113. /**
  114. * 生命周期
  115. * 后台到前台
  116. */
  117. override fun onResume() {
  118. super.onResume()
  119. // todo: 2023/8/15 添加监听
  120. SimulatorManager.getInstance().addSimulatorStateListener(simulatorListener)
  121. // todo: 2023/8/15 初始化页面
  122. initPage()
  123. CrUtil.print("模拟器 页面进前台")
  124. }
  125. /**
  126. * 生命周期
  127. * 后台运行
  128. */
  129. override fun onStop() {
  130. super.onStop()
  131. // todo: 2023/8/15 移除监听
  132. SimulatorManager.getInstance().removeSimulatorStateListener(simulatorListener)
  133. SimulatorManager.getInstance().clearAllSimulatorStateListener()
  134. CrUtil.print("模拟器 页面进入后台")
  135. }
  136. /**
  137. * 视图点击事件监听
  138. * @param view View
  139. */
  140. override fun onClick(view: View?) {
  141. when(view?.id){
  142. R.id.btn_start->{
  143. // todo: 2023/8/15 启动模拟器
  144. if(SimulatorManager.getInstance().isSimulatorEnabled){
  145. showToast("模拟飞行已启动")
  146. }else{
  147. var longitude = txtLongitude?.getContent()?.toDouble()?:0.0
  148. var latitude = txtLatitude?.getContent()?.toDouble()?:0.0
  149. var location = LocationCoordinate2D(latitude,longitude)
  150. var settings = InitializationSettings.createInstance(location,10)
  151. SimulatorManager.getInstance().enableSimulator(settings,object:CommonCallbacks.CompletionCallback{
  152. // todo: 2023/8/15 成功
  153. override fun onSuccess() {
  154. showToast("模拟飞行启动")
  155. }
  156. // todo: 2023/8/15 失败
  157. override fun onFailure(error: IDJIError) {
  158. CrUtil.print(error.toString())
  159. showError("模拟飞行启动失败:${error.description()}")
  160. }
  161. })
  162. }
  163. }
  164. R.id.btn_end->{
  165. // todo: 2023/8/15 关闭模拟器
  166. if(!SimulatorManager.getInstance().isSimulatorEnabled){
  167. showWarning("模拟飞行尚未开启")
  168. }else{
  169. SimulatorManager.getInstance().disableSimulator(object:CommonCallbacks.CompletionCallback{
  170. // todo: 2023/8/15 成功
  171. override fun onSuccess() {
  172. showToast("模拟飞行停止")
  173. updateInfo(null)
  174. }
  175. // todo: 2023/8/15 失败
  176. override fun onFailure(error: IDJIError) {
  177. showError("模拟飞行停止失败:${error.description()}")
  178. }
  179. })
  180. }
  181. }
  182. }
  183. }
  184. /**
  185. * 模拟器状态 监听
  186. */
  187. private val simulatorListener =
  188. SimulatorStatusListener { state -> updateInfo(state) }
  189. }