Commit 18faef8dfc45003df2b2aefeda7df638ab4b3b11
1 parent
21fdaeae
下载修改
Showing
16 changed files
with
2608 additions
and
2101 deletions
C5/app/build.gradle
... | ... | @@ -96,6 +96,7 @@ dependencies { |
96 | 96 | compile 'com.github.barteksc:android-pdf-viewer:2.7.0' |
97 | 97 | compile 'cn.yipianfengye.android:zxing-library:2.2' |
98 | 98 | compile 'com.jaredrummler:android-processes:1.1.1' |
99 | + implementation project(':util') | |
99 | 100 | } |
100 | 101 | |
101 | 102 | //#解决某些输入文件使用或覆盖了已过时的 API | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/App.java
... | ... | @@ -5,13 +5,9 @@ import android.app.ActivityManager.RunningAppProcessInfo; |
5 | 5 | import android.app.Application; |
6 | 6 | import android.content.Context; |
7 | 7 | |
8 | -import com.sunvote.udptransfer.UDPModule; | |
9 | -import com.sunvote.udptransfer.work.BaseStationProcessWork; | |
10 | -import com.sunvote.util.LogUtil; | |
11 | 8 | import com.sunvote.xpadcomm.XPadApi; |
12 | 9 | import com.uuzuche.lib_zxing.activity.ZXingLibrary; |
13 | 10 | |
14 | - | |
15 | 11 | import java.util.List; |
16 | 12 | |
17 | 13 | public class App extends Application { |
... | ... | @@ -19,20 +15,14 @@ public class App extends Application { |
19 | 15 | |
20 | 16 | @Override |
21 | 17 | public void onCreate() { |
22 | - BaseStationProcessWork.getInstance().setContext(this); | |
23 | 18 | XPad = XPadApi.getInstance(); |
24 | 19 | // XPad.getClient().disableLogtoFile(); |
25 | 20 | // XPad.getClient().disableModuleLog(); |
26 | - XPad.getClient().enablelogtoFile(); | |
27 | - XPad.getClient().enableModuleLog(); | |
28 | - XPad.getClient().setContext(this); | |
29 | 21 | ZXingLibrary.initDisplayOpinion(this); |
30 | 22 | final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); |
31 | 23 | Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { |
32 | 24 | @Override |
33 | 25 | public void uncaughtException(Thread thread, Throwable ex) { |
34 | - LogUtil.e(UDPModule.TAG, "carsh(thread id:" + thread.getId() + ",thread name:" + thread.getName() + ")"); | |
35 | - LogUtil.e(UDPModule.TAG, ex); | |
36 | 26 | if (uncaughtExceptionHandler != null) { |
37 | 27 | uncaughtExceptionHandler.uncaughtException(thread, ex); |
38 | 28 | } | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/MainActivity.java
... | ... | @@ -6,13 +6,14 @@ import android.app.Fragment; |
6 | 6 | import android.app.FragmentManager; |
7 | 7 | import android.app.FragmentTransaction; |
8 | 8 | import android.app.ProgressDialog; |
9 | -import android.app.usage.NetworkStats; | |
10 | 9 | import android.content.BroadcastReceiver; |
10 | +import android.content.Context; | |
11 | 11 | import android.content.DialogInterface; |
12 | 12 | import android.content.Intent; |
13 | 13 | import android.content.IntentFilter; |
14 | 14 | import android.content.pm.PackageManager; |
15 | 15 | import android.graphics.Color; |
16 | +import android.hardware.usb.UsbManager; | |
16 | 17 | import android.net.ConnectivityManager; |
17 | 18 | import android.net.Uri; |
18 | 19 | import android.os.Build; |
... | ... | @@ -32,7 +33,7 @@ import android.widget.ImageView; |
32 | 33 | import android.widget.TextView; |
33 | 34 | import android.widget.Toast; |
34 | 35 | |
35 | -import com.sunvote.udptransfer.Config; | |
36 | +import com.sunvote.sdk.HuaWeiSDK; | |
36 | 37 | import com.sunvote.util.EncryptUtils; |
37 | 38 | import com.sunvote.util.LogUtil; |
38 | 39 | import com.sunvote.util.SPUtils; |
... | ... | @@ -60,12 +61,11 @@ import com.sunvote.xpadapp.fragments.MultiContentDetailFragment; |
60 | 61 | import com.sunvote.xpadapp.fragments.MultiContentFragment; |
61 | 62 | import com.sunvote.xpadapp.fragments.MultiPingshengFragment; |
62 | 63 | import com.sunvote.xpadapp.fragments.MultiTitleFragment; |
63 | -import com.sunvote.xpadapp.fragments.ResultElectionCustomFragment; | |
64 | -import com.sunvote.xpadapp.fragments.UserResultVoteFragment; | |
65 | 64 | import com.sunvote.xpadapp.fragments.NoFileFragment; |
66 | 65 | import com.sunvote.xpadapp.fragments.OfflineFragment; |
67 | 66 | import com.sunvote.xpadapp.fragments.OnLineFragment; |
68 | 67 | import com.sunvote.xpadapp.fragments.PDFContextShowFragment; |
68 | +import com.sunvote.xpadapp.fragments.ResultElectionCustomFragment; | |
69 | 69 | import com.sunvote.xpadapp.fragments.ResultElectionFragment; |
70 | 70 | import com.sunvote.xpadapp.fragments.ResultMultiVoteFragment; |
71 | 71 | import com.sunvote.xpadapp.fragments.ResultVoteFragment; |
... | ... | @@ -73,6 +73,7 @@ import com.sunvote.xpadapp.fragments.ShowIdFragment; |
73 | 73 | import com.sunvote.xpadapp.fragments.SigninFragment; |
74 | 74 | import com.sunvote.xpadapp.fragments.SinginResultFragment; |
75 | 75 | import com.sunvote.xpadapp.fragments.SingleTitleFragment; |
76 | +import com.sunvote.xpadapp.fragments.UserResultVoteFragment; | |
76 | 77 | import com.sunvote.xpadapp.presenter.ServicePresent; |
77 | 78 | import com.sunvote.xpadapp.presenter.XPadPresenter; |
78 | 79 | import com.sunvote.xpadapp.server.BatteryReceiver; |
... | ... | @@ -93,6 +94,7 @@ import com.sunvote.xpadcomm.XPadApiInterface.ModelInfo; |
93 | 94 | import com.sunvote.xpadcomm.XPadApiInterface.OnLineInfo; |
94 | 95 | import com.sunvote.xpadcomm.XPadApiInterface.VoteInfo; |
95 | 96 | import com.sunvote.xpadcomm.XPadSystem; |
97 | +import com.sunvote.xpadcomm.usb.UsbTransferManager; | |
96 | 98 | |
97 | 99 | import java.io.File; |
98 | 100 | import java.io.UnsupportedEncodingException; |
... | ... | @@ -219,6 +221,8 @@ public class MainActivity extends BaseActivity implements ComListener { |
219 | 221 | private TextView terminalId; |
220 | 222 | private ImageView service; |
221 | 223 | |
224 | + private final int Msg_onServiceCommitOk = 63; | |
225 | + | |
222 | 226 | BatteryReceiver m_receiver; |
223 | 227 | NetWorkStateReceiver netWork_receiver; |
224 | 228 | StatusBarView statusBarView; |
... | ... | @@ -248,13 +252,17 @@ public class MainActivity extends BaseActivity implements ComListener { |
248 | 252 | mOnlineInfo.onLine = 0; |
249 | 253 | |
250 | 254 | presenter = new XPadPresenter(this); |
251 | - setOnlineFragment(); | |
255 | + | |
252 | 256 | darkTime = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "darkTime", 3); |
253 | 257 | brigntLevel = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "bright", 30); |
254 | 258 | ScreenUtil.setNormalMode(MainActivity.this, brigntLevel); |
255 | 259 | screenTimer = new Timer(true); |
256 | 260 | screenTimer.schedule(screenTask, 1000, 1000); // 延时1000ms后执行,1000ms执行一次 |
257 | 261 | |
262 | + UsbTransferManager.getInstance().setUsbManager((UsbManager)getSystemService(Context.USB_SERVICE)); | |
263 | + UsbTransferManager.getInstance().setContext(this); | |
264 | + UsbTransferManager.getInstance().startWork(); | |
265 | + | |
258 | 266 | IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); |
259 | 267 | m_receiver = new BatteryReceiver(); |
260 | 268 | registerReceiver(m_receiver, intentFilter); |
... | ... | @@ -266,7 +274,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
266 | 274 | |
267 | 275 | clearApkFile(); |
268 | 276 | FirmUpdateFragment.clearUpdateFile(); |
269 | - | |
277 | + setOnlineFragment(); | |
270 | 278 | if(!isUnlock()){ |
271 | 279 | setUnlockScreen(); |
272 | 280 | } |
... | ... | @@ -341,6 +349,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
341 | 349 | int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 0x00002000; |
342 | 350 | decorView.setSystemUiVisibility(uiOptions); |
343 | 351 | } |
352 | + XPadSystem.setNavgationGone(this); | |
344 | 353 | } |
345 | 354 | |
346 | 355 | public void showBottomUIMenu() { |
... | ... | @@ -363,7 +372,10 @@ public class MainActivity extends BaseActivity implements ComListener { |
363 | 372 | @Override |
364 | 373 | protected void onResume() { |
365 | 374 | hideBottomUIMenu(); |
366 | - setTerminalId(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
375 | + if(mOnlineInfo != null){ | |
376 | + setTerminalId(mOnlineInfo.keyId); | |
377 | + } | |
378 | + HuaWeiSDK.getInstance(this).open(); | |
367 | 379 | super.onResume(); |
368 | 380 | } |
369 | 381 | |
... | ... | @@ -382,6 +394,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
382 | 394 | protected void onStop() { |
383 | 395 | LogUtil.i(TAG, "onstop"); |
384 | 396 | XPadSystem.setNavgationVisible(this); |
397 | + HuaWeiSDK.getInstance(this).close(); | |
385 | 398 | super.onStop(); |
386 | 399 | } |
387 | 400 | |
... | ... | @@ -578,6 +591,9 @@ public class MainActivity extends BaseActivity implements ComListener { |
578 | 591 | case MSG_CLEAN_FILE: |
579 | 592 | Toast.makeText(MainActivity.this, "文件清除完成!", Toast.LENGTH_SHORT).show(); |
580 | 593 | break; |
594 | + case Msg_onServiceCommitOk: | |
595 | + servicePresent.onServiceSubmitSuccess(); | |
596 | + break; | |
581 | 597 | default: |
582 | 598 | |
583 | 599 | } |
... | ... | @@ -772,7 +788,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
772 | 788 | return; |
773 | 789 | } |
774 | 790 | currBillInfo = dbm.getBillInfo(meetingId, voteId); |
775 | - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
791 | + roleType = dbm.getKeypadRole(mOnlineInfo.keyId); | |
776 | 792 | if (currBillInfo == null) { |
777 | 793 | Toast.makeText(this, "显示批次结果失败,没有找到会议资料", Toast.LENGTH_LONG).show(); |
778 | 794 | return; |
... | ... | @@ -888,6 +904,9 @@ public class MainActivity extends BaseActivity implements ComListener { |
888 | 904 | private OfflineFragment offlineFragment; |
889 | 905 | |
890 | 906 | private void setOfflineFragment() { |
907 | + if(mOnlineInfo != null){ | |
908 | + setTerminalId(mOnlineInfo.keyId); | |
909 | + } | |
891 | 910 | service.setImageResource(R.drawable.scan_qrcode); |
892 | 911 | FragmentManager fm = getFragmentManager(); |
893 | 912 | FragmentTransaction transaction = fm.beginTransaction(); |
... | ... | @@ -925,6 +944,9 @@ public class MainActivity extends BaseActivity implements ComListener { |
925 | 944 | private OnLineFragment onLineFragment; |
926 | 945 | |
927 | 946 | private void setOnlineFragment() { |
947 | + if(mOnlineInfo != null){ | |
948 | + setTerminalId(mOnlineInfo.keyId); | |
949 | + } | |
928 | 950 | FragmentManager fm = getFragmentManager(); |
929 | 951 | FragmentTransaction transaction = fm.beginTransaction(); |
930 | 952 | transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); |
... | ... | @@ -939,8 +961,8 @@ public class MainActivity extends BaseActivity implements ComListener { |
939 | 961 | LogUtil.i(TAG, "setOnlineFragment"); |
940 | 962 | presenter.getBaseStatus(); |
941 | 963 | service.setImageResource(R.drawable.service_server); |
942 | - Intent intent = new Intent(this,MoniService.class); | |
943 | - startService(intent); | |
964 | +// Intent intent = new Intent(this,MoniService.class); | |
965 | +// startService(intent); | |
944 | 966 | } |
945 | 967 | |
946 | 968 | private void setShowIdFragment() { |
... | ... | @@ -1021,21 +1043,21 @@ public class MainActivity extends BaseActivity implements ComListener { |
1021 | 1043 | LogUtil.i(TAG, "ignore redownload"); |
1022 | 1044 | return; |
1023 | 1045 | } |
1024 | - if (mKeypadInfo == null) { | |
1046 | + if (mOnlineInfo == null) { | |
1025 | 1047 | presenter.getKeypadParam(); |
1026 | 1048 | } |
1027 | 1049 | if (wifiSsid == null || wifiSsid.length() == 0) { |
1028 | -// Toast.makeText(this, "wifiSsid is null ", Toast.LENGTH_SHORT).show(); | |
1029 | -// return; | |
1050 | + Toast.makeText(this, "wifiSsid is null ", Toast.LENGTH_SHORT).show(); | |
1051 | + return; | |
1030 | 1052 | } |
1031 | 1053 | if (wifiPwd == null || wifiPwd.length() == 0) { |
1032 | -// Toast.makeText(this, "wifiPwd is null ", Toast.LENGTH_SHORT).show(); | |
1033 | -// return; | |
1054 | + Toast.makeText(this, "wifiPwd is null ", Toast.LENGTH_SHORT).show(); | |
1055 | + return; | |
1034 | 1056 | } |
1035 | 1057 | if (serverIp == null || serverIp.length() == 0) { |
1036 | -// Toast.makeText(this, "serverIp is null ", Toast.LENGTH_SHORT).show(); | |
1037 | -// return; | |
1038 | - serverIp = Config.getInstance().serverIP; | |
1058 | + Toast.makeText(this, "serverIp is null ", Toast.LENGTH_SHORT).show(); | |
1059 | + return; | |
1060 | +// serverIp = Config.getInstance().serverIP; | |
1039 | 1061 | } |
1040 | 1062 | // if(serverPort == 0){ |
1041 | 1063 | // Toast.makeText(this, "serverPort is 0 ", Toast.LENGTH_SHORT); |
... | ... | @@ -1047,12 +1069,12 @@ public class MainActivity extends BaseActivity implements ComListener { |
1047 | 1069 | if (downloadFragment == null) { |
1048 | 1070 | downloadFragment = new DownloadFragment(); |
1049 | 1071 | serverPort = 4002; |
1050 | - downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1072 | + downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort,mOnlineInfo.keyId); | |
1051 | 1073 | transaction.add(R.id.frame_content, downloadFragment); |
1052 | 1074 | transaction.addToBackStack("downloadFragment"); |
1053 | 1075 | } else { |
1054 | 1076 | serverPort = 4002; |
1055 | - downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1077 | + downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, mOnlineInfo.keyId); | |
1056 | 1078 | transaction.replace(R.id.frame_content, downloadFragment); |
1057 | 1079 | } |
1058 | 1080 | transaction.commitAllowingStateLoss(); |
... | ... | @@ -1252,7 +1274,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
1252 | 1274 | return; |
1253 | 1275 | } |
1254 | 1276 | currBillInfo = dbm.getBillInfo(meetingId, vote.electInfo.voteid); |
1255 | - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1277 | + roleType = dbm.getKeypadRole(mOnlineInfo.keyId); | |
1256 | 1278 | if (currBillInfo == null) { |
1257 | 1279 | Toast.makeText(this, "没找到议案信息", Toast.LENGTH_LONG).show(); |
1258 | 1280 | return; |
... | ... | @@ -1365,7 +1387,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
1365 | 1387 | } |
1366 | 1388 | if (dbm == null || !dbm.checkDB() || dbm.confId != info.confId) { |
1367 | 1389 | dbm = new DBManager(this, info.confId);// 如果没打开,则打开数据库 |
1368 | - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1390 | + roleType = dbm.getKeypadRole(mOnlineInfo.keyId); | |
1369 | 1391 | } |
1370 | 1392 | if (!dbm.checkDB()) { |
1371 | 1393 | Message message = new Message(); |
... | ... | @@ -1376,7 +1398,7 @@ public class MainActivity extends BaseActivity implements ComListener { |
1376 | 1398 | } |
1377 | 1399 | if (meetingInfo == null || info.billId <= 1) { |
1378 | 1400 | meetingInfo = dbm.getMettingInfo(info.confId); |
1379 | - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1401 | + roleType = dbm.getKeypadRole(mOnlineInfo.keyId); | |
1380 | 1402 | } |
1381 | 1403 | |
1382 | 1404 | if (info.billId == 0) { // 没有议案的情况,显示欢迎界面 |
... | ... | @@ -1495,7 +1517,9 @@ public class MainActivity extends BaseActivity implements ComListener { |
1495 | 1517 | if (dbm == null || !dbm.checkDB() ) { |
1496 | 1518 | dbm = new DBManager(this, this.meetingId);// 如果没打开,则打开数据库 |
1497 | 1519 | } |
1498 | - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); | |
1520 | + if(mOnlineInfo != null){ | |
1521 | + roleType = dbm.getKeypadRole(mOnlineInfo.keyId); | |
1522 | + } | |
1499 | 1523 | // voteInfo.voteid = 1;//debug |
1500 | 1524 | if (voteInfo.voteid > 0 && voteInfo.voteid < 255) { |
1501 | 1525 | try { |
... | ... | @@ -1680,6 +1704,14 @@ public class MainActivity extends BaseActivity implements ComListener { |
1680 | 1704 | } |
1681 | 1705 | |
1682 | 1706 | mOnlineInfo = info; |
1707 | + runOnUiThread(new Runnable() { | |
1708 | + @Override | |
1709 | + public void run() { | |
1710 | + if(mOnlineInfo != null){ | |
1711 | + setTerminalId(mOnlineInfo.keyId); | |
1712 | + } | |
1713 | + } | |
1714 | + }); | |
1683 | 1715 | XPadSystem.setStatusBarDataIcon(this, info.tx, info.rx); |
1684 | 1716 | XPadSystem.setStatusBarChannel(this, info.chan); |
1685 | 1717 | XPadSystem.setStatusBarBaseId(this, getString(R.string.base_id) + ":" + info.baseId); |
... | ... | @@ -1742,6 +1774,15 @@ public class MainActivity extends BaseActivity implements ComListener { |
1742 | 1774 | LogUtil.i(TAG, "receve 0x32 wifi pwd:" + wifiPwd); |
1743 | 1775 | break; |
1744 | 1776 | case 0x33: // ip |
1777 | + boolean zero = false; | |
1778 | + for(int i = 0 ; i < data.length;i++){ | |
1779 | + if(data[i] == 0 || data[i] == 0x20){ | |
1780 | + zero = true; | |
1781 | + } | |
1782 | + if(zero){ | |
1783 | + data[i] = 0x20 ; | |
1784 | + } | |
1785 | + } | |
1745 | 1786 | serverIp = new String(data).trim(); |
1746 | 1787 | LogUtil.i(TAG, "receve 0x33 server ip:" + serverIp); |
1747 | 1788 | break; |
... | ... | @@ -1916,6 +1957,11 @@ public class MainActivity extends BaseActivity implements ComListener { |
1916 | 1957 | } |
1917 | 1958 | |
1918 | 1959 | @Override |
1960 | + public void onMultiPackageStartDownload(int downType, int downId) { | |
1961 | + | |
1962 | + } | |
1963 | + | |
1964 | + @Override | |
1919 | 1965 | public void onVoteSubmitError(XPadApi.VoteResultItem item) { |
1920 | 1966 | Message message = new Message(); |
1921 | 1967 | message.obj = item; |
... | ... | @@ -1987,6 +2033,13 @@ public class MainActivity extends BaseActivity implements ComListener { |
1987 | 2033 | // } |
1988 | 2034 | } |
1989 | 2035 | |
2036 | + @Override | |
2037 | + public void onServiceSubmitSuccess() { | |
2038 | + Message message = new Message(); | |
2039 | + message.what = Msg_onServiceCommitOk; | |
2040 | + myHandler.sendMessage(message); | |
2041 | + } | |
2042 | + | |
1990 | 2043 | private File checkUpdateApkFile() { |
1991 | 2044 | String filePath = Environment.getExternalStorageDirectory().getPath() + "/sunvote/apk/"; |
1992 | 2045 | File file = new File(filePath); |
... | ... | @@ -2060,9 +2113,10 @@ public class MainActivity extends BaseActivity implements ComListener { |
2060 | 2113 | LogUtil.i(TAG, "showPDFFragment"); |
2061 | 2114 | } |
2062 | 2115 | |
2116 | + private ServicePresent servicePresent; | |
2063 | 2117 | public void showServiceDialog() { |
2064 | 2118 | View servicePanel = findViewById(R.id.service_panel); |
2065 | - final ServicePresent servicePresent = new ServicePresent(this, servicePanel); | |
2119 | + servicePresent = new ServicePresent(this, servicePanel); | |
2066 | 2120 | DialogInterface.OnDismissListener dismissListener = new DialogInterface.OnDismissListener() { |
2067 | 2121 | @Override |
2068 | 2122 | public void onDismiss(DialogInterface dialog) { | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/fragments/AdminFragment.java
... | ... | @@ -17,12 +17,11 @@ import android.widget.ImageButton; |
17 | 17 | import android.widget.TextView; |
18 | 18 | import android.widget.Toast; |
19 | 19 | |
20 | -import com.sunvote.udptransfer.Config; | |
21 | 20 | import com.sunvote.util.LogUtil; |
21 | +import com.sunvote.util.XPadSystem; | |
22 | 22 | import com.sunvote.xpadapp.R; |
23 | 23 | import com.sunvote.xpadapp.base.BaseFragment; |
24 | 24 | import com.sunvote.xpadapp.server.MoniService; |
25 | -import com.sunvote.xpadcomm.XPadApi; | |
26 | 25 | |
27 | 26 | public class AdminFragment extends BaseFragment { |
28 | 27 | private TextView tvModalInfo; |
... | ... | @@ -31,6 +30,7 @@ public class AdminFragment extends BaseFragment { |
31 | 30 | private Button btnConfig; |
32 | 31 | private Button btnPowerOff; |
33 | 32 | private Button btnComTest; |
33 | + private Button match; | |
34 | 34 | |
35 | 35 | public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { |
36 | 36 | View view = inflater.inflate(R.layout.fragment_admin, container, false); |
... | ... | @@ -40,8 +40,9 @@ public class AdminFragment extends BaseFragment { |
40 | 40 | btnBack = view.findViewById(R.id.admin_btnback); |
41 | 41 | btnConfig = view.findViewById(R.id.admin_config_mode); |
42 | 42 | btnPowerOff = view.findViewById(R.id.admin_btnShutdown); |
43 | + match = view.findViewById(R.id.match); | |
43 | 44 | |
44 | - tvModalInfo.setText(getString(R.string.app_version) + getVersionName() + " "+ getString(R.string.server_ip) + Config.getInstance().serverIP); | |
45 | + tvModalInfo.setText(getString(R.string.app_version) + getVersionName()); | |
45 | 46 | btnBack.setOnClickListener(new OnClickListener() { |
46 | 47 | @Override |
47 | 48 | public void onClick(View v) { |
... | ... | @@ -58,13 +59,19 @@ public class AdminFragment extends BaseFragment { |
58 | 59 | |
59 | 60 | } |
60 | 61 | }); |
62 | + match.setOnClickListener(new OnClickListener() { | |
63 | + @Override | |
64 | + public void onClick(View v) { | |
65 | + mMainActivity.presenter.execKeypadMatch(0, 0); | |
66 | + } | |
67 | + }); | |
61 | 68 | btnPowerOff.setOnClickListener(new OnClickListener() { |
62 | 69 | |
63 | 70 | @Override |
64 | 71 | public void onClick(View v) { |
65 | 72 | AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); |
66 | - builder.setMessage("确认要退出应用吗?"); | |
67 | - builder.setTitle("退出应用"); | |
73 | + builder.setMessage("确认关机吗?"); | |
74 | + builder.setTitle("退出关机"); | |
68 | 75 | builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { |
69 | 76 | |
70 | 77 | @Override |
... | ... | @@ -72,7 +79,8 @@ public class AdminFragment extends BaseFragment { |
72 | 79 | dialog.dismiss(); |
73 | 80 | Intent intent = new Intent(getActivity(),MoniService.class); |
74 | 81 | getActivity().stopService(intent); |
75 | - getActivity().finish(); | |
82 | +// getActivity().finish(); | |
83 | + com.sunvote.xpadcomm.XPadSystem.powerOffXPad(getActivity()); | |
76 | 84 | } |
77 | 85 | }); |
78 | 86 | builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { |
... | ... | @@ -92,8 +100,30 @@ public class AdminFragment extends BaseFragment { |
92 | 100 | |
93 | 101 | @Override |
94 | 102 | public void onClick(View v) { |
95 | - XPadApi.getInstance().getClient().searchServarIp(); | |
96 | - Toast.makeText(getActivity(),"如果服务器IP地址变化,则自动转化一次",Toast.LENGTH_SHORT).show(); | |
103 | +// Toast.makeText(getActivity(),"如果服务器IP地址变化,则自动转化一次",Toast.LENGTH_SHORT).show(); | |
104 | + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); | |
105 | + builder.setMessage("确认要退出应用吗?"); | |
106 | + builder.setTitle("退出应用"); | |
107 | + builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { | |
108 | + | |
109 | + @Override | |
110 | + public void onClick(DialogInterface dialog, int which) { | |
111 | + dialog.dismiss(); | |
112 | + Intent intent = new Intent(getActivity(),MoniService.class); | |
113 | + getActivity().stopService(intent); | |
114 | + getActivity().finish(); | |
115 | + com.sunvote.xpadcomm.XPadSystem.setNavgationVisible(getActivity()); | |
116 | +// com.sunvote.xpadcomm.XPadSystem.powerOffXPad(getActivity()); | |
117 | + } | |
118 | + }); | |
119 | + builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { | |
120 | + | |
121 | + @Override | |
122 | + public void onClick(DialogInterface dialog, int which) { | |
123 | + dialog.dismiss(); | |
124 | + } | |
125 | + }); | |
126 | + builder.create().show(); | |
97 | 127 | } |
98 | 128 | }); |
99 | 129 | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/fragments/KeypadTestFragment.java
1 | 1 | package com.sunvote.xpadapp.fragments; |
2 | 2 | |
3 | -import com.sunvote.udptransfer.Config; | |
4 | -import com.sunvote.util.LogUtil; | |
5 | -import com.sunvote.xpadapp.R; | |
6 | -import com.sunvote.xpadapp.base.SuperBaseFragment; | |
7 | - | |
8 | 3 | import android.app.FragmentManager; |
9 | 4 | import android.app.FragmentTransaction; |
10 | 5 | import android.content.pm.PackageInfo; |
... | ... | @@ -12,11 +7,15 @@ import android.content.pm.PackageManager; |
12 | 7 | import android.os.Bundle; |
13 | 8 | import android.view.LayoutInflater; |
14 | 9 | import android.view.View; |
15 | -import android.view.ViewGroup; | |
16 | 10 | import android.view.View.OnClickListener; |
11 | +import android.view.ViewGroup; | |
17 | 12 | import android.widget.ImageButton; |
18 | 13 | import android.widget.TextView; |
19 | 14 | |
15 | +import com.sunvote.util.LogUtil; | |
16 | +import com.sunvote.xpadapp.R; | |
17 | +import com.sunvote.xpadapp.base.SuperBaseFragment; | |
18 | + | |
20 | 19 | public class KeypadTestFragment extends SuperBaseFragment { |
21 | 20 | private TextView tvId; |
22 | 21 | private TextView tvSn; | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/presenter/ServicePresent.java
... | ... | @@ -2,33 +2,23 @@ package com.sunvote.xpadapp.presenter; |
2 | 2 | |
3 | 3 | import android.content.Context; |
4 | 4 | import android.content.DialogInterface; |
5 | -import android.os.Looper; | |
5 | +import android.util.Log; | |
6 | 6 | import android.view.LayoutInflater; |
7 | 7 | import android.view.View; |
8 | 8 | import android.widget.ImageView; |
9 | 9 | |
10 | -import com.sunvote.cmd.BaseCmd; | |
11 | -import com.sunvote.cmd.ICmd; | |
12 | -import com.sunvote.cmd.state.GetPkgStateResponse; | |
13 | -import com.sunvote.cmd.upload.SingerUploadPkg; | |
14 | -import com.sunvote.cmd.upload.TransferResult; | |
15 | -import com.sunvote.protocal.Protocol; | |
16 | -import com.sunvote.udptransfer.UDPModule; | |
17 | -import com.sunvote.udptransfer.work.BaseStationProcessWork; | |
18 | -import com.sunvote.udptransfer.work.SDKProcessWork; | |
10 | +import com.sunvote.util.LogUtil; | |
19 | 11 | import com.sunvote.xpadapp.MainActivity; |
20 | 12 | import com.sunvote.xpadapp.R; |
21 | 13 | import com.sunvote.xpadcomm.XPadApi; |
22 | 14 | |
23 | -import java.util.logging.Handler; | |
24 | - | |
25 | 15 | /** |
26 | 16 | * Created by XXW on 2017/11/7. |
27 | 17 | */ |
28 | 18 | |
29 | 19 | public class ServicePresent implements View.OnClickListener{ |
30 | 20 | |
31 | - private Context context; | |
21 | + public MainActivity mMainActivity; | |
32 | 22 | |
33 | 23 | private View paper_linear; |
34 | 24 | private View pen_linear; |
... | ... | @@ -59,6 +49,7 @@ public class ServicePresent implements View.OnClickListener{ |
59 | 49 | private boolean technology; |
60 | 50 | |
61 | 51 | private static byte reqpos = 1 ; |
52 | + private byte selType; | |
62 | 53 | |
63 | 54 | private DialogInterface.OnDismissListener dismissListener; |
64 | 55 | |
... | ... | @@ -70,14 +61,14 @@ public class ServicePresent implements View.OnClickListener{ |
70 | 61 | this.dismissListener = dismissListener; |
71 | 62 | } |
72 | 63 | |
73 | - public ServicePresent(Context context) { | |
74 | - this.context = context; | |
64 | + public ServicePresent(MainActivity context) { | |
65 | + this.mMainActivity = context; | |
75 | 66 | rootView = LayoutInflater.from(context).inflate(R.layout.dialog_service,null); |
76 | 67 | init(); |
77 | 68 | } |
78 | 69 | |
79 | - public ServicePresent(Context context,View rootView) { | |
80 | - this.context = context; | |
70 | + public ServicePresent(MainActivity context,View rootView) { | |
71 | + this.mMainActivity = context; | |
81 | 72 | this.rootView = rootView; |
82 | 73 | init(); |
83 | 74 | } |
... | ... | @@ -137,7 +128,6 @@ public class ServicePresent implements View.OnClickListener{ |
137 | 128 | technology_linear.setOnClickListener(this); |
138 | 129 | submit.setOnClickListener(this); |
139 | 130 | initAdmin(); |
140 | - SDKProcessWork.getInstance().registerOnReceiveCmdListener(receiveCmdListener); | |
141 | 131 | } |
142 | 132 | |
143 | 133 | private void initAdmin(){ |
... | ... | @@ -151,8 +141,8 @@ public class ServicePresent implements View.OnClickListener{ |
151 | 141 | clickCount ++ ; |
152 | 142 | if(clickCount >= 5){ |
153 | 143 | clickCount = 0 ; |
154 | - if(context instanceof MainActivity){ | |
155 | - ((MainActivity)context).showAdmin(); | |
144 | + if(mMainActivity instanceof MainActivity){ | |
145 | + ((MainActivity)mMainActivity).showAdmin(); | |
156 | 146 | } |
157 | 147 | } |
158 | 148 | } |
... | ... | @@ -285,43 +275,16 @@ public class ServicePresent implements View.OnClickListener{ |
285 | 275 | |
286 | 276 | public void dismiss(){ |
287 | 277 | rootView.setVisibility(View.GONE); |
288 | - destroy(); | |
289 | 278 | } |
290 | 279 | |
291 | 280 | |
292 | 281 | public void sendServiceCmd(final byte type){ |
293 | - SingerUploadPkg singerUploadPkg = new SingerUploadPkg(); | |
294 | - singerUploadPkg.setKeyid(BaseStationProcessWork.getInstance().getBaseStationInfo().getKeyId()); | |
295 | - singerUploadPkg.setAnstype((byte)33); | |
296 | - singerUploadPkg.getAnsdata()[0] = 4; | |
297 | - singerUploadPkg.getAnsdata()[1] = type; | |
298 | - singerUploadPkg.getAnsdata()[2] = ++reqpos; | |
299 | - final Protocol<SingerUploadPkg> protocal = new Protocol(); | |
300 | - protocal.setEnableMatchCode(false); | |
301 | - protocal.setCmd(singerUploadPkg); | |
302 | - receiveCmdListener.type = type; | |
303 | - SDKProcessWork.getInstance().execute(protocal); | |
282 | + LogUtil.d("ServicePresent", "sendServiceCmd: type:"+ type); | |
283 | + selType = type; | |
284 | + mMainActivity.presenter.submitVote(XPadApi.AnsType_Service,String.valueOf(type)); | |
304 | 285 | } |
305 | - | |
306 | - class ReceiveCmdListener implements SDKProcessWork.OnReceiveCmdListener{ | |
307 | - | |
308 | - public byte type ; | |
309 | - @Override | |
310 | - public void onReceiver(Protocol protocol1) { | |
311 | - ICmd cmd = protocol1.getCmd(); | |
312 | - if(cmd instanceof GetPkgStateResponse || cmd instanceof TransferResult){ | |
313 | - new android.os.Handler(Looper.getMainLooper()).post(new Runnable() { | |
314 | - @Override | |
315 | - public void run() { | |
316 | - refreash(type); | |
317 | - } | |
318 | - }); | |
319 | - } | |
320 | - } | |
286 | + public void onServiceSubmitSuccess(){ | |
287 | + refreash(selType); | |
321 | 288 | } |
322 | - private ReceiveCmdListener receiveCmdListener = new ReceiveCmdListener(); | |
323 | 289 | |
324 | - public void destroy(){ | |
325 | - SDKProcessWork.getInstance().unregisterOnReceiveCmdListener(receiveCmdListener); | |
326 | - } | |
327 | 290 | } | ... | ... |
C5/app/src/main/java/com/sunvote/xpadapp/presenter/XPadPresenter.java
... | ... | @@ -220,6 +220,11 @@ public class XPadPresenter implements ComListener { |
220 | 220 | } |
221 | 221 | |
222 | 222 | @Override |
223 | + public void onMultiPackageStartDownload(int downType, int downId) { | |
224 | + | |
225 | + } | |
226 | + | |
227 | + @Override | |
223 | 228 | public void onVoteSubmitAllOkSuccess() { |
224 | 229 | cl.onVoteSubmitAllOkSuccess(); |
225 | 230 | } |
... | ... | @@ -229,6 +234,11 @@ public class XPadPresenter implements ComListener { |
229 | 234 | cl.onComCommunicationTest(sendn,checkOk); |
230 | 235 | } |
231 | 236 | |
237 | + @Override | |
238 | + public void onServiceSubmitSuccess() { | |
239 | + | |
240 | + } | |
241 | + | |
232 | 242 | private IntentFilter batteryLevelFilter; |
233 | 243 | |
234 | 244 | private void monitorBatteryState() { | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/ComListener.java
... | ... | @@ -14,17 +14,20 @@ public interface ComListener { |
14 | 14 | public void onModelEvent(ModelInfo info); |
15 | 15 | public void onBaseEvent( BaseInfo info); |
16 | 16 | public void onVoteEvent(VoteInfo info); |
17 | - public void onVoteSubmitSuccess(XPadApi.VoteResultItem voteResultItem); | |
18 | - public void onVoteSubmitError(XPadApi.VoteResultItem voteResultItem); | |
17 | + public void onVoteSubmitSuccess(XPadApi.VoteResultItem item); | |
18 | + public void onVoteSubmitError(XPadApi.VoteResultItem item); | |
19 | 19 | public void onVoteSubmitAllOkSuccess(); |
20 | 20 | public void onKeyPadEvent(KeypadInfo info); |
21 | 21 | public void onOnLineEvent(OnLineInfo info); |
22 | 22 | public void onCmdData(CmdDataInfo info); |
23 | 23 | public void onMultiPackageData(byte[] data, int len); |
24 | + public void onMultiPackageStartDownload(int downType,int downId);//进入下载状态 | |
24 | 25 | |
25 | 26 | public void onFirmUpdate(int percent); |
26 | 27 | public void onFirmUpdateResult(boolean success , String msg); |
27 | 28 | public void onFirmUpdateInfo(String info); |
28 | 29 | |
29 | 30 | public void onComCommunicationTest(int sendn,boolean checkOk); |
31 | + public void onServiceSubmitSuccess(); | |
32 | + | |
30 | 33 | } | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/DownloadFileModule.java
... | ... | @@ -229,23 +229,7 @@ public class DownloadFileModule { |
229 | 229 | } |
230 | 230 | |
231 | 231 | private void sendNextData(byte type ,int index) { |
232 | - byte[] buffer = new byte[10]; | |
233 | - buffer[0] = (byte) 0xFE; | |
234 | - buffer[1] = (byte) 0xAA; | |
235 | - buffer[2] = flag; | |
236 | - buffer[3] = type;// | |
237 | - buffer[4] = (byte) ((index >> 8) & 0xff); | |
238 | - buffer[5] = (byte) (index & 0xff); | |
239 | - if (servInetAddress == null) { | |
240 | - try { | |
241 | - servInetAddress = InetAddress.getByName(ip); | |
242 | - } catch (Exception e) { | |
243 | - LogUtil.e(TAG, e); | |
244 | - } | |
245 | - } | |
246 | - LogUtil.i(TAG,"sendNextData",buffer); | |
247 | - DatagramPacket packet = new DatagramPacket(buffer, buffer.length, servInetAddress, this.port); | |
248 | - downloadFileSendThread.sendData(packet); | |
232 | + downloadFileSendThread.sendData(flag,type,index,ip,port); | |
249 | 233 | } |
250 | 234 | |
251 | 235 | public void createAndCleanFolder(String folderName) { | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/DownloadFileSendThread.java
... | ... | @@ -6,6 +6,7 @@ import android.os.HandlerThread; |
6 | 6 | import java.io.IOException; |
7 | 7 | import java.net.DatagramPacket; |
8 | 8 | import java.net.DatagramSocket; |
9 | +import java.net.InetAddress; | |
9 | 10 | import java.net.SocketException; |
10 | 11 | |
11 | 12 | import com.sunvote.util.LogUtil; |
... | ... | @@ -31,10 +32,30 @@ public class DownloadFileSendThread extends HandlerThread { |
31 | 32 | handler = new Handler(getLooper()); |
32 | 33 | } |
33 | 34 | |
34 | - public boolean sendData(DatagramPacket packet){ | |
35 | - this.packet = packet; | |
36 | - handler.removeCallbacks(task); | |
37 | - handler.post(task); | |
35 | + public boolean sendData(final byte flag,final byte type,final int index,final String ip,final int port){ | |
36 | + handler.post(new Runnable() { | |
37 | + @Override | |
38 | + public void run() { | |
39 | + byte[] buffer = new byte[10]; | |
40 | + buffer[0] = (byte) 0xFE; | |
41 | + buffer[1] = (byte) 0xAA; | |
42 | + buffer[2] = flag; | |
43 | + buffer[3] = type;// | |
44 | + buffer[4] = (byte) ((index >> 8) & 0xff); | |
45 | + buffer[5] = (byte) (index & 0xff); | |
46 | + InetAddress servInetAddress; | |
47 | + try { | |
48 | + servInetAddress = InetAddress.getByName(ip); | |
49 | + } catch (Exception e) { | |
50 | + LogUtil.e(TAG, e); | |
51 | + return ; | |
52 | + } | |
53 | + LogUtil.i(TAG,"sendNextData",buffer); | |
54 | + packet = new DatagramPacket(buffer, buffer.length, servInetAddress, port); | |
55 | + handler.removeCallbacks(task); | |
56 | + handler.post(task); | |
57 | + } | |
58 | + }); | |
38 | 59 | return true; |
39 | 60 | } |
40 | 61 | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/XPadApi.java
... | ... | @@ -5,1836 +5,2260 @@ import android.os.Handler; |
5 | 5 | import android.os.HandlerThread; |
6 | 6 | import android.util.Log; |
7 | 7 | |
8 | -import com.sunvote.udptransfer.UDPModule; | |
9 | -import com.sunvote.udptransfer.stream.SunVoteInputStream; | |
8 | +import com.sunvote.util.ByteUtils; | |
10 | 9 | import com.sunvote.util.LogUtil; |
10 | +import com.sunvote.xpadcomm.usb.UsbTransferManager; | |
11 | 11 | |
12 | +import java.io.ByteArrayOutputStream; | |
13 | +import java.io.File; | |
14 | +import java.io.FileOutputStream; | |
12 | 15 | import java.io.IOException; |
16 | +import java.io.InputStream; | |
13 | 17 | import java.io.OutputStream; |
14 | 18 | import java.io.UnsupportedEncodingException; |
19 | +import java.security.InvalidParameterException; | |
15 | 20 | import java.util.ArrayList; |
16 | 21 | import java.util.Arrays; |
22 | +import java.util.Collections; | |
17 | 23 | import java.util.Iterator; |
18 | - | |
24 | +import java.util.List; | |
19 | 25 | |
20 | 26 | public class XPadApi implements XPadApiInterface { |
21 | - private static String TAG = "XPadApi"; | |
22 | - private ComListener m_listener; | |
23 | - private static XPadApi m_xpadApi = null; | |
24 | - | |
25 | - private OutputStream mOutputStream; | |
26 | - private SunVoteInputStream mInputStream; | |
27 | - private ReadThread mReadThread; | |
28 | - private ArrayList<VoteResultItem> sendQueen = new ArrayList<VoteResultItem>(); | |
29 | - private int serialNumber; | |
30 | - private int allOkSerialNumber; | |
27 | + private static String TAG = "XPadApi"; | |
28 | + private ComListener m_listener; | |
29 | + private static XPadApi m_xpadApi = null; | |
31 | 30 | |
32 | - private boolean isShowLog = true; | |
33 | - private boolean isShowOnlineLog = false; | |
31 | + private OutputStream mOutputStream; | |
32 | + private InputStream mInputStream; | |
33 | + private ReadThread mReadThread; | |
34 | + private List<VoteResultItem> sendQueen = Collections.synchronizedList(new ArrayList<VoteResultItem>());//new ArrayList<VoteResultItem>(); | |
35 | + private volatile int serialNumber; | |
36 | + private int allOkSerialNumber; | |
37 | + private int serviceSerialNumber; | |
34 | 38 | |
35 | - private OnLineInfo onLineInfo; | |
36 | - // private boolean hasGetBaseInfo = false; | |
39 | + private boolean isShowLog = true; | |
40 | + private boolean isShowOnlineLog = false; | |
37 | 41 | |
38 | - private UDPModule client ; | |
42 | + private OnLineInfo onLineInfo = new OnLineInfo(); | |
43 | + private KeypadInfo info = new KeypadInfo(); | |
44 | + private HandlerThread receiverThread = new HandlerThread("rea"); | |
45 | + private HandlerThread sendThread = new HandlerThread("send"); | |
46 | + private Handler taskHandler = null; | |
47 | + private byte[] baseSign ; | |
48 | + private byte[] voteSign ; | |
39 | 49 | |
40 | - private int writeFrimPageErrCnt = 0; | |
50 | + // private boolean hasGetBaseInfo = false; | |
41 | 51 | |
42 | - private HandlerThread sendThread = new HandlerThread("send"); | |
43 | - private Handler taskHandler = null; | |
52 | + private int writeFrimPageErrCnt = 0; | |
44 | 53 | |
45 | - // public SerialPortFinder mSerialPortFinder = new SerialPortFinder(); | |
54 | + // public SerialPortFinder mSerialPortFinder = new SerialPortFinder(); | |
46 | 55 | |
47 | - public synchronized static XPadApi getInstance() { | |
48 | - if (m_xpadApi == null) { | |
49 | - m_xpadApi = new XPadApi(); | |
50 | - m_xpadApi.init(); | |
51 | - } | |
52 | - return m_xpadApi; | |
53 | - } | |
54 | 56 | |
55 | - public XPadApi() { | |
56 | - sendThread.start(); | |
57 | - taskHandler = new Handler(sendThread.getLooper()); | |
58 | - } | |
59 | 57 | |
60 | - public void init() { | |
61 | - try { | |
62 | - allOkSerialNumber = -1; | |
63 | -// mSerialPort = getSerialPort(); | |
64 | -// mOutputStream = mSerialPort.getOutputStream(); | |
65 | -// mInputStream = mSerialPort.getInputStream(); | |
58 | + private XPadApi(){ | |
59 | + sendThread.start(); | |
60 | + taskHandler = new Handler(sendThread.getLooper()); | |
61 | + } | |
66 | 62 | |
67 | - client = new UDPModule(); | |
63 | + public synchronized static XPadApi getInstance() { | |
64 | + if (m_xpadApi == null) { | |
65 | + m_xpadApi = new XPadApi(); | |
66 | + m_xpadApi.init(); | |
67 | + } | |
68 | + return m_xpadApi; | |
69 | + } | |
68 | 70 | |
69 | - mOutputStream = client.getOutputStream(); | |
70 | - mInputStream = client.getInputStream(); | |
71 | - mInputStream.setOnBytesReceiver(new SunVoteInputStream.OnBytesReceiver() { | |
71 | + public void init() { | |
72 | + try { | |
73 | + LogUtil.d(TAG, "XPadApi.init()"); | |
74 | + allOkSerialNumber = -1; | |
75 | + serviceSerialNumber = -1; | |
76 | +// mSerialPort = getSerialPort(); | |
77 | +// module = new UDPModule(); | |
78 | +// mOutputStream = module.getOutputStream(); | |
79 | +// mInputStream = module.getInputStream(); | |
80 | +// mOutputStream = mSerialPort.getOutputStream(); | |
81 | +// mInputStream = mSerialPort.getInputStream(); | |
82 | + UsbTransferManager.getInstance().setOnUsbConnectListener(new UsbTransferManager.OnUsbConnectListener() { | |
72 | 83 | @Override |
73 | - public void onBytesReceiver(byte[] datas, int length) { | |
74 | -// int rxDataLen = datas[3] + 4;// len | |
75 | -// checkComData(datas,length); | |
76 | - LogUtil.i(TAG,"xpadapi rec:" ,datas); | |
77 | -// dowith(datas,length); | |
78 | - checkComData(datas,length); | |
84 | + public boolean onConnect(boolean isConnected) { | |
85 | + if(isConnected){ | |
86 | + byte[] mBuffer = new byte[0x1F + 4]; | |
87 | + Arrays.fill(mBuffer, (byte) 0x0); | |
88 | + mBuffer[0] = (byte) 0xF5; | |
89 | + mBuffer[1] = (byte) 0xAA; | |
90 | + mBuffer[2] = (byte) 0xAA; | |
91 | + mBuffer[3] = (byte) 0x1F; | |
92 | + | |
93 | + mBuffer[4] = 0x70; | |
94 | + mBuffer[5] = 0x03; | |
95 | + writeToCom(mBuffer); | |
96 | + } | |
97 | + try { | |
98 | + Thread.sleep(100); | |
99 | + } catch (InterruptedException e) { | |
100 | + e.printStackTrace(); | |
101 | + } | |
102 | + byte[] mBuffer = new byte[0x1F + 4]; | |
103 | + Arrays.fill(mBuffer, (byte) 0x0); | |
104 | + mBuffer[0] = (byte) 0xF5; | |
105 | + mBuffer[1] = (byte) 0xAA; | |
106 | + mBuffer[2] = (byte) 0xAA; | |
107 | + mBuffer[3] = (byte) 0x1F; | |
108 | + | |
109 | + mBuffer[4] = 0x70; | |
110 | + mBuffer[5] = 0x04; | |
111 | + writeToCom(mBuffer); | |
112 | + return true; | |
79 | 113 | } |
80 | 114 | }); |
81 | - Arrays.fill(broadcastData, (byte) 0x0);// 清空多包结果 | |
115 | + mOutputStream = UsbTransferManager.getInstance().getOutputStream(); | |
116 | + mInputStream = UsbTransferManager.getInstance().getInputStream(); | |
117 | + | |
118 | + Arrays.fill(broadcastData, (byte) 0x0);// 清空多包结果 | |
82 | 119 | |
83 | 120 | /* Create a receiving thread */ |
84 | -// mReadThread = new ReadThread(); | |
85 | -// mReadThread.start(); | |
121 | + mReadThread = new ReadThread(); | |
122 | + mReadThread.start(); | |
86 | 123 | |
124 | + Log.d(TAG, "XPadApi init"); | |
87 | 125 | // InitThread initThread = new InitThread(); |
126 | +// initThread.start(); | |
127 | + | |
128 | + } catch (SecurityException e) { | |
129 | + e.printStackTrace(); | |
130 | + } catch (Exception e) { | |
131 | + e.printStackTrace(); | |
132 | + } | |
133 | + } | |
134 | + | |
135 | + private class InitThread extends Thread { | |
136 | + @Override | |
137 | + public void run() { | |
138 | + try { | |
139 | + sleep(100); | |
140 | + getKeypadParam();// 唤醒 | |
141 | + sleep(100); | |
142 | + getKeypadParam(); | |
143 | + sleep(100); | |
144 | + getWorkMode(); | |
145 | + | |
146 | + } catch (Exception e) { | |
147 | + // TODO: handle exception | |
148 | + } | |
149 | + super.run(); | |
150 | + } | |
151 | + } | |
152 | + | |
153 | + | |
154 | + | |
155 | + public void closeCom() { | |
156 | + if (mReadThread != null) | |
157 | + mReadThread.interrupt(); | |
158 | + | |
159 | + | |
160 | +// if(module != null){ | |
161 | +// module.release(); | |
162 | +// } | |
163 | + | |
164 | +// if (mSerialPort != null) { | |
165 | +// mSerialPort.close(); | |
166 | +// mSerialPort = null; | |
167 | +// } | |
168 | + } | |
169 | + | |
170 | + public static void printDataBuf(byte[] buf, int len, String flag) { | |
171 | + String tmpStr = new String(); | |
172 | + for (int i = 0; i < len; i++) { | |
173 | + tmpStr += String.format("%x ", buf[i]); | |
174 | + } | |
175 | + LogUtil.d(TAG, flag + ":" + tmpStr); | |
176 | + } | |
177 | + | |
178 | + public static String getDataBufString(byte[] buf, int len, String flag) { | |
179 | + String tmpStr = new String(); | |
180 | + for (int i = 0; i < len; i++) { | |
181 | + tmpStr += String.format("%x ", buf[i]); | |
182 | + } | |
183 | + return flag + ":" + tmpStr; | |
184 | + } | |
185 | + | |
186 | + public static byte[] intToByteArray1(int i) { | |
187 | + byte[] result = new byte[4]; | |
188 | + result[0] = (byte) ((i >> 24) & 0xFF); | |
189 | + result[1] = (byte) ((i >> 16) & 0xFF); | |
190 | + result[2] = (byte) ((i >> 8) & 0xFF); | |
191 | + result[3] = (byte) (i & 0xFF); | |
192 | + return result; | |
193 | + } | |
194 | + | |
195 | + @Override | |
196 | + public void setComListener(ComListener cl) { | |
197 | + m_listener = cl; | |
198 | + | |
199 | + } | |
88 | 200 | |
89 | - } catch (SecurityException e) { | |
90 | - LogUtil.e(TAG,e); | |
91 | - } catch (Exception e) { | |
92 | - LogUtil.e(TAG,e); | |
93 | - } | |
94 | - } | |
95 | - | |
96 | - public UDPModule getClient() { | |
97 | - return client; | |
98 | - } | |
99 | - | |
100 | - public void closeCom() { | |
101 | - if (mReadThread != null) | |
102 | - mReadThread.interrupt(); | |
103 | - | |
104 | - if(client != null){ | |
105 | - client.release(); | |
106 | - } | |
107 | - } | |
108 | - | |
109 | - | |
110 | - public static void printDataBuf(byte[] buf, int len, String flag) { | |
111 | - String tmpStr = new String(); | |
112 | - for (int i = 0; i < len; i++) { | |
113 | - tmpStr += String.format("%x ", buf[i]); | |
114 | - } | |
115 | - LogUtil.d(TAG, flag + ":" + tmpStr); | |
116 | - } | |
117 | - | |
118 | - public static String getDataBufString(byte[] buf, int len, String flag) { | |
119 | - String tmpStr = new String(); | |
120 | - for (int i = 0; i < len; i++) { | |
121 | - tmpStr += String.format("%x ", buf[i]); | |
122 | - } | |
123 | - return flag + ":" + tmpStr; | |
124 | - } | |
125 | - | |
126 | - public static byte[] intToByteArray1(int i) { | |
127 | - byte[] result = new byte[4]; | |
128 | - result[0] = (byte) ((i >> 24) & 0xFF); | |
129 | - result[1] = (byte) ((i >> 16) & 0xFF); | |
130 | - result[2] = (byte) ((i >> 8) & 0xFF); | |
131 | - result[3] = (byte) (i & 0xFF); | |
132 | - return result; | |
133 | - } | |
134 | - | |
135 | - @Override | |
136 | - public void setComListener(ComListener cl) { | |
137 | - m_listener = cl; | |
138 | - | |
139 | - } | |
140 | - public VoteResultItem getVoteResultItem(){ | |
141 | - return new VoteResultItem(); | |
142 | - } | |
143 | - | |
144 | - private Runnable sendTask = new Runnable() { | |
145 | - @Override | |
146 | - public void run() { | |
147 | - // 从队列中取出待发送数据 | |
148 | - VoteResultItem voteResultItem = null; | |
149 | - boolean send = false; | |
150 | - synchronized (sendQueen) { | |
151 | - if(sendQueen.size() > 0) { | |
152 | - Iterator<VoteResultItem> it = sendQueen.iterator(); | |
153 | - while (it.hasNext()) { | |
154 | - voteResultItem = it.next(); | |
155 | - if ((!voteResultItem.sendOk && !send) || voteResultItem.ansType == AnsType_Select) { | |
156 | - // 取出数据发送 | |
157 | - if(send){ | |
158 | - try { | |
159 | - Thread.sleep(50); | |
160 | - } catch (InterruptedException e) { | |
161 | - e.printStackTrace(); | |
162 | - } | |
163 | - } | |
164 | - voteResultItem.status = 1 ; | |
165 | - writeToCom(voteResultItem.data); | |
166 | - voteResultItem.sendTimes++; | |
167 | - send = true; | |
168 | - } | |
169 | - } | |
170 | - } | |
171 | - } | |
172 | - // 轮询下一次发送数据 | |
173 | - taskHandler.removeCallbacks(this); | |
174 | - taskHandler.postDelayed(this,1000); | |
175 | - } | |
176 | - }; | |
177 | - | |
178 | - public class VoteResultItem { | |
179 | - public int serialNo; | |
180 | - public int status;// 0:未发送 1:已发送 | |
181 | - public int ansType; // | |
182 | - public int ansCount;// 批次提交的选项数 | |
183 | - public int allOK; //1 确认提交 | |
184 | - public byte[] data; | |
185 | - public boolean sendOk; | |
186 | - public int sendTimes = 0; | |
187 | - /** | |
188 | - * 用于回调标志结果显示 | |
189 | - */ | |
190 | - public String retBack = "" ; | |
191 | - } | |
192 | - | |
193 | - /* | |
194 | - * function:addToSendQueen params: 发送内容 功能:添加到发送队列 | |
195 | - */ | |
196 | - private void addToSendQueen(VoteResultItem item) { | |
197 | - boolean isComb = false;// 合并 | |
198 | - synchronized (sendQueen) { | |
199 | - if (item.ansType == AnsType_BatchSingle && item.allOK != 1) { | |
200 | - for (int i = 0; i < sendQueen.size(); i++) { | |
201 | - VoteResultItem it = (VoteResultItem) sendQueen.get(i); | |
202 | - if (it.status != 1 && it.ansType == AnsType_BatchSingle && it.ansCount < 6) { | |
203 | - it.data[9 + it.ansCount * 3] = item.data[9]; | |
204 | - it.data[10 + it.ansCount * 3] = item.data[10]; | |
205 | - it.data[11 + it.ansCount * 3] = item.data[11]; | |
206 | - it.ansCount++; | |
207 | - isComb = true; | |
208 | - LogUtil.d(TAG, "addToSendQueen isComb=true 合并:" + it.ansCount); | |
209 | - break; | |
210 | - } | |
211 | - } | |
212 | - } | |
213 | - } | |
214 | - | |
215 | - if (isComb == false) { | |
216 | - sendQueen.add(item); | |
217 | - } | |
218 | - LogUtil.d(TAG, "addToSendQueen serialNo=" + item.serialNo + " size=" + sendQueen.size()); | |
219 | - // 轮询下一次发送数据 | |
220 | - taskHandler.removeCallbacks(sendTask); | |
221 | - taskHandler.post(sendTask); | |
222 | - | |
223 | - } | |
224 | - | |
225 | - private void sendToModalSuccessResponse(int serialNo){ | |
226 | - LogUtil.i(TAG,"send vote sendToModalSuccessResponse:" + serialNo); | |
227 | - synchronized (sendQueen) { | |
228 | - for (int i = 0; i < sendQueen.size(); i++) { | |
229 | - VoteResultItem it = (VoteResultItem) sendQueen.get(i); | |
230 | - if (serialNo == it.serialNo) { | |
231 | - it.sendOk = true; | |
232 | - break; | |
233 | - } | |
234 | - } | |
235 | - } | |
236 | - } | |
237 | - /* | |
238 | - * function:addToSendQueen params:流水号 功能:根据流水号删除队列已发送成功的项 | |
239 | - */ | |
240 | - private VoteResultItem removeSentItem(int serialNo) { | |
241 | - LogUtil.d(TAG, "send success : " + serialNo); | |
242 | - VoteResultItem ret = null; | |
243 | - synchronized (sendQueen) { | |
244 | - Iterator<VoteResultItem> it = sendQueen.iterator(); | |
245 | - while (it.hasNext()) { | |
246 | - VoteResultItem voteResultItem = it.next(); | |
247 | - if (voteResultItem.status == 1 && voteResultItem.serialNo == serialNo) { | |
248 | - voteResultItem.sendOk = true; | |
249 | - boolean remove = sendQueen.remove(voteResultItem); | |
250 | - LogUtil.d(TAG, "remove success ? " + remove); | |
251 | - ret = voteResultItem; | |
252 | - break; | |
253 | - } | |
254 | - } | |
255 | - } | |
256 | - return ret; | |
257 | - } | |
258 | - | |
259 | - private void clearSentItems() { | |
260 | - synchronized (sendQueen){ | |
261 | - sendQueen.clear(); | |
262 | - } | |
263 | - } | |
264 | - | |
265 | - @Override | |
266 | - public void getWorkMode() { | |
267 | - byte[] mBuffer = new byte[0x1F + 4]; | |
268 | - Arrays.fill(mBuffer, (byte) 0x0); | |
269 | - mBuffer[0] = (byte) 0xF5; | |
270 | - mBuffer[1] = (byte) 0xAA; | |
271 | - mBuffer[2] = (byte) 0xAA; | |
272 | - mBuffer[3] = (byte) 0x1F; | |
273 | - | |
274 | - mBuffer[4] = 0x70; | |
275 | - mBuffer[5] = 0x01; | |
276 | - | |
277 | - writeToCom(mBuffer); | |
278 | - } | |
279 | - | |
280 | - @Override | |
281 | - public void setWorkMode(int iMode) { | |
282 | - | |
283 | - byte[] mBuffer = new byte[0x1F + 4]; | |
284 | - // Arrays.fill(mBuffer, (byte) 0x55); | |
285 | - Arrays.fill(mBuffer, (byte) 0x0); | |
286 | - mBuffer[0] = (byte) 0xF5; | |
287 | - mBuffer[1] = (byte) 0xAA; | |
288 | - mBuffer[2] = (byte) 0xAA; | |
289 | - mBuffer[3] = (byte) 0x1F; | |
290 | - | |
291 | - mBuffer[4] = 0x70; | |
292 | - mBuffer[5] = 0x02; | |
293 | - mBuffer[6] = (byte) iMode; | |
294 | - | |
295 | - writeToCom(mBuffer); | |
296 | - } | |
297 | - | |
298 | - @Override | |
299 | - public void getBaseStatus() { | |
300 | - byte[] mBuffer = new byte[0x1F + 4]; | |
301 | - Arrays.fill(mBuffer, (byte) 0x0); | |
302 | - mBuffer[0] = (byte) 0xF5; | |
303 | - mBuffer[1] = (byte) 0xAA; | |
304 | - mBuffer[2] = (byte) 0xAA; | |
305 | - mBuffer[3] = (byte) 0x1F; | |
306 | - | |
307 | - mBuffer[4] = 0x70; | |
308 | - mBuffer[5] = 0x03; | |
309 | - writeToCom(mBuffer); | |
310 | - } | |
311 | - | |
312 | - @Override | |
313 | - public void getVoteStatus() { | |
314 | - byte[] mBuffer = new byte[0x1F + 4]; | |
315 | - Arrays.fill(mBuffer, (byte) 0x0); | |
316 | - mBuffer[0] = (byte) 0xF5; | |
317 | - mBuffer[1] = (byte) 0xAA; | |
318 | - mBuffer[2] = (byte) 0xAA; | |
319 | - mBuffer[3] = (byte) 0x1F; | |
320 | - | |
321 | - mBuffer[4] = 0x70; | |
322 | - mBuffer[5] = 0x04; | |
323 | - writeToCom(mBuffer); | |
324 | - } | |
325 | - | |
326 | - @Override | |
327 | - public void getKeypadParam() { | |
328 | - byte[] mBuffer = new byte[0x1F + 4]; | |
329 | - Arrays.fill(mBuffer, (byte) 0x0); | |
330 | - mBuffer[0] = (byte) 0xF5; | |
331 | - mBuffer[1] = (byte) 0xAA; | |
332 | - mBuffer[2] = (byte) 0xAA; | |
333 | - mBuffer[3] = (byte) 0x1F; | |
334 | - | |
335 | - mBuffer[4] = 0x70; | |
336 | - mBuffer[5] = 0x05; | |
337 | - writeToCom(mBuffer); | |
338 | - } | |
339 | - | |
340 | - @Override | |
341 | - public void setKeypadParam(int keyId, byte[] KEYSN) { | |
342 | - byte[] mBuffer = new byte[0x1F + 4]; | |
343 | - Arrays.fill(mBuffer, (byte) 0x0); | |
344 | - mBuffer[0] = (byte) 0xF5; | |
345 | - mBuffer[1] = (byte) 0xAA; | |
346 | - mBuffer[2] = (byte) 0xAA; | |
347 | - mBuffer[3] = (byte) 0x1F; | |
348 | - | |
349 | - mBuffer[4] = 0x70; | |
350 | - mBuffer[5] = 0x06; | |
351 | - | |
352 | - mBuffer[6] = (byte) ((keyId >> 8) & 0xFF);// keyId | |
353 | - mBuffer[7] = (byte) (keyId & 0xFF); | |
354 | - | |
355 | - // mBuffer[8] =(byte) 0xFF; | |
356 | - System.arraycopy(KEYSN, 0, mBuffer, 8, 6); | |
357 | - | |
358 | - byte[] parecode = new byte[4]; | |
359 | - Arrays.fill(parecode, (byte) 0xFF); | |
360 | - System.arraycopy(KEYSN, 0, mBuffer, 14, 4); | |
361 | - | |
362 | - writeToCom(mBuffer); | |
363 | - } | |
364 | - | |
365 | - @Override | |
366 | - public void checkOnLine(int volt, int keyinStatus) { | |
367 | - if(isInComCommunicationTest){ | |
368 | - return; | |
369 | - } | |
370 | - byte[] mBuffer = new byte[0x1F + 4]; | |
371 | - Arrays.fill(mBuffer, (byte) 0x0); | |
372 | - mBuffer[0] = (byte) 0xF5; | |
373 | - mBuffer[1] = (byte) 0xAA; | |
374 | - mBuffer[2] = (byte) 0xAA; | |
375 | - mBuffer[3] = (byte) 0x1F; | |
376 | - | |
377 | - mBuffer[4] = 0x70; | |
378 | - mBuffer[5] = 0x07; | |
379 | - | |
380 | - mBuffer[6] = (byte) volt; | |
381 | - mBuffer[7] = (byte) keyinStatus; | |
382 | - writeToCom(mBuffer); | |
383 | - } | |
384 | - | |
385 | - @Override | |
386 | - public void execKeypadMatch(int iMode, int channal) { | |
387 | - byte[] mBuffer = new byte[0x1F + 4]; | |
388 | - Arrays.fill(mBuffer, (byte) 0x0); | |
389 | - mBuffer[0] = (byte) 0xF5; | |
390 | - mBuffer[1] = (byte) 0xAA; | |
391 | - mBuffer[2] = (byte) 0xAA; | |
392 | - mBuffer[3] = (byte) 0x1F; | |
393 | - | |
394 | - mBuffer[4] = 0x70; | |
395 | - mBuffer[5] = 0x08; | |
396 | - | |
397 | - mBuffer[6] = (byte) iMode; | |
398 | - mBuffer[7] = (byte) channal; | |
399 | - writeToCom(mBuffer); | |
400 | - } | |
401 | - | |
402 | - private boolean isInComCommunicationTest = false; | |
403 | - @Override | |
404 | - public void comCommunicationTest(int sendn,int okn) { | |
405 | - isInComCommunicationTest = (sendn != 200); | |
406 | - byte[] mBuffer = new byte[0x1F + 4]; | |
407 | - Arrays.fill(mBuffer, (byte) 0x0); | |
408 | - mBuffer[0] = (byte) 0xF5; | |
409 | - mBuffer[1] = (byte) 0xAA; | |
410 | - mBuffer[2] = (byte) 0xAA; | |
411 | - mBuffer[3] = (byte) 0x1F; | |
412 | - | |
413 | - mBuffer[4] = 0x30; | |
414 | - mBuffer[5] = 0x0; | |
415 | - mBuffer[6] = 0x0; | |
416 | - | |
417 | - mBuffer[7] = 7; | |
418 | - mBuffer[8] = (byte) sendn; | |
419 | - mBuffer[9] = (byte) okn; | |
420 | - mBuffer[10] = (byte)0xAA; | |
421 | - | |
422 | - for(int i=1;i<17;i++){ | |
423 | - mBuffer[10+i] = (byte)i; | |
424 | - } | |
425 | - | |
426 | - writeToCom(mBuffer); | |
427 | - } | |
428 | - | |
429 | - @Override | |
430 | - public synchronized void submitVote(int ansType, String info) {// byte[] ansData | |
431 | - | |
432 | - if (ansType == AnsType_Single) {// 单值 | |
433 | - byte[] mBuffer = new byte[0x1F + 4]; | |
434 | - Arrays.fill(mBuffer, (byte) 0x0); | |
435 | - mBuffer[0] = (byte) 0xF5; | |
436 | - mBuffer[1] = (byte) 0xAA; | |
437 | - mBuffer[2] = (byte) 0xAA; | |
438 | - mBuffer[3] = (byte) 0x1F; | |
439 | - | |
440 | - mBuffer[4] = 0x73; | |
441 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
442 | - | |
443 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
444 | - mBuffer[7] = (byte) ansType; | |
445 | - int val = Integer.parseInt(info); | |
446 | - mBuffer[8] = (byte) val; | |
447 | - | |
448 | - VoteResultItem it = new VoteResultItem(); | |
449 | - it.status = 0; | |
450 | - it.ansType = ansType; | |
451 | - it.ansCount = 1; | |
452 | - it.serialNo = (byte)(serialNumber); | |
453 | - serialNumberInc(); | |
454 | - it.data = mBuffer; | |
455 | - addToSendQueen(it); | |
456 | - } else if (ansType == AnsType_Select) { | |
457 | - String[] ary = info.split(","); | |
458 | - String val = ary[0]; | |
459 | - int tm = Integer.parseInt(ary[1]); | |
460 | - | |
461 | - byte[] mBuffer = new byte[0x1F + 4]; | |
462 | - Arrays.fill(mBuffer, (byte) 0x0); | |
463 | - mBuffer[0] = (byte) 0xF5; | |
464 | - mBuffer[1] = (byte) 0xAA; | |
465 | - mBuffer[2] = (byte) 0xAA; | |
466 | - mBuffer[3] = (byte) 0x1F; | |
467 | - | |
468 | - mBuffer[4] = 0x73; | |
469 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
470 | - | |
471 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
472 | - mBuffer[7] = (byte) ansType; | |
473 | - | |
474 | - ; | |
475 | - mBuffer[8] = (byte) ((tm >> 8) & 0xff); | |
476 | - mBuffer[9] = (byte) (tm & 0xff); | |
477 | - | |
478 | - mBuffer[10] = (byte) ((tm >> 8) & 0xff); | |
479 | - mBuffer[11] = (byte) (tm & 0xff); | |
480 | - | |
481 | - VoteResultItem it = new VoteResultItem(); | |
482 | - it.retBack = info; | |
483 | - it.status = 0; | |
484 | - it.ansType = ansType; | |
485 | - it.ansCount = 1; | |
486 | - it.serialNo = (byte)serialNumber; | |
487 | - serialNumberInc(); | |
488 | - it.data = mBuffer; | |
489 | - addToSendQueen(it); | |
490 | - } else if (ansType == AnsType_Number) { | |
491 | - byte[] mBuffer = new byte[0x1F + 4]; | |
492 | - Arrays.fill(mBuffer, (byte) 0x0); | |
493 | - mBuffer[0] = (byte) 0xF5; | |
494 | - mBuffer[1] = (byte) 0xAA; | |
495 | - mBuffer[2] = (byte) 0xAA; | |
496 | - mBuffer[3] = (byte) 0x1F; | |
497 | - | |
498 | - mBuffer[4] = 0x73; | |
499 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
500 | - | |
501 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
502 | - mBuffer[7] = (byte) ansType; | |
503 | - | |
504 | - byte[] val = util_encodeBCD(info.getBytes()); | |
505 | - System.arraycopy(val,0,mBuffer,8,8); | |
506 | - | |
507 | - VoteResultItem it = new VoteResultItem(); | |
508 | - it.status = 0; | |
509 | - it.ansType = ansType; | |
510 | - it.ansCount = 1; | |
511 | - it.serialNo = serialNumber; | |
512 | - serialNumberInc(); | |
513 | - it.data = mBuffer; | |
514 | - addToSendQueen(it); | |
515 | - } else if (ansType == AnsType_LoginIn) { | |
516 | - byte[] mBuffer = new byte[0x1F + 4]; | |
517 | - Arrays.fill(mBuffer, (byte) 0x0); | |
518 | - mBuffer[0] = (byte) 0xF5; | |
519 | - mBuffer[1] = (byte) 0xAA; | |
520 | - mBuffer[2] = (byte) 0xAA; | |
521 | - mBuffer[3] = (byte) 0x1F; | |
522 | - | |
523 | - mBuffer[4] = 0x73; | |
524 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
525 | - | |
526 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
527 | - mBuffer[7] = (byte) ansType; | |
528 | - mBuffer[8] = 3;//3 签到信息按BCD码格式 | |
529 | - byte[] val = util_encodeBCD(info.getBytes()); | |
530 | - System.arraycopy(val,0,mBuffer,9,9); | |
531 | - | |
532 | - VoteResultItem it = new VoteResultItem(); | |
533 | - it.status = 0; | |
534 | - it.ansType = ansType; | |
535 | - it.ansCount = 1; | |
536 | - it.serialNo = serialNumber; | |
537 | - serialNumberInc(); | |
538 | - it.data = mBuffer; | |
539 | - addToSendQueen(it); | |
540 | - | |
541 | - } else if (ansType == AnsType_BatchSingle) { | |
542 | - | |
543 | - // String[] ary= info.split(","); | |
544 | - | |
545 | - byte[] mBuffer = new byte[0x1F + 4]; | |
546 | - Arrays.fill(mBuffer, (byte) 0x0); | |
547 | - mBuffer[0] = (byte) 0xF5; | |
548 | - mBuffer[1] = (byte) 0xAA; | |
549 | - mBuffer[2] = (byte) 0xAA; | |
550 | - mBuffer[3] = (byte) 0x1F; | |
551 | - | |
552 | - mBuffer[4] = 0x73; | |
553 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
554 | - | |
555 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
556 | - mBuffer[7] = (byte) ansType; | |
557 | - mBuffer[8] = 0;// ALLOK | |
558 | - int pos = 9; | |
559 | - | |
560 | - String[] item = info.split(":"); | |
561 | - if (item.length > 1) { | |
562 | - int num = Integer.parseInt(item[0]); | |
563 | - int val = Integer.parseInt(item[1]); | |
564 | - mBuffer[pos++] = (byte) (num >> 8); | |
565 | - mBuffer[pos++] = (byte) (num & 0xff); | |
566 | - mBuffer[pos++] = (byte) val; | |
567 | - } | |
568 | - | |
569 | - VoteResultItem it = new VoteResultItem(); | |
570 | - it.status = 0; | |
571 | - it.ansType = ansType; | |
572 | - it.serialNo = serialNumber; | |
573 | - serialNumberInc(); | |
574 | - it.ansCount = 1; | |
575 | - it.data = mBuffer; | |
576 | - addToSendQueen(it); | |
577 | - } else if (ansType == AnsType_BatchNumber) { | |
578 | - byte[] mBuffer = new byte[0x1F + 4]; | |
579 | - Arrays.fill(mBuffer, (byte) 0x0); | |
580 | - mBuffer[0] = (byte) 0xF5; | |
581 | - mBuffer[1] = (byte) 0xAA; | |
582 | - mBuffer[2] = (byte) 0xAA; | |
583 | - mBuffer[3] = (byte) 0x1F; | |
584 | - | |
585 | - mBuffer[4] = 0x73; | |
586 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
587 | - | |
588 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
589 | - mBuffer[7] = (byte) ansType; | |
590 | - mBuffer[8] = 0;// ALLOK | |
591 | - | |
592 | - String[] item = info.split(":"); | |
593 | - if (item.length > 1) { | |
594 | - String[] itIndex = item[0].split("_"); | |
595 | - if(itIndex.length==2){ //综合测评 | |
596 | - int personId = Integer.parseInt(itIndex[0]); | |
597 | - int projectId =Integer.parseInt(itIndex[1]); | |
598 | - mBuffer[9] = (byte)personId; | |
599 | - mBuffer[10] = (byte)projectId; | |
600 | - }else { | |
601 | - int num = Integer.parseInt(item[0]); | |
602 | - mBuffer[9] = (byte) (num >> 8); | |
603 | - mBuffer[10] = (byte) (num & 0xff); | |
604 | - } | |
605 | - String strNum = item[1]; | |
606 | - byte[] val = util_encodeBCD(strNum.getBytes()); | |
607 | - System.arraycopy(val, 0, mBuffer, 11, 4); | |
608 | - } | |
609 | - | |
610 | - VoteResultItem it = new VoteResultItem(); | |
611 | - it.status = 0; | |
612 | - it.ansType = ansType; | |
613 | - it.serialNo = serialNumber; | |
614 | - serialNumberInc(); | |
615 | - it.ansCount = 1; | |
616 | - it.data = mBuffer; | |
617 | - addToSendQueen(it); | |
618 | - | |
619 | - } else if (ansType == AnsType_SelectOther) { | |
620 | - byte[] mBuffer = new byte[0x1F + 4]; | |
621 | - Arrays.fill(mBuffer, (byte) 0x0); | |
622 | - mBuffer[0] = (byte) 0xF5; | |
623 | - mBuffer[1] = (byte) 0xAA; | |
624 | - mBuffer[2] = (byte) 0xAA; | |
625 | - mBuffer[3] = (byte) 0x1F; | |
626 | - | |
627 | - mBuffer[4] = 0x73; | |
628 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
629 | - | |
630 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
631 | - mBuffer[7] = (byte) ansType; | |
632 | - mBuffer[8] = 0;// ALLOK | |
633 | - int pos = 9; | |
634 | - | |
635 | - String[] item = info.split(":"); | |
636 | - if (item.length > 1) { | |
637 | - int num = Integer.parseInt(item[0]); | |
638 | - String val = item[1]; | |
639 | - mBuffer[pos++] = (byte) (num >> 8); | |
640 | - mBuffer[pos++] = (byte) num; | |
641 | - | |
642 | - mBuffer[pos++] = 0;// slot | |
643 | - try { | |
644 | - byte[] name = val.getBytes("GB2312"); | |
645 | - | |
646 | - System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
647 | - | |
648 | - } catch (UnsupportedEncodingException e) { | |
649 | - LogUtil.e(TAG,e); | |
650 | - } | |
651 | - // 名字最多16 | |
652 | - } | |
653 | - | |
654 | - VoteResultItem it = new VoteResultItem(); | |
655 | - it.retBack = info; | |
656 | - it.status = 0; | |
657 | - it.ansType = ansType; | |
658 | - it.serialNo = (byte)serialNumber; | |
659 | - serialNumberInc(); | |
660 | - it.ansCount = 1; | |
661 | - it.data = mBuffer; | |
662 | - addToSendQueen(it); | |
663 | - | |
664 | - }else if(ansType == AnsType_Service){ | |
665 | - byte[] mBuffer = new byte[0x1F + 4]; | |
666 | - Arrays.fill(mBuffer, (byte) 0x0); | |
667 | - mBuffer[0] = (byte) 0xF5; | |
668 | - mBuffer[1] = (byte) 0xAA; | |
669 | - mBuffer[2] = (byte) 0xAA; | |
670 | - mBuffer[3] = (byte) 0x1F; | |
671 | - | |
672 | - mBuffer[4] = 0x73; | |
673 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
674 | - | |
675 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
676 | - mBuffer[7] = (byte) ansType; | |
677 | - mBuffer[8] = 4; | |
678 | - int serv_type = Integer.parseInt(info); | |
679 | - mBuffer[9] = (byte) serv_type; | |
680 | - | |
681 | - VoteResultItem it = new VoteResultItem(); | |
682 | - it.status = 0; | |
683 | - it.ansType = ansType; | |
684 | - it.serialNo = serialNumber; | |
685 | - serialNumberInc(); | |
686 | - it.ansCount = 1; | |
687 | - it.data = mBuffer; | |
688 | - addToSendQueen(it); | |
689 | - | |
690 | - } | |
691 | - } | |
692 | - | |
693 | - private int ChoiceValueToInt(String val) { | |
694 | - int ret = 0; | |
695 | - for (int i = 0; i < val.length(); i++) { | |
696 | - char cc = val.charAt(i); | |
697 | - if (cc < 'I') { | |
698 | - ret |= 1 << (8 + (cc - 'A')); | |
699 | - } else { | |
700 | - ret |= 1 << (cc - 'I'); | |
701 | - } | |
702 | - | |
703 | - } | |
704 | - | |
705 | - return ret; | |
706 | - } | |
707 | - | |
708 | - public void submitVoteFource(int ansType, String info) { | |
709 | - byte[] mBuffer = new byte[0x1F + 4]; | |
710 | - Arrays.fill(mBuffer, (byte) 0x0); | |
711 | - mBuffer[0] = (byte) 0xF5; | |
712 | - mBuffer[1] = (byte) 0xAA; | |
713 | - mBuffer[2] = (byte) 0xAA; | |
714 | - mBuffer[3] = (byte) 0x1F; | |
715 | - | |
716 | - mBuffer[4] = 0x73; | |
717 | - mBuffer[5] = (byte) serialNumber;// 流水号 | |
718 | - | |
719 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
720 | - mBuffer[7] = (byte) ansType; | |
721 | - mBuffer[8] = 0;// ALLOK | |
722 | - int pos = 9; | |
723 | - | |
724 | - String[] item = info.split(":"); | |
725 | - if (item.length > 1) { | |
726 | - int num = Integer.parseInt(item[0]); | |
727 | - String val = item[1]; | |
728 | - mBuffer[pos++] = (byte) (num >> 8); | |
729 | - mBuffer[pos++] = (byte) num; | |
730 | - | |
731 | - mBuffer[pos++] = 0;// slot | |
732 | - try { | |
733 | - byte[] name = val.getBytes("GB2312"); | |
734 | - | |
735 | - System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
736 | - | |
737 | - } catch (UnsupportedEncodingException e) { | |
738 | - // TODO Auto-generated catch block | |
739 | - LogUtil.e(TAG,e); | |
740 | - } | |
741 | - // 名字最多16 | |
742 | - } | |
743 | - | |
744 | - VoteResultItem it = new VoteResultItem(); | |
745 | - it.status = 0; | |
746 | - it.ansType = ansType; | |
747 | - it.serialNo = (byte)serialNumber; | |
748 | - serialNumberInc(); | |
749 | - it.ansCount = 1; | |
750 | - it.data = mBuffer; | |
751 | - addToSendQueen(it); | |
752 | - } | |
753 | - | |
754 | - @Override | |
755 | - public void submitVoteAllOK() { | |
756 | - int allokSerialNum = 0xff; | |
757 | - byte[] mBuffer = new byte[0x1F + 4]; | |
758 | - Arrays.fill(mBuffer, (byte) 0x0); | |
759 | - mBuffer[0] = (byte) 0xF5; | |
760 | - mBuffer[1] = (byte) 0xAA; | |
761 | - mBuffer[2] = (byte) 0xAA; | |
762 | - mBuffer[3] = (byte) 0x1F; | |
763 | - | |
764 | - mBuffer[4] = 0x73; | |
765 | - mBuffer[5] = (byte) allokSerialNum;// 流水号 | |
766 | - | |
767 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
768 | - mBuffer[7] = (byte) AnsType_BatchSingle; | |
769 | - mBuffer[8] = 1;// ALLOK | |
770 | - | |
771 | - VoteResultItem it = new VoteResultItem(); | |
772 | - it.status = 0; | |
773 | - it.ansType = AnsType_BatchSingle; | |
774 | - it.serialNo = ((byte)allokSerialNum & 0xff); | |
775 | - allOkSerialNumber = (byte)allokSerialNum; | |
776 | - it.ansCount = 1; | |
777 | - it.allOK = 1; | |
778 | - it.data = mBuffer; | |
779 | - addToSendQueen(it); | |
780 | - | |
781 | - } | |
782 | - | |
783 | - @Override | |
784 | - public void cancelSubmitVoteAllOK() { | |
785 | - int cancelAllokSerialNum = 0xfe; | |
786 | - byte[] mBuffer = new byte[0x1F + 4]; | |
787 | - Arrays.fill(mBuffer, (byte) 0x0); | |
788 | - mBuffer[0] = (byte) 0xF5; | |
789 | - mBuffer[1] = (byte) 0xAA; | |
790 | - mBuffer[2] = (byte) 0xAA; | |
791 | - mBuffer[3] = (byte) 0x1F; | |
792 | - | |
793 | - mBuffer[4] = 0x73; | |
794 | - mBuffer[5] = (byte) cancelAllokSerialNum;// 流水号 | |
795 | - | |
796 | - mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
797 | - mBuffer[7] = (byte) AnsType_BatchSingle; | |
798 | - mBuffer[8] = 0;// ALLOK | |
799 | - | |
800 | - VoteResultItem it = new VoteResultItem(); | |
801 | - it.status = 0; | |
802 | - it.ansType = AnsType_BatchSingle; | |
803 | - it.serialNo = cancelAllokSerialNum; | |
804 | - // allOkSerialNumber = serialNumber; | |
805 | - it.ansCount = 1; | |
806 | - it.allOK = 0; | |
807 | - it.data = mBuffer; | |
808 | - addToSendQueen(it); | |
809 | - | |
810 | - //serialNumber=0; | |
811 | - } | |
812 | - | |
813 | - private void serialNumberInc(){ | |
814 | - serialNumber++; | |
815 | - if(serialNumber == 0xfe){ | |
816 | - serialNumber = 0; | |
817 | - } | |
818 | - } | |
819 | - | |
820 | - @Override | |
821 | - public void submitSelectOther(String info) { | |
822 | - // TODO Auto-generated method stub | |
823 | - | |
824 | - } | |
825 | - | |
826 | - @Override | |
827 | - public void submitVoteBySn(byte[] keySn, String info) { | |
828 | - byte[] mBuffer = new byte[0x1F + 4]; | |
829 | - Arrays.fill(mBuffer, (byte) 0x0); | |
830 | - mBuffer[0] = (byte) 0xF5; | |
831 | - mBuffer[1] = (byte) 0xAA; | |
832 | - mBuffer[2] = (byte) 0xAA; | |
833 | - mBuffer[3] = (byte) 0x1F; | |
834 | - | |
835 | - mBuffer[4] = 0x73; | |
836 | - mBuffer[5] = 0x08;// 流水号 | |
837 | - | |
838 | - mBuffer[6] = 2;// MSGTYPE | |
839 | - | |
840 | - mBuffer[7] = 1;// ANSTYPE | |
841 | - | |
842 | - System.arraycopy(keySn, 0, mBuffer, 8, 6);// keysn | |
843 | - // System.arraycopy(ansData, 0, mBuffer, 8, | |
844 | - // ansData.length<=16?ansData.length:16); | |
845 | - // info??? | |
846 | - writeToCom(mBuffer); | |
847 | - } | |
848 | - | |
849 | - @Override | |
850 | - public void sendCmdData(int cmdId, byte[] data) { | |
851 | - byte[] mBuffer = new byte[0x1F + 4]; | |
852 | - Arrays.fill(mBuffer, (byte) 0x0); | |
853 | - mBuffer[0] = (byte) 0xF5; | |
854 | - mBuffer[1] = (byte) 0xAA; | |
855 | - mBuffer[2] = (byte) 0xAA; | |
856 | - mBuffer[3] = (byte) 0x1F; | |
857 | - | |
858 | - mBuffer[4] = (byte) 0xB0;// 0x30 表决器下载单包类指令 | |
859 | - | |
860 | - mBuffer[5] = 0x0;// keyid 填 0 | |
861 | - mBuffer[6] = 0x0;// keyid | |
862 | - | |
863 | - mBuffer[7] = (byte) cmdId;// KCMD | |
864 | - System.arraycopy(data, 0, mBuffer, 8, data.length);// keysn | |
865 | - | |
866 | - writeToCom(mBuffer); | |
867 | - } | |
868 | - | |
869 | - @Override | |
870 | - public void configMode() { | |
871 | - byte[] mBuffer = new byte[0x1F + 4]; | |
872 | - Arrays.fill(mBuffer, (byte) 0x0); | |
873 | - mBuffer[0] = (byte) 0xF5; | |
874 | - mBuffer[1] = (byte) 0xAA; | |
875 | - mBuffer[2] = (byte) 0xAA; | |
876 | - mBuffer[3] = (byte) 0x1F; | |
877 | - | |
878 | - mBuffer[4] = 0x70; | |
879 | - mBuffer[5] = 0x09; | |
880 | - | |
881 | - writeToCom(mBuffer); | |
882 | - | |
883 | - } | |
884 | - | |
885 | - private byte[] firmFileBuffer; | |
886 | - private int firmWritePage; | |
887 | - private int firmWritePageMax; | |
888 | - | |
889 | - @Override | |
890 | - public void startFirmUpdate(byte[] fileBuffer) { | |
891 | - | |
892 | - firmFileBuffer = fileBuffer; | |
893 | - firmWritePage = 0; | |
894 | - firmWritePageMax = firmFileBuffer.length / 32; | |
895 | - if (firmWritePageMax % 32 > 0) { | |
896 | - firmWritePageMax++; | |
897 | - } | |
898 | - | |
899 | - byte[] mBuffer = new byte[0x1F + 4]; | |
900 | - Arrays.fill(mBuffer, (byte) 0x0); | |
901 | - mBuffer[0] = (byte) 0xF5; | |
902 | - mBuffer[1] = (byte) 0xAA; | |
903 | - mBuffer[2] = (byte) 0xAA; | |
904 | - mBuffer[3] = (byte) 10; | |
905 | - | |
906 | - mBuffer[4] = 0x78; | |
907 | - mBuffer[5] = 0x01; | |
908 | - | |
909 | - writeToCom(mBuffer); | |
910 | - } | |
911 | - | |
912 | - private void keepFirmMode() { | |
913 | - byte[] mBuffer = new byte[0x1F + 4]; | |
914 | - Arrays.fill(mBuffer, (byte) 0x0); | |
915 | - mBuffer[0] = (byte) 0xF5; | |
916 | - mBuffer[1] = (byte) 0xAA; | |
917 | - mBuffer[2] = (byte) 0xAA; | |
918 | - mBuffer[3] = (byte) 10; | |
919 | - | |
920 | - mBuffer[4] = 0x78; | |
921 | - mBuffer[5] = 0x02; | |
922 | - | |
923 | - writeToCom(mBuffer); | |
924 | - } | |
925 | - | |
926 | - private void eraseFlash() { | |
927 | - int file_len = firmFileBuffer.length; | |
928 | - | |
929 | - byte[] mBuffer = new byte[0x1F + 4]; | |
930 | - Arrays.fill(mBuffer, (byte) 0x0); | |
931 | - mBuffer[0] = (byte) 0xF5; | |
932 | - mBuffer[1] = (byte) 0xAA; | |
933 | - mBuffer[2] = (byte) 0xAA; | |
934 | - mBuffer[3] = (byte) 10; | |
935 | - | |
936 | - mBuffer[4] = 0x78; | |
937 | - mBuffer[5] = 0x03; | |
938 | - mBuffer[6] = 0; | |
939 | - mBuffer[7] = (byte) (file_len / 1024); | |
940 | - | |
941 | - writeToCom(mBuffer); | |
942 | - } | |
943 | - | |
944 | - private void writeFlash(int page) { | |
945 | - byte[] mBuffer = new byte[38 + 4]; | |
946 | - Arrays.fill(mBuffer, (byte) 0x0); | |
947 | - mBuffer[0] = (byte) 0xF5; | |
948 | - mBuffer[1] = (byte) 0xAA; | |
949 | - mBuffer[2] = (byte) 0xAA; | |
950 | - mBuffer[3] = (byte) 38; | |
951 | - | |
952 | - mBuffer[4] = 0x78; | |
953 | - mBuffer[5] = 0x04; | |
954 | - | |
955 | - mBuffer[6] = (byte) (page / 256); | |
956 | - mBuffer[7] = (byte) (page % 256); | |
957 | - int pos = 0; | |
958 | - for (int i = 0; i < 32; i++) { | |
959 | - pos = page * 32 + i; | |
960 | - if (pos == firmFileBuffer.length - 1) { | |
961 | - break; | |
962 | - } | |
963 | - mBuffer[8 + i] = firmFileBuffer[pos]; | |
964 | - } | |
965 | - LogUtil.d(TAG,"write flash page:"+page); | |
966 | - writeToCom(mBuffer); | |
967 | - } | |
968 | - | |
969 | - /* | |
970 | - * status 1: success 2 : fail | |
971 | - */ | |
972 | - private void exitFirmUpdate(int status) { | |
973 | - byte[] mBuffer = new byte[0x1F + 4]; | |
974 | - Arrays.fill(mBuffer, (byte) 0x0); | |
975 | - mBuffer[0] = (byte) 0xF5; | |
976 | - mBuffer[1] = (byte) 0xAA; | |
977 | - mBuffer[2] = (byte) 0xAA; | |
978 | - mBuffer[3] = (byte) 10; | |
979 | - | |
980 | - mBuffer[4] = 0x78; | |
981 | - mBuffer[5] = 5; | |
982 | - mBuffer[6] = (byte) status; | |
983 | - writeToCom(mBuffer); | |
984 | - } | |
985 | - | |
986 | - public void writeToCom(byte[] data) { | |
987 | - if (mOutputStream != null) { | |
988 | - try { | |
989 | - int crcValue = Crc16.getUnsignedShort(Crc16.crc16(data, data.length - 4 - 2)); | |
990 | - data[data.length - 2] = (byte) (crcValue >> 8); | |
991 | - data[data.length - 1] = (byte) (crcValue); | |
992 | - | |
993 | - if (isShowLog) { | |
994 | - if (data[4] == 0x70 && data[5] == 0x07) { | |
995 | - // Log.d(TAG, "check online"); | |
996 | - if (isShowOnlineLog) { | |
997 | - printDataBuf(data, data.length, "send:"); | |
998 | - } | |
999 | - } else { | |
1000 | - printDataBuf(data, data.length, "send:"); | |
1001 | - } | |
1002 | - } | |
1003 | - | |
1004 | - mOutputStream.write(data); | |
1005 | - } catch (IOException e) { | |
1006 | - LogUtil.e(TAG,e); | |
1007 | - } | |
1008 | - | |
1009 | - m_listener.onSendData(data, data.length); | |
1010 | - } | |
1011 | - } | |
1012 | - | |
1013 | - private byte[] SerDataRx = new byte[100]; | |
1014 | - int iSerRxN = 0; | |
1015 | - private byte[] comBuffer = new byte[1024]; | |
1016 | - | |
1017 | - private class ReadThread extends Thread { | |
1018 | - | |
1019 | - @Override | |
1020 | - public void run() { | |
1021 | - super.run(); | |
1022 | - while (!isInterrupted()) { | |
1023 | - try { | |
1024 | - Arrays.fill(comBuffer, (byte) 0x0);// 清空结果 | |
1025 | - // byte[] buffer = new byte[512];// buffer 64字节 | |
1026 | - if (mInputStream == null) { | |
1027 | - return; | |
1028 | - } | |
1029 | - int size = mInputStream.read(comBuffer); | |
1030 | - | |
1031 | - dowith(comBuffer,size); | |
1032 | - } catch (IOException e) { | |
1033 | - LogUtil.e(TAG,e); | |
1034 | - return; | |
1035 | - } | |
1036 | - } | |
1037 | - } | |
201 | + public class VoteResultItem { | |
202 | + public int serialNo; | |
203 | + public int status;// 0:未发送 1:已发送 | |
204 | + public int ansType; // | |
205 | + public int ansCount;// 批次提交的选项数 | |
206 | + public int allOK; //1 确认提交 | |
207 | + public byte[] data; | |
208 | + public boolean sendOk; | |
209 | + public int sendTimes = 0; | |
210 | + /** | |
211 | + * 用于回调标志结果显示 | |
212 | + */ | |
213 | + public String retBack = "" ; | |
1038 | 214 | } |
1039 | 215 | |
1040 | - private void dowith(byte[] comBuffer, int size) { | |
1041 | - if (size > 0 && m_listener != null) { | |
1042 | - int recvLen = size; | |
1043 | - int rxDataLen = 0; | |
1044 | - for (int i = 0; i < recvLen; i++) { | |
1045 | - if (iSerRxN >= 512) { | |
1046 | - iSerRxN = 0; | |
216 | + private Runnable sendTask = new Runnable() { | |
217 | + @Override | |
218 | + public void run() { | |
219 | + // 从队列中取出待发送数据 | |
220 | + VoteResultItem voteResultItem = null; | |
221 | + boolean send = false; | |
222 | + synchronized (sendQueen) { | |
223 | + if(sendQueen.size() > 0) { | |
224 | + Iterator<VoteResultItem> it = sendQueen.iterator(); | |
225 | + while (it.hasNext()) { | |
226 | + voteResultItem = it.next(); | |
227 | + if ((!voteResultItem.sendOk && !send) || voteResultItem.ansType == AnsType_Select) { | |
228 | + // 取出数据发送 | |
229 | + if(send){ | |
230 | + try { | |
231 | + Thread.sleep(50); | |
232 | + } catch (InterruptedException e) { | |
233 | + e.printStackTrace(); | |
234 | + } | |
235 | + } | |
236 | + voteResultItem.status = 1 ; | |
237 | + if(voteResultItem.sendTimes < 1){ | |
238 | + writeToCom(voteResultItem.data); | |
239 | + } | |
240 | + voteResultItem.sendTimes++; | |
241 | + if(voteResultItem.sendTimes > 6){ | |
242 | + voteResultItem.sendTimes = 0 ; | |
243 | + } | |
244 | + send = true; | |
245 | + } | |
246 | + } | |
247 | + } | |
248 | + } | |
249 | + // 轮询下一次发送数据 | |
250 | + taskHandler.removeCallbacks(this); | |
251 | + taskHandler.postDelayed(this,1000); | |
252 | + } | |
253 | + }; | |
254 | + | |
255 | + /* | |
256 | + * function:addToSendQueen params: 发送内容 功能:添加到发送队列 | |
257 | + */ | |
258 | + private void addToSendQueen(VoteResultItem item) { | |
259 | + boolean isComb = false;// 合并 | |
260 | + synchronized (sendQueen) { | |
261 | + if (item.ansType == AnsType_BatchSingle && item.allOK != 1) { | |
262 | + for (int i = 0; i < sendQueen.size(); i++) { | |
263 | + VoteResultItem it = (VoteResultItem) sendQueen.get(i); | |
264 | + if (it.status != 1 && it.ansType == AnsType_BatchSingle && it.ansCount < 6) { | |
265 | + it.data[9 + it.ansCount * 3] = item.data[9]; | |
266 | + it.data[10 + it.ansCount * 3] = item.data[10]; | |
267 | + it.data[11 + it.ansCount * 3] = item.data[11]; | |
268 | + it.ansCount++; | |
269 | + isComb = true; | |
270 | + LogUtil.d(TAG, "addToSendQueen isComb=true 合并:" + it.ansCount); | |
271 | + break; | |
272 | + } | |
273 | + } | |
274 | + } | |
275 | + } | |
276 | + | |
277 | + if (isComb == false) { | |
278 | + sendQueen.add(item); | |
279 | + } | |
280 | + LogUtil.d(TAG, "addToSendQueen serialNo=" + item.serialNo + " size=" + sendQueen.size()); | |
281 | + // 轮询下一次发送数据 | |
282 | + taskHandler.removeCallbacks(sendTask); | |
283 | + taskHandler.post(sendTask); | |
284 | + } | |
285 | + | |
286 | + private void sendToModalSuccessResponse(int serialNo) { | |
287 | + LogUtil.d(TAG,"sendToModalSuccessResponse:" + serialNo); | |
288 | + synchronized (sendQueen) { | |
289 | + Iterator<VoteResultItem> it = sendQueen.iterator(); | |
290 | + while (it.hasNext()) { | |
291 | + VoteResultItem voteResultItem = it.next(); | |
292 | + if (voteResultItem.status == 1 && serialNo == voteResultItem.serialNo) { | |
293 | + voteResultItem.sendOk = true; | |
294 | + LogUtil.d(TAG, "set send ok sucess :" + serialNo); | |
295 | + break; | |
296 | + } | |
297 | + } | |
298 | + } | |
299 | + } | |
300 | + | |
301 | + /* | |
302 | + * function:addToSendQueen params:流水号 功能:根据流水号删除队列已发送成功的项 | |
303 | + */ | |
304 | + private VoteResultItem removeSentItem(int serialNo) { | |
305 | + LogUtil.d(TAG, "send success : " + serialNo); | |
306 | + VoteResultItem ret = null; | |
307 | + synchronized (sendQueen) { | |
308 | + Iterator<VoteResultItem> it = sendQueen.iterator(); | |
309 | + while (it.hasNext()) { | |
310 | + VoteResultItem voteResultItem = it.next(); | |
311 | + if (voteResultItem.status == 1 && voteResultItem.serialNo == serialNo) { | |
312 | + voteResultItem.sendOk = true; | |
313 | + boolean remove = sendQueen.remove(voteResultItem); | |
314 | + LogUtil.d(TAG, "remove success ? " + remove); | |
315 | + ret = voteResultItem; | |
1047 | 316 | break; |
1048 | 317 | } |
1049 | - int dd = Crc16.getUnsignedByte(comBuffer[i]); | |
318 | + } | |
319 | + } | |
320 | + return ret; | |
321 | + } | |
322 | + | |
323 | + private void clearSentItems() { | |
324 | + sendQueen.clear(); | |
325 | + } | |
326 | + | |
327 | + @Override | |
328 | + public void getWorkMode() { | |
329 | + byte[] mBuffer = new byte[0x1F + 4]; | |
330 | + Arrays.fill(mBuffer, (byte) 0x0); | |
331 | + mBuffer[0] = (byte) 0xF5; | |
332 | + mBuffer[1] = (byte) 0xAA; | |
333 | + mBuffer[2] = (byte) 0xAA; | |
334 | + mBuffer[3] = (byte) 0x1F; | |
335 | + | |
336 | + mBuffer[4] = 0x70; | |
337 | + mBuffer[5] = 0x01; | |
338 | + | |
339 | + writeToCom(mBuffer); | |
340 | + } | |
341 | + | |
342 | + @Override | |
343 | + public void setWorkMode(int iMode) { | |
344 | + | |
345 | + byte[] mBuffer = new byte[0x1F + 4]; | |
346 | + // Arrays.fill(mBuffer, (byte) 0x55); | |
347 | + Arrays.fill(mBuffer, (byte) 0x0); | |
348 | + mBuffer[0] = (byte) 0xF5; | |
349 | + mBuffer[1] = (byte) 0xAA; | |
350 | + mBuffer[2] = (byte) 0xAA; | |
351 | + mBuffer[3] = (byte) 0x1F; | |
352 | + | |
353 | + mBuffer[4] = 0x70; | |
354 | + mBuffer[5] = 0x02; | |
355 | + mBuffer[6] = (byte) iMode; | |
356 | + | |
357 | + writeToCom(mBuffer); | |
358 | + } | |
359 | + | |
360 | + @Override | |
361 | + public void getBaseStatus() { | |
362 | + if(baseSign != null){ | |
363 | + onBaseInfo(baseSign); | |
364 | + } | |
365 | + /* byte[] mBuffer = new byte[0x1F + 4]; | |
366 | + Arrays.fill(mBuffer, (byte) 0x0); | |
367 | + mBuffer[0] = (byte) 0xF5; | |
368 | + mBuffer[1] = (byte) 0xAA; | |
369 | + mBuffer[2] = (byte) 0xAA; | |
370 | + mBuffer[3] = (byte) 0x1F; | |
371 | + | |
372 | + mBuffer[4] = 0x70; | |
373 | + mBuffer[5] = 0x03; | |
374 | + writeToCom(mBuffer);*/ | |
375 | + } | |
376 | + | |
377 | + @Override | |
378 | + public void getVoteStatus() { | |
379 | + if(voteSign != null){ | |
380 | + onVoteInfo(voteSign); | |
381 | + } | |
382 | + /*byte[] mBuffer = new byte[0x1F + 4]; | |
383 | + Arrays.fill(mBuffer, (byte) 0x0); | |
384 | + mBuffer[0] = (byte) 0xF5; | |
385 | + mBuffer[1] = (byte) 0xAA; | |
386 | + mBuffer[2] = (byte) 0xAA; | |
387 | + mBuffer[3] = (byte) 0x1F; | |
388 | + | |
389 | + mBuffer[4] = 0x70; | |
390 | + mBuffer[5] = 0x04; | |
391 | + writeToCom(mBuffer);*/ | |
392 | + | |
393 | + | |
394 | + } | |
395 | + | |
396 | + @Override | |
397 | + public void getKeypadParam() { | |
398 | + byte[] mBuffer = new byte[0x1F + 4]; | |
399 | + Arrays.fill(mBuffer, (byte) 0x0); | |
400 | + mBuffer[0] = (byte) 0xF5; | |
401 | + mBuffer[1] = (byte) 0xAA; | |
402 | + mBuffer[2] = (byte) 0xAA; | |
403 | + mBuffer[3] = (byte) 0x1F; | |
404 | + | |
405 | + mBuffer[4] = 0x70; | |
406 | + mBuffer[5] = 0x05; | |
407 | + writeToCom(mBuffer); | |
408 | + } | |
409 | + | |
410 | + @Override | |
411 | + public void setKeypadParam(int keyId, byte[] KEYSN) { | |
412 | + byte[] mBuffer = new byte[0x1F + 4]; | |
413 | + Arrays.fill(mBuffer, (byte) 0x0); | |
414 | + mBuffer[0] = (byte) 0xF5; | |
415 | + mBuffer[1] = (byte) 0xAA; | |
416 | + mBuffer[2] = (byte) 0xAA; | |
417 | + mBuffer[3] = (byte) 0x1F; | |
418 | + | |
419 | + mBuffer[4] = 0x70; | |
420 | + mBuffer[5] = 0x06; | |
421 | + | |
422 | + mBuffer[6] = (byte) ((keyId >> 8) & 0xFF);// keyId | |
423 | + mBuffer[7] = (byte) (keyId & 0xFF); | |
424 | + | |
425 | + // mBuffer[8] =(byte) 0xFF; | |
426 | + System.arraycopy(KEYSN, 0, mBuffer, 8, 6); | |
427 | + | |
428 | + byte[] parecode = new byte[4]; | |
429 | + Arrays.fill(parecode, (byte) 0xFF); | |
430 | + System.arraycopy(KEYSN, 0, mBuffer, 14, 4); | |
431 | + | |
432 | + writeToCom(mBuffer); | |
433 | + } | |
434 | + | |
435 | + @Override | |
436 | + public void checkOnLine(int volt, int keyinStatus) { | |
437 | + LogUtil.i(TAG ,"HEART BEAT(S):" + volt + " " + System.currentTimeMillis()); | |
438 | + if (isInComCommunicationTest) { | |
439 | + return; | |
440 | + } | |
441 | + byte[] mBuffer = new byte[0x1F + 4]; | |
442 | + Arrays.fill(mBuffer, (byte) 0x0); | |
443 | + mBuffer[0] = (byte) 0xF5; | |
444 | + mBuffer[1] = (byte) 0xAA; | |
445 | + mBuffer[2] = (byte) 0xAA; | |
446 | + mBuffer[3] = (byte) 0x1F; | |
447 | + | |
448 | + mBuffer[4] = 0x70; | |
449 | + mBuffer[5] = 0x07; | |
450 | + | |
451 | + mBuffer[6] = (byte) volt; | |
452 | + mBuffer[7] = (byte) keyinStatus; | |
453 | + writeToCom(mBuffer); | |
454 | + } | |
455 | + | |
456 | + @Override | |
457 | + public void execKeypadMatch(int iMode, int channal) { | |
458 | + byte[] mBuffer = new byte[0x1F + 4]; | |
459 | + Arrays.fill(mBuffer, (byte) 0x0); | |
460 | + mBuffer[0] = (byte) 0xF5; | |
461 | + mBuffer[1] = (byte) 0xAA; | |
462 | + mBuffer[2] = (byte) 0xAA; | |
463 | + mBuffer[3] = (byte) 0x1F; | |
464 | + | |
465 | + mBuffer[4] = 0x70; | |
466 | + mBuffer[5] = 0x08; | |
467 | + | |
468 | + mBuffer[6] = (byte) iMode; | |
469 | + mBuffer[7] = (byte) channal; | |
470 | + writeToCom(mBuffer); | |
471 | + } | |
472 | + | |
473 | + private boolean isInComCommunicationTest = false; | |
474 | + | |
475 | + @Override | |
476 | + public void comCommunicationTest(int sendn, int okn) { | |
477 | + isInComCommunicationTest = (sendn != 200); | |
478 | + byte[] mBuffer = new byte[0x1F + 4]; | |
479 | + Arrays.fill(mBuffer, (byte) 0x0); | |
480 | + mBuffer[0] = (byte) 0xF5; | |
481 | + mBuffer[1] = (byte) 0xAA; | |
482 | + mBuffer[2] = (byte) 0xAA; | |
483 | + mBuffer[3] = (byte) 0x1F; | |
484 | + | |
485 | + mBuffer[4] = 0x30; | |
486 | + mBuffer[5] = 0x0; | |
487 | + mBuffer[6] = 0x0; | |
488 | + | |
489 | + mBuffer[7] = 7; | |
490 | + mBuffer[8] = (byte) sendn; | |
491 | + mBuffer[9] = (byte) okn; | |
492 | + mBuffer[10] = (byte) 0xAA; | |
493 | + | |
494 | + for (int i = 1; i < 17; i++) { | |
495 | + mBuffer[10 + i] = (byte) i; | |
496 | + } | |
497 | + | |
498 | + writeToCom(mBuffer); | |
499 | + } | |
500 | + | |
501 | + @Override | |
502 | + public void submitVote(int ansType, String info) {// byte[] ansData | |
503 | + | |
504 | + LogUtil.i(TAG,"ansType:" + ansType + ",info:" + info); | |
505 | + if (ansType == AnsType_Single) {// 单值 | |
506 | + byte[] mBuffer = new byte[0x1F + 4]; | |
507 | + Arrays.fill(mBuffer, (byte) 0x0); | |
508 | + mBuffer[0] = (byte) 0xF5; | |
509 | + mBuffer[1] = (byte) 0xAA; | |
510 | + mBuffer[2] = (byte) 0xAA; | |
511 | + mBuffer[3] = (byte) 0x1F; | |
512 | + | |
513 | + mBuffer[4] = 0x73; | |
514 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
515 | + | |
516 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
517 | + mBuffer[7] = (byte) ansType; | |
518 | + int val = Integer.parseInt(info); | |
519 | + mBuffer[8] = (byte) val; | |
520 | + | |
521 | + VoteResultItem it = new VoteResultItem(); | |
522 | + it.status = 0; | |
523 | + it.ansType = ansType; | |
524 | + it.ansCount = 1; | |
525 | + it.serialNo = serialNumber; | |
526 | + serialNumberInc(); | |
527 | + it.data = mBuffer; | |
528 | + addToSendQueen(it); | |
529 | + } else if (ansType == AnsType_Select) { | |
530 | + String[] ary = info.split(","); | |
531 | + String val = ary[0]; | |
532 | + int tm = Integer.parseInt(ary[1]); | |
533 | + | |
534 | + byte[] mBuffer = new byte[0x1F + 4]; | |
535 | + Arrays.fill(mBuffer, (byte) 0x0); | |
536 | + mBuffer[0] = (byte) 0xF5; | |
537 | + mBuffer[1] = (byte) 0xAA; | |
538 | + mBuffer[2] = (byte) 0xAA; | |
539 | + mBuffer[3] = (byte) 0x1F; | |
540 | + | |
541 | + mBuffer[4] = 0x73; | |
542 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
543 | + | |
544 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
545 | + mBuffer[7] = (byte) ansType; | |
546 | + | |
547 | + ; | |
548 | + mBuffer[8] = (byte) ((tm >> 8) & 0xff); | |
549 | + mBuffer[9] = (byte) (tm & 0xff); | |
550 | + | |
551 | + mBuffer[10] = (byte) ((tm >> 8) & 0xff); | |
552 | + mBuffer[11] = (byte) (tm & 0xff); | |
553 | + | |
554 | + VoteResultItem it = new VoteResultItem(); | |
555 | + it.status = 0; | |
556 | + it.ansType = ansType; | |
557 | + it.ansCount = 1; | |
558 | + it.serialNo = serialNumber; | |
559 | + serialNumberInc(); | |
560 | + it.data = mBuffer; | |
561 | + addToSendQueen(it); | |
562 | +// writeToCom(it.data); | |
563 | + } else if (ansType == AnsType_Number) { | |
564 | + byte[] mBuffer = new byte[0x1F + 4]; | |
565 | + Arrays.fill(mBuffer, (byte) 0x0); | |
566 | + mBuffer[0] = (byte) 0xF5; | |
567 | + mBuffer[1] = (byte) 0xAA; | |
568 | + mBuffer[2] = (byte) 0xAA; | |
569 | + mBuffer[3] = (byte) 0x1F; | |
570 | + | |
571 | + mBuffer[4] = 0x73; | |
572 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
573 | + | |
574 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
575 | + mBuffer[7] = (byte) ansType; | |
576 | + | |
577 | + byte[] val = util_encodeBCD(info.getBytes()); | |
578 | + System.arraycopy(val, 0, mBuffer, 8, 8); | |
579 | + | |
580 | + VoteResultItem it = new VoteResultItem(); | |
581 | + it.status = 0; | |
582 | + it.ansType = ansType; | |
583 | + it.ansCount = 1; | |
584 | + it.serialNo = serialNumber; | |
585 | + serialNumberInc(); | |
586 | + it.data = mBuffer; | |
587 | + addToSendQueen(it); | |
588 | + } else if (ansType == AnsType_LoginIn) { | |
589 | + byte[] mBuffer = new byte[0x1F + 4]; | |
590 | + Arrays.fill(mBuffer, (byte) 0x0); | |
591 | + mBuffer[0] = (byte) 0xF5; | |
592 | + mBuffer[1] = (byte) 0xAA; | |
593 | + mBuffer[2] = (byte) 0xAA; | |
594 | + mBuffer[3] = (byte) 0x1F; | |
595 | + | |
596 | + mBuffer[4] = 0x73; | |
597 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
598 | + | |
599 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
600 | + mBuffer[7] = (byte) ansType; | |
601 | + mBuffer[8] = 3;//3 签到信息按BCD码格式 | |
602 | + byte[] val = util_encodeBCD(info.getBytes()); | |
603 | + System.arraycopy(val, 0, mBuffer, 9, 9); | |
604 | + | |
605 | + VoteResultItem it = new VoteResultItem(); | |
606 | + it.status = 0; | |
607 | + it.ansType = ansType; | |
608 | + it.ansCount = 1; | |
609 | + it.serialNo = serialNumber; | |
610 | + serialNumberInc(); | |
611 | + it.data = mBuffer; | |
612 | + addToSendQueen(it); | |
613 | + | |
614 | + } else if (ansType == AnsType_BatchSingle) { | |
615 | + | |
616 | + // String[] ary= info.split(","); | |
617 | + | |
618 | + byte[] mBuffer = new byte[0x1F + 4]; | |
619 | + Arrays.fill(mBuffer, (byte) 0x0); | |
620 | + mBuffer[0] = (byte) 0xF5; | |
621 | + mBuffer[1] = (byte) 0xAA; | |
622 | + mBuffer[2] = (byte) 0xAA; | |
623 | + mBuffer[3] = (byte) 0x1F; | |
624 | + | |
625 | + mBuffer[4] = 0x73; | |
626 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
627 | + | |
628 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
629 | + mBuffer[7] = (byte) ansType; | |
630 | + mBuffer[8] = 0;// ALLOK | |
631 | + int pos = 9; | |
632 | + | |
633 | + String[] item = info.split(":"); | |
634 | + if (item.length > 1) { | |
635 | + int num = Integer.parseInt(item[0]); | |
636 | + int val = Integer.parseInt(item[1]); | |
637 | + mBuffer[pos++] = (byte) (num >> 8); | |
638 | + mBuffer[pos++] = (byte) (num & 0xff); | |
639 | + mBuffer[pos++] = (byte) val; | |
640 | + } | |
641 | + | |
642 | + VoteResultItem it = new VoteResultItem(); | |
643 | + it.status = 0; | |
644 | + it.ansType = ansType; | |
645 | + it.serialNo = serialNumber; | |
646 | + serialNumberInc(); | |
647 | + it.ansCount = 1; | |
648 | + it.data = mBuffer; | |
649 | + addToSendQueen(it); | |
650 | + } else if (ansType == AnsType_BatchNumber) { | |
651 | + byte[] mBuffer = new byte[0x1F + 4]; | |
652 | + Arrays.fill(mBuffer, (byte) 0x0); | |
653 | + mBuffer[0] = (byte) 0xF5; | |
654 | + mBuffer[1] = (byte) 0xAA; | |
655 | + mBuffer[2] = (byte) 0xAA; | |
656 | + mBuffer[3] = (byte) 0x1F; | |
657 | + | |
658 | + mBuffer[4] = 0x73; | |
659 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
660 | + | |
661 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
662 | + mBuffer[7] = (byte) ansType; | |
663 | + mBuffer[8] = 0;// ALLOK | |
664 | + | |
665 | + String[] item = info.split(":"); | |
666 | + if (item.length > 1) { | |
667 | + String[] itIndex = item[0].split("_"); | |
668 | + if (itIndex.length == 2) { //综合测评 | |
669 | + int personId = Integer.parseInt(itIndex[0]); | |
670 | + int projectId = Integer.parseInt(itIndex[1]); | |
671 | + mBuffer[9] = (byte) personId; | |
672 | + mBuffer[10] = (byte) projectId; | |
673 | + } else { | |
674 | + int num = Integer.parseInt(item[0]); | |
675 | + mBuffer[9] = (byte) (num >> 8); | |
676 | + mBuffer[10] = (byte) (num & 0xff); | |
677 | + } | |
678 | + String strNum = item[1]; | |
679 | + byte[] val = util_encodeBCD(strNum.getBytes()); | |
680 | + System.arraycopy(val, 0, mBuffer, 11, 4); | |
681 | + } | |
682 | + | |
683 | + VoteResultItem it = new VoteResultItem(); | |
684 | + it.status = 0; | |
685 | + it.ansType = ansType; | |
686 | + it.serialNo = serialNumber; | |
687 | + serialNumberInc(); | |
688 | + it.ansCount = 1; | |
689 | + it.data = mBuffer; | |
690 | + addToSendQueen(it); | |
691 | + | |
692 | + } else if (ansType == AnsType_SelectOther) { | |
693 | + byte[] mBuffer = new byte[0x1F + 4]; | |
694 | + Arrays.fill(mBuffer, (byte) 0x0); | |
695 | + mBuffer[0] = (byte) 0xF5; | |
696 | + mBuffer[1] = (byte) 0xAA; | |
697 | + mBuffer[2] = (byte) 0xAA; | |
698 | + mBuffer[3] = (byte) 0x1F; | |
699 | + | |
700 | + mBuffer[4] = 0x73; | |
701 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
702 | + | |
703 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
704 | + mBuffer[7] = (byte) ansType; | |
705 | + mBuffer[8] = 0;// ALLOK | |
706 | + int pos = 9; | |
707 | + | |
708 | + String[] item = info.split(":"); | |
709 | + if (item.length > 1) { | |
710 | + int num = Integer.parseInt(item[0]); | |
711 | + String val = item[1]; | |
712 | + mBuffer[pos++] = (byte) (num >> 8); | |
713 | + mBuffer[pos++] = (byte) num; | |
714 | + | |
715 | + mBuffer[pos++] = 0;// slot | |
716 | + try { | |
717 | + byte[] name = val.getBytes("GB2312"); | |
718 | + | |
719 | + System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
720 | + | |
721 | + } catch (UnsupportedEncodingException e) { | |
722 | + e.printStackTrace(); | |
723 | + } | |
724 | + // 名字最多16 | |
725 | + } | |
726 | + | |
727 | + VoteResultItem it = new VoteResultItem(); | |
728 | + it.status = 0; | |
729 | + it.ansType = ansType; | |
730 | + it.serialNo = serialNumber; | |
731 | + serialNumberInc(); | |
732 | + it.ansCount = 1; | |
733 | + it.data = mBuffer; | |
734 | + addToSendQueen(it); | |
735 | + | |
736 | + } else if (ansType == AnsType_Service) { | |
737 | + byte[] mBuffer = new byte[0x1F + 4]; | |
738 | + Arrays.fill(mBuffer, (byte) 0x0); | |
739 | + mBuffer[0] = (byte) 0xF5; | |
740 | + mBuffer[1] = (byte) 0xAA; | |
741 | + mBuffer[2] = (byte) 0xAA; | |
742 | + mBuffer[3] = (byte) 0x1F; | |
743 | + | |
744 | + mBuffer[4] = 0x73; | |
745 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
746 | + | |
747 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
748 | + mBuffer[7] = (byte) ansType; | |
749 | + mBuffer[8] = 4; | |
750 | + int serv_type = Integer.parseInt(info); | |
751 | + mBuffer[9] = (byte) serv_type; | |
752 | + | |
753 | + mBuffer[10] = (byte) serialNumber; | |
754 | + | |
755 | + VoteResultItem it = new VoteResultItem(); | |
756 | + | |
757 | + serviceSerialNumber = serialNumber; | |
758 | + | |
759 | + it.status = 0; | |
760 | + it.ansType = ansType; | |
761 | + it.serialNo = serialNumber; | |
762 | + serialNumberInc(); | |
763 | + it.ansCount = 1; | |
764 | + it.data = mBuffer; | |
765 | + addToSendQueen(it); | |
766 | + | |
767 | + } | |
768 | + } | |
769 | + | |
770 | + private int ChoiceValueToInt(String val) { | |
771 | + int ret = 0; | |
772 | + for (int i = 0; i < val.length(); i++) { | |
773 | + char cc = val.charAt(i); | |
774 | + if (cc < 'I') { | |
775 | + ret |= 1 << (8 + (cc - 'A')); | |
776 | + } else { | |
777 | + ret |= 1 << (cc - 'I'); | |
778 | + } | |
779 | + | |
780 | + } | |
781 | + | |
782 | + return ret; | |
783 | + } | |
784 | + | |
785 | + public void submitVoteFource(int ansType, String info) { | |
786 | + byte[] mBuffer = new byte[0x1F + 4]; | |
787 | + Arrays.fill(mBuffer, (byte) 0x0); | |
788 | + mBuffer[0] = (byte) 0xF5; | |
789 | + mBuffer[1] = (byte) 0xAA; | |
790 | + mBuffer[2] = (byte) 0xAA; | |
791 | + mBuffer[3] = (byte) 0x1F; | |
792 | + | |
793 | + mBuffer[4] = 0x73; | |
794 | + mBuffer[5] = (byte) serialNumber;// 流水号 | |
795 | + | |
796 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
797 | + mBuffer[7] = (byte) ansType; | |
798 | + mBuffer[8] = 0;// ALLOK | |
799 | + int pos = 9; | |
800 | + | |
801 | + String[] item = info.split(":"); | |
802 | + if (item.length > 1) { | |
803 | + int num = Integer.parseInt(item[0]); | |
804 | + String val = item[1]; | |
805 | + mBuffer[pos++] = (byte) (num >> 8); | |
806 | + mBuffer[pos++] = (byte) num; | |
807 | + | |
808 | + mBuffer[pos++] = 0;// slot | |
809 | + try { | |
810 | + byte[] name = val.getBytes("GB2312"); | |
811 | + | |
812 | + System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
813 | + | |
814 | + } catch (UnsupportedEncodingException e) { | |
815 | + // TODO Auto-generated catch block | |
816 | + e.printStackTrace(); | |
817 | + } | |
818 | + // 名字最多16 | |
819 | + } | |
820 | + | |
821 | + VoteResultItem it = new VoteResultItem(); | |
822 | + it.status = 0; | |
823 | + it.ansType = ansType; | |
824 | + it.serialNo = serialNumber; | |
825 | + serialNumberInc(); | |
826 | + it.ansCount = 1; | |
827 | + it.data = mBuffer; | |
828 | + addToSendQueen(it); | |
829 | + } | |
830 | + | |
831 | + @Override | |
832 | + public void submitVoteAllOK() { | |
833 | + int allokSerialNum = 0xff; | |
834 | + byte[] mBuffer = new byte[0x1F + 4]; | |
835 | + Arrays.fill(mBuffer, (byte) 0x0); | |
836 | + mBuffer[0] = (byte) 0xF5; | |
837 | + mBuffer[1] = (byte) 0xAA; | |
838 | + mBuffer[2] = (byte) 0xAA; | |
839 | + mBuffer[3] = (byte) 0x1F; | |
840 | + | |
841 | + mBuffer[4] = 0x73; | |
842 | + mBuffer[5] = (byte) allokSerialNum;// 流水号 | |
843 | + | |
844 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
845 | + mBuffer[7] = (byte) AnsType_BatchSingle; | |
846 | + mBuffer[8] = 1;// ALLOK | |
847 | + | |
848 | + VoteResultItem it = new VoteResultItem(); | |
849 | + it.status = 0; | |
850 | + it.ansType = AnsType_BatchSingle; | |
851 | + it.serialNo = allokSerialNum; | |
852 | + allOkSerialNumber = allokSerialNum; | |
853 | + it.ansCount = 1; | |
854 | + it.allOK = 1; | |
855 | + it.data = mBuffer; | |
856 | + addToSendQueen(it); | |
857 | + | |
858 | + } | |
859 | + | |
860 | + public void submitVoteAllOKWithValue(int ansType, String info) { | |
861 | + LogUtil.i(TAG,"ansType:" + ansType + ",info:" + info); | |
862 | + int allokSerialNum = 0xff; | |
863 | + byte[] mBuffer = new byte[0x1F + 4]; | |
864 | + Arrays.fill(mBuffer, (byte) 0x0); | |
865 | + mBuffer[0] = (byte) 0xF5; | |
866 | + mBuffer[1] = (byte) 0xAA; | |
867 | + mBuffer[2] = (byte) 0xAA; | |
868 | + mBuffer[3] = (byte) 0x1F; | |
869 | + | |
870 | + mBuffer[4] = 0x73; | |
871 | + mBuffer[5] = (byte) allokSerialNum;// 流水号 | |
872 | + | |
873 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
874 | + mBuffer[7] = (byte) ansType; | |
875 | + mBuffer[8] = 1;// ALLOK | |
876 | + | |
877 | + String[] item = info.split(":"); | |
878 | + if (item.length > 1) { | |
879 | + String[] itIndex = item[0].split("_"); | |
880 | + if (itIndex.length == 2) { //综合测评 | |
881 | + int personId = Integer.parseInt(itIndex[0]); | |
882 | + int projectId = Integer.parseInt(itIndex[1]); | |
883 | + mBuffer[9] = (byte) personId; | |
884 | + mBuffer[10] = (byte) projectId; | |
885 | + } else { | |
886 | + int num = Integer.parseInt(item[0]); | |
887 | + mBuffer[9] = (byte) (num >> 8); | |
888 | + mBuffer[10] = (byte) (num & 0xff); | |
889 | + } | |
890 | + String strNum = item[1]; | |
891 | + byte[] val = util_encodeBCD(strNum.getBytes()); | |
892 | + System.arraycopy(val, 0, mBuffer, 11, 4); | |
893 | + } | |
1050 | 894 | |
1051 | - SerDataRx[iSerRxN] = comBuffer[i];// 先保存数据 | |
1052 | - switch (iSerRxN) { | |
1053 | - case 0: | |
1054 | - if (dd == 0xF5) { | |
1055 | - iSerRxN++; | |
895 | + VoteResultItem it = new VoteResultItem(); | |
896 | + it.status = 0; | |
897 | + it.ansType = ansType; | |
898 | + it.serialNo = allokSerialNum; | |
899 | + allOkSerialNumber = allokSerialNum; | |
900 | + it.ansCount = 1; | |
901 | + it.allOK = 1; | |
902 | + it.data = mBuffer; | |
903 | + addToSendQueen(it); | |
904 | + | |
905 | + } | |
906 | + | |
907 | + @Override | |
908 | + public void cancelSubmitVoteAllOK() { | |
909 | + int cancelAllokSerialNum = 0xfe; | |
910 | + byte[] mBuffer = new byte[0x1F + 4]; | |
911 | + Arrays.fill(mBuffer, (byte) 0x0); | |
912 | + mBuffer[0] = (byte) 0xF5; | |
913 | + mBuffer[1] = (byte) 0xAA; | |
914 | + mBuffer[2] = (byte) 0xAA; | |
915 | + mBuffer[3] = (byte) 0x1F; | |
916 | + | |
917 | + mBuffer[4] = 0x73; | |
918 | + mBuffer[5] = (byte) cancelAllokSerialNum;// 流水号 | |
919 | + | |
920 | + mBuffer[6] = 1;// MSGTYPE 1:ID mode, 2:SN | |
921 | + mBuffer[7] = (byte) AnsType_BatchSingle; | |
922 | + mBuffer[8] = 0;// ALLOK | |
923 | + | |
924 | + VoteResultItem it = new VoteResultItem(); | |
925 | + it.status = 0; | |
926 | + it.ansType = AnsType_BatchSingle; | |
927 | + it.serialNo = cancelAllokSerialNum; | |
928 | + | |
929 | + it.ansCount = 1; | |
930 | + it.allOK = 0; | |
931 | + it.data = mBuffer; | |
932 | + addToSendQueen(it); | |
933 | + | |
934 | + //serialNumber=0; | |
935 | + } | |
936 | + | |
937 | + private void serialNumberInc() { | |
938 | + serialNumber++; | |
939 | + if (serialNumber == 0xfe) { | |
940 | + serialNumber = 0; | |
941 | + } | |
942 | + } | |
943 | + | |
944 | + @Override | |
945 | + public void submitSelectOther(String info) { | |
946 | + // TODO Auto-generated method stub | |
947 | + | |
948 | + } | |
949 | + | |
950 | + @Override | |
951 | + public void submitVoteBySn(byte[] keySn, String info) { | |
952 | + byte[] mBuffer = new byte[0x1F + 4]; | |
953 | + Arrays.fill(mBuffer, (byte) 0x0); | |
954 | + mBuffer[0] = (byte) 0xF5; | |
955 | + mBuffer[1] = (byte) 0xAA; | |
956 | + mBuffer[2] = (byte) 0xAA; | |
957 | + mBuffer[3] = (byte) 0x1F; | |
958 | + | |
959 | + mBuffer[4] = 0x73; | |
960 | + mBuffer[5] = 0x08;// 流水号 | |
961 | + | |
962 | + mBuffer[6] = 2;// MSGTYPE | |
963 | + | |
964 | + mBuffer[7] = 1;// ANSTYPE | |
965 | + | |
966 | + System.arraycopy(keySn, 0, mBuffer, 8, 6);// keysn | |
967 | + // System.arraycopy(ansData, 0, mBuffer, 8, | |
968 | + // ansData.length<=16?ansData.length:16); | |
969 | + // info??? | |
970 | + writeToCom(mBuffer); | |
971 | + } | |
972 | + | |
973 | + @Override | |
974 | + public void sendCmdData(int cmdId, byte[] data) { | |
975 | + byte[] mBuffer = new byte[0x1F + 4]; | |
976 | + Arrays.fill(mBuffer, (byte) 0x0); | |
977 | + mBuffer[0] = (byte) 0xF5; | |
978 | + mBuffer[1] = (byte) 0xAA; | |
979 | + mBuffer[2] = (byte) 0xAA; | |
980 | + mBuffer[3] = (byte) 0x1F; | |
981 | + | |
982 | + mBuffer[4] = (byte) 0xB0;// 0x30 表决器下载单包类指令 | |
983 | + | |
984 | + mBuffer[5] = 0x0;// keyid 填 0 | |
985 | + mBuffer[6] = 0x0;// keyid | |
986 | + | |
987 | + mBuffer[7] = (byte) cmdId;// KCMD | |
988 | + System.arraycopy(data, 0, mBuffer, 8, data.length);// keysn | |
989 | + | |
990 | + writeToCom(mBuffer); | |
991 | + } | |
992 | + | |
993 | + @Override | |
994 | + public void configMode() { | |
995 | + byte[] mBuffer = new byte[0x1F + 4]; | |
996 | + Arrays.fill(mBuffer, (byte) 0x0); | |
997 | + mBuffer[0] = (byte) 0xF5; | |
998 | + mBuffer[1] = (byte) 0xAA; | |
999 | + mBuffer[2] = (byte) 0xAA; | |
1000 | + mBuffer[3] = (byte) 0x1F; | |
1001 | + | |
1002 | + mBuffer[4] = 0x70; | |
1003 | + mBuffer[5] = 0x09; | |
1004 | + | |
1005 | + writeToCom(mBuffer); | |
1006 | + | |
1007 | + } | |
1008 | + | |
1009 | + private byte[] firmFileBuffer; | |
1010 | + private int firmWritePage; | |
1011 | + private int firmWritePageMax; | |
1012 | + | |
1013 | + @Override | |
1014 | + public void startFirmUpdate(byte[] fileBuffer) { | |
1015 | + firmFileBuffer = fileBuffer; | |
1016 | + compareCount = 0 ; | |
1017 | + taskHandler.post(updateTask); | |
1018 | + } | |
1019 | + | |
1020 | + private void keepFirmMode() { | |
1021 | + byte[] mBuffer = new byte[0x1F + 4]; | |
1022 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1023 | + mBuffer[0] = (byte) 0xF5; | |
1024 | + mBuffer[1] = (byte) 0xAA; | |
1025 | + mBuffer[2] = (byte) 0xAA; | |
1026 | + mBuffer[3] = (byte) 10; | |
1027 | + | |
1028 | + mBuffer[4] = 0x78; | |
1029 | + mBuffer[5] = 0x02; | |
1030 | + | |
1031 | + writeToCom(mBuffer); | |
1032 | + } | |
1033 | + | |
1034 | + private void eraseFlash() { | |
1035 | + int file_len = firmFileBuffer.length; | |
1036 | + byte[] mBuffer = new byte[0x1F + 4]; | |
1037 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1038 | + mBuffer[0] = (byte) 0xF5; | |
1039 | + mBuffer[1] = (byte) 0xAA; | |
1040 | + mBuffer[2] = (byte) 0xAA; | |
1041 | + mBuffer[3] = (byte) 10; | |
1042 | + mBuffer[4] = 0x78; | |
1043 | + mBuffer[5] = 0x03; | |
1044 | + mBuffer[6] = 0; | |
1045 | + mBuffer[7] = (byte) (file_len / 1024); | |
1046 | + writeToCom(mBuffer); | |
1047 | + | |
1048 | + } | |
1049 | + | |
1050 | + private Runnable updateTask = new Runnable() { | |
1051 | + @Override | |
1052 | + public void run() { | |
1053 | + firmWritePage = 0; | |
1054 | + firmWritePageMax = firmFileBuffer.length / 32; | |
1055 | + if (firmWritePageMax % 32 > 0) { | |
1056 | + firmWritePageMax++; | |
1057 | + } | |
1058 | + | |
1059 | + byte[] mBuffer = new byte[0x1F + 4]; | |
1060 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1061 | + mBuffer[0] = (byte) 0xF5; | |
1062 | + mBuffer[1] = (byte) 0xAA; | |
1063 | + mBuffer[2] = (byte) 0xAA; | |
1064 | + mBuffer[3] = (byte) 10; | |
1065 | + mBuffer[4] = 0x78; | |
1066 | + mBuffer[5] = 0x01; | |
1067 | + writeToCom(mBuffer); | |
1068 | + if(compareCount < 20){ | |
1069 | + compareCount++; | |
1070 | + taskHandler.postDelayed(this,1000); | |
1071 | + } | |
1072 | + } | |
1073 | + }; | |
1074 | + | |
1075 | + private void writeFlash(int page) { | |
1076 | + byte[] mBuffer = new byte[38 + 4]; | |
1077 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1078 | + mBuffer[0] = (byte) 0xF5; | |
1079 | + mBuffer[1] = (byte) 0xAA; | |
1080 | + mBuffer[2] = (byte) 0xAA; | |
1081 | + mBuffer[3] = (byte) 38; | |
1082 | + | |
1083 | + mBuffer[4] = 0x78; | |
1084 | + mBuffer[5] = 0x04; | |
1085 | + | |
1086 | + mBuffer[6] = (byte) (page / 256); | |
1087 | + mBuffer[7] = (byte) (page % 256); | |
1088 | + int pos = 0; | |
1089 | + for (int i = 0; i < 32; i++) { | |
1090 | + pos = page * 32 + i; | |
1091 | + if (pos == firmFileBuffer.length - 1) { | |
1092 | + break; | |
1093 | + } | |
1094 | + mBuffer[8 + i] = firmFileBuffer[pos]; | |
1095 | + } | |
1096 | + LogUtil.d(TAG, "write flash page:" + page); | |
1097 | + writeToCom(mBuffer); | |
1098 | + } | |
1099 | + | |
1100 | + /* | |
1101 | + * status 1: success 2 : fail | |
1102 | + */ | |
1103 | + private void exitFirmUpdate(int status) { | |
1104 | + byte[] mBuffer = new byte[0x1F + 4]; | |
1105 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1106 | + mBuffer[0] = (byte) 0xF5; | |
1107 | + mBuffer[1] = (byte) 0xAA; | |
1108 | + mBuffer[2] = (byte) 0xAA; | |
1109 | + mBuffer[3] = (byte) 10; | |
1110 | + | |
1111 | + mBuffer[4] = 0x78; | |
1112 | + mBuffer[5] = 5; | |
1113 | + mBuffer[6] = (byte) status; | |
1114 | + writeToCom(mBuffer); | |
1115 | + } | |
1116 | + | |
1117 | + private void writeToCom(byte[] data) { | |
1118 | + if (mOutputStream != null) { | |
1119 | + try { | |
1120 | + int crcValue = Crc16.getUnsignedShort(Crc16.crc16(data, data.length - 4 - 2)); | |
1121 | + data[data.length - 2] = (byte) (crcValue >> 8); | |
1122 | + data[data.length - 1] = (byte) (crcValue); | |
1123 | + | |
1124 | + if (isShowLog) { | |
1125 | + if (data[4] == 0x70 && data[5] == 0x07) { | |
1126 | + // LogUtil.d(TAG, "check online"); | |
1127 | + if (isShowOnlineLog) { | |
1128 | + printDataBuf(data, data.length, "send:"); | |
1056 | 1129 | } |
1057 | - break; | |
1058 | - case 1: | |
1059 | - if (dd == 0xAA) | |
1060 | - iSerRxN++; | |
1061 | - else { | |
1062 | - if (dd == 0xF5) | |
1063 | - iSerRxN = 1; | |
1064 | - else | |
1065 | - iSerRxN = 0; | |
1130 | + } else { | |
1131 | + printDataBuf(data, data.length, "send:"); | |
1132 | + } | |
1133 | + } | |
1134 | + | |
1135 | + mOutputStream.write(data); | |
1136 | + } catch (IOException e) { | |
1137 | + e.printStackTrace(); | |
1138 | + } | |
1139 | + | |
1140 | + m_listener.onSendData(data, data.length); | |
1141 | + } | |
1142 | + } | |
1143 | + | |
1144 | + private byte[] SerDataRx = new byte[1024]; | |
1145 | + int iSerRxN = 0; | |
1146 | + private byte[] comBuffer = new byte[1024]; | |
1147 | + | |
1148 | + private class ReadThread extends Thread { | |
1149 | + | |
1150 | + @Override | |
1151 | + public void run() { | |
1152 | + super.run(); | |
1153 | + LogUtil.d(TAG, "Xpad ReadThread running "); | |
1154 | + if (mInputStream != null) { | |
1155 | + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
1156 | + byte[] bytes = new byte[1024]; | |
1157 | + int tmpLength = -1; | |
1158 | + while (!isInterrupted()) { | |
1159 | + try { | |
1160 | +// tmpLength = mInputStream.read(bytes); | |
1161 | + bytes = UsbTransferManager.getInstance().receiveUsbRequestData(); | |
1162 | + if(bytes == null){ | |
1163 | + continue; | |
1066 | 1164 | } |
1067 | - break; | |
1068 | - case 2: | |
1069 | - if (dd == 0xAA) | |
1070 | - iSerRxN++; | |
1071 | - else { | |
1072 | - if (dd == 0xF5) | |
1073 | - iSerRxN = 1; | |
1074 | - else | |
1075 | - iSerRxN = 0; | |
1165 | + tmpLength = bytes.length; | |
1166 | + if (tmpLength < 0) { | |
1167 | + break; | |
1076 | 1168 | } |
1077 | - break; | |
1078 | - case 3:// len | |
1079 | - if (dd > 128) // C_SERMAXN | |
1080 | - iSerRxN = 0; | |
1081 | - else { | |
1082 | - iSerRxN++; | |
1169 | + // 1. 先检测读取数据到缓冲区 | |
1170 | + byteArrayOutputStream.write(bytes, 0, tmpLength); | |
1171 | + // 2. 判断缓冲区的数据标志是否存在 | |
1172 | + if (byteArrayOutputStream.size() >= 3) { | |
1173 | + byte[] temp = byteArrayOutputStream.toByteArray(); | |
1174 | + int find = ByteUtils.findBytes(temp, new byte[]{(byte) 0xF5, (byte) 0xAA, (byte) 0xAA}, 0); | |
1175 | + if (find >= 0) { | |
1176 | + // 3. 标志存在,则继续读取长度 | |
1177 | + if (byteArrayOutputStream.size() >= find + 4) { | |
1178 | + int length = ByteUtils.byte1ToInt(byteArrayOutputStream.toByteArray()[find + 3]); | |
1179 | + if (byteArrayOutputStream.size() >= find + 4 + length) { | |
1180 | + ByteArrayOutputStream tmp = new ByteArrayOutputStream(); | |
1181 | + // 4. 根据长度读取包的内容 | |
1182 | + for (int i = find; i < find + 4 + length; i++) { | |
1183 | + // 5. 截取包的内容,向外抛出,处理,接着读取下一个包 | |
1184 | + tmp.write(temp[i]); | |
1185 | + } | |
1186 | + | |
1187 | + //CRC 校验 | |
1188 | + byte[] datas = tmp.toByteArray(); | |
1189 | + LogUtil.i(TAG, "RECEIVER DATA:", datas); | |
1190 | + | |
1191 | + try { | |
1192 | + //处理 | |
1193 | + if(Crc16.checkPack(datas)){ | |
1194 | + int crc = Crc16.getUnsignedShort(Crc16.crc16(datas,length - 2)); | |
1195 | + int originCrcValue = 0; | |
1196 | + originCrcValue |= (datas[length + 2] & 0xff) << 8; | |
1197 | + originCrcValue |= datas[length + 3] & 0xff; | |
1198 | + if(crc == originCrcValue){ | |
1199 | + checkComData(datas, tmp.size()); | |
1200 | + } | |
1201 | + } | |
1202 | + } catch (Exception ex) { | |
1203 | + LogUtil.i(TAG, "处理命令出错:", ex); | |
1204 | + } | |
1205 | + // 7. 剩余数据重新打包处理 | |
1206 | +// byteArrayOutputStream = new ByteArrayOutputStream(); | |
1207 | + byteArrayOutputStream.reset(); | |
1208 | + for (int i = find + 4 + length; i < temp.length; i++) { | |
1209 | + byteArrayOutputStream.write(temp[i]); | |
1210 | + } | |
1211 | + } | |
1212 | + } | |
1213 | + } | |
1083 | 1214 | } |
1084 | - break; | |
1085 | - default: | |
1086 | - iSerRxN++; | |
1087 | - rxDataLen = SerDataRx[3] + 4;// len | |
1088 | - if (rxDataLen <= 3) | |
1089 | - break; | |
1090 | - if (iSerRxN == rxDataLen) { | |
1091 | - if (Crc16.checkPack(SerDataRx)) { | |
1092 | - int crcValue = Crc16 | |
1093 | - .getUnsignedShort(Crc16.crc16(SerDataRx, rxDataLen - 4 - 2)); | |
1094 | - int originCrcValue = 0; | |
1095 | - originCrcValue |= (SerDataRx[rxDataLen - 2] & 0xff) << 8; | |
1096 | - originCrcValue |= SerDataRx[rxDataLen - 1] & 0xff; | |
1215 | + if (byteArrayOutputStream.size() > 2048) { | |
1216 | + LogUtil.i(TAG, "被恶意攻击?或者传输数据错误?丢弃处理!", byteArrayOutputStream.toByteArray()); | |
1217 | + byteArrayOutputStream.reset(); | |
1218 | + } | |
1219 | + } catch (Exception e) { | |
1220 | + LogUtil.e(TAG, e); | |
1221 | + } | |
1222 | + } | |
1223 | + } | |
1224 | + } | |
1225 | + @SuppressLint("NewApi") | |
1226 | + private void checkComData(byte[] data, int size) { | |
1227 | + m_listener.onComData(data, size); | |
1228 | + int cmd = data[4] & 0xFF; | |
1229 | + switch (cmd) { | |
1230 | + case CMD_CHECK_BASE_STATUS_RESPONSE:// 查询状态类指令应答 | |
1231 | + int cmd1 = data[5] & 0xFF; | |
1232 | + if (cmd1 == 1) {// 返回当前工作模式和版本 | |
1233 | + ModelInfo info = new ModelInfo(); | |
1234 | + info.mode = data[6]; | |
1235 | + info.hModel = data[7] & 0xff; | |
1236 | + info.sVer = data[8] + "." + data[9] + "." + data[10]; | |
1237 | + m_listener.onModelEvent(info); | |
1238 | + } else if (cmd1 == 3) { // 查询基础信标 结果 | |
1239 | + onBaseInfo(data); | |
1240 | + } else if (cmd1 == 4) { // 查询投票信标 结果 | |
1241 | + onVoteInfo(data); | |
1242 | + } else if (cmd1 == 5 || cmd1 == 6) {// 返回当前键盘参数结果 | |
1243 | + info.ok = data[6]; | |
1244 | + info.chan = data[7]; | |
1245 | + info.keyId = ((data[8] & 0xff) << 8) | (data[9] & 0xff); | |
1246 | + byte[] sn = Arrays.copyOfRange(data, 10, 16); | |
1247 | + info.keySn = getKeySn(sn); | |
1248 | + byte[] mc = Arrays.copyOfRange(data, 16, 19); | |
1249 | + info.matchCode = new String(mc); | |
1250 | + m_listener.onKeyPadEvent(info); | |
1251 | + | |
1252 | + // if(!hasGetBaseInfo){ //第一次启动时取 | |
1253 | + // hasGetBaseInfo = true; | |
1254 | + // getBaseStatus(); | |
1255 | + // } | |
1256 | + | |
1257 | + } else if (cmd1 == 7) {// 查询键盘在线状态结果 | |
1258 | + OnLineInfo info = new OnLineInfo(); | |
1259 | + info.onLine = data[6]; | |
1260 | + info.idMode = data[7]; | |
1261 | + info.chan = data[8] & 0xff; | |
1262 | + info.rssi = data[9] & 0xff; | |
1263 | + LogUtil.i(TAG ,"HEART BEAT(R):" + info.chan + " " + System.currentTimeMillis()); | |
1264 | + info.tx = data[10]; | |
1265 | + info.rx = data[11]; | |
1266 | + info.baseId = data[12] & 0xff; | |
1267 | + info.keyId = ((data[13] & 0xff) << 8) | (data[14] & 0xff); | |
1268 | + RFFileUploadModule.getInstance().setKeyid(data,13); | |
1269 | + byte[] sn = Arrays.copyOfRange(data, 15, 21); | |
1270 | + info.keySn = getKeySn(sn); | |
1271 | + m_listener.onOnLineEvent(info); | |
1272 | + onLineInfo = info; | |
1273 | + | |
1274 | + } else if (cmd1 == 8 || cmd1 == 9) { | |
1275 | + info.cmd1 = cmd1; | |
1276 | + info.ok = data[6]; | |
1277 | + info.chan = data[7]; | |
1278 | + info.keyId = ((data[8] & 0xff) << 8) | (data[9] & 0xff); | |
1279 | + byte[] sn = Arrays.copyOfRange(data, 10, 16); | |
1280 | + info.keySn = getKeySn(sn); | |
1281 | + byte[] mc = Arrays.copyOfRange(data, 16, 19); | |
1282 | + info.matchCode = new String(mc); | |
1283 | + m_listener.onKeyPadEvent(info); | |
1284 | + } | |
1285 | + | |
1286 | + break; | |
1287 | + case CMD_BASE_STATUS_CHANGE:// 基础信标变化(主动下发) | |
1288 | + | |
1289 | + responseBaseStatusChange(data, size); | |
1097 | 1290 | |
1098 | - if (crcValue != originCrcValue) { | |
1099 | - System.out.println("recv package crc error!\n"); | |
1291 | + onBaseInfo(data); | |
1292 | + break; | |
1293 | + case CMD_VOTE_STATUS_CHANGE:// 投票信标变化 | |
1294 | + responseVoteStatusChange(data, size); | |
1295 | + clearSentItems(); | |
1296 | + onVoteInfo(data); | |
1297 | + break; | |
1298 | + | |
1299 | + case CMD_UPLOAD_DATA_RESPONSE: | |
1300 | + // 上传文件指令 | |
1301 | + onMutilPacketRequest(data, size); | |
1302 | + break; | |
1303 | + case CMD_VOTE_RESULT_SEND_RESPONSE: | |
1304 | +// sendToModalSuccessResponse(data[5] & 0xff); | |
1305 | + break; | |
1306 | + case CMD_VOTE_SEND_SUCCESS_RESPONSE: | |
1307 | + responseVoteSendSuccess(data, size); | |
1308 | + break; | |
1100 | 1309 | |
1310 | + case CMD_KEY_MANAGE:// 表决器管理类指令,单包,透传 | |
1311 | + CmdDataInfo info = new CmdDataInfo(); | |
1312 | + info.cmd = data[7]; | |
1313 | + info.data = Arrays.copyOfRange(data, 8, 28); | |
1314 | + if (info.cmd == 25) { | |
1315 | + int keyId = (data[5] << 8) | data[6]; | |
1316 | + if (keyId != 0) { | |
1317 | + responseClearKeyboardData(data, size); | |
1318 | + } | |
1319 | + } else if (info.cmd == 20) { | |
1320 | + int keyId = (data[5] << 8) | data[6]; | |
1321 | + if (keyId == onLineInfo.keyId) { | |
1322 | + responseAuthrizeKeyboardData(data, size); | |
1323 | + } else { | |
1324 | + break; | |
1325 | + } | |
1326 | + }else if(info.cmd == 50){ | |
1327 | + responseAuthrizeKeyboardData(data,size); | |
1328 | + } | |
1329 | + m_listener.onCmdData(info); | |
1330 | + break; | |
1331 | + case CMD_MULTI_PCKAGE_DOWNLOAD: | |
1332 | + onMultiPackageInfo(data, size); | |
1333 | + break; | |
1334 | + case CMD_COM_COMMUNICATION_TEST_RESPONSE: | |
1335 | + int sendn = data[8] & 0xff; | |
1336 | + boolean isOk = true; | |
1337 | + for (int i = 1; i < 17; i++) { | |
1338 | + if (data[10 + i] != i) { | |
1339 | + isOk = false; | |
1340 | + } | |
1341 | + } | |
1342 | + m_listener.onComCommunicationTest(sendn, isOk); | |
1343 | + break; | |
1344 | + case CMD_FIRM_UPDATE_RESPONSE: | |
1345 | + taskHandler.removeCallbacks(updateTask); | |
1346 | + switch (data[5]) { | |
1347 | + case 2:// '模块询问是否进入DFU | |
1348 | + keepFirmMode(); | |
1349 | + try{ | |
1350 | + Thread.sleep(1000); | |
1351 | + }catch (Exception ex){} | |
1352 | + eraseFlash(); | |
1353 | + break; | |
1354 | + case 3:// 擦除应答 | |
1355 | + if (data[8] != 1) { | |
1356 | + LogUtil.e(TAG, "eraseFlash fail"); | |
1357 | + m_listener.onFirmUpdateResult(false, "擦除固件失败!"); | |
1358 | + break; | |
1359 | + } | |
1360 | + LogUtil.e(TAG, "eraseFlash ok"); | |
1361 | + m_listener.onFirmUpdateInfo("擦除固件完成,开始写入..."); | |
1362 | + CheckFirmReceveThread checkFirmThread = new CheckFirmReceveThread(); | |
1363 | + checkFirmThread.start(); | |
1364 | + writeFrimPageErrCnt = 0; | |
1365 | + writeFlash(firmWritePage); | |
1366 | + break; | |
1367 | + case 4:// 写应答 | |
1368 | + if (data[8] == 1) { | |
1369 | + firmWritePage++; | |
1370 | + writeFrimPageErrCnt = 0; | |
1371 | + if (firmWritePage < firmWritePageMax) { | |
1372 | + m_listener.onFirmUpdate(firmWritePage * 100 / firmWritePageMax); | |
1373 | + LogUtil.d(TAG, "write page ok! " + firmWritePage + "/" + firmWritePageMax + " ==" | |
1374 | + + firmWritePage * 100 / firmWritePageMax + "%"); | |
1375 | + //sleep(500); | |
1376 | + writeFlash(firmWritePage); | |
1101 | 1377 | } else { |
1102 | - checkComData(SerDataRx, rxDataLen); | |
1378 | + m_listener.onFirmUpdateInfo("写入完成"); | |
1379 | + m_listener.onFirmUpdate(100); | |
1380 | + LogUtil.i(TAG, "write 100%"); | |
1381 | + sleep(2000); | |
1382 | + exitFirmUpdate(1); | |
1383 | + LogUtil.i(TAG, "exitFirmUpdate"); | |
1384 | + m_listener.onFirmUpdateResult(true, null); | |
1103 | 1385 | } |
1104 | - for (int j = 0; j < SerDataRx.length; j++) { | |
1105 | - SerDataRx[j] = 0; | |
1386 | + } else { | |
1387 | + LogUtil.d(TAG, "应答写失败 write page error"); | |
1388 | + } | |
1389 | + break; | |
1390 | + case 5: // 退出升级 | |
1391 | + LogUtil.d(TAG, "exit update!"); | |
1392 | + m_listener.onFirmUpdateInfo("退出升级模式成功!"); | |
1393 | + sleep(3000); | |
1394 | + LogUtil.d(TAG, "sleep 3s getWorkMode!"); | |
1395 | + for (int i = 0; i < 5; i++) { | |
1396 | + getWorkMode(); | |
1397 | + sleep(1000); | |
1398 | + } | |
1399 | + byte[] mBuffer = new byte[0x1F + 4]; | |
1400 | + Arrays.fill(mBuffer, (byte) 0x0); | |
1401 | + mBuffer[0] = (byte) 0xF5; | |
1402 | + mBuffer[1] = (byte) 0xAA; | |
1403 | + mBuffer[2] = (byte) 0xAA; | |
1404 | + mBuffer[3] = (byte) 0x1F; | |
1405 | + | |
1406 | + mBuffer[4] = 0x70; | |
1407 | + mBuffer[5] = 0x03; | |
1408 | + writeToCom(mBuffer); | |
1409 | + | |
1410 | + break; | |
1411 | + default: | |
1412 | + break; | |
1413 | + } | |
1414 | + default: | |
1415 | + break; | |
1416 | + } | |
1417 | + | |
1418 | + } | |
1419 | + | |
1420 | + private void sleep(int ms) { | |
1421 | + try { | |
1422 | + Thread.sleep(ms); | |
1423 | + } catch (Exception e) { | |
1424 | + // TODO: handle exception | |
1425 | + } | |
1426 | + } | |
1427 | + | |
1428 | + //// 回应模块基础信标变化,模块停止重发,否则模块会不断发送 | |
1429 | + private void responseBaseStatusChange(byte[] data, int size) { | |
1430 | + byte[] retData = Arrays.copyOf(data, size); | |
1431 | + retData[4] = (byte) 0xF1; | |
1432 | + writeToCom(retData); | |
1433 | + } | |
1434 | + | |
1435 | + | |
1436 | + | |
1437 | + // 回应模块投票信标变化,模块停止重发,否则模块会不断发送 | |
1438 | + private void responseVoteStatusChange(byte[] data, int size) { | |
1439 | + final byte[] retData = Arrays.copyOf(data, size); | |
1440 | + retData[4] = (byte) 0xF2; | |
1441 | + writeToCom(retData); | |
1442 | + | |
1443 | + } | |
1444 | + | |
1445 | + // 回应发送成功通知 | |
1446 | + private void responseVoteSendSuccess(byte[] data, int size) { | |
1447 | + | |
1448 | + byte[] retData = Arrays.copyOf(data, size); | |
1449 | + retData[4] = (byte) 0xF3; | |
1450 | + writeToCom(retData); | |
1451 | + | |
1452 | + int serialNo = data[5] & 0xff; | |
1453 | + VoteResultItem ret = removeSentItem(serialNo); | |
1454 | + | |
1455 | + if (serialNo == allOkSerialNumber) { | |
1456 | + m_listener.onVoteSubmitAllOkSuccess(); | |
1457 | + allOkSerialNumber = -1; | |
1458 | + } else if (serialNo == serviceSerialNumber) { | |
1459 | + m_listener.onServiceSubmitSuccess(); | |
1460 | + serviceSerialNumber = -1; | |
1461 | + } else { | |
1462 | + if (ret != null) { | |
1463 | + m_listener.onVoteSubmitSuccess(ret); | |
1464 | + } | |
1465 | + } | |
1466 | + } | |
1467 | + | |
1468 | + //回复清空键盘数据 | |
1469 | + private void responseClearKeyboardData(byte[] data, int len) { | |
1470 | + byte[] retData = Arrays.copyOf(data, len); | |
1471 | + retData[4] = (byte) 0xB0; | |
1472 | +// retData[8] = 1; 修改原因:肖翔给的表达:人大的表决就是1,评分的是0 | |
1473 | + writeToCom(retData); | |
1474 | + } | |
1475 | + | |
1476 | + //回复键盘授权数据 | |
1477 | + private void responseAuthrizeKeyboardData(byte[] data, int len) { | |
1478 | + byte[] retData = Arrays.copyOf(data, len); | |
1479 | + retData[4] = (byte) 0xB0; | |
1480 | + writeToCom(retData); | |
1481 | + } | |
1482 | + | |
1483 | + | |
1484 | + } | |
1485 | + | |
1486 | + // 处理基础信标变化 | |
1487 | + private void onBaseInfo(byte[] data) { | |
1488 | + | |
1489 | + // Arrays.fill(broadcastData, (byte) 0x0);//清空多包结果 | |
1490 | + if(data != null){ | |
1491 | + baseSign = new byte[data.length]; | |
1492 | + System.arraycopy(data,0,baseSign,0,data.length); | |
1493 | + } | |
1494 | + | |
1495 | + BaseInfo info = new BaseInfo(); | |
1496 | + info.baseId = data[5] & 0xff;// baseID | |
1497 | + info.idMode = data[6] & 0xff; | |
1498 | + info.confId = ((data[7] & 0xff) << 8) | (data[8] & 0xff); | |
1499 | + | |
1500 | + info.billId = data[9] & 0xff; | |
1501 | + info.authCode = (data[10] & 0xff) << 8 | (data[11] & 0xff); | |
1502 | + info.login = data[12] & 0xff; | |
1503 | + info.report = data[13] & 0xff; | |
1504 | + info.offTime = data[14] & 0xff; | |
1505 | + info.attrib = data[15] & 0xff; | |
1506 | + info.pageNo = (data[16] & 0xff) << 8 | (data[17] & 0xff); | |
1507 | + byte[] bname = Arrays.copyOfRange(data, 16, 16 + 12); | |
1508 | + info.baseName = new String(bname); | |
1509 | + | |
1510 | + m_listener.onBaseEvent(info); | |
1511 | + } | |
1512 | + | |
1513 | + // 处理投票信标变化 | |
1514 | + private void onVoteInfo(byte[] data) { | |
1515 | + if(data != null){ | |
1516 | + voteSign = new byte[data.length]; | |
1517 | + System.arraycopy(data,0,voteSign,0,data.length); | |
1518 | + } | |
1519 | + byte[] dt = Arrays.copyOfRange(data, 4, data.length - 4 - 1);// 从len开始,和文档下标统一 | |
1520 | + VoteInfo info = new VoteInfo(); | |
1521 | + info.baseId = dt[1] & 0xff; | |
1522 | + info.nowT = dt[2] & 0xff << 8 | dt[3] & 0xff; | |
1523 | + info.dataPos = dt[4] & 0xff; | |
1524 | + info.mode = dt[5] & 0xff; | |
1525 | + info.mode1_msgType = dt[6] & 0xff; | |
1526 | + if (info.mode != VoteType_Stop) { | |
1527 | + serialNumber = 0; | |
1528 | + } | |
1529 | + | |
1530 | + if (info.mode == VoteType_Stop) { // 停止 | |
1531 | + if (info.mode1_msgType == 2) { // 有结果 | |
1532 | + | |
1533 | + info.resultInfo.resultType = dt[7] & 0xff; | |
1534 | + info.resultInfo.bits = dt[8] & 0xff; | |
1535 | + info.resultInfo.num0 = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1536 | + info.resultInfo.num1 = (dt[11] & 0xff) << 8 | (dt[12] & 0xff); | |
1537 | + info.resultInfo.num2 = (dt[13] & 0xff) << 8 | (dt[14] & 0xff); | |
1538 | + info.resultInfo.num3 = (dt[15] & 0xff) << 8 | (dt[16] & 0xff); | |
1539 | + info.resultInfo.num4 = (dt[17] & 0xff) << 8 | (dt[18] & 0xff); | |
1540 | + info.resultInfo.num5 = (dt[19] & 0xff) << 8 | (dt[20] & 0xff); | |
1541 | + info.resultInfo.num6 = (dt[21] & 0xff) << 8 | (dt[22] & 0xff); | |
1542 | + } | |
1543 | + } else if (info.mode == VoteType_BatchVote) { | |
1544 | + printDataBuf(data, data.length, "batchvote:"); | |
1545 | + info.less = dt[11] & 0xff; | |
1546 | + info.mode3_secret = dt[12] & 0xff; | |
1547 | + info.fixballot = dt[13] & 0xff ; | |
1548 | + if(info.fixballot > 0 ){ | |
1549 | + info.limitFavor = dt[14] & 0xff ; | |
1550 | + info.limitOppo = dt[15] & 0xff ; | |
1551 | + info.limitWaiver = dt[16] & 0xff ; | |
1552 | + }else{ | |
1553 | + info.limitFavor = 0 ; | |
1554 | + info.limitOppo = 0 ; | |
1555 | + info.limitWaiver = 0; | |
1556 | + } | |
1557 | + | |
1558 | + | |
1559 | + info.mode2_modify = dt[23] & 0xff; | |
1560 | + info.voteid = dt[21] & 0xff; | |
1561 | + } else if (info.mode == VoteType_Choice) { | |
1562 | + info.mode2_modify = dt[7] & 0xff; | |
1563 | + info.mode3_secret = dt[8] & 0xff; | |
1564 | + info.mode4 = dt[9] & 0xff; | |
1565 | + info.mode5 = dt[10] & 0xff; | |
1566 | + info.mode6 = dt[11] & 0xff; | |
1567 | + info.mode7 = dt[12] & 0xff; | |
1568 | + } else if (info.mode == VoteType_BatchElect) {//选举 | |
1569 | + info.electInfo.type = dt[6] & 0xff; | |
1570 | + info.electInfo.random = dt[7] & 0xff; | |
1571 | + info.electInfo.select = dt[8] & 0xff; | |
1572 | + info.electInfo.other = dt[9] & 0xff; | |
1573 | + info.electInfo.less = dt[10] & 0xff; | |
1574 | + info.electInfo.secrecy = dt[11] & 0xff; | |
1575 | + info.electInfo.modify = dt[12] & 0xff; | |
1576 | + info.electInfo.start = dt[13] & 0xff; | |
1577 | + info.electInfo.end = dt[14] & 0xff; | |
1578 | + info.electInfo.equityMode = dt[15] & 0xff; | |
1579 | + info.electInfo.minSelect = dt[16] & 0xff; | |
1580 | + info.electInfo.voteid = dt[21] & 0xff; | |
1581 | + | |
1582 | + } else if (info.mode == VoteType_SingleItemEvalue) {//单项评分 | |
1583 | + info.singleEvalueInfo.mode1 = dt[6] & 0xff; | |
1584 | + info.singleEvalueInfo.mode2 = dt[7] & 0xff; | |
1585 | + info.singleEvalueInfo.mode3 = dt[8] & 0xff; | |
1586 | + info.singleEvalueInfo.mode4 = dt[9] & 0xff; | |
1587 | + info.singleEvalueInfo.mode5 = dt[10] & 0xff; | |
1588 | + info.singleEvalueInfo.mode6 = dt[11] & 0xff; | |
1589 | + info.singleEvalueInfo.mode7 = dt[12] & 0xff; | |
1590 | + info.singleEvalueInfo.mode8 = dt[13] & 0xff; | |
1591 | + info.singleEvalueInfo.mode9 = dt[14] & 0xff; | |
1592 | + info.singleEvalueInfo.mode10 = dt[15] & 0xff; | |
1593 | + info.singleEvalueInfo.mode11 = dt[16] & 0xff; | |
1594 | + info.singleEvalueInfo.mode12 = dt[17] & 0xff; | |
1595 | + info.singleEvalueInfo.title = new byte[12]; | |
1596 | + | |
1597 | + System.arraycopy(dt, 12, info.singleEvalueInfo.title, 0, 12); | |
1598 | + info.voteid = dt[23] & 0xFF ; | |
1599 | + info.singleEvalueInfo.number = dt[24] & 0xff; | |
1600 | + } else if (info.mode == VoteType_BatchEvalue) { | |
1601 | + info.batchEvalueInfo.mode1 = dt[6] & 0xff; | |
1602 | + info.batchEvalueInfo.startVal = (dt[7] & 0xff) << 8 | (dt[8] & 0xff); | |
1603 | + info.batchEvalueInfo.endVal = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1604 | + info.batchEvalueInfo.autoMove = dt[11] & 0xff; | |
1605 | + info.batchEvalueInfo.width1 = dt[12] & 0xff; | |
1606 | + info.batchEvalueInfo.width2 = dt[13] & 0xff; | |
1607 | + info.batchEvalueInfo.less = dt[14] & 0xff; | |
1608 | + info.batchEvalueInfo.secrecy = dt[15] & 0xff; | |
1609 | + info.batchEvalueInfo.modify = dt[16] & 0xff; | |
1610 | + info.batchEvalueInfo.ruleStart = dt[17] & 0xff; | |
1611 | + info.batchEvalueInfo.ruleEnd = dt[18] & 0xff; | |
1612 | + info.batchEvalueInfo.sliderover = dt[19] & 0xff; | |
1613 | + info.batchEvalueInfo.billNo = dt[20] & 0xff; | |
1614 | + info.batchEvalueInfo.billSubNo = ((dt[21] & 0xff) << 8) | (dt[22] & 0xff); | |
1615 | + | |
1616 | + } else if (info.mode == VoteType_BatchIDEvalue) { | |
1617 | + info.batchEvalueInfo.mode1 = dt[6] & 0xff; | |
1618 | + info.batchEvalueInfo.startVal = (dt[7] & 0xff) << 8 | (dt[8] & 0xff); | |
1619 | + info.batchEvalueInfo.endVal = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1620 | + info.batchEvalueInfo.autoMove = dt[11] & 0xff; | |
1621 | + info.batchEvalueInfo.width1 = dt[12] & 0xff; | |
1622 | + info.batchEvalueInfo.width2 = dt[13] & 0xff; | |
1623 | + info.batchEvalueInfo.less = dt[14] & 0xff; | |
1624 | + info.batchEvalueInfo.secrecy = dt[15] & 0xff; | |
1625 | + info.batchEvalueInfo.modify = dt[16] & 0xff; | |
1626 | + info.batchEvalueInfo.ruleStart = dt[17] & 0xff; | |
1627 | + info.batchEvalueInfo.ruleEnd = dt[18] & 0xff; | |
1628 | + info.batchEvalueInfo.sliderover = dt[19] & 0xff; | |
1629 | + info.batchEvalueInfo.billNo = dt[20] & 0xff; | |
1630 | + info.batchEvalueInfo.billSubNo = ((dt[21] & 0xff) << 8) | (dt[22] & 0xff); | |
1631 | + } else { | |
1632 | + info.mode2_modify = dt[7] & 0xff; | |
1633 | + info.mode3_secret = dt[8] & 0xff; | |
1634 | + info.mode4 = dt[9] & 0xff; | |
1635 | + info.voteid = dt[11] & 0xff; | |
1636 | + info.file = dt[12] & 0xff; | |
1637 | + info.init = dt[13] & 0xff; | |
1638 | + } | |
1639 | + m_listener.onVoteEvent(info); | |
1640 | + } | |
1641 | + | |
1642 | + public void cleanSendQueue() { | |
1643 | + LogUtil.i(TAG,"cleanSendQueue"); | |
1644 | + synchronized (sendQueen){ | |
1645 | + LogUtil.i(TAG,"投票信标变化,清除已发队列"); | |
1646 | + for(VoteResultItem temp : sendQueen){ | |
1647 | + LogUtil.i(TAG,"清除数据",temp.data); | |
1648 | + } | |
1649 | + sendQueen.clear(); | |
1650 | + } | |
1651 | + } | |
1652 | + | |
1653 | + private byte[] broadcastData = new byte[4096]; | |
1654 | + private byte[] fileData; | |
1655 | + private int fileLen; | |
1656 | + private int dataLen; | |
1657 | + private int lastPackH = -1; | |
1658 | + | |
1659 | + private short needBits = 0; | |
1660 | + private int okBits = 0; | |
1661 | + private int currDownloadMsgId; | |
1662 | + private int broadMsgId = -1; | |
1663 | + private long lastOnMultiPackageDataTime; | |
1664 | + | |
1665 | + private int maxPackH; //用于计算收到长度 | |
1666 | + private int maxPachL; //用于计算收到长度 | |
1667 | + | |
1668 | + private int downType; | |
1669 | + private int downId; | |
1670 | + | |
1671 | + private boolean isMineDonwload = false ; | |
1672 | + | |
1673 | + /** | |
1674 | + * 字节 标识符 描述 | |
1675 | + * 1 DOWNCMD 0x40 下载多包类指令 | |
1676 | + * 2-3 KEYID 表决器编号,2字节,高位在前 | |
1677 | + * 一般要指定表决器编号使指定键盘进入或退出下载状态 | |
1678 | + * 但0x0000广播时候,键盘也执行 | |
1679 | + * FF01到FFFE时候,是用序列号指定键盘 V4.74 | |
1680 | + * 低位字节01-FE,表示下载次序,由SDK管理,新下载变化一次, | |
1681 | + * 键盘收到的时候,记录下,同时,此次序也出现在下载数据包中,这样键盘可判断是否是我可以下载的数据,避免上次下载状态没正常退出而错误接受数据 | |
1682 | + * 4 DOWNCMD 1 进入或退出下载状态 | |
1683 | + * 5 DOWNTYPE 多包类型 | |
1684 | + * 6 DOWNID 数据包标识码 | |
1685 | + * 7 DCMD 模式 1进入下载 0退出下载 | |
1686 | + * 8-24 FILENAME 在DOWNTYPE=40下载文件模式时候,是下载文件名称,16字符 | |
1687 | + * 其他模式参数无意义 | |
1688 | + * SN 序列号模式时候,6字节键盘序列号,用于指定键盘 | |
1689 | + * 暂不支持文件下载 | |
1690 | + * | |
1691 | + * @param data | |
1692 | + * @param size | |
1693 | + */ | |
1694 | + private void onMultiPackageInfo(byte[] data, int size) { | |
1695 | + byte[] dt = Arrays.copyOfRange(data, 3, data.length);// 从len开始,和文档下标统一 | |
1696 | + int downCmd = dt[4]; //1 进入或退出下载状态 | |
1697 | + | |
1698 | + int dcmd = dt[7];// 1:进入下载 0:退出下载 | |
1699 | + | |
1700 | + if (downCmd == 1) { // 1:进入/退出下载 | |
1701 | + resopnseMultiPackageMode(data, size); | |
1702 | + if (dcmd == 1) { //模式 1进入下载 | |
1703 | + int keyId = (data[5] << 8) | data[6]; | |
1704 | + if (keyId == onLineInfo.keyId || keyId == 0 || keyId == 0xFFFF) { | |
1705 | +// isMineDonwload = true; | |
1706 | + downType = dt[5];// 10即时信息 或 11短信 40 下载文件 | |
1707 | + downId = dt[6]; ////数据包标识码 | |
1708 | + LogUtil.d(TAG, " 1:进入下载 。。。。。downType = " + downType + " downId:" + downId); | |
1709 | + lastPackH = -1; | |
1710 | + if (downType == 40) { //下载文件模式 @Auther Elvis | |
1711 | + int packH = (dt[8] & 0xff); | |
1712 | + int packL = (dt[9] & 0xff); | |
1713 | + fileLen = packH * 256 + packL + 1; | |
1714 | + int len = 0; | |
1715 | + for (int i = 10; i < 26; i++) { | |
1716 | + if (dt[i] == 0) { | |
1717 | + break; | |
1718 | + } | |
1719 | + len++; | |
1720 | + } | |
1721 | + String fileName = "test.txt"; | |
1722 | + try { | |
1723 | + fileName = new String(dt, 10, len, "GB2312"); | |
1724 | + } catch (Exception e) { | |
1725 | + e.printStackTrace(); | |
1726 | + } | |
1727 | + dataLen = fileLen + 36; | |
1728 | + LogUtil.d(TAG, "下载文件,长度:" + fileLen + ", 文件名:" + fileName); | |
1729 | + if (fileLen > 0) { | |
1730 | + fileData = new byte[dataLen]; | |
1731 | + Arrays.fill(fileData, (byte) 0x0); | |
1732 | + } | |
1733 | + | |
1734 | + try { | |
1735 | + RFFileDownloadModule.getInstance().getDownloadProcess().setFileName(fileName); | |
1736 | + RFFileDownloadModule.getInstance().getDownloadProcess().setLength(fileLen - 4); | |
1737 | + RFFileDownloadModule.getInstance().getDownloadProcess().onStartDownload(); | |
1738 | + } catch (Exception e1) { | |
1739 | + } | |
1740 | + | |
1741 | + | |
1742 | + } else if (downType >= 1 && downType <= 3) { | |
1743 | + m_listener.onMultiPackageStartDownload(downType, downId); | |
1744 | + maxPackH = 0; | |
1745 | + maxPachL = 0; | |
1746 | + Arrays.fill(broadcastData, (byte) 0x0); | |
1747 | + } else { | |
1748 | + maxPackH = 0; | |
1749 | + maxPachL = 0; | |
1750 | + Arrays.fill(broadcastData, (byte) 0x0); | |
1751 | + } | |
1752 | + } | |
1753 | + } else { //0退出下载 | |
1754 | + int keyId = (data[5] << 8) | data[6]; | |
1755 | + if (keyId == onLineInfo.keyId || keyId == 0 || keyId == 0xFFFF) { | |
1756 | + isMineDonwload = false; | |
1757 | + LogUtil.d(TAG, dcmd + ": 退出下载。。。。。。。。。"); | |
1758 | + if (downType == 40) { | |
1759 | + //@Auther Elvis 添加文件下载逻辑 | |
1760 | + if (System.currentTimeMillis() - lastOnMultiPackageDataTime > 500) { | |
1761 | + lastOnMultiPackageDataTime = System.currentTimeMillis(); | |
1762 | + try { | |
1763 | + if (fileData != null) { | |
1764 | + File file = RFFileDownloadModule.getInstance().getDownloadProcess().getFile(); | |
1765 | + FileOutputStream fileOutputStream = new FileOutputStream(file); | |
1766 | + fileOutputStream.write(fileData, 0, fileLen - 4); | |
1767 | + fileOutputStream.flush(); | |
1768 | + fileOutputStream.close(); | |
1769 | + fileData = null; | |
1770 | + RFFileDownloadModule.getInstance().getDownloadProcess().onStopDownload(); | |
1106 | 1771 | } |
1107 | - iSerRxN = 0; | |
1772 | + } catch (Exception ex) { | |
1773 | + LogUtil.e(TAG, ex); | |
1774 | + RFFileDownloadModule.getInstance().getDownloadProcess().onDownloadError(ex); | |
1775 | + } | |
1776 | + } | |
1777 | + | |
1778 | + } else if (downType >= 1 && downType <= 3) { | |
1779 | + if (System.currentTimeMillis() - lastOnMultiPackageDataTime > 500) { | |
1780 | + lastOnMultiPackageDataTime = System.currentTimeMillis(); | |
1781 | + LogUtil.d(TAG, "maxPackH:" + maxPackH + " maxPachL:" + maxPachL); | |
1782 | + broadcastData[0] = (byte) 0xF4; | |
1783 | + broadcastData[1] = (byte) 0xF5; | |
1784 | + broadcastData[2] = (byte) downType; | |
1785 | + broadcastData[3] = (byte) downId; | |
1786 | + m_listener.onMultiPackageData(broadcastData, (maxPackH + 1) * 16 + (maxPachL + 1) * 16 + 4); | |
1787 | + } | |
1788 | + } | |
1789 | + } | |
1790 | + } | |
1791 | + } else if (downCmd == 2) { // 2:下载数据 | |
1792 | +// if(isMineDonwload) { | |
1793 | + int msgid = (byte) dt[6] & 0xFF; | |
1794 | + byte packH = dt[7];// 数据段 编号 当前最大15(16片) | |
1795 | + byte packL = dt[8];// 数据片编号 | |
1796 | + LogUtil.d(TAG, "下载。。。msgId:" + msgid + " packH:" + packH + " apckL:" + packL); | |
1797 | + | |
1798 | + if (downType == 40) {// 文件下载 | |
1799 | + if (lastPackH != packH) { //新的packH | |
1800 | + LogUtil.i(TAG, "new packH......."); | |
1801 | + okBits = 0; | |
1802 | + lastPackH = packH; | |
1803 | + } | |
1804 | + int destPos = ((packH & 0xFF) * 16 + (packL & 0xFF)) * 16; | |
1805 | + if (destPos + 16 <= fileData.length) { | |
1806 | + System.arraycopy(dt, 9, fileData, destPos, 16); | |
1807 | + } | |
1808 | + | |
1809 | + if ((okBits & (1 << packL)) == 0) {// 添加文件下载逻辑 进度 | |
1810 | + RFFileDownloadModule.getInstance().getDownloadProcess().onDownloadAddProcess(16); | |
1811 | + } | |
1812 | + okBits |= (1 << packL); | |
1813 | + LogUtil.d(TAG, "packL:" + packL + " okBits:" + okBits); | |
1814 | + | |
1815 | + } else {// 广播 | |
1816 | + | |
1817 | + | |
1818 | + if (broadMsgId != msgid) { | |
1819 | + Arrays.fill(broadcastData, (byte) 0x0); | |
1820 | + broadMsgId = msgid; | |
1821 | + okBits = 0; | |
1822 | + } | |
1823 | + if (lastPackH != packH) { | |
1824 | + LogUtil.i(TAG, "new packH......."); | |
1825 | + needBits = calcBits(packH); | |
1826 | + okBits = 0; | |
1827 | + lastPackH = packH; | |
1828 | + maxPachL = 0; | |
1829 | + } | |
1830 | + | |
1831 | + if (packH > maxPackH) { | |
1832 | + maxPackH = packH; | |
1833 | + } | |
1834 | + if (packL > maxPachL) { | |
1835 | + maxPachL = packL; | |
1836 | + } | |
1837 | + | |
1838 | + if (downType >= 1 && downType <= 3) { | |
1839 | + System.arraycopy(dt, 9, broadcastData, (packH * 16 + packL) * 16 + 4, 16); | |
1840 | + } else { | |
1841 | + System.arraycopy(dt, 9, broadcastData, packL * 16, 16);//短信 packH 总共多少片, packL 第几片 | |
1842 | + } | |
1843 | + okBits |= (1 << packL); | |
1844 | + LogUtil.d(TAG, "packL:" + packL + " okBits:" + okBits + " needBits:" + (needBits & 0xffff) + " downType:" + downType); | |
1845 | + if (downType == 0 || downType > 3) { | |
1846 | + | |
1847 | + if (okBits == needBits) { | |
1848 | + if (broadMsgId != currDownloadMsgId) { | |
1849 | + m_listener.onMultiPackageData(broadcastData, (packH + 1) * 16); | |
1850 | + currDownloadMsgId = broadMsgId; | |
1108 | 1851 | } |
1852 | + Arrays.fill(broadcastData, (byte) 0x0); | |
1853 | + broadMsgId = -1; | |
1854 | + lastPackH = -1; | |
1855 | + //okBits = 0; | |
1109 | 1856 | |
1110 | 1857 | } |
1858 | + } | |
1859 | + } | |
1860 | +// } | |
1861 | + } else if (downCmd == 3) { // 3:询问 | |
1862 | + resopnseMultiPackageQuery(data, size); | |
1863 | + LogUtil.d(TAG, " 3:询问。。。。。。。。。"); | |
1864 | + | |
1865 | + | |
1866 | + } | |
1867 | + } | |
1868 | + | |
1869 | + private short calcBits(byte packh) { | |
1870 | + short bits = 0; | |
1871 | + for (int i = 0; i <= packh; i++) { | |
1872 | + bits |= (1 << i); | |
1873 | + } | |
1874 | + return bits; | |
1875 | + } | |
1876 | + | |
1877 | + private void resopnseMultiPackageMode(byte[] data, int size) { | |
1878 | + byte[] retData = Arrays.copyOf(data, size); | |
1879 | + retData[4] = (byte) 0xC0; | |
1880 | + writeToCom(retData); | |
1881 | + } | |
1882 | + | |
1883 | + private void resopnseMultiPackageQuery(byte[] data, int size) { | |
1884 | + byte[] retData = Arrays.copyOf(data, size); | |
1885 | + retData[4] = (byte) 0xC0; | |
1886 | + int tmpOk = ~okBits; | |
1887 | + retData[11] = (byte) tmpOk; | |
1888 | + retData[12] = (byte) (tmpOk >> 8); | |
1889 | + writeToCom(retData); | |
1890 | + } | |
1891 | + | |
1892 | + public static String getVoteType(int mode) { | |
1893 | + switch (mode) { | |
1894 | + case VoteType_Stop: | |
1895 | + return "VoteType_Stop"; | |
1896 | + case VoteType_Signin: | |
1897 | + return "VoteType_Signin"; | |
1898 | + case VoteType_Vote: | |
1899 | + return "VoteType_Vote"; | |
1900 | + case VoteType_BatchVote: | |
1901 | + return "VoteType_BatchVote"; | |
1902 | + case VoteType_BatchElect: | |
1903 | + return "VoteType_BatchElect"; | |
1904 | + | |
1905 | + default: | |
1906 | + break; | |
1907 | + } | |
1908 | + return "" + mode; | |
1909 | + } | |
1910 | + | |
1911 | + public static String getKeySn(byte[] data) { | |
1912 | + String sn = ""; | |
1913 | + String CS = "0123456789ABCDEF"; | |
1914 | + for (int i = 0; i < 6; i++) { | |
1915 | + sn += CS.charAt((data[i] >> 4) & 0xF); | |
1916 | + sn += CS.charAt((data[i] >> 0) & 0xF); | |
1917 | + } | |
1918 | + return sn; | |
1919 | + | |
1920 | + } | |
1921 | + | |
1922 | + private long writeOkPageNo; | |
1923 | + private int compareCount; | |
1924 | + | |
1925 | + private class CheckFirmReceveThread extends Thread { | |
1926 | + public void run() { | |
1927 | + while (true) { | |
1928 | + try { | |
1929 | + Thread.sleep(2000); | |
1930 | + if (writeOkPageNo != firmWritePage) { | |
1931 | + writeOkPageNo = firmWritePage; | |
1932 | + //sendMessage(keypadID + ":recv"+lastReceveLength+"\n"); | |
1933 | + //LogUtil.d(TAG,"CheckReceveThread:check ok!"); | |
1934 | + compareCount = 0; | |
1935 | + } else { | |
1936 | + compareCount++; | |
1937 | + Thread.sleep(2000); | |
1938 | + if (compareCount <= 20) { | |
1939 | + LogUtil.d(TAG, "CheckWriteFirmhread:retry ==========="); | |
1940 | + | |
1941 | + m_listener.onFirmUpdateInfo("与入页:" + firmWritePage + "失败, 次数:" + compareCount); | |
1942 | + writeFlash(firmWritePage); | |
1943 | + } else { | |
1944 | + compareCount = 0; | |
1945 | + | |
1946 | + LogUtil.d(TAG, "CheckWriteFirmhread:fail , exit!"); | |
1947 | + | |
1948 | + LogUtil.e(TAG, "写入扇区" + firmWritePage + "失败!"); | |
1949 | + m_listener.onFirmUpdateResult(false, "写入扇区" + firmWritePage + "失败!"); | |
1950 | + exitFirmUpdate(2); | |
1951 | + | |
1952 | + break; | |
1953 | + } | |
1954 | + } | |
1955 | + | |
1956 | + | |
1957 | + if (firmWritePage > 0 && firmWritePage == firmWritePageMax) { | |
1958 | + LogUtil.d(TAG, "CheckWriteFirmhread:ok : exit!"); | |
1111 | 1959 | break; |
1112 | - }// switch | |
1113 | - } // for | |
1960 | + } | |
1961 | + | |
1962 | + } catch (InterruptedException e) { | |
1963 | + e.printStackTrace(); | |
1964 | + } | |
1965 | + | |
1966 | + } | |
1967 | + } | |
1968 | + } | |
1969 | + | |
1970 | + ; | |
1971 | + | |
1972 | + private static int encodeBCD(byte c) { | |
1973 | + if (c >= 'a' && c <= 'f') { | |
1974 | + return 10 + (c - 'a'); | |
1975 | + } else if (c >= '0' && c <= '9') { | |
1976 | + return c - '0'; | |
1977 | + } else if (c >= 'A' && c <= 'F') { | |
1978 | + return 10 + (c - 'A'); | |
1979 | + } else if (c == '.') { | |
1980 | + return 0xE; | |
1981 | + } | |
1982 | + return -1; | |
1983 | + } | |
1984 | + | |
1985 | + | |
1986 | + /** | |
1987 | + * 把字符串形式转换为字节形式 | |
1988 | + */ | |
1989 | + private byte[] util_encodeBCD(byte[] cs) { | |
1990 | + byte[] rs = new byte[17]; | |
1991 | + Arrays.fill(rs, (byte) 0xff);// | |
1992 | + | |
1993 | + int len = cs.length < 16 ? cs.length : 16; | |
1994 | + int io = 0; | |
1995 | + | |
1996 | + for (int i = 0; i < len; i += 2) { | |
1997 | + int n = encodeBCD(cs[i]); | |
1998 | + n <<= 4; | |
1999 | + if (i + 1 == cs.length) { | |
2000 | + rs[io++] = (byte) (n | 0xf); | |
2001 | + break; | |
2002 | + } | |
2003 | + | |
2004 | + n |= encodeBCD(cs[i + 1]); | |
2005 | + if (n < 0) { | |
2006 | + break; | |
2007 | + } | |
2008 | + rs[io++] = (byte) n; | |
2009 | + } | |
2010 | + rs[++io] = 0; | |
2011 | + return rs; | |
2012 | + } | |
2013 | + | |
2014 | + public static String util_decodeBCD(byte[] cs, int len) { | |
2015 | + byte[] buf = new byte[8 * 2]; | |
2016 | + Arrays.fill(buf, (byte) 0); | |
2017 | + String bcdNum = "0123456789ABCD.F"; | |
2018 | + String bcdStr = bytesToHexString(cs); | |
2019 | + for (int i = 0; i < len * 2; i += 2) { | |
2020 | + byte item = bcdStr.getBytes()[i]; | |
2021 | + if (item >= '0' && item <= '9') { | |
2022 | + buf[i] = item; | |
2023 | + } else if (item == 'E') { | |
2024 | + buf[i] = '.'; | |
2025 | + } else if (item == 'F') { | |
2026 | + buf[i] = 0; | |
2027 | + break; | |
2028 | + } | |
2029 | + | |
2030 | + item = bcdStr.getBytes()[i + 1]; | |
2031 | + if (item >= '0' && item <= '9') { | |
2032 | + buf[i + 1] = item; | |
2033 | + } else if (item == 'E') { | |
2034 | + buf[i + 1] = '.'; | |
2035 | + } else if (item == 'F') { | |
2036 | + buf[i + 1] = 0; | |
2037 | + break; | |
2038 | + } | |
2039 | + | |
2040 | + } | |
2041 | + return new String(buf).trim(); | |
2042 | + | |
2043 | + } | |
1114 | 2044 | |
2045 | + public static String bytesToHexString(byte[] src) { | |
2046 | + StringBuilder stringBuilder = new StringBuilder(""); | |
2047 | + if (src == null || src.length <= 0) { | |
2048 | + return null; | |
1115 | 2049 | } |
1116 | - } | |
1117 | - | |
1118 | - @SuppressLint("NewApi") | |
1119 | - private void checkComData(byte[] data, int size) { | |
1120 | - LogUtil.i(TAG,"checkComData",data); | |
1121 | - m_listener.onComData(data, size); | |
1122 | - int cmd = data[4] & 0xFF; | |
1123 | - | |
1124 | - switch (cmd) { | |
1125 | - case CMD_CHECK_BASE_STATUS_RESPONSE:// 查询状态类指令应答 | |
1126 | - int cmd1 = data[5] & 0xFF; | |
1127 | - if (cmd1 == 1) {// 返回当前工作模式和版本 | |
1128 | - ModelInfo info = new ModelInfo(); | |
1129 | - info.mode = data[6]; | |
1130 | - info.hModel = data[7] & 0xff; | |
1131 | - info.sVer = data[8] + "." + data[9] + "." + data[10]; | |
1132 | - m_listener.onModelEvent(info); | |
1133 | - } else if (cmd1 == 3) { // 查询基础信标 结果 | |
1134 | - onBaseInfo(data); | |
1135 | - } else if (cmd1 == 4) { // 查询投票信标 结果 | |
1136 | - onVoteInfo(data); | |
1137 | - } else if (cmd1 == 5 || cmd1 == 6) {// 返回当前键盘参数结果 | |
1138 | - KeypadInfo info = new KeypadInfo(); | |
1139 | - info.ok = data[6]; | |
1140 | - info.chan = data[7]; | |
1141 | - info.keyId = ((data[8] & 0xff) << 8) | (data[9] & 0xff); | |
1142 | - byte[] sn = Arrays.copyOfRange(data, 10, 16); | |
1143 | - info.keySn = getKeySn(sn); | |
1144 | - byte[] mc = Arrays.copyOfRange(data, 16, 19); | |
1145 | - info.matchCode = new String(mc); | |
1146 | - m_listener.onKeyPadEvent(info); | |
1147 | - | |
1148 | - // if(!hasGetBaseInfo){ //第一次启动时取 | |
1149 | - // hasGetBaseInfo = true; | |
1150 | - // getBaseStatus(); | |
1151 | - // } | |
1152 | - | |
1153 | - } else if (cmd1 == 7) {// 查询键盘在线状态结果 | |
1154 | - OnLineInfo info = new OnLineInfo(); | |
1155 | - info.onLine = data[6]; | |
1156 | - info.idMode = data[7]; | |
1157 | - info.chan = data[8] & 0xff; | |
1158 | - info.rssi = data[9] & 0xff; | |
1159 | - info.tx = data[10]; | |
1160 | - info.rx = data[11]; | |
1161 | - info.baseId = data[12] & 0xff; | |
1162 | - info.keyId = ((data[13] & 0xff) << 8) | (data[14] & 0xff); | |
1163 | - byte[] sn = Arrays.copyOfRange(data, 15, 21); | |
1164 | - info.keySn = getKeySn(sn); | |
1165 | - onLineInfo = info; | |
1166 | - m_listener.onOnLineEvent(info); | |
1167 | - | |
1168 | - } else if (cmd1 == 8 || cmd1 == 9) { | |
1169 | - KeypadInfo info = new KeypadInfo(); | |
1170 | - info.cmd1 = cmd1; | |
1171 | - info.ok = data[6]; | |
1172 | - info.chan = data[7]; | |
1173 | - info.keyId = ((data[8] & 0xff) << 8) | (data[9] & 0xff); | |
1174 | - byte[] sn = Arrays.copyOfRange(data, 10, 16); | |
1175 | - info.keySn = getKeySn(sn); | |
1176 | - byte[] mc = Arrays.copyOfRange(data, 16, 19); | |
1177 | - info.matchCode = new String(mc); | |
1178 | - m_listener.onKeyPadEvent(info); | |
1179 | - } | |
1180 | - | |
1181 | - break; | |
1182 | - case CMD_BASE_STATUS_CHANGE:// 基础信标变化(主动下发) | |
1183 | - responseBaseStatusChange(data, size); | |
1184 | - onBaseInfo(data); | |
1185 | - break; | |
1186 | - case CMD_VOTE_STATUS_CHANGE:// 投票信标变化 | |
1187 | - | |
1188 | - responseVoteStatusChange(data, size); | |
1189 | - clearSentItems(); | |
1190 | - onVoteInfo(data); | |
1191 | - | |
1192 | - break; | |
1193 | - | |
1194 | - case CMD_VOTE_RESULT_SEND_RESPONSE: | |
1195 | -// sendToModalSuccessResponse( data[5] & 0xff); | |
1196 | - break; | |
1197 | - case CMD_VOTE_SEND_SUCCESS_RESPONSE: | |
1198 | - sendToModalSuccessResponse( data[5] & 0xff); | |
1199 | - responseVoteSendSuccess(data, size); | |
1200 | - break; | |
1201 | - | |
1202 | - case CMD_KEY_MANAGE:// 表决器管理类指令,单包,透传 | |
1203 | - CmdDataInfo info = new CmdDataInfo(); | |
1204 | - info.cmd = data[7]; | |
1205 | - info.data = Arrays.copyOfRange(data, 8, 28); | |
1206 | - if(info.cmd == 25 ){ | |
1207 | - int keyId = (data[5] << 8) | data[6]; | |
1208 | - if(keyId != 0) { | |
1209 | - responseClearKeyboardData(data,size); | |
1210 | - } | |
1211 | - }else if(info.cmd == 20){ | |
1212 | - int keyId = (data[5] << 8) | data[6]; | |
1213 | - if(keyId == onLineInfo.keyId){ | |
1214 | - responseAuthrizeKeyboardData(data,size); | |
1215 | - }else{ | |
1216 | - break; | |
1217 | - } | |
1218 | - } | |
1219 | - m_listener.onCmdData(info); | |
1220 | - break; | |
1221 | - case CMD_MULTI_PCKAGE_DOWNLOAD: | |
1222 | - onMultiPackageInfo(data, size); | |
1223 | - break; | |
1224 | - case CMD_COM_COMMUNICATION_TEST_RESPONSE: | |
1225 | - int sendn = data[8] & 0xff; | |
1226 | - boolean isOk = true; | |
1227 | - for(int i=1;i<17;i++){ | |
1228 | - if(data[10+i] != i){ | |
1229 | - isOk = false; | |
1230 | - } | |
1231 | - } | |
1232 | - m_listener.onComCommunicationTest(sendn,isOk); | |
1233 | - break; | |
1234 | - case CMD_FIRM_UPDATE_RESPONSE: | |
1235 | - switch (data[5]) { | |
1236 | - case 2:// '模块询问是否进入DFU | |
1237 | - keepFirmMode(); | |
1238 | - eraseFlash(); | |
1239 | - break; | |
1240 | - case 3:// 擦除应答 | |
1241 | - if (data[8] != 1) { | |
1242 | - LogUtil.e(TAG, "eraseFlash fail"); | |
1243 | - m_listener.onFirmUpdateResult(false, "擦除固件失败!"); | |
1244 | - break; | |
1245 | - } | |
1246 | - LogUtil.e(TAG, "eraseFlash ok"); | |
1247 | - m_listener.onFirmUpdateInfo("擦除固件完成,开始写入..."); | |
1248 | - CheckFirmReceveThread checkFirmThread = new CheckFirmReceveThread(); | |
1249 | - checkFirmThread.start(); | |
1250 | - writeFrimPageErrCnt = 0; | |
1251 | - writeFlash(firmWritePage); | |
1252 | - break; | |
1253 | - case 4:// 写应答 | |
1254 | - if (data[8] == 1) { | |
1255 | - firmWritePage++; | |
1256 | - writeFrimPageErrCnt = 0; | |
1257 | - if (firmWritePage < firmWritePageMax ) { | |
1258 | - m_listener.onFirmUpdate(firmWritePage * 100 / firmWritePageMax); | |
1259 | - LogUtil.d(TAG, "write page ok! " + firmWritePage + "/" + firmWritePageMax + " ==" | |
1260 | - + firmWritePage * 100 / firmWritePageMax + "%"); | |
1261 | - writeFlash(firmWritePage); | |
1262 | - } else { | |
1263 | - m_listener.onFirmUpdateInfo("写入完成"); | |
1264 | - m_listener.onFirmUpdate(100); | |
1265 | - LogUtil.i(TAG, "write 100%"); | |
1266 | - sleep(2000); | |
1267 | - exitFirmUpdate(1); | |
1268 | - LogUtil.i(TAG, "exitFirmUpdate"); | |
1269 | - m_listener.onFirmUpdateResult(true, null); | |
1270 | - } | |
1271 | - } else { | |
1272 | - LogUtil.d(TAG,"应答写失败 write page error"); | |
1273 | - } | |
1274 | - break; | |
1275 | - case 5: // 退出升级 | |
1276 | - LogUtil.d(TAG, "exit update!"); | |
1277 | - m_listener.onFirmUpdateInfo("退出升级模式成功!"); | |
1278 | - sleep(3000); | |
1279 | - LogUtil.d(TAG, "sleep 3s getWorkMode!"); | |
1280 | - for(int i=0;i<5;i++) { | |
1281 | - getWorkMode(); | |
1282 | - sleep(1000); | |
1283 | - } | |
1284 | - getBaseStatus(); | |
1285 | - | |
1286 | - break; | |
1287 | - default: | |
1288 | - break; | |
1289 | - } | |
1290 | - default: | |
1291 | - break; | |
1292 | - } | |
1293 | - | |
1294 | - } | |
1295 | - | |
1296 | - private void sleep(int ms){ | |
1297 | - try { | |
1298 | - Thread.sleep(ms); | |
1299 | - } catch (Exception e) { | |
1300 | - } | |
1301 | - } | |
1302 | - | |
1303 | - //// 回应模块基础信标变化,模块停止重发,否则模块会不断发送 | |
1304 | - private void responseBaseStatusChange(byte[] data, int size) { | |
1305 | - byte[] retData = Arrays.copyOf(data, size); | |
1306 | - retData[4] = (byte) 0xF1; | |
1307 | - writeToCom(retData); | |
1308 | - } | |
1309 | - | |
1310 | - // 处理基础信标变化 | |
1311 | - private void onBaseInfo(byte[] data) { | |
1312 | - LogUtil.i(TAG,"onBaseInfo",data); | |
1313 | - BaseInfo info = new BaseInfo(); | |
1314 | - info.baseId = data[5] & 0xff;// baseID | |
1315 | - info.idMode = data[6] & 0xff; | |
1316 | - info.confId = ((data[7] & 0xff) << 8) | (data[8] & 0xff); | |
1317 | - | |
1318 | - info.billId = data[9] & 0xff; | |
1319 | - info.authCode = (data[10] & 0xff) << 8 | (data[11] & 0xff); | |
1320 | - info.login = data[12] & 0xff; | |
1321 | - info.report = data[13] & 0xff; | |
1322 | - info.offTime = data[14] & 0xff; | |
1323 | - info.attrib = data[15] & 0xff; | |
1324 | - info.pageNo = (data[16] & 0xff) << 8 | (data[17] & 0xff); | |
1325 | - byte[] bname = Arrays.copyOfRange(data, 16, 16 + 12); | |
1326 | - info.baseName = new String(bname); | |
1327 | - | |
1328 | - m_listener.onBaseEvent(info); | |
1329 | - } | |
1330 | - | |
1331 | - // 回应模块投票信标变化,模块停止重发,否则模块会不断发送 | |
1332 | - private void responseVoteStatusChange(byte[] data, int size) { | |
1333 | - byte[] retData = Arrays.copyOf(data, size); | |
1334 | - retData[4] = (byte) 0xF2; | |
1335 | - writeToCom(retData); | |
1336 | - } | |
1337 | - | |
1338 | - // 回应发送成功通知 | |
1339 | - private void responseVoteSendSuccess(byte[] data, int size) { | |
1340 | - | |
1341 | -// byte[] retData = Arrays.copyOf(data, size); | |
1342 | -// retData[4] = (byte) 0xF3; | |
1343 | -// writeToCom(retData); | |
1344 | - | |
1345 | - int serialNo = data[5] & 0xff; | |
1346 | - VoteResultItem item = removeSentItem(serialNo); | |
1347 | - | |
1348 | - if ((byte)serialNo == allOkSerialNumber) { | |
1349 | - m_listener.onVoteSubmitAllOkSuccess(); | |
1350 | - } else { | |
1351 | - if(item == null){ | |
1352 | - LogUtil.e(TAG,"serialNo " + " 丢失???"); | |
1353 | - } | |
1354 | - m_listener.onVoteSubmitSuccess(item); | |
1355 | - } | |
1356 | - } | |
1357 | - | |
1358 | - //回复清空键盘数据 | |
1359 | - private void responseClearKeyboardData(byte[] data,int len){ | |
1360 | - byte[] retData = Arrays.copyOf(data, len); | |
1361 | - retData[4] = (byte) 0xB0; | |
1362 | - retData[8] = 1; | |
1363 | - writeToCom(retData); | |
1364 | - } | |
1365 | - | |
1366 | - //回复键盘授权数据 | |
1367 | - private void responseAuthrizeKeyboardData(byte[] data,int len){ | |
1368 | - byte[] retData = Arrays.copyOf(data, len); | |
1369 | - retData[4] = (byte) 0xB0; | |
1370 | - retData[8] = 1; | |
1371 | - writeToCom(retData); | |
1372 | - } | |
1373 | - | |
1374 | - // 处理投票信标变化 | |
1375 | - private void onVoteInfo(byte[] data) { | |
1376 | - byte[] dt = Arrays.copyOfRange(data, 4, data.length);// 从len开始,和文档下标统一 | |
1377 | - VoteInfo info = new VoteInfo(); | |
1378 | - info.baseId = dt[1] & 0xff; | |
1379 | - info.nowT = dt[2] & 0xff << 8 | dt[3] & 0xff; | |
1380 | - info.dataPos = dt[4] & 0xff; | |
1381 | - info.mode = dt[5] & 0xff; | |
1382 | - info.mode1_msgType = dt[6] & 0xff; | |
1383 | -// if(info.mode != VoteType_Stop){ | |
1384 | -// serialNumber = 0; | |
1385 | -// } | |
1386 | - | |
1387 | - if (info.mode == VoteType_Stop) { // 停止 | |
1388 | - if (info.mode1_msgType == 2) { // 有结果 | |
1389 | - info.resultInfo.resultType = dt[7] & 0xff; | |
1390 | - info.resultInfo.bits = dt[8] & 0xff; | |
1391 | - info.resultInfo.num0 = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1392 | - info.resultInfo.num1 = (dt[11] & 0xff) << 8 | (dt[12] & 0xff); | |
1393 | - info.resultInfo.num2 = (dt[13] & 0xff) << 8 | (dt[14] & 0xff); | |
1394 | - info.resultInfo.num3 = (dt[15] & 0xff) << 8 | (dt[16] & 0xff); | |
1395 | - info.resultInfo.num4 = (dt[17] & 0xff) << 8 | (dt[18] & 0xff); | |
1396 | - info.resultInfo.num5 = (dt[19] & 0xff) << 8 | (dt[20] & 0xff); | |
1397 | - if(dt.length > 22){ | |
1398 | - info.resultInfo.num6 = (dt[21] & 0xff) << 8 | (dt[22] & 0xff); | |
1399 | - } | |
1400 | - } | |
1401 | - } else if (info.mode == VoteType_BatchVote) { | |
1402 | - printDataBuf(data, data.length, "batchvote:"); | |
1403 | - if(dt.length > 23){ | |
1404 | - info.mode2_modify = dt[23] & 0xff; | |
1405 | - } | |
1406 | - info.mode3_secret = dt[12] & 0xff; | |
1407 | - info.less = dt[11] & 0xff; | |
1408 | - info.mode3_secret = dt[12] & 0xff; | |
1409 | - info.fixballot = dt[13] & 0xff ; | |
1410 | - if(info.fixballot > 0 ){ | |
1411 | - info.limitFavor = dt[14] & 0xff ; | |
1412 | - info.limitOppo = dt[15] & 0xff ; | |
1413 | - info.limitWaiver = dt[16] & 0xff ; | |
1414 | - }else{ | |
1415 | - info.limitFavor = 0 ; | |
1416 | - info.limitOppo = 0 ; | |
1417 | - info.limitWaiver = 0; | |
1418 | - } | |
1419 | - info.voteid = dt[21] & 0xff; | |
1420 | - } else if (info.mode == VoteType_Choice) { | |
1421 | - info.mode2_modify = dt[7] & 0xff; | |
1422 | - info.mode3_secret = dt[8] & 0xff; | |
1423 | - info.mode4 = dt[9] & 0xff; | |
1424 | - info.mode5 = dt[10] & 0xff; | |
1425 | - info.mode6 = dt[11] & 0xff; | |
1426 | - info.mode7 = dt[12] & 0xff; | |
1427 | - }else if(info.mode == VoteType_BatchElect) {//选举 | |
1428 | - info.electInfo.type = dt[6] & 0xff; | |
1429 | - info.electInfo.random = dt[7] & 0xff; | |
1430 | - info.electInfo.select = dt[8] & 0xff; | |
1431 | - info.electInfo.other = dt[9] & 0xff; | |
1432 | - info.electInfo.less = dt[10] & 0xff; | |
1433 | - info.electInfo.secrecy = dt[11] & 0xff; | |
1434 | - info.electInfo.modify = dt[12] & 0xff; | |
1435 | - info.electInfo.start = dt[13] & 0xff; | |
1436 | - info.electInfo.end = dt[14] & 0xff; | |
1437 | - info.electInfo.equityMode = dt[15] & 0xff; | |
1438 | - info.electInfo.minSelect = dt[16] & 0xff; | |
1439 | - info.electInfo.voteid = dt[21] & 0xff; | |
1440 | - | |
1441 | - }else if(info.mode == VoteType_SingleItemEvalue) {//单项评分 | |
1442 | - info.singleEvalueInfo.mode1 = dt[6] & 0xff; | |
1443 | - info.singleEvalueInfo.mode2 = dt[7] & 0xff; | |
1444 | - info.singleEvalueInfo.mode3 = dt[8] & 0xff; | |
1445 | - info.singleEvalueInfo.mode4 = dt[9] & 0xff; | |
1446 | - info.singleEvalueInfo.mode5 = dt[10] & 0xff; | |
1447 | - info.singleEvalueInfo.mode6 = dt[11] & 0xff; | |
1448 | - info.singleEvalueInfo.mode7 = dt[12] & 0xff; | |
1449 | - info.singleEvalueInfo.mode8 = dt[13] & 0xff; | |
1450 | - info.singleEvalueInfo.mode9 = dt[14] & 0xff; | |
1451 | - info.singleEvalueInfo.mode10 = dt[15] & 0xff; | |
1452 | - info.singleEvalueInfo.mode11 = dt[16] & 0xff; | |
1453 | - info.singleEvalueInfo.mode12 = dt[17] & 0xff; | |
1454 | - info.singleEvalueInfo.title = new byte[12]; | |
1455 | - | |
1456 | - System.arraycopy(dt, 12, info.singleEvalueInfo.title, 0, 12); | |
1457 | - if(dt.length > 24){ | |
1458 | - info.singleEvalueInfo.number = dt[24] & 0xff; | |
1459 | - } | |
1460 | - }else if(info.mode == VoteType_BatchEvalue) { | |
1461 | - info.batchEvalueInfo.mode1 = dt[6] & 0xff; | |
1462 | - info.batchEvalueInfo.startVal = (dt[7] & 0xff) << 8 | (dt[8] & 0xff); | |
1463 | - info.batchEvalueInfo.endVal = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1464 | - info.batchEvalueInfo.autoMove = dt[11] & 0xff; | |
1465 | - info.batchEvalueInfo.width1 = dt[12] & 0xff; | |
1466 | - info.batchEvalueInfo.width2 = dt[13] & 0xff; | |
1467 | - info.batchEvalueInfo.less = dt[14] & 0xff; | |
1468 | - info.batchEvalueInfo.secrecy = dt[15] & 0xff; | |
1469 | - info.batchEvalueInfo.modify = dt[16] & 0xff; | |
1470 | - info.batchEvalueInfo.ruleStart = dt[17] & 0xff; | |
1471 | - info.batchEvalueInfo.ruleEnd = dt[18] & 0xff; | |
1472 | - info.batchEvalueInfo.sliderover = dt[19] & 0xff; | |
1473 | - }else if(info.mode == VoteType_BatchIDEvalue){ | |
1474 | - info.batchEvalueInfo.mode1 = dt[6] & 0xff; | |
1475 | - info.batchEvalueInfo.startVal = (dt[7] & 0xff) << 8 | (dt[8] & 0xff); | |
1476 | - info.batchEvalueInfo.endVal = (dt[9] & 0xff) << 8 | (dt[10] & 0xff); | |
1477 | - info.batchEvalueInfo.autoMove = dt[11] & 0xff; | |
1478 | - info.batchEvalueInfo.width1 = dt[12] & 0xff; | |
1479 | - info.batchEvalueInfo.width2 = dt[13] & 0xff; | |
1480 | - info.batchEvalueInfo.less = dt[14] & 0xff; | |
1481 | - info.batchEvalueInfo.secrecy = dt[15] & 0xff; | |
1482 | - info.batchEvalueInfo.modify = dt[16] & 0xff; | |
1483 | - info.batchEvalueInfo.ruleStart = dt[17] & 0xff; | |
1484 | - info.batchEvalueInfo.ruleEnd = dt[18] & 0xff; | |
1485 | - info.batchEvalueInfo.sliderover = dt[19] & 0xff; | |
1486 | - } else { | |
1487 | - info.mode2_modify = dt[7] & 0xff; | |
1488 | - info.mode3_secret = dt[8] & 0xff; | |
1489 | - info.mode4 = dt[9] & 0xff; | |
1490 | - info.voteid = dt[11] & 0xff; | |
1491 | - info.file = dt[12] & 0xff; | |
1492 | - info.init = dt[13] & 0xff; | |
1493 | - } | |
1494 | - m_listener.onVoteEvent(info); | |
1495 | - } | |
1496 | - | |
1497 | - | |
1498 | - | |
1499 | - private byte[] broadcastData = new byte[4096]; | |
1500 | - private byte[] fileData; | |
1501 | - private int fileLen; | |
1502 | - private int lastPackH = -1; | |
1503 | - | |
1504 | - private short needBits = 0; | |
1505 | - private int okBits = 0; | |
1506 | - private int currDownloadMsgId; | |
1507 | - private int broadMsgId = -1; | |
1508 | - private long lastOnMultiPackageDataTime; | |
1509 | - | |
1510 | - private int maxPackH; //用于计算收到长度 | |
1511 | - private int maxPachL; //用于计算收到长度 | |
1512 | - | |
1513 | - private int downType; | |
1514 | - private int downId; | |
1515 | - | |
1516 | - | |
1517 | - private void onMultiPackageInfo(byte[] data, int size) { | |
1518 | - byte[] dt = Arrays.copyOfRange(data, 3, data.length);// 从len开始,和文档下标统一 | |
1519 | - int downCmd = dt[4]; //1 进入或退出下载状态 | |
1520 | - downType = dt[5];// 10即时信息 或 11短信 | |
1521 | - downId = dt[6]; ////数据包标识码 | |
1522 | - int dcmd = dt[7];// 1:进入下载 0:退出下载 | |
1523 | - | |
1524 | - if (downCmd == 1) { // 1:进入/退出下载 | |
1525 | - resopnseMultiPackageMode(data, size); | |
1526 | - if (dcmd == 1) {//模式 1进入下载 | |
1527 | - | |
1528 | - Log.d(TAG, " 1:进入下载 。。。。。downType = " + downType + " downId:"+downId); | |
1529 | -// m_listener.onMultiPackageStartDownload(downType,downId); | |
1530 | - if (downType == 40 ) {//下载文件模式 | |
1531 | - lastPackH = -1; | |
1532 | - int packH = dt[8]; | |
1533 | - int packL = dt[9] + 1; | |
1534 | - fileLen = (packH * 16 + packL) * 16 ; | |
1535 | - LogUtil.d(TAG, "下载文件,长度:" + fileLen); | |
1536 | - fileData = new byte[fileLen]; | |
1537 | - Arrays.fill(fileData, (byte) 0x0); | |
1538 | - | |
1539 | - } else if (downType >=1 && downType <=3) { | |
1540 | - maxPackH = 0; | |
1541 | - maxPachL = 0; | |
1542 | - Arrays.fill(broadcastData, (byte) 0x0); | |
1543 | - | |
1544 | - } | |
1545 | - } else { //0退出下载 | |
1546 | - LogUtil.d(TAG, dcmd + ": 退出下载。。。。。。。。。"); | |
1547 | - if (downType == 40) { | |
1548 | - if (System.currentTimeMillis() - lastOnMultiPackageDataTime > 500) { | |
1549 | - lastOnMultiPackageDataTime = System.currentTimeMillis(); | |
1550 | - m_listener.onMultiPackageData(fileData, fileLen -4 ); | |
1551 | - } | |
1552 | - | |
1553 | - }else if(downType >=1 && downType <=3){ | |
1554 | - if (System.currentTimeMillis() - lastOnMultiPackageDataTime > 500) { | |
1555 | - lastOnMultiPackageDataTime = System.currentTimeMillis(); | |
1556 | - Log.d(TAG, "maxPackH:" + maxPackH + " maxPachL:" + maxPachL); | |
1557 | - broadcastData[0] = (byte) 0xF4 ; | |
1558 | - broadcastData[1] = (byte) 0xF5 ; | |
1559 | - broadcastData[2] = (byte) downType; | |
1560 | - broadcastData[3] = (byte) downId; | |
1561 | - m_listener.onMultiPackageData(broadcastData, (maxPackH+1) * 16 + (maxPachL+1) * 16 + 4); | |
1562 | - } | |
1563 | - } | |
1564 | - } | |
1565 | - } else if (downCmd == 2) { // 2:下载数据 | |
1566 | - int msgid = (byte) dt[6]; | |
1567 | - byte packH = dt[7];// 数据段 编号 当前最大15(16片) | |
1568 | - byte packL = dt[8];// 数据片编号 | |
1569 | - LogUtil.d(TAG, "下载。。。msgId:" + msgid + " packH:" + packH + " apckL:" + packL); | |
1570 | - | |
1571 | - if (downType == 40) {// 文件下载 | |
1572 | - if (lastPackH != packH) { //新的packH | |
1573 | - LogUtil.i(TAG, "new packH......."); | |
1574 | - okBits = 0; | |
1575 | - lastPackH = packH; | |
1576 | - } | |
1577 | - System.arraycopy(dt, 9, fileData, (packH * 16 + packL) * 16, 16); | |
1578 | - okBits |= (1 << packL); | |
1579 | - LogUtil.d(TAG, "packL:" + packL + " okBits:" + okBits); | |
1580 | - | |
1581 | - } else {// 广播 | |
1582 | - needBits = calcBits(packH); | |
1583 | - if (broadMsgId != msgid) { | |
1584 | - Arrays.fill(broadcastData, (byte) 0x0); | |
1585 | - broadMsgId = msgid; | |
1586 | - okBits = 0; | |
1587 | - } | |
1588 | - System.arraycopy(dt, 9, broadcastData, packL * 16, 16); | |
1589 | - okBits |= (1 << packL); | |
1590 | - LogUtil.d(TAG, "packL:" + packL + " okBits:" + okBits + " needBits:" + needBits); | |
1591 | - if (okBits == needBits) { | |
1592 | - if (broadMsgId != currDownloadMsgId) { | |
1593 | - m_listener.onMultiPackageData(broadcastData, (packH + 1) * 16); | |
1594 | - currDownloadMsgId = broadMsgId; | |
1595 | - } | |
1596 | - Arrays.fill(broadcastData, (byte) 0x0); | |
1597 | - broadMsgId = msgid; | |
1598 | - okBits = 0; | |
1599 | - } | |
1600 | - /*needBits = calcBits(packH); | |
1601 | - | |
1602 | - if (broadMsgId != msgid) { | |
1603 | - Arrays.fill(broadcastData, (byte) 0x0); | |
1604 | - broadMsgId = msgid; | |
1605 | - okBits = 0; | |
1606 | - } | |
1607 | - System.arraycopy(dt, 9, broadcastData, packL * 16, 16); | |
1608 | - if (lastPackH != packH) { | |
1609 | - Log.i(TAG, "new packH......."); | |
1610 | - needBits = calcBits((byte)16); | |
1611 | - okBits = 0; | |
1612 | - lastPackH = packH; | |
1613 | - maxPachL = 0; | |
1614 | - } | |
1615 | - | |
1616 | - if(packH> maxPackH){ | |
1617 | - maxPackH = packH; | |
1618 | - } | |
1619 | - if(packL > maxPachL){ | |
1620 | - maxPachL = packL; | |
1621 | - } | |
1622 | - | |
1623 | - if(downType >=1 && downType <=3){ | |
1624 | - System.arraycopy(dt, 9, broadcastData, (packH * 16 + packL) * 16 + 4, 16); | |
1625 | - }else { | |
1626 | - System.arraycopy(dt, 9, broadcastData, (packH * 16 + packL) * 16, 16); | |
1627 | - } | |
1628 | - okBits |= (1 << packL); | |
1629 | - Log.d(TAG, "packL:" + packL + " okBits:" + okBits + " needBits:" + (needBits & 0xffff) + " downType" + downType); | |
1630 | - if( downType > 3) { | |
1631 | - | |
1632 | - if (okBits == needBits) { | |
1633 | - if (broadMsgId != currDownloadMsgId) { | |
1634 | - m_listener.onMultiPackageData(broadcastData, (maxPackH * 16 + maxPachL) * 16 ); | |
1635 | - currDownloadMsgId = broadMsgId; | |
1636 | - } | |
1637 | - Arrays.fill(broadcastData, (byte) 0x0); | |
1638 | - broadMsgId = msgid; | |
1639 | - okBits = 0; | |
1640 | - | |
1641 | - } | |
1642 | - }*/ | |
1643 | - } | |
1644 | - } else if (downCmd == 3) { // 3:询问 | |
1645 | - resopnseMultiPackageQuery(data, size); | |
1646 | - Log.d(TAG, " 3:询问。。。。。。。。。"); | |
1647 | - } | |
1648 | - } | |
1649 | - | |
1650 | - private short calcBits(byte packh) { | |
1651 | - short bits = 0; | |
1652 | - for (int i = 0; i <= packh; i++) { | |
1653 | - bits |= (1 << i); | |
1654 | - } | |
1655 | - return bits; | |
1656 | - } | |
1657 | - | |
1658 | - private void resopnseMultiPackageMode(byte[] data, int size) { | |
1659 | - byte[] retData = Arrays.copyOf(data, size); | |
1660 | - retData[4] = (byte) 0xC0; | |
1661 | - writeToCom(retData); | |
1662 | - } | |
1663 | - | |
1664 | - private void resopnseMultiPackageQuery(byte[] data, int size) { | |
1665 | - byte[] retData = Arrays.copyOf(data, size); | |
1666 | - retData[4] = (byte) 0xC0; | |
1667 | - int tmpOk = ~okBits; | |
1668 | - retData[11] = (byte) tmpOk; | |
1669 | - retData[12] = (byte) (tmpOk >> 8); | |
1670 | - writeToCom(retData); | |
1671 | - } | |
1672 | - | |
1673 | - public static String getVoteType(int mode) { | |
1674 | - switch (mode) { | |
1675 | - case VoteType_Stop: | |
1676 | - return "VoteType_Stop"; | |
1677 | - case VoteType_Signin: | |
1678 | - return "VoteType_Signin"; | |
1679 | - case VoteType_Vote: | |
1680 | - return "VoteType_Vote"; | |
1681 | - case VoteType_BatchVote: | |
1682 | - return "VoteType_BatchVote"; | |
1683 | - case VoteType_BatchElect: | |
1684 | - return "VoteType_BatchElect"; | |
1685 | - | |
1686 | - default: | |
1687 | - break; | |
1688 | - } | |
1689 | - return "" + mode; | |
1690 | - } | |
1691 | - | |
1692 | - public static String getKeySn(byte[] data) { | |
1693 | - String sn = ""; | |
1694 | - String CS = "0123456789ABCDEF"; | |
1695 | - for (int i = 0; i < 6; i++) { | |
1696 | - sn += CS.charAt((data[i] >> 4) & 0xF); | |
1697 | - sn += CS.charAt((data[i] >> 0) & 0xF); | |
1698 | - } | |
1699 | - return sn; | |
1700 | - | |
1701 | - } | |
1702 | - | |
1703 | - private long writeOkPageNo; | |
1704 | - private int compareCount; | |
1705 | - private class CheckFirmReceveThread extends Thread{ | |
1706 | - public void run() { | |
1707 | - while (true) { | |
1708 | - try { | |
1709 | - Thread.sleep(1000); | |
1710 | - if(writeOkPageNo != firmWritePage ){ | |
1711 | - writeOkPageNo = firmWritePage; | |
1712 | - //sendMessage(keypadID + ":recv"+lastReceveLength+"\n"); | |
1713 | - //LogUtil.d(TAG,"CheckReceveThread:check ok!"); | |
1714 | - compareCount = 0; | |
1715 | - }else{ | |
1716 | - compareCount ++; | |
1717 | - | |
1718 | - if(compareCount <= 20){ | |
1719 | - LogUtil.d(TAG,"CheckWriteFirmhread:retry ==========="); | |
1720 | - | |
1721 | - m_listener.onFirmUpdateInfo("与入页:"+firmWritePage +"失败, 次数:" + compareCount); | |
1722 | - writeFlash(firmWritePage); | |
1723 | - }else{ | |
1724 | - compareCount = 0; | |
1725 | - | |
1726 | - LogUtil.d(TAG,"CheckWriteFirmhread:fail , exit!"); | |
1727 | - | |
1728 | - LogUtil.e(TAG, "写入扇区" + firmWritePage + "失败!"); | |
1729 | - m_listener.onFirmUpdateResult(false, "写入扇区" + firmWritePage + "失败!"); | |
1730 | - exitFirmUpdate(2); | |
1731 | - | |
1732 | - break; | |
1733 | - } | |
1734 | - } | |
1735 | - | |
1736 | - | |
1737 | - | |
1738 | - if (firmWritePage > 0 && firmWritePage == firmWritePageMax) { | |
1739 | - LogUtil.d(TAG,"CheckWriteFirmhread:ok : exit!"); | |
1740 | - break; | |
1741 | - } | |
1742 | - | |
1743 | - } catch (InterruptedException e) { | |
1744 | - e.printStackTrace(); | |
1745 | - } | |
1746 | - | |
1747 | - } | |
1748 | - } | |
1749 | - }; | |
1750 | - | |
1751 | - private static int encodeBCD(byte c) { | |
1752 | - if (c >= 'a' && c <= 'f') { | |
1753 | - return 10 + (c - 'a'); | |
1754 | - }else if (c >= '0' && c <= '9') { | |
1755 | - return c - '0'; | |
1756 | - }else if (c >= 'A' && c <= 'F') { | |
1757 | - return 10 + (c - 'A'); | |
1758 | - }else if(c == '.'){ | |
1759 | - return 0xE; | |
1760 | - } | |
1761 | - return -1; | |
1762 | - } | |
1763 | - | |
1764 | - | |
1765 | - /** | |
1766 | - *把字符串形式转换为字节形式 | |
1767 | - */ | |
1768 | - private byte[] util_encodeBCD(byte[] cs) { | |
1769 | - byte[] rs = new byte[17]; | |
1770 | - Arrays.fill(rs, (byte) 0xff);// | |
1771 | - | |
1772 | - int len = cs.length<16 ? cs.length : 16; | |
1773 | - int io = 0; | |
1774 | - | |
1775 | - for (int i = 0; i < len ; i+=2) { | |
1776 | - int n = encodeBCD(cs[i]); | |
1777 | - n <<= 4; | |
1778 | - if(i+1 == cs.length){ | |
1779 | - rs[io++] = (byte) (n|0xf); | |
1780 | - break; | |
1781 | - } | |
1782 | - | |
1783 | - n |= encodeBCD(cs[i+1]); | |
1784 | - if (n < 0) { | |
1785 | - break; | |
1786 | - } | |
1787 | - rs[io++] = (byte)n; | |
1788 | - } | |
1789 | - rs[++io] = 0; | |
1790 | - return rs; | |
1791 | - } | |
1792 | - | |
1793 | - public static String util_decodeBCD(byte[] cs , int len){ | |
1794 | - byte[] buf = new byte[8*2]; | |
1795 | - Arrays.fill(buf,(byte) 0); | |
1796 | - String bcdNum = "0123456789ABCD.F"; | |
1797 | - String bcdStr = bytesToHexString(cs); | |
1798 | - for(int i=0;i<len*2;i+=2){ | |
1799 | - byte item = bcdStr.getBytes()[i]; | |
1800 | - if(item >= '0' && item <= '9') { | |
1801 | - buf[i] = item; | |
1802 | - }else if(item == 'E' ){ | |
1803 | - buf[i] = '.'; | |
1804 | - }else if(item == 'F' ){ | |
1805 | - buf[i] = 0; | |
1806 | - break; | |
1807 | - } | |
1808 | - | |
1809 | - item = bcdStr.getBytes()[i+1]; | |
1810 | - if(item >= '0' && item <= '9') { | |
1811 | - buf[i+1] = item ; | |
1812 | - }else if(item == 'E' ){ | |
1813 | - buf[i+1] = '.'; | |
1814 | - }else if(item == 'F' ){ | |
1815 | - buf[i+1] = 0; | |
1816 | - break; | |
1817 | - } | |
1818 | - | |
1819 | - } | |
1820 | - return new String(buf).trim(); | |
1821 | - | |
1822 | - } | |
1823 | - | |
1824 | - public static String bytesToHexString(byte[] src){ | |
1825 | - StringBuilder stringBuilder = new StringBuilder(""); | |
1826 | - if (src == null || src.length <= 0) { | |
1827 | - return null; | |
1828 | - } | |
1829 | - for (int i = 0; i < src.length; i++) { | |
1830 | - int v = src[i] & 0xFF; | |
1831 | - String hv = Integer.toHexString(v); | |
1832 | - if (hv.length() < 2) { | |
1833 | - stringBuilder.append(0); | |
1834 | - } | |
1835 | - stringBuilder.append(hv); | |
1836 | - } | |
1837 | - return stringBuilder.toString().toUpperCase(); | |
1838 | - } | |
2050 | + for (int i = 0; i < src.length; i++) { | |
2051 | + int v = src[i] & 0xFF; | |
2052 | + String hv = Integer.toHexString(v); | |
2053 | + if (hv.length() < 2) { | |
2054 | + stringBuilder.append(0); | |
2055 | + } | |
2056 | + stringBuilder.append(hv); | |
2057 | + } | |
2058 | + return stringBuilder.toString().toUpperCase(); | |
2059 | + } | |
2060 | + | |
2061 | + | |
2062 | + /** | |
2063 | + * @param length 长度 | |
2064 | + * @param filename 文件名 | |
2065 | + * @Auther Elvis | |
2066 | + * 主动发起文件申请 | |
2067 | + */ | |
2068 | + public void applyFileUpload(int length, String filename, byte anstype,byte index) { | |
2069 | + byte[] mBuffer = new byte[0x1F + 4]; | |
2070 | + Arrays.fill(mBuffer, (byte) 0x0); | |
2071 | + mBuffer[0] = (byte) 0xF5; | |
2072 | + mBuffer[1] = (byte) 0xAA; | |
2073 | + mBuffer[2] = (byte) 0xAA; | |
2074 | + mBuffer[3] = (byte) 0x1F; | |
2075 | + | |
2076 | + mBuffer[4] = 0x73; | |
2077 | + mBuffer[5] = (byte) 0XFF;// 流水号 | |
2078 | + mBuffer[6] = (byte) 0X01;// 流水号 | |
2079 | + | |
2080 | + mBuffer[7] = (byte) 15;// MSGTYPE | |
2081 | + | |
2082 | + mBuffer[8] = (byte) anstype;// ANSTYPE 添加5 文件上传指令 | |
2083 | + mBuffer[9] = index;// 高位 | |
2084 | +// mBuffer[10] = (byte) length;// 低位 | |
2085 | + | |
2086 | +// byte[] bytes = new byte[16]; | |
2087 | +// try { | |
2088 | +// if (filename != null) { | |
2089 | +// bytes = filename.getBytes("GB2312"); | |
2090 | +// } | |
2091 | +// } catch (UnsupportedEncodingException e) { | |
2092 | +// e.printStackTrace(); | |
2093 | +// } | |
2094 | +// | |
2095 | +// if (bytes != null) { | |
2096 | +// for (int i = 0; i < 16 && i < bytes.length; i++) { | |
2097 | +// mBuffer[11 + i] = bytes[i]; | |
2098 | +// } | |
2099 | +// } | |
2100 | + | |
2101 | + writeToCom(mBuffer); | |
2102 | + } | |
2103 | + | |
2104 | + /** | |
2105 | + * @param keyid 键盘id | |
2106 | + * @param packid 包id | |
2107 | + * @param packH 段id | |
2108 | + * @param packL 片id | |
2109 | + * @param datas 数据 | |
2110 | + * @Auther Elvis | |
2111 | + */ | |
2112 | + public void uploadFileData(byte[] keyid, byte packid, byte packH, byte packL, byte[] datas, byte packtype) { | |
2113 | + uploadFileData(keyid, packid, packH, packL, datas, 0, datas.length, packtype); | |
2114 | + } | |
2115 | + | |
2116 | + /** | |
2117 | + * @param keyid 键盘编号 | |
2118 | + * @param packid 包id | |
2119 | + * @param packH 数据段id | |
2120 | + * @param packL 数据片id | |
2121 | + * @param datas 数据 | |
2122 | + * @param offset 偏移位置 | |
2123 | + * @param length 长度 | |
2124 | + * @Auther Elvis | |
2125 | + * 上传数据包(多包应答) | |
2126 | + */ | |
2127 | + public void uploadFileData(byte[] keyid, byte packid, byte packH, byte packL, byte[] datas, int offset, int length, byte packtype) { | |
2128 | + LogUtil.i(TAG, "onMutilPacketData packid=" + packid + ",packH=" + packH + ",packL=" + packL + ",offset=" + offset); | |
2129 | + byte[] mBuffer = new byte[0x1F + 4]; | |
2130 | + Arrays.fill(mBuffer, (byte) 0x0); | |
2131 | + mBuffer[0] = (byte) 0xF5; | |
2132 | + mBuffer[1] = (byte) 0xAA; | |
2133 | + mBuffer[2] = (byte) 0xAA; | |
2134 | + mBuffer[3] = (byte) 0x1F; | |
2135 | + | |
2136 | + mBuffer[4] = (byte) 0xA0; | |
2137 | + if(keyid == null || keyid.length < 2){ | |
2138 | + if(onLineInfo != null){ | |
2139 | + keyid[0] = (byte)((onLineInfo.keyId >> 8 ) & 0xFF) ; | |
2140 | + keyid[1] = (byte)((onLineInfo.keyId ) & 0xFF) ; | |
2141 | + }else{ | |
2142 | + keyid = new byte[2]; | |
2143 | + } | |
2144 | + } | |
2145 | + mBuffer[5] = keyid[0]; | |
2146 | + mBuffer[6] = keyid[1]; | |
2147 | + | |
2148 | + mBuffer[7] = 2;//CMD 1 回应多包数据 | |
2149 | + mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
2150 | + mBuffer[9] = packid;//数据包标识码 | |
2151 | + mBuffer[10] = packH;//数据段编号 | |
2152 | + mBuffer[11] = packL;//数据片编号 | |
2153 | + for (int i = 0; i < length && i < 16 && i < datas.length - offset; i++) { | |
2154 | + mBuffer[12 + i] = datas[offset + i]; | |
2155 | + } | |
2156 | + writeToCom(mBuffer); | |
2157 | + } | |
2158 | + | |
2159 | + /** | |
2160 | + * @param packid 包id | |
2161 | + * @Auther Elvis | |
2162 | + * 多包接收确认(多包接收应答) | |
2163 | + */ | |
2164 | + public void packetConfirmation(byte[] keyid, byte packid, byte packH, byte packL, byte[] names, byte packtype) { | |
2165 | + LogUtil.i(TAG, "onMutilPacketRespone packid=" + packid + ",packH=" + packH + ",packL=" + packL + ",names=" + names); | |
2166 | + byte[] mBuffer = new byte[0x1F + 4]; | |
2167 | + Arrays.fill(mBuffer, (byte) 0x0); | |
2168 | + mBuffer[0] = (byte) 0xF5; | |
2169 | + mBuffer[1] = (byte) 0xAA; | |
2170 | + mBuffer[2] = (byte) 0xAA; | |
2171 | + mBuffer[3] = (byte) 0x1F; | |
2172 | + | |
2173 | + mBuffer[4] = (byte) 0xA0; | |
2174 | + if(keyid == null || keyid.length < 2){ | |
2175 | + if(onLineInfo != null){ | |
2176 | + keyid[0] = (byte)((onLineInfo.keyId >> 8 ) & 0xFF) ; | |
2177 | + keyid[1] = (byte)((onLineInfo.keyId ) & 0xFF) ; | |
2178 | + }else{ | |
2179 | + keyid = new byte[2]; | |
2180 | + } | |
2181 | + } | |
2182 | + mBuffer[5] = keyid[0]; | |
2183 | + mBuffer[6] = keyid[1]; | |
2184 | + | |
2185 | + mBuffer[7] = 1;//CMD 1 | |
2186 | + mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
2187 | + mBuffer[9] = packid;//数据包标识码 | |
2188 | + mBuffer[10] = packH; | |
2189 | + mBuffer[11] = packL; | |
2190 | + if (names != null) { | |
2191 | + for (int i = 0; i < 14 && i < names.length; i++) { | |
2192 | + mBuffer[12 + i] = names[i]; | |
2193 | + } | |
2194 | + } | |
2195 | + writeToCom(mBuffer); | |
2196 | + } | |
2197 | + | |
2198 | + /** | |
2199 | + * @param packid 包id | |
2200 | + * @param packH 数据段id | |
2201 | + * @Auther Elvis | |
2202 | + * 多包接收完毕确认(多包接收完毕确认应答) | |
2203 | + */ | |
2204 | + public void packetReceptionConfirmed(byte[] keyid, byte packid, byte packH, byte packtype) { | |
2205 | + LogUtil.i(TAG, "onMutilPacketRespone packid=" + packid + ",packH=" + packH); | |
2206 | + byte[] mBuffer = new byte[0x1F + 4]; | |
2207 | + Arrays.fill(mBuffer, (byte) 0x0); | |
2208 | + mBuffer[0] = (byte) 0xF5; | |
2209 | + mBuffer[1] = (byte) 0xAA; | |
2210 | + mBuffer[2] = (byte) 0xAA; | |
2211 | + mBuffer[3] = (byte) 0x1F; | |
2212 | + | |
2213 | + mBuffer[4] = (byte) 0xA0; | |
2214 | + if(keyid == null || keyid.length < 2){ | |
2215 | + if(onLineInfo != null){ | |
2216 | + keyid[0] = (byte)((onLineInfo.keyId >> 8 ) & 0xFF) ; | |
2217 | + keyid[1] = (byte)((onLineInfo.keyId ) & 0xFF) ; | |
2218 | + }else{ | |
2219 | + keyid = new byte[2]; | |
2220 | + } | |
2221 | + } | |
2222 | + mBuffer[5] = keyid[0]; | |
2223 | + mBuffer[6] = keyid[1]; | |
2224 | + | |
2225 | + mBuffer[7] = 3;//CMD 3 多包接收完毕应答 | |
2226 | + mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
2227 | + mBuffer[9] = packid;//数据包标识码 | |
2228 | + writeToCom(mBuffer); | |
2229 | + } | |
2230 | + | |
2231 | + /** | |
2232 | + * @param datas 基站传递过来的数据 | |
2233 | + * @param length 长度 | |
2234 | + * @Auther Elvis | |
2235 | + */ | |
2236 | + public void onMutilPacketRequest(byte[] datas, int length) { | |
2237 | + LogUtil.i(TAG ,"onMutilPacketRequest",datas); | |
2238 | + byte[] keyid = new byte[2]; | |
2239 | + keyid[0] = datas[5]; | |
2240 | + keyid[1] = datas[6]; | |
2241 | + byte packid = datas[9]; | |
2242 | + byte packH = datas[10]; | |
2243 | + byte[] packLs = new byte[2]; | |
2244 | + packLs[0] = datas[11]; | |
2245 | + packLs[1] = datas[12]; | |
2246 | + | |
2247 | + int keyId = (keyid[0] << 8) | keyid[1]; | |
2248 | + if (keyId == onLineInfo.keyId) { | |
2249 | + if (datas[8] == 5) { | |
2250 | + RFFileUploadModule.getInstance().onUploadFile(datas[7], keyid, packid, packH, packLs); | |
2251 | + } | |
2252 | + if (datas[8] == 3) { | |
2253 | + RFMessageUploadModule.getInstance().onUploadMessage(datas[7], keyid, packid, packH, packLs); | |
2254 | + } | |
2255 | + } | |
2256 | + } | |
2257 | + | |
2258 | + public void openSendData(byte[] datas){ | |
2259 | + writeToCom(datas); | |
2260 | + } | |
2261 | + | |
2262 | + | |
1839 | 2263 | |
1840 | 2264 | } | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/XPadApiInterface.java
... | ... | @@ -41,6 +41,7 @@ public interface XPadApiInterface { |
41 | 41 | public static final int CMD_FIRM_UPDATE_RESPONSE = 0xF8;//固件升级应答 |
42 | 42 | |
43 | 43 | public static final int CMD_COM_COMMUNICATION_TEST_RESPONSE = 0xB0; //串口测试应答 |
44 | + public static final int CMD_UPLOAD_DATA_RESPONSE = 0x20; //上传指令 | |
44 | 45 | /******************************************************************************* |
45 | 46 | ******************************************************************************/ |
46 | 47 | |
... | ... | @@ -54,7 +55,7 @@ public interface XPadApiInterface { |
54 | 55 | public static final int VoteType_Choice = 10; |
55 | 56 | public static final int VoteType_BatchVote = 20;//批次 |
56 | 57 | public static final int VoteType_BatchElect = 22;//选举 |
57 | - public static final int VoteType_BatchEvalue = 30; //带名称二维表评测模式 综合测评 | |
58 | + public static final int VoteType_BatchEvalue = 30; //带名称二维表评测模式 综合测评 | |
58 | 59 | public static final int VoteType_BatchIDEvalue = 31; //编号式二维表评测模式 综合测评 |
59 | 60 | |
60 | 61 | |
... | ... | @@ -78,21 +79,22 @@ public interface XPadApiInterface { |
78 | 79 | public void getVoteStatus();//查询投票信标 |
79 | 80 | |
80 | 81 | public void getKeypadParam(); //查询键盘参数 |
81 | - public void setKeypadParam(int keyId,byte[] KEYSN ); //设置键盘参数 | |
82 | + public void setKeypadParam(int keyId, byte[] KEYSN); //设置键盘参数 | |
82 | 83 | |
83 | 84 | |
84 | - public void checkOnLine(int volt,int keyinStatus);//查询在线状态 | |
85 | + public void checkOnLine(int volt, int keyinStatus);//查询在线状态 | |
85 | 86 | |
86 | - public void execKeypadMatch(int iMode,int channal);//执行配对 | |
87 | + public void execKeypadMatch(int iMode, int channal);//执行配对 | |
87 | 88 | public void configMode();//进入配置模式 |
88 | 89 | |
89 | - public void comCommunicationTest(int sendn,int okn);//串口测试 | |
90 | + public void comCommunicationTest(int sendn, int okn);//串口测试 | |
90 | 91 | /* |
91 | 92 | * 上传类 |
92 | 93 | */ |
93 | 94 | public void submitVote(int ansType, String info);//ID模式结果 |
94 | - public void submitVoteBySn(byte[] keySn,String info); //SN模式结果 | |
95 | + public void submitVoteBySn(byte[] keySn, String info); //SN模式结果 | |
95 | 96 | public void submitVoteAllOK(); //确认提交 |
97 | + public void submitVoteAllOKWithValue(int ansType, String info);//确认提交带某项结果 | |
96 | 98 | public void cancelSubmitVoteAllOK(); |
97 | 99 | public void submitSelectOther(String info); |
98 | 100 | |
... | ... | @@ -127,23 +129,6 @@ public interface XPadApiInterface { |
127 | 129 | public int offTime;//自动关机时间 |
128 | 130 | public int attrib;//表决器特性:背光模式+蜂鸣器模式等等 |
129 | 131 | public String baseName; //基站名称,最多12字节 |
130 | - | |
131 | - @Override | |
132 | - public String toString() { | |
133 | - return "BaseInfo{" + | |
134 | - "baseId=" + baseId + | |
135 | - ", idMode=" + idMode + | |
136 | - ", confId=" + confId + | |
137 | - ", billId=" + billId + | |
138 | - ", pageNo=" + pageNo + | |
139 | - ", authCode=" + authCode + | |
140 | - ", login=" + login + | |
141 | - ", report=" + report + | |
142 | - ", offTime=" + offTime + | |
143 | - ", attrib=" + attrib + | |
144 | - ", baseName='" + baseName + '\'' + | |
145 | - '}'; | |
146 | - } | |
147 | 132 | } |
148 | 133 | |
149 | 134 | public class ModelInfo{ |
... | ... | @@ -174,6 +159,28 @@ public interface XPadApiInterface { |
174 | 159 | public String keySn; |
175 | 160 | public int comError=0; |
176 | 161 | |
162 | + @Override | |
163 | + public boolean equals(Object o) { | |
164 | + if (this == o) return true; | |
165 | + if (o == null || getClass() != o.getClass()) return false; | |
166 | + OnLineInfo that = (OnLineInfo) o; | |
167 | + return onLine == that.onLine && | |
168 | + idMode == that.idMode && | |
169 | + chan == that.chan && | |
170 | + rssi == that.rssi && | |
171 | + tx == that.tx && | |
172 | + rx == that.rx && | |
173 | + baseId == that.baseId && | |
174 | + keyId == that.keyId && | |
175 | + comError == that.comError && | |
176 | + (keySn == that.keySn || (keySn != null && keySn.equals(that.keySn))); | |
177 | + } | |
178 | + | |
179 | + @Override | |
180 | + public int hashCode() { | |
181 | + | |
182 | + return Arrays.hashCode(new Object[]{onLine, idMode, chan, rssi, tx, rx, baseId, keyId, keySn, comError}); | |
183 | + } | |
177 | 184 | } |
178 | 185 | |
179 | 186 | |
... | ... | @@ -200,8 +207,8 @@ public interface XPadApiInterface { |
200 | 207 | |
201 | 208 | /** |
202 | 209 | * 是否带票数限定,,对批次表决、批次评议、批次自定义评议有效 |
203 | - 0 不限定 | |
204 | - 1 带票数限定 | |
210 | + 0 不限定 | |
211 | + 1 带票数限定 | |
205 | 212 | */ |
206 | 213 | public int fixballot; |
207 | 214 | /** |
... | ... | @@ -225,36 +232,67 @@ public interface XPadApiInterface { |
225 | 232 | public int less;//[11] |
226 | 233 | |
227 | 234 | @Override |
228 | - public String toString() { | |
229 | - return "VoteInfo{" + | |
230 | - "baseId=" + baseId + | |
231 | - ", nowT=" + nowT + | |
232 | - ", dataPos=" + dataPos + | |
233 | - ", mode=" + mode + | |
234 | - ", mode1_msgType=" + mode1_msgType + | |
235 | - ", mode2_modify=" + mode2_modify + | |
236 | - ", mode3_secret=" + mode3_secret + | |
237 | - ", mode4=" + mode4 + | |
238 | - ", mode5=" + mode5 + | |
239 | - ", mode6=" + mode6 + | |
240 | - ", mode7=" + mode7 + | |
241 | - ", fixballot=" + fixballot + | |
242 | - ", limitFavor=" + limitFavor + | |
243 | - ", limitOppo=" + limitOppo + | |
244 | - ", limitWaiver=" + limitWaiver + | |
245 | - ", voteid=" + voteid + | |
246 | - ", file=" + file + | |
247 | - ", init=" + init + | |
248 | - ", less=" + less + | |
249 | - ", resultInfo=" + resultInfo + | |
250 | - ", electInfo=" + electInfo + | |
251 | - ", singleEvalueInfo=" + singleEvalueInfo + | |
252 | - ", batchEvalueInfo=" + batchEvalueInfo + | |
253 | - '}'; | |
235 | + public boolean equals(Object o) { | |
236 | + if (this == o) return true; | |
237 | + if (o == null || getClass() != o.getClass()) return false; | |
238 | + | |
239 | + VoteInfo voteInfo = (VoteInfo) o; | |
240 | + | |
241 | + if (baseId != voteInfo.baseId) return false; | |
242 | + if (nowT != voteInfo.nowT) return false; | |
243 | + if (dataPos != voteInfo.dataPos) return false; | |
244 | + if (mode != voteInfo.mode) return false; | |
245 | + if (mode1_msgType != voteInfo.mode1_msgType) return false; | |
246 | + if (mode2_modify != voteInfo.mode2_modify) return false; | |
247 | + if (mode3_secret != voteInfo.mode3_secret) return false; | |
248 | + if (mode4 != voteInfo.mode4) return false; | |
249 | + if (mode5 != voteInfo.mode5) return false; | |
250 | + if (mode6 != voteInfo.mode6) return false; | |
251 | + if (mode7 != voteInfo.mode7) return false; | |
252 | + if (fixballot != voteInfo.fixballot) return false; | |
253 | + if (limitFavor != voteInfo.limitFavor) return false; | |
254 | + if (limitOppo != voteInfo.limitOppo) return false; | |
255 | + if (limitWaiver != voteInfo.limitWaiver) return false; | |
256 | + if (voteid != voteInfo.voteid) return false; | |
257 | + if (file != voteInfo.file) return false; | |
258 | + if (init != voteInfo.init) return false; | |
259 | + if (less != voteInfo.less) return false; | |
260 | + if (!resultInfo.equals(voteInfo.resultInfo)) return false; | |
261 | + if (!electInfo.equals(voteInfo.electInfo)) return false; | |
262 | + if (!singleEvalueInfo.equals(voteInfo.singleEvalueInfo)) return false; | |
263 | + return batchEvalueInfo.equals(voteInfo.batchEvalueInfo); | |
264 | + } | |
265 | + | |
266 | + @Override | |
267 | + public int hashCode() { | |
268 | + int result = baseId; | |
269 | + result = 31 * result + nowT; | |
270 | + result = 31 * result + dataPos; | |
271 | + result = 31 * result + mode; | |
272 | + result = 31 * result + mode1_msgType; | |
273 | + result = 31 * result + mode2_modify; | |
274 | + result = 31 * result + mode3_secret; | |
275 | + result = 31 * result + mode4; | |
276 | + result = 31 * result + mode5; | |
277 | + result = 31 * result + mode6; | |
278 | + result = 31 * result + mode7; | |
279 | + result = 31 * result + fixballot; | |
280 | + result = 31 * result + limitFavor; | |
281 | + result = 31 * result + limitOppo; | |
282 | + result = 31 * result + limitWaiver; | |
283 | + result = 31 * result + voteid; | |
284 | + result = 31 * result + file; | |
285 | + result = 31 * result + init; | |
286 | + result = 31 * result + less; | |
287 | + result = 31 * result + resultInfo.hashCode(); | |
288 | + result = 31 * result + electInfo.hashCode(); | |
289 | + result = 31 * result + singleEvalueInfo.hashCode(); | |
290 | + result = 31 * result + batchEvalueInfo.hashCode(); | |
291 | + return result; | |
254 | 292 | } |
255 | 293 | |
256 | 294 | public ResultInfo resultInfo = new ResultInfo(); |
257 | - public class ResultInfo{ //结果 | |
295 | + public class ResultInfo{//结果 | |
258 | 296 | public int resultType;//[7] 结果显示类型 。 如 0为 签到 1为表决 |
259 | 297 | public int bits;// [8] |
260 | 298 | public int num0;//[9-10] |
... | ... | @@ -266,24 +304,9 @@ public interface XPadApiInterface { |
266 | 304 | public int num6;//[21,22] |
267 | 305 | |
268 | 306 | @Override |
269 | - public String toString() { | |
270 | - return "ResultInfo{" + | |
271 | - "resultType=" + resultType + | |
272 | - ", bits=" + bits + | |
273 | - ", num0=" + num0 + | |
274 | - ", num1=" + num1 + | |
275 | - ", num2=" + num2 + | |
276 | - ", num3=" + num3 + | |
277 | - ", num4=" + num4 + | |
278 | - ", num5=" + num5 + | |
279 | - ", num6=" + num6 + | |
280 | - '}'; | |
281 | - } | |
282 | - | |
283 | - @Override | |
284 | 307 | public boolean equals(Object o) { |
285 | 308 | if (this == o) return true; |
286 | - if (!(o instanceof ResultInfo)) return false; | |
309 | + if (o == null || getClass() != o.getClass()) return false; | |
287 | 310 | |
288 | 311 | ResultInfo that = (ResultInfo) o; |
289 | 312 | |
... | ... | @@ -329,27 +352,9 @@ public interface XPadApiInterface { |
329 | 352 | public int voteid;//[21] |
330 | 353 | |
331 | 354 | @Override |
332 | - public String toString() { | |
333 | - return "ElectInfo{" + | |
334 | - "type=" + type + | |
335 | - ", random=" + random + | |
336 | - ", select=" + select + | |
337 | - ", other=" + other + | |
338 | - ", less=" + less + | |
339 | - ", secrecy=" + secrecy + | |
340 | - ", modify=" + modify + | |
341 | - ", start=" + start + | |
342 | - ", end=" + end + | |
343 | - ", equityMode=" + equityMode + | |
344 | - ", minSelect=" + minSelect + | |
345 | - ", voteid=" + voteid + | |
346 | - '}'; | |
347 | - } | |
348 | - | |
349 | - @Override | |
350 | 355 | public boolean equals(Object o) { |
351 | 356 | if (this == o) return true; |
352 | - if (!(o instanceof ElectInfo)) return false; | |
357 | + if (o == null || getClass() != o.getClass()) return false; | |
353 | 358 | |
354 | 359 | ElectInfo electInfo = (ElectInfo) o; |
355 | 360 | |
... | ... | @@ -403,29 +408,9 @@ public interface XPadApiInterface { |
403 | 408 | public int number;//[24] |
404 | 409 | |
405 | 410 | @Override |
406 | - public String toString() { | |
407 | - return "SingleItemEvalueInfo{" + | |
408 | - "mode1=" + mode1 + | |
409 | - ", mode2=" + mode2 + | |
410 | - ", mode3=" + mode3 + | |
411 | - ", mode4=" + mode4 + | |
412 | - ", mode5=" + mode5 + | |
413 | - ", mode6=" + mode6 + | |
414 | - ", mode7=" + mode7 + | |
415 | - ", mode8=" + mode8 + | |
416 | - ", mode9=" + mode9 + | |
417 | - ", mode10=" + mode10 + | |
418 | - ", mode11=" + mode11 + | |
419 | - ", mode12=" + mode12 + | |
420 | - ", title=" + Arrays.toString(title) + | |
421 | - ", number=" + number + | |
422 | - '}'; | |
423 | - } | |
424 | - | |
425 | - @Override | |
426 | 411 | public boolean equals(Object o) { |
427 | 412 | if (this == o) return true; |
428 | - if (!(o instanceof SingleItemEvalueInfo)) return false; | |
413 | + if (o == null || getClass() != o.getClass()) return false; | |
429 | 414 | |
430 | 415 | SingleItemEvalueInfo that = (SingleItemEvalueInfo) o; |
431 | 416 | |
... | ... | @@ -479,29 +464,13 @@ public interface XPadApiInterface { |
479 | 464 | public int ruleStart;//[7]; |
480 | 465 | public int ruleEnd;//[7]; |
481 | 466 | public int sliderover;//[7]; |
482 | - | |
483 | - @Override | |
484 | - public String toString() { | |
485 | - return "BatchEvalueInfo{" + | |
486 | - "mode1=" + mode1 + | |
487 | - ", startVal=" + startVal + | |
488 | - ", endVal=" + endVal + | |
489 | - ", autoMove=" + autoMove + | |
490 | - ", width1=" + width1 + | |
491 | - ", width2=" + width2 + | |
492 | - ", less=" + less + | |
493 | - ", secrecy=" + secrecy + | |
494 | - ", modify=" + modify + | |
495 | - ", ruleStart=" + ruleStart + | |
496 | - ", ruleEnd=" + ruleEnd + | |
497 | - ", sliderover=" + sliderover + | |
498 | - '}'; | |
499 | - } | |
467 | + public int billNo; // 议案编号 | |
468 | + public int billSubNo ; // 议案子编号 | |
500 | 469 | |
501 | 470 | @Override |
502 | 471 | public boolean equals(Object o) { |
503 | 472 | if (this == o) return true; |
504 | - if (!(o instanceof BatchEvalueInfo)) return false; | |
473 | + if (o == null || getClass() != o.getClass()) return false; | |
505 | 474 | |
506 | 475 | BatchEvalueInfo that = (BatchEvalueInfo) o; |
507 | 476 | |
... | ... | @@ -516,7 +485,9 @@ public interface XPadApiInterface { |
516 | 485 | if (modify != that.modify) return false; |
517 | 486 | if (ruleStart != that.ruleStart) return false; |
518 | 487 | if (ruleEnd != that.ruleEnd) return false; |
519 | - return sliderover == that.sliderover; | |
488 | + if (sliderover != that.sliderover) return false; | |
489 | + if (billNo != that.billNo) return false; | |
490 | + return billSubNo == that.billSubNo; | |
520 | 491 | } |
521 | 492 | |
522 | 493 | @Override |
... | ... | @@ -533,61 +504,12 @@ public interface XPadApiInterface { |
533 | 504 | result = 31 * result + ruleStart; |
534 | 505 | result = 31 * result + ruleEnd; |
535 | 506 | result = 31 * result + sliderover; |
507 | + result = 31 * result + billNo; | |
508 | + result = 31 * result + billSubNo; | |
536 | 509 | return result; |
537 | 510 | } |
538 | 511 | } |
539 | 512 | |
540 | - @Override | |
541 | - public boolean equals(Object o) { | |
542 | - if (this == o) return true; | |
543 | - if (!(o instanceof VoteInfo)) return false; | |
544 | - | |
545 | - VoteInfo voteInfo = (VoteInfo) o; | |
546 | - | |
547 | - if (baseId != voteInfo.baseId) return false; | |
548 | - if (nowT != voteInfo.nowT) return false; | |
549 | - if (dataPos != voteInfo.dataPos) return false; | |
550 | - if (mode != voteInfo.mode) return false; | |
551 | - if (mode1_msgType != voteInfo.mode1_msgType) return false; | |
552 | - if (mode2_modify != voteInfo.mode2_modify) return false; | |
553 | - if (mode3_secret != voteInfo.mode3_secret) return false; | |
554 | - if (mode4 != voteInfo.mode4) return false; | |
555 | - if (mode5 != voteInfo.mode5) return false; | |
556 | - if (mode6 != voteInfo.mode6) return false; | |
557 | - if (mode7 != voteInfo.mode7) return false; | |
558 | - if (voteid != voteInfo.voteid) return false; | |
559 | - if (file != voteInfo.file) return false; | |
560 | - if (init != voteInfo.init) return false; | |
561 | - if (less != voteInfo.less) return false; | |
562 | - if (!resultInfo.equals(voteInfo.resultInfo)) return false; | |
563 | - if (!electInfo.equals(voteInfo.electInfo)) return false; | |
564 | - if (!singleEvalueInfo.equals(voteInfo.singleEvalueInfo)) return false; | |
565 | - return batchEvalueInfo.equals(voteInfo.batchEvalueInfo); | |
566 | - } | |
567 | - | |
568 | - @Override | |
569 | - public int hashCode() { | |
570 | - int result = baseId; | |
571 | - result = 31 * result + nowT; | |
572 | - result = 31 * result + dataPos; | |
573 | - result = 31 * result + mode; | |
574 | - result = 31 * result + mode1_msgType; | |
575 | - result = 31 * result + mode2_modify; | |
576 | - result = 31 * result + mode3_secret; | |
577 | - result = 31 * result + mode4; | |
578 | - result = 31 * result + mode5; | |
579 | - result = 31 * result + mode6; | |
580 | - result = 31 * result + mode7; | |
581 | - result = 31 * result + voteid; | |
582 | - result = 31 * result + file; | |
583 | - result = 31 * result + init; | |
584 | - result = 31 * result + less; | |
585 | - result = 31 * result + resultInfo.hashCode(); | |
586 | - result = 31 * result + electInfo.hashCode(); | |
587 | - result = 31 * result + singleEvalueInfo.hashCode(); | |
588 | - result = 31 * result + batchEvalueInfo.hashCode(); | |
589 | - return result; | |
590 | - } | |
591 | 513 | |
592 | 514 | //Deprecated blow |
593 | 515 | // public int voteMode;// 表决模式 |
... | ... | @@ -613,18 +535,35 @@ public interface XPadApiInterface { |
613 | 535 | public int modify; //0 不允许修改 1 允许修改, |
614 | 536 | |
615 | 537 | @Override |
616 | - public String toString() { | |
617 | - return "BatchVoteInfo{" + | |
618 | - "start=" + start + | |
619 | - ", end=" + end + | |
620 | - ", mode1=" + mode1 + | |
621 | - ", less=" + less + | |
622 | - ", secret=" + secret + | |
623 | - ", fixballot=" + fixballot + | |
624 | - ", limit=" + Arrays.toString(limit) + | |
625 | - ", rule=" + rule + | |
626 | - ", modify=" + modify + | |
627 | - '}'; | |
538 | + public boolean equals(Object o) { | |
539 | + if (this == o) return true; | |
540 | + if (o == null || getClass() != o.getClass()) return false; | |
541 | + | |
542 | + BatchVoteInfo that = (BatchVoteInfo) o; | |
543 | + | |
544 | + if (start != that.start) return false; | |
545 | + if (end != that.end) return false; | |
546 | + if (mode1 != that.mode1) return false; | |
547 | + if (less != that.less) return false; | |
548 | + if (secret != that.secret) return false; | |
549 | + if (fixballot != that.fixballot) return false; | |
550 | + if (rule != that.rule) return false; | |
551 | + if (modify != that.modify) return false; | |
552 | + return Arrays.equals(limit, that.limit); | |
553 | + } | |
554 | + | |
555 | + @Override | |
556 | + public int hashCode() { | |
557 | + int result = start; | |
558 | + result = 31 * result + end; | |
559 | + result = 31 * result + mode1; | |
560 | + result = 31 * result + less; | |
561 | + result = 31 * result + secret; | |
562 | + result = 31 * result + fixballot; | |
563 | + result = 31 * result + Arrays.hashCode(limit); | |
564 | + result = 31 * result + rule; | |
565 | + result = 31 * result + modify; | |
566 | + return result; | |
628 | 567 | } |
629 | 568 | } |
630 | 569 | |
... | ... | @@ -644,7 +583,41 @@ public interface XPadApiInterface { |
644 | 583 | public int equityMode; |
645 | 584 | public int minSelect; |
646 | 585 | |
586 | + @Override | |
587 | + public boolean equals(Object o) { | |
588 | + if (this == o) return true; | |
589 | + if (o == null || getClass() != o.getClass()) return false; | |
590 | + | |
591 | + BatchSelectInfo that = (BatchSelectInfo) o; | |
592 | + | |
593 | + if (type != that.type) return false; | |
594 | + if (random != that.random) return false; | |
595 | + if (select != that.select) return false; | |
596 | + if (other != that.other) return false; | |
597 | + if (less != that.less) return false; | |
598 | + if (secrecy != that.secrecy) return false; | |
599 | + if (modify != that.modify) return false; | |
600 | + if (start != that.start) return false; | |
601 | + if (end != that.end) return false; | |
602 | + if (equityMode != that.equityMode) return false; | |
603 | + return minSelect == that.minSelect; | |
604 | + } | |
647 | 605 | |
606 | + @Override | |
607 | + public int hashCode() { | |
608 | + int result = type; | |
609 | + result = 31 * result + random; | |
610 | + result = 31 * result + select; | |
611 | + result = 31 * result + other; | |
612 | + result = 31 * result + less; | |
613 | + result = 31 * result + secrecy; | |
614 | + result = 31 * result + modify; | |
615 | + result = 31 * result + start; | |
616 | + result = 31 * result + end; | |
617 | + result = 31 * result + equityMode; | |
618 | + result = 31 * result + minSelect; | |
619 | + return result; | |
620 | + } | |
648 | 621 | } |
649 | 622 | |
650 | 623 | ... | ... |
C5/app/src/main/java/com/sunvote/xpadcomm/XPadSystem.java
... | ... | @@ -4,7 +4,9 @@ package com.sunvote.xpadcomm; |
4 | 4 | import android.content.Context; |
5 | 5 | import android.content.Intent; |
6 | 6 | |
7 | +import com.sunvote.sdk.HuaWeiSDK; | |
7 | 8 | import com.sunvote.util.LogUtil; |
9 | +import com.sunvote.xpadapp.MainActivity; | |
8 | 10 | import com.sunvote.xpadapp.R; |
9 | 11 | |
10 | 12 | public class XPadSystem { |
... | ... | @@ -144,6 +146,7 @@ public class XPadSystem { |
144 | 146 | if (intent != null) { |
145 | 147 | context.startActivity(intent); |
146 | 148 | } |
149 | + HuaWeiSDK.getInstance((MainActivity)context).powerOffXPad(); | |
147 | 150 | } |
148 | 151 | |
149 | 152 | public static void rebootXPad(Context context) { |
... | ... | @@ -152,7 +155,7 @@ public class XPadSystem { |
152 | 155 | if (intent != null) { |
153 | 156 | context.startActivity(intent); |
154 | 157 | } |
155 | - | |
158 | + HuaWeiSDK.getInstance((MainActivity)context).rebootXPad(); | |
156 | 159 | |
157 | 160 | } |
158 | 161 | |
... | ... | @@ -161,6 +164,9 @@ public class XPadSystem { |
161 | 164 | Intent intent = new Intent(); |
162 | 165 | intent.setAction("com.along.intent.Navigation_VISIBLE"); |
163 | 166 | context.sendBroadcast(intent); |
167 | + HuaWeiSDK.getInstance((MainActivity)context).setHomeButtonDisabled(false); | |
168 | + HuaWeiSDK.getInstance((MainActivity)context).setStatusBarExpandPanelDisabled(false); | |
169 | + HuaWeiSDK.getInstance((MainActivity)context).setTaskButtonDisabled(false); | |
164 | 170 | } |
165 | 171 | |
166 | 172 | public static void setNavgationGone(Context context){ |
... | ... | @@ -168,6 +174,9 @@ public class XPadSystem { |
168 | 174 | Intent intent = new Intent(); |
169 | 175 | intent.setAction("com.along.intent.Navigation_GONE"); |
170 | 176 | context.sendBroadcast(intent); |
177 | + HuaWeiSDK.getInstance((MainActivity)context).setHomeButtonDisabled(true); | |
178 | + HuaWeiSDK.getInstance((MainActivity)context).setStatusBarExpandPanelDisabled(true); | |
179 | + HuaWeiSDK.getInstance((MainActivity)context).setTaskButtonDisabled(true); | |
171 | 180 | } |
172 | 181 | |
173 | 182 | public static void goToSleep(Context context){ | ... | ... |
C5/app/src/main/res/layout/fragment_admin.xml
... | ... | @@ -13,6 +13,19 @@ |
13 | 13 | android:orientation="horizontal"> |
14 | 14 | |
15 | 15 | <Button |
16 | + android:id="@+id/match" | |
17 | + android:layout_width="0dp" | |
18 | + android:layout_height="60dp" | |
19 | + android:layout_marginRight="80dp" | |
20 | + android:layout_weight="1" | |
21 | + android:background="@color/blue" | |
22 | + android:gravity="center" | |
23 | + android:text="配对" | |
24 | + android:textColor="@color/white" | |
25 | + android:textSize="@dimen/big_text_p5" | |
26 | + android:textStyle="bold" /> | |
27 | + | |
28 | + <Button | |
16 | 29 | android:id="@+id/admin_config_mode" |
17 | 30 | android:layout_width="0dp" |
18 | 31 | android:layout_height="60dp" |
... | ... | @@ -25,6 +38,8 @@ |
25 | 38 | android:textSize="@dimen/big_text_p5" |
26 | 39 | android:textStyle="bold" /> |
27 | 40 | |
41 | + | |
42 | + | |
28 | 43 | <Button |
29 | 44 | android:id="@+id/admin_btnComTest" |
30 | 45 | android:layout_width="0dp" |
... | ... | @@ -32,7 +47,7 @@ |
32 | 47 | android:layout_weight="1" |
33 | 48 | android:background="@color/blue" |
34 | 49 | android:gravity="center" |
35 | - android:text="重定向服务器" | |
50 | + android:text="退出应用" | |
36 | 51 | android:textColor="@color/white" |
37 | 52 | android:textSize="@dimen/big_text_p5" |
38 | 53 | android:textStyle="bold" /> |
... | ... | @@ -71,7 +86,7 @@ |
71 | 86 | android:layout_alignParentBottom="true" |
72 | 87 | android:layout_centerHorizontal="true" |
73 | 88 | android:layout_marginBottom="50dp" |
74 | - android:text="APP版本:1.1.2.6 基站IP:192.168.0.136" | |
89 | + android:text="APP版本:1.1.2.6" | |
75 | 90 | android:textColor="@color/white" |
76 | 91 | android:textSize="@dimen/big_text_p4" /> |
77 | 92 | ... | ... |
C5/app/src/main/res/values/strings.xml
... | ... | @@ -131,7 +131,7 @@ |
131 | 131 | <string name="piao">票</string> |
132 | 132 | <string name="ren">人</string> |
133 | 133 | <string name="reboot">重启</string> |
134 | - <string name="shutdown">退出应用</string> | |
134 | + <string name="shutdown">关机</string> | |
135 | 135 | <string name="comtest">串口测试</string> |
136 | 136 | <string name="getDeviceInfo">读设备信息</string> |
137 | 137 | <string name="comtest_interval">串口测试间隔</string> | ... | ... |
C5/util/src/main/java/com/sunvote/util/ByteUtils.java
... | ... | @@ -119,4 +119,35 @@ public class ByteUtils { |
119 | 119 | |
120 | 120 | return true; |
121 | 121 | } |
122 | + | |
123 | + public static int findBytes(byte[] source,byte[] find,int index){ | |
124 | + int flag = -1; | |
125 | + for (int j = index; j < source.length; j++) { | |
126 | + if (source.length >= j + find.length) { | |
127 | + if (compareByte(source, j, find)) { | |
128 | + flag = j; | |
129 | + break; | |
130 | + } | |
131 | + } | |
132 | + } | |
133 | + return flag; | |
134 | + } | |
135 | + | |
136 | + private static boolean compareByte(byte[] source, int start, byte[] find) { | |
137 | + if (source.length >= start + find.length) { | |
138 | + for (int i = 0; i < find.length; i++) { | |
139 | + if (source[start + i] != find[i]) { | |
140 | + return false; | |
141 | + } | |
142 | + } | |
143 | + return true; | |
144 | + } | |
145 | + return false; | |
146 | + } | |
147 | + | |
148 | + public static int byte1ToInt(byte b) { | |
149 | + int ret = 0; | |
150 | + ret += (b & 0x000000FF); | |
151 | + return ret; | |
152 | + } | |
122 | 153 | } | ... | ... |