Commit e1e561633f99b94d20defcdb6c3c4eb321c1e017
1 parent
9e36c270
移除一个分支
Showing
48 changed files
with
1 additions
and
4098 deletions
C5/settings.gradle
C5/xpadapi/.gitignore deleted
1 | -/build |
C5/xpadapi/build.gradle deleted
1 | -apply plugin: 'com.android.library' | |
2 | - | |
3 | -android { | |
4 | - compileSdkVersion 28 | |
5 | - | |
6 | - | |
7 | - | |
8 | - defaultConfig { | |
9 | - minSdkVersion 21 | |
10 | - targetSdkVersion 28 | |
11 | - versionCode 1 | |
12 | - versionName "1.0" | |
13 | - | |
14 | - testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" | |
15 | - | |
16 | - } | |
17 | - | |
18 | - buildTypes { | |
19 | - release { | |
20 | - minifyEnabled false | |
21 | - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' | |
22 | - } | |
23 | - } | |
24 | - | |
25 | -} | |
26 | - | |
27 | -dependencies { | |
28 | - implementation fileTree(include: ['*.jar'], dir: 'libs') | |
29 | - implementation 'com.android.support:appcompat-v7:28.0.0' | |
30 | - testImplementation 'junit:junit:4.12' | |
31 | - androidTestImplementation 'com.android.support.test:runner:1.0.2' | |
32 | - androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' | |
33 | - implementation project(':udpmodule') | |
34 | -} |
C5/xpadapi/proguard-rules.pro deleted
1 | -# Add project specific ProGuard rules here. | |
2 | -# You can control the set of applied configuration files using the | |
3 | -# proguardFiles setting in build.gradle. | |
4 | -# | |
5 | -# For more details, see | |
6 | -# http://developer.android.com/guide/developing/tools/proguard.html | |
7 | - | |
8 | -# If your project uses WebView with JS, uncomment the following | |
9 | -# and specify the fully qualified class name to the JavaScript interface | |
10 | -# class: | |
11 | -#-keepclassmembers class fqcn.of.javascript.interface.for.webview { | |
12 | -# public *; | |
13 | -#} | |
14 | - | |
15 | -# Uncomment this to preserve the line number information for | |
16 | -# debugging stack traces. | |
17 | -#-keepattributes SourceFile,LineNumberTable | |
18 | - | |
19 | -# If you keep the line number information, uncomment this to | |
20 | -# hide the original source file name. | |
21 | -#-renamesourcefileattribute SourceFile |
C5/xpadapi/src/androidTest/java/com/sunvote/xpadapi/ExampleInstrumentedTest.java deleted
1 | -package com.sunvote.xpadapi; | |
2 | - | |
3 | -import android.content.Context; | |
4 | -import android.support.test.InstrumentationRegistry; | |
5 | -import android.support.test.runner.AndroidJUnit4; | |
6 | - | |
7 | -import org.junit.Test; | |
8 | -import org.junit.runner.RunWith; | |
9 | - | |
10 | -import static org.junit.Assert.*; | |
11 | - | |
12 | -/** | |
13 | - * Instrumented test, which will execute on an Android device. | |
14 | - * | |
15 | - * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |
16 | - */ | |
17 | -@RunWith(AndroidJUnit4.class) | |
18 | -public class ExampleInstrumentedTest { | |
19 | - @Test | |
20 | - public void useAppContext() { | |
21 | - // Context of the app under test. | |
22 | - Context appContext = InstrumentationRegistry.getTargetContext(); | |
23 | - | |
24 | - assertEquals("com.sunvote.xpadapi.test", appContext.getPackageName()); | |
25 | - } | |
26 | -} |
C5/xpadapi/src/main/AndroidManifest.xml deleted
1 | -<?xml version="1.0" encoding="utf-8"?> | |
2 | -<manifest xmlns:android="http://schemas.android.com/apk/res/android" | |
3 | - package="com.sunvote.xpadapi"> | |
4 | - | |
5 | - <application> | |
6 | - <service | |
7 | - android:name=".service.XpadApiService" | |
8 | - android:enabled="true" | |
9 | - android:exported="true"></service> | |
10 | - </application> | |
11 | - | |
12 | -</manifest> | |
13 | 0 | \ No newline at end of file |
C5/xpadapi/src/main/aidl/com/sunvote/xpadapi/ISunvoteApi.aidl deleted
1 | -// ISunvoteApi.aidl | |
2 | -package com.sunvote.xpadapi; | |
3 | - | |
4 | -// Declare any non-default types here with import statements | |
5 | - | |
6 | -interface ISunvoteApi { | |
7 | - | |
8 | - | |
9 | - /** | |
10 | - * 数据包接收 | |
11 | - */ | |
12 | - | |
13 | - | |
14 | - /** | |
15 | - * 基础信标 | |
16 | - */ | |
17 | - | |
18 | - /** | |
19 | - * 投票信标 | |
20 | - */ | |
21 | - | |
22 | - | |
23 | - /** | |
24 | - * 基础信标 | |
25 | - */ | |
26 | - | |
27 | - /** | |
28 | - * 30透传包 | |
29 | - */ | |
30 | - | |
31 | - /** | |
32 | - * 40透传包 | |
33 | - */ | |
34 | -} | |
35 | - |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/XpadApiService.java deleted
1 | -package com.sunvote.xpadapi.service; | |
2 | - | |
3 | -import android.app.Service; | |
4 | -import android.content.BroadcastReceiver; | |
5 | -import android.content.Context; | |
6 | -import android.content.Intent; | |
7 | -import android.content.IntentFilter; | |
8 | -import android.os.Handler; | |
9 | -import android.os.HandlerThread; | |
10 | -import android.os.IBinder; | |
11 | - | |
12 | -import com.sunvote.udptransfer.stream.SunVoteInputStream; | |
13 | -import com.sunvote.udptransfer.work.BaseStationProcessWork; | |
14 | -import com.sunvote.udptransfer.work.RepeatMessageManager; | |
15 | -import com.sunvote.udptransfer.work.SDKProcessWork; | |
16 | -import com.sunvote.util.LogUtil; | |
17 | -import com.sunvote.xpadapi.ISunvoteApi; | |
18 | -import com.sunvote.xpadapi.service.bean.BaseInfo; | |
19 | -import com.sunvote.xpadapi.service.bean.BaseVoteInfo; | |
20 | -import com.sunvote.xpadapi.service.bean.HeartBeat; | |
21 | -import com.sunvote.xpadapi.service.bean.KeypadInfo; | |
22 | -import com.sunvote.xpadapi.service.bean.ModelInfo; | |
23 | -import com.sunvote.xpadapi.service.bean.OnLineInfo; | |
24 | -import com.sunvote.xpadapi.service.bean.Packet; | |
25 | -import com.sunvote.xpadapi.service.listener.OnDataReceiver; | |
26 | -import com.sunvote.xpadapi.service.logic.XpadApiServiceInfoProxyManager; | |
27 | -import com.sunvote.xpadapi.usb.UsbTransferManager; | |
28 | -import com.sunvote.xpadapi.util.ByteUtils; | |
29 | -import com.sunvote.xpadapi.util.Cons; | |
30 | -import com.sunvote.xpadapi.util.Crc16; | |
31 | - | |
32 | -import java.io.ByteArrayOutputStream; | |
33 | -import java.util.ArrayList; | |
34 | -import java.util.Arrays; | |
35 | -import java.util.Collections; | |
36 | -import java.util.List; | |
37 | - | |
38 | -/** | |
39 | - * @Author Elvis | |
40 | - */ | |
41 | -public class XpadApiService extends Service { | |
42 | - | |
43 | - private static final String TAG = XpadApiService.class.getSimpleName(); | |
44 | - private List<OnDataReceiver> onDataReceiverList = new ArrayList<>(); | |
45 | - private int batteryLevel = 0; | |
46 | - private List<Packet> innerList = Collections.synchronizedList(new ArrayList<Packet>()); | |
47 | - private OnDataReceiver onDataReceiver = new OnDataReceiver() { | |
48 | - @Override | |
49 | - public void onDataReceiver(byte[] datas) { | |
50 | - LogUtil.i(TAG, "onDataReceiver", datas); | |
51 | - for (OnDataReceiver temp : onDataReceiverList) { | |
52 | - if (temp != null) { | |
53 | - try { | |
54 | - temp.onDataReceiver(datas); | |
55 | - } catch (Exception ex) { | |
56 | - LogUtil.e(TAG, "onDataReceiver" + temp.getClass().getSimpleName(), ex); | |
57 | - } | |
58 | - } | |
59 | - } | |
60 | - } | |
61 | - | |
62 | - @Override | |
63 | - public void onDataSender(byte[] datas) { | |
64 | - LogUtil.i(TAG, "onDataSender", datas); | |
65 | - for (OnDataReceiver temp : onDataReceiverList) { | |
66 | - if (temp != null) { | |
67 | - try { | |
68 | - temp.onDataSender(datas); | |
69 | - } catch (Exception ex) { | |
70 | - LogUtil.e(TAG, "onDataSender", ex); | |
71 | - } | |
72 | - } | |
73 | - } | |
74 | - } | |
75 | - }; | |
76 | - | |
77 | - public XpadApiService() { | |
78 | - } | |
79 | - | |
80 | - public int registerOnDataReceiver(OnDataReceiver onDataReceiver) { | |
81 | - for (OnDataReceiver temp : onDataReceiverList) { | |
82 | - if (temp == onDataReceiver) { | |
83 | - return 0; | |
84 | - } | |
85 | - } | |
86 | - onDataReceiverList.add(onDataReceiver); | |
87 | - return 1; | |
88 | - } | |
89 | - | |
90 | - @Override | |
91 | - public void onCreate() { | |
92 | - super.onCreate(); | |
93 | - | |
94 | - sendThread = new HandlerThread("send"); | |
95 | - receiverThread = new HandlerThread("receiver"); | |
96 | - sendThread.start(); | |
97 | - receiverThread.start(); | |
98 | - | |
99 | - taskHandler = new Handler(sendThread.getLooper()); | |
100 | - IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); | |
101 | - registerReceiver(batteryLevelRcvr, batteryLevelFilter); | |
102 | - XpadApiServiceInfoProxyManager.getInstance().setService(this); | |
103 | - | |
104 | - receiverDatas(); | |
105 | - } | |
106 | - | |
107 | - private void receiverDatas() { | |
108 | - SunVoteInputStream sunVoteInputStream = new SunVoteInputStream(); | |
109 | - sunVoteInputStream.setOnBytesReceiver(new SunVoteInputStream.OnBytesReceiver() { | |
110 | - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | |
111 | - @Override | |
112 | - public void onBytesReceiver(byte[] bytes, int len) { | |
113 | - // 1. 先检测读取数据到缓冲区 | |
114 | - byteArrayOutputStream.write(bytes, 0, bytes.length); | |
115 | - if (byteArrayOutputStream.size() >= 3) { | |
116 | - byte[] temp = byteArrayOutputStream.toByteArray(); | |
117 | - int find = ByteUtils.findBytes(temp, new byte[]{(byte) 0xF5, (byte) 0xAA, (byte) 0xAA}, 0); | |
118 | - if (find >= 0) { | |
119 | - // 3. 标志存在,则继续读取长度 | |
120 | - if (byteArrayOutputStream.size() >= find + 4) { | |
121 | - int length = ByteUtils.byte1ToInt(byteArrayOutputStream.toByteArray()[find + 3]); | |
122 | - if (byteArrayOutputStream.size() >= find + 4 + length) { | |
123 | - ByteArrayOutputStream tmp = new ByteArrayOutputStream(); | |
124 | - // 4. 根据长度读取包的内容 | |
125 | - for (int i = find; i < find + 4 + length; i++) { | |
126 | - // 5. 截取包的内容,向外抛出,处理,接着读取下一个包 | |
127 | - tmp.write(temp[i]); | |
128 | - } | |
129 | - //CRC 校验 | |
130 | - byte[] datas = tmp.toByteArray(); | |
131 | - LogUtil.i(TAG, "RECEIVER DATA:", datas); | |
132 | - | |
133 | - try { | |
134 | - //处理 | |
135 | - doWith(datas); | |
136 | - } catch (Exception ex) { | |
137 | - LogUtil.i(TAG, "处理命令出错:", ex); | |
138 | - } | |
139 | - // 7. 剩余数据重新打包处理 | |
140 | - byteArrayOutputStream.reset(); | |
141 | - for (int i = find + 4 + length; i < temp.length; i++) { | |
142 | - byteArrayOutputStream.write(temp[i]); | |
143 | - } | |
144 | - } | |
145 | - } | |
146 | - } | |
147 | - } | |
148 | - } | |
149 | - }); | |
150 | - SDKProcessWork.getInstance().setInputStream(sunVoteInputStream); | |
151 | - BaseStationProcessWork.getInstance().start(); | |
152 | - RepeatMessageManager.getInstance().start(); | |
153 | - SDKProcessWork.getInstance().start(); | |
154 | - } | |
155 | - | |
156 | - @Override | |
157 | - public void onDestroy() { | |
158 | - unregisterReceiver(batteryLevelRcvr); | |
159 | - super.onDestroy(); | |
160 | - } | |
161 | - | |
162 | - private HandlerThread sendThread = null; | |
163 | - private HandlerThread receiverThread = null; | |
164 | - private Handler taskHandler = null; | |
165 | - private boolean receivering = true; | |
166 | - | |
167 | - | |
168 | - @Override | |
169 | - public IBinder onBind(Intent intent) { | |
170 | - return stub; | |
171 | - } | |
172 | - | |
173 | - private final ISunvoteApi.Stub stub = new ISunvoteApi.Stub() { | |
174 | - | |
175 | - }; | |
176 | - | |
177 | - private Runnable sendTask = new Runnable() { | |
178 | - @Override | |
179 | - public void run() { | |
180 | - // 从队列中取出待发送数据 | |
181 | - List<Packet> sendList = XpadApiServiceInfoProxyManager.getInstance().getSendList(); | |
182 | - boolean isSend = false; | |
183 | - for (Packet p : sendList) { | |
184 | - if (p.needSend() && !isSend) {// 按照顺序发送 | |
185 | - p.addSendCount(); | |
186 | - sendPacket(p); | |
187 | - isSend = true; | |
188 | - } | |
189 | - if (p.needSend() && isSend && p.isSync()) {// 并行发送 | |
190 | - sleepTimes(50);// 模块不能发送太快 | |
191 | - p.addSendCount(); | |
192 | - sendPacket(p); | |
193 | - } | |
194 | - if (!p.needSend() && (p.getOnSendPacket() != null)) { | |
195 | - p.getOnSendPacket().onFail(p); | |
196 | - } | |
197 | - } | |
198 | - if (!isSend) { | |
199 | - LogUtil.i(TAG, "没有要提交的数据,检查是否有查询包发送"); | |
200 | - if (innerList.size() > 0) { | |
201 | - synchronized (innerList) { | |
202 | - for (Packet packet : innerList) { | |
203 | - sendPacket(packet); | |
204 | - sleepTimes(50); | |
205 | - } | |
206 | - } | |
207 | - } | |
208 | - } | |
209 | - | |
210 | - if (!isSend) {// 没有数据发送? 那就发送心跳吧 | |
211 | - LogUtil.i(TAG, "没有任何数据要发送,则发送心跳包"); | |
212 | - sendData(new HeartBeat((byte) batteryLevel, (byte) 0).toBytes()); | |
213 | - } | |
214 | - // 轮询下一次发送数据 | |
215 | - taskHandler.removeCallbacks(this); | |
216 | - taskHandler.postDelayed(this, 1000); | |
217 | - } | |
218 | - }; | |
219 | - | |
220 | - private void doWith(byte[] datas) { | |
221 | - onDataReceiver.onDataReceiver(datas); | |
222 | - switch (datas[4] & 0xFF) { | |
223 | - case Cons.CMD_CHECK_BASE_STATUS_RESPONSE: | |
224 | - checkBaseStatusResponse(datas); | |
225 | - break; | |
226 | - case Cons.CMD_VOTE_RESULT_SEND_RESPONSE: | |
227 | - voteResultSendResponse(datas); | |
228 | - break; | |
229 | - case Cons.CMD_FIRM_UPDATE_RESPONSE: | |
230 | - firmUpdateResponse(datas); | |
231 | - break; | |
232 | - | |
233 | - case Cons.CMD_BASE_STATUS_CHANGE: | |
234 | - baseStatusChange(datas); | |
235 | - break; | |
236 | - case Cons.CMD_VOTE_STATUS_CHANGE: | |
237 | - voteStatusChange(datas); | |
238 | - break; | |
239 | - case Cons.CMD_VOTE_SEND_SUCCESS_RESPONSE: | |
240 | - voteSendSuccessResponse(datas); | |
241 | - break; | |
242 | - | |
243 | - case Cons.CMD_UPLOAD_DATA_RESPONSE: | |
244 | - uploadDataResponse(datas); | |
245 | - break; | |
246 | - case Cons.CMD_TRANSPARENT_TRANSMISSION: | |
247 | - transparentTransmission(datas); | |
248 | - break; | |
249 | - case Cons.CMD_MULTI_PCKAGE_DOWNLOAD: | |
250 | - break; | |
251 | - case Cons.CMD_COM_COMMUNICATION_TEST_RESPONSE: | |
252 | - break; | |
253 | - | |
254 | - } | |
255 | - } | |
256 | - | |
257 | - private void transparentTransmission(byte[] datas) { | |
258 | - } | |
259 | - | |
260 | - private void uploadDataResponse(byte[] datas) { | |
261 | - } | |
262 | - | |
263 | - private void voteSendSuccessResponse(byte[] datas) { | |
264 | - responseChange(datas, 4, (byte) 0xF3); | |
265 | - int serialNo = datas[5] & 0xff; | |
266 | - Packet packet = XpadApiServiceInfoProxyManager.getInstance().findPacket(serialNo); | |
267 | - if (packet != null && packet.getOnSendPacket() != null) { | |
268 | - packet.getOnSendPacket().onSuccess(packet); | |
269 | - } | |
270 | - } | |
271 | - | |
272 | - private void sendInnerPacket(Packet packet) { | |
273 | - synchronized (innerList) { | |
274 | - for (Packet temp : innerList) { | |
275 | - if (temp.getSendNo() == packet.getSendNo()) { | |
276 | - return; | |
277 | - } | |
278 | - } | |
279 | - innerList.add(packet); | |
280 | - } | |
281 | - immediately(); | |
282 | - } | |
283 | - | |
284 | - public void immediately(){ | |
285 | - taskHandler.removeCallbacks(sendTask); | |
286 | - taskHandler.post(sendTask); | |
287 | - } | |
288 | - | |
289 | - private void voteStatusChange(byte[] datas) { | |
290 | - responseChange(datas, 4, (byte) 0xF2); | |
291 | - saveVoteInfo(datas); | |
292 | - } | |
293 | - | |
294 | - private void baseStatusChange(byte[] datas) { | |
295 | - responseChange(datas, 4, (byte) 0xF1); | |
296 | - saveBaseInfo(datas); | |
297 | - } | |
298 | - | |
299 | - private void firmUpdateResponse(byte[] datas) { | |
300 | - | |
301 | - } | |
302 | - | |
303 | - private void voteResultSendResponse(byte[] datas) { | |
304 | - // 下层模块收到了,说明不了什么,所以不干什么 | |
305 | - } | |
306 | - | |
307 | - private void checkBaseStatusResponse(byte[] datas) { | |
308 | - switch (datas[5] & 0xFF) { | |
309 | - case 1://当前工作模式和版本 | |
310 | - case 2://当前工作模式和版本 | |
311 | - saveModelInfo(datas); | |
312 | - break; | |
313 | - case 3: | |
314 | - saveBaseInfo(datas); | |
315 | - break; | |
316 | - case 4: | |
317 | - saveVoteInfo(datas); | |
318 | - break; | |
319 | - case 5: | |
320 | - case 6: | |
321 | - saveKeypadInfo(datas); | |
322 | - break; | |
323 | - case 7: | |
324 | - saveOnLineInfo(datas); | |
325 | - break; | |
326 | - case 8: | |
327 | - case 9: | |
328 | - saveKeypadInfo(datas); | |
329 | - break; | |
330 | - } | |
331 | - } | |
332 | - | |
333 | - private void saveOnLineInfo(byte[] datas) { | |
334 | - OnLineInfo info = new OnLineInfo(); | |
335 | - info.setOnLine(datas[6] & 0xff); | |
336 | - info.setIdMode(datas[7] & 0xff); | |
337 | - info.setChan(datas[8] & 0xff); | |
338 | - info.setRssi(datas[9] & 0xff); | |
339 | - info.setTx(datas[10] & 0xff); | |
340 | - info.setRx(datas[11] & 0xff); | |
341 | - info.setBaseId(datas[12] & 0xff); | |
342 | - info.setKeyId(((datas[13] & 0xff) << 8) | (datas[14] & 0xff)); | |
343 | - byte[] sn = Arrays.copyOfRange(datas, 15, 21); | |
344 | - info.setKeySn(ByteUtils.getKeySn(sn)); | |
345 | - XpadApiServiceInfoProxyManager.getInstance().setOnLineInfo(info); | |
346 | - } | |
347 | - | |
348 | - private void saveKeypadInfo(byte[] datas) { | |
349 | - KeypadInfo info = new KeypadInfo(); | |
350 | - info.setOk(datas[6] & 0xff); | |
351 | - info.setChan(datas[7] & 0xff); | |
352 | - info.setKeyId(((datas[8] & 0xff) << 8) | (datas[9] & 0xff)); | |
353 | - byte[] sn = Arrays.copyOfRange(datas, 10, 16); | |
354 | - info.setKeySn(ByteUtils.getKeySn(sn)); | |
355 | - byte[] mc = Arrays.copyOfRange(datas, 16, 19); | |
356 | - info.setMatchCode(new String(mc)); | |
357 | - XpadApiServiceInfoProxyManager.getInstance().setKeypadInfo(info); | |
358 | - } | |
359 | - | |
360 | - private void saveVoteInfo(byte[] datas) { | |
361 | - BaseVoteInfo info = new BaseVoteInfo(); | |
362 | - info.setBaseId(datas[1] & 0xff); | |
363 | - info.setNowT(datas[2] & 0xff << 8 | datas[3] & 0xff); | |
364 | - info.setDataPos(datas[4] & 0xff); | |
365 | - info.setMode(datas[5] & 0xff); | |
366 | - info.setModes(datas); | |
367 | - XpadApiServiceInfoProxyManager.getInstance().setBaseVoteInfo(info); | |
368 | - } | |
369 | - | |
370 | - /** | |
371 | - * 保存基础信标信息 | |
372 | - * | |
373 | - * @param data | |
374 | - */ | |
375 | - private void saveBaseInfo(byte[] data) { | |
376 | - BaseInfo info = new BaseInfo(); | |
377 | - info.setBaseId(data[5] & 0xff);// baseID | |
378 | - info.setIdMode(data[6] & 0xff); | |
379 | - info.setConfId(((data[7] & 0xff) << 8) | (data[8] & 0xff)); | |
380 | - info.setBillId(data[9] & 0xff); | |
381 | - info.setAuthCode((data[10] & 0xff) << 8 | (data[11] & 0xff)); | |
382 | - info.setLogin(data[12] & 0xff); | |
383 | - info.setReport(data[13] & 0xff); | |
384 | - info.setOffTime(data[14] & 0xff); | |
385 | - info.setAttrib(data[15] & 0xff); | |
386 | - info.setPageNo((data[16] & 0xff) << 8 | (data[17] & 0xff)); | |
387 | - byte[] bname = Arrays.copyOfRange(data, 16, 16 + 12); | |
388 | - info.setBaseName(new String(bname)); | |
389 | - XpadApiServiceInfoProxyManager.getInstance().setBaseInfo(info); | |
390 | - } | |
391 | - | |
392 | - private void saveModelInfo(byte[] datas) { | |
393 | - ModelInfo info = new ModelInfo(); | |
394 | - info.setMode(datas[6] & 0xff); | |
395 | - info.sethModel(datas[7] & 0xff); | |
396 | - info.setsVer((datas[8] & 0xff) + "." + (datas[9] & 0xff) + "." + (datas[10] & 0xff)); | |
397 | - XpadApiServiceInfoProxyManager.getInstance().setModelInfo(info); | |
398 | - } | |
399 | - | |
400 | - | |
401 | - private void responseChange(byte[] data, int pos, byte res) { | |
402 | - byte[] retData = Arrays.copyOf(data, data.length); | |
403 | - retData[pos] = res; | |
404 | - sendData(data); | |
405 | - } | |
406 | - | |
407 | - private void roundCRC(byte[] data) { | |
408 | - int crcValue = Crc16.getUnsignedShort(Crc16.crc16(data, data.length - 4 - 2)); | |
409 | - data[data.length - 2] = (byte) (crcValue >> 8); | |
410 | - data[data.length - 1] = (byte) (crcValue); | |
411 | - } | |
412 | - | |
413 | - public void sendPacket(Packet packet) { | |
414 | - sendData(packet.getDatas()); | |
415 | - } | |
416 | - | |
417 | - public void sendData(byte[] datas) { | |
418 | - roundCRC(datas); | |
419 | - onDataReceiver.onDataSender(datas); | |
420 | - try { | |
421 | - SDKProcessWork.getInstance().execute(datas,datas.length); | |
422 | - } catch (Exception e) { | |
423 | - LogUtil.e(TAG, e); | |
424 | - } | |
425 | - } | |
426 | - | |
427 | - private void sleepTimes(long times) { | |
428 | - try { | |
429 | - Thread.sleep(times); | |
430 | - } catch (Exception e) { | |
431 | - e.printStackTrace(); | |
432 | - } | |
433 | - } | |
434 | - | |
435 | - BroadcastReceiver batteryLevelRcvr = new BroadcastReceiver() { | |
436 | - | |
437 | - public void onReceive(Context context, Intent intent) { | |
438 | - if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { | |
439 | - int rawlevel = intent.getIntExtra("level", -1); | |
440 | - int scale = intent.getIntExtra("scale", -1); | |
441 | - int status = intent.getIntExtra("status", -1); | |
442 | - int health = intent.getIntExtra("health", -1); | |
443 | - int voltage = intent.getIntExtra("voltage", 0); | |
444 | - int level = -1; // percentage, or -1 for unknown | |
445 | - if (rawlevel >= 0 && scale > 0) { | |
446 | - level = (rawlevel * 100) / scale; | |
447 | - } | |
448 | - | |
449 | - float val = (float) voltage / 1000; | |
450 | - batteryLevel = (int) (val / 0.04); | |
451 | - | |
452 | - } | |
453 | - } | |
454 | - }; | |
455 | - | |
456 | - public void getKeypadParam() { | |
457 | - byte[] mBuffer = new byte[0x1F + 4]; | |
458 | - Arrays.fill(mBuffer, (byte) 0x0); | |
459 | - mBuffer[0] = (byte) 0xF5; | |
460 | - mBuffer[1] = (byte) 0xAA; | |
461 | - mBuffer[2] = (byte) 0xAA; | |
462 | - mBuffer[3] = (byte) 0x1F; | |
463 | - | |
464 | - mBuffer[4] = 0x70; | |
465 | - mBuffer[5] = 0x05; | |
466 | - Packet packet = new Packet(); | |
467 | - packet.setDatas(mBuffer); | |
468 | - packet.setSendNo(Packet.GetKeypadParam); | |
469 | - sendInnerPacket(packet); | |
470 | - } | |
471 | - | |
472 | - public void getWorkMode() { | |
473 | - byte[] mBuffer = new byte[0x1F + 4]; | |
474 | - Arrays.fill(mBuffer, (byte) 0x0); | |
475 | - mBuffer[0] = (byte) 0xF5; | |
476 | - mBuffer[1] = (byte) 0xAA; | |
477 | - mBuffer[2] = (byte) 0xAA; | |
478 | - mBuffer[3] = (byte) 0x1F; | |
479 | - mBuffer[4] = 0x70; | |
480 | - mBuffer[5] = 0x01; | |
481 | - Packet packet = new Packet(); | |
482 | - packet.setDatas(mBuffer); | |
483 | - packet.setSendNo(Packet.GetWorkModeNum); | |
484 | - sendInnerPacket(packet); | |
485 | - } | |
486 | - | |
487 | - public void setWorkMode(int iMode) { | |
488 | - byte[] mBuffer = new byte[0x1F + 4]; | |
489 | - Arrays.fill(mBuffer, (byte) 0x0); | |
490 | - mBuffer[0] = (byte) 0xF5; | |
491 | - mBuffer[1] = (byte) 0xAA; | |
492 | - mBuffer[2] = (byte) 0xAA; | |
493 | - mBuffer[3] = (byte) 0x1F; | |
494 | - mBuffer[4] = 0x70; | |
495 | - mBuffer[5] = 0x02; | |
496 | - mBuffer[6] = (byte) iMode; | |
497 | - Packet packet = new Packet(); | |
498 | - packet.setDatas(mBuffer); | |
499 | - packet.setSendNo(Packet.SetWorkModeNum); | |
500 | - sendInnerPacket(packet); | |
501 | - } | |
502 | - | |
503 | - public void getBaseStatus() { | |
504 | - byte[] mBuffer = new byte[0x1F + 4]; | |
505 | - Arrays.fill(mBuffer, (byte) 0x0); | |
506 | - mBuffer[0] = (byte) 0xF5; | |
507 | - mBuffer[1] = (byte) 0xAA; | |
508 | - mBuffer[2] = (byte) 0xAA; | |
509 | - mBuffer[3] = (byte) 0x1F; | |
510 | - mBuffer[4] = 0x70; | |
511 | - mBuffer[5] = 0x03; | |
512 | - Packet packet = new Packet(); | |
513 | - packet.setDatas(mBuffer); | |
514 | - packet.setSendNo(Packet.BaseStatusNum); | |
515 | - sendInnerPacket(packet); | |
516 | - } | |
517 | - | |
518 | - public void getVoteStatus() { | |
519 | - byte[] mBuffer = new byte[0x1F + 4]; | |
520 | - Arrays.fill(mBuffer, (byte) 0x0); | |
521 | - mBuffer[0] = (byte) 0xF5; | |
522 | - mBuffer[1] = (byte) 0xAA; | |
523 | - mBuffer[2] = (byte) 0xAA; | |
524 | - mBuffer[3] = (byte) 0x1F; | |
525 | - mBuffer[4] = 0x70; | |
526 | - mBuffer[5] = 0x04; | |
527 | - Packet packet = new Packet(); | |
528 | - packet.setDatas(mBuffer); | |
529 | - packet.setSendNo(Packet.VoteStatusNum); | |
530 | - sendInnerPacket(packet); | |
531 | - } | |
532 | - | |
533 | - public void execKeypadMatch(int iMode, int channal) { | |
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 | - mBuffer[4] = 0x70; | |
541 | - mBuffer[5] = 0x08; | |
542 | - mBuffer[6] = (byte) iMode; | |
543 | - mBuffer[7] = (byte) channal; | |
544 | - Packet packet = new Packet(); | |
545 | - packet.setDatas(mBuffer); | |
546 | - packet.setSendNo(Packet.ExecKeypadMatchNum); | |
547 | - sendInnerPacket(packet); | |
548 | - } | |
549 | - | |
550 | - public void comCommunicationTest(int sendn, int okn) { | |
551 | - byte[] mBuffer = new byte[0x1F + 4]; | |
552 | - Arrays.fill(mBuffer, (byte) 0x0); | |
553 | - mBuffer[0] = (byte) 0xF5; | |
554 | - mBuffer[1] = (byte) 0xAA; | |
555 | - mBuffer[2] = (byte) 0xAA; | |
556 | - mBuffer[3] = (byte) 0x1F; | |
557 | - mBuffer[4] = 0x30; | |
558 | - mBuffer[5] = 0x0; | |
559 | - mBuffer[6] = 0x0; | |
560 | - mBuffer[7] = 7; | |
561 | - mBuffer[8] = (byte) sendn; | |
562 | - mBuffer[9] = (byte) okn; | |
563 | - mBuffer[10] = (byte) 0xAA; | |
564 | - | |
565 | - for (int i = 1; i < 17; i++) { | |
566 | - mBuffer[10 + i] = (byte) i; | |
567 | - } | |
568 | - | |
569 | - Packet packet = new Packet(); | |
570 | - packet.setDatas(mBuffer); | |
571 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
572 | - sendInnerPacket(packet); | |
573 | - } | |
574 | - | |
575 | - public void applyFileUpload(int length, String filename, byte anstype,byte index) { | |
576 | - byte[] mBuffer = new byte[0x1F + 4]; | |
577 | - Arrays.fill(mBuffer, (byte) 0x0); | |
578 | - mBuffer[0] = (byte) 0xF5; | |
579 | - mBuffer[1] = (byte) 0xAA; | |
580 | - mBuffer[2] = (byte) 0xAA; | |
581 | - mBuffer[3] = (byte) 0x1F; | |
582 | - mBuffer[4] = 0x73; | |
583 | - mBuffer[5] = (byte) 0XFF;// 流水号 | |
584 | - mBuffer[6] = (byte) 0X01;// 流水号 | |
585 | - mBuffer[7] = (byte) 15;// MSGTYPE | |
586 | - mBuffer[8] = (byte) anstype;// ANSTYPE 添加5 文件上传指令 | |
587 | - mBuffer[9] = index;// 高位 | |
588 | - Packet packet = new Packet(); | |
589 | - packet.setDatas(mBuffer); | |
590 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
591 | - sendInnerPacket(packet); | |
592 | - } | |
593 | - | |
594 | - public void packetReceptionConfirmed(byte[] keyid, byte packid, byte packH, byte packtype) { | |
595 | - byte[] mBuffer = new byte[0x1F + 4]; | |
596 | - Arrays.fill(mBuffer, (byte) 0x0); | |
597 | - mBuffer[0] = (byte) 0xF5; | |
598 | - mBuffer[1] = (byte) 0xAA; | |
599 | - mBuffer[2] = (byte) 0xAA; | |
600 | - mBuffer[3] = (byte) 0x1F; | |
601 | - | |
602 | - mBuffer[4] = (byte) 0xA0; | |
603 | - int keyId = XpadApiServiceInfoProxyManager.getInstance().getKeypadInfo().getKeyId(); | |
604 | - mBuffer[5] = (byte)((keyId >> 8) & 0xFF); | |
605 | - mBuffer[6] = (byte)((keyId) & 0xFF); | |
606 | - | |
607 | - mBuffer[7] = 3;//CMD 3 多包接收完毕应答 | |
608 | - mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
609 | - mBuffer[9] = packid;//数据包标识码 | |
610 | - Packet packet = new Packet(); | |
611 | - packet.setDatas(mBuffer); | |
612 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
613 | - sendInnerPacket(packet); | |
614 | - } | |
615 | - | |
616 | - public void uploadFileData(byte[] keyid, byte packid, byte packH, byte packL, byte[] datas, byte packtype) { | |
617 | - uploadFileData(keyid, packid, packH, packL, datas, 0, datas.length, packtype); | |
618 | - } | |
619 | - | |
620 | - /** | |
621 | - * @param keyid 键盘编号 | |
622 | - * @param packid 包id | |
623 | - * @param packH 数据段id | |
624 | - * @param packL 数据片id | |
625 | - * @param datas 数据 | |
626 | - * @param offset 偏移位置 | |
627 | - * @param length 长度 | |
628 | - * @Auther Elvis | |
629 | - * 上传数据包(多包应答) | |
630 | - */ | |
631 | - public void uploadFileData(byte[] keyid, byte packid, byte packH, byte packL, byte[] datas, int offset, int length, byte packtype) { | |
632 | - LogUtil.i(TAG, "onMutilPacketData packid=" + packid + ",packH=" + packH + ",packL=" + packL + ",offset=" + offset); | |
633 | - byte[] mBuffer = new byte[0x1F + 4]; | |
634 | - Arrays.fill(mBuffer, (byte) 0x0); | |
635 | - mBuffer[0] = (byte) 0xF5; | |
636 | - mBuffer[1] = (byte) 0xAA; | |
637 | - mBuffer[2] = (byte) 0xAA; | |
638 | - mBuffer[3] = (byte) 0x1F; | |
639 | - | |
640 | - mBuffer[4] = (byte) 0xA0; | |
641 | - int keyId = XpadApiServiceInfoProxyManager.getInstance().getKeypadInfo().getKeyId(); | |
642 | - mBuffer[5] = (byte)((keyId >> 8) & 0xFF); | |
643 | - mBuffer[6] = (byte)((keyId) & 0xFF); | |
644 | - | |
645 | - mBuffer[7] = 2;//CMD 1 回应多包数据 | |
646 | - mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
647 | - mBuffer[9] = packid;//数据包标识码 | |
648 | - mBuffer[10] = packH;//数据段编号 | |
649 | - mBuffer[11] = packL;//数据片编号 | |
650 | - for (int i = 0; i < length && i < 16 && i < datas.length - offset; i++) { | |
651 | - mBuffer[12 + i] = datas[offset + i]; | |
652 | - } | |
653 | - Packet packet = new Packet(); | |
654 | - packet.setDatas(mBuffer); | |
655 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
656 | - sendInnerPacket(packet); | |
657 | - } | |
658 | - | |
659 | - /** | |
660 | - * @param packid 包id | |
661 | - * 多包接收确认(多包接收应答) | |
662 | - */ | |
663 | - public void packetConfirmation(byte[] keyid, byte packid, byte packH, byte packL, byte[] names, byte packtype) { | |
664 | - LogUtil.i(TAG, "onMutilPacketRespone packid=" + packid + ",packH=" + packH + ",packL=" + packL + ",names=" + names); | |
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] = (byte) 0xA0; | |
673 | - int keyId = XpadApiServiceInfoProxyManager.getInstance().getKeypadInfo().getKeyId(); | |
674 | - mBuffer[5] = (byte)((keyId >> 8) & 0xFF); | |
675 | - mBuffer[6] = (byte)((keyId) & 0xFF); | |
676 | - mBuffer[5] = keyid[0]; | |
677 | - mBuffer[6] = keyid[1]; | |
678 | - | |
679 | - mBuffer[7] = 1;//CMD 1 | |
680 | - mBuffer[8] = packtype;//PACKTYPE 多包类型 | |
681 | - mBuffer[9] = packid;//数据包标识码 | |
682 | - mBuffer[10] = packH; | |
683 | - mBuffer[11] = packL; | |
684 | - if (names != null) { | |
685 | - for (int i = 0; i < 14 && i < names.length; i++) { | |
686 | - mBuffer[12 + i] = names[i]; | |
687 | - } | |
688 | - } | |
689 | - | |
690 | - Packet packet = new Packet(); | |
691 | - packet.setDatas(mBuffer); | |
692 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
693 | - sendInnerPacket(packet); | |
694 | - } | |
695 | - | |
696 | - private void keepFirmMode() { | |
697 | - byte[] mBuffer = new byte[0x1F + 4]; | |
698 | - Arrays.fill(mBuffer, (byte) 0x0); | |
699 | - mBuffer[0] = (byte) 0xF5; | |
700 | - mBuffer[1] = (byte) 0xAA; | |
701 | - mBuffer[2] = (byte) 0xAA; | |
702 | - mBuffer[3] = (byte) 10; | |
703 | - | |
704 | - mBuffer[4] = 0x78; | |
705 | - mBuffer[5] = 0x02; | |
706 | - | |
707 | - Packet packet = new Packet(); | |
708 | - packet.setDatas(mBuffer); | |
709 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
710 | - sendInnerPacket(packet); | |
711 | - } | |
712 | - | |
713 | - private void eraseFlash(int fileLen) { | |
714 | - byte[] mBuffer = new byte[0x1F + 4]; | |
715 | - Arrays.fill(mBuffer, (byte) 0x0); | |
716 | - mBuffer[0] = (byte) 0xF5; | |
717 | - mBuffer[1] = (byte) 0xAA; | |
718 | - mBuffer[2] = (byte) 0xAA; | |
719 | - mBuffer[3] = (byte) 10; | |
720 | - mBuffer[4] = 0x78; | |
721 | - mBuffer[5] = 0x03; | |
722 | - mBuffer[6] = 0; | |
723 | - mBuffer[7] = (byte) (fileLen / 1024); | |
724 | - | |
725 | - Packet packet = new Packet(); | |
726 | - packet.setDatas(mBuffer); | |
727 | - packet.setSendNo(Packet.CommunicationTestMatchNum); | |
728 | - sendInnerPacket(packet); | |
729 | - } | |
730 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/BaseInfo.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -public class BaseInfo { | |
4 | - private int baseId;//基站编号 | |
5 | - private int idMode;//基站识别模式,1编号、2序列号 | |
6 | - private int confId;//会议资料UID编号,1-65535,高位字节在前 | |
7 | - private int billId;//议题编号 | |
8 | - private int pageNo; //议案页码 | |
9 | - private int authCode;//授权号,2字节,高位在前,0-0xFFFF | |
10 | - private int login;//登录申请模式(后台签到模式),是否需要IC卡、登录码( | |
11 | - private int report;//表决器报告状态模式和指定语言 | |
12 | - private int offTime;//自动关机时间 | |
13 | - private int attrib;//表决器特性:背光模式+蜂鸣器模式等等 | |
14 | - private String baseName; //基站名称,最多12字节 | |
15 | - | |
16 | - public int getBaseId() { | |
17 | - return baseId; | |
18 | - } | |
19 | - | |
20 | - public void setBaseId(int baseId) { | |
21 | - this.baseId = baseId; | |
22 | - } | |
23 | - | |
24 | - public int getIdMode() { | |
25 | - return idMode; | |
26 | - } | |
27 | - | |
28 | - public void setIdMode(int idMode) { | |
29 | - this.idMode = idMode; | |
30 | - } | |
31 | - | |
32 | - public int getConfId() { | |
33 | - return confId; | |
34 | - } | |
35 | - | |
36 | - public void setConfId(int confId) { | |
37 | - this.confId = confId; | |
38 | - } | |
39 | - | |
40 | - public int getBillId() { | |
41 | - return billId; | |
42 | - } | |
43 | - | |
44 | - public void setBillId(int billId) { | |
45 | - this.billId = billId; | |
46 | - } | |
47 | - | |
48 | - public int getPageNo() { | |
49 | - return pageNo; | |
50 | - } | |
51 | - | |
52 | - public void setPageNo(int pageNo) { | |
53 | - this.pageNo = pageNo; | |
54 | - } | |
55 | - | |
56 | - public int getAuthCode() { | |
57 | - return authCode; | |
58 | - } | |
59 | - | |
60 | - public void setAuthCode(int authCode) { | |
61 | - this.authCode = authCode; | |
62 | - } | |
63 | - | |
64 | - public int getLogin() { | |
65 | - return login; | |
66 | - } | |
67 | - | |
68 | - public void setLogin(int login) { | |
69 | - this.login = login; | |
70 | - } | |
71 | - | |
72 | - public int getReport() { | |
73 | - return report; | |
74 | - } | |
75 | - | |
76 | - public void setReport(int report) { | |
77 | - this.report = report; | |
78 | - } | |
79 | - | |
80 | - public int getOffTime() { | |
81 | - return offTime; | |
82 | - } | |
83 | - | |
84 | - public void setOffTime(int offTime) { | |
85 | - this.offTime = offTime; | |
86 | - } | |
87 | - | |
88 | - public int getAttrib() { | |
89 | - return attrib; | |
90 | - } | |
91 | - | |
92 | - public void setAttrib(int attrib) { | |
93 | - this.attrib = attrib; | |
94 | - } | |
95 | - | |
96 | - public String getBaseName() { | |
97 | - return baseName; | |
98 | - } | |
99 | - | |
100 | - public void setBaseName(String baseName) { | |
101 | - this.baseName = baseName; | |
102 | - } | |
103 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/BaseVoteInfo.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.listener.IModesVoteInfo; | |
4 | - | |
5 | -/** | |
6 | - * 字节 标识符 描述 | |
7 | - 1 CMD 0x72 投票信标变化 | |
8 | - 2 BADDH 基站编号,保证有效数据从第3字节开始,和查询指令相同 | |
9 | - 3,4 NOWT 时标值,2字节,高位在前 | |
10 | - 从投票启动开始的时间,用于表决器同步计时,20ms为单位,最大约21分钟,最大0xFFFF不自动变为0 | |
11 | - 5 DATAPOS 表决序号(结果记录序号) | |
12 | - 1-0xFF,值发生变化的时候,代表是新的一轮表决开始 | |
13 | - | |
14 | - 6 MODE 投票模式 | |
15 | - Bit7=1表示继续表决,表决器重新提交数据,用于系统恢复,表决器可继续输入或使用原先结果;=0 正常表决 | |
16 | - 低7位是表决模式: | |
17 | - 1-9是政务应用 10-19商务应用和教育 20-29多项和批次 30-39二维表评测 40-50管理类 | |
18 | - | |
19 | - 7-25 MODES 投票参数,具体和MODE有关,不同模式下参数意义不同 | |
20 | - | |
21 | - */ | |
22 | -public class BaseVoteInfo { | |
23 | - | |
24 | - private int baseId;//[1]基站编号 | |
25 | - private int nowT;//[2,3] | |
26 | - private int dataPos;//[4] | |
27 | - private int mode;// [5] 表决模式 | |
28 | - | |
29 | - private IModesVoteInfo modes; | |
30 | - | |
31 | - public int getBaseId() { | |
32 | - return baseId; | |
33 | - } | |
34 | - | |
35 | - public void setBaseId(int baseId) { | |
36 | - this.baseId = baseId; | |
37 | - } | |
38 | - | |
39 | - public int getNowT() { | |
40 | - return nowT; | |
41 | - } | |
42 | - | |
43 | - public void setNowT(int nowT) { | |
44 | - this.nowT = nowT; | |
45 | - } | |
46 | - | |
47 | - public int getDataPos() { | |
48 | - return dataPos; | |
49 | - } | |
50 | - | |
51 | - public void setDataPos(int dataPos) { | |
52 | - this.dataPos = dataPos; | |
53 | - } | |
54 | - | |
55 | - public int getMode() { | |
56 | - return mode; | |
57 | - } | |
58 | - | |
59 | - public void setMode(int mode) { | |
60 | - this.mode = mode; | |
61 | - } | |
62 | - | |
63 | - public IModesVoteInfo getModes() { | |
64 | - return modes; | |
65 | - } | |
66 | - | |
67 | - public void setModes(byte[] datas) { | |
68 | - this.modes = modes; | |
69 | - } | |
70 | - | |
71 | - | |
72 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/BatchNumberVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -/** | |
8 | - * 批次评分值结果 | |
9 | - */ | |
10 | -public class BatchNumberVote extends Vote { | |
11 | - | |
12 | - public static final int AnsType_BatchNumber = 23; | |
13 | - | |
14 | - private int personId; | |
15 | - private int projectId; | |
16 | - private String strNum; | |
17 | - | |
18 | - public BatchNumberVote(int personId, int projectId, String strNum) { | |
19 | - super(AnsType_BatchNumber); | |
20 | - this.personId = personId; | |
21 | - this.projectId = projectId; | |
22 | - this.strNum = strNum; | |
23 | - } | |
24 | - | |
25 | - public BatchNumberVote() { | |
26 | - super(AnsType_BatchNumber); | |
27 | - } | |
28 | - | |
29 | - public void setPersonId(int personId) { | |
30 | - this.personId = personId; | |
31 | - } | |
32 | - | |
33 | - public void setProjectId(int projectId) { | |
34 | - this.projectId = projectId; | |
35 | - } | |
36 | - | |
37 | - public void setStrNum(String strNum) { | |
38 | - this.strNum = strNum; | |
39 | - } | |
40 | - | |
41 | - @Override | |
42 | - public byte[] toBytes() { | |
43 | - byte[] mBuffer = new byte[0x1F + 4]; | |
44 | - Arrays.fill(mBuffer, (byte) 0x0); | |
45 | - mBuffer[0] = (byte) 0xF5; | |
46 | - mBuffer[1] = (byte) 0xAA; | |
47 | - mBuffer[2] = (byte) 0xAA; | |
48 | - mBuffer[3] = (byte) 0x1F; | |
49 | - mBuffer[4] = 0x73; | |
50 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
51 | - mBuffer[6] = msgType; | |
52 | - mBuffer[7] = (byte) ansType; | |
53 | - mBuffer[8] = (byte)ok;// ALLOK | |
54 | - if (projectId != 0) { | |
55 | - mBuffer[9] = (byte) personId; | |
56 | - mBuffer[10] = (byte) projectId; | |
57 | - } else { | |
58 | - mBuffer[9] = (byte) (personId >> 8); | |
59 | - mBuffer[10] = (byte) (personId & 0xff); | |
60 | - } | |
61 | - byte[] val = util_encodeBCD(strNum.getBytes()); | |
62 | - System.arraycopy(val, 0, mBuffer, 11, 4); | |
63 | - return mBuffer; | |
64 | - } | |
65 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/BatchSingleVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class BatchSingleVote extends Vote{ | |
8 | - | |
9 | - public static final int AnsType_BatchSingle = 21 ; | |
10 | - | |
11 | - private int num; | |
12 | - private int val ; | |
13 | - | |
14 | - public BatchSingleVote(int num, int val) { | |
15 | - super(AnsType_BatchSingle); | |
16 | - this.num = num; | |
17 | - this.val = val; | |
18 | - } | |
19 | - | |
20 | - /** | |
21 | - * 不设计任何值,则为取消全部投票 | |
22 | - */ | |
23 | - public BatchSingleVote() { | |
24 | - super(AnsType_BatchSingle); | |
25 | - } | |
26 | - | |
27 | - public void setNum(int num) { | |
28 | - this.num = num; | |
29 | - } | |
30 | - | |
31 | - public void setVal(int val) { | |
32 | - this.val = val; | |
33 | - } | |
34 | - | |
35 | - @Override | |
36 | - public byte[] toBytes() { | |
37 | - byte[] mBuffer = new byte[0x1F + 4]; | |
38 | - Arrays.fill(mBuffer, (byte) 0x0); | |
39 | - mBuffer[0] = (byte) 0xF5; | |
40 | - mBuffer[1] = (byte) 0xAA; | |
41 | - mBuffer[2] = (byte) 0xAA; | |
42 | - mBuffer[3] = (byte) 0x1F; | |
43 | - mBuffer[4] = 0x73; | |
44 | - mBuffer[5] = (byte) SerialManager.getInstance().getSeq(); | |
45 | - mBuffer[6] = msgType; | |
46 | - mBuffer[7] = (byte) ansType; | |
47 | - mBuffer[8] = (byte)ok;// ALLOK | |
48 | - int pos = 9; | |
49 | - mBuffer[pos++] = (byte) (num >> 8); | |
50 | - mBuffer[pos++] = (byte) (num & 0xff); | |
51 | - mBuffer[pos++] = (byte) val; | |
52 | - return mBuffer; | |
53 | - } | |
54 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/HeartBeat.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import java.util.Arrays; | |
4 | - | |
5 | -public class HeartBeat { | |
6 | - | |
7 | - private byte volt; | |
8 | - private byte keyinStatus; | |
9 | - | |
10 | - public HeartBeat(byte volt, byte keyinStatus) { | |
11 | - this.volt = volt; | |
12 | - this.keyinStatus = keyinStatus; | |
13 | - } | |
14 | - | |
15 | - public HeartBeat() { | |
16 | - } | |
17 | - | |
18 | - public void setKeyinStatus(byte keyinStatus) { | |
19 | - this.keyinStatus = keyinStatus; | |
20 | - } | |
21 | - | |
22 | - public void setVolt(byte volt) { | |
23 | - this.volt = volt; | |
24 | - } | |
25 | - | |
26 | - public byte[] toBytes(){ | |
27 | - byte[] mBuffer = new byte[0x1F + 4]; | |
28 | - Arrays.fill(mBuffer, (byte) 0x0); | |
29 | - mBuffer[0] = (byte) 0xF5; | |
30 | - mBuffer[1] = (byte) 0xAA; | |
31 | - mBuffer[2] = (byte) 0xAA; | |
32 | - mBuffer[3] = (byte) 0x1F; | |
33 | - mBuffer[4] = 0x70; | |
34 | - mBuffer[5] = 0x07; | |
35 | - mBuffer[6] = (byte) volt; | |
36 | - mBuffer[7] = (byte) keyinStatus; | |
37 | - return mBuffer; | |
38 | - } | |
39 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/KeypadInfo.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -public class KeypadInfo { | |
4 | - | |
5 | - private int cmd1;//8:match 9:config | |
6 | - private int ok; | |
7 | - private int chan; | |
8 | - private int keyId;//键盘编号,高位在前 | |
9 | - private String keySn;//6字节键盘序列号 | |
10 | - private String matchCode;//4字节配对码 | |
11 | - | |
12 | - public int getCmd1() { | |
13 | - return cmd1; | |
14 | - } | |
15 | - | |
16 | - public void setCmd1(int cmd1) { | |
17 | - this.cmd1 = cmd1; | |
18 | - } | |
19 | - | |
20 | - public int getOk() { | |
21 | - return ok; | |
22 | - } | |
23 | - | |
24 | - public void setOk(int ok) { | |
25 | - this.ok = ok; | |
26 | - } | |
27 | - | |
28 | - public int getChan() { | |
29 | - return chan; | |
30 | - } | |
31 | - | |
32 | - public void setChan(int chan) { | |
33 | - this.chan = chan; | |
34 | - } | |
35 | - | |
36 | - public int getKeyId() { | |
37 | - return keyId; | |
38 | - } | |
39 | - | |
40 | - public void setKeyId(int keyId) { | |
41 | - this.keyId = keyId; | |
42 | - } | |
43 | - | |
44 | - public String getKeySn() { | |
45 | - return keySn; | |
46 | - } | |
47 | - | |
48 | - public void setKeySn(String keySn) { | |
49 | - this.keySn = keySn; | |
50 | - } | |
51 | - | |
52 | - public String getMatchCode() { | |
53 | - return matchCode; | |
54 | - } | |
55 | - | |
56 | - public void setMatchCode(String matchCode) { | |
57 | - this.matchCode = matchCode; | |
58 | - } | |
59 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/LoginInVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class LoginInVote extends Vote{ | |
8 | - | |
9 | - public static final int AnsType_LoginIn = 16 ; | |
10 | - | |
11 | - private String info ; | |
12 | - | |
13 | - public LoginInVote(String info) { | |
14 | - super(AnsType_LoginIn); | |
15 | - this.info = info; | |
16 | - } | |
17 | - | |
18 | - public void setInfo(String info) { | |
19 | - this.info = info; | |
20 | - } | |
21 | - | |
22 | - public byte[] toBytes(){ | |
23 | - byte[] mBuffer = new byte[0x1F + 4]; | |
24 | - Arrays.fill(mBuffer, (byte) 0x0); | |
25 | - mBuffer[0] = (byte) 0xF5; | |
26 | - mBuffer[1] = (byte) 0xAA; | |
27 | - mBuffer[2] = (byte) 0xAA; | |
28 | - mBuffer[3] = (byte) 0x1F; | |
29 | - | |
30 | - mBuffer[4] = 0x73; | |
31 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
32 | - | |
33 | - mBuffer[6] = (byte)msgType; | |
34 | - mBuffer[7] = (byte) ansType; | |
35 | - mBuffer[8] = 3;//3 签到信息按BCD码格式 | |
36 | - byte[] val = util_encodeBCD(info.getBytes()); | |
37 | - System.arraycopy(val, 0, mBuffer, 9, 9); | |
38 | - return mBuffer; | |
39 | - } | |
40 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/ModelInfo.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -public class ModelInfo { | |
4 | - private int mode;//模块当前主从模式 1 基站模式(主) 2 键盘模式(从) | |
5 | - private int hModel;//硬件型号,数字 | |
6 | - private String sVer;//固件版本,3位数字,例如 0.1.0 | |
7 | - | |
8 | - public int getMode() { | |
9 | - return mode; | |
10 | - } | |
11 | - | |
12 | - public void setMode(int mode) { | |
13 | - this.mode = mode; | |
14 | - } | |
15 | - | |
16 | - public int gethModel() { | |
17 | - return hModel; | |
18 | - } | |
19 | - | |
20 | - public void sethModel(int hModel) { | |
21 | - this.hModel = hModel; | |
22 | - } | |
23 | - | |
24 | - public String getsVer() { | |
25 | - return sVer; | |
26 | - } | |
27 | - | |
28 | - public void setsVer(String sVer) { | |
29 | - this.sVer = sVer; | |
30 | - } | |
31 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/NumberVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class NumberVote extends Vote{ | |
8 | - | |
9 | - public static final int AnsType_Number = 3; | |
10 | - private String info; | |
11 | - | |
12 | - public void setInfo(String info) { | |
13 | - this.info = info; | |
14 | - } | |
15 | - | |
16 | - public NumberVote(String info) { | |
17 | - super(AnsType_Number); | |
18 | - this.info = info; | |
19 | - } | |
20 | - | |
21 | - public NumberVote() { | |
22 | - super(AnsType_Number); | |
23 | - } | |
24 | - | |
25 | - public byte[] toBytes(){ | |
26 | - byte[] mBuffer = new byte[0x1F + 4]; | |
27 | - Arrays.fill(mBuffer, (byte) 0x0); | |
28 | - mBuffer[0] = (byte) 0xF5; | |
29 | - mBuffer[1] = (byte) 0xAA; | |
30 | - mBuffer[2] = (byte) 0xAA; | |
31 | - mBuffer[3] = (byte) 0x1F; | |
32 | - mBuffer[4] = 0x73; | |
33 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
34 | - mBuffer[6] = (byte)msgType; | |
35 | - mBuffer[7] = (byte) ansType; | |
36 | - byte[] val = util_encodeBCD(info.getBytes()); | |
37 | - System.arraycopy(val, 0, mBuffer, 8, 8); | |
38 | - | |
39 | - return mBuffer; | |
40 | - } | |
41 | - | |
42 | - | |
43 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/OnLineInfo.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -public class OnLineInfo { | |
4 | - private int onLine; //键盘是否在线 1 在线 2 离线 | |
5 | - private int idMode;//基站的识别模式 | |
6 | - private int chan; //当前频点号 | |
7 | - private int rssi; //接收到基站的信号强度RSSI值,负数,越小表示信号越大 | |
8 | - private int tx; //1表示刚才1秒内有提交数据过 0 表示没有 | |
9 | - private int rx; //1 表示刚才1秒内收到过基站的投票指令(特指投票中) 0 表示没有 | |
10 | - private int baseId; | |
11 | - private int keyId; | |
12 | - private String keySn; | |
13 | - private int comError=0; | |
14 | - | |
15 | - public int getOnLine() { | |
16 | - return onLine; | |
17 | - } | |
18 | - | |
19 | - public void setOnLine(int onLine) { | |
20 | - this.onLine = onLine; | |
21 | - } | |
22 | - | |
23 | - public int getIdMode() { | |
24 | - return idMode; | |
25 | - } | |
26 | - | |
27 | - public void setIdMode(int idMode) { | |
28 | - this.idMode = idMode; | |
29 | - } | |
30 | - | |
31 | - public int getChan() { | |
32 | - return chan; | |
33 | - } | |
34 | - | |
35 | - public void setChan(int chan) { | |
36 | - this.chan = chan; | |
37 | - } | |
38 | - | |
39 | - public int getRssi() { | |
40 | - return rssi; | |
41 | - } | |
42 | - | |
43 | - public void setRssi(int rssi) { | |
44 | - this.rssi = rssi; | |
45 | - } | |
46 | - | |
47 | - public int getTx() { | |
48 | - return tx; | |
49 | - } | |
50 | - | |
51 | - public void setTx(int tx) { | |
52 | - this.tx = tx; | |
53 | - } | |
54 | - | |
55 | - public int getRx() { | |
56 | - return rx; | |
57 | - } | |
58 | - | |
59 | - public void setRx(int rx) { | |
60 | - this.rx = rx; | |
61 | - } | |
62 | - | |
63 | - public int getBaseId() { | |
64 | - return baseId; | |
65 | - } | |
66 | - | |
67 | - public void setBaseId(int baseId) { | |
68 | - this.baseId = baseId; | |
69 | - } | |
70 | - | |
71 | - public int getKeyId() { | |
72 | - return keyId; | |
73 | - } | |
74 | - | |
75 | - public void setKeyId(int keyId) { | |
76 | - this.keyId = keyId; | |
77 | - } | |
78 | - | |
79 | - public String getKeySn() { | |
80 | - return keySn; | |
81 | - } | |
82 | - | |
83 | - public void setKeySn(String keySn) { | |
84 | - this.keySn = keySn; | |
85 | - } | |
86 | - | |
87 | - public int getComError() { | |
88 | - return comError; | |
89 | - } | |
90 | - | |
91 | - public void setComError(int comError) { | |
92 | - this.comError = comError; | |
93 | - } | |
94 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/Packet.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.listener.OnSendPacket; | |
4 | - | |
5 | -public class Packet { | |
6 | - | |
7 | - public static final int OVER_TIME_COUNTS = 6; | |
8 | - | |
9 | - public static final int BaseStatusNum = 1 ; | |
10 | - public static final int VoteStatusNum = 2 ; | |
11 | - public static final int ExecKeypadMatchNum = 6 ; | |
12 | - public static final int GetWorkModeNum = 11 ; | |
13 | - public static final int SetWorkModeNum = 12 ; | |
14 | - public static final int GetKeypadParam = 13 ; | |
15 | - | |
16 | - public static final int CommunicationTestMatchNum = 30 ; | |
17 | - | |
18 | - private int sendNo ; | |
19 | - private byte[] datas; | |
20 | - private int sendCount = 0 ; | |
21 | - private boolean isSync = false; | |
22 | - | |
23 | - private OnSendPacket onSendPacket; | |
24 | - | |
25 | - public int getSendNo() { | |
26 | - return sendNo; | |
27 | - } | |
28 | - | |
29 | - public void setSendNo(int sendNo) { | |
30 | - this.sendNo = sendNo; | |
31 | - } | |
32 | - | |
33 | - public byte[] getDatas() { | |
34 | - return datas; | |
35 | - } | |
36 | - | |
37 | - public void setDatas(byte[] datas) { | |
38 | - this.datas = datas; | |
39 | - } | |
40 | - | |
41 | - public OnSendPacket getOnSendPacket() { | |
42 | - return onSendPacket; | |
43 | - } | |
44 | - | |
45 | - public void setOnSendPacket(OnSendPacket onSendPacket) { | |
46 | - this.onSendPacket = onSendPacket; | |
47 | - } | |
48 | - | |
49 | - public void addSendCount(){ | |
50 | - sendCount ++ ; | |
51 | - } | |
52 | - | |
53 | - public boolean needSend(){ | |
54 | - if(sendCount < OVER_TIME_COUNTS){ | |
55 | - return true; | |
56 | - } | |
57 | - return false; | |
58 | - } | |
59 | - | |
60 | - public boolean isSync() { | |
61 | - return isSync; | |
62 | - } | |
63 | - | |
64 | - public void setSync(boolean sync) { | |
65 | - isSync = sync; | |
66 | - } | |
67 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/SelectOtherVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | -import com.sunvote.xpadapi.service.logic.XpadApiServiceInfoProxyManager; | |
5 | -import com.sunvote.xpadapi.util.LogUtil; | |
6 | - | |
7 | -import java.util.Arrays; | |
8 | - | |
9 | -public class SelectOtherVote extends Vote { | |
10 | - | |
11 | - public static final int AnsType_SelectOther = 26; | |
12 | - | |
13 | - private int num; | |
14 | - private String info; | |
15 | - | |
16 | - public SelectOtherVote(int num, String info) { | |
17 | - super(AnsType_SelectOther); | |
18 | - this.num = num; | |
19 | - this.info = info; | |
20 | - } | |
21 | - | |
22 | - public SelectOtherVote() { | |
23 | - super(AnsType_SelectOther); | |
24 | - } | |
25 | - | |
26 | - public void setNum(int num) { | |
27 | - this.num = num; | |
28 | - } | |
29 | - | |
30 | - public void setInfo(String info) { | |
31 | - this.info = info; | |
32 | - } | |
33 | - | |
34 | - @Override | |
35 | - public byte[] toBytes() { | |
36 | - byte[] mBuffer = new byte[0x1F + 4]; | |
37 | - Arrays.fill(mBuffer, (byte) 0x0); | |
38 | - mBuffer[0] = (byte) 0xF5; | |
39 | - mBuffer[1] = (byte) 0xAA; | |
40 | - mBuffer[2] = (byte) 0xAA; | |
41 | - mBuffer[3] = (byte) 0x1F; | |
42 | - mBuffer[4] = 0x73; | |
43 | - mBuffer[5] = SerialManager.getInstance().getSeq();// 流水号 | |
44 | - mBuffer[6] = (byte)msgType; | |
45 | - mBuffer[7] = (byte) ansType; | |
46 | - mBuffer[8] = (byte) ok;// ALLOK | |
47 | - int pos = 9; | |
48 | - mBuffer[pos++] = (byte) (num >> 8); | |
49 | - mBuffer[pos++] = (byte) num; | |
50 | - mBuffer[pos++] = 0;// slot | |
51 | - try { | |
52 | - byte[] name = info.getBytes(XpadApiServiceInfoProxyManager.getInstance().getCharset()); | |
53 | - System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
54 | - } catch (Exception e) { | |
55 | - LogUtil.e(XpadApiServiceInfoProxyManager.TAG, "SelectOtherVote", e); | |
56 | - } | |
57 | - return mBuffer; | |
58 | - } | |
59 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/SelectVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class SelectVote extends Vote{ | |
8 | - | |
9 | - public final static int SELECT_VOTE_TYPE = 2; | |
10 | - | |
11 | - private int content; | |
12 | - private int time; | |
13 | - | |
14 | - public SelectVote(int content, int time) { | |
15 | - super(SELECT_VOTE_TYPE); | |
16 | - this.content = content; | |
17 | - this.time = time; | |
18 | - } | |
19 | - | |
20 | - public SelectVote() { | |
21 | - super(SELECT_VOTE_TYPE); | |
22 | - } | |
23 | - public void setContent(int content) { | |
24 | - this.content = content; | |
25 | - } | |
26 | - | |
27 | - public void setTime(int time) { | |
28 | - this.time = time; | |
29 | - } | |
30 | - | |
31 | - public byte[] toBytes(){ | |
32 | - byte[] mBuffer = new byte[0x1F + 4]; | |
33 | - Arrays.fill(mBuffer, (byte) 0x0); | |
34 | - mBuffer[0] = (byte) 0xF5; | |
35 | - mBuffer[1] = (byte) 0xAA; | |
36 | - mBuffer[2] = (byte) 0xAA; | |
37 | - mBuffer[3] = (byte) 0x1F; | |
38 | - mBuffer[4] = 0x73; | |
39 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
40 | - mBuffer[6] = msgType; | |
41 | - mBuffer[7] = (byte) ansType; | |
42 | - mBuffer[8] = (byte) ((time >> 8) & 0xff);// 原来的计算居然是这样 没懂 | |
43 | - mBuffer[9] = (byte) (time & 0xff); | |
44 | - mBuffer[10] = (byte) ((time >> 8) & 0xff); | |
45 | - mBuffer[11] = (byte) (time & 0xff); | |
46 | - return mBuffer; | |
47 | - } | |
48 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/ServiceTypeVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -/** | |
8 | - * 服务申请 | |
9 | - */ | |
10 | -public class ServiceTypeVote extends Vote { | |
11 | - | |
12 | - public static final int AnsType_Service = 33; | |
13 | - | |
14 | - private int serviceType = 0; | |
15 | - | |
16 | - public ServiceTypeVote(int serviceType) { | |
17 | - super(AnsType_Service); | |
18 | - this.serviceType = serviceType; | |
19 | - } | |
20 | - | |
21 | - public ServiceTypeVote() { | |
22 | - super(AnsType_Service); | |
23 | - } | |
24 | - | |
25 | - public void setServiceType(int serviceType) { | |
26 | - this.serviceType = serviceType; | |
27 | - } | |
28 | - | |
29 | - @Override | |
30 | - public byte[] toBytes() { | |
31 | - byte[] mBuffer = new byte[0x1F + 4]; | |
32 | - Arrays.fill(mBuffer, (byte) 0x0); | |
33 | - mBuffer[0] = (byte) 0xF5; | |
34 | - mBuffer[1] = (byte) 0xAA; | |
35 | - mBuffer[2] = (byte) 0xAA; | |
36 | - mBuffer[3] = (byte) 0x1F; | |
37 | - mBuffer[4] = 0x73; | |
38 | - mBuffer[5] = SerialManager.getInstance().getSeq();// 流水号 | |
39 | - mBuffer[6] = msgType; | |
40 | - mBuffer[7] = (byte) ansType; | |
41 | - mBuffer[8] = 4; | |
42 | - mBuffer[9] = (byte) serviceType; | |
43 | - mBuffer[10] = mBuffer[5]; | |
44 | - return mBuffer; | |
45 | - } | |
46 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/SingleVote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class SingleVote extends Vote { | |
8 | - | |
9 | - private int info; | |
10 | - | |
11 | - public SingleVote(int info) { | |
12 | - super(1); | |
13 | - this.info = info; | |
14 | - } | |
15 | - | |
16 | - public SingleVote() { | |
17 | - super(1); | |
18 | - } | |
19 | - | |
20 | - public void setInfo(int info) { | |
21 | - this.info = info; | |
22 | - } | |
23 | - | |
24 | - public byte[] toBytes() { | |
25 | - byte[] mBuffer = new byte[0x1F + 4]; | |
26 | - Arrays.fill(mBuffer, (byte) 0x0); | |
27 | - mBuffer[0] = (byte) 0xF5; | |
28 | - mBuffer[1] = (byte) 0xAA; | |
29 | - mBuffer[2] = (byte) 0xAA; | |
30 | - mBuffer[3] = (byte) 0x1F; | |
31 | - mBuffer[4] = 0x73; | |
32 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
33 | - mBuffer[6] = msgType; | |
34 | - mBuffer[7] = (byte) ansType; | |
35 | - mBuffer[8] = (byte) info; | |
36 | - return mBuffer; | |
37 | - } | |
38 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/Vote.java deleted
1 | -package com.sunvote.xpadapi.service.bean; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.logic.SerialManager; | |
4 | - | |
5 | -import java.util.Arrays; | |
6 | - | |
7 | -public class Vote { | |
8 | - | |
9 | - protected int ansType = 16; | |
10 | - protected static byte msgType = 1;// MSGTYPE 1:ID mode, 2:SN | |
11 | - private String info; | |
12 | - protected int ok; | |
13 | - | |
14 | - public Vote(int ansType) { | |
15 | - this.ansType = ansType; | |
16 | - } | |
17 | - | |
18 | - public static void setMsgTypeIdModel() { | |
19 | - msgType = 1; | |
20 | - } | |
21 | - | |
22 | - public static void setMsgTypeSnModel() { | |
23 | - msgType = 2; | |
24 | - } | |
25 | - | |
26 | - public void setInfo(String info) { | |
27 | - this.info = info; | |
28 | - } | |
29 | - | |
30 | - public void setOk(int ok) { | |
31 | - this.ok = ok; | |
32 | - } | |
33 | - | |
34 | - /** | |
35 | - * 把字符串形式转换为字节形式 | |
36 | - */ | |
37 | - protected byte[] util_encodeBCD(byte[] cs) { | |
38 | - byte[] rs = new byte[17]; | |
39 | - Arrays.fill(rs, (byte) 0xff);// | |
40 | - | |
41 | - int len = cs.length < 16 ? cs.length : 16; | |
42 | - int io = 0; | |
43 | - | |
44 | - for (int i = 0; i < len; i += 2) { | |
45 | - int n = encodeBCD(cs[i]); | |
46 | - n <<= 4; | |
47 | - if (i + 1 == cs.length) { | |
48 | - rs[io++] = (byte) (n | 0xf); | |
49 | - break; | |
50 | - } | |
51 | - | |
52 | - n |= encodeBCD(cs[i + 1]); | |
53 | - if (n < 0) { | |
54 | - break; | |
55 | - } | |
56 | - rs[io++] = (byte) n; | |
57 | - } | |
58 | - rs[++io] = 0; | |
59 | - return rs; | |
60 | - } | |
61 | - | |
62 | - protected int encodeBCD(byte c) { | |
63 | - if (c >= 'a' && c <= 'f') { | |
64 | - return 10 + (c - 'a'); | |
65 | - } else if (c >= '0' && c <= '9') { | |
66 | - return c - '0'; | |
67 | - } else if (c >= 'A' && c <= 'F') { | |
68 | - return 10 + (c - 'A'); | |
69 | - } else if (c == '.') { | |
70 | - return 0xE; | |
71 | - } | |
72 | - return -1; | |
73 | - } | |
74 | - | |
75 | - public byte[] toBytes() { | |
76 | - byte[] mBuffer = new byte[0x1F + 4]; | |
77 | - Arrays.fill(mBuffer, (byte) 0x0); | |
78 | - mBuffer[0] = (byte) 0xF5; | |
79 | - mBuffer[1] = (byte) 0xAA; | |
80 | - mBuffer[2] = (byte) 0xAA; | |
81 | - mBuffer[3] = (byte) 0x1F; | |
82 | - mBuffer[4] = 0x73; | |
83 | - mBuffer[5] = SerialManager.getInstance().getSeq(); | |
84 | - mBuffer[6] = msgType; | |
85 | - mBuffer[7] = (byte) ansType; | |
86 | - mBuffer[8] = (byte)ok; | |
87 | - int pos = 9; | |
88 | - if(info != null) { | |
89 | - String[] item = info.split(":"); | |
90 | - if (item.length > 1) { | |
91 | - int num = Integer.parseInt(item[0]); | |
92 | - String val = item[1]; | |
93 | - mBuffer[pos++] = (byte) (num >> 8); | |
94 | - mBuffer[pos++] = (byte) num; | |
95 | - mBuffer[pos++] = 0;// slot | |
96 | - try { | |
97 | - byte[] name = val.getBytes("GB2312"); | |
98 | - System.arraycopy(name, 0, mBuffer, pos, name.length > 16 ? 16 : name.length); | |
99 | - } catch (Exception e) { | |
100 | - } | |
101 | - } | |
102 | - } | |
103 | - return mBuffer; | |
104 | - } | |
105 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/AbsDownloadProcess.java deleted
1 | -package com.sunvote.xpadapi.service.listener; | |
2 | - | |
3 | -import java.io.File; | |
4 | -import java.io.IOException; | |
5 | - | |
6 | -/** | |
7 | - * Created by Elvis on 2018/3/20 11:18 | |
8 | - * Email:Eluis@psunsky.com | |
9 | - * 版权所有:长沙中天电子设计开发有限公司 | |
10 | - * Description: 人大通用版XPadAppRendaMac | |
11 | - */ | |
12 | - | |
13 | -public abstract class AbsDownloadProcess { | |
14 | - | |
15 | - private static String foldPath = "/sdcard/Sunvote/download/"; | |
16 | - | |
17 | - protected static String fileName = "default.obj"; | |
18 | - | |
19 | - private long length ; | |
20 | - private long curComplete = 0 ; | |
21 | - | |
22 | - private static File file ; | |
23 | - | |
24 | - public File getFile() { | |
25 | - if(file == null){ | |
26 | - curComplete = 0 ; | |
27 | - File folder = new File(foldPath); | |
28 | - if(!folder.exists()){ | |
29 | - folder.mkdirs(); | |
30 | - } | |
31 | - if(fileName == null || "".equals(fileName.trim())){ | |
32 | - fileName = "default.obj" ; | |
33 | - } | |
34 | - file = new File(foldPath , fileName); | |
35 | - file.deleteOnExit(); | |
36 | - if(!file.exists()){ | |
37 | - try { | |
38 | - file.createNewFile(); | |
39 | - } catch (IOException e) { | |
40 | - onDownloadError(e); | |
41 | - } | |
42 | - } | |
43 | - } | |
44 | - return file; | |
45 | - } | |
46 | - | |
47 | - protected long getLength() { | |
48 | - return length; | |
49 | - } | |
50 | - | |
51 | - public String getFoldPath() { | |
52 | - return foldPath; | |
53 | - } | |
54 | - | |
55 | - protected void setLength(long length) { | |
56 | - this.length = length; | |
57 | - curComplete = 0 ; | |
58 | - } | |
59 | - | |
60 | - public void setFileName(String fileName) { | |
61 | - if(!(fileName == null || "".equals(fileName.trim()))) { | |
62 | - this.fileName = fileName; | |
63 | - file = null; | |
64 | - } | |
65 | - } | |
66 | - | |
67 | - protected String getFileName() { | |
68 | - return fileName; | |
69 | - } | |
70 | - | |
71 | - public void setFoldPath(String foldPath) { | |
72 | - this.foldPath = foldPath; | |
73 | - } | |
74 | - | |
75 | - protected void onStartDownload(){ | |
76 | - onStartDownload(getFile(),getLength()); | |
77 | - } | |
78 | - | |
79 | - public abstract void onStartDownload(File file,long length); | |
80 | - | |
81 | - protected void onDownloadAddProcess(int curPack) { | |
82 | - curComplete += curPack; | |
83 | - double result = 0; | |
84 | - if(curComplete <= length){ | |
85 | - result = (double)curComplete / length ; | |
86 | - }else{ | |
87 | - result = 1; | |
88 | - } | |
89 | - | |
90 | - try{ | |
91 | - onDownloadProcess(result); | |
92 | - }catch (Exception ex){ | |
93 | - ex.printStackTrace(); | |
94 | - } | |
95 | - try{ | |
96 | - int ri = (int)(result * 100); | |
97 | - onDownloadProcess(ri + "%"); | |
98 | - }catch (Exception ex){ | |
99 | - ex.printStackTrace(); | |
100 | - } | |
101 | - } | |
102 | - | |
103 | - public abstract void onDownloadProcess(double process); | |
104 | - | |
105 | - public abstract void onDownloadProcess(String process); | |
106 | - | |
107 | - protected void onStopDownload(){ | |
108 | - onStopDownload(getFile()); | |
109 | - } | |
110 | - | |
111 | - public abstract void onStopDownload(File file); | |
112 | - | |
113 | - public abstract void onDownloadError(Exception e); | |
114 | - | |
115 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/BaseInfoChanageListener.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/BaseVoteInfoChanageListener.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/IModesVoteInfo.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/IUploadListener.java deleted
1 | -package com.sunvote.xpadapi.service.listener; | |
2 | - | |
3 | -/** | |
4 | - * Created by Elvis on 2018/3/22 13:43 | |
5 | - * Email:Eluis@psunsky.com | |
6 | - * 版权所有:长沙中天电子设计开发有限公司 | |
7 | - * Description: 人大通用版XPadAppRendaMac | |
8 | - */ | |
9 | -public interface IUploadListener { | |
10 | - | |
11 | - public void onUploadStart(); | |
12 | - | |
13 | - public void onUploadProcess(double process); | |
14 | - | |
15 | - public void onUploadStop(); | |
16 | - | |
17 | - public void onFail(); | |
18 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/KeyPadinfoChanageListener.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/ModelInfoChanageListener.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnDataReceiver.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnSendPacket.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnSender.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnlineInfoChanageListener.java deleted
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/RFFileDownloadModule.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -import android.os.Handler; | |
4 | -import android.os.Looper; | |
5 | - | |
6 | -import com.sunvote.util.LogUtil; | |
7 | -import com.sunvote.xpadapi.service.listener.AbsDownloadProcess; | |
8 | - | |
9 | -import java.io.File; | |
10 | - | |
11 | -/** | |
12 | - * Created by Elvis on 2018/3/20 11:16 | |
13 | - * Email:Eluis@psunsky.com | |
14 | - * 版权所有:长沙中天电子设计开发有限公司 | |
15 | - * Description: 文件下载模块 | |
16 | - */ | |
17 | -public class RFFileDownloadModule { | |
18 | - | |
19 | - private RFFileDownloadModule(){ | |
20 | - handler = new Handler(Looper.getMainLooper()); | |
21 | - } | |
22 | - private Handler handler ; | |
23 | - private long overtime = 15 * 1000 ; | |
24 | - private static RFFileDownloadModule instance = new RFFileDownloadModule(); | |
25 | - | |
26 | - public static RFFileDownloadModule getInstance() { | |
27 | - return instance; | |
28 | - } | |
29 | - | |
30 | - private AbsDownloadProcess downloadProcess; | |
31 | - private AbsDownloadProcess tdownloadProcess = new AbsDownloadProcess() { | |
32 | - | |
33 | - private boolean start = false; | |
34 | - private double process = 0 ; | |
35 | - private Runnable runnable = new Runnable() { | |
36 | - @Override | |
37 | - public void run() { | |
38 | - onDownloadError(new Exception("overtime")); | |
39 | - } | |
40 | - }; | |
41 | - | |
42 | - @Override | |
43 | - public void onStartDownload(File file, long length) { | |
44 | - start = true; | |
45 | - process = 0; | |
46 | - LogUtil.i("onStartDownload", file.getName() + "," + length); | |
47 | - if(downloadProcess != null){ | |
48 | - downloadProcess.onStartDownload(file,length); | |
49 | - } | |
50 | - handler.removeCallbacks(runnable); | |
51 | - handler.postDelayed(runnable,overtime); | |
52 | - } | |
53 | - | |
54 | - @Override | |
55 | - public void onDownloadProcess(double process) { | |
56 | - this.process = process; | |
57 | - LogUtil.i("onDownloadProcess", "process," + process); | |
58 | - if(downloadProcess != null && start){ | |
59 | - downloadProcess.onDownloadProcess(process); | |
60 | - } | |
61 | - handler.removeCallbacks(runnable); | |
62 | - handler.postDelayed(runnable,overtime); | |
63 | - } | |
64 | - | |
65 | - @Override | |
66 | - public void onDownloadProcess(String process) { | |
67 | - LogUtil.i("onDownloadProcess", "process," + process); | |
68 | - if(downloadProcess != null && start){ | |
69 | - downloadProcess.onDownloadProcess(process); | |
70 | - } | |
71 | - handler.removeCallbacks(runnable); | |
72 | - handler.postDelayed(runnable,overtime); | |
73 | - } | |
74 | - | |
75 | - @Override | |
76 | - public void onStopDownload(File file) { | |
77 | - LogUtil.i("onStopDownload", "process," + file.getName()); | |
78 | - if(downloadProcess != null && start){ | |
79 | - if(process >= 1.0){ | |
80 | - downloadProcess.onStopDownload(file); | |
81 | - }else{ | |
82 | - downloadProcess.onDownloadError(new Exception("file download error")); | |
83 | - } | |
84 | - } | |
85 | - start = false; | |
86 | - handler.removeCallbacks(runnable); | |
87 | - file.deleteOnExit(); | |
88 | - } | |
89 | - | |
90 | - @Override | |
91 | - public void onDownloadError(Exception e) { | |
92 | - LogUtil.i("onStopDownload", "error", e); | |
93 | - if(downloadProcess != null && start){ | |
94 | - downloadProcess.onDownloadError(e); | |
95 | - } | |
96 | - start = false; | |
97 | - handler.removeCallbacks(runnable); | |
98 | - } | |
99 | - }; | |
100 | - | |
101 | - public void setOvertime(long overtime) { | |
102 | - if(overtime > 0){ | |
103 | - this.overtime = overtime; | |
104 | - } | |
105 | - } | |
106 | - | |
107 | - public synchronized void registerDownloadProcess(AbsDownloadProcess downloadProcess){ | |
108 | - this.downloadProcess = downloadProcess ; | |
109 | - } | |
110 | - | |
111 | - public synchronized void unRegisterDownloadProcess(AbsDownloadProcess downloadProcess){ | |
112 | - this.downloadProcess = null; | |
113 | - } | |
114 | - | |
115 | - protected synchronized AbsDownloadProcess getDownloadProcess() { | |
116 | - | |
117 | - return tdownloadProcess; | |
118 | - } | |
119 | - | |
120 | - | |
121 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/RFFileUploadModule.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -import android.os.Handler; | |
4 | -import android.os.HandlerThread; | |
5 | - | |
6 | -import com.sunvote.util.LogUtil; | |
7 | -import com.sunvote.xpadapi.service.listener.IUploadListener; | |
8 | - | |
9 | -import java.io.File; | |
10 | -import java.io.FileInputStream; | |
11 | -import java.io.IOException; | |
12 | -import java.io.UnsupportedEncodingException; | |
13 | - | |
14 | -/** | |
15 | - * Created by Elvis on 2018/3/21 16:13 | |
16 | - * Email:Eluis@psunsky.com | |
17 | - * 版权所有:长沙中天电子设计开发有限公司 | |
18 | - * Description: 文件上传模块 | |
19 | - */ | |
20 | -public class RFFileUploadModule { | |
21 | - | |
22 | - public static final byte PACKTYPE = 5 ; | |
23 | - public static final int SLEEP_TIME = 25 ; | |
24 | - public static byte index = 0 ; | |
25 | - private RFFileUploadModule(){ | |
26 | - handlerThread = new HandlerThread(RFFileUploadModule.class.getSimpleName()); | |
27 | - handlerThread.start(); | |
28 | - handler = new Handler(handlerThread.getLooper()); | |
29 | - } | |
30 | - | |
31 | - private static RFFileUploadModule instance ; | |
32 | - | |
33 | - public static RFFileUploadModule getInstance() { | |
34 | - if(instance == null){ | |
35 | - synchronized (RFFileUploadModule.class){ | |
36 | - if(instance == null){ | |
37 | - instance = new RFFileUploadModule(); | |
38 | - } | |
39 | - } | |
40 | - } | |
41 | - return instance; | |
42 | - } | |
43 | - | |
44 | - private IUploadListener uploadListener = new IUploadListener() { | |
45 | - @Override | |
46 | - public void onUploadStart() { | |
47 | - System.out.println("onUploadStart"); | |
48 | - } | |
49 | - | |
50 | - @Override | |
51 | - public void onUploadProcess(double process) { | |
52 | - System.out.println("onUploadProcess:" + process); | |
53 | - } | |
54 | - | |
55 | - @Override | |
56 | - public void onUploadStop() { | |
57 | - System.out.println("onUploadStop"); | |
58 | - } | |
59 | - | |
60 | - @Override | |
61 | - public void onFail() { | |
62 | - System.out.println("onFail"); | |
63 | - } | |
64 | - }; | |
65 | - | |
66 | - | |
67 | - private String filename; | |
68 | - private byte[] datas = new byte[1024]; | |
69 | - private int length = 1024; | |
70 | - private HandlerThread handlerThread ; | |
71 | - private Handler handler ; | |
72 | - private byte[] keyid = new byte[2]; | |
73 | - private Runnable task; | |
74 | - private int packTotal ; | |
75 | - private boolean isStop = false ; | |
76 | - | |
77 | - /** | |
78 | - * 文件名不能超过16个字符(中文不能超过8个),超过16个字符将会出现截断。 | |
79 | - * 文件长度不能超过65535个字节 | |
80 | - * @param file 文件 | |
81 | - * @return 是否成功发起上传 | |
82 | - */ | |
83 | - public boolean uploadFile(File file){ | |
84 | - LogUtil.i("RFFileUploadModule","uploadFile" + file); | |
85 | - if(file != null){ | |
86 | - length = (int)file.length(); | |
87 | - filename = file.getName(); | |
88 | - datas = new byte[length+4]; | |
89 | - FileInputStream fis = null ; | |
90 | - try { | |
91 | - fis = new FileInputStream(file); | |
92 | - int start = 0 ; | |
93 | - // 把文件数据读入字节数组。 | |
94 | - while(start < length){ | |
95 | - int ret = fis.read(datas,start,length-start); | |
96 | - if(ret < 0){ | |
97 | - break; | |
98 | - } | |
99 | - start += ret ; | |
100 | - } | |
101 | - datas[length] = 0x13 ; | |
102 | - datas[length + 1] = 0x0 ; | |
103 | - datas[length + 2] = 0x10 ; | |
104 | - datas[length + 3] = 0x0 ; | |
105 | - | |
106 | - if(start >= length){ | |
107 | - task = new A0(filename,length); | |
108 | - handler.removeCallbacks(task); | |
109 | - handler.post(task); | |
110 | - return true; | |
111 | - } | |
112 | - | |
113 | - } catch (Exception e) { | |
114 | - e.printStackTrace(); | |
115 | - }finally { | |
116 | - if(fis != null){ | |
117 | - try { | |
118 | - fis.close(); | |
119 | - } catch (IOException e) { | |
120 | - e.printStackTrace(); | |
121 | - } | |
122 | - fis = null; | |
123 | - } | |
124 | - } | |
125 | - } | |
126 | - return false; | |
127 | - } | |
128 | - | |
129 | - public void setKeyid(byte[] keyid) { | |
130 | - setKeyid(keyid,0); | |
131 | - } | |
132 | - public void setKeyid(byte[] keyid,int start) { | |
133 | - this.keyid[0] = keyid[start]; | |
134 | - this.keyid[1] = keyid[start+1]; | |
135 | - } | |
136 | - | |
137 | - public void onUploadFile(byte data, byte[] keyid, byte packid, byte packH, byte[] packLs) { | |
138 | - if (data == 1) { | |
139 | - setKeyid(keyid); | |
140 | - packetConfirmation(packid); | |
141 | - } | |
142 | - if (data == 2) { | |
143 | - uploadData(packid, packH, packLs); | |
144 | - } | |
145 | - if (data == 3) { | |
146 | - packetReceptionConfirmed(packid, packH); | |
147 | - } | |
148 | - } | |
149 | - | |
150 | - public void uploadData(byte packid, byte packH, byte[] packLs){ | |
151 | - System.out.println("uploadData"); | |
152 | - handler.removeCallbacks(task); | |
153 | - if(task instanceof A2){ | |
154 | - ((A2)task).setStop(true); | |
155 | - } | |
156 | - task = new A2(keyid,packid,packH,datas,packLs); | |
157 | - handler.post(task); | |
158 | - if(uploadListener != null){ | |
159 | - double process = 0 ; | |
160 | - if(packTotal > 0){ | |
161 | - int count = 0 ; | |
162 | - int sen = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0XFF); | |
163 | - for(int i = 0 ; i < 16 ; i++){ | |
164 | - if((sen & (1 << i)) == 0){ | |
165 | - count ++ ; | |
166 | - } | |
167 | - } | |
168 | - int been = packH * 16 + count ; | |
169 | - if(been > packTotal){ | |
170 | - been = packTotal ; | |
171 | - } | |
172 | - process = (double)(been) / packTotal ; | |
173 | - } | |
174 | - uploadListener.onUploadProcess(process); | |
175 | - } | |
176 | - } | |
177 | - | |
178 | - public void packetConfirmation(byte packid){ | |
179 | - System.out.println("packetConfirmation"); | |
180 | - handler.removeCallbacks(task); | |
181 | - byte[] names = null; | |
182 | - if(filename != null){ | |
183 | - try { | |
184 | - names = filename.getBytes("GB2312"); | |
185 | - } catch (UnsupportedEncodingException e) { | |
186 | - e.printStackTrace(); | |
187 | - } | |
188 | - } | |
189 | - task = new A1(keyid,(byte)((length + 4 ) / 65535), (byte)(((length + 4) % 65535) / 256),(byte)((length + 4) % 256),names); | |
190 | - handler.post(task); | |
191 | - } | |
192 | - | |
193 | - public void packetReceptionConfirmed(byte packid,byte packH){ | |
194 | - System.out.println("packetReceptionConfirmed"); | |
195 | - handler.removeCallbacks(task); | |
196 | - task = new A3(keyid,packid,packH); | |
197 | - handler.post(task); | |
198 | - } | |
199 | - | |
200 | - public boolean uploadFile(byte[] datas){ | |
201 | - System.out.println("uploadFile" + datas); | |
202 | - if(datas != null){ | |
203 | - length = datas.length ; | |
204 | - filename = null ; | |
205 | - this.datas = new byte[length + 4]; | |
206 | - System.arraycopy(datas,0,this.datas,0,length); | |
207 | - datas[length] = 0x13 ; | |
208 | - datas[length + 1] = 0x0 ; | |
209 | - datas[length + 2] = 0x10 ; | |
210 | - datas[length + 3] = 0x0 ; | |
211 | - task = new A0(filename,length); | |
212 | - handler.removeCallbacks(task); | |
213 | - handler.post(task); | |
214 | - return true; | |
215 | - } | |
216 | - return false; | |
217 | - } | |
218 | - | |
219 | - | |
220 | - public void setUploadListener(IUploadListener uploadListener) { | |
221 | - this.uploadListener = uploadListener; | |
222 | - } | |
223 | - | |
224 | - class A0 implements Runnable{ | |
225 | - private int length ; | |
226 | - private String filename; | |
227 | - private int times ; | |
228 | - public A0(String filename,int length){ | |
229 | - this.length = length ; | |
230 | - this.filename = filename; | |
231 | - packTotal = length / 16 + 1; | |
232 | - times = 0 ; | |
233 | - index++; | |
234 | - } | |
235 | - | |
236 | - @Override | |
237 | - public void run() { | |
238 | - LogUtil.i("RFFileUploadModule","A0 run"); | |
239 | - XpadApiServiceInfoProxyManager.getInstance().getService().applyFileUpload(this.length,this.filename,PACKTYPE,index); | |
240 | - times ++ ; | |
241 | - if(task != null && times < 5){ | |
242 | - handler.removeCallbacks(task); | |
243 | - handler.postDelayed(task,5000); | |
244 | - } | |
245 | - } | |
246 | - } | |
247 | - | |
248 | - class A1 implements Runnable{ | |
249 | - | |
250 | - private byte[] keyid; | |
251 | - private byte packid ; | |
252 | - private byte packH ; | |
253 | - private byte packL ; | |
254 | - private byte[] names ; | |
255 | - private int times ; | |
256 | - | |
257 | - public A1(byte[] keyid, byte packid,byte packH,byte packL,byte[] names) { | |
258 | - LogUtil.i("RFFileUploadModule","A1"); | |
259 | - this.keyid = keyid; | |
260 | - this.packid = packid; | |
261 | - this.packH = packH ; | |
262 | - this.packL = packL ; | |
263 | - this.names = names ; | |
264 | - times = 0 ; | |
265 | - } | |
266 | - | |
267 | - @Override | |
268 | - public void run() { | |
269 | - LogUtil.i("RFFileUploadModule","A1 run"); | |
270 | - XpadApiServiceInfoProxyManager.getInstance().getService().packetConfirmation(this.keyid,this.packid,this.packH,this.packL,this.names,PACKTYPE); | |
271 | - times ++ ; | |
272 | - if(task != null && times < 5){ | |
273 | - handler.removeCallbacks(task); | |
274 | - handler.postDelayed(task,5000); | |
275 | - } | |
276 | - if(uploadListener != null){ | |
277 | - uploadListener.onUploadStart(); | |
278 | - isStop = false; | |
279 | - } | |
280 | - } | |
281 | - } | |
282 | - | |
283 | - class A2 implements Runnable{ | |
284 | - private byte[] keyid; | |
285 | - private byte packid; | |
286 | - private byte packH; | |
287 | - private byte[] datas ; | |
288 | - private byte[] packLs; | |
289 | - private int times ; | |
290 | - private boolean stop = false; | |
291 | - | |
292 | - public void setStop(boolean stop) { | |
293 | - this.stop = stop; | |
294 | - } | |
295 | - | |
296 | - public A2(byte[] keyid, byte packid, byte packH, byte[] datas, byte[] packLs) { | |
297 | - LogUtil.i("RFFileUploadModule","A2"); | |
298 | - this.keyid = keyid; | |
299 | - this.packid = packid; | |
300 | - this.packH = packH; | |
301 | - this.datas = datas; | |
302 | - this.packLs = packLs; | |
303 | - times = 0 ; | |
304 | - } | |
305 | - | |
306 | - @Override | |
307 | - public void run() { | |
308 | - LogUtil.i("RFFileUploadModule","A2 run"); | |
309 | - int packLsi = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0xFF); | |
310 | - int offset = 0 ; | |
311 | - int length = 16; | |
312 | - System.out.println("packLsi:" + packLsi); | |
313 | - for(byte packL = 0 ;packL < 16 && !stop ;packL ++) { | |
314 | - if((packLsi & (1 << packL)) != 0){ | |
315 | - offset = ((packid * 65535) + (packH) * 256 + 16 * (packL)) & 0xFFFF; | |
316 | - XpadApiServiceInfoProxyManager.getInstance().getService().uploadFileData(this.keyid, this.packid, this.packH, (byte)(packL ), this.datas, offset, length,PACKTYPE); | |
317 | - // need sleep ???? | |
318 | - try{ | |
319 | - Thread.sleep(SLEEP_TIME); | |
320 | - } catch (Exception e) { | |
321 | - e.printStackTrace(); | |
322 | - } | |
323 | - } | |
324 | - } | |
325 | - | |
326 | - times ++ ; | |
327 | - if(task != null && times < 5){ | |
328 | - handler.removeCallbacks(task); | |
329 | - handler.postDelayed(task,5000); | |
330 | - } | |
331 | - } | |
332 | - } | |
333 | - | |
334 | - class A3 implements Runnable{ | |
335 | - private byte[] keyid; | |
336 | - private byte packid ; | |
337 | - private byte packH; | |
338 | - private int times ; | |
339 | - | |
340 | - public A3(byte[] keyid, byte packid, byte packH) { | |
341 | - LogUtil.i("RFFileUploadModule","A3"); | |
342 | - this.keyid = keyid; | |
343 | - this.packid = packid; | |
344 | - this.packH = packH; | |
345 | - times = 0 ; | |
346 | - } | |
347 | - | |
348 | - @Override | |
349 | - public void run() { | |
350 | - LogUtil.i("RFFileUploadModule","A3 run"); | |
351 | - XpadApiServiceInfoProxyManager.getInstance().getService().packetReceptionConfirmed(this.keyid,this.packid,this.packH,PACKTYPE); | |
352 | - if(uploadListener != null && !isStop){ | |
353 | - isStop = true; | |
354 | - uploadListener.onUploadStop(); | |
355 | - } | |
356 | - } | |
357 | - } | |
358 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/RFMessageUploadModule.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -import android.os.Handler; | |
4 | -import android.os.HandlerThread; | |
5 | - | |
6 | -import java.io.UnsupportedEncodingException; | |
7 | - | |
8 | -/** | |
9 | - * Created by Elvis on 2018/3/27 9:48 | |
10 | - * Email:Eluis@psunsky.com | |
11 | - * 版权所有:长沙中天电子设计开发有限公司 | |
12 | - * Description: 人大通用版 | |
13 | - * 短消息上传模块 | |
14 | - */ | |
15 | -public class RFMessageUploadModule { | |
16 | - | |
17 | - public static final byte PACKTYPE = 3 ; | |
18 | - private static RFMessageUploadModule instance ; | |
19 | - | |
20 | - private IUploadListener uploadListener ; | |
21 | - | |
22 | - private String filename; | |
23 | - private byte[] datas = "test message".getBytes(); | |
24 | - private int length = 1024; | |
25 | - private HandlerThread handlerThread ; | |
26 | - private Handler handler ; | |
27 | - private byte[] keyid; | |
28 | - private Runnable task; | |
29 | - private int packTotal ; | |
30 | - private boolean stop = false; | |
31 | - | |
32 | - private RFMessageUploadModule(){ | |
33 | - handlerThread = new HandlerThread(RFMessageUploadModule.class.getSimpleName()); | |
34 | - handlerThread.start(); | |
35 | - handler = new Handler(handlerThread.getLooper()); | |
36 | - } | |
37 | - | |
38 | - public static RFMessageUploadModule getInstance() { | |
39 | - if(instance == null){ | |
40 | - instance = new RFMessageUploadModule(); | |
41 | - } | |
42 | - return instance; | |
43 | - } | |
44 | - | |
45 | - public void setMessageContent(byte[] messageContent) { | |
46 | - this.datas = messageContent; | |
47 | - uploadMsgData(datas); | |
48 | - removeTask(); | |
49 | - } | |
50 | - | |
51 | - public void setMessageContent(String message) { | |
52 | - try { | |
53 | - this.datas = message.getBytes("GB2312"); | |
54 | - uploadMsgData(datas); | |
55 | - removeTask(); | |
56 | - handler.removeCallbacks(failCall); | |
57 | - handler.postDelayed(failCall,10000); | |
58 | - } catch (Exception e) { | |
59 | - e.printStackTrace(); | |
60 | - } | |
61 | - } | |
62 | - | |
63 | - private boolean uploadMsgData(byte[] ds){ | |
64 | - System.out.println("uploadMsgData" + ds); | |
65 | - if(ds != null){ | |
66 | - length = ds.length ; | |
67 | - filename = null ; | |
68 | - this.datas = new byte[length ]; | |
69 | - System.arraycopy(ds,0,this.datas,0,length); | |
70 | -// this.datas[length] = 0x13 ; | |
71 | -// this.datas[length + 1] = 0x0 ; | |
72 | -// this.datas[length + 2] = 0x10 ; | |
73 | -// this.datas[length + 3] = 0x0 ; | |
74 | - task = new A0(filename,length); | |
75 | - handler.removeCallbacks(task); | |
76 | - handler.post(task); | |
77 | - return true; | |
78 | - } | |
79 | - return false; | |
80 | - } | |
81 | - | |
82 | - | |
83 | - public void setKeyid(byte[] keyid) { | |
84 | - this.keyid = keyid; | |
85 | - } | |
86 | - | |
87 | - public void uploadData(byte packid, byte packH, byte[] packLs){ | |
88 | - System.out.println("uploadData"); | |
89 | - handler.removeCallbacks(task); | |
90 | - task = new A2(keyid,packid,packH,datas,packLs); | |
91 | - handler.post(task); | |
92 | - if(uploadListener != null){ | |
93 | - double process = 0 ; | |
94 | - if(packTotal > 0){ | |
95 | - int count = 0 ; | |
96 | - int sen = (packLs[1] & 0xFF) * 256 + (packLs[0] & 0XFF); | |
97 | - for(int i = 0 ; i < 16 ; i++){ | |
98 | - if((sen & (1 << i)) != 0){ | |
99 | - count ++ ; | |
100 | - } | |
101 | - } | |
102 | - process = (double)(packH * 16 + count) / packTotal ; | |
103 | - } | |
104 | - uploadListener.onUploadProcess(process); | |
105 | - } | |
106 | - } | |
107 | - | |
108 | - public void packetConfirmation(byte packid){ | |
109 | - System.out.println("packetConfirmation"); | |
110 | - handler.removeCallbacks(task); | |
111 | - byte[] names = null; | |
112 | - if(filename != null){ | |
113 | - try { | |
114 | - names = filename.getBytes("GB2312"); | |
115 | - } catch (UnsupportedEncodingException e) { | |
116 | - e.printStackTrace(); | |
117 | - } | |
118 | - } | |
119 | - task = new A1(keyid,(byte)((length ) / 65535), (byte)(((length ) % 65535) / 256),(byte)(((length ) % 256 / 16 + (length % 16 == 0 ? 0 : 1))),names); | |
120 | - handler.post(task); | |
121 | - } | |
122 | - | |
123 | - public void packetReceptionConfirmed(byte packid,byte packH){ | |
124 | - System.out.println("packetReceptionConfirmed"); | |
125 | - handler.removeCallbacks(task); | |
126 | - task = new A3(keyid,packid,packH); | |
127 | - handler.post(task); | |
128 | - } | |
129 | - | |
130 | - public boolean uploadMessage(byte[] datas){ | |
131 | - System.out.println("uploadMsgData" + datas); | |
132 | - if(datas != null){ | |
133 | - length = datas.length ; | |
134 | - filename = null ; | |
135 | - this.datas = new byte[length ]; | |
136 | - System.arraycopy(datas,0,this.datas,0,length); | |
137 | -// datas[length] = 0x13 ; | |
138 | -// datas[length + 1] = 0x0 ; | |
139 | -// datas[length + 2] = 0x10 ; | |
140 | -// datas[length + 3] = 0x0 ; | |
141 | - task = new A0(filename,length); | |
142 | - handler.removeCallbacks(task); | |
143 | - handler.post(task); | |
144 | - return true; | |
145 | - } | |
146 | - return false; | |
147 | - } | |
148 | - | |
149 | - | |
150 | - public void setUploadListener(IUploadListener uploadListener) { | |
151 | - this.uploadListener = uploadListener; | |
152 | - } | |
153 | - | |
154 | - class A0 implements Runnable{ | |
155 | - private int length ; | |
156 | - private String filename; | |
157 | - private int times ; | |
158 | - public A0(String filename,int length){ | |
159 | - this.length = length ; | |
160 | - this.filename = filename; | |
161 | - packTotal = length / 16 + 1; | |
162 | - times = 0 ; | |
163 | - } | |
164 | - | |
165 | - @Override | |
166 | - public void run() { | |
167 | - XPadApi.getInstance().applyFileUpload(this.length,this.filename,PACKTYPE,RFFileUploadModule.index); | |
168 | - } | |
169 | - } | |
170 | - | |
171 | - class A1 implements Runnable{ | |
172 | - | |
173 | - private byte[] keyid; | |
174 | - private byte packid ; | |
175 | - private byte packH ; | |
176 | - private byte packL ; | |
177 | - private byte[] names ; | |
178 | - private int times ; | |
179 | - | |
180 | - public A1(byte[] keyid, byte packid,byte packH,byte packL,byte[] names) { | |
181 | - this.keyid = keyid; | |
182 | - this.packid = packid; | |
183 | - this.packH = packH ; | |
184 | - this.packL = packL ; | |
185 | - this.names = names ; | |
186 | - times = 0 ; | |
187 | - } | |
188 | - | |
189 | - @Override | |
190 | - public void run() { | |
191 | - XPadApi.getInstance().packetConfirmation(this.keyid,this.packid,this.packH,this.packL,this.names,PACKTYPE); | |
192 | - times ++ ; | |
193 | - if(task != null && times < 5){ | |
194 | - handler.postDelayed(task,1000); | |
195 | - } | |
196 | - if(uploadListener != null){ | |
197 | - uploadListener.onUploadStart(); | |
198 | - } | |
199 | - | |
200 | - handler.removeCallbacks(failCall); | |
201 | - handler.postDelayed(failCall,10000); | |
202 | - } | |
203 | - } | |
204 | - | |
205 | - class A2 implements Runnable{ | |
206 | - private byte[] keyid; | |
207 | - private byte packid; | |
208 | - private byte packH; | |
209 | - private byte[] datas ; | |
210 | - private byte[] packLs; | |
211 | - private int times ; | |
212 | - | |
213 | - public A2(byte[] keyid, byte packid, byte packH, byte[] datas, byte[] packLs) { | |
214 | - this.keyid = keyid; | |
215 | - this.packid = packid; | |
216 | - this.packH = packH; | |
217 | - this.datas = datas; | |
218 | - this.packLs = packLs; | |
219 | - times = 0 ; | |
220 | - } | |
221 | - | |
222 | - @Override | |
223 | - public void run() { | |
224 | - | |
225 | - int packLsi = packLs[1] * 256 + packLs[0]; | |
226 | - int offset = 0 ; | |
227 | - int length = 16; | |
228 | - System.out.println("packLsi:" + packLsi); | |
229 | - for(byte packL = 0 ;packL < 16 ;packL ++) { | |
230 | - if((packLsi & (1 << packL)) != 0){ | |
231 | - offset = ((packid * 65535) + (packH) * 256 + 16 * (packL)) & 0xFFFF; | |
232 | - XPadApi.getInstance().uploadFileData(this.keyid, this.packid, this.packH, (byte)(packL), this.datas, offset, length,PACKTYPE); | |
233 | - try{ | |
234 | - Thread.sleep(50); | |
235 | - } catch (Exception e) { | |
236 | - e.printStackTrace(); | |
237 | - } | |
238 | - } | |
239 | - } | |
240 | - times ++ ; | |
241 | - if(task != null && times < 5){ | |
242 | - handler.postDelayed(task,1000); | |
243 | - } | |
244 | - handler.removeCallbacks(failCall); | |
245 | - handler.postDelayed(failCall,10000); | |
246 | - } | |
247 | - } | |
248 | - | |
249 | - class A3 implements Runnable{ | |
250 | - private byte[] keyid; | |
251 | - private byte packid ; | |
252 | - private byte packH; | |
253 | - | |
254 | - public A3(byte[] keyid, byte packid, byte packH) { | |
255 | - this.keyid = keyid; | |
256 | - this.packid = packid; | |
257 | - this.packH = packH; | |
258 | - } | |
259 | - | |
260 | - @Override | |
261 | - public void run() { | |
262 | - XPadApi.getInstance().packetReceptionConfirmed(this.keyid,this.packid,this.packH,PACKTYPE); | |
263 | - if(uploadListener != null){ | |
264 | - uploadListener.onUploadStop(); | |
265 | - } | |
266 | - handler.removeCallbacks(failCall); | |
267 | - } | |
268 | - } | |
269 | - | |
270 | - public void onUploadMessage(byte data, byte[] keyid, byte packid, byte packH, byte[] packLs) { | |
271 | - LogUtil.i("RFMessageUploadModule","onUploadMessage:" + data); | |
272 | - if (data == 1) { | |
273 | - setKeyid(keyid); | |
274 | - packetConfirmation(packid); | |
275 | - } | |
276 | - if (data == 2) { | |
277 | - uploadData(packid, packH, packLs); | |
278 | - } | |
279 | - if (data == 3) { | |
280 | - packetReceptionConfirmed(packid, packH); | |
281 | - } | |
282 | - } | |
283 | - | |
284 | - private void removeTask(){ | |
285 | - handler.postDelayed(new Runnable() { | |
286 | - @Override | |
287 | - public void run() { | |
288 | - handler.removeCallbacks(task); | |
289 | - } | |
290 | - },5000); | |
291 | - } | |
292 | - | |
293 | - private Runnable failCall = new Runnable() { | |
294 | - @Override | |
295 | - public void run() { | |
296 | - if(uploadListener != null){ | |
297 | - uploadListener.onFail(); | |
298 | - } | |
299 | - } | |
300 | - }; | |
301 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/SendPacket.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -public class SendPacket { | |
4 | - | |
5 | - private byte[] datas; | |
6 | - | |
7 | - /** | |
8 | - * 0 未发送 | |
9 | - * 1 已发送 | |
10 | - * 2 发送成功 | |
11 | - */ | |
12 | - private int sendOK ; | |
13 | - | |
14 | - /** | |
15 | - * 发送次数 | |
16 | - */ | |
17 | - private int sendTimes; | |
18 | - | |
19 | - /** | |
20 | - * 是否有序 有序需要第一个才发送 | |
21 | - * 无序,则可全部发送 | |
22 | - */ | |
23 | - private boolean canAll; | |
24 | - | |
25 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/SenderManager.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.bean.BatchNumberVote; | |
4 | -import com.sunvote.xpadapi.service.bean.BatchSingleVote; | |
5 | -import com.sunvote.xpadapi.service.bean.LoginInVote; | |
6 | -import com.sunvote.xpadapi.service.bean.NumberVote; | |
7 | -import com.sunvote.xpadapi.service.bean.Packet; | |
8 | -import com.sunvote.xpadapi.service.bean.SelectOtherVote; | |
9 | -import com.sunvote.xpadapi.service.bean.SelectVote; | |
10 | -import com.sunvote.xpadapi.service.bean.ServiceTypeVote; | |
11 | -import com.sunvote.xpadapi.service.bean.SingleVote; | |
12 | -import com.sunvote.xpadapi.service.listener.OnSendPacket; | |
13 | -import com.sunvote.xpadapi.service.listener.OnSender; | |
14 | - | |
15 | -public final class SenderManager { | |
16 | - | |
17 | - private static SenderManager instance = null; | |
18 | - | |
19 | - private SenderManager() { | |
20 | - } | |
21 | - | |
22 | - public static SenderManager getInstance() { | |
23 | - if (instance == null) { | |
24 | - synchronized (SenderManager.class) { | |
25 | - if (instance == null) { | |
26 | - instance = new SenderManager(); | |
27 | - } | |
28 | - } | |
29 | - } | |
30 | - return instance; | |
31 | - } | |
32 | - | |
33 | - /** | |
34 | - * 发送 | |
35 | - * | |
36 | - * @param singleVote | |
37 | - */ | |
38 | - public void sendSingleVote(final SingleVote singleVote) { | |
39 | - sendSingleVote(singleVote, null); | |
40 | - } | |
41 | - | |
42 | - public void sendVoteAllOK(final OnSender<SingleVote> sender) { | |
43 | - SingleVote singleVote = new SingleVote(1); | |
44 | - sendSingleVote(singleVote, sender); | |
45 | - } | |
46 | - | |
47 | - public void sendSingleVote(final SingleVote singleVote, final OnSender<SingleVote> onSender) { | |
48 | - if (singleVote != null) { | |
49 | - byte[] datas = singleVote.toBytes(); | |
50 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(datas, new OnSendPacket() { | |
51 | - @Override | |
52 | - public void onSuccess(Packet packet) { | |
53 | - if (onSender != null) { | |
54 | - onSender.onSuccess(singleVote); | |
55 | - } | |
56 | - } | |
57 | - | |
58 | - @Override | |
59 | - public void onFail(Packet packet) { | |
60 | - if (onSender != null) { | |
61 | - onSender.onFail(singleVote); | |
62 | - } | |
63 | - } | |
64 | - }); | |
65 | - } else { | |
66 | - if (onSender != null) { | |
67 | - onSender.onFail(singleVote); | |
68 | - } | |
69 | - } | |
70 | - } | |
71 | - | |
72 | - public void sendSelectVote(final SelectVote selectVote) { | |
73 | - sendSelectVote(selectVote, null); | |
74 | - } | |
75 | - | |
76 | - public void sendSelectVote(final SelectVote selectVote, final OnSender<SelectVote> onSender) { | |
77 | - if (selectVote != null) { | |
78 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(selectVote.toBytes(), new OnSendPacket() { | |
79 | - @Override | |
80 | - public void onSuccess(Packet packet) { | |
81 | - if (onSender != null) { | |
82 | - onSender.onSuccess(selectVote); | |
83 | - } | |
84 | - } | |
85 | - | |
86 | - @Override | |
87 | - public void onFail(Packet packet) { | |
88 | - if (onSender != null) { | |
89 | - onSender.onFail(selectVote); | |
90 | - } | |
91 | - } | |
92 | - }); | |
93 | - } else { | |
94 | - if (onSender != null) { | |
95 | - onSender.onFail(selectVote); | |
96 | - } | |
97 | - } | |
98 | - } | |
99 | - | |
100 | - public void sendNumberVote(final NumberVote numberVote) { | |
101 | - sendNumberVote(numberVote, null); | |
102 | - } | |
103 | - | |
104 | - public void sendNumberVote(final NumberVote numberVote, final OnSender<NumberVote> sender) { | |
105 | - if (numberVote != null) { | |
106 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(numberVote.toBytes(), new OnSendPacket() { | |
107 | - @Override | |
108 | - public void onSuccess(Packet packet) { | |
109 | - if (sender != null) { | |
110 | - sender.onSuccess(numberVote); | |
111 | - } | |
112 | - } | |
113 | - | |
114 | - @Override | |
115 | - public void onFail(Packet packet) { | |
116 | - if (sender != null) { | |
117 | - sender.onFail(numberVote); | |
118 | - } | |
119 | - } | |
120 | - }); | |
121 | - } else { | |
122 | - if (sender != null) { | |
123 | - sender.onFail(numberVote); | |
124 | - } | |
125 | - } | |
126 | - } | |
127 | - | |
128 | - public void sendLoginInVote(final LoginInVote loginInVote) { | |
129 | - sendLoginInVote(loginInVote, null); | |
130 | - } | |
131 | - | |
132 | - public void sendLoginInVote(final LoginInVote loginInVote, final OnSender<LoginInVote> sender) { | |
133 | - if (loginInVote != null) { | |
134 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(loginInVote.toBytes(), new OnSendPacket() { | |
135 | - @Override | |
136 | - public void onSuccess(Packet packet) { | |
137 | - if (sender != null) { | |
138 | - sender.onSuccess(loginInVote); | |
139 | - } | |
140 | - } | |
141 | - | |
142 | - @Override | |
143 | - public void onFail(Packet packet) { | |
144 | - if (sender != null) { | |
145 | - sender.onFail(loginInVote); | |
146 | - } | |
147 | - } | |
148 | - }); | |
149 | - } else { | |
150 | - if (sender != null) { | |
151 | - sender.onFail(loginInVote); | |
152 | - } | |
153 | - } | |
154 | - } | |
155 | - | |
156 | - public void sendCancelAllBatchSingleVote(final OnSender<BatchSingleVote> sender) { | |
157 | - BatchSingleVote batchSingleVote = new BatchSingleVote(); | |
158 | - sendBatchSingleVote(batchSingleVote, sender); | |
159 | - } | |
160 | - | |
161 | - public void sendSubmitlAllBatchSingleVote(final OnSender<BatchSingleVote> sender) { | |
162 | - BatchSingleVote batchSingleVote = new BatchSingleVote(); | |
163 | - batchSingleVote.setOk(1); | |
164 | - sendBatchSingleVote(batchSingleVote, sender); | |
165 | - } | |
166 | - | |
167 | - public void sendBatchSingleVote(final BatchSingleVote batchSingleVote) { | |
168 | - sendBatchSingleVote(batchSingleVote, null); | |
169 | - } | |
170 | - | |
171 | - public void sendBatchSingleVote(final BatchSingleVote batchSingleVote, final OnSender<BatchSingleVote> sender) { | |
172 | - if (batchSingleVote != null) { | |
173 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(batchSingleVote.toBytes(), new OnSendPacket() { | |
174 | - @Override | |
175 | - public void onSuccess(Packet packet) { | |
176 | - if (sender != null) { | |
177 | - sender.onSuccess(batchSingleVote); | |
178 | - } | |
179 | - } | |
180 | - | |
181 | - @Override | |
182 | - public void onFail(Packet packet) { | |
183 | - if (sender != null) { | |
184 | - sender.onFail(batchSingleVote); | |
185 | - } | |
186 | - } | |
187 | - }); | |
188 | - } else { | |
189 | - if (sender != null) { | |
190 | - sender.onFail(batchSingleVote); | |
191 | - } | |
192 | - } | |
193 | - } | |
194 | - | |
195 | - public void sendBatchNumberVoteOK(final BatchNumberVote batchNumberVote, final OnSender<BatchNumberVote> sender) { | |
196 | - batchNumberVote.setOk(1); | |
197 | - sendBatchNumberVote(batchNumberVote, sender); | |
198 | - } | |
199 | - | |
200 | - public void sendBatchNumberVote(final BatchNumberVote batchNumberVote) { | |
201 | - sendBatchNumberVote(batchNumberVote, null); | |
202 | - } | |
203 | - | |
204 | - public void sendBatchNumberVote(final BatchNumberVote batchNumberVote, final OnSender<BatchNumberVote> sender) { | |
205 | - if (batchNumberVote != null) { | |
206 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(batchNumberVote.toBytes(), new OnSendPacket() { | |
207 | - @Override | |
208 | - public void onSuccess(Packet packet) { | |
209 | - if (sender != null) { | |
210 | - sender.onSuccess(batchNumberVote); | |
211 | - } | |
212 | - } | |
213 | - | |
214 | - @Override | |
215 | - public void onFail(Packet packet) { | |
216 | - if (sender != null) { | |
217 | - sender.onFail(batchNumberVote); | |
218 | - } | |
219 | - } | |
220 | - }); | |
221 | - } else { | |
222 | - if (sender != null) { | |
223 | - sender.onFail(batchNumberVote); | |
224 | - } | |
225 | - } | |
226 | - } | |
227 | - | |
228 | - public void sendSelectOtherVote(SelectOtherVote selectOtherVote) { | |
229 | - sendSelectOtherVote(selectOtherVote, null); | |
230 | - } | |
231 | - | |
232 | - public void sendSelectOtherVote(final SelectOtherVote selectOtherVote, final OnSender<SelectOtherVote> sender) { | |
233 | - if (selectOtherVote != null) { | |
234 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(selectOtherVote.toBytes(), new OnSendPacket() { | |
235 | - @Override | |
236 | - public void onSuccess(Packet packet) { | |
237 | - if (sender != null) { | |
238 | - sender.onSuccess(selectOtherVote); | |
239 | - } | |
240 | - } | |
241 | - | |
242 | - @Override | |
243 | - public void onFail(Packet packet) { | |
244 | - if (sender != null) { | |
245 | - sender.onFail(selectOtherVote); | |
246 | - } | |
247 | - } | |
248 | - }); | |
249 | - } else { | |
250 | - if (sender != null) { | |
251 | - sender.onFail(selectOtherVote); | |
252 | - } | |
253 | - } | |
254 | - } | |
255 | - | |
256 | - public void sendServiceTypeVote(final ServiceTypeVote serviceTypeVote) { | |
257 | - sendServiceTypeVote(serviceTypeVote, null); | |
258 | - } | |
259 | - | |
260 | - public void sendServiceTypeVote(final ServiceTypeVote serviceTypeVote, final OnSender<ServiceTypeVote> sender) { | |
261 | - if (serviceTypeVote != null) { | |
262 | - XpadApiServiceInfoProxyManager.getInstance().sendPacket(serviceTypeVote.toBytes(), new OnSendPacket() { | |
263 | - @Override | |
264 | - public void onSuccess(Packet packet) { | |
265 | - if (sender != null) { | |
266 | - sender.onSuccess(serviceTypeVote); | |
267 | - } | |
268 | - } | |
269 | - | |
270 | - @Override | |
271 | - public void onFail(Packet packet) { | |
272 | - if (sender != null) { | |
273 | - sender.onFail(serviceTypeVote); | |
274 | - } | |
275 | - } | |
276 | - }); | |
277 | - } else { | |
278 | - if (sender != null) { | |
279 | - sender.onFail(serviceTypeVote); | |
280 | - } | |
281 | - } | |
282 | - } | |
283 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/SerialManager.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -public final class SerialManager { | |
4 | - | |
5 | - private static SerialManager instance = null ; | |
6 | - | |
7 | - private SerialManager(){ | |
8 | - } | |
9 | - | |
10 | - public static SerialManager getInstance(){ | |
11 | - if(instance == null){ | |
12 | - synchronized(SerialManager.class){ | |
13 | - if(instance == null){ | |
14 | - instance = new SerialManager(); | |
15 | - } | |
16 | - } | |
17 | - } | |
18 | - return instance; | |
19 | - } | |
20 | - | |
21 | - private byte seq = 0 ; | |
22 | - | |
23 | - public byte getSeq() { | |
24 | - if (seq == 0xfe) { | |
25 | - seq = 0 ; | |
26 | - } | |
27 | - return ++seq; | |
28 | - } | |
29 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/logic/XpadApiServiceInfoProxyManager.java deleted
1 | -package com.sunvote.xpadapi.service.logic; | |
2 | - | |
3 | -import com.sunvote.xpadapi.service.XpadApiService; | |
4 | -import com.sunvote.xpadapi.service.bean.BaseInfo; | |
5 | -import com.sunvote.xpadapi.service.bean.BaseVoteInfo; | |
6 | -import com.sunvote.xpadapi.service.bean.KeypadInfo; | |
7 | -import com.sunvote.xpadapi.service.bean.ModelInfo; | |
8 | -import com.sunvote.xpadapi.service.bean.OnLineInfo; | |
9 | -import com.sunvote.xpadapi.service.bean.Packet; | |
10 | -import com.sunvote.xpadapi.service.listener.BaseInfoChanageListener; | |
11 | -import com.sunvote.xpadapi.service.listener.BaseVoteInfoChanageListener; | |
12 | -import com.sunvote.xpadapi.service.listener.KeyPadinfoChanageListener; | |
13 | -import com.sunvote.xpadapi.service.listener.ModelInfoChanageListener; | |
14 | -import com.sunvote.xpadapi.service.listener.OnSendPacket; | |
15 | -import com.sunvote.xpadapi.service.listener.OnlineInfoChanageListener; | |
16 | -import com.sunvote.xpadapi.util.LogUtil; | |
17 | - | |
18 | -import java.util.ArrayList; | |
19 | -import java.util.Collections; | |
20 | -import java.util.List; | |
21 | - | |
22 | -/** | |
23 | - * 服务信息 | |
24 | - */ | |
25 | -public final class XpadApiServiceInfoProxyManager { | |
26 | - | |
27 | - public static final String TAG = XpadApiServiceInfoProxyManager.class.getSimpleName(); | |
28 | - private static XpadApiServiceInfoProxyManager instance = null ; | |
29 | - private List<Packet> sendList = Collections.synchronizedList(new ArrayList<Packet>()); | |
30 | - private Object lock = new Object(); | |
31 | - private String charset = "GB2312" ; | |
32 | - private XpadApiService service; | |
33 | - | |
34 | - public void setCharset(String charset) { | |
35 | - this.charset = charset; | |
36 | - } | |
37 | - | |
38 | - public void setService(XpadApiService service) { | |
39 | - this.service = service; | |
40 | - } | |
41 | - | |
42 | - public XpadApiService getService() { | |
43 | - return service; | |
44 | - } | |
45 | - | |
46 | - public String getCharset() { | |
47 | - return charset; | |
48 | - } | |
49 | - | |
50 | - private XpadApiServiceInfoProxyManager(){ | |
51 | - } | |
52 | - | |
53 | - public static XpadApiServiceInfoProxyManager getInstance(){ | |
54 | - if(instance == null){ | |
55 | - synchronized(XpadApiServiceInfoProxyManager.class){ | |
56 | - if(instance == null){ | |
57 | - instance = new XpadApiServiceInfoProxyManager(); | |
58 | - } | |
59 | - } | |
60 | - } | |
61 | - return instance; | |
62 | - } | |
63 | - | |
64 | - private ModelInfo modelInfo; | |
65 | - private ModelInfoChanageListener modelInfoListener; | |
66 | - | |
67 | - public void setModelInfo(ModelInfo modelInfo) { | |
68 | - this.modelInfo = modelInfo; | |
69 | - if(modelInfoListener != null){ | |
70 | - try{ | |
71 | - modelInfoListener.onModelInfoChanage(modelInfo); | |
72 | - }catch (Exception ex){ | |
73 | - LogUtil.e(TAG,"onModelInfoChanage",ex); | |
74 | - } | |
75 | - } | |
76 | - } | |
77 | - | |
78 | - public ModelInfo getModelInfo() { | |
79 | - return modelInfo; | |
80 | - } | |
81 | - | |
82 | - public void setModelInfoListener(ModelInfoChanageListener modelInfoListener) { | |
83 | - this.modelInfoListener = modelInfoListener; | |
84 | - } | |
85 | - | |
86 | - private BaseInfo baseInfo; | |
87 | - private BaseInfoChanageListener baseInfoListener; | |
88 | - | |
89 | - public void setBaseInfo(BaseInfo baseInfo) { | |
90 | - this.baseInfo = baseInfo; | |
91 | - if(baseInfoListener != null){ | |
92 | - try { | |
93 | - baseInfoListener.onBaseInfoChange(baseInfo); | |
94 | - }catch (Exception ex){ | |
95 | - LogUtil.e(TAG,"onBaseInfoChange",ex); | |
96 | - } | |
97 | - } | |
98 | - | |
99 | - } | |
100 | - | |
101 | - public BaseInfo getBaseInfo() { | |
102 | - return baseInfo; | |
103 | - } | |
104 | - | |
105 | - public void setBaseInfoListener(BaseInfoChanageListener baseInfoListener) { | |
106 | - this.baseInfoListener = baseInfoListener; | |
107 | - } | |
108 | - | |
109 | - private BaseVoteInfo baseVoteInfo; | |
110 | - private BaseVoteInfoChanageListener baseVoteInfoListener; | |
111 | - | |
112 | - public void setBaseVoteInfo(BaseVoteInfo baseVoteInfo) { | |
113 | - this.baseVoteInfo = baseVoteInfo; | |
114 | - if(baseVoteInfoListener != null){ | |
115 | - try { | |
116 | - baseVoteInfoListener.onBaseVoteInfoListener(baseVoteInfo); | |
117 | - }catch (Exception ex){ | |
118 | - LogUtil.e(TAG,"onBaseVoteInfoListener",ex); | |
119 | - } | |
120 | - } | |
121 | - | |
122 | - } | |
123 | - | |
124 | - public BaseVoteInfo getBaseVoteInfo() { | |
125 | - return baseVoteInfo; | |
126 | - } | |
127 | - | |
128 | - public void setBaseVoteInfoListener(BaseVoteInfoChanageListener baseVoteInfoListener) { | |
129 | - this.baseVoteInfoListener = baseVoteInfoListener; | |
130 | - } | |
131 | - | |
132 | - private KeypadInfo keypadInfo; | |
133 | - private KeyPadinfoChanageListener keyPadinfoChanageListener; | |
134 | - | |
135 | - public void setKeypadInfo(KeypadInfo keypadInfo) { | |
136 | - this.keypadInfo = keypadInfo; | |
137 | - if(keyPadinfoChanageListener != null){ | |
138 | - try{ | |
139 | - keyPadinfoChanageListener.onKeyPadinfoChanage(keypadInfo); | |
140 | - }catch (Exception ex){ | |
141 | - LogUtil.e(TAG,"onKeyPadinfoChanage",ex); | |
142 | - } | |
143 | - } | |
144 | - | |
145 | - } | |
146 | - | |
147 | - public KeypadInfo getKeypadInfo() { | |
148 | - if(keypadInfo == null){ | |
149 | - keypadInfo = new KeypadInfo(); | |
150 | - } | |
151 | - return keypadInfo; | |
152 | - } | |
153 | - | |
154 | - public void setKeyPadinfoChanageListener(KeyPadinfoChanageListener keyPadinfoChanageListener) { | |
155 | - this.keyPadinfoChanageListener = keyPadinfoChanageListener; | |
156 | - } | |
157 | - | |
158 | - private OnLineInfo onLineInfo; | |
159 | - private OnlineInfoChanageListener onlineInfoChanageListener; | |
160 | - | |
161 | - public void setOnLineInfo(OnLineInfo onLineInfo) { | |
162 | - this.onLineInfo = onLineInfo; | |
163 | - if(onlineInfoChanageListener != null){ | |
164 | - try{ | |
165 | - onlineInfoChanageListener.onOnlineInfoChanage(onLineInfo); | |
166 | - }catch (Exception ex){ | |
167 | - LogUtil.e(TAG,"onOnlineInfoChanage",ex); | |
168 | - } | |
169 | - } | |
170 | - } | |
171 | - | |
172 | - public OnLineInfo getOnLineInfo() { | |
173 | - return onLineInfo; | |
174 | - } | |
175 | - | |
176 | - public void setOnlineInfoChanageListener(OnlineInfoChanageListener onlineInfoChanageListener) { | |
177 | - this.onlineInfoChanageListener = onlineInfoChanageListener; | |
178 | - } | |
179 | - | |
180 | - public void sendPacket(byte[] datas,final OnSendPacket sendPacket){ | |
181 | - Packet packet = new Packet(); | |
182 | - packet.setDatas(datas); | |
183 | - packet.setSendNo(datas[5] & 0xFF); | |
184 | - packet.setOnSendPacket(new OnSendPacket() { | |
185 | - @Override | |
186 | - public void onSuccess(Packet packet) { | |
187 | - synchronized (lock){ | |
188 | - sendList.remove(packet); | |
189 | - } | |
190 | - try{ | |
191 | - sendPacket.onSuccess(packet); | |
192 | - }catch (Exception ex){ | |
193 | - LogUtil.e(TAG,"sendPacket.onSuccess",ex); | |
194 | - } | |
195 | - } | |
196 | - | |
197 | - @Override | |
198 | - public void onFail(Packet packet) { | |
199 | - synchronized (lock){ | |
200 | - sendList.remove(packet); | |
201 | - } | |
202 | - try{ | |
203 | - sendPacket.onFail(packet); | |
204 | - }catch (Exception ex){ | |
205 | - LogUtil.e(TAG,"sendPacket.onFail",ex); | |
206 | - } | |
207 | - } | |
208 | - }); | |
209 | - synchronized (lock){ | |
210 | - if(!exsit(packet)){ | |
211 | - sendList.add(packet); | |
212 | - } | |
213 | - } | |
214 | - if(service != null){ | |
215 | - service.immediately(); | |
216 | - } | |
217 | - } | |
218 | - | |
219 | - public List<Packet> getSendList() { | |
220 | - return sendList; | |
221 | - } | |
222 | - | |
223 | - private boolean exsit(Packet packet){ | |
224 | - for(Packet packet1: sendList){ | |
225 | - if(packet.getSendNo() == packet1.getSendNo()){ | |
226 | - return true; | |
227 | - } | |
228 | - } | |
229 | - return false; | |
230 | - } | |
231 | - | |
232 | - public Packet findPacket(int sendNo){ | |
233 | - for(Packet packet: sendList){ | |
234 | - if(packet.getSendNo() == sendNo){ | |
235 | - return packet; | |
236 | - } | |
237 | - } | |
238 | - return null; | |
239 | - } | |
240 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/usb/UsbTransferManager.java deleted
1 | -package com.sunvote.xpadapi.usb; | |
2 | - | |
3 | -import android.app.PendingIntent; | |
4 | -import android.content.BroadcastReceiver; | |
5 | -import android.content.Context; | |
6 | -import android.content.Intent; | |
7 | -import android.content.IntentFilter; | |
8 | -import android.hardware.usb.UsbDevice; | |
9 | -import android.hardware.usb.UsbDeviceConnection; | |
10 | -import android.hardware.usb.UsbEndpoint; | |
11 | -import android.hardware.usb.UsbInterface; | |
12 | -import android.hardware.usb.UsbManager; | |
13 | -import android.os.Handler; | |
14 | -import android.os.HandlerThread; | |
15 | - | |
16 | - | |
17 | -import com.sunvote.xpadapi.util.LogUtil; | |
18 | - | |
19 | -import java.io.IOException; | |
20 | -import java.io.InputStream; | |
21 | -import java.io.OutputStream; | |
22 | -import java.util.HashMap; | |
23 | -import java.util.LinkedList; | |
24 | -import java.util.concurrent.locks.Condition; | |
25 | -import java.util.concurrent.locks.Lock; | |
26 | -import java.util.concurrent.locks.ReentrantLock; | |
27 | - | |
28 | -/*** | |
29 | - * @Auther Elvis | |
30 | - */ | |
31 | -public class UsbTransferManager { | |
32 | - | |
33 | - public interface OnUsbConnectListener{ | |
34 | - boolean onConnect(boolean isConnected); | |
35 | - } | |
36 | - | |
37 | - public static final String TAG = UsbTransferManager.class.getSimpleName(); | |
38 | - private static UsbTransferManager instance = null ; | |
39 | - private HandlerThread workThread = new HandlerThread("usb workThread"); | |
40 | - private Handler workHandler = null; | |
41 | - private boolean stop = false; | |
42 | - private OnUsbConnectListener onUsbConnectListener; | |
43 | - | |
44 | - public void setOnUsbConnectListener(OnUsbConnectListener onUsbConnectListener) { | |
45 | - this.onUsbConnectListener = onUsbConnectListener; | |
46 | - } | |
47 | - | |
48 | - private UsbTransferManager(){ | |
49 | - workThread.start(); | |
50 | - workHandler = new Handler(workThread.getLooper()); | |
51 | - } | |
52 | - | |
53 | - public static UsbTransferManager getInstance(){ | |
54 | - if(instance == null){ | |
55 | - synchronized(UsbTransferManager.class){ | |
56 | - if(instance == null){ | |
57 | - instance = new UsbTransferManager(); | |
58 | - } | |
59 | - } | |
60 | - } | |
61 | - return instance; | |
62 | - } | |
63 | - | |
64 | - public void startWork(){ | |
65 | - stop = false; | |
66 | - workHandler.post(usbConnectInit); | |
67 | - } | |
68 | - | |
69 | - public void stopWork(){ | |
70 | - mUsbDevice = null; | |
71 | - mUsbConnection = null; | |
72 | - epIn = null; | |
73 | - epOut = null; | |
74 | - workHandler.removeCallbacks(usbConnectInit); | |
75 | - workHandler.removeCallbacks(usbConnect); | |
76 | - workHandler.removeCallbacks(usbConnectionReceiverTask); | |
77 | - stop = true; | |
78 | - } | |
79 | - | |
80 | - private UsbOutputStream outputStream = new UsbOutputStream(); | |
81 | - private UsbInputStream inputStream = new UsbInputStream(); | |
82 | - | |
83 | - public UsbInputStream getInputStream() { | |
84 | - return inputStream; | |
85 | - } | |
86 | - | |
87 | - public UsbOutputStream getOutputStream() { | |
88 | - return outputStream; | |
89 | - } | |
90 | - | |
91 | - private long lastOpenTime; | |
92 | - private class UsbPermissionReceiver extends BroadcastReceiver { | |
93 | - public void onReceive(Context context, Intent intent) { | |
94 | - String action = intent.getAction(); | |
95 | - if (ACTION_USB_PERMISSION.equals(action)) { | |
96 | - synchronized (this) { | |
97 | - UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE); | |
98 | - if (device.getDeviceName().equals(mUsbDevice.getDeviceName())) { | |
99 | - if (intent.getBooleanExtra(UsbManager.EXTRA_PERMISSION_GRANTED, false)) { | |
100 | - // 授权成功,在这里进行打开设备操作 | |
101 | - if (System.currentTimeMillis() - lastOpenTime > 1000) { | |
102 | - lastOpenTime = System.currentTimeMillis(); | |
103 | - workHandler.removeCallbacks(usbConnectInit); | |
104 | - workHandler.removeCallbacks(usbConnect); | |
105 | - if(!stop){ | |
106 | - workHandler.postDelayed(usbConnect,0); | |
107 | - } | |
108 | - } | |
109 | - }else{ | |
110 | - if(!stop){ | |
111 | - workHandler.postDelayed(usbConnectInit,20000); | |
112 | - } | |
113 | - } | |
114 | - } | |
115 | - } | |
116 | - } | |
117 | - } | |
118 | - } | |
119 | - | |
120 | - private Runnable usbConnectionReceiverTask = new Runnable() { | |
121 | - @Override | |
122 | - public void run() { | |
123 | - if (usbManager != null) { | |
124 | - HashMap<String, UsbDevice> map = usbManager.getDeviceList(); | |
125 | - boolean find = false; | |
126 | - for (UsbDevice device : map.values()) { | |
127 | - LogUtil.d(TAG, "找到基站: Vid:" + device.getVendorId() + " Pid:" + device.getProductId()); | |
128 | - if (device.getVendorId() == VendorID && device.getProductId() == ProductID | |
129 | - || device.getVendorId() == VendorID_2 && device.getProductId() == ProductID_2 | |
130 | - || device.getVendorId() == VendorID_3 && device.getProductId() == ProductID_3) { | |
131 | - find = true; | |
132 | - workHandler.postDelayed(usbConnectionReceiverTask, 1000); | |
133 | - break; | |
134 | - } | |
135 | - } | |
136 | - if (!find) { | |
137 | - stopWork(); | |
138 | - startWork(); | |
139 | - } | |
140 | - } | |
141 | - } | |
142 | - }; | |
143 | - | |
144 | - private Runnable usbConnectInit = new Runnable() { | |
145 | - @Override | |
146 | - public void run() { | |
147 | - LogUtil.i(TAG, "发起USB初始化!"); | |
148 | - boolean find = false; | |
149 | - workHandler.removeCallbacks(usbConnectionReceiverTask); | |
150 | - if(usbManager != null) { | |
151 | - HashMap<String, UsbDevice> map = usbManager.getDeviceList(); | |
152 | - for (UsbDevice device : map.values()) { | |
153 | - LogUtil.d(TAG, "找到基站: Vid:" + device.getVendorId() + " Pid:" + device.getProductId()); | |
154 | - if (device.getVendorId() == VendorID && device.getProductId() == ProductID | |
155 | - || device.getVendorId() == VendorID_2 && device.getProductId() == ProductID_2 | |
156 | - || device.getVendorId() == VendorID_3 && device.getProductId() == ProductID_3) { | |
157 | - mUsbDevice = device; | |
158 | - find = true; | |
159 | - if (!usbManager.hasPermission(device)) { | |
160 | - if (usbPermissionReceiver == null) { | |
161 | - usbPermissionReceiver = new UsbPermissionReceiver(); | |
162 | - } | |
163 | - // 申请权限 | |
164 | - Intent intent = new Intent(ACTION_USB_PERMISSION); | |
165 | - PendingIntent mPermissionIntent = PendingIntent.getBroadcast(mContext, 0, intent, 0); | |
166 | - IntentFilter permissionFilter = new IntentFilter(ACTION_USB_PERMISSION); | |
167 | - mContext.registerReceiver(usbPermissionReceiver, permissionFilter); | |
168 | - usbManager.requestPermission(device, mPermissionIntent); | |
169 | - if(!stop){ | |
170 | - workHandler.postDelayed(usbConnectInit,20 * 1000); | |
171 | - } | |
172 | - } else { | |
173 | - if(!stop){ | |
174 | - workHandler.postDelayed(usbConnect,10); | |
175 | - } | |
176 | - } | |
177 | - } | |
178 | - } | |
179 | - | |
180 | - } | |
181 | - if(!find){ | |
182 | - workHandler.removeCallbacks(usbConnectInit); | |
183 | - if(!stop){ | |
184 | - workHandler.postDelayed(usbConnectInit,2000); | |
185 | - } | |
186 | - } | |
187 | - } | |
188 | - }; | |
189 | - | |
190 | - | |
191 | - private Runnable usbConnect = new Runnable() { | |
192 | - @Override | |
193 | - public void run() { | |
194 | - LogUtil.i(TAG, "发起USB键盘连接!"); | |
195 | - if(openUsbDevice()){ | |
196 | - if(onUsbConnectListener != null){ | |
197 | - onUsbConnectListener.onConnect(true); | |
198 | - } | |
199 | - workHandler.postDelayed(usbConnectionReceiverTask,2000); | |
200 | - }; | |
201 | - } | |
202 | - }; | |
203 | - | |
204 | - private Runnable readData = new Runnable() { | |
205 | - @Override | |
206 | - public void run() { | |
207 | - byte[] datas = receiveUsbRequestData(); | |
208 | - LogUtil.i(TAG, "RECEIVEA DATA:", datas); | |
209 | - if(datas != null) { | |
210 | - int length = datas.length; | |
211 | - try { | |
212 | - try { | |
213 | - lock.lock(); | |
214 | - if (linkedList.size() < MAX_CACHE_SIZE) { | |
215 | - for (int i = length - 1; i >= 0; i--) { | |
216 | - linkedList.push(datas[i]); | |
217 | - } | |
218 | - } | |
219 | - } finally { | |
220 | - empty.signal(); | |
221 | - lock.unlock(); | |
222 | - } | |
223 | - } catch (Exception e) { | |
224 | - LogUtil.e(TAG, "UDP receiver message", e); | |
225 | - close = true; | |
226 | - } | |
227 | - if(!stop){ | |
228 | - workHandler.post(readData); | |
229 | - } | |
230 | - }else{ | |
231 | - stopWork(); | |
232 | - startWork(); | |
233 | - } | |
234 | - | |
235 | - } | |
236 | - }; | |
237 | - | |
238 | - /** | |
239 | - * 打开连接 | |
240 | - * | |
241 | - * @paramdevice | |
242 | - */ | |
243 | - private boolean openUsbDevice() { | |
244 | - | |
245 | - if (mUsbDevice == null) | |
246 | - return false; | |
247 | - | |
248 | - if(mUsbDevice.getInterfaceCount() == 0){ | |
249 | - return false; | |
250 | - } | |
251 | - mUsbInterface = mUsbDevice.getInterface(0); | |
252 | - setEndpoint(mUsbInterface); | |
253 | - mUsbConnection = usbManager.openDevice(mUsbDevice); | |
254 | - LogUtil.i(TAG,"打开USB连接"); | |
255 | - if (mUsbConnection != null) { | |
256 | - return mUsbConnection.claimInterface(mUsbInterface, true); | |
257 | - } | |
258 | - return false; | |
259 | - } | |
260 | - | |
261 | - private int sendDataBulkTransfer(byte[] buffer) { | |
262 | - final int length = buffer.length; | |
263 | - int ref = -100; | |
264 | - if (epOut != null && mUsbConnection != null) { | |
265 | - ref = mUsbConnection.bulkTransfer(epOut, buffer, length, 100); | |
266 | - mUsbConnection.claimInterface(mUsbInterface, true); | |
267 | - LogUtil.d(TAG, "发送数据成功有:" + ref); | |
268 | - if(ref <0 ){ | |
269 | - if(onUsbConnectListener != null){ | |
270 | - onUsbConnectListener.onConnect(false); | |
271 | - } | |
272 | - workHandler.removeCallbacks(usbConnectionReceiverTask); | |
273 | - workHandler.post(usbConnectionReceiverTask); | |
274 | - } | |
275 | - }else{ | |
276 | - LogUtil.d(TAG, "未连接:" + ref); | |
277 | - } | |
278 | - return ref; | |
279 | - } | |
280 | - | |
281 | - public byte[] receiveUsbRequestData() { | |
282 | - if(epIn != null && mUsbConnection != null) { | |
283 | - byte[] bytes = new byte[epIn.getMaxPacketSize()]; | |
284 | - int ret = mUsbConnection.bulkTransfer(epIn, bytes, bytes.length, 100); | |
285 | - if (ret > 0) { | |
286 | - return bytes; | |
287 | - } | |
288 | - } | |
289 | - return null; | |
290 | - } | |
291 | - | |
292 | - /** | |
293 | - * UsbInterface 进行端点设置和通讯 | |
294 | - * | |
295 | - * @param intf | |
296 | - */ | |
297 | - private void setEndpoint(UsbInterface intf) { | |
298 | - if (intf == null) | |
299 | - return; | |
300 | - // 设置接收数据的端点 | |
301 | - if (intf.getEndpoint(0) != null) { | |
302 | - epIn = intf.getEndpoint(0); | |
303 | - } | |
304 | - // 当端点为2的时候 | |
305 | - if (intf.getEndpointCount() == 2) { | |
306 | - // 设置发送数据的断点 | |
307 | - if (intf.getEndpoint(1) != null) | |
308 | - epOut = intf.getEndpoint(1); | |
309 | - } | |
310 | - } | |
311 | - | |
312 | - public void setUsbManager(UsbManager usbManager) { | |
313 | - this.usbManager = usbManager; | |
314 | - } | |
315 | - | |
316 | - public void setContext(Context mContext) { | |
317 | - this.mContext = mContext; | |
318 | - } | |
319 | - | |
320 | - public class UsbOutputStream extends OutputStream{ | |
321 | - | |
322 | - @Override | |
323 | - public void write(int b) throws IOException { | |
324 | - sendDataBulkTransfer(new byte[]{(byte)b}); | |
325 | - } | |
326 | - | |
327 | - @Override | |
328 | - public void write(byte[] b) throws IOException { | |
329 | - sendDataBulkTransfer(b); | |
330 | - } | |
331 | - | |
332 | - @Override | |
333 | - public void write(byte[] b, int off, int len) throws IOException { | |
334 | - byte[] temp = new byte[len]; | |
335 | - System.arraycopy(b, off, temp, 0, len); | |
336 | - sendDataBulkTransfer(temp); | |
337 | - } | |
338 | - } | |
339 | - | |
340 | - private LinkedList<Byte> linkedList = new LinkedList<Byte>(); | |
341 | - public long MAX_CACHE_SIZE = 4 * 1024; | |
342 | - private Lock lock = new ReentrantLock(); | |
343 | - private Condition empty = lock.newCondition(); | |
344 | - private boolean close = false; | |
345 | - public class UsbInputStream extends InputStream{ | |
346 | - @Override | |
347 | - public int read() throws IOException { | |
348 | - if (close) { | |
349 | - throw new IOException("the stream has closed"); | |
350 | - } | |
351 | - | |
352 | - try { | |
353 | - lock.lock(); | |
354 | - while (linkedList.isEmpty()) { | |
355 | - try { | |
356 | - empty.await(); | |
357 | - } catch (InterruptedException e) { | |
358 | - LogUtil.e(TAG,e); | |
359 | - } | |
360 | - } | |
361 | - return linkedList.pop(); | |
362 | - } finally { | |
363 | - lock.unlock(); | |
364 | - } | |
365 | - } | |
366 | - | |
367 | - | |
368 | - public boolean isClose() { | |
369 | - return close; | |
370 | - } | |
371 | - | |
372 | - @Override | |
373 | - public void close() throws IOException { | |
374 | - close = true; | |
375 | - super.close(); | |
376 | - } | |
377 | - | |
378 | - @Override | |
379 | - public int read(byte[] buffer) throws IOException { | |
380 | - try { | |
381 | - lock.lock(); | |
382 | - if (buffer == null) { | |
383 | - throw new IOException("buffer is empty"); | |
384 | - } | |
385 | - if (close) { | |
386 | - throw new IOException("the stream has closed"); | |
387 | - } | |
388 | - | |
389 | - while (linkedList.isEmpty()) { | |
390 | - try { | |
391 | - empty.await(); | |
392 | - } catch (InterruptedException e) { | |
393 | - e.printStackTrace(); | |
394 | - } | |
395 | - } | |
396 | - int index = 0; | |
397 | - while (index < buffer.length && !linkedList.isEmpty()) { | |
398 | - buffer[index++] = linkedList.pop(); | |
399 | - } | |
400 | - return index; | |
401 | - } finally { | |
402 | - lock.unlock(); | |
403 | - } | |
404 | - } | |
405 | - | |
406 | - | |
407 | - @Override | |
408 | - public int read(byte[] buffer, int byteOffset, int byteCount) throws IOException { | |
409 | - try { | |
410 | - lock.lock(); | |
411 | - if (buffer == null) { | |
412 | - throw new IOException("buffer is empty"); | |
413 | - } | |
414 | - if (close) { | |
415 | - throw new IOException("the stream has closed"); | |
416 | - } | |
417 | - | |
418 | - while (linkedList.isEmpty()) { | |
419 | - try { | |
420 | - empty.await(); | |
421 | - } catch (InterruptedException e) { | |
422 | - e.printStackTrace(); | |
423 | - } | |
424 | - } | |
425 | - int index = 0; | |
426 | - while (index < byteCount && !linkedList.isEmpty()) { | |
427 | - index++; | |
428 | - buffer[byteOffset++] = linkedList.pop(); | |
429 | - } | |
430 | - return index; | |
431 | - } finally { | |
432 | - lock.unlock(); | |
433 | - } | |
434 | - } | |
435 | - } | |
436 | - | |
437 | - private UsbManager usbManager ; | |
438 | - private UsbDevice mUsbDevice; | |
439 | - private UsbDeviceConnection mUsbConnection; | |
440 | - private UsbInterface mUsbInterface; | |
441 | - private UsbEndpoint epOut, epIn; | |
442 | - private UsbPermissionReceiver usbPermissionReceiver; | |
443 | - private Context mContext ; | |
444 | - | |
445 | - private static final int VendorID = 0x03eb; | |
446 | - private static final int ProductID = 0x6201; | |
447 | - private static final int VendorID_2 = 0x0d8c; | |
448 | - private static final int ProductID_2 = 0xEA10; | |
449 | - private static final int VendorID_3 = 0x2F70; | |
450 | - private static final int ProductID_3 = 0xEA10; | |
451 | - private final String ACTION_USB_PERMISSION = "com.hhd.USB_PERMISSION"; | |
452 | - private boolean isUsbReceiver = false; | |
453 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/util/ByteUtils.java deleted
1 | -package com.sunvote.xpadapi.util; | |
2 | - | |
3 | -public class ByteUtils { | |
4 | - | |
5 | - private ByteUtils() { | |
6 | - } | |
7 | - | |
8 | - public static String bytesToHexString(byte[] src, int length) { | |
9 | - StringBuilder stringBuilder = new StringBuilder(""); | |
10 | - if (src == null || src.length <= 0) { | |
11 | - return null; | |
12 | - } | |
13 | - for (int i = 0; i < src.length && i < length; i++) { | |
14 | - int v = src[i] & 0xFF; | |
15 | - String hv = Integer.toHexString(v); | |
16 | - if (hv.length() < 2) { | |
17 | - stringBuilder.append(0); | |
18 | - } | |
19 | - stringBuilder.append(hv); | |
20 | - stringBuilder.append(" "); | |
21 | - } | |
22 | - return stringBuilder.toString(); | |
23 | - } | |
24 | - | |
25 | - public static String bytesToHexString(byte[] src) { | |
26 | - StringBuilder stringBuilder = new StringBuilder(""); | |
27 | - if (src == null || src.length <= 0) { | |
28 | - return null; | |
29 | - } | |
30 | - for (int i = 0; i < src.length; i++) { | |
31 | - int v = src[i] & 0xFF; | |
32 | - String hv = Integer.toHexString(v); | |
33 | - if (hv.length() < 2) { | |
34 | - stringBuilder.append(0); | |
35 | - } | |
36 | - stringBuilder.append(hv); | |
37 | - stringBuilder.append(" "); | |
38 | - } | |
39 | - return stringBuilder.toString(); | |
40 | - } | |
41 | - | |
42 | - public static int findBytes(byte[] source,byte[] find,int index){ | |
43 | - int flag = -1; | |
44 | - for (int j = index; j < source.length; j++) { | |
45 | - if (source.length >= j + find.length) { | |
46 | - if (compareByte(source, j, find)) { | |
47 | - flag = j; | |
48 | - break; | |
49 | - } | |
50 | - } | |
51 | - } | |
52 | - return flag; | |
53 | - } | |
54 | - | |
55 | - public static int byte1ToInt(byte b) { | |
56 | - int ret = 0; | |
57 | - ret += (b & 0x000000FF); | |
58 | - return ret; | |
59 | - } | |
60 | - | |
61 | - private static boolean compareByte(byte[] source, int start, byte[] find) { | |
62 | - if (source.length >= start + find.length) { | |
63 | - for (int i = 0; i < find.length; i++) { | |
64 | - if (source[start + i] != find[i]) { | |
65 | - return false; | |
66 | - } | |
67 | - } | |
68 | - return true; | |
69 | - } | |
70 | - return false; | |
71 | - } | |
72 | - | |
73 | - /** | |
74 | - * Convert hex string to byte[] | |
75 | - * | |
76 | - * @param hexString the hex string | |
77 | - * @return byte[] | |
78 | - */ | |
79 | - public static byte[] hexStringToBytes(String hexString) { | |
80 | - if (hexString == null || hexString.equals("")) { | |
81 | - return null; | |
82 | - } | |
83 | - hexString = hexString.toUpperCase(); | |
84 | - int length = hexString.length() / 2; | |
85 | - char[] hexChars = hexString.toCharArray(); | |
86 | - byte[] d = new byte[length]; | |
87 | - for (int i = 0; i < length; i++) { | |
88 | - int pos = i * 2; | |
89 | - d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); | |
90 | - } | |
91 | - return d; | |
92 | - } | |
93 | - | |
94 | - /** | |
95 | - * Convert char to byte | |
96 | - * | |
97 | - * @param c char | |
98 | - * @return byte | |
99 | - */ | |
100 | - private static byte charToByte(char c) { | |
101 | - return (byte) "0123456789ABCDEF".indexOf(c); | |
102 | - } | |
103 | - | |
104 | - | |
105 | - public static byte[] intToBytes(int value) { | |
106 | - byte[] src = new byte[4]; | |
107 | - src[3] = (byte) ((value >> 24) & 0xFF); | |
108 | - src[2] = (byte) ((value >> 16) & 0xFF); | |
109 | - src[1] = (byte) ((value >> 8) & 0xFF); | |
110 | - src[0] = (byte) (value & 0xFF); | |
111 | - return src; | |
112 | - } | |
113 | - | |
114 | - public static byte[] int2Bytes(int value) { | |
115 | - byte[] src = new byte[2]; | |
116 | - src[0] = (byte) ((value >> 8) & 0xFF); | |
117 | - src[1] = (byte) (value & 0xFF); | |
118 | - return src; | |
119 | - } | |
120 | - | |
121 | - public static int bytes2Int(byte[] src) { | |
122 | - int ret = ((src[1] & 0xFF) | ((src[0] & 0xFF) << 8)); | |
123 | - return ret; | |
124 | - } | |
125 | - | |
126 | - public static String getKeySn(byte[] data) { | |
127 | - String sn = ""; | |
128 | - String CS = "0123456789ABCDEF"; | |
129 | - for (int i = 0; i < 6; i++) { | |
130 | - sn += CS.charAt((data[i] >> 4) & 0xF); | |
131 | - sn += CS.charAt((data[i] >> 0) & 0xF); | |
132 | - } | |
133 | - return sn; | |
134 | - | |
135 | - } | |
136 | -} | |
137 | - |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/util/Cons.java deleted
1 | -package com.sunvote.xpadapi.util; | |
2 | - | |
3 | -public final class Cons { | |
4 | - | |
5 | - public static final int CMD_BASE_STATUS_CHANGE = 0x71;//基础信标变化 | |
6 | - public static final int CMD_VOTE_STATUS_CHANGE = 0x72;//投票信标变化 | |
7 | - public static final int CMD_VOTE_SEND_SUCCESS_RESPONSE = 0x73;//传输入成功通知 | |
8 | - | |
9 | - public static final int CMD_CHECK_BASE_STATUS_RESPONSE = 0xF0;//查询和设置各类应答 | |
10 | - public static final int CMD_VOTE_RESULT_SEND_RESPONSE = 0xF3;//投票结果上传应答 | |
11 | - public static final int CMD_FIRM_UPDATE_RESPONSE = 0xF8;//固件升级应答 | |
12 | - | |
13 | - public static final int CMD_UPLOAD_DATA_RESPONSE = 0x20; //上传指令 | |
14 | - public static final int CMD_TRANSPARENT_TRANSMISSION = 0x30; //表决器管理类指令,自定义透传指令 | |
15 | - public static final int CMD_MULTI_PCKAGE_DOWNLOAD = 0x40;// | |
16 | - public static final int CMD_COM_COMMUNICATION_TEST_RESPONSE = 0xB0; //串口测试应答 | |
17 | - | |
18 | -} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/util/Crc16.java deleted
1 | -package com.sunvote.xpadapi.util; | |
2 | - | |
3 | -public final class Crc16 { | |
4 | - private static int[] crc_ta = { //CRC余式表 | |
5 | - 0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7, | |
6 | - 0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef, | |
7 | - }; | |
8 | - | |
9 | - | |
10 | - //标准Crc16效验 | |
11 | - public static short crc16(byte[] data, int len) { | |
12 | - short Crc = 0; | |
13 | - byte da; | |
14 | - int i = 4; | |
15 | - while (len-- != 0) { | |
16 | - //da=Crc>>12; /* 暂存CRC的高四位 */ | |
17 | - da = (byte) (Crc >>> 12); /* 暂存CRC的高四位 */ | |
18 | - // Crc<<=4; /* CRC左移4位,相当于取CRC的低12位)*/ | |
19 | - Crc <<= 4; /* CRC左移4位,相当于取CRC的低12位)*/ | |
20 | - // Crc^=crc_ta[da^(*ptr/16)]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC, 然后加上上一次CRC的余数 */ | |
21 | - Crc ^= crc_ta[(da ^ (data[i] >>> 4)) & 0xf]; /* CRC的高4位和本字节的前半字节相加后查表计算CRC, 然后加上上一次CRC的余数 */ | |
22 | - //da=Crc>>12; /* 暂存CRC的高4位 */ | |
23 | - da = (byte) (Crc >>> 12); /* 暂存CRC的高4位 */ | |
24 | - // Crc<<=4; /* CRC左移4位, 相当于CRC的低12位) */ | |
25 | - Crc <<= 4; /* CRC左移4位, 相当于CRC的低12位) */ | |
26 | - // Crc^=crc_ta[da^ (*ptr&0x0f)]; | |
27 | - Crc ^= crc_ta[(da ^ data[i]) & 0x0f]; /* CRC的高4位和本字节的后半字节相加后查表计算CRC, | |
28 | - 然后再加上上一次CRC的余数 */ | |
29 | - i++; | |
30 | - } | |
31 | - return (Crc); | |
32 | - } | |
33 | - | |
34 | - public static boolean crc16Check(byte[] data) { | |
35 | - | |
36 | - int xda, xdapoly; | |
37 | - int i, j, xdabit; | |
38 | - xda = 0xFFFF; | |
39 | - xdapoly = 0xA001; // (X**16 + X**15 + X**2 + 1) | |
40 | - for (i = 0; i < data.length - 2; i++) { | |
41 | - xda ^= data[i]; | |
42 | - for (j = 0; j < 8; j++) { | |
43 | - xdabit = (int) (xda & 0x01); | |
44 | - xda >>= 1; | |
45 | - if (xdabit == 1) | |
46 | - xda ^= xdapoly; | |
47 | - } | |
48 | - } | |
49 | - | |
50 | - return data[data.length - 2] == (int) (xda & 0xFF) && data[data.length - 1] == (int) (xda >> 8); | |
51 | - | |
52 | - } | |
53 | - | |
54 | - public static int getUnsignedByte(byte data) { //将data字节型数据转换为0~255 (0xFF 即BYTE)。 | |
55 | - return data & 0x0FF; | |
56 | - } | |
57 | - | |
58 | - public static int getUnsignedShort(short data) { //将data字节型数据转换为0~255 (0xFF 即BYTE)。 | |
59 | - return data & 0x0FFFF; | |
60 | - } | |
61 | - | |
62 | - private static void printDataBuf(byte[] buf, int length, String flag) { | |
63 | - String tmpStr = new String(); | |
64 | - for (int i = 0; i < length; i++) { | |
65 | - tmpStr += String.format("%x ", buf[i]); | |
66 | - } | |
67 | - System.out.println(flag + ":" + tmpStr); | |
68 | - } | |
69 | - | |
70 | - public static boolean checkPack(byte[] buf) { | |
71 | - if (buf.length > 4 && getUnsignedByte(buf[0]) == 0xF5 && getUnsignedByte(buf[1]) == 0xAA && getUnsignedByte(buf[2]) == 0xAA) { | |
72 | - return true; | |
73 | - } | |
74 | - return false; | |
75 | - } | |
76 | -} |
C5/xpadapi/src/main/res/values/strings.xml deleted
C5/xpadapi/src/test/java/com/sunvote/xpadapi/ExampleUnitTest.java deleted
1 | -package com.sunvote.xpadapi; | |
2 | - | |
3 | -import org.junit.Test; | |
4 | - | |
5 | -import static org.junit.Assert.*; | |
6 | - | |
7 | -/** | |
8 | - * Example local unit test, which will execute on the development machine (host). | |
9 | - * | |
10 | - * @see <a href="http://d.android.com/tools/testing">Testing documentation</a> | |
11 | - */ | |
12 | -public class ExampleUnitTest { | |
13 | - @Test | |
14 | - public void addition_isCorrect() { | |
15 | - assertEquals(4, 2 + 2); | |
16 | - } | |
17 | -} | |
18 | 0 | \ No newline at end of file |