浏览代码

预加热

ccc 4 周之前
父节点
当前提交
a3f9ae934f

+ 2 - 2
buildSrc/src/main/kotlin/com/quyunshuo/sbm10/buildsrc/ProjectBuildConfig.kt

@@ -11,8 +11,8 @@ object ProjectBuildConfig {
     const val applicationId = "com.quyunshuo.sbm10"
     const val minSdkVersion = 21
     const val targetSdkVersion = 29
-    const val versionCode = 12
-    const val versionName = "1.0.12"
+    const val versionCode = 13
+    const val versionName = "1.0.13"
     const val isAppMode = false
     /**
      * 项目当前的版本状态

+ 2 - 2
lib_common/src/main/java/com/quyunshuo/sbm10/common/constant/MMKVName.kt

@@ -227,8 +227,8 @@ abstract class MMKVName {
             //默认值
             get() {
                 val myHashMap = hashMapOf(
-                    "sweet" to "2000",
-                    "salty" to "2000",
+                    "sweet" to "3000",
+                    "salty" to "3000",
                     "box" to "80",
                 )
                 val gson = Gson()

+ 1 - 1
module_backstage/src/main/java/com/module/backstage/chart/BarChartManager.kt

@@ -307,7 +307,7 @@ class BarChartManager(private val mBarChart: BarChart) {
         leftAxis.axisLineColor =
             ContextCompat.getColor(BaseApplication.context, R.color.system_text)
         //        设置Y轴的最小值和最大值
-        leftAxis.axisMaximum = 2190f
+        leftAxis.axisMaximum = 3290f
         leftAxis.axisMinimum = 0f
         mBarChart.data = data
     }

+ 23 - 8
module_backstage/src/main/java/com/module/backstage/fragment/material/MaterialFragment.kt

@@ -80,9 +80,9 @@ class MaterialFragment : BaseFragment<BackstageFragmentMaterialBinding, Material
         btnSaltyAdd.setOnClickListener(this@MaterialFragment)
         btnSweetAdd.setOnClickListener(this@MaterialFragment)
         btnBoxAdd.setOnClickListener(this@MaterialFragment)
-        etSweetValue.setText(sweet.toString())
-        etSaltyValue.setText(salty.toString())
-        etBoxValue.setText(box.toString())
+        etSweetValue.setText("1000")
+        etSaltyValue.setText("1000")
+        etBoxValue.setText("10")
         tvBoxValue.text = box.toString() + UiUtil.getStringRes(R.string.material_box_amount)
         tvSweet.text = UiUtil.getStringRes(R.string.sweet_corn)+": "
         tvSalty.text = UiUtil.getStringRes(R.string.salty_corn)+": "
@@ -101,11 +101,11 @@ class MaterialFragment : BaseFragment<BackstageFragmentMaterialBinding, Material
     override fun onClick(v: View?) {
         when (v?.id) {
             R.id.btn_sweet -> {
-                sweet = 2000
+                sweet = 3000
             }
 
             R.id.btn_salty -> {
-                salty = 2000
+                salty = 3000
             }
 
             R.id.btn_box -> {
@@ -114,19 +114,34 @@ class MaterialFragment : BaseFragment<BackstageFragmentMaterialBinding, Material
 
             R.id.btn_sweet_add -> {
                 if (etsweetvalue.text.toString().isNotEmpty()){
-                    sweet = etsweetvalue.text.toString().toInt()
+                    sweet += etsweetvalue.text.toString().toInt()
+                    if (sweet>3000){
+                        sweet=3000
+                    }else if (sweet<0){
+                        sweet=0
+                    }
                 }
             }
 
             R.id.btn_salty_add -> {
                 if (etsaltyvalue.text.toString().isNotEmpty()) {
-                    salty = etsaltyvalue.text.toString().toInt()
+                    salty += etsaltyvalue.text.toString().toInt()
+                    if (salty>3000){
+                        salty=3000
+                    }else if (salty<0){
+                        salty=0
+                    }
                 }
             }
 
             R.id.btn_box_add -> {
                 if (etboxvalue.text.toString().isNotEmpty()) {
-                    box = etboxvalue.text.toString().toInt()
+                    box += etboxvalue.text.toString().toInt()
+                    if (box>80){
+                        box=80
+                    }else if (box<0){
+                        box=0
+                    }
                 }
             }
 

+ 45 - 8
module_backstage/src/main/java/com/module/backstage/fragment/product/DebugProductFragment.kt

@@ -65,7 +65,7 @@ class DebugProductFragment :
                 GridLayoutManager(
                     this@DebugProductFragment.context,
                     2,
-                    androidx.recyclerview.widget.GridLayoutManager.VERTICAL,
+                    GridLayoutManager.VERTICAL,
                     false
                 )
             layoutManager = gridLayoutManager
@@ -130,7 +130,7 @@ class DebugProductFragment :
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun event(messageEvent: VBoxMessage) {
-        XLogUtil.d(messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
+//        XLogUtil.d(messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
         Log.d(TAG, messageEvent.cmd + "制作页面 :messageEvent.data:" + messageEvent.data)
         val getSign = messageEvent.data.substring(2, 4)
         when (getSign) {
@@ -175,10 +175,10 @@ class DebugProductFragment :
     fun startMake(value: Int) {
         if (value == 0) {
             productData= "00FC0200"//甜味爆米花
-            Heartbeat.productMaking="E02"
+            Heartbeat.productMaking="E01"
         } else {
             productData= "00FC0100"//咸味爆米花
-            Heartbeat.productMaking="E01"
+            Heartbeat.productMaking="E02"
         }
         stopSendMake()
         isActiveM1 = true
@@ -198,10 +198,10 @@ class DebugProductFragment :
     }
 
     private var tipsDialog: TipsDialog? = null//条件不足提示对话框
-
     private fun checkToBuy(): Boolean {
-        if (deviceState != "02") {
-            showTipsDialog(deviceState)
+        val state= deviceStatusCheck()
+        if (state != "02") {
+            showTipsDialog(state)
             return true
         }
         val boxValue = materialHashMap["box"].toString().toInt()
@@ -212,6 +212,44 @@ class DebugProductFragment :
         return false
     }
 
+    fun deviceStatusCheck(): String {
+        if (deviceState=="") {
+            //没有和plc通讯上
+            return UiUtil.getStringRes(R.string.home_tips_dialog_1)
+        }
+//
+//        if (Heartbeat.managerId ==""){
+//            //没有连接服务器
+//            return UiUtil.getStringRes(R.string.home_tips_dialog_6)
+//        }
+        if (deviceState == "00") {
+            //整机初次上电。
+            return UiUtil.getStringRes(R.string.home_tips_dialog_2)
+        }
+        if (deviceState == "01") {
+            //机器复位中。
+            return UiUtil.getStringRes(R.string.home_tips_dialog_4)
+        }
+        if (deviceState == "02") {
+            //机器开机完毕
+            return "02"
+        }
+        if (deviceState == "03") {
+            //机器报警了。
+            return UiUtil.getStringRes(R.string.home_tips_dialog_3)
+        }
+        if (deviceState == "04") {
+            //机器制作中
+            return UiUtil.getStringRes(R.string.home_tips_dialog_5)
+        }
+        if (deviceState == "10") {
+            //未取出
+            return UiUtil.getStringRes(R.string.home_make_success_tips)
+        }
+
+        return ""
+    }
+
     private fun showTipsDialog(content: String) {
         if (tipsDialog == null) {
             tipsDialog = this@DebugProductFragment.context?.let { TipsDialog(it) }
@@ -223,7 +261,6 @@ class DebugProductFragment :
                     tipsDialog?.type1 -> {
                         tipsDialog?.dismiss()
                     }
-
                     else -> {}
                 }
             }

+ 3 - 3
module_backstage/src/main/res/layout/backstage_fragment_material.xml

@@ -39,7 +39,7 @@
                 android:layout_marginEnd="30dp"
                 android:layout_weight="1"
                 android:selectAllOnFocus="true"
-                android:inputType="number"
+                android:inputType="numberSigned"
                 android:textSize="60sp"
                 android:textStyle="bold" />
 
@@ -80,7 +80,7 @@
                 android:layout_marginStart="10dp"
                 android:layout_weight="1"
                 android:selectAllOnFocus="true"
-                android:inputType="number"
+                android:inputType="numberSigned"
                 android:layout_marginEnd="30dp"
                 android:textSize="60sp"
                 android:textStyle="bold" />
@@ -122,7 +122,7 @@
                 android:layout_marginStart="10dp"
                 android:layout_weight="1"
                 android:layout_marginEnd="30dp"
-                android:inputType="number"
+                android:inputType="numberSigned"
                 android:selectAllOnFocus="true"
                 android:textSize="60sp"
                 android:textStyle="bold" />

+ 20 - 1
module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/HomeFragment.kt

@@ -8,6 +8,7 @@ import android.os.Handler
 import android.telephony.SignalStrength
 import android.text.format.DateFormat
 import android.util.Log
+import android.view.LayoutInflater
 import android.view.MotionEvent
 import android.view.View
 import android.view.ViewGroup
@@ -28,6 +29,7 @@ import com.quyunshuo.sbm10.base.DialogClickListener
 import com.hboxs.serialport.plc.message.Message
 import com.hboxs.serialport.sbc.SBCHeartbeat
 import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.module.pay.nayax.CreditCardPresenter
 import com.quyunshuo.module.home.R
 import com.quyunshuo.module.home.adapter.HomeProductAdapter
@@ -366,15 +368,32 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
         mViewModel.getArticleData()
     }
 
+    override fun onCreateView(
+        inflater: LayoutInflater,
+        container: ViewGroup?,
+        savedInstanceState: Bundle?
+    ): View? {
+        Log.d(TAG, "viewonCreateView: ")
+        return super.onCreateView(inflater, container, savedInstanceState)
+    }
+
+    override fun onStop() {
+        Log.d(TAG, "viewonStop: ")
+        super.onStop()
+    }
 
     override fun onDestroyView() {
-        Log.d(TAG, "onDestroyView: ")
+        Log.d(TAG, "viewonDestroyView: ")
         mBinding.homeRvProduct.adapter = null //为什么要手动呢?。。。。。
         NetWorkUtils.unRegisterNetWork(activity)
         PhoneStateUtils.unRegisterPhoneStateListener(activity)
         super.onDestroyView()
     }
 
+    override fun onDetach() {
+        Log.d(TAG, "viewonDetach: ")
+        super.onDetach()
+    }
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun event(messageEvent: Message) {
         when (messageEvent.type) {

+ 41 - 20
module_home/src/main/java/com/quyunshuo/module/home/fragment/vm/HomeFragmentVM.kt

@@ -25,6 +25,7 @@ import com.quyunshuo.sbm10.common.util.XLogUtil
 import com.quyunshuo.module.home.R
 import com.quyunshuo.module.home.fragment.repo.HomeFragmentRepo
 import com.quyunshuo.module.home.interfaces.IShoppingTrolley
+import com.quyunshuo.sbm10.base.bean.Global
 import dagger.hilt.android.lifecycle.HiltViewModel
 import javax.inject.Inject
 
@@ -129,46 +130,65 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
     private fun D170(results: ArrayList<String>) {
         _D170Value.value = getRealData(results, 0)
     }
+
     fun disposeData(messageEvent: VBoxMessage) {
-        XLogUtil.d(messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
-        when (messageEvent.cmd) {
-            VboxCommand.CMD_HEARTBEAT -> {
+        Log.d(TAG, "disposeData: " + messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
+        when (messageEvent.data.substring(2, 4)) {
+//            VboxCommand.CMD_HEARTBEAT -> {
+            "01" -> {
                 if (messageEvent.data.substring(2, 4) == "01") {
                     val deviceState = messageEvent.data.substring(0, 2)//机器状态码
                     when (deviceState) {
                         "00" -> {//刚上电
                             Log.d(TAG, "startUp: 开机中2。")
-                            _D2Value.value="00"
+                            _D2Value.value = "00"
                         }
+
                         "01" -> {//开机中
-                            _D2Value.value="01"
+                            _D2Value.value = "01"
                         }
+
                         "02" -> {//就绪待机,可以选购或制作下一杯
-                            _D2Value.value="02"
+                            _D2Value.value = "02"
+                            Log.d(TAG, "disposeData: 02")
                         }
+
                         "03" -> {//报警中
-                            _D2Value.value="03"
+                            _D2Value.value = "03"
                             Log.d(TAG, "startUp: 开机中4。")
                         }
+
                         "04" -> {//开始制作
-                            _D2Value.value="03"
+                            _D2Value.value = "03"
                         }
+
                         "05" -> {//下玉米完毕
-                            _D2Value.value="04"
+                            _D2Value.value = "04"
                         }
+
                         "07" -> {//玉米爆开
-                            _D2Value.value="07"
+                            _D2Value.value = "07"
                         }
+
                         "10" -> {//制作完成
-                            _D2Value.value="10"
+                            _D2Value.value = "10"
                         }
+
                         else -> {//通讯失败
-                            _D2Value.value="11"
+                            _D2Value.value = "11"
                         }
                     }
-                    val coin=messageEvent.data.substring(80,84)
-                    Log.d(TAG, "测试硬币: "+coin)
-                    _coinValue.value= coin.toLong(16).toString()
+                    val coin = messageEvent.data.substring(80, 84)
+                    Log.d(TAG, "测试硬币: " + coin)
+                    _coinValue.value = coin.toLong(16).toString()
+                }
+            }
+            "03" ->{
+                val data = messageEvent.data.substring(84,86)
+                Log.d(TAG, "调试按钮cmdHeartbeat: "+data)
+                if (data == "05"){
+                    threadHomeParam.isActivePreheatOpen=false
+                    Log.d(TAG, "disposeData: isActivePreheatOpen=false")
                 }
             }
             else -> {}
@@ -194,7 +214,7 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
     }
 
     fun deviceStatusCheck(): String {
-        if (D2Value.value==null) {
+        if (D2Value.value == null) {
             //没有和plc通讯上
             return UiUtil.getStringRes(R.string.home_tips_dialog_1)
         }
@@ -233,7 +253,8 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
 
     override fun shoppingTrolleyAdd(productDataBean: ProductDataBean) {
         //添加到购物车的时候,先看看以前有没有。如果有,是数量+1
-        var existingItem: ShoppingCartBean? = shoppingCartList.find { it.nameChinese == productDataBean.nameChinese }
+        var existingItem: ShoppingCartBean? =
+            shoppingCartList.find { it.nameChinese == productDataBean.nameChinese }
         if (existingItem != null) {
             // 如果已存在,更新数量
             existingItem.count += 1
@@ -273,7 +294,7 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
     override fun shoppingTrolleySumPrice(): Double {
         var sumPrice = 0.0
         shoppingCartList.forEach {
-            sumPrice += it.price* it.count
+            sumPrice += it.price * it.count
         }
         _shoppingCarSumPrice.value = sumPrice
         return sumPrice
@@ -282,7 +303,7 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
     override fun shoppingTrolleySumCount(): Int {
         var count = 0
         shoppingCartList.forEach {
-            count+=  it.count
+            count += it.count
         }
         _shoppingCarSize.value = count
         return count
@@ -297,7 +318,7 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
     }
 
     override fun shoppingTrolleyUpdateCount(count: Int, position: Int) {
-        shoppingCartList[position].count  =count
+        shoppingCartList[position].count = count
         shoppingTrolleySumCount()
         shoppingTrolleySumPrice()
     }

+ 47 - 16
module_home/src/main/java/com/quyunshuo/module/home/service/GlobalServiceViewModel.kt

@@ -13,11 +13,13 @@ import com.hboxs.serialport.plc.util.HexUtils
 import com.hboxs.serialport.plc.util.HexadecimalUtil
 import com.hboxs.serialport.sbc.SBCHeartbeat
 import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.hboxs.serialport.sbc.thread.ThreadGlobalParam
 import com.hjq.http.EasyHttp
 import com.hjq.http.listener.OnDownloadListener
 import com.hjq.http.model.HttpMethod
 import com.quyunshuo.sbm10.base.BaseApplication.Companion.context
+import com.quyunshuo.sbm10.base.bean.Global
 import com.quyunshuo.sbm10.base.utils.SpUtils
 import com.quyunshuo.sbm10.common.bean.DataItem
 import com.quyunshuo.sbm10.common.bean.LocalAlarmClockBean
@@ -59,6 +61,7 @@ class GlobalServiceViewModel @Inject constructor(
     // 报警类型。
     private val _alarmType = MutableLiveData<String>()
     val alarmType: LiveData<String> get() = _alarmType
+
     //强制返回App的携程
     fun getVideoRule() {
         if (Heartbeat.managerId == "") {
@@ -85,7 +88,7 @@ class GlobalServiceViewModel @Inject constructor(
         //存储广告规则 ,用于前台播放。
         SpUtils.putString(MMKVName.PLAY_RULE, gson.toJson(list))
         //1. 根据id 获取广告信息。
-        Log.d(TAG, "getVideoInfo: "+list)
+        Log.d(TAG, "getVideoInfo: " + list)
         downVideos.clear()
         getvideo()
         //2. 获取的信息,通过一个map进行存储。
@@ -243,7 +246,7 @@ class GlobalServiceViewModel @Inject constructor(
             "AlarmClock2onNext alarmNumber:$alarmNumber;setAlarmClock: $number"
         )
         for (i in number until alarmNumber) { //清除所有的闹钟
-            AlarmManagerUtil.cancelAlarm(context,AlarmManagerUtil.ALARM_ACTION, i)
+            AlarmManagerUtil.cancelAlarm(context, AlarmManagerUtil.ALARM_ACTION, i)
             Log.d(
                 TAG,
                 "AlarmClock2onNext alarmNumber:$alarmNumber;setAlarmClock: $i"
@@ -377,16 +380,30 @@ class GlobalServiceViewModel @Inject constructor(
         threadGlobalParam.startHeartbeat()
     }
 
+    fun startPreheatOff() {
+        threadGlobalParam.startPreheatOff()
+    }
+
     fun disposeData(messageEvent: VBoxMessage) {
-        XLogUtil.d(messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
+        Log.d(TAG, messageEvent.cmd + ":messageEvent.data:" + messageEvent.data)
+        if (messageEvent.cmd == VboxCommand.CMD_IO) {
+            if (messageEvent.data=="PreheatOff"){
+                startPreheatOff()
+            }
+        }
         val getSign = messageEvent.data.substring(2, 4)
         when (getSign) {
             "00" -> {
                 cmdInit(messageEvent)
             }
+
             "01" -> {
                 cmdHeartbeat(messageEvent)
             }
+
+            "03" -> {
+                cmdIO(messageEvent)
+            }
 //            VboxCommand.CMD_BACK_DATA -> {
 //                cmdBackData(messageEvent)
 //                threadGlobalParam.stopBackData()
@@ -396,7 +413,7 @@ class GlobalServiceViewModel @Inject constructor(
     }
 
 
-    private var calculateMaterial=false
+    private var calculateMaterial = false
     lateinit var materialHashMap: HashMap<String, String>
     private var sweet = 0
     private var salty = 0
@@ -404,7 +421,8 @@ class GlobalServiceViewModel @Inject constructor(
 
     private fun setMaterialValue() {
         val materialValue = SpUtils.getString(MMKVName.MATERIAL_VALUE, MMKVName.MATERIAL_HASHMAP)!!
-        materialHashMap =  Gson().fromJson(materialValue, object : TypeToken<HashMap<String, String>>() {}.type)
+        materialHashMap =
+            Gson().fromJson(materialValue, object : TypeToken<HashMap<String, String>>() {}.type)
         val sweetStr = materialHashMap["sweet"]
         sweet = sweetStr?.toInt()!!
         val saltyStr = materialHashMap["salty"]
@@ -414,6 +432,19 @@ class GlobalServiceViewModel @Inject constructor(
     }
 
     /**
+     * 处理 单片机 按钮IO数据
+     */
+    private fun cmdIO(messageEvent: VBoxMessage) {
+        val data = messageEvent.data.substring(84, 86)
+        Log.d(TAG, "调试按钮cmdHeartbeat: " + data)
+        if (data.equals("05")) {
+            threadGlobalParam.isActivePreheatOff=false
+            threadGlobalParam.stopPreheatOff()
+            Log.d(TAG, "stop:startPreheatOff")
+        }
+    }
+
+    /**
      * 处理 单片机 心跳数据
      */
     private fun cmdHeartbeat(messageEvent: VBoxMessage) {
@@ -426,24 +457,24 @@ class GlobalServiceViewModel @Inject constructor(
         }
 
         //这里用于全局计算物料剩余
-        if (SpUtils.getBoolean(MMKVName.MATERIAL,true)==true) {
+        if (SpUtils.getBoolean(MMKVName.MATERIAL, true) == true) {
             setMaterialValue()
             if (SBCHeartbeat.devCode == "04" && Heartbeat.productMaking != "") {
                 if (!calculateMaterial) {
-                    if (Heartbeat.productMaking == "E02") {
+                    if (Heartbeat.productMaking == "E01") {
                         sweet -= 40
-                    } else if (Heartbeat.productMaking == "E01") {
+                    } else if (Heartbeat.productMaking == "E02") {
                         salty -= 40
                     }
                     box -= 1
-                    if (sweet<0){
-                        sweet=0
+                    if (sweet < 0) {
+                        sweet = 0
                     }
-                    if (salty<0){
-                        salty=0
+                    if (salty < 0) {
+                        salty = 0
                     }
-                    if (box<0){
-                        box=0
+                    if (box < 0) {
+                        box = 0
                     }
                     val map = hashMapOf(
                         "sweet" to sweet.toString(),
@@ -452,7 +483,7 @@ class GlobalServiceViewModel @Inject constructor(
                     )
                     SpUtils.putString(MMKVName.MATERIAL_VALUE, Gson().toJson(map))
                     calculateMaterial = true
-                    Heartbeat.productMaking=""//清空当前制作的商品标记
+                    Heartbeat.productMaking = ""//清空当前制作的商品标记
                 }
             } else {
                 calculateMaterial = false
@@ -508,7 +539,7 @@ class GlobalServiceViewModel @Inject constructor(
             SBCHeartbeat.devCode = messageEvent.data.substring(0, 2)
             //是否保存设备数据了。
             SBCHeartbeat.saveDevData = messageEvent.data.substring(2, 4)
-            if (SBCHeartbeat.saveDevData.equals("00")){
+            if (SBCHeartbeat.saveDevData.equals("00")) {
                 _initIsSuccess.value = true
             }
             //机箱版本号

+ 37 - 2
serialport-api/src/main/java/com/hboxs/serialport/plc/thread/ThreadHomeParam.kt

@@ -9,16 +9,19 @@ import com.hboxs.serialport.plc.frame.ReadCommandFrame
 import com.hboxs.serialport.plc.frame.RstCommandFrame
 import com.hboxs.serialport.plc.frame.SetCommandFrame
 import com.hboxs.serialport.plc.frame.WriteCommandFrame
+import com.hboxs.serialport.sbc.VBoxMessage
 import com.hboxs.serialport.sbc.VboxSerialPortManager
 import com.hboxs.serialport.sbc.VboxSerialPortSendQueue
 import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.hboxs.serialport.sbc.frame.VboxWriteCommand
 import com.quyunshuo.sbm10.base.addressenum.PlcHomeAddressEnum
+import com.quyunshuo.sbm10.base.bean.Global
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
+import org.greenrobot.eventbus.EventBus
 
 class ThreadHomeParam : LifecycleObserver {
 
@@ -53,8 +56,40 @@ class ThreadHomeParam : LifecycleObserver {
         set(value) {
             field = value
         }
+    //预加热启动
+    var jobPreheat: Job? = null
+        get() = field
+    var isActivePreheatOpen: Boolean = true
+        get() = field
+        set(value) {
+            field = value
+        }
+
 
     @OnLifecycleEvent(Lifecycle.Event.ON_START)
+    fun startPreheat(){
+        stopPreheat()
+        isActivePreheatOpen=true
+        // 启动协程
+        jobPreheat = CoroutineScope(Dispatchers.Main).launch {
+            while (isActivePreheatOpen) {
+                    Log.d(TAG, "startPreheat: isActivePreheatOpen=true")
+                    VboxSerialPortSendQueue.getInstance()
+                        .sendCommand(VboxWriteCommand(VboxCommand.CMD_IO,
+                            VboxCommand.DEBUG_ID+"0501"))
+                delay(5000) // 每隔5秒重复执行
+            }
+        }
+    }
+
+    fun stopPreheat() {
+        jobPreheat?.cancel()
+    }
+
+    fun starPreheatOff(){
+        EventBus.getDefault().post(VBoxMessage(VboxCommand.CMD_IO,"PreheatOff"))
+    }
+
     fun startSetD170() {
         stopSetD170()
         // 启动协程
@@ -165,7 +200,7 @@ class ThreadHomeParam : LifecycleObserver {
         stopSetD91()
         stopSetD170()
         stopSetM1()
+        stopPreheat()
+        starPreheatOff()
     }
-
-
 }