瀏覽代碼

1:通讯初始化
2:心跳
3:开机
4:调试
5:选购页面UI
6:字体

ccc 5 月之前
父節點
當前提交
e42cc55b9c
共有 46 個文件被更改,包括 668 次插入225 次删除
  1. 2 1
      app/build.gradle
  2. 二進制
      app/src/main/assets/BadeenDisplay-Regular.ttf
  3. 二進制
      app/src/main/assets/Cairo-VariableFont_slnt,wght.ttf
  4. 二進制
      app/src/main/assets/LiuJianMaoCao-Regular.ttf
  5. 二進制
      app/src/main/assets/huayang.ttf
  6. 二進制
      app/src/main/assets/jiangchengyuanti.ttf
  7. 2 0
      buildSrc/src/main/kotlin/com/quyunshuo/androidbaseframemvvm/buildsrc/DependencyConfig.kt
  8. 1 1
      buildSrc/src/main/kotlin/com/quyunshuo/androidbaseframemvvm/buildsrc/SDKKeyConfig.kt
  9. 2 0
      gradle/libs.versions.toml
  10. 1 0
      lib_base/build.gradle
  11. 2 0
      lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/BaseApplication.kt
  12. 20 20
      lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/addressenum/PlcDebugAddressEnum.kt
  13. 8 12
      lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/addressenum/ProTypeEnum.kt
  14. 2 1
      lib_base/src/main/res/values-en/strings.xml
  15. 2 1
      lib_base/src/main/res/values/strings.xml
  16. 4 1
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt
  17. 1 1
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/constant/Heartbeat.kt
  18. 6 1
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/constant/MMKVName.kt
  19. 11 0
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyBean.java
  20. 115 14
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyUtils.java
  21. 17 11
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyboardView.java
  22. 3 3
      lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/util/ProductAbout.kt
  23. 4 4
      module_backstage/src/main/AndroidManifest.xml
  24. 14 2
      module_backstage/src/main/java/com/module/backstage/activity/setting/SettingActivity.kt
  25. 35 1
      module_backstage/src/main/java/com/module/backstage/activity/setting/SettingViewModel.kt
  26. 12 0
      module_backstage/src/main/java/com/module/backstage/fragment/param/GeneralParamFragment.kt
  27. 1 1
      module_backstage/src/main/java/com/module/backstage/repo/DebugParamFragmentRepo.kt
  28. 0 1
      module_backstage/src/main/java/com/module/backstage/vm/DebugParamFragmentVM.kt
  29. 8 7
      module_backstage/src/main/res/layout/backstage_activity_setting.xml
  30. 4 4
      module_home/src/main/AndroidManifest.xml
  31. 4 1
      module_home/src/main/java/com/quyunshuo/module/home/adapter/HomeProductAdapter.kt
  32. 27 16
      module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/HomeFragment.kt
  33. 64 5
      module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/MakeFragment.kt
  34. 3 1
      module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/UserLoginFragment.kt
  35. 1 0
      module_home/src/main/java/com/quyunshuo/module/home/fragment/vm/HomeFragmentVM.kt
  36. 9 2
      module_home/src/main/java/com/quyunshuo/module/home/fragment/vm/MakeFragmentVM.kt
  37. 1 1
      module_home/src/main/java/com/quyunshuo/module/home/service/GlobalService.kt
  38. 8 5
      module_home/src/main/java/com/quyunshuo/module/home/service/GlobalServiceViewModel.kt
  39. 49 2
      module_home/src/main/java/com/quyunshuo/module/home/utils/RemotePushUtil.kt
  40. 二進制
      module_home/src/main/res/drawable/add.png
  41. 17 7
      module_home/src/main/res/layout/home_fragment_buy.xml
  42. 146 61
      module_home/src/main/res/layout/home_fragment_home.xml
  43. 39 27
      module_home/src/main/res/layout/home_item_home_product.xml
  44. 7 1
      serialport-api/src/main/java/com/hboxs/serialport/plc/thread/ThreadHomeParam.kt
  45. 15 8
      serialport-api/src/main/java/com/hboxs/serialport/plc/thread/ThreadSettingParam.kt
  46. 1 1
      serialport-api/src/main/java/com/hboxs/serialport/sbc/SBCHeartbeat.kt

+ 2 - 1
app/build.gradle

@@ -67,7 +67,8 @@ android {
         beta {
             buildConfigField "String", "VERSION_TYPE", "\"${ProjectBuildConfig.Version.BETA}\""
 //            signingConfig signingConfigs.releaseConfig
-            minifyEnabled false
+            minifyEnabled true
+            shrinkResources true //为true, 则对资源进行缩减
             proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
         }
         release {

二進制
app/src/main/assets/BadeenDisplay-Regular.ttf


二進制
app/src/main/assets/Cairo-VariableFont_slnt,wght.ttf


二進制
app/src/main/assets/LiuJianMaoCao-Regular.ttf


二進制
app/src/main/assets/huayang.ttf


二進制
app/src/main/assets/jiangchengyuanti.ttf


+ 2 - 0
buildSrc/src/main/kotlin/com/quyunshuo/androidbaseframemvvm/buildsrc/DependencyConfig.kt

@@ -66,6 +66,7 @@ object DependencyConfig {
         const val BaseRecyclerViewAdapterHelper4 = "4.1.4" //Rv适配器
         const val Serialport = "1.0.0"                     //串口支付设备
         const val XLog = "1.11.1"                          // xlog
+        const val Hawk = "2.0.1"                          // hawk
 
         // 第三方SDK--------------------------------------------------------------
         const val TencentBugly = "3.3.9"                    // 腾讯Bugly 异常上报
@@ -183,6 +184,7 @@ object DependencyConfig {
         const val BaseRecyclerViewAdapterHelper4= "io.github.cymchad:BaseRecyclerViewAdapterHelper4:${Version.BaseRecyclerViewAdapterHelper4}"
         const val Serialport ="com.azhon:serialport:${Version.Serialport}"
         const val XLog = "com.elvishew:xlog:${Version.XLog}"
+        const val Hawk = "com.orhanobut:hawk:${Version.Hawk}"
     }
 
     /**

+ 1 - 1
buildSrc/src/main/kotlin/com/quyunshuo/androidbaseframemvvm/buildsrc/SDKKeyConfig.kt

@@ -10,5 +10,5 @@ object SDKKeyConfig {
      * Bugly APP_ID
      * 正式环境需要与测试环境分开 正式ID:""、测试ID:""
      */
-    const val BUGLY_APP_ID = ""
+    const val BUGLY_APP_ID = "1f084d947d"
 }

+ 2 - 0
gradle/libs.versions.toml

@@ -10,6 +10,7 @@ espresso-core = "3.5.1"
 lifecycle-runtime-ktx = "2.6.1"
 activity-compose = "1.8.0"
 compose-bom = "2023.08.00"
+hawk = "2.0.1"
 
 #lib
 
@@ -29,6 +30,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
 androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
 androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
 androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
+hawk = { group = "com.orhanobut", name = "hawk", version.ref = "hawk" }
 
 
 [plugins]

+ 1 - 0
lib_base/build.gradle

@@ -72,6 +72,7 @@ dependencies {
     api DependencyConfig.GitHub.BaseRecyclerViewAdapterHelper4
     api DependencyConfig.GitHub.Serialport
     api DependencyConfig.GitHub.XLog
+    api DependencyConfig.GitHub.Hawk
 
     api DependencyConfig.SDK.TencentBugly
     api DependencyConfig.SDK.TencentBuglyNative

+ 2 - 0
lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/BaseApplication.kt

@@ -4,6 +4,7 @@ import android.annotation.SuppressLint
 import android.content.Context
 import android.util.Log
 import androidx.multidex.MultiDexApplication
+import com.orhanobut.hawk.Hawk
 import com.quyunshuo.androidbaseframemvvm.base.app.ActivityLifecycleCallbacksImpl
 import com.quyunshuo.androidbaseframemvvm.base.app.LoadModuleProxy
 import kotlinx.coroutines.*
@@ -47,6 +48,7 @@ open class BaseApplication : MultiDexApplication() {
 
         // 策略初始化第三方依赖
         initDepends()
+        Hawk.init(this).build()
     }
 
     /**

+ 20 - 20
lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/addressenum/PlcDebugAddressEnum.kt

@@ -3,26 +3,26 @@ package com.quyunshuo.androidbaseframemvvm.base.addressenum
 import com.quyunshuo.androidbaseframemvvm.base.R
 
 enum class PlcDebugAddressEnum(val address: String, val aName: String,val aNameId:Int) {
-    IO_SE_01("000101","次核点位1",R.string.base_plc_debug_1),
-    IO_SE_02("000102","次核点位2",R.string.base_plc_debug_2),
-    IO_SE_03("000103","次核点位3",R.string.base_plc_debug_3),
-    IO_SE_04("000104","次核点位4",R.string.base_plc_debug_4),
-    IO_SE_05("000105","次核点位5",R.string.base_plc_debug_5),
-    IO_SE_06("000106","次核点位6",R.string.base_plc_debug_6),
-    IO_SE_07("000107","次核点位7",R.string.base_plc_debug_7),
-    IO_SE_08("000108","次核点位8",R.string.base_plc_debug_8),
-    IO_SE_09("000109","次核点位9",R.string.base_plc_debug_9),
-    IO_SE_10("000110","次核点位10",R.string.base_plc_debug_10),
-    IO_SE_11("000111","次核点位11",R.string.base_plc_debug_11),
-    IO_SE_12("000112","次核点位12",R.string.base_plc_debug_12),
-    IO_SE_13("000113","次核点位13",R.string.base_plc_debug_13),
-    IO_SE_14("000114","次核点位14",R.string.base_plc_debug_14),
-    IO_SE_15("000115","次核点位15",R.string.base_plc_debug_15),
-    IO_SE_16("000116","次核点位16",R.string.base_plc_debug_16),
-    IO_SE_17("000117","次核点位17",R.string.base_plc_debug_17),
-    IO_SE_18("000118","次核点位18",R.string.base_plc_debug_18),
-    IO_SE_19("000119","次核点位19",R.string.base_plc_debug_19),
-    IO_SE_20("000120","次核点位20",R.string.base_plc_debug_20),
+//    IO_SE_01("00FB01","次核点位1",R.string.base_plc_debug_1),//这里是开机按钮,不放到调试页
+    IO_SE_02("00FB02","次核点位2",R.string.base_plc_debug_2),
+    IO_SE_03("00FB03","次核点位3",R.string.base_plc_debug_3),
+    IO_SE_04("00FB04","次核点位4",R.string.base_plc_debug_4),
+    IO_SE_05("00FB05","次核点位5",R.string.base_plc_debug_5),
+    IO_SE_06("00FB06","次核点位6",R.string.base_plc_debug_6),
+    IO_SE_07("00FB07","次核点位7",R.string.base_plc_debug_7),
+    IO_SE_08("00FB08","次核点位8",R.string.base_plc_debug_8),
+    IO_SE_09("00FB09","次核点位9",R.string.base_plc_debug_9),
+    IO_SE_10("00FB10","次核点位10",R.string.base_plc_debug_10),
+    IO_SE_11("00FB11","次核点位11",R.string.base_plc_debug_11),
+    IO_SE_12("00FB12","次核点位12",R.string.base_plc_debug_12),
+    IO_SE_13("00FB13","次核点位13",R.string.base_plc_debug_13),
+    IO_SE_14("00FB14","次核点位14",R.string.base_plc_debug_14),
+    IO_SE_15("00FB15","次核点位15",R.string.base_plc_debug_15),
+    IO_SE_16("00FB16","次核点位16",R.string.base_plc_debug_16),
+    IO_SE_17("00FB17","次核点位17",R.string.base_plc_debug_17),
+    IO_SE_18("00FB18","次核点位18",R.string.base_plc_debug_18),
+    IO_SE_19("00FB19","次核点位19",R.string.base_plc_debug_19),
+    IO_SE_20("00FB20","次核点位20",R.string.base_plc_debug_20),
 
 }
 

+ 8 - 12
lib_base/src/main/java/com/quyunshuo/androidbaseframemvvm/base/addressenum/ProTypeEnum.kt

@@ -3,24 +3,20 @@ package com.quyunshuo.androidbaseframemvvm.base.addressenum
 /**
  * 商品:
  */
-enum class ProTypeEnum(var proValue: Int, var chineseName: String) {
-    PRO_1(1, "玫瑰精灵"),
-    PRO_2(2, "五彩缤纷"),
-    PRO_3(3, "小棉袄"),
-    PRO_4(4, "彩色精灵");
+enum class ProTypeEnum(var proValue: String, var chineseName: String) {
+    PRO_1("01", "咸味爆米花"),
+    PRO_2("02", "甜味爆米花"),
+    PRO_3("03", "小棉袄");
+//    PRO_4(4, "彩色精灵");
 
     companion object {
-        fun getEnumByValue(chineseName: String): ProTypeEnum {
-
+        fun getEnumByValue(chineseName: String): String {
             for (anEnum in ProTypeEnum.values()) {
                 if (anEnum.chineseName == chineseName) {
-                    return anEnum
+                    return anEnum.proValue
                 }
             }
-            return PRO_1
+            return "01"
         }
-
     }
-
-
 }

+ 2 - 1
lib_base/src/main/res/values-en/strings.xml

@@ -36,7 +36,8 @@
     <string name="base_plc_param_7">Amount used for one production</string>
     <string name="base_plc_param_8">Evaporator insulation lower limit</string>
     <string name="base_plc_param_9">Evaporator insulation upper limit</string>
-    <string name="base_pro_01">Smoothie (milk flavor)</string>
+    <string name="base_pro_01">Salty popcorn</string>
+    <string name="base_pro_02">Sweet popcorn</string>
     <string name="base_two_code">WeChat Alipay</string>
     <string name="base_bill_coin">Paper money and coins</string>
     <string name="base_nayax">Nayax</string>

+ 2 - 1
lib_base/src/main/res/values/strings.xml

@@ -36,7 +36,8 @@
     <string name="base_plc_param_7">制作一次的用量</string>
     <string name="base_plc_param_8">蒸发器保温下限</string>
     <string name="base_plc_param_9">蒸发器保温上限</string>
-    <string name="base_pro_01">冰沙(牛奶味)</string>
+    <string name="base_pro_01">咸味爆米花</string>
+    <string name="base_pro_02">甜味爆米花</string>
     <string name="base_two_code">微信支付宝</string>
     <string name="base_bill_coin">纸币硬币</string>
     <string name="base_nayax">Nayax</string>

+ 4 - 1
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/CommonApplication.kt

@@ -13,6 +13,7 @@ import com.quyunshuo.androidbaseframemvvm.base.utils.ForegroundBackgroundObserve
 import com.quyunshuo.androidbaseframemvvm.base.utils.ProcessUtils
 import com.quyunshuo.androidbaseframemvvm.base.utils.SpUtils
 import com.quyunshuo.androidbaseframemvvm.base.utils.network.NetworkStateClient
+import com.quyunshuo.androidbaseframemvvm.common.constant.Heartbeat
 import com.tencent.bugly.crashreport.CrashReport
 //import com.tencent.smtt.export.external.TbsCoreSettings
 //import com.tencent.smtt.sdk.QbSdk
@@ -145,8 +146,10 @@ class CommonApplication : ApplicationLifecycle, ForegroundBackgroundObserver {
         CrashReport.initCrashReport(
             BaseApplication.context,
             BaseApplication.context.getString(R.string.BUGLY_APP_ID),
-            BuildConfig.VERSION_TYPE != VersionStatus.RELEASE
+//            BuildConfig.VERSION_TYPE != VersionStatus.RELEASE
+            true
         )
+        CrashReport.setUserId(Heartbeat.deviceId + "MP10")
         return "Bugly -->> init complete"
     }
 

+ 1 - 1
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/constant/Heartbeat.kt

@@ -31,6 +31,6 @@ object Heartbeat {
     var bootTimeNumber: Int = 0
 
     //记录用户投入的纸币金额
-    var acceptBill = BigDecimal("0").setScale(2, java.math.RoundingMode.HALF_UP);
+    var acceptBill = BigDecimal.ZERO.setScale(2, java.math.RoundingMode.HALF_UP);
 
 }

+ 6 - 1
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/constant/MMKVName.kt

@@ -1,5 +1,8 @@
 package com.quyunshuo.androidbaseframemvvm.common.constant
 
+import android.graphics.Typeface
+import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
+
 abstract class MMKVName {
 
     companion object {
@@ -85,7 +88,9 @@ abstract class MMKVName {
         val DIY_PAY: String
             //定制支付方式 显示开关
             get() = "DIY_PAY"
-
+        val typeface1: Typeface
+            //自定义字体样式
+            get() =  Typeface.createFromAsset(BaseApplication.context.applicationContext.assets, "huayang.ttf")
     }
 
     // 这里可以继续添加其他常量

+ 11 - 0
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyBean.java

@@ -73,4 +73,15 @@ public class KeyBean {
     public void setHorizontalWeight(float horizontalWeight) {
         this.horizontalWeight = horizontalWeight;
     }
+
+    @Override
+    public String toString() {
+        return "KeyBean{" +
+                "key=" + key +
+                ", label=" + label +
+                ", value=" + value +
+                ", drawable=" + drawable +
+                ", horizontalWeight=" + horizontalWeight +
+                '}';
+    }
 }

+ 115 - 14
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyUtils.java

@@ -1,6 +1,7 @@
 package com.quyunshuo.androidbaseframemvvm.common.keyboard;
 
 import android.app.Activity;
+import android.util.Log;
 import android.util.SparseArray;
 import android.view.Gravity;
 import android.view.View;
@@ -12,11 +13,13 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringDef;
 
+import com.orhanobut.hawk.Hawk;
 import com.quyunshuo.androidbaseframemvvm.common.R;
 
 import java.lang.annotation.Retention;
 import java.lang.annotation.RetentionPolicy;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -28,6 +31,7 @@ import java.util.List;
  */
 public class KeyUtils {
 
+    private static final String TAG = "KeyUtils";
     public static final String TYPE_NINE_PALACE_NUMBER = "ninePalaceNumber";
     public static final String TYPE_NINE_PALACE_NUMBER_WITH_ABC = "ninePalaceNumberWithABC";
     public static final String TYPE_LETTER = "letter";
@@ -166,6 +170,8 @@ public class KeyUtils {
     private static List<List<KeyBean>> letterKeys = new ArrayList<>();
     private static List<List<KeyBean>> letterNumberKeys = new ArrayList<>();
     private static List<List<KeyBean>> symbolKeys = new ArrayList<>();
+    private static List<KeyBean> keysToShuffle = new ArrayList<>();
+
     //portrait
     private static List<List<KeyBean>> portraitLetterKeys = new ArrayList<>();
     private static List<List<KeyBean>> portraitSymbolKeys = new ArrayList<>();
@@ -232,7 +238,7 @@ public class KeyUtils {
         putKey(new KeyBean(KEY_SYMBOL_058, ":"));
         putKey(new KeyBean(KEY_SYMBOL_059, ";"));
         putKey(new KeyBean(KEY_SYMBOL_060, ","));
-        putKey(new KeyBean(KEY_SYMBOL_061, "•","."));
+        putKey(new KeyBean(KEY_SYMBOL_061, "•", "."));
         putKey(new KeyBean(KEY_SYMBOL_062, ","));
         putKey(new KeyBean(KEY_SYMBOL_063, "`", "``"));
         putKey(new KeyBean(KEY_SYMBOL_064, "~"));
@@ -267,7 +273,13 @@ public class KeyUtils {
                 keys = getNinePalaceNumberKeys();
                 break;
             case TYPE_NINE_PALACE_NUMBER_WITH_ABC:
-                keys = getNinePalaceNumberKeysWithABC();
+                if (KeyboardView.isLogin == 1&& Hawk.get("SECURE_NUMERIC_KEYPAD", false)) {
+                    keys = getNinePalaceNumberKeysWithABCShuffle();
+                    Log.d(TAG, "loadKeys: 1");
+                } else {
+                    keys = getNinePalaceNumberKeysWithABC();
+                    Log.d(TAG, "loadKeys: 2");
+                }
                 break;
             case TYPE_LETTER:
                 keys = isPortrait ? getPortraitLetterKeys() : getLetterKeys();
@@ -327,32 +339,121 @@ public class KeyUtils {
     }
 
     public static List<List<KeyBean>> getNinePalaceNumberKeysWithABC() {
+        ninePalaceNumberKeysWithABC = new ArrayList<>();
+        //第一行
+        List<KeyBean> keys0 = new ArrayList<>();
+        keys0.add(keys.get(KEY_1));
+        keys0.add(keys.get(KEY_2));
+        keys0.add(keys.get(KEY_3));
+        keys0.add(keys.get(KEY_CLOSE));
+        ninePalaceNumberKeysWithABC.add(keys0);
+        //第二行
+        List<KeyBean> keys1 = new ArrayList<>();
+        keys1.add(keys.get(KEY_4));
+        keys1.add(keys.get(KEY_5));
+        keys1.add(keys.get(KEY_6));
+        keys1.add(keys.get(KEY_SYMBOL_067));
+        ninePalaceNumberKeysWithABC.add(keys1);
+        //第三行
+        List<KeyBean> keys2 = new ArrayList<>();
+        keys2.add(keys.get(KEY_7));
+        keys2.add(keys.get(KEY_8));
+        keys2.add(keys.get(KEY_9));
+        keys2.add(keys.get(KEY_DELETE));
+        ninePalaceNumberKeysWithABC.add(keys2);
+        //第四行
+        List<KeyBean> keys3 = new ArrayList<>();
+        keys3.add(keys.get(KEY_ABC));
+        keys3.add(keys.get(KEY_0));
+        keys3.add(keys.get(KEY_SYMBOL_061));
+        keys3.add(keys.get(KEY_NEXT));
+        ninePalaceNumberKeysWithABC.add(keys3);
+
+        updateHorizontalWeight(KEY_SYMBOL_048, 1.0f);
+        updateHorizontalWeight(KEY_SYMBOL_049, 1.0f);
+        updateHorizontalWeight(KEY_SYMBOL_050, 1.0f);
+        updateHorizontalWeight(KEY_SYMBOL_051, 1.0f);
+        updateHorizontalWeight(KEY_SYMBOL_061, 1.0f);
+        updateHorizontalWeight(KEY_SYMBOL_067, 1.0f);
+        updateHorizontalWeight(KEY_SPACE, 1.0f);
+        updateHorizontalWeight(KEY_NUM, 1.0f);
+        updateHorizontalWeight(KEY_AA, 1.0f);
+        updateHorizontalWeight(KEY_DELETE, 1.0f);
+        updateHorizontalWeight(KEY_NEXT, 1.0f);
+        return ninePalaceNumberKeysWithABC;
+    }
+
+    public static List<List<KeyBean>> getNinePalaceNumberKeysWithABCShuffle() {
+        if (keysToShuffle != null) {
+            keysToShuffle = new ArrayList<>();
+            keysToShuffle.add(keys.get(KEY_0));
+            keysToShuffle.add(keys.get(KEY_1));
+            keysToShuffle.add(keys.get(KEY_2));
+            keysToShuffle.add(keys.get(KEY_3));
+            keysToShuffle.add(keys.get(KEY_4));
+            keysToShuffle.add(keys.get(KEY_5));
+            keysToShuffle.add(keys.get(KEY_6));
+            keysToShuffle.add(keys.get(KEY_7));
+            keysToShuffle.add(keys.get(KEY_8));
+            keysToShuffle.add(keys.get(KEY_9));
+            Collections.shuffle(keysToShuffle);
+        }
+
         if (ninePalaceNumberKeysWithABC.isEmpty()) {
             //第一行
             List<KeyBean> keys0 = new ArrayList<>();
-            keys0.add(keys.get(KEY_1));
-            keys0.add(keys.get(KEY_2));
-            keys0.add(keys.get(KEY_3));
+            keys0.add(keys.get(keysToShuffle.get(0).getKey()));
+            keys0.add(keys.get(keysToShuffle.get(1).getKey()));
+            keys0.add(keys.get(keysToShuffle.get(2).getKey()));
             keys0.add(keys.get(KEY_CLOSE));
             ninePalaceNumberKeysWithABC.add(keys0);
             //第二行
             List<KeyBean> keys1 = new ArrayList<>();
-            keys1.add(keys.get(KEY_4));
-            keys1.add(keys.get(KEY_5));
-            keys1.add(keys.get(KEY_6));
+            keys1.add(keys.get(keysToShuffle.get(3).getKey()));
+            keys1.add(keys.get(keysToShuffle.get(4).getKey()));
+            keys1.add(keys.get(keysToShuffle.get(5).getKey()));
             keys1.add(keys.get(KEY_SYMBOL_067));
             ninePalaceNumberKeysWithABC.add(keys1);
             //第三行
             List<KeyBean> keys2 = new ArrayList<>();
-            keys2.add(keys.get(KEY_7));
-            keys2.add(keys.get(KEY_8));
-            keys2.add(keys.get(KEY_9));
+            keys2.add(keys.get(keysToShuffle.get(6).getKey()));
+            keys2.add(keys.get(keysToShuffle.get(7).getKey()));
+            keys2.add(keys.get(keysToShuffle.get(8).getKey()));
             keys2.add(keys.get(KEY_DELETE));
             ninePalaceNumberKeysWithABC.add(keys2);
             //第四行
             List<KeyBean> keys3 = new ArrayList<>();
             keys3.add(keys.get(KEY_ABC));
-            keys3.add(keys.get(KEY_0));
+            keys3.add(keys.get(keysToShuffle.get(9).getKey()));
+            keys3.add(keys.get(KEY_SYMBOL_061));
+            keys3.add(keys.get(KEY_NEXT));
+            ninePalaceNumberKeysWithABC.add(keys3);
+        } else {
+            ninePalaceNumberKeysWithABC = new ArrayList<>();
+            List<KeyBean> keys0 = new ArrayList<>();
+            keys0.add(keys.get(keysToShuffle.get(0).getKey()));
+            keys0.add(keys.get(keysToShuffle.get(1).getKey()));
+            keys0.add(keys.get(keysToShuffle.get(2).getKey()));
+            keys0.add(keys.get(KEY_CLOSE));
+            ninePalaceNumberKeysWithABC.add(keys0);
+            //第二行
+            List<KeyBean> keys1 = new ArrayList<>();
+            keys1.add(keys.get(keysToShuffle.get(3).getKey()));
+            keys1.add(keys.get(keysToShuffle.get(4).getKey()));
+            keys1.add(keys.get(keysToShuffle.get(5).getKey()));
+            keys1.add(keys.get(KEY_SYMBOL_067));
+            ninePalaceNumberKeysWithABC.add(keys1);
+            //第三行
+            List<KeyBean> keys2 = new ArrayList<>();
+            keys2.add(keys.get(keysToShuffle.get(6).getKey()));
+            keys2.add(keys.get(keysToShuffle.get(7).getKey()));
+            keys2.add(keys.get(keysToShuffle.get(8).getKey()));
+            keys2.add(keys.get(KEY_DELETE));
+            ninePalaceNumberKeysWithABC.add(keys2);
+            //第四行
+            List<KeyBean> keys3 = new ArrayList<>();
+            keys3.add(keys.get(KEY_ABC));
+            keys3.add(keys.get(keysToShuffle.get(9).getKey()));
             keys3.add(keys.get(KEY_SYMBOL_061));
             keys3.add(keys.get(KEY_NEXT));
             ninePalaceNumberKeysWithABC.add(keys3);
@@ -502,7 +603,7 @@ public class KeyUtils {
         updateHorizontalWeight(KEY_SPACE, 1.50f);
         updateHorizontalWeight(KEY_NUM, 1.0f);
         updateHorizontalWeight(KEY_AA, 1.0f);
-        updateHorizontalWeight(KEY_DELETE, 1.0f);
+        updateHorizontalWeight(KEY_DELETE, 1.50f);
         updateHorizontalWeight(KEY_NEXT, 1.50f);
         return portraitLetterKeys;
     }
@@ -750,7 +851,7 @@ public class KeyUtils {
         return key >= KeyUtils.KEY_BLANK && key <= KeyUtils.KEY_BLACK;
     }
 
-    public static boolean isLinkedInputSymbolKey(@KeyCode int key){
+    public static boolean isLinkedInputSymbolKey(@KeyCode int key) {
         return key == KEY_SYMBOL_048
                 || key == KEY_SYMBOL_049
                 || key == KEY_SYMBOL_050

+ 17 - 11
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/keyboard/KeyboardView.java

@@ -32,6 +32,7 @@ import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.StringDef;
 
+import com.orhanobut.hawk.Hawk;
 import com.quyunshuo.androidbaseframemvvm.common.R;
 
 import java.lang.annotation.Retention;
@@ -77,6 +78,8 @@ public class KeyboardView extends LinearLayout {
      * 支持任意方向上拖动
      */
     public static final String ALL_DIRECTION = "all";
+
+    public static  int isLogin = 0;
     /**
      * 不支持拖动
      */
@@ -98,7 +101,7 @@ public class KeyboardView extends LinearLayout {
     //当前聚焦的输入框
     private EditText focusedEditText = null;
     //输入框touch后聚焦
-    private OnTouchListener touchListener = new OnTouchListener() {
+    private View.OnTouchListener touchListener = new View.OnTouchListener() {
 
         @Override
         public boolean onTouch(View v, MotionEvent event) {
@@ -111,7 +114,7 @@ public class KeyboardView extends LinearLayout {
         }
     };
     //按键点击监听
-    private OnClickListener clickListener = new OnClickListener() {
+    private View.OnClickListener clickListener = new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             KeyView keyView = (KeyView) v;
@@ -167,11 +170,11 @@ public class KeyboardView extends LinearLayout {
         super(context, attrs, defStyleAttr);
 
         setOrientation(VERTICAL);
-        int defaultKeyWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 110, context.getResources().getDisplayMetrics());
+        int defaultKeyWidth = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 200, context.getResources().getDisplayMetrics());
         int defaultKeySpace = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 2, context.getResources().getDisplayMetrics());
         TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.KeyboardView, defStyleAttr, 0);
         int keyWidth = a.getDimensionPixelSize(R.styleable.KeyboardView_keyWidth, defaultKeyWidth);
-        int keyHeight = a.getDimensionPixelSize(R.styleable.KeyboardView_keyHeight, 85);
+        int keyHeight = a.getDimensionPixelSize(R.styleable.KeyboardView_keyHeight, 70);
         int horizontalSpace = a.getDimensionPixelSize(R.styleable.KeyboardView_keyHorizontalSpace, defaultKeySpace);
         int verticalSpace = a.getDimensionPixelSize(R.styleable.KeyboardView_keyVerticalSpace, defaultKeySpace);
         int boardType = a.getInt(R.styleable.KeyboardView_keyboardType, 0);
@@ -315,6 +318,7 @@ public class KeyboardView extends LinearLayout {
         }
     }
 
+    @SuppressLint("WrongConstant")
     public final void insertInput(KeyBean bean) {
         final EditText focusedView = getFocusedEditText();
         if (focusedView == null)
@@ -416,14 +420,14 @@ public class KeyboardView extends LinearLayout {
         int key = bean.getKey();
         KeyView keyView = viewSparseArray.get(key);
         boolean isCachedView = false;
-        if (keyView == null) {
+        if (Hawk.get("SECURE_NUMERIC_KEYPAD", false)||keyView==null) {
             isCachedView = true;
             keyView = new KeyView(getContext());
             keyView.setTypeface(typeface);
             keyView.getTextKeyView().setTextColor(getKeyTextColor(key));
             keyView.getTextKeyView().setTextSize(TypedValue.COMPLEX_UNIT_DIP, getKeyTextSize(key));
             keyView.setOnClickListener(clickListener);
-            keyView.setOnLongClickListener(key == KeyUtils.KEY_DELETE ? new OnLongClickListener() {
+            keyView.setOnLongClickListener(key == KeyUtils.KEY_DELETE ? new View.OnLongClickListener() {
                 @Override
                 public boolean onLongClick(View v) {
                     deleteAllInput();
@@ -471,8 +475,9 @@ public class KeyboardView extends LinearLayout {
         return key == KeyUtils.KEY_NEXT ? Color.WHITE : 0xFF0A5028;
     }
 
+    //设置键盘文字大小
     private float getKeyTextSize(int key) {
-        return createKeyListener == null ? 16 : createKeyListener.getKeyTextSize(getKeyboardType(), key);
+        return createKeyListener == null ? 60 : createKeyListener.getKeyTextSize(getKeyboardType(), key);
     }
 
     private int getKeyBackground(int key) {
@@ -773,11 +778,10 @@ public class KeyboardView extends LinearLayout {
         return statusBarHeight;
     }
 
-    @SuppressLint("WrongConstant")
     private void playClickSound() {
         AudioManager audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
         if (audioManager != null)
-            audioManager.playSoundEffect(SoundEffectConstants.CLICK);
+            audioManager.playSoundEffect(AudioManager.FX_KEY_CLICK);
     }
 
     @SuppressLint("WrongConstant")
@@ -972,7 +976,8 @@ public class KeyboardView extends LinearLayout {
             setKeyboardType(keyboardType);
             if ((KeyUtils.TYPE_NINE_PALACE_NUMBER.equals(lastKeyboardType)
                     || KeyUtils.TYPE_NINE_PALACE_NUMBER.equals(keyboardType))
-                    && (getTranslationX() != 0 || getTranslationY() != 0))
+                    && (getTranslationX() != 0 || getTranslationY() != 0)) {
+
                 executeKeyboardReLocation(new Animator.AnimatorListener() {
                     @Override
                     public void onAnimationStart(Animator animation) {
@@ -994,8 +999,9 @@ public class KeyboardView extends LinearLayout {
 
                     }
                 });
-            else
+            } else {
                 createKeys();
+            }
         }
         showKeyboard();
     }

+ 3 - 3
lib_common/src/main/java/com/quyunshuo/androidbaseframemvvm/common/util/ProductAbout.kt

@@ -2,13 +2,13 @@ package com.quyunshuo.androidbaseframemvvm.common.util
 
 object ProductAbout {
     val namesS: Array<String> = arrayOf(
-        "base_pro_01", "base_pro_01", "base_pro_01", "base_pro_01",
+        "base_pro_01", "base_pro_02",
     )
     val chineseNameS: Array<String> = arrayOf(
-        "玫瑰精灵", "五彩缤纷", "小棉袄", "彩色精灵",
+        "咸味爆米花","甜味爆米花",
     )
 
     val imgIdsS: Array<String> = arrayOf(
-        "pic_sc_01", "pic_sc_01", "pic_sc_01","pic_sc_01"
+        "pic_sc_01", "pic_sc_01",
     )
 }

+ 4 - 4
module_backstage/src/main/AndroidManifest.xml

@@ -4,10 +4,10 @@
     <application>
         <activity android:name=".activity.setting.SettingActivity"
             android:exported="true">
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
+<!--            <intent-filter>-->
+<!--                <action android:name="android.intent.action.MAIN" />-->
+<!--                <category android:name="android.intent.category.LAUNCHER" />-->
+<!--            </intent-filter>-->
         </activity>
 
     </application>

+ 14 - 2
module_backstage/src/main/java/com/module/backstage/activity/setting/SettingActivity.kt

@@ -23,6 +23,8 @@ import com.google.gson.reflect.TypeToken
 import com.hboxs.serialport.plc.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.hjq.http.EasyHttp
 import com.hjq.http.listener.OnDownloadListener
 import com.hjq.http.model.HttpMethod
@@ -48,6 +50,7 @@ import com.quyunshuo.androidbaseframemvvm.common.util.LongClickUtils
 import com.quyunshuo.androidbaseframemvvm.common.util.MyContextWrapper
 import com.quyunshuo.androidbaseframemvvm.common.util.ToastUtil
 import com.quyunshuo.androidbaseframemvvm.common.util.UiUtil
+import com.quyunshuo.androidbaseframemvvm.common.util.XLogUtil
 import dagger.hilt.android.AndroidEntryPoint
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
@@ -321,9 +324,8 @@ class SettingActivity : BaseActivity<BackstageActivitySettingBinding, SettingVie
                 when (type) {
                     devOnOffDialog?.type1 -> {
                         Log.d(TAG, "onClickListener: ")
-                        mViewModel.threadSettingParam.startSetM3()
+                        mViewModel.threadSettingParam.startUp()
                     }
-
                     else -> {}
                 }
             }
@@ -404,4 +406,14 @@ class SettingActivity : BaseActivity<BackstageActivitySettingBinding, SettingVie
         }
     }
 
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun event(messageEvent: VBoxMessage) {
+        XLogUtil.d(messageEvent.cmd+":messageEvent.data:"+messageEvent.data)
+        when (messageEvent.cmd) {
+            VboxCommand.CMD_HEARTBEAT ->{
+                mViewModel.cmdHeartbeat(messageEvent)
+            }
+            else -> {}
+        }
+    }
 }

+ 35 - 1
module_backstage/src/main/java/com/module/backstage/activity/setting/SettingViewModel.kt

@@ -9,6 +9,8 @@ import androidx.lifecycle.viewModelScope
 import com.google.gson.Gson
 import com.hboxs.serialport.plc.message.Message
 import com.hboxs.serialport.plc.thread.ThreadSettingParam
+import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.module.backstage.model.ApkInfoBean
 import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
 import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcSettingAddressEnum
@@ -69,7 +71,7 @@ class SettingViewModel @Inject constructor(private val mRepo: SettingRepository)
         Log.d(TAG, "ack: " + name)
         when (name) {
             PlcSettingAddressEnum.M3.address -> {
-                threadSettingParam.stopSetM3()
+                threadSettingParam.stopUp()
                 _isM3Success.value = true
                 viewModelScope.launch {
                     delay(3000)
@@ -226,5 +228,37 @@ class SettingViewModel @Inject constructor(private val mRepo: SettingRepository)
         return packInfo.versionCode
     }
 
+    fun cmdHeartbeat(messageEvent: VBoxMessage) {
+        val deviceState = messageEvent.data.substring(0, 2)//机器状态码
+        Log.d(TAG, "deviceState:1 "+messageEvent.data)
+        Log.d(TAG, "deviceState:2 "+deviceState)
+        when(deviceState){
+            "00"->{//刚上电
 
+            }
+            "01"->{//开机中
+                threadSettingParam.stopUp()
+                _isM3Success.value = true
+            }
+            "02"->{//就绪待机,可以选购或制作下一杯
+
+            }
+            "03"->{//报警中
+
+            }
+            "04"->{//开始制作
+
+            }
+            "05"->{//下玉米完毕
+
+            }
+            "07"->{//玉米爆开
+
+            }
+            "10"->{//制作完成
+
+            }
+            else->{}
+        }
+    }
 }

+ 12 - 0
module_backstage/src/main/java/com/module/backstage/fragment/param/GeneralParamFragment.kt

@@ -6,6 +6,8 @@ import androidx.fragment.app.viewModels
 import androidx.recyclerview.widget.GridLayoutManager
 import com.hboxs.serialport.plc.DialogClickListener
 import com.hboxs.serialport.plc.message.Message
+import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.module.backstage.R
 import com.module.backstage.adapter.GeneralParamAdapter
 import com.module.backstage.databinding.BackstageFragmentGeneralParamBinding
@@ -83,6 +85,16 @@ class GeneralParamFragment : BaseFragment<BackstageFragmentGeneralParamBinding,
         }
     }
 
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun event(messageEvent: VBoxMessage) {
+        Log.d(TAG, "messageEvent event: "+messageEvent.cmd)
+        when (messageEvent.cmd) {
+            VboxCommand.CMD_HEARTBEAT ->{
+            }
+            else -> {}
+        }
+    }
+
 
 
     override fun initObserve() {

+ 1 - 1
module_backstage/src/main/java/com/module/backstage/repo/DebugParamFragmentRepo.kt

@@ -17,7 +17,7 @@ class DebugParamFragmentRepo @Inject constructor() : BaseRepository() {
     lateinit var mApi: com.module.pay.service.HomeApiService
 
     var arrayList: MutableList<PlcDebugAddressEnum> = Arrays.asList(
-        PlcDebugAddressEnum.IO_SE_01,
+//        PlcDebugAddressEnum.IO_SE_01,
         PlcDebugAddressEnum.IO_SE_02,
         PlcDebugAddressEnum.IO_SE_03,
         PlcDebugAddressEnum.IO_SE_04,

+ 0 - 1
module_backstage/src/main/java/com/module/backstage/vm/DebugParamFragmentVM.kt

@@ -251,7 +251,6 @@ class DebugParamFragmentVM @Inject constructor(private val mRepo: DebugParamFrag
             threadDebugParamParam.setBtn(plcDebugAddressEnum.address)
         } else {
             threadDebugParamParam.rstBtn(plcDebugAddressEnum.address)
-
         }
     }
 

+ 8 - 7
module_backstage/src/main/res/layout/backstage_activity_setting.xml

@@ -9,15 +9,15 @@
 
     <com.google.android.material.navigation.NavigationView
         android:id="@+id/bnv_main_navigationbar"
-        android:layout_width="match_parent"
-        android:layout_height="200dp"
+        android:layout_width="240dp"
+        android:layout_height="match_parent"
         app:itemIconPadding="25dp"
         android:paddingHorizontal="10dp"
         android:layout_marginStart="20dp"
+        android:layout_marginTop="150dp"
         android:layout_marginEnd="20dp"
         android:background="@drawable/backstage_shape_product_left_nav_content"
         app:itemTextAppearance="@style/Menu"
-        android:layout_marginTop="20dp"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/backstage_constraintlayout"
         app:menu="@menu/backstage_menu_setting"
@@ -166,12 +166,13 @@
         android:id="@+id/home_fragmentcontainerview"
         android:name="androidx.navigation.fragment.NavHostFragment"
         android:layout_width="match_parent"
-        android:layout_marginStart="20dp"
+        android:layout_marginStart="260dp"
         android:layout_marginEnd="20dp"
-        android:layout_marginTop="20dp"
+        android:layout_marginTop="150dp"
         android:layout_marginBottom="100dp"
-        android:layout_height="1600dp"
-        app:layout_constraintTop_toBottomOf="@+id/bnv_main_navigationbar"
+        android:layout_height="match_parent"
+        app:layout_constraintTop_toBottomOf="@+id/backstage_constraintlayout"
+        app:layout_constraintStart_toEndOf="@+id/bnv_main_navigationbar"
         app:navGraph="@navigation/backstage_nav"
         tools:ignore="MissingConstraints" />
 <!--    app:layout_constraintStart_toEndOf="@+id/bnv_main_navigationbar"-->

+ 4 - 4
module_home/src/main/AndroidManifest.xml

@@ -13,10 +13,10 @@
         <activity
             android:name=".activity.main.MainActivity"
             android:exported="true">
-<!--            <intent-filter>-->
-<!--                <action android:name="android.intent.action.MAIN" />-->
-<!--                <category android:name="android.intent.category.LAUNCHER" />-->
-<!--            </intent-filter>-->
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN" />
+                <category android:name="android.intent.category.LAUNCHER" />
+            </intent-filter>
         </activity>
 
         <service

+ 4 - 1
module_home/src/main/java/com/quyunshuo/module/home/adapter/HomeProductAdapter.kt

@@ -1,12 +1,15 @@
 package com.quyunshuo.module.home.adapter
 
+import android.graphics.Typeface
 import android.util.Log
 import android.view.LayoutInflater
 import android.view.ViewGroup
 import androidx.lifecycle.LiveData
 import androidx.lifecycle.MutableLiveData
 import androidx.recyclerview.widget.RecyclerView
+import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
 import com.quyunshuo.androidbaseframemvvm.common.bean.ProductDataBean
+import com.quyunshuo.androidbaseframemvvm.common.constant.MMKVName
 import com.quyunshuo.androidbaseframemvvm.common.listener.AdapterClickListener
 import com.quyunshuo.androidbaseframemvvm.common.util.UiUtil
 import com.quyunshuo.module.home.R
@@ -22,13 +25,13 @@ class HomeProductAdapter(var productList:ArrayList<ProductDataBean>): RecyclerVi
             mBinding.run {
                 //图片
                 ivSugar.setImageResource(UiUtil.getResId(productDataBean.imgID, R.drawable::class.java))
-
                 //商品名字:自定义、自带
                 if (productDataBean.customName == "") {
                     tvName.setText(UiUtil.getResId(productDataBean.nameId, R.string::class.java))
                 }else{
                     tvName.text = productDataBean.customName
                 }
+                tvName.typeface = MMKVName.typeface1
 
                 //价格
                 tvPrice.setText(""+productDataBean.price)

+ 27 - 16
module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/HomeFragment.kt

@@ -3,6 +3,7 @@ package com.quyunshuo.module.home.fragment.fragment
 import android.annotation.SuppressLint
 import android.content.Context
 import android.graphics.Point
+import android.graphics.Typeface
 import android.os.Bundle
 import android.os.Handler
 import android.text.format.DateFormat
@@ -28,6 +29,8 @@ import com.hboxs.serialport.sbc.VboxSerialPortSendQueue
 import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.hboxs.serialport.sbc.frame.VboxWriteCommand
 import com.module.pay.nayax.CreditCardPresenter
+import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
+import com.quyunshuo.androidbaseframemvvm.base.addressenum.ProTypeEnum
 import com.quyunshuo.androidbaseframemvvm.base.ktx.observeLiveData
 import com.quyunshuo.androidbaseframemvvm.base.ktx.setVisible
 import com.quyunshuo.androidbaseframemvvm.base.utils.RegisterEventBus
@@ -98,8 +101,7 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
         startRefreshime()
         with(homeRvProduct) {
             //设置布局排列方式,默认垂直排列
-            val gridLayoutManager: GridLayoutManager =
-                GridLayoutManager(this@HomeFragment.context, 4, GridLayoutManager.VERTICAL, false)
+            val gridLayoutManager = GridLayoutManager(this@HomeFragment.context, 2, GridLayoutManager.VERTICAL, false)
             layoutManager = gridLayoutManager
             //设置adapter
             productList = mViewModel.getPriceData()
@@ -131,12 +133,19 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
         tvTotal.setOnClickListener(this@HomeFragment)
         ivShoppingTrolley.setOnClickListener(this@HomeFragment)
         tvPay.setOnClickListener(this@HomeFragment)
-        tvAacpeBill.setText("投入纸币:"+Heartbeat.acceptBill)
+        tvAacpeBill.setText(""+Heartbeat.acceptBill)
         initUi()
         //刷卡器初始化 在内部要做好判断?在外部吧  支付方式是否保护Nyax来决定。
         CreditCardPresenter.getCreditCardContract()
+        setTextTtf()
+    }
 
-
+    //设置字体文件
+    private fun HomeFragmentHomeBinding.setTextTtf() {
+        tvAacpeBill.typeface = MMKVName.typeface1
+        tvAacpeCoin.typeface = MMKVName.typeface1
+        tvAacpeBillTip.typeface = MMKVName.typeface1
+        tvAacpeCoinTip.typeface = MMKVName.typeface1
     }
 
     /**
@@ -173,16 +182,17 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
     //选择产品:单选或多选。
     private fun clickProduct(position: Int, view: View?) {
         product = productList[position]
+        Log.d(TAG, "clickProduct: "+product)
         //点击前校验 有没有开机、有没有选择支付方式等。
         val deviceStatusCheck = mViewModel.deviceStatusCheck()
-        if (deviceStatusCheck != "") {
-            showTipsDialog(deviceStatusCheck)
-            return
-        }
-        if (product?.price!! <= 0 && !Heartbeat.isForeign) {
-            showTipsDialog("价格低于0元,不能购买")
-            return
-        }
+//        if (deviceStatusCheck != "") {
+//            showTipsDialog(deviceStatusCheck)
+//            return
+//        }
+//        if (product?.price!! <= 0 && !Heartbeat.isForeign) {
+//            showTipsDialog("价格低于0元,不能购买")
+//            return
+//        }
 
 //        selectProductDataBean = ProTypeEnum.getEnumByValue(product!!.nameChinese)
         //todo 测试做糖 传递价格等信息过去。
@@ -278,11 +288,11 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
                 showPaySuccessDialog()
                 lifecycleScope.launch {
                     delay(2000)
-                    gotoMake(message.name,message.data as Int)
+                    gotoMake(message.name,message.data as String)
                 }
             }
             PayName.ACCEPT_BILL->{
-                mBinding.tvAacpeBill.setText("投入纸币:"+Heartbeat.acceptBill)
+                mBinding.tvAacpeBill.setText(""+Heartbeat.acceptBill)
             }
             else -> {}
         }
@@ -291,9 +301,10 @@ class HomeFragment : BaseFragment<HomeFragmentHomeBinding, HomeFragmentVM>(), Vi
 
 
 
-    private fun gotoMake(name: String, payType: Int) {
+    private fun gotoMake(name: String, payType: String) {
 
-//        selectProductDataBean = ProTypeEnum.getEnumByValue(name) 上线需要使用这个。
+        Log.d(TAG, "gotoMake: "+mViewModel.getShoppingTrolleyList())
+       var selectProductDataBean = ProTypeEnum.getEnumByValue(name) //上线需要使用这个。
         if (product != null) {
             val findNavController = findNavController()
             var bundle = Bundle()

+ 64 - 5
module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/MakeFragment.kt

@@ -1,6 +1,5 @@
 package com.quyunshuo.module.home.fragment.fragment
 
-import android.annotation.SuppressLint
 import android.os.Handler
 import android.text.format.DateFormat
 import android.util.Log
@@ -11,18 +10,25 @@ import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.OnLifecycleEvent
 import androidx.navigation.fragment.findNavController
+import com.google.gson.Gson
+import com.google.gson.reflect.TypeToken
 import com.hboxs.serialport.plc.DialogClickListener
 import com.hboxs.serialport.plc.message.Message
-import com.hboxs.serialport.sbc.SBCHeartbeat
+import com.hboxs.serialport.plc.util.HexUtils
+import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcD2StatusEnum
 import com.quyunshuo.androidbaseframemvvm.base.ktx.observeLiveData
 import com.quyunshuo.androidbaseframemvvm.base.utils.RegisterEventBus
+import com.quyunshuo.androidbaseframemvvm.common.bean.ShoppingCartBean
 import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragment
+import com.quyunshuo.androidbaseframemvvm.common.util.ByteUtils
 import com.quyunshuo.module.home.R
 import com.quyunshuo.module.home.databinding.HomeFragmentMakeBinding
 import com.quyunshuo.module.home.dialog.AgainBuyDialog
 import com.quyunshuo.module.home.fragment.vm.MakeFragmentVM
 import com.quyunshuo.androidbaseframemvvm.common.util.LongClickUtils
+import com.quyunshuo.androidbaseframemvvm.common.util.XLogUtil
 import com.quyunshuo.module.home.utils.SimplePlayerUtil
 import com.quyunshuo.module.home.weight.ProgressView
 import dagger.hilt.android.AndroidEntryPoint
@@ -56,16 +62,22 @@ class MakeFragment : BaseFragment<HomeFragmentMakeBinding, MakeFragmentVM>() {
 
     override fun HomeFragmentMakeBinding.initView() {
         //处理传递过来的商品数据,进行制作、数据保存
-        val selectPro = arguments?.getInt("SELECT_PRO")
-        Log.d(TAG, "initView: "+selectPro)
+        val selectPro = arguments?.getString("SELECT_PRO")
+        // 解析 JSON 数据
         simplePlayerUtil = SimplePlayerUtil(svVideo)
         simplePlayerUtil!!.setUrl("/storage/emulated/0/adB/1440.mp4")
         initProgress()
 
         //首先判断是否有做糖数据,如果有则发送指令,如果没有就结束。
         if (selectPro!=null) {
+            val shoppingCartItems = parseShoppingCartData(selectPro)
+            Log.d(TAG, "initView0: "+shoppingCartItems)
+
+            for (nameChinese in shoppingCartItems) {
+                Log.d(TAG, "initView1: "+nameChinese.nameChinese)
+            }
             //发送做糖指令,写入。
-            mViewModel.startSendD91(selectPro)
+            mViewModel.startSendMake(shoppingCartItems[0].nameChinese)
         }
 
         LongClickUtils.setLongClick(Handler(), ivLogo, 5000, object : View.OnLongClickListener {
@@ -79,6 +91,12 @@ class MakeFragment : BaseFragment<HomeFragmentMakeBinding, MakeFragmentVM>() {
         })
     }
 
+    fun parseShoppingCartData(jsonData: String): List<ShoppingCartBean> {
+        val gson = Gson()
+        val type = object : TypeToken<List<ShoppingCartBean>>() {}.type
+        return gson.fromJson(jsonData, type)
+    }
+
     override fun initObserve() {
         observeLiveData(mViewModel.D2Value,::getD2Value)
         observeLiveData(mViewModel.D170Value, ::dataChange)
@@ -190,7 +208,48 @@ class MakeFragment : BaseFragment<HomeFragmentMakeBinding, MakeFragmentVM>() {
         }
     }
 
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun event(messageEvent: VBoxMessage) {
+            XLogUtil.d(messageEvent.cmd+":messageEvent.data:"+messageEvent.data)
+            when (messageEvent.cmd) {
+                VboxCommand.CMD_HEARTBEAT ->{
+                    cmdHeartbeat(messageEvent)
+                }
+                else -> {}
+        }
+    }
+    private fun cmdHeartbeat(messageEvent: VBoxMessage) {
+        val deviceState = messageEvent.data.substring(0, 2)//机器状态码
+        Log.d(TAG, "deviceState:1 "+messageEvent.data)
+        Log.d(TAG, "deviceState:2 "+deviceState)
+        when(deviceState){
+            "00"->{//刚上电
+
+            }
+            "01"->{//开机中
 
+            }
+            "02"->{//就绪待机,可以选购或制作下一杯
+
+            }
+            "03"->{//报警中
+
+            }
+            "04"->{//开始制作
+
+            }
+            "05"->{//下玉米完毕
+
+            }
+            "07"->{//玉米爆开
+
+            }
+            "10"->{//制作完成
+
+            }
+            else->{}
+        }
+    }
 
     private fun showAgainBuyDialog() {
         if (againBuyDialog == null) {

+ 3 - 1
module_home/src/main/java/com/quyunshuo/module/home/fragment/fragment/UserLoginFragment.kt

@@ -1,7 +1,6 @@
 package com.quyunshuo.module.home.fragment.fragment
 
 import android.os.Handler
-import android.text.format.DateFormat
 import android.util.Log
 import android.view.View
 import android.widget.AdapterView
@@ -15,6 +14,7 @@ import androidx.navigation.fragment.findNavController
 import com.alibaba.android.arouter.launcher.ARouter
 import com.quyunshuo.androidbaseframemvvm.base.ktx.observeLiveData
 import com.quyunshuo.androidbaseframemvvm.common.constant.RouteUrl
+import com.quyunshuo.androidbaseframemvvm.common.keyboard.KeyboardView
 import com.quyunshuo.androidbaseframemvvm.common.ui.BaseFragment
 import com.quyunshuo.androidbaseframemvvm.common.util.FileUtil
 import com.quyunshuo.androidbaseframemvvm.common.util.ToastUtil
@@ -56,6 +56,7 @@ class UserLoginFragment : BaseFragment<HomeFragmentUserloginBinding, UserLoginFr
     private var HANDLE_TIME = 1//设置时间
 
     override fun HomeFragmentUserloginBinding.initView() {
+        KeyboardView.isLogin = 1
         startRefreshime()
         addAllKeyboardView(mBinding.root)
         usernamesNew = arrayOf<String>("Admin", "Staff")
@@ -125,6 +126,7 @@ class UserLoginFragment : BaseFragment<HomeFragmentUserloginBinding, UserLoginFr
 
     override fun onDestroy() {
         super.onDestroy()
+        KeyboardView.isLogin = 0
         Log.d(TAG, "onDestroy: ")
     }
 

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

@@ -178,6 +178,7 @@ class HomeFragmentVM @Inject constructor(private val mRepo: HomeFragmentRepo) :
             )
             shoppingCartList.add(newItem)
         }
+        Log.d(TAG, "shoppingTrolleyAdd: $shoppingCartList")
         shoppingTrolleySumCount()
         shoppingTrolleySumPrice()
     }

+ 9 - 2
module_home/src/main/java/com/quyunshuo/module/home/fragment/vm/MakeFragmentVM.kt

@@ -6,15 +6,16 @@ import androidx.lifecycle.MutableLiveData
 import androidx.lifecycle.viewModelScope
 import com.hboxs.serialport.plc.frame.ResponseFrame
 import com.hboxs.serialport.plc.message.Message
+import com.hboxs.serialport.plc.thread.ThreadHomeParam
 import com.hboxs.serialport.plc.util.AdvacedUtil
 import com.hboxs.serialport.plc.util.AsciiUtils
-import com.quyunshuo.androidbaseframemvvm.common.util.ByteUtils
 import com.hboxs.serialport.plc.util.HexUtils
 import com.hboxs.serialport.plc.util.HexadecimalUtil
 import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcHomeAddressEnum
+import com.quyunshuo.androidbaseframemvvm.base.addressenum.ProTypeEnum
 import com.quyunshuo.androidbaseframemvvm.base.mvvm.vm.BaseViewModel
+import com.quyunshuo.androidbaseframemvvm.common.util.ByteUtils
 import com.quyunshuo.module.home.fragment.repo.MakeFragmentRepo
-import com.hboxs.serialport.plc.thread.ThreadHomeParam
 import dagger.hilt.android.lifecycle.HiltViewModel
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
@@ -97,6 +98,12 @@ class MakeFragmentVM @Inject constructor(private val mRepo: MakeFragmentRepo) :
         val hexStr2BinStr = HexUtils.hexStr2BinStr(decimal2fitHex)
         threadHomeParam.startSetD91(hexStr2BinStr)
     }
+    fun startSendMake(selectPro: String) {
+       val data= ProTypeEnum.getEnumByValue(selectPro)
+        //我想将 AA+01+
+        val hexStr = "00FC"+ data +"00"
+        threadHomeParam.startMake(hexStr)
+    }
 
     fun ack(messageEvent: Message) {
         when (messageEvent.name) {

+ 1 - 1
module_home/src/main/java/com/quyunshuo/module/home/service/GlobalService.kt

@@ -80,7 +80,7 @@ class GlobalService :LifecycleService() {
 //        globalServiceViewModel.scheduleDailyAlarmWithWorkManager(this@GlobalService);
         //初始化 支付的串口通讯
 //        initPayIctMdb()
-        showTipsDialog("通电初次初始化中...")
+        showTipsDialog("通电初次初始化中...")//是否开机
         observeLiveData(globalServiceViewModel.initIsSuccess,::initIsSuccess)
     }
 

+ 8 - 5
module_home/src/main/java/com/quyunshuo/module/home/service/GlobalServiceViewModel.kt

@@ -403,19 +403,22 @@ class GlobalServiceViewModel @Inject constructor(
      */
     private fun cmdHeartbeat(messageEvent: VBoxMessage) {
         //机器状态码,设备目前处于关机的待机状态
-        SBCHeartbeat.devCode = messageEvent.data.substring(0,2)
+        Log.d(TAG, "cmdHeartbeat1: "+messageEvent.data)
+        SBCHeartbeat.devCode = messageEvent.data.substring(0,2)//p10机器状态码
         //温度超温状态-转2进制:00100000
 //        SBCHeartbeat.devCode = messageEvent.data.substring(4,6)
         val overheatState = HexUtils.hexStr2BinStr(messageEvent.data.substring(4, 6))
         val split = overheatState.trim().split("")
+
+        //用于判断哪个位置的温度超过了255,(1:超过了 0:未超过)
         Log.d(TAG, overheatState+":cmdHeartbeat: :"+split[0]+":"+split[1]+":"+split[2]+":"+split[3])
 
         //炉头温度
         SBCHeartbeat.headTemp = ((split[1].toInt()*256)+ByteUtils.hexStr2decimal(messageEvent.data.substring(6,8))).toString()
         Log.d(TAG, "steamTemp: "+SBCHeartbeat.headTemp)
         //蒸汽温度
-        SBCHeartbeat.steamTemp = ((split[2].toInt()*256)+ByteUtils.hexStr2decimal(messageEvent.data.substring(8,10))).toString()
-        Log.d(TAG, "steamTemp: "+SBCHeartbeat.steamTemp)
+//        SBCHeartbeat.steamTemp = ((split[2].toInt()*256)+ByteUtils.hexStr2decimal(messageEvent.data.substring(8,10))).toString()
+//        Log.d(TAG, "steamTemp: "+SBCHeartbeat.steamTemp)
 
         //预留温度
 //        SBCHeartbeat.headTemp = messageEvent.data.substring(10,12)
@@ -425,9 +428,9 @@ class GlobalServiceViewModel @Inject constructor(
         //柜内湿度
 //        SBCHeartbeat.headTemp = messageEvent.data.substring(14,16)
         //柜外温度
-        SBCHeartbeat.outsideTemp = ByteUtils.hexStr2decimal(messageEvent.data.substring(16,18)).toString()
+//        SBCHeartbeat.outsideTemp = ByteUtils.hexStr2decimal(messageEvent.data.substring(16,18)).toString()
         //柜外湿度
-        SBCHeartbeat.outsideHumidity = ByteUtils.hexStr2decimal(messageEvent.data.substring(18,20)).toString()
+//        SBCHeartbeat.outsideHumidity = ByteUtils.hexStr2decimal(messageEvent.data.substring(18,20)).toString()
 
         Log.d(TAG, "cmdHeartbeat: "+SBCHeartbeat.headTemp +":"+SBCHeartbeat.steamTemp+":"+SBCHeartbeat.outsideTemp+":"+SBCHeartbeat.outsideHumidity)
     }

+ 49 - 2
module_home/src/main/java/com/quyunshuo/module/home/utils/RemotePushUtil.kt

@@ -6,6 +6,8 @@ import android.util.Log
 import com.google.gson.Gson
 import com.hboxs.serialport.plc.message.Message
 import com.hboxs.serialport.plc.thread.ThreadSettingParam
+import com.hboxs.serialport.sbc.VBoxMessage
+import com.hboxs.serialport.sbc.frame.VboxCommand
 import com.quyunshuo.androidbaseframemvvm.base.BaseApplication
 import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcSettingAddressEnum
 import com.quyunshuo.androidbaseframemvvm.base.utils.SpUtils
@@ -18,6 +20,7 @@ import com.quyunshuo.androidbaseframemvvm.common.enums.ConnectStateEnum
 import com.quyunshuo.module.home.bean.AlarmClockBean
 import com.quyunshuo.androidbaseframemvvm.common.enums.AlarmClockEnum
 import com.quyunshuo.androidbaseframemvvm.common.util.AlarmManagerUtil
+import com.quyunshuo.androidbaseframemvvm.common.util.XLogUtil
 import com.quyunshuo.module.home.getui.BaseBean
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -70,7 +73,7 @@ class RemotePushUtil @Inject constructor() {
         Log.d(TAG, "ack: "+name)
         when (name) {
             PlcSettingAddressEnum.M3.address -> {
-                threadSettingParam.stopSetM3()
+                threadSettingParam.stopUp()
                 CoroutineScope(Dispatchers.IO).launch {
                     delay(3000)
                     threadSettingParam.startRstM3()
@@ -155,7 +158,7 @@ class RemotePushUtil @Inject constructor() {
         //没有关机
        if (kind_data == "1") {
             //开机
-           threadSettingParam.startSetM3()
+           threadSettingParam.startUp()
         }
 
     }
@@ -404,4 +407,48 @@ class RemotePushUtil @Inject constructor() {
         Log.d(TAG, "setAlarmClock: $numberCount")
         return numberCount
     }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun event(messageEvent: VBoxMessage) {
+        XLogUtil.d(messageEvent.cmd+":messageEvent.data:"+messageEvent.data)
+        when (messageEvent.cmd) {
+            VboxCommand.CMD_HEARTBEAT ->{
+                cmdHeartbeat(messageEvent)
+            }
+            else -> {}
+        }
+    }
+
+    private fun cmdHeartbeat(messageEvent: VBoxMessage) {
+        val deviceState = messageEvent.data.substring(0, 2)//机器状态码
+        Log.d(TAG, "deviceState:1 "+messageEvent.data)
+        Log.d(TAG, "deviceState:2 "+deviceState)
+        when(deviceState){
+            "00"->{//刚上电
+
+            }
+            "01"->{//开机中
+
+            }
+            "02"->{//就绪待机,可以选购或制作下一杯
+
+            }
+            "03"->{//报警中
+
+            }
+            "04"->{//开始制作
+
+            }
+            "05"->{//下玉米完毕
+
+            }
+            "07"->{//玉米爆开
+
+            }
+            "10"->{//制作完成
+
+            }
+            else->{}
+        }
+    }
 }

二進制
module_home/src/main/res/drawable/add.png


+ 17 - 7
module_home/src/main/res/layout/home_fragment_buy.xml

@@ -11,21 +11,31 @@
         android:layout_height="match_parent"
         android:layout_centerInParent="true"/>
 
+<!--    <ImageView-->
+<!--        android:id="@+id/iv_logo"-->
+<!--        android:layout_width="wrap_content"-->
+<!--        android:layout_height="wrap_content"-->
+<!--        android:layout_marginStart="20dp"-->
+<!--        android:layout_marginTop="20dp"-->
+<!--        android:src="@drawable/logo"-->
+<!--        app:layout_constraintStart_toStartOf="parent"-->
+<!--        app:layout_constraintTop_toTopOf="parent"-->
+<!--        tools:ignore="ContentDescription" />-->
+
     <ImageView
         android:id="@+id/iv_logo"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_marginStart="20dp"
+        android:layout_width="300dp"
+        android:layout_height="150dp"
+        android:layout_marginLeft="20dp"
         android:layout_marginTop="20dp"
         android:src="@drawable/logo"
         app:layout_constraintStart_toStartOf="parent"
-        app:layout_constraintTop_toTopOf="parent"
-        tools:ignore="ContentDescription" />
+        app:layout_constraintTop_toTopOf="parent" />
 
     <ImageView
         android:id="@+id/iv_buy_icon"
-        android:layout_width="280dp"
-        android:layout_height="280dp"
+        android:layout_width="480dp"
+        android:layout_height="480dp"
         android:layout_centerInParent="true"
         android:src="@drawable/btn_goumai" />
 

+ 146 - 61
module_home/src/main/res/layout/home_fragment_home.xml

@@ -9,8 +9,8 @@
 
     <ImageView
         android:id="@+id/home_imageview2"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="300dp"
+        android:layout_height="150dp"
         android:layout_marginLeft="20dp"
         android:layout_marginTop="20dp"
         android:src="@drawable/logo"
@@ -61,6 +61,7 @@
         android:id="@+id/home_rv_product"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
+        android:layout_marginBottom="500dp"
         android:maxWidth="1500dp"
         android:maxHeight="800dp"
         app:layout_constraintBottom_toBottomOf="parent"
@@ -70,10 +71,9 @@
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/cl_home_time"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
+        android:layout_width="550dp"
+        android:layout_height="250dp"
         android:layout_marginTop="20dp"
-        android:layout_marginRight="20dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintTop_toTopOf="parent">
 
@@ -83,8 +83,8 @@
             android:layout_height="wrap_content"
             android:text="2024-07-21 21:06:23"
             android:textColor="@color/white"
-            android:textSize="25sp"
-            app:layout_constraintEnd_toEndOf="parent"
+            android:textSize="50sp"
+            app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toTopOf="parent" />
 
         <TextView
@@ -93,11 +93,41 @@
             android:layout_height="wrap_content"
             android:text="@string/home_dev_id"
             android:textColor="@color/white"
-            android:textSize="25sp"
+            android:textSize="50sp"
             app:layout_constraintStart_toStartOf="parent"
             app:layout_constraintTop_toBottomOf="@+id/tv_time" />
     </androidx.constraintlayout.widget.ConstraintLayout>
 
+    <Button
+        android:id="@+id/btn_language_switch"
+        android:layout_width="200dp"
+        android:layout_height="150dp"
+        android:layout_marginTop="20dp"
+        android:layout_marginRight="50dp"
+        android:background="@drawable/home_shape_btn"
+        android:gravity="center"
+        android:text="语言切换"
+        android:textColor="@color/white"
+        android:textSize="40sp"
+        android:textStyle="bold"
+        app:layout_constraintEnd_toStartOf="@id/btn_cif"
+        app:layout_constraintTop_toTopOf="parent" />
+
+    <Button
+        android:id="@+id/btn_cif"
+        android:layout_width="200dp"
+        android:layout_height="150dp"
+        android:layout_marginTop="20dp"
+        android:layout_marginRight="50dp"
+        android:background="@drawable/home_shape_btn"
+        android:gravity="center"
+        android:text="联系方式"
+        android:textColor="@color/white"
+        android:textSize="40sp"
+        android:textStyle="bold"
+        app:layout_constraintEnd_toStartOf="@id/cl_home_time"
+        app:layout_constraintTop_toTopOf="parent" />
+
     <androidx.constraintlayout.widget.Guideline
         android:id="@+id/home_guideline"
         android:layout_width="wrap_content"
@@ -112,41 +142,88 @@
         android:orientation="horizontal"
         app:layout_constraintGuide_percent="0.98" />
 
-    <TextView
-        android:id="@+id/tv_aacpe_bill"
-        android:layout_width="200dp"
-        android:layout_height="wrap_content"
-        android:layout_marginLeft="10dp"
-        android:text="投入纸币:0"
-        android:textColor="#d4237a"
-        android:textSize="28sp"
-        app:layout_constraintBottom_toTopOf="@+id/tv_aacpe_coin"
-        app:layout_constraintStart_toStartOf="parent" />
-
-    <TextView
-        android:id="@+id/tv_aacpe_coin"
-        android:layout_width="200dp"
+    <LinearLayout
+        android:layout_width="950dp"
         android:layout_height="wrap_content"
-        android:layout_marginLeft="10dp"
-        android:text="投入硬币:0"
-        android:textColor="#d4237a"
-        android:textSize="28sp"
-        app:layout_constraintBottom_toTopOf="@+id/home_guideline2"
-        app:layout_constraintStart_toStartOf="parent" />
+        android:layout_marginTop="100dp"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/cl_shoppingCart">
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_weight="1"
+            android:layout_height="wrap_content">
+
+            <TextView
+                android:id="@+id/tv_aacpe_bill_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:text="投入纸币: "
+                android:textColor="@color/black"
+                android:textSize="50sp"
+                app:layout_constraintStart_toStartOf="parent" />
+
+            <TextView
+                android:id="@+id/tv_aacpe_bill"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:text="0.00"
+                android:textColor="#d4237a"
+                android:textSize="50sp"
+                app:layout_constraintBottom_toTopOf="@+id/tv_aacpe_coin"
+                app:layout_constraintStart_toStartOf="parent" />
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_weight="1"
+            android:layout_height="wrap_content">
+
+            <TextView
+                android:id="@+id/tv_aacpe_coin_tip"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="投入硬币: "
+                android:textColor="@color/black"
+                android:textSize="50sp"
+                app:layout_constraintBottom_toTopOf="@+id/tv_aacpe_coin"
+                app:layout_constraintStart_toStartOf="parent" />
+
+            <TextView
+                android:id="@+id/tv_aacpe_coin"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="10dp"
+                android:text="0.00"
+                android:textColor="#d4237a"
+                android:textSize="50sp"
+                app:layout_constraintBottom_toTopOf="@+id/home_guideline2"
+                app:layout_constraintStart_toStartOf="parent" />
+        </LinearLayout>
+    </LinearLayout>
 
     <androidx.constraintlayout.widget.ConstraintLayout
         android:id="@+id/cl_shoppingCart"
-        android:layout_width="570dp"
-        android:layout_height="120dp"
+        android:layout_width="1000dp"
+        android:layout_height="160dp"
+        android:layout_marginTop="900dp"
         android:layout_marginRight="10dp"
         android:background="@drawable/home_shape_gray"
-        app:layout_constraintBottom_toTopOf="@+id/home_guideline2"
-        app:layout_constraintEnd_toEndOf="parent">
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintEnd_toEndOf="parent"
+        app:layout_constraintHorizontal_bias="0.5"
+        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintVertical_bias="0.5"
+        tools:ignore="MissingConstraints">
 
         <ImageView
             android:id="@+id/iv_shopping_trolley"
-            android:layout_width="50dp"
-            android:layout_height="50dp"
+            android:layout_width="100dp"
+            android:layout_height="100dp"
             android:layout_marginLeft="20dp"
             android:src="@drawable/shopping_trolley_sun"
             app:layout_constraintBottom_toBottomOf="parent"
@@ -155,13 +232,13 @@
 
         <TextView
             android:id="@+id/tv_update_hint"
-            android:layout_width="30dp"
-            android:layout_height="30dp"
+            android:layout_width="50dp"
+            android:layout_height="50dp"
             android:background="@drawable/home_shape_btn_check_update_hint"
             android:gravity="center"
             android:text="0"
             android:textColor="@android:color/white"
-            android:textSize="16sp"
+            android:textSize="20sp"
             app:layout_constraintStart_toStartOf="@+id/iv_shopping_trolley"
             app:layout_constraintTop_toTopOf="@+id/iv_shopping_trolley" />
 
@@ -174,15 +251,15 @@
             android:gravity="center_vertical"
             android:text="未选择"
             android:textColor="#d4237a"
-            android:textSize="40sp"
+            android:textSize="50sp"
             app:layout_constraintBottom_toBottomOf="@+id/iv_shopping_trolley"
             app:layout_constraintStart_toEndOf="@+id/iv_shopping_trolley"
             app:layout_constraintTop_toTopOf="@+id/iv_shopping_trolley" />
 
         <Button
             android:id="@+id/tv_pay"
-            android:layout_width="170dp"
-            android:layout_height="110dp"
+            android:layout_width="550dp"
+            android:layout_height="160dp"
             android:layout_alignParentRight="true"
             android:layout_centerVertical="true"
             android:layout_marginRight="5dp"
@@ -190,7 +267,7 @@
             android:gravity="center"
             android:text="去付款"
             android:textColor="@color/white"
-            android:textSize="25sp"
+            android:textSize="80sp"
             android:textStyle="bold"
             app:layout_constraintBottom_toBottomOf="parent"
             app:layout_constraintEnd_toEndOf="parent"
@@ -222,7 +299,8 @@
 
         <RelativeLayout
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:visibility="gone">
 
             <ImageView
                 android:id="@+id/iv_wendu"
@@ -261,7 +339,8 @@
 
         <RelativeLayout
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:visibility="gone">
 
             <ImageView
                 android:id="@+id/iv_shidu"
@@ -304,36 +383,42 @@
 
             <ImageView
                 android:id="@+id/iv_lutou"
-                android:layout_width="90dp"
-                android:layout_height="90dp"
+                android:layout_width="150dp"
+                android:layout_height="150dp"
                 android:src="@drawable/icon_qxlutou_new" />
 
-            <TextView
-                android:id="@+id/tv_lutou"
+            <LinearLayout
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginTop="15dp"
                 android:layout_toRightOf="@id/iv_lutou"
-                android:text="40°C"
-                android:textColor="#d4237a"
-                android:textSize="34sp" />
+                android:orientation="vertical">
 
-            <TextView
-                android:id="@+id/tv_lutou_content"
-                android:layout_width="wrap_content"
-                android:layout_height="wrap_content"
-                android:layout_below="@id/tv_lutou"
-                android:layout_toRightOf="@id/iv_lutou"
-                android:lines="2"
-                android:text="炉头温度"
-                android:textColor="#d4237a"
-                android:textSize="24sp" />
+                <TextView
+                    android:id="@+id/tv_lutou"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="40°C"
+                    android:textColor="#d4237a"
+                    android:textSize="40sp" />
 
+                <TextView
+                    android:id="@+id/tv_lutou_content"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_below="@id/tv_lutou"
+                    android:lines="2"
+                    android:text="发生器温度"
+                    android:textColor="#d4237a"
+                    android:textSize="40sp" />
+            </LinearLayout>
         </RelativeLayout>
 
         <RelativeLayout
             android:id="@+id/rl_fashengqi"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            android:visibility="gone">
 
             <ImageView
                 android:id="@+id/iv_fashengqi"

+ 39 - 27
module_home/src/main/res/layout/home_item_home_product.xml

@@ -2,8 +2,8 @@
 <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:id="@+id/cl_product"
-    android:layout_width="400dp"
-    android:layout_height="540dp"
+    android:layout_width="600dp"
+    android:layout_height="940dp"
     android:layout_marginRight="20dp"
     android:layout_marginBottom="20dp"
     android:background="@drawable/dingdian_imge_price_bg">
@@ -11,12 +11,12 @@
 
     <ImageView
         android:id="@+id/iv_sugar"
-        android:layout_width="300dp"
-        android:layout_height="300dp"
+        android:layout_width="480dp"
+        android:layout_height="480dp"
         android:layout_centerHorizontal="true"
-        android:layout_marginTop="28dp"
-        android:src="@drawable/icon_coin"
+        android:layout_marginTop="60dp"
         android:background="@drawable/home_rectangle_blue_background"
+        android:src="@drawable/icon_coin"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toTopOf="parent" />
@@ -25,47 +25,59 @@
     <TextView
         android:id="@+id/tv_name"
         android:layout_width="match_parent"
-        android:paddingHorizontal="10dp"
-        android:layout_height="wrap_content"
-        android:minHeight="74dp"
-        android:maxHeight="100dp"
+        android:layout_height="200dp"
         android:layout_centerHorizontal="true"
-        android:text="蓝色棉花"
         android:gravity="center"
+        android:maxHeight="150dp"
+        android:minHeight="90dp"
+        android:paddingHorizontal="10dp"
+        android:text="商品名字"
         android:textColor="#fa7698"
-        android:textSize="44sp"
+        android:textSize="70sp"
         android:textStyle="bold"
-        android:layout_marginTop="10dp"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/iv_sugar" />
 
     <LinearLayout
-        android:layout_width="wrap_content"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
-        android:gravity="center"
         android:layout_marginTop="10dp"
+        android:layout_marginStart="50dp"
+        app:layout_constraintStart_toStartOf="parent"
         app:layout_constraintTop_toBottomOf="@+id/tv_name">
 
-        <ImageView
-            android:id="@+id/home_imageview"
-            android:layout_width="80dp"
-            android:layout_height="80dp"
-            android:layout_marginRight="5dp"
-            android:src="@drawable/icon_coin" />
+        <TextView
+            android:id="@+id/tv_unit"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="wrap_content"
+            android:text="¥"
+            android:textColor="#fa7698"
+            android:textSize="90sp"
+            android:textStyle="bold" />
 
         <TextView
             android:id="@+id/tv_price"
-            android:layout_width="wrap_content"
+            android:layout_width="0dp"
+            android:layout_weight="2"
             android:layout_height="wrap_content"
             android:layout_centerHorizontal="true"
-            android:text="0.0"
+            android:text="0.00"
             android:textColor="#fa7698"
-            android:textSize="60sp"
-            android:textStyle="bold"/>
+            android:textSize="90sp"
+            android:textStyle="bold" />
+        <ImageView
 
+            android:id="@+id/home_imageview"
+            android:layout_width="0dp"
+            android:layout_weight="1"
+            android:layout_height="100dp"
+            android:src="@drawable/add"
+            android:layout_marginTop="20dp"
+            android:layout_marginEnd="60dp"/>
     </LinearLayout>
 
+
+
 </androidx.constraintlayout.widget.ConstraintLayout>

+ 7 - 1
serialport-api/src/main/java/com/hboxs/serialport/plc/thread/ThreadHomeParam.kt

@@ -4,11 +4,12 @@ import androidx.lifecycle.Lifecycle
 import androidx.lifecycle.LifecycleObserver
 import androidx.lifecycle.OnLifecycleEvent
 import com.hboxs.serialport.plc.SerialPortSendQueue
-import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcHomeAddressEnum
 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.VboxSerialPortManager
+import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcHomeAddressEnum
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
@@ -77,6 +78,11 @@ class ThreadHomeParam : LifecycleObserver {
         }
     }
 
+    fun startMake(value:String) {
+        // 初始化参数
+        VboxSerialPortManager.getInstance().sendData(value)
+    }
+
     fun stopSetD91(){
         jobD91?.cancel()
     }

+ 15 - 8
serialport-api/src/main/java/com/hboxs/serialport/plc/thread/ThreadSettingParam.kt

@@ -8,6 +8,10 @@ import com.hboxs.serialport.plc.SerialPortSendQueue
 import com.hboxs.serialport.plc.frame.RstCommandFrame
 import com.quyunshuo.androidbaseframemvvm.base.addressenum.PlcSettingAddressEnum
 import com.hboxs.serialport.plc.frame.SetCommandFrame
+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 kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
@@ -18,7 +22,7 @@ import javax.inject.Inject
 class ThreadSettingParam @Inject constructor(): LifecycleObserver  {
 
     private val TAG = "ThreadGeneralParam"
-    var jobM3: Job? = null
+    var jobStartUp: Job? = null
         get() = field
     var isActiveM3: Boolean = true
         get() = field
@@ -35,19 +39,22 @@ class ThreadSettingParam @Inject constructor(): LifecycleObserver  {
         }
 
 
-    fun startSetM3() {
-        stopSetM3()
+    fun startUp() {
+        stopUp()
         // 启动协程
-        jobM3 = CoroutineScope(Dispatchers.Main).launch {
+        jobStartUp = CoroutineScope(Dispatchers.Main).launch {
             while (isActiveM3) {
-                SerialPortSendQueue.sendCommand(SetCommandFrame(PlcSettingAddressEnum.M3.address), 10, PlcSettingAddressEnum.M3.address)
+                VboxSerialPortSendQueue.getInstance()
+                    .sendCommand(VboxWriteCommand(VboxCommand.CMD_IO, "00FB0100"))
+//                VboxSerialPortManager.getInstance().sendData("00FB0100")
+                Log.d(TAG, "startUp: 开机中。")
                 // 执行定时任务的操作
                 delay(300) // 每隔0.3秒重复执行
             }
         }
     }
-    fun stopSetM3(){
-        jobM3?.cancel()
+    fun stopUp(){
+        jobStartUp?.cancel()
     }
 
     fun startRstM3() {
@@ -71,7 +78,7 @@ class ThreadSettingParam @Inject constructor(): LifecycleObserver  {
      */
     @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
     fun destroy() {
-        stopSetM3()
+        stopUp()
     }
 
 

+ 1 - 1
serialport-api/src/main/java/com/hboxs/serialport/sbc/SBCHeartbeat.kt

@@ -11,7 +11,7 @@ object SBCHeartbeat {
     var initIsSuccess: Boolean = false
 
     var devCode :String = ""//机器状态码
-     var saveDevData: String = "FF"//FF表示设备未保存设备数据 00 表示设备已保存设备数据
+    var saveDevData: String = "FF"//FF表示设备未保存设备数据 00 表示设备已保存设备数据
     var crateVersion: String = ""//设备机箱版本号
     var devType: String = ""//机型
     var devDogtag: String = ""//设备铭牌号