FragmentTopInfo.kt 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. package com.cr.pages
  2. import android.graphics.drawable.Drawable
  3. import android.os.Bundle
  4. import android.view.LayoutInflater
  5. import android.view.View
  6. import android.view.ViewGroup
  7. import android.widget.ImageView
  8. import android.widget.TextView
  9. import androidx.fragment.app.Fragment
  10. import androidx.fragment.app.activityViewModels
  11. import androidx.lifecycle.LifecycleOwner
  12. import com.cr.cruav.CrApplication
  13. import com.cr.cruav.R
  14. import com.cr.data.CrUtil
  15. import com.cr.data.DEFAULT_STR
  16. import com.cr.data.Level
  17. import com.cr.viewmodel.*
  18. import dji.v5.utils.common.ContextUtil
  19. import kotlinx.android.synthetic.main.frag_top_info.*
  20. /**
  21. * 操作系统:MAC系统
  22. * 创建者:王成
  23. * 创建日期:2023/3/8 15:52
  24. * 描述:大疆顶部信息视图
  25. */
  26. open class FragmentTopInfo : CrFragment() {
  27. // define: 2023/3/9 APP注册信息
  28. private val msdkRegisterVm: CrMSDKRegisterVM by activityViewModels()
  29. // define: 2023/3/9 MSDK版本信息
  30. private val msdkInfoVm: CrMSDKInfoVM by activityViewModels()
  31. // define: 2023/3/9 遥控器信息
  32. private val remoteControlVm: CrRemoteControlVM by activityViewModels()
  33. // define: 2023/3/9 飞行器信息
  34. private val flightControlVm: CrFlightControlVM by activityViewModels()
  35. // define: 2023/3/14 链路信息
  36. private val linkVm: CrLinkVM by activityViewModels()
  37. // define: 2023/3/9 遥控器电量标志符号
  38. private var remoteControlBatteryIcon: MutableMap<Level, Drawable?> = mutableMapOf(
  39. Level.LEVEL1 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_rem1),
  40. Level.LEVEL2 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_rem2),
  41. Level.LEVEL3 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_rem3),
  42. Level.LEVEL4 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_rem4),
  43. )
  44. // define: 2023/3/9 飞行器电池电量标志符号
  45. private var flightControlBatteryIcon: MutableMap<Level, Drawable?> = mutableMapOf(
  46. Level.LEVEL1 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_air1),
  47. Level.LEVEL2 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_air2),
  48. Level.LEVEL3 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_air3),
  49. Level.LEVEL4 to ContextUtil.getContext().getDrawable(R.drawable.dji_battery_air4),
  50. )
  51. // define: 2023/3/14 链路质量标志
  52. private var linkSignalQualityIcon:MutableMap<Level,Drawable?> = mutableMapOf(
  53. Level.LEVEL1 to ContextUtil.getContext().getDrawable(R.drawable.dji_link_symbol1),
  54. Level.LEVEL2 to ContextUtil.getContext().getDrawable(R.drawable.dji_link_symbol3),
  55. Level.LEVEL3 to ContextUtil.getContext().getDrawable(R.drawable.dji_link_symbol4),
  56. Level.LEVEL4 to ContextUtil.getContext().getDrawable(R.drawable.dji_link_symbol6),
  57. )
  58. // todo: 2023/8/17 定义控件
  59. private var lblSDKVersion:TextView?=null // define: 2023/9/14 SDK版本信息
  60. private var lblGPSCount:TextView?= null // define: 2023/9/14 GPS卫星数量
  61. private var lblRCConnection:TextView?=null // define: 2023/9/14 遥控器连接状态
  62. private var lblProductName:TextView?=null // define: 2023/9/14 连接产品名称
  63. private var lblIMUState:TextView?=null // define: 2023/9/14 IMU状态
  64. private var lblLongitude:TextView?=null // define: 2023/9/14 当前经度
  65. private var lblLatitude:TextView?=null // define: 2023/9/14 当前纬度
  66. private var lblSignal:TextView?= null // define: 2023/9/14 信号质量
  67. private var imgSignal:ImageView?=null // define: 2023/9/14 信号质量图
  68. private var lblRCBattery:TextView?=null // define: 2023/9/14 遥控器电池电量
  69. private var imgRCBattery:ImageView?=null // define: 2023/9/14 遥控器电池电量图
  70. private var lblFCBattery:TextView?=null // define: 2023/9/14 飞行器电池电量
  71. private var imgFCBattery:ImageView?=null // define: 2023/9/14 飞行器电池电量符号
  72. private var lblCompassState:TextView?=null // define: 2023/9/14 指南针状态
  73. /**
  74. * 覆写创建视图方法
  75. * @param inflater LayoutInflater
  76. * @param container ViewGroup?
  77. * @param savedInstanceState Bundle?
  78. * @return View?
  79. */
  80. override fun onCreateView(
  81. inflater: LayoutInflater,
  82. container: ViewGroup?,
  83. savedInstanceState: Bundle?
  84. ): View? {
  85. self = this
  86. mainView = inflater.inflate(R.layout.frag_top_info, container, false)
  87. // todo: 2023/8/17 挂载控件
  88. joinControls()
  89. // todo: 2023/8/17 订阅
  90. initObserver()
  91. return mainView
  92. }
  93. /**
  94. * 关联控件
  95. */
  96. override fun joinControls() {
  97. mainView?.let {
  98. lblSDKVersion = it.findViewById(R.id.dji_sdk_version)
  99. lblGPSCount = it.findViewById(R.id.dji_gps_count)
  100. lblIMUState = it.findViewById(R.id.dji_imu_state)
  101. lblRCConnection = it.findViewById(R.id.dji_rc_connection)
  102. lblProductName = it.findViewById(R.id.dji_product_connection)
  103. lblLongitude = it.findViewById(R.id.dji_gps_longitude)
  104. lblLatitude = it.findViewById(R.id.dji_gps_latitude)
  105. lblSignal = it.findViewById(R.id.dji_link_value)
  106. imgSignal = it.findViewById(R.id.dji_link_symbol)
  107. lblRCBattery = it.findViewById(R.id.dji_rc_battery_value)
  108. imgRCBattery = it.findViewById(R.id.dji_rc_battery_symbol)
  109. lblFCBattery = it.findViewById(R.id.dji_battery_value)
  110. imgFCBattery = it.findViewById(R.id.dji_battery_symbol)
  111. lblCompassState = it.findViewById(R.id.dji_compass)
  112. }
  113. }
  114. /**
  115. * 覆写视图创建完成方法
  116. * @param view View
  117. * @param savedInstanceState Bundle?
  118. */
  119. override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
  120. super.onViewCreated(view, savedInstanceState)
  121. }
  122. /**
  123. * 由后台转前台显示
  124. */
  125. override fun onResume() {
  126. super.onResume()
  127. }
  128. /**
  129. * 初始化订阅
  130. */
  131. private fun initObserver() {
  132. // todo: 2023/3/9 订阅App注册信息
  133. msdkRegisterVm.registerInfo.observe(viewLifecycleOwner) {
  134. lblSDKVersion?.text = it.registerInfo
  135. }
  136. // todo: 2023/3/9 订阅MSDK版本信息
  137. msdkInfoVm.msdkInfo.observe(viewLifecycleOwner) {
  138. if (msdkRegisterVm.registerInfo.value?.isRegister == true) {
  139. lblSDKVersion?.text = it.SDKVersion
  140. }
  141. }
  142. // todo: 2023/8/17 订阅遥控器
  143. observerRemoteControl()
  144. // todo: 2023/8/17 订阅飞行器
  145. observerFlightControl()
  146. // todo: 2023/8/17 订阅链路
  147. observerLink()
  148. }
  149. /**
  150. * 订阅遥控器信息
  151. */
  152. private fun observerRemoteControl() {
  153. // todo: 2023/3/9 订阅遥控器信息
  154. remoteControlVm.remoteControlInfo.observe(viewLifecycleOwner) {
  155. it?.let {
  156. if (msdkRegisterVm.registerInfo.value?.isRegister == true) {
  157. lblRCConnection?.text = it.connectionInfo
  158. if(it.batteryPercent>0){
  159. lblRCBattery?.text =
  160. resources.getString(R.string.value_battery_percent, it.batteryPercent)
  161. }else{
  162. lblRCBattery?.text = DEFAULT_STR
  163. }
  164. imgRCBattery?.setImageDrawable(
  165. remoteControlBatteryIcon[CrUtil.getLevel(
  166. it.batteryPercent
  167. )]
  168. )
  169. }
  170. }
  171. }
  172. }
  173. /**
  174. * 订阅飞行器信息
  175. */
  176. private fun observerFlightControl() {
  177. flightControlVm.flightControlInfo.observe(viewLifecycleOwner) {
  178. it?.let {
  179. if (msdkRegisterVm.registerInfo.value?.isRegister == true) {
  180. lblProductName?.text = it.productName
  181. if (it.batteryPercent > 0) {
  182. lblFCBattery?.text =
  183. resources.getString(R.string.value_battery_percent, it.batteryPercent)
  184. } else {
  185. lblFCBattery?.text = DEFAULT_STR
  186. }
  187. imgFCBattery?.setImageDrawable(flightControlBatteryIcon[CrUtil.getLevel(it.batteryPercent)])
  188. lblGPSCount?.text = it.gpsCount
  189. lblIMUState?.text = it.imuState
  190. lblCompassState?.text = it.compassState
  191. // todo: 2023/8/15 更新经纬度
  192. lblLongitude?.text = it.longitudeStr
  193. lblLatitude?.text = it.latitudeStr
  194. if(!it.isConnection){
  195. linkVm.reset()
  196. }
  197. }
  198. }
  199. }
  200. }
  201. /**
  202. * 订阅链路
  203. */
  204. private fun observerLink(){
  205. linkVm.linkInfo.observe(viewLifecycleOwner){
  206. if (msdkRegisterVm.registerInfo.value?.isRegister == true) {
  207. it?.let {
  208. imgSignal?.setImageDrawable(linkSignalQualityIcon[CrUtil.getLinkSignalQuality(it.signalQuality)])
  209. lblSignal?.text = it.frequencyBand
  210. }
  211. }
  212. }
  213. }
  214. }