package com.sunvote.cmd.basestation; import com.sunvote.cmd.BaseCmd; import com.sunvote.cmd.ICmd; import java.io.ByteArrayOutputStream; import java.util.Arrays; /** * Created by Elvis on 2017/8/30. * Email:Eluis@psunsky.com * 版权所有:长沙中天电子设计开发有限公司 * Description:平板模块键盘投票功能模块 * * 基站内部有一个自动获取表决器结果的流程,除投票进行的时候表决器提交的结果,平常也可以接收表决器的状态报告、申请指令等。这些数据都要提交到电脑上。 由于存在多个基站同时使用的情况,基站不主动发送数据,而是等待电脑发读取基站结果指令查询,才回送数据。 基站回送数据的方法是这样的:最多一次回送10个数据包,每个数据包有编号,1到10,如果某个数据包编号为0xFF,就表示不足10个数据包,可以提前结束基站接收流程。 电脑在收到编号为0xFF的数据包后,或者到达10个数据包的接收时间后,给基站发个确认指令,通知基站刚才发出的10个数据包中正确接收到了哪些。 如果有多个基站的话,电脑查询下一个基站的结果。 电脑读取基站结果、接收基站结果数据包和确认数据包这3个步骤,是周而复始的,保证可随时接收到表决器的数据。 基站的结果数据包,实际是把键盘的关键数据重新打包,再一次传给电脑,一般情况下,一个数据包可传输几个表决器结果,比单个单个传递效率要高。由于结果有不同类型,因此结果数据包的类型和格式也有多种。 3.2 读取基站结果 电脑读取指定基站的结果: 字节 标识符 描述 1 BASECMD 0x60 基站类指令 2 BASEID 指定的基站编号 3 CMDTYPE 基站命令类型 5 读取基站结果 4-29 无意义 整个结果数据包结构如下: 字节 标识符 描述 1 BASECMD 0xE0 基站类指令应答 2 BASEID 应答的基站的编号 3 CMDTYPE 5 基站结果上传 4 MSGNO 数据包序号 5 MSGTYPE 基站数据包类型 1 单值 6-7 KEYID1 第1个结果的表决器编号,高位在前 表决器编号为0xFFFF表示结果空,不足8个结果 8 VALUE1 第1个结果值 9-11 KEYID2 VALUE2 第2个结果的表决器编号和值 。。。 27-29 KEYID8 VALUE8 第8个结果的表决器编号和值 */ public class GetVoteDataRequest extends BaseCmd { public final static byte CMD_TYPE = 0x05; public static final byte CMD = 0x60; /** * 基站类指令 */ private byte basecmd; /** * 指定的基站编号 */ private byte baseid; /** * 基站命令类型 */ private byte cmdtype; private byte[] data = new byte[26]; @Override public byte[] toBytes() { try{ ByteArrayOutputStream stream = new ByteArrayOutputStream(); stream.write(getBasecmd()); stream.write(getBaseid()); stream.write(getCmdtype()); stream.write(getData()); return stream.toByteArray(); }catch (Exception ex){ ex.printStackTrace(); } return new byte[0]; } @Override public ICmd parseCmd(byte[] source, int start) { setBasecmd(source[start]); setBaseid(source[start+1]); setCmdtype(source[start+2]); if(source.length > start + 3){ setData(Arrays.copyOfRange(source,start+3,source.length)); } return this; } public byte getBasecmd() { return basecmd; } public void setBasecmd(byte basecmd) { this.basecmd = basecmd; } public byte getBaseid() { return baseid; } public void setBaseid(byte baseid) { this.baseid = baseid; } public byte getCmdtype() { return cmdtype; } public void setCmdtype(byte cmdtype) { this.cmdtype = cmdtype; } public byte[] getData() { return data; } public void setData(byte[] data) { this.data = data; } }