package com.zy.core.thread;
|
|
import com.alibaba.fastjson.JSON;
|
import com.core.common.Cools;
|
import com.zy.common.entity.Parameter;
|
import com.zy.common.model.MatDto;
|
import com.zy.common.utils.News;
|
import com.zy.core.Slave;
|
import com.zy.core.ThreadHandler;
|
import com.zy.core.cache.MessageQueue;
|
import com.zy.core.enums.SlaveType;
|
import com.zy.core.model.Task;
|
import com.zy.core.model.command.LedCommand;
|
import lombok.Data;
|
import lombok.extern.slf4j.Slf4j;
|
import onbon.bx05.Bx5GEnv;
|
import onbon.bx05.Bx5GException;
|
import onbon.bx05.Bx5GScreen;
|
import onbon.bx05.Bx5GScreenClient;
|
import onbon.bx05.area.TextCaptionBxArea;
|
import onbon.bx05.area.page.TextBxPage;
|
import onbon.bx05.file.ProgramBxFile;
|
import onbon.bx05.message.led.ReturnControllerStatus;
|
import onbon.bx05.utils.DisplayStyleFactory;
|
|
import java.awt.*;
|
import java.util.HashSet;
|
import java.util.List;
|
import java.util.Set;
|
|
/**
|
* Created by vincent on 2020/9/1
|
*/
|
@Data
|
@Slf4j
|
public class LedThread implements Runnable, ThreadHandler {
|
|
private Slave slave;
|
private Bx5GScreenClient screen;
|
ProgramBxFile pf;
|
TextCaptionBxArea area;
|
DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
|
private Set<Integer> workNos = new HashSet<>();
|
private boolean ledMk = false;
|
private boolean resetStatus = false; // 复位状态
|
|
// 显示器
|
private StringBuffer stringBuffer = new StringBuffer();
|
private List<LedCommand> commandList;
|
|
private StringBuffer errorMsg = new StringBuffer();
|
|
public LedThread(Slave slave) {
|
this.slave = slave;
|
try {
|
// Bx5GEnv.initial(3000);
|
// screen = new Bx5GScreenClient("my");
|
} catch (Exception e) {
|
e.printStackTrace();
|
News.info("led连接构造器错误 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
}
|
}
|
|
@Override
|
@SuppressWarnings({"InfiniteLoopStatement", "unchecked"})
|
public void run() {
|
// connect();
|
close();
|
while (true) {
|
try {
|
Task task = MessageQueue.poll(SlaveType.Led, slave.getId());
|
if (task != null) {
|
switch (task.getStep()) {
|
// 写数据
|
case 1:
|
write((List<LedCommand>)task.getData());
|
break;
|
// 复位
|
case 2:
|
reset();
|
break;
|
// 写数据 液晶
|
case 3:
|
write7((List<LedCommand>)task.getData());
|
break;
|
// 复位 液晶
|
case 4:
|
reset7();
|
break;
|
case 5:
|
error((String) task.getData());
|
break;
|
case 6:
|
errorReset();
|
break;
|
default:
|
break;
|
}
|
}
|
|
Thread.sleep(400);
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
}
|
}
|
|
private void write(List<LedCommand> list) throws Bx5GException {
|
if (!connect()) {
|
return;
|
}
|
pf = new ProgramBxFile( 0, screen.getProfile());
|
pf.setFrameShow(false);
|
// 分别输入X,Y,width,height
|
area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
|
// 创建一个数据页
|
TextBxPage page = new TextBxPage();
|
for (LedCommand command : list) {
|
page.newLine(command.getTitle() +"("+command.getWorkNo()+")");
|
page.newLine("库位:"+ (command.getIoType() < 100 ? command.getLocNo() : command.getSourceLocNo()));
|
page.newLine("目标站:"+command.getStaNo());
|
if (!command.isEmptyMk()) {
|
for (MatDto matDto : command.getMatDtos()) {
|
//去掉小数点
|
String strQty = matDto.getCount().toString();
|
int idx = strQty.lastIndexOf(".");
|
if(idx >= 0){
|
strQty.substring(0,idx);
|
}
|
page.newLine(matDto.getMaknx() + "[数量" + strQty +"]");
|
// page.newLine(matDto.getMaknx() + "【数量" + matDto.getCount() +"】");
|
}
|
}
|
page.newLine("\n");
|
}
|
|
// 设置字体
|
page.setFont(new Font("宋体",Font.PLAIN,12));
|
// 设置文本颜色
|
page.setForeground(Color.red);
|
// 设置显示特技为快速打出
|
page.setDisplayStyle(styles[6]);
|
area.clearPages();
|
area.addPage(page);
|
pf.addArea(area);
|
if (pf.validate() != null) {
|
News.info("pf out of range");
|
} else {
|
// 更新节目
|
screen.writeProgram(pf);
|
// resetStatus = false;
|
}
|
close();
|
}
|
|
private void reset() throws Bx5GException {
|
if (!connect()) {
|
return;
|
}
|
// if (resetStatus) {
|
// return;
|
// }
|
pf = new ProgramBxFile( 0, screen.getProfile());
|
pf.setFrameShow(false);
|
// 分别输入X,Y,width,height
|
area = new TextCaptionBxArea( 0,0,96,48, screen.getProfile());
|
// 创建一个数据页
|
TextBxPage page = new TextBxPage();
|
|
// List<String> list = null;
|
// try {
|
// String ledDefaultMsg = Parameter.get().getLedDefaultMsg();
|
// list = JSON.parseArray(ledDefaultMsg, String.class);
|
// } catch (Exception ignore) {
|
// }
|
// if (!Cools.isEmpty(list)) {
|
// for (String str : list) {
|
// page.newLine(str);
|
// }
|
// } else {
|
// page.newLine("自动化立体仓库");
|
// page.newLine("西格迈股份有限公司");
|
// }
|
page.newLine("力源智能仓储");
|
|
// 设置字体
|
page.setFont(new Font("宋体",Font.PLAIN,13));
|
// 设置文本颜色
|
page.setForeground(Color.red);
|
// 设置显示特技为快速打出
|
page.setDisplayStyle(styles[6]);
|
area.clearPages();
|
area.addPage(page);
|
pf.addArea(area);
|
// 更新节目
|
if (pf.validate() != null) {
|
News.info("pf out of range");
|
} else {
|
// 更新节目
|
screen.writeProgram(pf);
|
// resetStatus = true;
|
}
|
close();
|
}
|
|
private void write7(List<LedCommand> list) {
|
commandList = list;
|
|
StringBuilder sb = new StringBuilder();
|
for (LedCommand command : list) {
|
sb.append(command.getTitle()).append("(").append(command.getWorkNo()).append(")").append("\n");
|
sb.append("源库位:").append(command.getSourceLocNo()).append("\n");
|
sb.append("目标站:").append(command.getStaNo()).append("\n");
|
if (!command.isEmptyMk()) {
|
for (MatDto matDto : command.getMatDtos()) {
|
sb.append("物料编码:").append(matDto.getMatnr()).append("\n");
|
sb.append("数量:").append(matDto.getCount()).append("\n");
|
}
|
}
|
sb.append("\n");
|
}
|
stringBuffer.delete(0, stringBuffer.length());
|
stringBuffer.append(sb.toString());
|
|
errorReset();
|
}
|
|
|
private void reset7() {
|
commandList = null;
|
|
stringBuffer.delete(0, stringBuffer.length());
|
}
|
|
|
private void error(String msg) {
|
errorMsg.delete(0, errorMsg.length());
|
errorMsg.append(msg);
|
}
|
|
public void errorReset() {
|
this.errorMsg.delete(0, errorMsg.length());
|
}
|
|
@Override
|
public boolean connect() {
|
boolean connRes = false;
|
try {
|
connRes = screen.connect(slave.getIp(),slave.getPort());
|
screen.turnOn();
|
} catch (Exception ignore) {
|
}
|
if (connRes) {
|
News.info("led连接成功 ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
} else {
|
News.error("led连接失败!!! ===>> [id:{}] [ip:{}] [port:{}]", slave.getId(), slave.getIp(), slave.getPort());
|
}
|
return connRes;
|
}
|
|
@Override
|
public void close() {
|
|
}
|
|
|
|
public static void main(String[] args) throws Exception {
|
String strQty = "1234";
|
int index = strQty.lastIndexOf(".");
|
if(index>=0) {
|
strQty=strQty.substring(0, index);
|
}
|
System.out.println("2==>>"+strQty);
|
|
Bx5GEnv.initial(3000);
|
Bx5GScreenClient screen = new Bx5GScreenClient("my");
|
DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
|
if (!screen.connect("192.168.10.101",5005)) {
|
System.err.println("连接失败!!!!");
|
return;
|
}
|
screen.turnOn();
|
|
|
while (true) {
|
Thread.sleep(5000L);
|
|
ProgramBxFile pf = new ProgramBxFile( 0, screen.getProfile());
|
pf.setFrameShow(false);
|
// 分别输入X,Y,width,heigth
|
TextCaptionBxArea area = new TextCaptionBxArea( 0,0,192,96,screen.getProfile());
|
|
// 创建一个数据页
|
// 第一行数据
|
TextBxPage page = new TextBxPage("出库任务(303)");
|
page.newLine("源库位:0100204");
|
page.newLine("目标站:1000");
|
// 设置字体
|
page.setFont( new Font("宋体",Font.PLAIN,15));
|
// 设置文本颜色
|
page.setForeground(Color.red);
|
// 设置显示特技为快速打出
|
page.setDisplayStyle(styles[6]);
|
area.clearPages();
|
area.addPage(page);
|
pf.addArea( area );
|
|
// 更新节目
|
// 更新节目
|
if (pf.validate() != null) {
|
System.out.println("pf out of range");
|
News.info("pf out of range");
|
} else {
|
// 更新节目
|
screen.writeProgram(pf);
|
}
|
}
|
|
// 继开与控制器之间的链接
|
// screen.disconnect();
|
}
|
|
|
public static void main1(String[] args) throws Exception {
|
Bx5GEnv.initial(3000);
|
// 创建screen对象,用于对控制器进行访问,客户端模式
|
Bx5GScreenClient screen = new Bx5GScreenClient("my");
|
// 创建screen对象,用于对控制器进行访问,串口模式
|
// Bx5GScreenRS screen = new Bx5GScreenRS("MyScreen");
|
|
// 在对控制器交互之前,需要先与控制器建立连接
|
boolean conn = screen.connect("192.168.10.61",5005);
|
System.out.println(conn);
|
// 与控制器交互完成后,需断开与控制器之间的连接
|
// screen.disconnect();
|
|
// 以下为一些简单控制命令的使用方法
|
// 开关机命令
|
// screen.turnOff();// 关机
|
screen.turnOn();// 开机
|
// screen.syncTime();// 校时
|
// screen.ping();// ping命令
|
// // 查询控制器状态
|
// screen.checkControllerStatus();
|
// // 查询控制器当前固件版本
|
// screen.checkFirmware();
|
// // 查询控制器内存
|
// screen.checkMemVolumes();
|
// // 锁定屏幕当前画面
|
// screen.lock();
|
// // 解除锁定屏幕当前画面
|
// screen.unlock();
|
|
Bx5GScreen.Result <ReturnControllerStatus> result1 =
|
screen.checkControllerStatus();
|
if (result1.isOK())
|
{
|
ReturnControllerStatus status = result1.reply;
|
System.out.println(status.getBrightness());
|
System.out.println(status.getRtcDay());
|
System.out.println(status.getScreenOnOff());
|
//
|
// status 还有很对其他接口,可以根据实际需求再次调用以获取相应状态
|
}
|
|
//
|
// 以下是静态区部分 Demo
|
|
// 创建节目文件
|
ProgramBxFile pf = new ProgramBxFile( 0,screen.getProfile() );
|
// 是否显示节目边框
|
pf.setFrameShow(true);
|
// 节目边框的移动速度
|
pf.setFrameSpeed(20);
|
// 使用第几个内置边框
|
pf.loadFrameImage(13);
|
|
DisplayStyleFactory.DisplayStyle[] styles = DisplayStyleFactory.getStyles().toArray(new DisplayStyleFactory.DisplayStyle[0]);
|
// 创建一个文本区
|
// 分别输入X,Y,width,heigth
|
// 注意区域坐标和宽度高度,不要越界
|
TextCaptionBxArea area = new TextCaptionBxArea( 0,0,160,64,screen.getProfile() );
|
|
// 创建一个数据页
|
// 第一行数据
|
TextBxPage page = new TextBxPage("入库");
|
// 第二行数据
|
page.newLine( "物料:" );
|
page.newLine("接收器 RX18 XH 6V (数量:2)");
|
page.newLine("中控 BM蓝牙 英文 6V (数量:1)");
|
page.newLine("线束 S2588-1-XX 无实物(数量:5)");
|
page.newLine("目标库位:0100204");
|
// 设置字体
|
page.setFont( new Font("宋体",Font.PLAIN,12) );
|
// 设置显示特技为快速打出
|
page.setDisplayStyle( styles[2] );
|
|
// 数据页可以是图片
|
// ImageFileBxPage iPage = new ImageFileBxPage( "E;a/001.bmp" );
|
//
|
// // 数据页可以是txt文件
|
// TextFileBxPage tPage = new TextFileBxPage("E:a/001.txt");
|
|
// 将前面的page添加到area中 area中可以添加多个page 其中page可以是字符串,可以是txt文件,可以是图片,不可以是表格,如果需要Led屏上显示表格,请先将表格绘制成图片
|
area.addPage( page );
|
// area.addPage( iPage );
|
// area.addPage( tPage );
|
// 将area添加到节目中 节目中可以添加多个area
|
pf.addArea( area );
|
|
// 更新节目
|
screen.writeProgram( pf );
|
|
|
|
|
|
|
|
|
|
|
//
|
// 以下是动态区部分 Demo
|
// 动态区的特点
|
|
// DynamicBxAreaRule(id, runMode, immediatePlay, timeout)
|
// runMode 运行模式:
|
// 0:循环显示。
|
// 1:显示完成后静止显示最后一页数据。
|
// 2:循环显示,超过设定时间后数据仍未更新时不再显示。
|
// 3:循环显示,超过设定时间后数据仍未更新时显示 Logo 信息。
|
// 4:循环显示,显示完最后一页后就不再显示。
|
// immediatePlay 是否立即播放:
|
// 0:与异步节目一起播放。
|
// 1:异步节目停止播放,仅播放动态区域。
|
// 2:当播放完节目编号最高的异步节目后播放该动态区域。
|
|
//
|
// 定义一个动态区
|
// 可以通过ID来更新不同的动态区内容, 此处 ID 为 0
|
// DynamicBxAreaRule dynRule = new DynamicBxAreaRule(0, (byte) 0, (byte) 1, 0);
|
//dArea.addProgram("P000");
|
//dArea.addProgram("P001");
|
|
// int posX = 440;
|
// int posY = 4;
|
// TextCaptionBxArea dAreaContent = new TextCaptionBxArea(posX, posY, 64, 16, screen.getProfile());
|
// TextBxPage page = new TextBxPage("动态第一次尝试");
|
// page.setDisplayStyle(DisplayStyleFactory.getStyle(4));
|
// dAreaContent.addPage(page);
|
//
|
// // 发送动态区之前,如果需要删除之前的动态区,可以调用以下接口
|
// // 通常如果动态区的位置或大小没有发生改变,不用删除
|
// screen.deleteAllDynamic();
|
//
|
// // 更新动态区
|
// screen.writeDynamic(dynRule, dAreaContent);
|
// Thread.sleep(15000);
|
//
|
// //
|
// // 下面模拟再次更新动态区
|
// page = new TextBxPage("再次尝试");
|
// TextBxPage page2 = new TextBxPage("成功");
|
//
|
// dAreaContent.clearPages();
|
// dAreaContent.addPage(page);
|
// dAreaContent.addPage(page2);
|
//
|
// // 更新动态区
|
// screen.writeDynamic(dynRule, dAreaContent);
|
|
//
|
// 继开与控制器之间的链接
|
screen.disconnect();
|
|
|
}
|
|
}
|