Commit 18faef8dfc45003df2b2aefeda7df638ab4b3b11

Authored by 孙向锦
1 parent 21fdaeae

下载修改

C5/app/build.gradle
@@ -96,6 +96,7 @@ dependencies { @@ -96,6 +96,7 @@ dependencies {
96 compile 'com.github.barteksc:android-pdf-viewer:2.7.0' 96 compile 'com.github.barteksc:android-pdf-viewer:2.7.0'
97 compile 'cn.yipianfengye.android:zxing-library:2.2' 97 compile 'cn.yipianfengye.android:zxing-library:2.2'
98 compile 'com.jaredrummler:android-processes:1.1.1' 98 compile 'com.jaredrummler:android-processes:1.1.1'
  99 + implementation project(':util')
99 } 100 }
100 101
101 //#解决某些输入文件使用或覆盖了已过时的 API 102 //#解决某些输入文件使用或覆盖了已过时的 API
C5/app/src/main/java/com/sunvote/xpadapp/App.java
@@ -5,13 +5,9 @@ import android.app.ActivityManager.RunningAppProcessInfo; @@ -5,13 +5,9 @@ import android.app.ActivityManager.RunningAppProcessInfo;
5 import android.app.Application; 5 import android.app.Application;
6 import android.content.Context; 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 import com.sunvote.xpadcomm.XPadApi; 8 import com.sunvote.xpadcomm.XPadApi;
12 import com.uuzuche.lib_zxing.activity.ZXingLibrary; 9 import com.uuzuche.lib_zxing.activity.ZXingLibrary;
13 10
14 -  
15 import java.util.List; 11 import java.util.List;
16 12
17 public class App extends Application { 13 public class App extends Application {
@@ -19,20 +15,14 @@ public class App extends Application { @@ -19,20 +15,14 @@ public class App extends Application {
19 15
20 @Override 16 @Override
21 public void onCreate() { 17 public void onCreate() {
22 - BaseStationProcessWork.getInstance().setContext(this);  
23 XPad = XPadApi.getInstance(); 18 XPad = XPadApi.getInstance();
24 // XPad.getClient().disableLogtoFile(); 19 // XPad.getClient().disableLogtoFile();
25 // XPad.getClient().disableModuleLog(); 20 // XPad.getClient().disableModuleLog();
26 - XPad.getClient().enablelogtoFile();  
27 - XPad.getClient().enableModuleLog();  
28 - XPad.getClient().setContext(this);  
29 ZXingLibrary.initDisplayOpinion(this); 21 ZXingLibrary.initDisplayOpinion(this);
30 final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler(); 22 final Thread.UncaughtExceptionHandler uncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
31 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 23 Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
32 @Override 24 @Override
33 public void uncaughtException(Thread thread, Throwable ex) { 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 if (uncaughtExceptionHandler != null) { 26 if (uncaughtExceptionHandler != null) {
37 uncaughtExceptionHandler.uncaughtException(thread, ex); 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,13 +6,14 @@ import android.app.Fragment;
6 import android.app.FragmentManager; 6 import android.app.FragmentManager;
7 import android.app.FragmentTransaction; 7 import android.app.FragmentTransaction;
8 import android.app.ProgressDialog; 8 import android.app.ProgressDialog;
9 -import android.app.usage.NetworkStats;  
10 import android.content.BroadcastReceiver; 9 import android.content.BroadcastReceiver;
  10 +import android.content.Context;
11 import android.content.DialogInterface; 11 import android.content.DialogInterface;
12 import android.content.Intent; 12 import android.content.Intent;
13 import android.content.IntentFilter; 13 import android.content.IntentFilter;
14 import android.content.pm.PackageManager; 14 import android.content.pm.PackageManager;
15 import android.graphics.Color; 15 import android.graphics.Color;
  16 +import android.hardware.usb.UsbManager;
16 import android.net.ConnectivityManager; 17 import android.net.ConnectivityManager;
17 import android.net.Uri; 18 import android.net.Uri;
18 import android.os.Build; 19 import android.os.Build;
@@ -32,7 +33,7 @@ import android.widget.ImageView; @@ -32,7 +33,7 @@ import android.widget.ImageView;
32 import android.widget.TextView; 33 import android.widget.TextView;
33 import android.widget.Toast; 34 import android.widget.Toast;
34 35
35 -import com.sunvote.udptransfer.Config; 36 +import com.sunvote.sdk.HuaWeiSDK;
36 import com.sunvote.util.EncryptUtils; 37 import com.sunvote.util.EncryptUtils;
37 import com.sunvote.util.LogUtil; 38 import com.sunvote.util.LogUtil;
38 import com.sunvote.util.SPUtils; 39 import com.sunvote.util.SPUtils;
@@ -60,12 +61,11 @@ import com.sunvote.xpadapp.fragments.MultiContentDetailFragment; @@ -60,12 +61,11 @@ import com.sunvote.xpadapp.fragments.MultiContentDetailFragment;
60 import com.sunvote.xpadapp.fragments.MultiContentFragment; 61 import com.sunvote.xpadapp.fragments.MultiContentFragment;
61 import com.sunvote.xpadapp.fragments.MultiPingshengFragment; 62 import com.sunvote.xpadapp.fragments.MultiPingshengFragment;
62 import com.sunvote.xpadapp.fragments.MultiTitleFragment; 63 import com.sunvote.xpadapp.fragments.MultiTitleFragment;
63 -import com.sunvote.xpadapp.fragments.ResultElectionCustomFragment;  
64 -import com.sunvote.xpadapp.fragments.UserResultVoteFragment;  
65 import com.sunvote.xpadapp.fragments.NoFileFragment; 64 import com.sunvote.xpadapp.fragments.NoFileFragment;
66 import com.sunvote.xpadapp.fragments.OfflineFragment; 65 import com.sunvote.xpadapp.fragments.OfflineFragment;
67 import com.sunvote.xpadapp.fragments.OnLineFragment; 66 import com.sunvote.xpadapp.fragments.OnLineFragment;
68 import com.sunvote.xpadapp.fragments.PDFContextShowFragment; 67 import com.sunvote.xpadapp.fragments.PDFContextShowFragment;
  68 +import com.sunvote.xpadapp.fragments.ResultElectionCustomFragment;
69 import com.sunvote.xpadapp.fragments.ResultElectionFragment; 69 import com.sunvote.xpadapp.fragments.ResultElectionFragment;
70 import com.sunvote.xpadapp.fragments.ResultMultiVoteFragment; 70 import com.sunvote.xpadapp.fragments.ResultMultiVoteFragment;
71 import com.sunvote.xpadapp.fragments.ResultVoteFragment; 71 import com.sunvote.xpadapp.fragments.ResultVoteFragment;
@@ -73,6 +73,7 @@ import com.sunvote.xpadapp.fragments.ShowIdFragment; @@ -73,6 +73,7 @@ import com.sunvote.xpadapp.fragments.ShowIdFragment;
73 import com.sunvote.xpadapp.fragments.SigninFragment; 73 import com.sunvote.xpadapp.fragments.SigninFragment;
74 import com.sunvote.xpadapp.fragments.SinginResultFragment; 74 import com.sunvote.xpadapp.fragments.SinginResultFragment;
75 import com.sunvote.xpadapp.fragments.SingleTitleFragment; 75 import com.sunvote.xpadapp.fragments.SingleTitleFragment;
  76 +import com.sunvote.xpadapp.fragments.UserResultVoteFragment;
76 import com.sunvote.xpadapp.presenter.ServicePresent; 77 import com.sunvote.xpadapp.presenter.ServicePresent;
77 import com.sunvote.xpadapp.presenter.XPadPresenter; 78 import com.sunvote.xpadapp.presenter.XPadPresenter;
78 import com.sunvote.xpadapp.server.BatteryReceiver; 79 import com.sunvote.xpadapp.server.BatteryReceiver;
@@ -93,6 +94,7 @@ import com.sunvote.xpadcomm.XPadApiInterface.ModelInfo; @@ -93,6 +94,7 @@ import com.sunvote.xpadcomm.XPadApiInterface.ModelInfo;
93 import com.sunvote.xpadcomm.XPadApiInterface.OnLineInfo; 94 import com.sunvote.xpadcomm.XPadApiInterface.OnLineInfo;
94 import com.sunvote.xpadcomm.XPadApiInterface.VoteInfo; 95 import com.sunvote.xpadcomm.XPadApiInterface.VoteInfo;
95 import com.sunvote.xpadcomm.XPadSystem; 96 import com.sunvote.xpadcomm.XPadSystem;
  97 +import com.sunvote.xpadcomm.usb.UsbTransferManager;
96 98
97 import java.io.File; 99 import java.io.File;
98 import java.io.UnsupportedEncodingException; 100 import java.io.UnsupportedEncodingException;
@@ -219,6 +221,8 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -219,6 +221,8 @@ public class MainActivity extends BaseActivity implements ComListener {
219 private TextView terminalId; 221 private TextView terminalId;
220 private ImageView service; 222 private ImageView service;
221 223
  224 + private final int Msg_onServiceCommitOk = 63;
  225 +
222 BatteryReceiver m_receiver; 226 BatteryReceiver m_receiver;
223 NetWorkStateReceiver netWork_receiver; 227 NetWorkStateReceiver netWork_receiver;
224 StatusBarView statusBarView; 228 StatusBarView statusBarView;
@@ -248,13 +252,17 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -248,13 +252,17 @@ public class MainActivity extends BaseActivity implements ComListener {
248 mOnlineInfo.onLine = 0; 252 mOnlineInfo.onLine = 0;
249 253
250 presenter = new XPadPresenter(this); 254 presenter = new XPadPresenter(this);
251 - setOnlineFragment(); 255 +
252 darkTime = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "darkTime", 3); 256 darkTime = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "darkTime", 3);
253 brigntLevel = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "bright", 30); 257 brigntLevel = (Integer) SharedPreferencesUtil.getData(MainActivity.this, "bright", 30);
254 ScreenUtil.setNormalMode(MainActivity.this, brigntLevel); 258 ScreenUtil.setNormalMode(MainActivity.this, brigntLevel);
255 screenTimer = new Timer(true); 259 screenTimer = new Timer(true);
256 screenTimer.schedule(screenTask, 1000, 1000); // 延时1000ms后执行,1000ms执行一次 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 IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); 266 IntentFilter intentFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
259 m_receiver = new BatteryReceiver(); 267 m_receiver = new BatteryReceiver();
260 registerReceiver(m_receiver, intentFilter); 268 registerReceiver(m_receiver, intentFilter);
@@ -266,7 +274,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -266,7 +274,7 @@ public class MainActivity extends BaseActivity implements ComListener {
266 274
267 clearApkFile(); 275 clearApkFile();
268 FirmUpdateFragment.clearUpdateFile(); 276 FirmUpdateFragment.clearUpdateFile();
269 - 277 + setOnlineFragment();
270 if(!isUnlock()){ 278 if(!isUnlock()){
271 setUnlockScreen(); 279 setUnlockScreen();
272 } 280 }
@@ -341,6 +349,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -341,6 +349,7 @@ public class MainActivity extends BaseActivity implements ComListener {
341 int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 0x00002000; 349 int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | 0x00002000;
342 decorView.setSystemUiVisibility(uiOptions); 350 decorView.setSystemUiVisibility(uiOptions);
343 } 351 }
  352 + XPadSystem.setNavgationGone(this);
344 } 353 }
345 354
346 public void showBottomUIMenu() { 355 public void showBottomUIMenu() {
@@ -363,7 +372,10 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -363,7 +372,10 @@ public class MainActivity extends BaseActivity implements ComListener {
363 @Override 372 @Override
364 protected void onResume() { 373 protected void onResume() {
365 hideBottomUIMenu(); 374 hideBottomUIMenu();
366 - setTerminalId(XPadApi.getInstance().getClient().getUdpModuleNO()); 375 + if(mOnlineInfo != null){
  376 + setTerminalId(mOnlineInfo.keyId);
  377 + }
  378 + HuaWeiSDK.getInstance(this).open();
367 super.onResume(); 379 super.onResume();
368 } 380 }
369 381
@@ -382,6 +394,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -382,6 +394,7 @@ public class MainActivity extends BaseActivity implements ComListener {
382 protected void onStop() { 394 protected void onStop() {
383 LogUtil.i(TAG, "onstop"); 395 LogUtil.i(TAG, "onstop");
384 XPadSystem.setNavgationVisible(this); 396 XPadSystem.setNavgationVisible(this);
  397 + HuaWeiSDK.getInstance(this).close();
385 super.onStop(); 398 super.onStop();
386 } 399 }
387 400
@@ -578,6 +591,9 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -578,6 +591,9 @@ public class MainActivity extends BaseActivity implements ComListener {
578 case MSG_CLEAN_FILE: 591 case MSG_CLEAN_FILE:
579 Toast.makeText(MainActivity.this, "文件清除完成!", Toast.LENGTH_SHORT).show(); 592 Toast.makeText(MainActivity.this, "文件清除完成!", Toast.LENGTH_SHORT).show();
580 break; 593 break;
  594 + case Msg_onServiceCommitOk:
  595 + servicePresent.onServiceSubmitSuccess();
  596 + break;
581 default: 597 default:
582 598
583 } 599 }
@@ -772,7 +788,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -772,7 +788,7 @@ public class MainActivity extends BaseActivity implements ComListener {
772 return; 788 return;
773 } 789 }
774 currBillInfo = dbm.getBillInfo(meetingId, voteId); 790 currBillInfo = dbm.getBillInfo(meetingId, voteId);
775 - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); 791 + roleType = dbm.getKeypadRole(mOnlineInfo.keyId);
776 if (currBillInfo == null) { 792 if (currBillInfo == null) {
777 Toast.makeText(this, "显示批次结果失败,没有找到会议资料", Toast.LENGTH_LONG).show(); 793 Toast.makeText(this, "显示批次结果失败,没有找到会议资料", Toast.LENGTH_LONG).show();
778 return; 794 return;
@@ -888,6 +904,9 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -888,6 +904,9 @@ public class MainActivity extends BaseActivity implements ComListener {
888 private OfflineFragment offlineFragment; 904 private OfflineFragment offlineFragment;
889 905
890 private void setOfflineFragment() { 906 private void setOfflineFragment() {
  907 + if(mOnlineInfo != null){
  908 + setTerminalId(mOnlineInfo.keyId);
  909 + }
891 service.setImageResource(R.drawable.scan_qrcode); 910 service.setImageResource(R.drawable.scan_qrcode);
892 FragmentManager fm = getFragmentManager(); 911 FragmentManager fm = getFragmentManager();
893 FragmentTransaction transaction = fm.beginTransaction(); 912 FragmentTransaction transaction = fm.beginTransaction();
@@ -925,6 +944,9 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -925,6 +944,9 @@ public class MainActivity extends BaseActivity implements ComListener {
925 private OnLineFragment onLineFragment; 944 private OnLineFragment onLineFragment;
926 945
927 private void setOnlineFragment() { 946 private void setOnlineFragment() {
  947 + if(mOnlineInfo != null){
  948 + setTerminalId(mOnlineInfo.keyId);
  949 + }
928 FragmentManager fm = getFragmentManager(); 950 FragmentManager fm = getFragmentManager();
929 FragmentTransaction transaction = fm.beginTransaction(); 951 FragmentTransaction transaction = fm.beginTransaction();
930 transaction.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out); 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,8 +961,8 @@ public class MainActivity extends BaseActivity implements ComListener {
939 LogUtil.i(TAG, "setOnlineFragment"); 961 LogUtil.i(TAG, "setOnlineFragment");
940 presenter.getBaseStatus(); 962 presenter.getBaseStatus();
941 service.setImageResource(R.drawable.service_server); 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 private void setShowIdFragment() { 968 private void setShowIdFragment() {
@@ -1021,21 +1043,21 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1021,21 +1043,21 @@ public class MainActivity extends BaseActivity implements ComListener {
1021 LogUtil.i(TAG, "ignore redownload"); 1043 LogUtil.i(TAG, "ignore redownload");
1022 return; 1044 return;
1023 } 1045 }
1024 - if (mKeypadInfo == null) { 1046 + if (mOnlineInfo == null) {
1025 presenter.getKeypadParam(); 1047 presenter.getKeypadParam();
1026 } 1048 }
1027 if (wifiSsid == null || wifiSsid.length() == 0) { 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 if (wifiPwd == null || wifiPwd.length() == 0) { 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 if (serverIp == null || serverIp.length() == 0) { 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 // if(serverPort == 0){ 1062 // if(serverPort == 0){
1041 // Toast.makeText(this, "serverPort is 0 ", Toast.LENGTH_SHORT); 1063 // Toast.makeText(this, "serverPort is 0 ", Toast.LENGTH_SHORT);
@@ -1047,12 +1069,12 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1047,12 +1069,12 @@ public class MainActivity extends BaseActivity implements ComListener {
1047 if (downloadFragment == null) { 1069 if (downloadFragment == null) {
1048 downloadFragment = new DownloadFragment(); 1070 downloadFragment = new DownloadFragment();
1049 serverPort = 4002; 1071 serverPort = 4002;
1050 - downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, XPadApi.getInstance().getClient().getUdpModuleNO()); 1072 + downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort,mOnlineInfo.keyId);
1051 transaction.add(R.id.frame_content, downloadFragment); 1073 transaction.add(R.id.frame_content, downloadFragment);
1052 transaction.addToBackStack("downloadFragment"); 1074 transaction.addToBackStack("downloadFragment");
1053 } else { 1075 } else {
1054 serverPort = 4002; 1076 serverPort = 4002;
1055 - downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, XPadApi.getInstance().getClient().getUdpModuleNO()); 1077 + downloadFragment.setInfo(wifiSsid, wifiPwd, serverIp, serverPort, mOnlineInfo.keyId);
1056 transaction.replace(R.id.frame_content, downloadFragment); 1078 transaction.replace(R.id.frame_content, downloadFragment);
1057 } 1079 }
1058 transaction.commitAllowingStateLoss(); 1080 transaction.commitAllowingStateLoss();
@@ -1252,7 +1274,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1252,7 +1274,7 @@ public class MainActivity extends BaseActivity implements ComListener {
1252 return; 1274 return;
1253 } 1275 }
1254 currBillInfo = dbm.getBillInfo(meetingId, vote.electInfo.voteid); 1276 currBillInfo = dbm.getBillInfo(meetingId, vote.electInfo.voteid);
1255 - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); 1277 + roleType = dbm.getKeypadRole(mOnlineInfo.keyId);
1256 if (currBillInfo == null) { 1278 if (currBillInfo == null) {
1257 Toast.makeText(this, "没找到议案信息", Toast.LENGTH_LONG).show(); 1279 Toast.makeText(this, "没找到议案信息", Toast.LENGTH_LONG).show();
1258 return; 1280 return;
@@ -1365,7 +1387,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1365,7 +1387,7 @@ public class MainActivity extends BaseActivity implements ComListener {
1365 } 1387 }
1366 if (dbm == null || !dbm.checkDB() || dbm.confId != info.confId) { 1388 if (dbm == null || !dbm.checkDB() || dbm.confId != info.confId) {
1367 dbm = new DBManager(this, info.confId);// 如果没打开,则打开数据库 1389 dbm = new DBManager(this, info.confId);// 如果没打开,则打开数据库
1368 - roleType = dbm.getKeypadRole(XPadApi.getInstance().getClient().getUdpModuleNO()); 1390 + roleType = dbm.getKeypadRole(mOnlineInfo.keyId);
1369 } 1391 }
1370 if (!dbm.checkDB()) { 1392 if (!dbm.checkDB()) {
1371 Message message = new Message(); 1393 Message message = new Message();
@@ -1376,7 +1398,7 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1376,7 +1398,7 @@ public class MainActivity extends BaseActivity implements ComListener {
1376 } 1398 }
1377 if (meetingInfo == null || info.billId <= 1) { 1399 if (meetingInfo == null || info.billId <= 1) {
1378 meetingInfo = dbm.getMettingInfo(info.confId); 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 if (info.billId == 0) { // 没有议案的情况,显示欢迎界面 1404 if (info.billId == 0) { // 没有议案的情况,显示欢迎界面
@@ -1495,7 +1517,9 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1495,7 +1517,9 @@ public class MainActivity extends BaseActivity implements ComListener {
1495 if (dbm == null || !dbm.checkDB() ) { 1517 if (dbm == null || !dbm.checkDB() ) {
1496 dbm = new DBManager(this, this.meetingId);// 如果没打开,则打开数据库 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 // voteInfo.voteid = 1;//debug 1523 // voteInfo.voteid = 1;//debug
1500 if (voteInfo.voteid > 0 && voteInfo.voteid < 255) { 1524 if (voteInfo.voteid > 0 && voteInfo.voteid < 255) {
1501 try { 1525 try {
@@ -1680,6 +1704,14 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1680,6 +1704,14 @@ public class MainActivity extends BaseActivity implements ComListener {
1680 } 1704 }
1681 1705
1682 mOnlineInfo = info; 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 XPadSystem.setStatusBarDataIcon(this, info.tx, info.rx); 1715 XPadSystem.setStatusBarDataIcon(this, info.tx, info.rx);
1684 XPadSystem.setStatusBarChannel(this, info.chan); 1716 XPadSystem.setStatusBarChannel(this, info.chan);
1685 XPadSystem.setStatusBarBaseId(this, getString(R.string.base_id) + ":" + info.baseId); 1717 XPadSystem.setStatusBarBaseId(this, getString(R.string.base_id) + ":" + info.baseId);
@@ -1742,6 +1774,15 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1742,6 +1774,15 @@ public class MainActivity extends BaseActivity implements ComListener {
1742 LogUtil.i(TAG, "receve 0x32 wifi pwd:" + wifiPwd); 1774 LogUtil.i(TAG, "receve 0x32 wifi pwd:" + wifiPwd);
1743 break; 1775 break;
1744 case 0x33: // ip 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 serverIp = new String(data).trim(); 1786 serverIp = new String(data).trim();
1746 LogUtil.i(TAG, "receve 0x33 server ip:" + serverIp); 1787 LogUtil.i(TAG, "receve 0x33 server ip:" + serverIp);
1747 break; 1788 break;
@@ -1916,6 +1957,11 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -1916,6 +1957,11 @@ public class MainActivity extends BaseActivity implements ComListener {
1916 } 1957 }
1917 1958
1918 @Override 1959 @Override
  1960 + public void onMultiPackageStartDownload(int downType, int downId) {
  1961 +
  1962 + }
  1963 +
  1964 + @Override
1919 public void onVoteSubmitError(XPadApi.VoteResultItem item) { 1965 public void onVoteSubmitError(XPadApi.VoteResultItem item) {
1920 Message message = new Message(); 1966 Message message = new Message();
1921 message.obj = item; 1967 message.obj = item;
@@ -1987,6 +2033,13 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -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 private File checkUpdateApkFile() { 2043 private File checkUpdateApkFile() {
1991 String filePath = Environment.getExternalStorageDirectory().getPath() + "/sunvote/apk/"; 2044 String filePath = Environment.getExternalStorageDirectory().getPath() + "/sunvote/apk/";
1992 File file = new File(filePath); 2045 File file = new File(filePath);
@@ -2060,9 +2113,10 @@ public class MainActivity extends BaseActivity implements ComListener { @@ -2060,9 +2113,10 @@ public class MainActivity extends BaseActivity implements ComListener {
2060 LogUtil.i(TAG, "showPDFFragment"); 2113 LogUtil.i(TAG, "showPDFFragment");
2061 } 2114 }
2062 2115
  2116 + private ServicePresent servicePresent;
2063 public void showServiceDialog() { 2117 public void showServiceDialog() {
2064 View servicePanel = findViewById(R.id.service_panel); 2118 View servicePanel = findViewById(R.id.service_panel);
2065 - final ServicePresent servicePresent = new ServicePresent(this, servicePanel); 2119 + servicePresent = new ServicePresent(this, servicePanel);
2066 DialogInterface.OnDismissListener dismissListener = new DialogInterface.OnDismissListener() { 2120 DialogInterface.OnDismissListener dismissListener = new DialogInterface.OnDismissListener() {
2067 @Override 2121 @Override
2068 public void onDismiss(DialogInterface dialog) { 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,12 +17,11 @@ import android.widget.ImageButton;
17 import android.widget.TextView; 17 import android.widget.TextView;
18 import android.widget.Toast; 18 import android.widget.Toast;
19 19
20 -import com.sunvote.udptransfer.Config;  
21 import com.sunvote.util.LogUtil; 20 import com.sunvote.util.LogUtil;
  21 +import com.sunvote.util.XPadSystem;
22 import com.sunvote.xpadapp.R; 22 import com.sunvote.xpadapp.R;
23 import com.sunvote.xpadapp.base.BaseFragment; 23 import com.sunvote.xpadapp.base.BaseFragment;
24 import com.sunvote.xpadapp.server.MoniService; 24 import com.sunvote.xpadapp.server.MoniService;
25 -import com.sunvote.xpadcomm.XPadApi;  
26 25
27 public class AdminFragment extends BaseFragment { 26 public class AdminFragment extends BaseFragment {
28 private TextView tvModalInfo; 27 private TextView tvModalInfo;
@@ -31,6 +30,7 @@ public class AdminFragment extends BaseFragment { @@ -31,6 +30,7 @@ public class AdminFragment extends BaseFragment {
31 private Button btnConfig; 30 private Button btnConfig;
32 private Button btnPowerOff; 31 private Button btnPowerOff;
33 private Button btnComTest; 32 private Button btnComTest;
  33 + private Button match;
34 34
35 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 35 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
36 View view = inflater.inflate(R.layout.fragment_admin, container, false); 36 View view = inflater.inflate(R.layout.fragment_admin, container, false);
@@ -40,8 +40,9 @@ public class AdminFragment extends BaseFragment { @@ -40,8 +40,9 @@ public class AdminFragment extends BaseFragment {
40 btnBack = view.findViewById(R.id.admin_btnback); 40 btnBack = view.findViewById(R.id.admin_btnback);
41 btnConfig = view.findViewById(R.id.admin_config_mode); 41 btnConfig = view.findViewById(R.id.admin_config_mode);
42 btnPowerOff = view.findViewById(R.id.admin_btnShutdown); 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 btnBack.setOnClickListener(new OnClickListener() { 46 btnBack.setOnClickListener(new OnClickListener() {
46 @Override 47 @Override
47 public void onClick(View v) { 48 public void onClick(View v) {
@@ -58,13 +59,19 @@ public class AdminFragment extends BaseFragment { @@ -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 btnPowerOff.setOnClickListener(new OnClickListener() { 68 btnPowerOff.setOnClickListener(new OnClickListener() {
62 69
63 @Override 70 @Override
64 public void onClick(View v) { 71 public void onClick(View v) {
65 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); 72 AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
66 - builder.setMessage("确认要退出应用吗?");  
67 - builder.setTitle("退出应用"); 73 + builder.setMessage("确认关机吗?");
  74 + builder.setTitle("退出关机");
68 builder.setPositiveButton("确认", new DialogInterface.OnClickListener() { 75 builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
69 76
70 @Override 77 @Override
@@ -72,7 +79,8 @@ public class AdminFragment extends BaseFragment { @@ -72,7 +79,8 @@ public class AdminFragment extends BaseFragment {
72 dialog.dismiss(); 79 dialog.dismiss();
73 Intent intent = new Intent(getActivity(),MoniService.class); 80 Intent intent = new Intent(getActivity(),MoniService.class);
74 getActivity().stopService(intent); 81 getActivity().stopService(intent);
75 - getActivity().finish(); 82 +// getActivity().finish();
  83 + com.sunvote.xpadcomm.XPadSystem.powerOffXPad(getActivity());
76 } 84 }
77 }); 85 });
78 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() { 86 builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@@ -92,8 +100,30 @@ public class AdminFragment extends BaseFragment { @@ -92,8 +100,30 @@ public class AdminFragment extends BaseFragment {
92 100
93 @Override 101 @Override
94 public void onClick(View v) { 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 package com.sunvote.xpadapp.fragments; 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 import android.app.FragmentManager; 3 import android.app.FragmentManager;
9 import android.app.FragmentTransaction; 4 import android.app.FragmentTransaction;
10 import android.content.pm.PackageInfo; 5 import android.content.pm.PackageInfo;
@@ -12,11 +7,15 @@ import android.content.pm.PackageManager; @@ -12,11 +7,15 @@ import android.content.pm.PackageManager;
12 import android.os.Bundle; 7 import android.os.Bundle;
13 import android.view.LayoutInflater; 8 import android.view.LayoutInflater;
14 import android.view.View; 9 import android.view.View;
15 -import android.view.ViewGroup;  
16 import android.view.View.OnClickListener; 10 import android.view.View.OnClickListener;
  11 +import android.view.ViewGroup;
17 import android.widget.ImageButton; 12 import android.widget.ImageButton;
18 import android.widget.TextView; 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 public class KeypadTestFragment extends SuperBaseFragment { 19 public class KeypadTestFragment extends SuperBaseFragment {
21 private TextView tvId; 20 private TextView tvId;
22 private TextView tvSn; 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,33 +2,23 @@ package com.sunvote.xpadapp.presenter;
2 2
3 import android.content.Context; 3 import android.content.Context;
4 import android.content.DialogInterface; 4 import android.content.DialogInterface;
5 -import android.os.Looper; 5 +import android.util.Log;
6 import android.view.LayoutInflater; 6 import android.view.LayoutInflater;
7 import android.view.View; 7 import android.view.View;
8 import android.widget.ImageView; 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 import com.sunvote.xpadapp.MainActivity; 11 import com.sunvote.xpadapp.MainActivity;
20 import com.sunvote.xpadapp.R; 12 import com.sunvote.xpadapp.R;
21 import com.sunvote.xpadcomm.XPadApi; 13 import com.sunvote.xpadcomm.XPadApi;
22 14
23 -import java.util.logging.Handler;  
24 -  
25 /** 15 /**
26 * Created by XXW on 2017/11/7. 16 * Created by XXW on 2017/11/7.
27 */ 17 */
28 18
29 public class ServicePresent implements View.OnClickListener{ 19 public class ServicePresent implements View.OnClickListener{
30 20
31 - private Context context; 21 + public MainActivity mMainActivity;
32 22
33 private View paper_linear; 23 private View paper_linear;
34 private View pen_linear; 24 private View pen_linear;
@@ -59,6 +49,7 @@ public class ServicePresent implements View.OnClickListener{ @@ -59,6 +49,7 @@ public class ServicePresent implements View.OnClickListener{
59 private boolean technology; 49 private boolean technology;
60 50
61 private static byte reqpos = 1 ; 51 private static byte reqpos = 1 ;
  52 + private byte selType;
62 53
63 private DialogInterface.OnDismissListener dismissListener; 54 private DialogInterface.OnDismissListener dismissListener;
64 55
@@ -70,14 +61,14 @@ public class ServicePresent implements View.OnClickListener{ @@ -70,14 +61,14 @@ public class ServicePresent implements View.OnClickListener{
70 this.dismissListener = dismissListener; 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 rootView = LayoutInflater.from(context).inflate(R.layout.dialog_service,null); 66 rootView = LayoutInflater.from(context).inflate(R.layout.dialog_service,null);
76 init(); 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 this.rootView = rootView; 72 this.rootView = rootView;
82 init(); 73 init();
83 } 74 }
@@ -137,7 +128,6 @@ public class ServicePresent implements View.OnClickListener{ @@ -137,7 +128,6 @@ public class ServicePresent implements View.OnClickListener{
137 technology_linear.setOnClickListener(this); 128 technology_linear.setOnClickListener(this);
138 submit.setOnClickListener(this); 129 submit.setOnClickListener(this);
139 initAdmin(); 130 initAdmin();
140 - SDKProcessWork.getInstance().registerOnReceiveCmdListener(receiveCmdListener);  
141 } 131 }
142 132
143 private void initAdmin(){ 133 private void initAdmin(){
@@ -151,8 +141,8 @@ public class ServicePresent implements View.OnClickListener{ @@ -151,8 +141,8 @@ public class ServicePresent implements View.OnClickListener{
151 clickCount ++ ; 141 clickCount ++ ;
152 if(clickCount >= 5){ 142 if(clickCount >= 5){
153 clickCount = 0 ; 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,43 +275,16 @@ public class ServicePresent implements View.OnClickListener{
285 275
286 public void dismiss(){ 276 public void dismiss(){
287 rootView.setVisibility(View.GONE); 277 rootView.setVisibility(View.GONE);
288 - destroy();  
289 } 278 }
290 279
291 280
292 public void sendServiceCmd(final byte type){ 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,6 +220,11 @@ public class XPadPresenter implements ComListener {
220 } 220 }
221 221
222 @Override 222 @Override
  223 + public void onMultiPackageStartDownload(int downType, int downId) {
  224 +
  225 + }
  226 +
  227 + @Override
223 public void onVoteSubmitAllOkSuccess() { 228 public void onVoteSubmitAllOkSuccess() {
224 cl.onVoteSubmitAllOkSuccess(); 229 cl.onVoteSubmitAllOkSuccess();
225 } 230 }
@@ -229,6 +234,11 @@ public class XPadPresenter implements ComListener { @@ -229,6 +234,11 @@ public class XPadPresenter implements ComListener {
229 cl.onComCommunicationTest(sendn,checkOk); 234 cl.onComCommunicationTest(sendn,checkOk);
230 } 235 }
231 236
  237 + @Override
  238 + public void onServiceSubmitSuccess() {
  239 +
  240 + }
  241 +
232 private IntentFilter batteryLevelFilter; 242 private IntentFilter batteryLevelFilter;
233 243
234 private void monitorBatteryState() { 244 private void monitorBatteryState() {
C5/app/src/main/java/com/sunvote/xpadcomm/ComListener.java
@@ -14,17 +14,20 @@ public interface ComListener { @@ -14,17 +14,20 @@ public interface ComListener {
14 public void onModelEvent(ModelInfo info); 14 public void onModelEvent(ModelInfo info);
15 public void onBaseEvent( BaseInfo info); 15 public void onBaseEvent( BaseInfo info);
16 public void onVoteEvent(VoteInfo info); 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 public void onVoteSubmitAllOkSuccess(); 19 public void onVoteSubmitAllOkSuccess();
20 public void onKeyPadEvent(KeypadInfo info); 20 public void onKeyPadEvent(KeypadInfo info);
21 public void onOnLineEvent(OnLineInfo info); 21 public void onOnLineEvent(OnLineInfo info);
22 public void onCmdData(CmdDataInfo info); 22 public void onCmdData(CmdDataInfo info);
23 public void onMultiPackageData(byte[] data, int len); 23 public void onMultiPackageData(byte[] data, int len);
  24 + public void onMultiPackageStartDownload(int downType,int downId);//进入下载状态
24 25
25 public void onFirmUpdate(int percent); 26 public void onFirmUpdate(int percent);
26 public void onFirmUpdateResult(boolean success , String msg); 27 public void onFirmUpdateResult(boolean success , String msg);
27 public void onFirmUpdateInfo(String info); 28 public void onFirmUpdateInfo(String info);
28 29
29 public void onComCommunicationTest(int sendn,boolean checkOk); 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,23 +229,7 @@ public class DownloadFileModule {
229 } 229 }
230 230
231 private void sendNextData(byte type ,int index) { 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 public void createAndCleanFolder(String folderName) { 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 +6,7 @@ import android.os.HandlerThread;
6 import java.io.IOException; 6 import java.io.IOException;
7 import java.net.DatagramPacket; 7 import java.net.DatagramPacket;
8 import java.net.DatagramSocket; 8 import java.net.DatagramSocket;
  9 +import java.net.InetAddress;
9 import java.net.SocketException; 10 import java.net.SocketException;
10 11
11 import com.sunvote.util.LogUtil; 12 import com.sunvote.util.LogUtil;
@@ -31,10 +32,30 @@ public class DownloadFileSendThread extends HandlerThread { @@ -31,10 +32,30 @@ public class DownloadFileSendThread extends HandlerThread {
31 handler = new Handler(getLooper()); 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 return true; 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,1836 +5,2260 @@ import android.os.Handler;
5 import android.os.HandlerThread; 5 import android.os.HandlerThread;
6 import android.util.Log; 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 import com.sunvote.util.LogUtil; 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 import java.io.IOException; 15 import java.io.IOException;
  16 +import java.io.InputStream;
13 import java.io.OutputStream; 17 import java.io.OutputStream;
14 import java.io.UnsupportedEncodingException; 18 import java.io.UnsupportedEncodingException;
  19 +import java.security.InvalidParameterException;
15 import java.util.ArrayList; 20 import java.util.ArrayList;
16 import java.util.Arrays; 21 import java.util.Arrays;
  22 +import java.util.Collections;
17 import java.util.Iterator; 23 import java.util.Iterator;
18 - 24 +import java.util.List;
19 25
20 public class XPadApi implements XPadApiInterface { 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 @Override 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 /* Create a receiving thread */ 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 // InitThread initThread = new InitThread(); 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 break; 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 } else { 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 break; 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,6 +41,7 @@ public interface XPadApiInterface {
41 public static final int CMD_FIRM_UPDATE_RESPONSE = 0xF8;//固件升级应答 41 public static final int CMD_FIRM_UPDATE_RESPONSE = 0xF8;//固件升级应答
42 42
43 public static final int CMD_COM_COMMUNICATION_TEST_RESPONSE = 0xB0; //串口测试应答 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,7 +55,7 @@ public interface XPadApiInterface {
54 public static final int VoteType_Choice = 10; 55 public static final int VoteType_Choice = 10;
55 public static final int VoteType_BatchVote = 20;//批次 56 public static final int VoteType_BatchVote = 20;//批次
56 public static final int VoteType_BatchElect = 22;//选举 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 public static final int VoteType_BatchIDEvalue = 31; //编号式二维表评测模式 综合测评 59 public static final int VoteType_BatchIDEvalue = 31; //编号式二维表评测模式 综合测评
59 60
60 61
@@ -78,21 +79,22 @@ public interface XPadApiInterface { @@ -78,21 +79,22 @@ public interface XPadApiInterface {
78 public void getVoteStatus();//查询投票信标 79 public void getVoteStatus();//查询投票信标
79 80
80 public void getKeypadParam(); //查询键盘参数 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 public void configMode();//进入配置模式 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 public void submitVote(int ansType, String info);//ID模式结果 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 public void submitVoteAllOK(); //确认提交 96 public void submitVoteAllOK(); //确认提交
  97 + public void submitVoteAllOKWithValue(int ansType, String info);//确认提交带某项结果
96 public void cancelSubmitVoteAllOK(); 98 public void cancelSubmitVoteAllOK();
97 public void submitSelectOther(String info); 99 public void submitSelectOther(String info);
98 100
@@ -127,23 +129,6 @@ public interface XPadApiInterface { @@ -127,23 +129,6 @@ public interface XPadApiInterface {
127 public int offTime;//自动关机时间 129 public int offTime;//自动关机时间
128 public int attrib;//表决器特性:背光模式+蜂鸣器模式等等 130 public int attrib;//表决器特性:背光模式+蜂鸣器模式等等
129 public String baseName; //基站名称,最多12字节 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 public class ModelInfo{ 134 public class ModelInfo{
@@ -174,6 +159,28 @@ public interface XPadApiInterface { @@ -174,6 +159,28 @@ public interface XPadApiInterface {
174 public String keySn; 159 public String keySn;
175 public int comError=0; 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,8 +207,8 @@ public interface XPadApiInterface {
200 207
201 /** 208 /**
202 * 是否带票数限定,,对批次表决、批次评议、批次自定义评议有效 209 * 是否带票数限定,,对批次表决、批次评议、批次自定义评议有效
203 - 0 不限定  
204 - 1 带票数限定 210 + 0 不限定
  211 + 1 带票数限定
205 */ 212 */
206 public int fixballot; 213 public int fixballot;
207 /** 214 /**
@@ -225,36 +232,67 @@ public interface XPadApiInterface { @@ -225,36 +232,67 @@ public interface XPadApiInterface {
225 public int less;//[11] 232 public int less;//[11]
226 233
227 @Override 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 public ResultInfo resultInfo = new ResultInfo(); 294 public ResultInfo resultInfo = new ResultInfo();
257 - public class ResultInfo{ //结果 295 + public class ResultInfo{//结果
258 public int resultType;//[7] 结果显示类型 。 如 0为 签到 1为表决 296 public int resultType;//[7] 结果显示类型 。 如 0为 签到 1为表决
259 public int bits;// [8] 297 public int bits;// [8]
260 public int num0;//[9-10] 298 public int num0;//[9-10]
@@ -266,24 +304,9 @@ public interface XPadApiInterface { @@ -266,24 +304,9 @@ public interface XPadApiInterface {
266 public int num6;//[21,22] 304 public int num6;//[21,22]
267 305
268 @Override 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 public boolean equals(Object o) { 307 public boolean equals(Object o) {
285 if (this == o) return true; 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 ResultInfo that = (ResultInfo) o; 311 ResultInfo that = (ResultInfo) o;
289 312
@@ -329,27 +352,9 @@ public interface XPadApiInterface { @@ -329,27 +352,9 @@ public interface XPadApiInterface {
329 public int voteid;//[21] 352 public int voteid;//[21]
330 353
331 @Override 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 public boolean equals(Object o) { 355 public boolean equals(Object o) {
351 if (this == o) return true; 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 ElectInfo electInfo = (ElectInfo) o; 359 ElectInfo electInfo = (ElectInfo) o;
355 360
@@ -403,29 +408,9 @@ public interface XPadApiInterface { @@ -403,29 +408,9 @@ public interface XPadApiInterface {
403 public int number;//[24] 408 public int number;//[24]
404 409
405 @Override 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 public boolean equals(Object o) { 411 public boolean equals(Object o) {
427 if (this == o) return true; 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 SingleItemEvalueInfo that = (SingleItemEvalueInfo) o; 415 SingleItemEvalueInfo that = (SingleItemEvalueInfo) o;
431 416
@@ -479,29 +464,13 @@ public interface XPadApiInterface { @@ -479,29 +464,13 @@ public interface XPadApiInterface {
479 public int ruleStart;//[7]; 464 public int ruleStart;//[7];
480 public int ruleEnd;//[7]; 465 public int ruleEnd;//[7];
481 public int sliderover;//[7]; 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 @Override 470 @Override
502 public boolean equals(Object o) { 471 public boolean equals(Object o) {
503 if (this == o) return true; 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 BatchEvalueInfo that = (BatchEvalueInfo) o; 475 BatchEvalueInfo that = (BatchEvalueInfo) o;
507 476
@@ -516,7 +485,9 @@ public interface XPadApiInterface { @@ -516,7 +485,9 @@ public interface XPadApiInterface {
516 if (modify != that.modify) return false; 485 if (modify != that.modify) return false;
517 if (ruleStart != that.ruleStart) return false; 486 if (ruleStart != that.ruleStart) return false;
518 if (ruleEnd != that.ruleEnd) return false; 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 @Override 493 @Override
@@ -533,61 +504,12 @@ public interface XPadApiInterface { @@ -533,61 +504,12 @@ public interface XPadApiInterface {
533 result = 31 * result + ruleStart; 504 result = 31 * result + ruleStart;
534 result = 31 * result + ruleEnd; 505 result = 31 * result + ruleEnd;
535 result = 31 * result + sliderover; 506 result = 31 * result + sliderover;
  507 + result = 31 * result + billNo;
  508 + result = 31 * result + billSubNo;
536 return result; 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 //Deprecated blow 514 //Deprecated blow
593 // public int voteMode;// 表决模式 515 // public int voteMode;// 表决模式
@@ -613,18 +535,35 @@ public interface XPadApiInterface { @@ -613,18 +535,35 @@ public interface XPadApiInterface {
613 public int modify; //0 不允许修改 1 允许修改, 535 public int modify; //0 不允许修改 1 允许修改,
614 536
615 @Override 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,7 +583,41 @@ public interface XPadApiInterface {
644 public int equityMode; 583 public int equityMode;
645 public int minSelect; 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,7 +4,9 @@ package com.sunvote.xpadcomm;
4 import android.content.Context; 4 import android.content.Context;
5 import android.content.Intent; 5 import android.content.Intent;
6 6
  7 +import com.sunvote.sdk.HuaWeiSDK;
7 import com.sunvote.util.LogUtil; 8 import com.sunvote.util.LogUtil;
  9 +import com.sunvote.xpadapp.MainActivity;
8 import com.sunvote.xpadapp.R; 10 import com.sunvote.xpadapp.R;
9 11
10 public class XPadSystem { 12 public class XPadSystem {
@@ -144,6 +146,7 @@ public class XPadSystem { @@ -144,6 +146,7 @@ public class XPadSystem {
144 if (intent != null) { 146 if (intent != null) {
145 context.startActivity(intent); 147 context.startActivity(intent);
146 } 148 }
  149 + HuaWeiSDK.getInstance((MainActivity)context).powerOffXPad();
147 } 150 }
148 151
149 public static void rebootXPad(Context context) { 152 public static void rebootXPad(Context context) {
@@ -152,7 +155,7 @@ public class XPadSystem { @@ -152,7 +155,7 @@ public class XPadSystem {
152 if (intent != null) { 155 if (intent != null) {
153 context.startActivity(intent); 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,6 +164,9 @@ public class XPadSystem {
161 Intent intent = new Intent(); 164 Intent intent = new Intent();
162 intent.setAction("com.along.intent.Navigation_VISIBLE"); 165 intent.setAction("com.along.intent.Navigation_VISIBLE");
163 context.sendBroadcast(intent); 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 public static void setNavgationGone(Context context){ 172 public static void setNavgationGone(Context context){
@@ -168,6 +174,9 @@ public class XPadSystem { @@ -168,6 +174,9 @@ public class XPadSystem {
168 Intent intent = new Intent(); 174 Intent intent = new Intent();
169 intent.setAction("com.along.intent.Navigation_GONE"); 175 intent.setAction("com.along.intent.Navigation_GONE");
170 context.sendBroadcast(intent); 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 public static void goToSleep(Context context){ 182 public static void goToSleep(Context context){
C5/app/src/main/res/layout/fragment_admin.xml
@@ -13,6 +13,19 @@ @@ -13,6 +13,19 @@
13 android:orientation="horizontal"> 13 android:orientation="horizontal">
14 14
15 <Button 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 android:id="@+id/admin_config_mode" 29 android:id="@+id/admin_config_mode"
17 android:layout_width="0dp" 30 android:layout_width="0dp"
18 android:layout_height="60dp" 31 android:layout_height="60dp"
@@ -25,6 +38,8 @@ @@ -25,6 +38,8 @@
25 android:textSize="@dimen/big_text_p5" 38 android:textSize="@dimen/big_text_p5"
26 android:textStyle="bold" /> 39 android:textStyle="bold" />
27 40
  41 +
  42 +
28 <Button 43 <Button
29 android:id="@+id/admin_btnComTest" 44 android:id="@+id/admin_btnComTest"
30 android:layout_width="0dp" 45 android:layout_width="0dp"
@@ -32,7 +47,7 @@ @@ -32,7 +47,7 @@
32 android:layout_weight="1" 47 android:layout_weight="1"
33 android:background="@color/blue" 48 android:background="@color/blue"
34 android:gravity="center" 49 android:gravity="center"
35 - android:text="重定向服务器" 50 + android:text="退出应用"
36 android:textColor="@color/white" 51 android:textColor="@color/white"
37 android:textSize="@dimen/big_text_p5" 52 android:textSize="@dimen/big_text_p5"
38 android:textStyle="bold" /> 53 android:textStyle="bold" />
@@ -71,7 +86,7 @@ @@ -71,7 +86,7 @@
71 android:layout_alignParentBottom="true" 86 android:layout_alignParentBottom="true"
72 android:layout_centerHorizontal="true" 87 android:layout_centerHorizontal="true"
73 android:layout_marginBottom="50dp" 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 android:textColor="@color/white" 90 android:textColor="@color/white"
76 android:textSize="@dimen/big_text_p4" /> 91 android:textSize="@dimen/big_text_p4" />
77 92
C5/app/src/main/res/values/strings.xml
@@ -131,7 +131,7 @@ @@ -131,7 +131,7 @@
131 <string name="piao">票</string> 131 <string name="piao">票</string>
132 <string name="ren">人</string> 132 <string name="ren">人</string>
133 <string name="reboot">重启</string> 133 <string name="reboot">重启</string>
134 - <string name="shutdown">退出应用</string> 134 + <string name="shutdown">关机</string>
135 <string name="comtest">串口测试</string> 135 <string name="comtest">串口测试</string>
136 <string name="getDeviceInfo">读设备信息</string> 136 <string name="getDeviceInfo">读设备信息</string>
137 <string name="comtest_interval">串口测试间隔</string> 137 <string name="comtest_interval">串口测试间隔</string>
C5/util/src/main/java/com/sunvote/util/ByteUtils.java
@@ -119,4 +119,35 @@ public class ByteUtils { @@ -119,4 +119,35 @@ public class ByteUtils {
119 119
120 return true; 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 }