diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCallBack.java b/wcs/src/main/java/com/listenvision/LxLedCallBack.java similarity index 92% rename from wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCallBack.java rename to wcs/src/main/java/com/listenvision/LxLedCallBack.java index f0aec21..a3e5daa 100644 --- a/wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCallBack.java +++ b/wcs/src/main/java/com/listenvision/LxLedCallBack.java @@ -1,4 +1,4 @@ -package org.wcs.plugin.lxLed; +package com.listenvision; /********************************************************************************************* * LedServerCallback 动态库回调Java方法,实时告知上下线控制卡 diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCommunication.java b/wcs/src/main/java/com/listenvision/LxLedCommunication.java similarity index 97% rename from wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCommunication.java rename to wcs/src/main/java/com/listenvision/LxLedCommunication.java index 3701318..e2af6db 100644 --- a/wcs/src/main/java/org/wcs/plugin/lxLed/LxLedCommunication.java +++ b/wcs/src/main/java/com/listenvision/LxLedCommunication.java @@ -1,9 +1,9 @@ -package org.wcs.plugin.lxLed; +package com.listenvision; public class LxLedCommunication { static{ - System.loadLibrary("lv_led_64"); + System.loadLibrary("lv_led"); } /******************************************************************************************** diff --git a/wcs/src/main/java/com/listenvision/lv_led.dll b/wcs/src/main/java/com/listenvision/lv_led.dll new file mode 100755 index 0000000..fabcd78 Binary files /dev/null and b/wcs/src/main/java/com/listenvision/lv_led.dll differ diff --git a/wcs/src/main/java/com/listenvision/readme.txt b/wcs/src/main/java/com/listenvision/readme.txt new file mode 100644 index 0000000..115cc21 --- /dev/null +++ b/wcs/src/main/java/com/listenvision/readme.txt @@ -0,0 +1,3 @@ +此软件包是灵信LED屏通讯的相关方法,严禁修改包名已经上级包名,修改了就调用不了了 +只能64位运行,32位无法运行 +如连接失败,请检查导入的DLL是否正确,官网的依赖是否都安装(官网依赖仅支持Windows系统) diff --git a/wcs/src/main/java/org/wcs/business/led/LxLedOperation.java b/wcs/src/main/java/org/wcs/business/led/LxLedOperation.java index 390f37b..a90e729 100644 --- a/wcs/src/main/java/org/wcs/business/led/LxLedOperation.java +++ b/wcs/src/main/java/org/wcs/business/led/LxLedOperation.java @@ -1,14 +1,11 @@ package org.wcs.business.led; import org.springframework.stereotype.Service; -import org.wcs.model.bo.tuple.Tuple2; -import org.wcs.model.pojo.led.LedBaseInfo; import org.wcs.model.pojo.led.LedDataDetail; import org.wcs.model.pojo.led.LedShowData; -import org.wcs.plugin.lxLed.LxLedCommunication; +import com.listenvision.LxLedCommunication; import java.util.List; -import java.util.Optional; /** * 灵信LED屏操作类 diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/LedDataCreator.java b/wcs/src/main/java/org/wcs/plugin/lxLed/LedDataCreator.java new file mode 100644 index 0000000..25a8fa7 --- /dev/null +++ b/wcs/src/main/java/org/wcs/plugin/lxLed/LedDataCreator.java @@ -0,0 +1,224 @@ +package org.wcs.plugin.lxLed; + +import org.wcs.model.bo.tuple.Tuple2; +import org.wcs.plugin.lxLed.model.LedAreaData; +import org.wcs.utils.AppListUtils; +import org.wcs.utils.Converter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 灵信LED屏数据创建器 + */ +public class LedDataCreator { + + /** + * 屏幕宽 + */ + private short ledWight = 0; + + /** + * 屏幕高 + */ + private short ledHeight = 0; + + /** + * 颜色类型:1-单色;2-双色;3-三色 + */ + private byte ledColorType = 1; + + /** + * 区域数据列表 + */ + public List areaDataList; + + + /** + * 设置屏幕参数 + * @param ledWight 屏幕宽 + * @param ledHeight 屏幕高 + * @param ledColorType 颜色类型:1-单色;2-双色;3-三色 + */ + public void setLedParam(short ledWight, short ledHeight, byte ledColorType) { + this.ledWight = ledWight; + this.ledHeight = ledHeight; + this.ledColorType = ledColorType; + } + + /** + * 添加区域数据 + * @param areaData 区域数据 + */ + public void addAreaData(LedAreaData areaData) { + if (areaDataList == null) { + areaDataList = new ArrayList<>(); + } + areaDataList.add(areaData); + } + + /** + * 创建数据 + * @return 数据 + */ + public Tuple2> create() { + if(ledWight <= 0 || ledHeight <= 0) { + return new Tuple2<>("屏幕宽或屏幕高不能小于等于0", null); + } + Tuple2> program = createProgram(); + if(program.item1 != null) { + return program; // 创建失败 + } + List dataBytes = new ArrayList<>(); + // 起始数据 + dataBytes.addAll(createStartBytes()); + // 控制器型号 ---- 默认全部型号 + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + // 屏幕参数 + dataBytes.addAll(AppListUtils.transfer(Converter.toBytes(ledWight)).reversed()); // 屏幕宽 + dataBytes.addAll(AppListUtils.transfer(Converter.toBytes(ledHeight)).reversed()); // 屏幕高 + // 颜色类型 + dataBytes.add(ledColorType); + // 节目个数 + dataBytes.add((byte) 1); + // 不用字节 + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + dataBytes.add((byte) 0); + // 节目数据 + dataBytes.addAll(program.item2); + // 结束数据 + dataBytes.addAll(createEndBytes()); + return new Tuple2<>(null, dataBytes); + } + + /** + * 创建节目 + * @return 节目 + */ + private Tuple2> createProgram() { + if(areaDataList == null || areaDataList.isEmpty()) { + return new Tuple2<>("节目未添加区域", null); + } + + List bytes = new ArrayList<>(); + // 节目号 + bytes.add((byte) 0); + // 节目数据大小 ---- 先临时赋值 + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + //节目中区域个数 + bytes.add((byte) areaDataList.size()); + // 节目循环播放数 + bytes.add((byte) 0); + bytes.add((byte) 0); + // 循环播放次数 + bytes.add((byte) 1); + // 节目定时属性 ---- 无效 + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + // 区域数据 + for (LedAreaData areaData : areaDataList) { + bytes.addAll(areaData.create()); + } + // 节目数据大小 + int size = bytes.size(); + byte[] bytesSize = Converter.toBytes(size); + bytes.set(1, bytesSize[3]); + bytes.set(2, bytesSize[2]); + bytes.set(3, bytesSize[1]); + bytes.set(4, bytesSize[0]); + bytes.addAll(createEndBytes()); + return new Tuple2<>(null, bytes); + } + + /** + * 创建起始字节 + * @return 起始字节 + */ + private List createStartBytes() { + List bytes = new ArrayList<>(); + // 起始字节 + bytes.add((byte) 0x55); + bytes.add((byte) 0xAA); + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + // 地址 + bytes.add((byte) 0x01); + // 标志 + bytes.add((byte) 0x01); + // 操作码 + bytes.add((byte) 0x00); + bytes.add((byte) 0xD9); + // 保留 + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + // 帧序号 + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + // 总长度 ---- 默认不给,控制卡可自动计算 + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + // 帧长度 ---- 默认不给,控制卡可自动计算 + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + + return bytes; + } + + /** + * 创建结束字节 + * @return 结束字节 + */ + private List createEndBytes() { + List bytes = new ArrayList<>(); + // 结束字节 + bytes.add((byte) 0x00); + bytes.add((byte) 0x00); + bytes.add((byte) 0x0D); + bytes.add((byte) 0x0A); + + return bytes; + } + +} diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextColorEnum.java b/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextColorEnum.java new file mode 100644 index 0000000..1328d19 --- /dev/null +++ b/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextColorEnum.java @@ -0,0 +1,21 @@ +package org.wcs.plugin.lxLed.enums; + +import lombok.Getter; + +/** + * LED屏显示的文字颜色枚举 + */ +@Getter +public enum TextColorEnum { + RED(128, "红色"), // 红色 + GREEN(64, "绿色"), // 绿色 + BLUE(32, "蓝色"); // 蓝色 + + private final int value; + private final String name; + + TextColorEnum(int value, String name) { + this.value = value; + this.name = name; + } +} diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextEffectEnum.java b/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextEffectEnum.java new file mode 100644 index 0000000..4fc70b8 --- /dev/null +++ b/wcs/src/main/java/org/wcs/plugin/lxLed/enums/TextEffectEnum.java @@ -0,0 +1,30 @@ +package org.wcs.plugin.lxLed.enums; + +import lombok.Getter; + +/** + * 灵信LED屏文字滚动效果枚举 + */ +@Getter +public enum TextEffectEnum { + + SHOW_IMMEDIATELY(1, "立即显示"), + TO_LEFT(2, "向左滚动"), + TO_RIGHT(4, "向右滚动"), + TO_UP(3, "向上滚动"), + TO_DOWN(5, "向下滚动"), + TO_UP_CONTINUOUS(94, "向上滚动不间断"), + TO_DOWN_CONTINUOUS(95, "向下滚动不间断"), + TO_LEFT_CONTINUOUS(97, "向左滚动不间断"), + TO_RIGHT_CONTINUOUS(96, "向右滚动不间断"), + BLINK(6, "闪烁"); + + private final int code; + private final String name; + + TextEffectEnum(int code, String name) { + this.code = code; + this.name = name; + } + +} diff --git a/wcs/src/main/java/org/wcs/plugin/lxLed/model/LedAreaData.java b/wcs/src/main/java/org/wcs/plugin/lxLed/model/LedAreaData.java new file mode 100644 index 0000000..f39e909 --- /dev/null +++ b/wcs/src/main/java/org/wcs/plugin/lxLed/model/LedAreaData.java @@ -0,0 +1,129 @@ +package org.wcs.plugin.lxLed.model; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import org.wcs.plugin.lxLed.enums.TextColorEnum; +import org.wcs.plugin.lxLed.enums.TextEffectEnum; +import org.wcs.utils.AppListUtils; +import org.wcs.utils.AppStringUtils; +import org.wcs.utils.Converter; + +import java.util.ArrayList; +import java.util.List; + +/** + * 灵信LED屏每个区域的数据 + */ +@Getter +@Setter +@Builder +public class LedAreaData { + + /** + * 区域的起始X坐标 + */ + private short startX; + + /** + * 区域的起始Y坐标 + */ + private short startY; + + /** + * 区域的结束X坐标 + */ + private short endX; + + /** + * 区域的结束Y坐标 + */ + private short endY; + + /** + * 区域的文字颜色 + */ + @Builder.Default + private TextColorEnum textColor = TextColorEnum.RED; + + /** + * 区域的文字效果 + */ + @Builder.Default + private TextEffectEnum textEffect = TextEffectEnum.SHOW_IMMEDIATELY; + + /** + * 区域的文字效果速度,越小越快,范围 1-64 + */ + @Builder.Default + private byte effectSpeed = 10; + + /** + * 区域的文字每页显示时间 + */ + @Builder.Default + private short showTime = 2; + + /** + * 区域的文字大小 + */ + @Builder.Default + private byte textSize = 12; + + /** + * 区域的文字内容 + */ + private String text; + + /** + * 创建区域数据 + * @return 区域数据 + */ + public List create() { + List bytes = new ArrayList<>(); + // 区域用途 + bytes.add((byte) 1); + // 区域数据大小 ---- 先临时赋值 + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + // 区域类型 + bytes.add((byte) 0x0E); + // 坐标 + bytes.addAll(AppListUtils.transfer(Converter.toBytes(startX)).reversed()); + bytes.addAll(AppListUtils.transfer(Converter.toBytes(startY)).reversed()); + bytes.addAll(AppListUtils.transfer(Converter.toBytes(endX)).reversed()); + bytes.addAll(AppListUtils.transfer(Converter.toBytes(endY)).reversed()); + // 文字颜色 + bytes.add((byte) textColor.getValue()); + bytes.add((byte) 0); + bytes.add((byte) 0); + bytes.add((byte) 0); + // 文字效果 + bytes.add((byte) textEffect.getCode()); + // 效果速度 + bytes.add(effectSpeed); + // 显示时间 + bytes.addAll(AppListUtils.transfer(Converter.toBytes(showTime)).reversed()); + // 文字大小 + bytes.add(textSize); + // 文本字符串 + byte[] byteArrayGBK = AppStringUtils.toByteArrayGBK(text); + if (byteArrayGBK != null) { + // 文本字符串字节数 + bytes.addAll(AppListUtils.transfer(Converter.toBytes(byteArrayGBK.length)).reversed()); + // 文本字符串字节 + bytes.addAll(AppListUtils.transfer(byteArrayGBK).reversed()); + } + int bytesLength = bytes.size(); + byte[] bytesLengthBytes = Converter.toBytes(bytesLength); + bytes.set(1, bytesLengthBytes[3]); + bytes.set(2, bytesLengthBytes[2]); + bytes.set(3, bytesLengthBytes[1]); + bytes.set(4, bytesLengthBytes[0]); + return bytes; + } + + +} diff --git a/wcs/src/main/java/org/wcs/utils/Converter.java b/wcs/src/main/java/org/wcs/utils/Converter.java index e4ef7af..998f65b 100644 --- a/wcs/src/main/java/org/wcs/utils/Converter.java +++ b/wcs/src/main/java/org/wcs/utils/Converter.java @@ -17,6 +17,54 @@ public class Converter { return (byte) value; } + /** + * int转byte数组 + * @param value int值 + * @return byte数组 + */ + public static byte[] toBytes(int value) { + return new byte[]{ + (byte) (value >>> 24), + (byte) (value >>> 16), + (byte) (value >>> 8), + (byte) value + }; + } + + /** + * byte数组转int + * @param bytes byte数组 + * @return int值 + */ + public static int bytesToInt(byte[] bytes) { + return (bytes[0] & 0xFF) << 24 | + (bytes[1] & 0xFF) << 16 | + (bytes[2] & 0xFF) << 8 | + (bytes[3] & 0xFF); + } + + /** + * short转byte数组 + * @param value short值 + * @return byte数组 + */ + public static byte[] toBytes(short value) { + return new byte[]{ + (byte) (value >>> 8), + (byte) value + }; + } + + /** + * byte数组转short + * @param bytes byte数组 + * @return short值 + */ + public static short bytesToShort(byte[] bytes) { + return (short) ((bytes[0] & 0xFF) << 8 | + (bytes[1] & 0xFF)); + } + /** * 二进制字符串转 byte * @param value 二进制字符串 diff --git a/wcs_web/src/components/page/app/UserSetting.vue b/wcs_web/src/components/page/app/UserSetting.vue index e2b1562..00752a2 100644 --- a/wcs_web/src/components/page/app/UserSetting.vue +++ b/wcs_web/src/components/page/app/UserSetting.vue @@ -21,11 +21,12 @@ const response = JSON.parse(JSON.stringify(res.data)) as AppServeResponse; if (response && response.code == AppServeResponseCodeEnum.SUCCESS) { MessageUtils.successMessage(t('baseTip.success')); - router.push({name:'login'}); } else { MessageUtils.warningMessageBox(response.msg); } - }).catch(() => {}); + }).catch(() => {}).finally(() => { + router.push({name:'login'}); + }); }).catch(() => {}) }; // 重启服务器