Commit 6d9503bc64a8b64982063d4647b1208043372803
1 parent
8ae9de2b
添加一个模块
Showing
109 changed files
with
3361 additions
and
8 deletions
C5/app/src/main/res/layout/fragment_result_multi_vote.xml
@@ -44,13 +44,15 @@ | @@ -44,13 +44,15 @@ | ||
44 | 44 | ||
45 | <TextView | 45 | <TextView |
46 | android:id="@+id/multi_vote_result_title_num" | 46 | android:id="@+id/multi_vote_result_title_num" |
47 | - android:layout_width="20dp" | 47 | + android:layout_width="80dp" |
48 | android:layout_height="wrap_content" | 48 | android:layout_height="wrap_content" |
49 | android:layout_marginLeft="5dp" | 49 | android:layout_marginLeft="5dp" |
50 | android:gravity="center" | 50 | android:gravity="center" |
51 | - android:textColor="@color/white" | ||
52 | - android:textSize="@dimen/big_text_p6" | ||
53 | - android:textStyle="bold" /> | 51 | + android:layout_centerVertical="true" |
52 | + android:textColor="@color/yellow" | ||
53 | + android:textSize="@dimen/big_text_p4" | ||
54 | + android:textStyle="bold" | ||
55 | + android:text="序号"/> | ||
54 | 56 | ||
55 | <TextView | 57 | <TextView |
56 | android:id="@+id/multi_vote_result_title_name" | 58 | android:id="@+id/multi_vote_result_title_name" |
C5/app/src/main/res/layout/list_multi_vote_result_item.xml
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | 14 | ||
15 | <TextView | 15 | <TextView |
16 | android:id="@+id/list_multi_result_item_num" | 16 | android:id="@+id/list_multi_result_item_num" |
17 | - android:layout_width="50dp" | 17 | + android:layout_width="80dp" |
18 | android:layout_height="wrap_content" | 18 | android:layout_height="wrap_content" |
19 | android:layout_marginLeft="5dp" | 19 | android:layout_marginLeft="5dp" |
20 | android:gravity="center" | 20 | android:gravity="center" |
C5/settings.gradle
1 | -include ':app', ':udpmodule', ':xpadprotocal', ':util', ':sunvoteadapter', 'txpad', 'sunvotesdk','testproject' | 1 | +include ':app', ':udpmodule', ':xpadprotocal', ':util', ':sunvoteadapter', 'txpad', 'sunvotesdk','testproject',':xpadapi' |
2 | + | ||
2 | \ No newline at end of file | 3 | \ No newline at end of file |
C5/xpadapi/.gitignore
0 → 100644
1 | +/build |
C5/xpadapi/build.gradle
0 → 100644
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
0 → 100644
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
0 → 100644
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
0 → 100644
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> | ||
0 | \ No newline at end of file | 13 | \ No newline at end of file |
C5/xpadapi/src/main/aidl/com/sunvote/xpadapi/ISunvoteApi.aidl
0 → 100644
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/SendPacket.java
0 → 100644
1 | +package com.sunvote.xpadapi.service; | ||
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/SenderManager.java
0 → 100644
1 | +package com.sunvote.xpadapi.service; | ||
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.setAllOk(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.setAllOk(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/SerialManager.java
0 → 100644
1 | +package com.sunvote.xpadapi.service; | ||
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/XpadApiService.java
0 → 100644
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.hardware.usb.UsbManager; | ||
9 | +import android.os.Handler; | ||
10 | +import android.os.HandlerThread; | ||
11 | +import android.os.IBinder; | ||
12 | + | ||
13 | +import com.sunvote.udptransfer.UDPModule; | ||
14 | +import com.sunvote.udptransfer.stream.SunVoteInputStream; | ||
15 | +import com.sunvote.udptransfer.work.BaseStationProcessWork; | ||
16 | +import com.sunvote.udptransfer.work.RepeatMessageManager; | ||
17 | +import com.sunvote.udptransfer.work.SDKProcessWork; | ||
18 | +import com.sunvote.xpadapi.ISunvoteApi; | ||
19 | +import com.sunvote.xpadapi.service.bean.HeartBeat; | ||
20 | +import com.sunvote.xpadapi.service.bean.Packet; | ||
21 | +import com.sunvote.xpadapi.service.listener.OnDataReceiver; | ||
22 | +import com.sunvote.xpadapi.service.bean.BaseInfo; | ||
23 | +import com.sunvote.xpadapi.service.bean.BaseVoteInfo; | ||
24 | +import com.sunvote.xpadapi.service.bean.KeypadInfo; | ||
25 | +import com.sunvote.xpadapi.service.bean.ModelInfo; | ||
26 | +import com.sunvote.xpadapi.service.bean.OnLineInfo; | ||
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 | +import com.sunvote.xpadapi.util.LogUtil; | ||
32 | + | ||
33 | +import java.io.ByteArrayOutputStream; | ||
34 | +import java.io.IOException; | ||
35 | +import java.util.ArrayList; | ||
36 | +import java.util.Arrays; | ||
37 | +import java.util.Collections; | ||
38 | +import java.util.List; | ||
39 | + | ||
40 | +public class XpadApiService extends Service { | ||
41 | + | ||
42 | + private static final String TAG = XpadApiService.class.getSimpleName(); | ||
43 | + private List<OnDataReceiver> onDataReceiverList = new ArrayList<>(); | ||
44 | + private int batteryLevel = 0; | ||
45 | + private List<Packet> innerList = Collections.synchronizedList(new ArrayList<Packet>()); | ||
46 | + private OnDataReceiver onDataReceiver = new OnDataReceiver() { | ||
47 | + @Override | ||
48 | + public void onDataReceiver(byte[] datas) { | ||
49 | + LogUtil.i(TAG, "onDataReceiver", datas); | ||
50 | + for (OnDataReceiver temp : onDataReceiverList) { | ||
51 | + if (temp != null) { | ||
52 | + try { | ||
53 | + temp.onDataReceiver(datas); | ||
54 | + } catch (Exception ex) { | ||
55 | + LogUtil.e(TAG, "onDataReceiver", ex); | ||
56 | + } | ||
57 | + } | ||
58 | + } | ||
59 | + } | ||
60 | + | ||
61 | + @Override | ||
62 | + public void onDataSender(byte[] datas) { | ||
63 | + LogUtil.i(TAG, "onDataSender", datas); | ||
64 | + for (OnDataReceiver temp : onDataReceiverList) { | ||
65 | + if (temp != null) { | ||
66 | + try { | ||
67 | + temp.onDataSender(datas); | ||
68 | + } catch (Exception ex) { | ||
69 | + LogUtil.e(TAG, "onDataSender", ex); | ||
70 | + } | ||
71 | + } | ||
72 | + } | ||
73 | + } | ||
74 | + }; | ||
75 | + | ||
76 | + public XpadApiService() { | ||
77 | + } | ||
78 | + | ||
79 | + public int registerOnDataReceiver(OnDataReceiver onDataReceiver) { | ||
80 | + for (OnDataReceiver temp : onDataReceiverList) { | ||
81 | + if (temp == onDataReceiver) { | ||
82 | + return 0; | ||
83 | + } | ||
84 | + } | ||
85 | + onDataReceiverList.add(onDataReceiver); | ||
86 | + return 1; | ||
87 | + } | ||
88 | + | ||
89 | + @Override | ||
90 | + public void onCreate() { | ||
91 | + super.onCreate(); | ||
92 | + | ||
93 | + sendThread = new HandlerThread("send"); | ||
94 | + receiverThread = new HandlerThread("receiver"); | ||
95 | + sendThread.start(); | ||
96 | + receiverThread.start(); | ||
97 | + | ||
98 | + taskHandler = new Handler(sendThread.getLooper()); | ||
99 | + IntentFilter batteryLevelFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); | ||
100 | + registerReceiver(batteryLevelRcvr, batteryLevelFilter); | ||
101 | + XpadApiServiceInfoProxyManager.getInstance().setService(this); | ||
102 | + | ||
103 | + receiverDatas(); | ||
104 | + } | ||
105 | + | ||
106 | + private void receiverDatas() { | ||
107 | + SunVoteInputStream sunVoteInputStream = new SunVoteInputStream(); | ||
108 | + sunVoteInputStream.setOnBytesReceiver(new SunVoteInputStream.OnBytesReceiver() { | ||
109 | + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); | ||
110 | + @Override | ||
111 | + public void onBytesReceiver(byte[] bytes, int len) { | ||
112 | + // 1. 先检测读取数据到缓冲区 | ||
113 | + byteArrayOutputStream.write(bytes, 0, bytes.length); | ||
114 | + if (byteArrayOutputStream.size() >= 3) { | ||
115 | + byte[] temp = byteArrayOutputStream.toByteArray(); | ||
116 | + int find = ByteUtils.findBytes(temp, new byte[]{(byte) 0xF5, (byte) 0xAA, (byte) 0xAA}, 0); | ||
117 | + if (find >= 0) { | ||
118 | + // 3. 标志存在,则继续读取长度 | ||
119 | + if (byteArrayOutputStream.size() >= find + 4) { | ||
120 | + int length = ByteUtils.byte1ToInt(byteArrayOutputStream.toByteArray()[find + 3]); | ||
121 | + if (byteArrayOutputStream.size() >= find + 4 + length) { | ||
122 | + ByteArrayOutputStream tmp = new ByteArrayOutputStream(); | ||
123 | + // 4. 根据长度读取包的内容 | ||
124 | + for (int i = find; i < find + 4 + length; i++) { | ||
125 | + // 5. 截取包的内容,向外抛出,处理,接着读取下一个包 | ||
126 | + tmp.write(temp[i]); | ||
127 | + } | ||
128 | + //CRC 校验 | ||
129 | + byte[] datas = tmp.toByteArray(); | ||
130 | + LogUtil.i(TAG, "RECEIVER DATA:", datas); | ||
131 | + | ||
132 | + try { | ||
133 | + //处理 | ||
134 | + doWith(datas); | ||
135 | + } catch (Exception ex) { | ||
136 | + LogUtil.i(TAG, "处理命令出错:", ex); | ||
137 | + } | ||
138 | + // 7. 剩余数据重新打包处理 | ||
139 | + byteArrayOutputStream.reset(); | ||
140 | + for (int i = find + 4 + length; i < temp.length; i++) { | ||
141 | + byteArrayOutputStream.write(temp[i]); | ||
142 | + } | ||
143 | + } | ||
144 | + } | ||
145 | + } | ||
146 | + } | ||
147 | + } | ||
148 | + }); | ||
149 | + SDKProcessWork.getInstance().setInputStream(sunVoteInputStream); | ||
150 | + BaseStationProcessWork.getInstance().start(); | ||
151 | + RepeatMessageManager.getInstance().start(); | ||
152 | + SDKProcessWork.getInstance().start(); | ||
153 | + } | ||
154 | + | ||
155 | + @Override | ||
156 | + public void onDestroy() { | ||
157 | + unregisterReceiver(batteryLevelRcvr); | ||
158 | + super.onDestroy(); | ||
159 | + } | ||
160 | + | ||
161 | + private HandlerThread sendThread = null; | ||
162 | + private HandlerThread receiverThread = null; | ||
163 | + private Handler taskHandler = null; | ||
164 | + private boolean receivering = true; | ||
165 | + | ||
166 | + | ||
167 | + @Override | ||
168 | + public IBinder onBind(Intent intent) { | ||
169 | + return stub; | ||
170 | + } | ||
171 | + | ||
172 | + private final ISunvoteApi.Stub stub = new ISunvoteApi.Stub() { | ||
173 | + | ||
174 | + }; | ||
175 | + | ||
176 | + private UsbTransferManager.OnUsbConnectListener connectListener = new UsbTransferManager.OnUsbConnectListener() { | ||
177 | + @Override | ||
178 | + public boolean onConnect(boolean isConnected) { | ||
179 | + if (isConnected) { | ||
180 | + // | ||
181 | + getKeypadParam(); | ||
182 | + sleepTimes(100); | ||
183 | + getWorkMode(); | ||
184 | + } | ||
185 | + return true; | ||
186 | + } | ||
187 | + }; | ||
188 | + | ||
189 | + private Runnable sendTask = new Runnable() { | ||
190 | + @Override | ||
191 | + public void run() { | ||
192 | + // 从队列中取出待发送数据 | ||
193 | + List<Packet> sendList = XpadApiServiceInfoProxyManager.getInstance().getSendList(); | ||
194 | + boolean isSend = false; | ||
195 | + for (Packet p : sendList) { | ||
196 | + if (p.needSend() && !isSend) {// 按照顺序发送 | ||
197 | + p.addSendCount(); | ||
198 | + sendPacket(p); | ||
199 | + isSend = true; | ||
200 | + } | ||
201 | + if (p.needSend() && isSend && p.isSync()) {// 并行发送 | ||
202 | + sleepTimes(50);// 模块不能发送太快 | ||
203 | + p.addSendCount(); | ||
204 | + sendPacket(p); | ||
205 | + } | ||
206 | + if (!p.needSend() && (p.getOnSendPacket() != null)) { | ||
207 | + p.getOnSendPacket().onFail(p); | ||
208 | + } | ||
209 | + } | ||
210 | + if (!isSend) { | ||
211 | + LogUtil.i(TAG, "没有要提交的数据,检查是否有查询包发送"); | ||
212 | + if (innerList.size() > 0) { | ||
213 | + synchronized (innerList) { | ||
214 | + for (Packet packet : innerList) { | ||
215 | + sendPacket(packet); | ||
216 | + sleepTimes(50); | ||
217 | + } | ||
218 | + } | ||
219 | + } | ||
220 | + } | ||
221 | + | ||
222 | + if (!isSend) {// 没有数据发送? 那就发送心跳吧 | ||
223 | + LogUtil.i(TAG, "没有任何数据要发送,则发送心跳包"); | ||
224 | + sendData(new HeartBeat((byte) batteryLevel, (byte) 0).toBytes()); | ||
225 | + } | ||
226 | + // 轮询下一次发送数据 | ||
227 | + taskHandler.removeCallbacks(this); | ||
228 | + taskHandler.postDelayed(this, 1000); | ||
229 | + } | ||
230 | + }; | ||
231 | + | ||
232 | + private void doWith(byte[] datas) { | ||
233 | + onDataReceiver.onDataReceiver(datas); | ||
234 | + switch (datas[4] & 0xFF) { | ||
235 | + case Cons.CMD_CHECK_BASE_STATUS_RESPONSE: | ||
236 | + checkBaseStatusResponse(datas); | ||
237 | + break; | ||
238 | + case Cons.CMD_VOTE_RESULT_SEND_RESPONSE: | ||
239 | + voteResultSendResponse(datas); | ||
240 | + break; | ||
241 | + case Cons.CMD_FIRM_UPDATE_RESPONSE: | ||
242 | + firmUpdateResponse(datas); | ||
243 | + break; | ||
244 | + | ||
245 | + case Cons.CMD_BASE_STATUS_CHANGE: | ||
246 | + baseStatusChange(datas); | ||
247 | + break; | ||
248 | + case Cons.CMD_VOTE_STATUS_CHANGE: | ||
249 | + voteStatusChange(datas); | ||
250 | + break; | ||
251 | + case Cons.CMD_VOTE_SEND_SUCCESS_RESPONSE: | ||
252 | + voteSendSuccessResponse(datas); | ||
253 | + break; | ||
254 | + | ||
255 | + case Cons.CMD_UPLOAD_DATA_RESPONSE: | ||
256 | + uploadDataResponse(datas); | ||
257 | + break; | ||
258 | + case Cons.CMD_TRANSPARENT_TRANSMISSION: | ||
259 | + transparentTransmission(datas); | ||
260 | + break; | ||
261 | + case Cons.CMD_MULTI_PCKAGE_DOWNLOAD: | ||
262 | + break; | ||
263 | + case Cons.CMD_COM_COMMUNICATION_TEST_RESPONSE: | ||
264 | + break; | ||
265 | + | ||
266 | + } | ||
267 | + } | ||
268 | + | ||
269 | + private void transparentTransmission(byte[] datas) { | ||
270 | + } | ||
271 | + | ||
272 | + private void uploadDataResponse(byte[] datas) { | ||
273 | + } | ||
274 | + | ||
275 | + private void voteSendSuccessResponse(byte[] datas) { | ||
276 | + responseChange(datas, 4, (byte) 0xF3); | ||
277 | + int serialNo = datas[5] & 0xff; | ||
278 | + Packet packet = XpadApiServiceInfoProxyManager.getInstance().findPacket(serialNo); | ||
279 | + if (packet != null && packet.getOnSendPacket() != null) { | ||
280 | + packet.getOnSendPacket().onSuccess(packet); | ||
281 | + } | ||
282 | + } | ||
283 | + | ||
284 | + private void sendInnerPacket(Packet packet) { | ||
285 | + synchronized (innerList) { | ||
286 | + for (Packet temp : innerList) { | ||
287 | + if (temp.getSendNo() == packet.getSendNo()) { | ||
288 | + return; | ||
289 | + } | ||
290 | + } | ||
291 | + innerList.add(packet); | ||
292 | + } | ||
293 | + immediately(); | ||
294 | + } | ||
295 | + | ||
296 | + public void immediately(){ | ||
297 | + taskHandler.removeCallbacks(sendTask); | ||
298 | + taskHandler.post(sendTask); | ||
299 | + } | ||
300 | + | ||
301 | + private void voteStatusChange(byte[] datas) { | ||
302 | + responseChange(datas, 4, (byte) 0xF2); | ||
303 | + saveVoteInfo(datas); | ||
304 | + } | ||
305 | + | ||
306 | + private void baseStatusChange(byte[] datas) { | ||
307 | + responseChange(datas, 4, (byte) 0xF1); | ||
308 | + saveBaseInfo(datas); | ||
309 | + } | ||
310 | + | ||
311 | + private void firmUpdateResponse(byte[] datas) { | ||
312 | + } | ||
313 | + | ||
314 | + private void voteResultSendResponse(byte[] datas) { | ||
315 | + | ||
316 | + } | ||
317 | + | ||
318 | + private void checkBaseStatusResponse(byte[] datas) { | ||
319 | + switch (datas[5] & 0xFF) { | ||
320 | + case 1://当前工作模式和版本 | ||
321 | + case 2://当前工作模式和版本 | ||
322 | + saveModelInfo(datas); | ||
323 | + break; | ||
324 | + case 3: | ||
325 | + saveBaseInfo(datas); | ||
326 | + break; | ||
327 | + case 4: | ||
328 | + saveVoteInfo(datas); | ||
329 | + break; | ||
330 | + case 5: | ||
331 | + case 6: | ||
332 | + saveKeypadInfo(datas); | ||
333 | + break; | ||
334 | + case 7: | ||
335 | + saveOnLineInfo(datas); | ||
336 | + break; | ||
337 | + case 8: | ||
338 | + case 9: | ||
339 | + saveKeypadInfo(datas); | ||
340 | + break; | ||
341 | + } | ||
342 | + } | ||
343 | + | ||
344 | + private void saveOnLineInfo(byte[] datas) { | ||
345 | + OnLineInfo info = new OnLineInfo(); | ||
346 | + info.setOnLine(datas[6] & 0xff); | ||
347 | + info.setIdMode(datas[7] & 0xff); | ||
348 | + info.setChan(datas[8] & 0xff); | ||
349 | + info.setRssi(datas[9] & 0xff); | ||
350 | + info.setTx(datas[10] & 0xff); | ||
351 | + info.setRx(datas[11] & 0xff); | ||
352 | + info.setBaseId(datas[12] & 0xff); | ||
353 | + info.setKeyId(((datas[13] & 0xff) << 8) | (datas[14] & 0xff)); | ||
354 | + byte[] sn = Arrays.copyOfRange(datas, 15, 21); | ||
355 | + info.setKeySn(ByteUtils.getKeySn(sn)); | ||
356 | + XpadApiServiceInfoProxyManager.getInstance().setOnLineInfo(info); | ||
357 | + } | ||
358 | + | ||
359 | + private void saveKeypadInfo(byte[] datas) { | ||
360 | + KeypadInfo info = new KeypadInfo(); | ||
361 | + info.setOk(datas[6] & 0xff); | ||
362 | + info.setChan(datas[7] & 0xff); | ||
363 | + info.setKeyId(((datas[8] & 0xff) << 8) | (datas[9] & 0xff)); | ||
364 | + byte[] sn = Arrays.copyOfRange(datas, 10, 16); | ||
365 | + info.setKeySn(ByteUtils.getKeySn(sn)); | ||
366 | + byte[] mc = Arrays.copyOfRange(datas, 16, 19); | ||
367 | + info.setMatchCode(new String(mc)); | ||
368 | + XpadApiServiceInfoProxyManager.getInstance().setKeypadInfo(info); | ||
369 | + } | ||
370 | + | ||
371 | + private void saveVoteInfo(byte[] datas) { | ||
372 | + BaseVoteInfo info = new BaseVoteInfo(); | ||
373 | + info.setBaseId(datas[1] & 0xff); | ||
374 | + info.setNowT(datas[2] & 0xff << 8 | datas[3] & 0xff); | ||
375 | + info.setDataPos(datas[4] & 0xff); | ||
376 | + info.setMode(datas[5] & 0xff); | ||
377 | + info.setModes(datas); | ||
378 | + XpadApiServiceInfoProxyManager.getInstance().setBaseVoteInfo(info); | ||
379 | + } | ||
380 | + | ||
381 | + /** | ||
382 | + * 保存基础信标信息 | ||
383 | + * | ||
384 | + * @param data | ||
385 | + */ | ||
386 | + private void saveBaseInfo(byte[] data) { | ||
387 | + BaseInfo info = new BaseInfo(); | ||
388 | + info.setBaseId(data[5] & 0xff);// baseID | ||
389 | + info.setIdMode(data[6] & 0xff); | ||
390 | + info.setConfId(((data[7] & 0xff) << 8) | (data[8] & 0xff)); | ||
391 | + info.setBillId(data[9] & 0xff); | ||
392 | + info.setAuthCode((data[10] & 0xff) << 8 | (data[11] & 0xff)); | ||
393 | + info.setLogin(data[12] & 0xff); | ||
394 | + info.setReport(data[13] & 0xff); | ||
395 | + info.setOffTime(data[14] & 0xff); | ||
396 | + info.setAttrib(data[15] & 0xff); | ||
397 | + info.setPageNo((data[16] & 0xff) << 8 | (data[17] & 0xff)); | ||
398 | + byte[] bname = Arrays.copyOfRange(data, 16, 16 + 12); | ||
399 | + info.setBaseName(new String(bname)); | ||
400 | + XpadApiServiceInfoProxyManager.getInstance().setBaseInfo(info); | ||
401 | + } | ||
402 | + | ||
403 | + private void saveModelInfo(byte[] datas) { | ||
404 | + ModelInfo info = new ModelInfo(); | ||
405 | + info.setMode(datas[6] & 0xff); | ||
406 | + info.sethModel(datas[7] & 0xff); | ||
407 | + info.setsVer((datas[8] & 0xff) + "." + (datas[9] & 0xff) + "." + (datas[10] & 0xff)); | ||
408 | + XpadApiServiceInfoProxyManager.getInstance().setModelInfo(info); | ||
409 | + } | ||
410 | + | ||
411 | + | ||
412 | + private void responseChange(byte[] data, int pos, byte res) { | ||
413 | + byte[] retData = Arrays.copyOf(data, data.length); | ||
414 | + retData[pos] = res; | ||
415 | + sendData(data); | ||
416 | + } | ||
417 | + | ||
418 | + private void roundCRC(byte[] data) { | ||
419 | + int crcValue = Crc16.getUnsignedShort(Crc16.crc16(data, data.length - 4 - 2)); | ||
420 | + data[data.length - 2] = (byte) (crcValue >> 8); | ||
421 | + data[data.length - 1] = (byte) (crcValue); | ||
422 | + } | ||
423 | + | ||
424 | + public void sendPacket(Packet packet) { | ||
425 | + sendData(packet.getDatas()); | ||
426 | + } | ||
427 | + | ||
428 | + public void sendData(byte[] datas) { | ||
429 | + roundCRC(datas); | ||
430 | + onDataReceiver.onDataSender(datas); | ||
431 | + try { | ||
432 | + SDKProcessWork.getInstance().execute(datas,datas.length); | ||
433 | + } catch (Exception e) { | ||
434 | + LogUtil.e(TAG, e); | ||
435 | + } | ||
436 | + } | ||
437 | + | ||
438 | + private void sleepTimes(long times) { | ||
439 | + try { | ||
440 | + Thread.sleep(times); | ||
441 | + } catch (Exception e) { | ||
442 | + e.printStackTrace(); | ||
443 | + } | ||
444 | + } | ||
445 | + | ||
446 | + BroadcastReceiver batteryLevelRcvr = new BroadcastReceiver() { | ||
447 | + | ||
448 | + public void onReceive(Context context, Intent intent) { | ||
449 | + if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) { | ||
450 | + int rawlevel = intent.getIntExtra("level", -1); | ||
451 | + int scale = intent.getIntExtra("scale", -1); | ||
452 | + int status = intent.getIntExtra("status", -1); | ||
453 | + int health = intent.getIntExtra("health", -1); | ||
454 | + int voltage = intent.getIntExtra("voltage", 0); | ||
455 | + int level = -1; // percentage, or -1 for unknown | ||
456 | + if (rawlevel >= 0 && scale > 0) { | ||
457 | + level = (rawlevel * 100) / scale; | ||
458 | + } | ||
459 | + | ||
460 | + float val = (float) voltage / 1000; | ||
461 | + batteryLevel = (int) (val / 0.04); | ||
462 | + | ||
463 | + } | ||
464 | + } | ||
465 | + }; | ||
466 | + | ||
467 | + public void getKeypadParam() { | ||
468 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
469 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
470 | + mBuffer[0] = (byte) 0xF5; | ||
471 | + mBuffer[1] = (byte) 0xAA; | ||
472 | + mBuffer[2] = (byte) 0xAA; | ||
473 | + mBuffer[3] = (byte) 0x1F; | ||
474 | + | ||
475 | + mBuffer[4] = 0x70; | ||
476 | + mBuffer[5] = 0x05; | ||
477 | + Packet packet = new Packet(); | ||
478 | + packet.setDatas(mBuffer); | ||
479 | + packet.setSendNo(Packet.GetKeypadParam); | ||
480 | + sendInnerPacket(packet); | ||
481 | + } | ||
482 | + | ||
483 | + public void getWorkMode() { | ||
484 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
485 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
486 | + mBuffer[0] = (byte) 0xF5; | ||
487 | + mBuffer[1] = (byte) 0xAA; | ||
488 | + mBuffer[2] = (byte) 0xAA; | ||
489 | + mBuffer[3] = (byte) 0x1F; | ||
490 | + mBuffer[4] = 0x70; | ||
491 | + mBuffer[5] = 0x01; | ||
492 | + Packet packet = new Packet(); | ||
493 | + packet.setDatas(mBuffer); | ||
494 | + packet.setSendNo(Packet.GetWorkModeNum); | ||
495 | + sendInnerPacket(packet); | ||
496 | + } | ||
497 | + | ||
498 | + public void setWorkMode(int iMode) { | ||
499 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
500 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
501 | + mBuffer[0] = (byte) 0xF5; | ||
502 | + mBuffer[1] = (byte) 0xAA; | ||
503 | + mBuffer[2] = (byte) 0xAA; | ||
504 | + mBuffer[3] = (byte) 0x1F; | ||
505 | + mBuffer[4] = 0x70; | ||
506 | + mBuffer[5] = 0x02; | ||
507 | + mBuffer[6] = (byte) iMode; | ||
508 | + Packet packet = new Packet(); | ||
509 | + packet.setDatas(mBuffer); | ||
510 | + packet.setSendNo(Packet.SetWorkModeNum); | ||
511 | + sendInnerPacket(packet); | ||
512 | + } | ||
513 | + | ||
514 | + public void getBaseStatus() { | ||
515 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
516 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
517 | + mBuffer[0] = (byte) 0xF5; | ||
518 | + mBuffer[1] = (byte) 0xAA; | ||
519 | + mBuffer[2] = (byte) 0xAA; | ||
520 | + mBuffer[3] = (byte) 0x1F; | ||
521 | + mBuffer[4] = 0x70; | ||
522 | + mBuffer[5] = 0x03; | ||
523 | + Packet packet = new Packet(); | ||
524 | + packet.setDatas(mBuffer); | ||
525 | + packet.setSendNo(Packet.BaseStatusNum); | ||
526 | + sendInnerPacket(packet); | ||
527 | + } | ||
528 | + | ||
529 | + public void getVoteStatus() { | ||
530 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
531 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
532 | + mBuffer[0] = (byte) 0xF5; | ||
533 | + mBuffer[1] = (byte) 0xAA; | ||
534 | + mBuffer[2] = (byte) 0xAA; | ||
535 | + mBuffer[3] = (byte) 0x1F; | ||
536 | + mBuffer[4] = 0x70; | ||
537 | + mBuffer[5] = 0x04; | ||
538 | + Packet packet = new Packet(); | ||
539 | + packet.setDatas(mBuffer); | ||
540 | + packet.setSendNo(Packet.VoteStatusNum); | ||
541 | + sendInnerPacket(packet); | ||
542 | + } | ||
543 | + | ||
544 | + public void execKeypadMatch(int iMode, int channal) { | ||
545 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
546 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
547 | + mBuffer[0] = (byte) 0xF5; | ||
548 | + mBuffer[1] = (byte) 0xAA; | ||
549 | + mBuffer[2] = (byte) 0xAA; | ||
550 | + mBuffer[3] = (byte) 0x1F; | ||
551 | + mBuffer[4] = 0x70; | ||
552 | + mBuffer[5] = 0x08; | ||
553 | + mBuffer[6] = (byte) iMode; | ||
554 | + mBuffer[7] = (byte) channal; | ||
555 | + Packet packet = new Packet(); | ||
556 | + packet.setDatas(mBuffer); | ||
557 | + packet.setSendNo(Packet.ExecKeypadMatchNum); | ||
558 | + sendInnerPacket(packet); | ||
559 | + } | ||
560 | + | ||
561 | + public void comCommunicationTest(int sendn, int okn) { | ||
562 | + byte[] mBuffer = new byte[0x1F + 4]; | ||
563 | + Arrays.fill(mBuffer, (byte) 0x0); | ||
564 | + mBuffer[0] = (byte) 0xF5; | ||
565 | + mBuffer[1] = (byte) 0xAA; | ||
566 | + mBuffer[2] = (byte) 0xAA; | ||
567 | + mBuffer[3] = (byte) 0x1F; | ||
568 | + mBuffer[4] = 0x30; | ||
569 | + mBuffer[5] = 0x0; | ||
570 | + mBuffer[6] = 0x0; | ||
571 | + mBuffer[7] = 7; | ||
572 | + mBuffer[8] = (byte) sendn; | ||
573 | + mBuffer[9] = (byte) okn; | ||
574 | + mBuffer[10] = (byte) 0xAA; | ||
575 | + | ||
576 | + for (int i = 1; i < 17; i++) { | ||
577 | + mBuffer[10 + i] = (byte) i; | ||
578 | + } | ||
579 | + | ||
580 | + Packet packet = new Packet(); | ||
581 | + packet.setDatas(mBuffer); | ||
582 | + packet.setSendNo(Packet.CommunicationTestMatchNum); | ||
583 | + sendInnerPacket(packet); | ||
584 | + } | ||
585 | + | ||
586 | +} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/XpadApiServiceInfoProxyManager.java
0 → 100644
1 | +package com.sunvote.xpadapi.service; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.bean.BaseInfo; | ||
4 | +import com.sunvote.xpadapi.service.bean.BaseVoteInfo; | ||
5 | +import com.sunvote.xpadapi.service.bean.KeypadInfo; | ||
6 | +import com.sunvote.xpadapi.service.bean.ModelInfo; | ||
7 | +import com.sunvote.xpadapi.service.bean.OnLineInfo; | ||
8 | +import com.sunvote.xpadapi.service.bean.Packet; | ||
9 | +import com.sunvote.xpadapi.service.listener.BaseInfoChanageListener; | ||
10 | +import com.sunvote.xpadapi.service.listener.BaseVoteInfoChanageListener; | ||
11 | +import com.sunvote.xpadapi.service.listener.KeyPadinfoChanageListener; | ||
12 | +import com.sunvote.xpadapi.service.listener.ModelInfoChanageListener; | ||
13 | +import com.sunvote.xpadapi.service.listener.OnSendPacket; | ||
14 | +import com.sunvote.xpadapi.service.listener.OnlineInfoChanageListener; | ||
15 | +import com.sunvote.xpadapi.util.LogUtil; | ||
16 | + | ||
17 | +import java.util.ArrayList; | ||
18 | +import java.util.Collections; | ||
19 | +import java.util.List; | ||
20 | + | ||
21 | +/** | ||
22 | + * 服务信息 | ||
23 | + */ | ||
24 | +public final class XpadApiServiceInfoProxyManager { | ||
25 | + | ||
26 | + public static final String TAG = XpadApiServiceInfoProxyManager.class.getSimpleName(); | ||
27 | + private static XpadApiServiceInfoProxyManager instance = null ; | ||
28 | + private List<Packet> sendList = Collections.synchronizedList(new ArrayList<Packet>()); | ||
29 | + private Object lock = new Object(); | ||
30 | + private String charset = "GB2312" ; | ||
31 | + private XpadApiService service; | ||
32 | + | ||
33 | + public void setCharset(String charset) { | ||
34 | + this.charset = charset; | ||
35 | + } | ||
36 | + | ||
37 | + public void setService(XpadApiService service) { | ||
38 | + this.service = service; | ||
39 | + } | ||
40 | + | ||
41 | + public XpadApiService getService() { | ||
42 | + return service; | ||
43 | + } | ||
44 | + | ||
45 | + public String getCharset() { | ||
46 | + return charset; | ||
47 | + } | ||
48 | + | ||
49 | + private XpadApiServiceInfoProxyManager(){ | ||
50 | + } | ||
51 | + | ||
52 | + public static XpadApiServiceInfoProxyManager getInstance(){ | ||
53 | + if(instance == null){ | ||
54 | + synchronized(XpadApiServiceInfoProxyManager.class){ | ||
55 | + if(instance == null){ | ||
56 | + instance = new XpadApiServiceInfoProxyManager(); | ||
57 | + } | ||
58 | + } | ||
59 | + } | ||
60 | + return instance; | ||
61 | + } | ||
62 | + | ||
63 | + private ModelInfo modelInfo; | ||
64 | + private ModelInfoChanageListener modelInfoListener; | ||
65 | + | ||
66 | + public void setModelInfo(ModelInfo modelInfo) { | ||
67 | + if(modelInfoListener != null){ | ||
68 | + try{ | ||
69 | + modelInfoListener.onModelInfoChanage(modelInfo); | ||
70 | + }catch (Exception ex){ | ||
71 | + LogUtil.e(TAG,"onModelInfoChanage",ex); | ||
72 | + } | ||
73 | + } | ||
74 | + this.modelInfo = modelInfo; | ||
75 | + } | ||
76 | + | ||
77 | + public ModelInfo getModelInfo() { | ||
78 | + return modelInfo; | ||
79 | + } | ||
80 | + | ||
81 | + public void setModelInfoListener(ModelInfoChanageListener modelInfoListener) { | ||
82 | + this.modelInfoListener = modelInfoListener; | ||
83 | + } | ||
84 | + | ||
85 | + private BaseInfo baseInfo; | ||
86 | + private BaseInfoChanageListener baseInfoListener; | ||
87 | + | ||
88 | + public void setBaseInfo(BaseInfo baseInfo) { | ||
89 | + if(baseInfoListener != null){ | ||
90 | + try { | ||
91 | + baseInfoListener.onBaseInfoChange(baseInfo); | ||
92 | + }catch (Exception ex){ | ||
93 | + LogUtil.e(TAG,"onBaseInfoChange",ex); | ||
94 | + } | ||
95 | + } | ||
96 | + this.baseInfo = baseInfo; | ||
97 | + } | ||
98 | + | ||
99 | + public BaseInfo getBaseInfo() { | ||
100 | + return baseInfo; | ||
101 | + } | ||
102 | + | ||
103 | + public void setBaseInfoListener(BaseInfoChanageListener baseInfoListener) { | ||
104 | + this.baseInfoListener = baseInfoListener; | ||
105 | + } | ||
106 | + | ||
107 | + private BaseVoteInfo baseVoteInfo; | ||
108 | + private BaseVoteInfoChanageListener baseVoteInfoListener; | ||
109 | + | ||
110 | + public void setBaseVoteInfo(BaseVoteInfo baseVoteInfo) { | ||
111 | + if(baseVoteInfoListener != null){ | ||
112 | + try { | ||
113 | + baseVoteInfoListener.onBaseVoteInfoListener(baseVoteInfo); | ||
114 | + }catch (Exception ex){ | ||
115 | + LogUtil.e(TAG,"onBaseVoteInfoListener",ex); | ||
116 | + } | ||
117 | + } | ||
118 | + this.baseVoteInfo = baseVoteInfo; | ||
119 | + } | ||
120 | + | ||
121 | + public BaseVoteInfo getBaseVoteInfo() { | ||
122 | + return baseVoteInfo; | ||
123 | + } | ||
124 | + | ||
125 | + public void setBaseVoteInfoListener(BaseVoteInfoChanageListener baseVoteInfoListener) { | ||
126 | + this.baseVoteInfoListener = baseVoteInfoListener; | ||
127 | + } | ||
128 | + | ||
129 | + private KeypadInfo keypadInfo; | ||
130 | + private KeyPadinfoChanageListener keyPadinfoChanageListener; | ||
131 | + | ||
132 | + public void setKeypadInfo(KeypadInfo keypadInfo) { | ||
133 | + if(keyPadinfoChanageListener != null){ | ||
134 | + try{ | ||
135 | + keyPadinfoChanageListener.onKeyPadinfoChanage(keypadInfo); | ||
136 | + }catch (Exception ex){ | ||
137 | + LogUtil.e(TAG,"onKeyPadinfoChanage",ex); | ||
138 | + } | ||
139 | + } | ||
140 | + this.keypadInfo = keypadInfo; | ||
141 | + } | ||
142 | + | ||
143 | + public KeypadInfo getKeypadInfo() { | ||
144 | + if(keypadInfo == null){ | ||
145 | + keypadInfo = new KeypadInfo(); | ||
146 | + } | ||
147 | + return keypadInfo; | ||
148 | + } | ||
149 | + | ||
150 | + public void setKeyPadinfoChanageListener(KeyPadinfoChanageListener keyPadinfoChanageListener) { | ||
151 | + this.keyPadinfoChanageListener = keyPadinfoChanageListener; | ||
152 | + } | ||
153 | + | ||
154 | + private OnLineInfo onLineInfo; | ||
155 | + private OnlineInfoChanageListener onlineInfoChanageListener; | ||
156 | + | ||
157 | + public void setOnLineInfo(OnLineInfo onLineInfo) { | ||
158 | + if(onlineInfoChanageListener != null){ | ||
159 | + try{ | ||
160 | + onlineInfoChanageListener.onOnlineInfoChanage(onLineInfo); | ||
161 | + }catch (Exception ex){ | ||
162 | + LogUtil.e(TAG,"onOnlineInfoChanage",ex); | ||
163 | + } | ||
164 | + } | ||
165 | + this.onLineInfo = onLineInfo; | ||
166 | + } | ||
167 | + | ||
168 | + public OnLineInfo getOnLineInfo() { | ||
169 | + return onLineInfo; | ||
170 | + } | ||
171 | + | ||
172 | + public void setOnlineInfoChanageListener(OnlineInfoChanageListener onlineInfoChanageListener) { | ||
173 | + this.onlineInfoChanageListener = onlineInfoChanageListener; | ||
174 | + } | ||
175 | + | ||
176 | + public void sendPacket(byte[] datas,final OnSendPacket sendPacket){ | ||
177 | + Packet packet = new Packet(); | ||
178 | + packet.setDatas(datas); | ||
179 | + packet.setSendNo(datas[5] & 0xFF); | ||
180 | + packet.setOnSendPacket(new OnSendPacket() { | ||
181 | + @Override | ||
182 | + public void onSuccess(Packet packet) { | ||
183 | + synchronized (lock){ | ||
184 | + sendList.remove(packet); | ||
185 | + } | ||
186 | + try{ | ||
187 | + sendPacket.onSuccess(packet); | ||
188 | + }catch (Exception ex){ | ||
189 | + LogUtil.e(TAG,"sendPacket.onSuccess",ex); | ||
190 | + } | ||
191 | + } | ||
192 | + | ||
193 | + @Override | ||
194 | + public void onFail(Packet packet) { | ||
195 | + synchronized (lock){ | ||
196 | + sendList.remove(packet); | ||
197 | + } | ||
198 | + try{ | ||
199 | + sendPacket.onFail(packet); | ||
200 | + }catch (Exception ex){ | ||
201 | + LogUtil.e(TAG,"sendPacket.onFail",ex); | ||
202 | + } | ||
203 | + } | ||
204 | + }); | ||
205 | + synchronized (lock){ | ||
206 | + if(!exsit(packet)){ | ||
207 | + sendList.add(packet); | ||
208 | + } | ||
209 | + } | ||
210 | + if(service != null){ | ||
211 | + service.immediately(); | ||
212 | + } | ||
213 | + } | ||
214 | + | ||
215 | + public List<Packet> getSendList() { | ||
216 | + return sendList; | ||
217 | + } | ||
218 | + | ||
219 | + private boolean exsit(Packet packet){ | ||
220 | + for(Packet packet1: sendList){ | ||
221 | + if(packet.getSendNo() == packet1.getSendNo()){ | ||
222 | + return true; | ||
223 | + } | ||
224 | + } | ||
225 | + return false; | ||
226 | + } | ||
227 | + | ||
228 | + public Packet findPacket(int sendNo){ | ||
229 | + for(Packet packet: sendList){ | ||
230 | + if(packet.getSendNo() == sendNo){ | ||
231 | + return packet; | ||
232 | + } | ||
233 | + } | ||
234 | + return null; | ||
235 | + } | ||
236 | +} |
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/bean/BaseInfo.java
0 → 100644
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
0 → 100644
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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
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
0 → 100644
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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
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
0 → 100644
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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.SerialManager; | ||
4 | +import com.sunvote.xpadapi.service.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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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
0 → 100644
1 | +package com.sunvote.xpadapi.service.bean; | ||
2 | + | ||
3 | +import com.sunvote.xpadapi.service.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/BaseInfoChanageListener.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/BaseVoteInfoChanageListener.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/IModesVoteInfo.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/KeyPadinfoChanageListener.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/ModelInfoChanageListener.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnDataReceiver.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnSendPacket.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnSender.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/service/listener/OnlineInfoChanageListener.java
0 → 100644
C5/xpadapi/src/main/java/com/sunvote/xpadapi/usb/UsbTransferManager.java
0 → 100644
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
0 → 100644
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
0 → 100644
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
0 → 100644
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/java/com/sunvote/xpadapi/util/LogUtil.java
0 → 100644
1 | +package com.sunvote.xpadapi.util; | ||
2 | + | ||
3 | +import android.os.Environment; | ||
4 | +import android.util.Log; | ||
5 | + | ||
6 | +import java.io.File; | ||
7 | +import java.io.FileWriter; | ||
8 | +import java.io.IOException; | ||
9 | +import java.text.SimpleDateFormat; | ||
10 | +import java.util.Date; | ||
11 | + | ||
12 | +public class LogUtil { | ||
13 | + | ||
14 | + private static FileWriter fileWriter; | ||
15 | + | ||
16 | + public static final int VERBOSE_LEVER = 2; | ||
17 | + public static final int DEBUG_LEVER = 3; | ||
18 | + public static final int INFO_LEVER = 4; | ||
19 | + public static final int WARN_LEVER = 5; | ||
20 | + public static final int ERROR_LEVER = 6; | ||
21 | + public static final int ASSERT_LEVER = 7; | ||
22 | + | ||
23 | + public static int lever = VERBOSE_LEVER - 1 ; | ||
24 | + | ||
25 | + private static boolean logToFile = false; | ||
26 | + private static boolean logToLogcat = true ; | ||
27 | + | ||
28 | + private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH.mm.ss.SSS"); | ||
29 | + | ||
30 | + LogUtil() { | ||
31 | + throw new RuntimeException("Stub!"); | ||
32 | + } | ||
33 | + | ||
34 | + public static int v(String tag, String msg) { | ||
35 | + if (VERBOSE_LEVER > lever) { | ||
36 | + if(logToLogcat){ | ||
37 | + Log.v(tag, msg); | ||
38 | + } | ||
39 | + inputToFile("(V):" + msg ); | ||
40 | + } | ||
41 | + return -1; | ||
42 | + } | ||
43 | + | ||
44 | + private static void init(){ | ||
45 | + if(fileWriter == null){ | ||
46 | + synchronized (LogUtil.class) { | ||
47 | + if(fileWriter == null) { | ||
48 | + try { | ||
49 | + File path = new File(Environment.getExternalStorageDirectory().getPath() + "/sunvote/log"); | ||
50 | + if (!path.exists()) { | ||
51 | + path.mkdirs(); | ||
52 | + } | ||
53 | + File file = new File(Environment.getExternalStorageDirectory().getPath() | ||
54 | + + "/sunvote/log/" + simpleDateFormat.format(new Date())+".txt"); | ||
55 | + if (!file.exists()) { | ||
56 | + file.createNewFile(); | ||
57 | + } | ||
58 | + fileWriter = new FileWriter(file, true); | ||
59 | + | ||
60 | + } catch (Exception ex) { | ||
61 | + ex.printStackTrace(); | ||
62 | + fileWriter = null; | ||
63 | + } | ||
64 | + } | ||
65 | + } | ||
66 | + } | ||
67 | + } | ||
68 | + | ||
69 | + public static void enableLogToFile(){ | ||
70 | + logToFile = true; | ||
71 | + } | ||
72 | + | ||
73 | + public static void disabelLogToFile(){ | ||
74 | + logToFile = false; | ||
75 | + } | ||
76 | + | ||
77 | + public static void enableLogToLogcat(){ | ||
78 | + logToLogcat = true; | ||
79 | + } | ||
80 | + | ||
81 | + public static void disableLogToLogcat(){ | ||
82 | + logToLogcat = false; | ||
83 | + } | ||
84 | + | ||
85 | + public static void enableLog(){ | ||
86 | + lever = VERBOSE_LEVER - 1; | ||
87 | + } | ||
88 | + | ||
89 | + public static void disableLog(){ | ||
90 | + lever = ASSERT_LEVER ; | ||
91 | + } | ||
92 | + | ||
93 | + public static int v(String tag, String msg, Throwable tr) { | ||
94 | + if(VERBOSE_LEVER > lever){ | ||
95 | + if(logToLogcat) { | ||
96 | + Log.v(tag, msg, tr); | ||
97 | + } | ||
98 | + inputToFile("(V):" + msg + Log.getStackTraceString(tr)); | ||
99 | + } | ||
100 | + return -1; | ||
101 | + } | ||
102 | + | ||
103 | + public static int d(String tag, String msg) { | ||
104 | + if(DEBUG_LEVER > lever){ | ||
105 | + if(logToLogcat) { | ||
106 | + Log.d(tag, msg); | ||
107 | + } | ||
108 | + inputToFile("(D):" + msg ); | ||
109 | + } | ||
110 | + return -1; | ||
111 | + } | ||
112 | + | ||
113 | + public static int d(String tag, String msg, Throwable tr) { | ||
114 | + if(DEBUG_LEVER > lever){ | ||
115 | + if(logToLogcat){ | ||
116 | + Log.d(tag,msg,tr); | ||
117 | + } | ||
118 | + inputToFile("(D):" + msg + Log.getStackTraceString(tr)); | ||
119 | + } | ||
120 | + return -1; | ||
121 | + } | ||
122 | + | ||
123 | + public static int i(String tag, String msg) { | ||
124 | + if(INFO_LEVER > lever){ | ||
125 | + if(logToLogcat){ | ||
126 | + Log.i(tag,msg); | ||
127 | + } | ||
128 | + inputToFile("(I):" + msg ); | ||
129 | + } | ||
130 | + return -1; | ||
131 | + } | ||
132 | + | ||
133 | + public static int i(String tag, String msg, Throwable tr) { | ||
134 | + if(INFO_LEVER > lever){ | ||
135 | + if(logToLogcat){ | ||
136 | + Log.i(tag,msg,tr); | ||
137 | + } | ||
138 | + inputToFile("(I):" + msg + Log.getStackTraceString(tr)); | ||
139 | + } | ||
140 | + return -1; | ||
141 | + } | ||
142 | + | ||
143 | + public static int i(String tag,byte[] msg){ | ||
144 | + String msgStr = ByteUtils.bytesToHexString(msg); | ||
145 | + return i(tag,msgStr); | ||
146 | + } | ||
147 | + | ||
148 | + public static int i(String tag,String msgTag, byte[] msg){ | ||
149 | + String msgStr = ByteUtils.bytesToHexString(msg); | ||
150 | + return i(tag,msgTag + ":\r\n" + msgStr); | ||
151 | + } | ||
152 | + | ||
153 | + public static int v(String tag,String msgTag, byte[] msg){ | ||
154 | + String msgStr = ByteUtils.bytesToHexString(msg); | ||
155 | + return v(tag,msgTag + ":\r\n" + msgStr); | ||
156 | + } | ||
157 | + | ||
158 | + public static int i(String tag,String msgTag, byte[] msg,int length){ | ||
159 | + String msgStr = ByteUtils.bytesToHexString(msg,length); | ||
160 | + return i(tag,msgTag + ":\r\n" + msgStr); | ||
161 | + } | ||
162 | + | ||
163 | + public static int v(String tag,String msgTag, byte[] msg,int length){ | ||
164 | + String msgStr = ByteUtils.bytesToHexString(msg,length); | ||
165 | + return v(tag,msgTag + ":\r\n" + msgStr); | ||
166 | + } | ||
167 | + | ||
168 | + public static int i(String tag,byte[] msg,Throwable tr){ | ||
169 | + String msgStr = ByteUtils.bytesToHexString(msg); | ||
170 | + return i(tag,msgStr,tr); | ||
171 | + } | ||
172 | + | ||
173 | + public static int i(String tag,String msgTag,byte[] msg,Throwable tr){ | ||
174 | + String msgStr = ByteUtils.bytesToHexString(msg); | ||
175 | + return i(tag,msgTag + ":\r\n" + msgStr,tr); | ||
176 | + } | ||
177 | + | ||
178 | + public static int w(String tag, String msg) { | ||
179 | + if(WARN_LEVER > lever){ | ||
180 | + if(logToLogcat){ | ||
181 | + Log.w(tag,msg); | ||
182 | + } | ||
183 | + inputToFile("(V):" + msg); | ||
184 | + } | ||
185 | + return -1; | ||
186 | + } | ||
187 | + | ||
188 | + public static int w(String tag, String msg, Throwable tr) { | ||
189 | + if(WARN_LEVER > lever){ | ||
190 | + if(logToLogcat){ | ||
191 | + Log.w(tag,msg,tr); | ||
192 | + } | ||
193 | + inputToFile("(W):" + msg + Log.getStackTraceString(tr)); | ||
194 | + } | ||
195 | + return -1; | ||
196 | + } | ||
197 | + | ||
198 | + public static boolean isLoggable(String s, int i){ | ||
199 | + return Log.isLoggable(s,i); | ||
200 | + } | ||
201 | + | ||
202 | + public static int w(String tag, Throwable tr) { | ||
203 | + if(WARN_LEVER > lever){ | ||
204 | + if(logToLogcat){ | ||
205 | + Log.w(tag,tr); | ||
206 | + } | ||
207 | + inputToFile("(W):" + Log.getStackTraceString(tr)); | ||
208 | + } | ||
209 | + return -1; | ||
210 | + } | ||
211 | + | ||
212 | + public static int e(String tag, String msg) { | ||
213 | + if(ERROR_LEVER > lever){ | ||
214 | + if(logToLogcat){ | ||
215 | + Log.e(tag,msg); | ||
216 | + } | ||
217 | + inputToFile("(E):" + msg); | ||
218 | + } | ||
219 | + return -1; | ||
220 | + } | ||
221 | + | ||
222 | + public static int e(String tag,Throwable tr){ | ||
223 | + String message = "ERROR" ; | ||
224 | + if(tr != null && tr.getMessage() != null){ | ||
225 | + message = tr.getMessage(); | ||
226 | + } | ||
227 | + return e(tag,message,tr); | ||
228 | + } | ||
229 | + | ||
230 | + public static int e(String tag, String msg, Throwable tr) { | ||
231 | + if(ERROR_LEVER > lever){ | ||
232 | + if(logToLogcat){ | ||
233 | + Log.e(tag,msg,tr); | ||
234 | + } | ||
235 | + inputToFile("(E):" + msg + Log.getStackTraceString(tr)); | ||
236 | + } | ||
237 | + return -1; | ||
238 | + } | ||
239 | + | ||
240 | + public static int wtf(String tag, String msg) { | ||
241 | + if(ASSERT_LEVER > lever){ | ||
242 | + if(logToLogcat){ | ||
243 | + Log.wtf(tag,msg); | ||
244 | + } | ||
245 | + inputToFile("(WTF):" + msg); | ||
246 | + } | ||
247 | + return -1; | ||
248 | + } | ||
249 | + | ||
250 | + public static int wtf(String tag, Throwable tr) { | ||
251 | + if(ASSERT_LEVER > lever){ | ||
252 | + if(logToLogcat){ | ||
253 | + Log.wtf(tag,tr); | ||
254 | + } | ||
255 | + inputToFile("(WTF):" + Log.getStackTraceString(tr)); | ||
256 | + } | ||
257 | + return -1; | ||
258 | + } | ||
259 | + | ||
260 | + public static int wtf(String tag, String msg, Throwable tr) { | ||
261 | + if(ASSERT_LEVER > lever){ | ||
262 | + if(logToLogcat){ | ||
263 | + Log.wtf(tag,msg,tr); | ||
264 | + } | ||
265 | + inputToFile("(WTF):" + msg + Log.getStackTraceString(tr)); | ||
266 | + } | ||
267 | + return -1; | ||
268 | + } | ||
269 | + | ||
270 | + public static String getStackTraceString(Throwable tr) { | ||
271 | + return Log.getStackTraceString(tr); | ||
272 | + } | ||
273 | + | ||
274 | + | ||
275 | + public static void stack(){ | ||
276 | + Throwable throwable = new Throwable(); | ||
277 | + // 需要处理TAG 要读出上面class method的信息,后续添上 | ||
278 | + i("STACK",getStackTraceString(throwable)); | ||
279 | + } | ||
280 | + | ||
281 | + private synchronized static void inputToFile(String msg){ | ||
282 | + if(logToFile) { | ||
283 | + String time = simpleDateFormat.format(new Date()); | ||
284 | + try { | ||
285 | + init(); | ||
286 | + String log = time + "(" + Thread.currentThread().getName() + ",id=" + Thread.currentThread().getId() + ")" + msg + "\r\n"; | ||
287 | + if(onLogMessage != null){ | ||
288 | + onLogMessage.onLog(time + ":" + msg + "\r\n"); | ||
289 | + } | ||
290 | + fileWriter.write(log); | ||
291 | + fileWriter.flush(); | ||
292 | + } catch (Exception ex) { | ||
293 | + ex.printStackTrace(); | ||
294 | + if(fileWriter != null){ | ||
295 | + try { | ||
296 | + fileWriter.close(); | ||
297 | + } catch (IOException e) { | ||
298 | + e.printStackTrace(); | ||
299 | + } | ||
300 | + } | ||
301 | + fileWriter = null; | ||
302 | + } | ||
303 | + } | ||
304 | + } | ||
305 | + | ||
306 | + private static OnLogMessage onLogMessage; | ||
307 | + | ||
308 | + public static void setOnLogMessage(OnLogMessage onLogMessage) { | ||
309 | + LogUtil.onLogMessage = onLogMessage; | ||
310 | + } | ||
311 | + | ||
312 | + public static interface OnLogMessage{ | ||
313 | + void onLog(String log); | ||
314 | + } | ||
315 | +} | ||
316 | + |
C5/xpadapi/src/main/res/values/strings.xml
0 → 100644
C5/xpadapi/src/test/java/com/sunvote/xpadapi/ExampleUnitTest.java
0 → 100644
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 | +} | ||
0 | \ No newline at end of file | 18 | \ No newline at end of file |
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/BaseCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/ICmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/app/BaseBeaconStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/app/ModuleHeartBeatCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/app/MutiPkgDownCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/app/OtherCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/ConfirmBaseBeaconRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/ConfirmBaseBeaconResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/GetVoteDataRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/GetVoteDataResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/SettingBaseBeaconRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/SettingBaseBeaconResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/SettingVoteRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/SettingVoteResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/manager/BaseStationUpgradeCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/manager/FlatBaseStationSettingCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/manager/ReadOrWriteBaseStationConfigCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/manager/ReadOrWriteHardWareConfigCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/basestation/manager/ReadOrWriteMatchCodeCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/BaseStatusChangeRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/BaseStatusChangeResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/CustomCommandControl.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/DownloadSingletonPkg.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/DownloadSingletonPkgResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/PushBaseCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/ReadAndWriteHardwareInformation.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/ReadAndWriteVoterAllocation.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/VoteStatusChangeRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/push/VoteStatusChangeResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/GetPkgStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/GetPkgStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/KeyboardParameterStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/KeyboardParameterStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/ModeOperationStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/ModeOperationStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/QueryBeaconStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/QueryBeaconStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/QueryOnlineStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/QueryOnlineStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/StateBaseCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/WorkPattenStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/state/WorkPattenStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/CleanFlashStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/CleanFlashStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/UpgradEntryStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/UpgradEntryStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/UpgradeBaseCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/UpgradeExitStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/UpgradeExitStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/WriteFlashStateRequest.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upgrade/WriteFlashStateResponse.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upload/NumberingModeResult.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upload/SequenceFormatResult.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upload/SingerUploadPkg.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upload/TransferResult.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/cmd/upload/UploadBaseCmd.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/protocal/IProtocal.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/protocal/Protocol.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/utils/ConvertUtils.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/utils/Crc16.class deleted
No preview for this file type
C5/xpadprotocal/build/classes/java/main/com/sunvote/utils/EncodeUtils.class deleted
No preview for this file type
C5/xpadprotocal/build/libs/xpadprotocal.jar deleted
No preview for this file type
C5/xpadprotocal/build/tmp/jar/MANIFEST.MF deleted