仰邦BX-C04显示屏二次开发

1、项目需求

通过调用第三方接口查询相关信息,并按指定格式展示
在这里插入图片描述

2、开发

整体排版其实按照提供SDK开发就行,较为简单。其中有一点是测试了半天,就是针对动态显示的内容,这个地方需要使用动态区域,然后针对设定的动态区域进行内容更新。比如上面的装车物料、层数、袋数等内容,这些都是一直查询接口然后实时更新的。最初使用字母,然后整体更新节目,这种会刷新整体,屏幕内容更新的时候就会一闪一闪的,用动态区域可以解决。

public static void showLoadingInfo() throws Exception {
        // 初始化API,此操作只在程序启动时候执行一次,多次执行会出现内存错误
        Y2Env.initial();

        Y2Screen screen = new Y2Screen(url);
        boolean result = screen.login("guest", "guest");
        log.warn("login result:" + result);

        // 创建节目
        ProgramPlayFile pf = new ProgramPlayFile(1);

        // 创建一个字幕区1
        MarqueeArea marea1 = new MarqueeArea(20, 0, 256, 22);

        // 区域1字幕内容
        marea1.addContent("无锡中粮工程科技有限公司");

        // 创建一个字幕区2
        MarqueeArea marea2 = new MarqueeArea(20, 22, 176, 22);
        marea2.addContent(laneNo + "车道  车牌号:");

        MarqueeArea marea3 = new MarqueeArea(20, 44, 176, 22);
        marea3.addContent("当前装车物料:");

        // 创建一个字幕区3
        MarqueeArea marea4 = new MarqueeArea(20, 66, 156, 22);
        marea4.addContent("当前装车层数: ");


        // 创建一个字幕区4
        MarqueeArea marea5 = new MarqueeArea(20, 88, 156, 22);
        marea5.addContent("当前装车袋数: ");


        // 时钟区域
        DateTimeArea timeArea = new DateTimeArea(20, 106, 256, 18);
        timeArea.horizontalAlignment(AlignmentType.NEAR);
        DateTimePattern[] arr = {DateTimePattern.CH_YYYY_MM_DD, DateTimePattern.CH_HH_MM_SS, DateTimePattern.CH_WEEK};
        timeArea.addUnits(arr).fgColor(Color.red).getFont().setSize(13);


        // 将字幕区添加到节目中
        pf.getAreas().add(marea1);
        pf.getAreas().add(marea2);
        pf.getAreas().add(marea3);
        pf.getAreas().add(marea4);
        pf.getAreas().add(marea5);
        pf.getAreas().add(timeArea);

        // 创建节目列表
        // 多个节目可以在列表中同时添加,用“,”隔开
        String list = screen.writePlaylist(pf);

        // 更新节目
        screen.play(list);

        Y2DynamicManager dynamicManager = screen.dynamic();
        DynamicPlayFile dynFile = new DynamicPlayFile();

        // 车牌号区域
        DynamicArea vehicleArea = dynFile.createArea(136, 22, 100, 20,0);
        DynamicArea layerArea = dynFile.createArea(126, 66, 100, 20, 1);
        DynamicArea amountArea = dynFile.createArea(126, 88, 100, 20, 2);
        DynamicArea materialArea = dynFile.createArea(136, 44, 100, 20,3);
        DynamicAreaTextUnit vehicleUnit = vehicleArea.addText("暂无车辆");
        vehicleUnit.setAnimationType(2);
        DynamicAreaTextUnit layerUnit = layerArea.addText("0");
        layerUnit.animationType(2);
        DynamicAreaTextUnit amountUnit = amountArea.addText("0");
        amountUnit.animationType(2);
        DynamicAreaTextUnit materialUnit = materialArea.addText("");
        materialUnit.animationType(2);
        dynamicManager.write(dynFile);

        while (true) {
            // 获取装车信息
            Response response = null;
            try {
                response = getLoadingResponse();
//                log.info("装车信息:" + response.getResult());
            } catch (Exception e) {
                log.error("获取装车信息失败", e);
            }


            // 110-取消装车
            if (Objects.isNull(response) || response.getCode() == 110) {
                continue;
            }

            // 装车信息
            LoadingResult loadingInfo = response.getResult();
            int aimAmount = loadingInfo.getAimAmount();
            int amount = OptionalInt.of(loadingInfo.getAmount()).orElse(0);
            String vehicleLicenseNo = loadingInfo.getVehicleLicenseNo();
            int layer = loadingInfo.getLayer();
            String materialName = loadingInfo.getMaterialName();

            vehicleArea.getUnits().clear();
            vehicleUnit = vehicleArea.addText(vehicleLicenseNo);
            vehicleUnit.setAnimationType(2);

            materialArea.getUnits().clear();
            materialUnit = materialArea.addText(materialName);
            materialUnit.setAnimationType(2);

            // 301-装车中
            if (response.getCode() == 301 && amount != aimAmount) {
                layerArea.getUnits().clear();
                layerUnit = layerArea.addText(String.valueOf(layer));
                layerUnit.animationType(2);
            }

            // 更新动态区信息
            amountArea.getUnits().clear();
            amountUnit = amountArea.addText(amount + "/" + aimAmount);
            amountUnit.animationType(2);
            dynamicManager.write(dynFile);
        }
    }

3、开发收获

本次开发其实还是相对简单的,但是最后打包的时候折腾了很久,首先是之前一直使用Springboot开发,引入包和打包都很方便。但是本次的二开是普通的java项目,其中的包都是厂商提供好的,起初是把项目变成maven项目,然后在resources文件夹下,新建了一个lib目录,然后在网上尝试了很多种配置方式进行打包,都不成功,要么就是打包了个空文件,要么就是打包时报错说找不到引入的jar包中的类,要么就是打包成功,也有内容,但是一运行就报错。最后没办法,只能手动先把这些第三方jar包安装到本地maven库中,然后再一一在pom.xml文件中进行引入,最后打包才成功。

将jar包安装到本地maven库,其中^是换行用的,因为在cmd窗口执行这一段,要是一行会因为格式问题无法安装成功。
其中-Dfile: 是jar包所在的文件地址
-DgroupId: 可自行定义,dependency中对应的groupId
-DaetifactId: 同上
-Dversion: 同上

mvn install:install-file ^
    -Dfile="D:\play\weifang_screen\src\main\resources\lib\y2-message-0.2.0-SNAPSHOT.jar" ^
    -DgroupId=com.screen ^
    -DartifactId=y2-message ^
    -Dversion=1.0 ^
    -Dpackaging=jar

本次还有针对读取配置文件的一个开发,目的是在整个项目打包成jar之后,可以额外的进行配置文件信息配置,如果没有,就默认使用jar包中的配置文件。代码如下:

Properties prop = new Properties();
        // 获取当前工作目录
        String workingDir = new File("").getAbsolutePath();
        //CONFIG_FILE_NAME:配置文件名字
        File propertiesFile = new File(workingDir, CONFIG_FILE_NAME);

        // 如果配置文件存在,则使用配置文件,否则使用默认配置文件
        if (propertiesFile.exists()) {
            try (FileInputStream fileInputStream = new FileInputStream(propertiesFile)) {
                InputStreamReader reader = new InputStreamReader(fileInputStream, StandardCharsets.UTF_8);
                prop.load(reader);
            } catch (IOException e) {
                log.error("加载配置文件失败", e);
            }
        } else {
            try (InputStream is = MainScreen.class.getClassLoader().getResourceAsStream(CONFIG_FILE_NAME)) {
                InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8);
                prop.load(reader);
            } catch (IOException e) {
                log.error("加载内部配置文件失败", e);
            }
        }

仰邦led dll接口调用。 public class bx5k_err { public const int ERR_NO = 0; //No Error public const int ERR_OUTOFGROUP = 1; //Command Group Error public const int ERR_NOCMD = 2; //Command Not Found public const int ERR_BUSY = 3; //The Controller is busy now public const int ERR_MEMORYVOLUME = 4; //Out of the Memory Volume public const int ERR_CHECKSUM = 5; //CRC16 Checksum Error public const int ERR_FILENOTEXIST = 6; //File Not Exist public const int ERR_FLASH = 7;//Flash Access Error public const int ERR_FILE_DOWNLOAD = 8; //File Download Error public const int ERR_FILE_NAME = 9; //Filename Error public const int ERR_FILE_TYPE = 10;//File type Error public const int ERR_FILE_CRC16 = 11;//File CRC16 Error public const int ERR_FONT_NOT_EXIST = 12;//Font Library Not Exist public const int ERR_FIRMWARE_TYPE = 13;//Firmware Type Error (Check the controller type) public const int ERR_DATE_TIME_FORMAT = 14;//Date Time format error public const int ERR_FILE_EXIST = 15;//File Exist for File overwrite public const int ERR_FILE_BLOCK_NUM = 16;//File block number error public const int ERR_COMMUNICATE = 100;//通信失败 public const int ERR_PROTOCOL = 101;//协议数据不正确 public const int ERR_TIMEOUT = 102;//通信超时 public const int ERR_NETCLOSE = 103;//通信断开 public const int ERR_INVALID_HAND = 104;//无效句柄 public const int ERR_PARAMETER = 105;//参数错误 public const int ERR_SHOULDREPEAT = 106;//需要重复上次数据包 public const int ERR_FILE = 107;//无效文件 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值