Commit b2c7f8a8 authored by duanruiming's avatar duanruiming

[add] 海信方案环相位解析

parent d0734422
package net.wanji.utc.common.typeenum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.Objects;
/**
* @author duanruiming
* @date 2024/11/12 15:14
*/
@Getter
@AllArgsConstructor
public enum HisenseTurnEnum {
/**
*
*/
TURN_1(1, 1, "左"),
TURN_2(2, 2, "直"),
TURN_3(3, 3, "右"),
TURN_4(4, 4, "调头"),
TURN_5(5, 1, "左调头"),
TURN_6(6, 2, "左直"),
TURN_7(7, 1, "左右"),
TURN_8(8, 2, "直右"),
TURN_9(9, 2, "左直右"),
TURN_11(11, 21, "入口行人"),
TURN_10(10, 2, "直调头"),
TURN_12(12, 22, "出口行人"),
TURN_13(13, 20, "出入口行人"),
TURN_14(14, 2, "左直调头"),
TURN_15(15, 3, "右调头"),
TURN_16(16, 1, "左右调头"),
TURN_17(17, 2, "直右掉头"),
TURN_18(18, 2, "左直右掉头");
private Integer hisenseTurn;
private Integer wjLightsTurn;
private String desc;
public static Integer getWjLightsTurn(Integer hisenseTurn) {
for (HisenseTurnEnum value : HisenseTurnEnum.values()) {
if (Objects.equals(hisenseTurn, value.getHisenseTurn())) {
return value.getWjLightsTurn();
}
}
return 0;
}
}
package net.wanji.utc.common.typeenum;
import lombok.AllArgsConstructor;
import lombok.Getter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
* @author duanruiming
* @date 2024/11/12 15:04
*/
@Getter
@AllArgsConstructor
public enum HiseseDirEnum {
// '灯组方向:1北;2东北;3东;4东南;5南;6西南;7西;8西北',
ZERO(0,1, "北"),
ONE(1,3, "东"),
TWO(2,5, "南"),
THREE(3,7, "西"),
FOUR(4,2, "东北"),
FIVE(5,4, "东南"),
SIX(6,6, "西南"),
SEVEN(7,8, "西北");
private Integer hisenseDir;
private Integer wjLightsDir;
private String desc;
public static Integer getWjLightsDir(Integer hisenseDir) {
for (HiseseDirEnum value : HiseseDirEnum.values()) {
if (Objects.equals(hisenseDir, value.getHisenseDir())) {
return value.getWjLightsDir();
}
}
return 0;
}
public static void main(String[] args) throws Exception {
String format = String.format("%16s", Integer.toBinaryString(26)).replace(' ', '0');
char[] chars = format.toCharArray();
List<Integer> result = new ArrayList<>();
int length = chars.length;
for (int i = 0; i < length; i++) {
if (chars[i] == '1') {
result.add(length - i);
}
}
Collections.sort(result);
result.forEach(i -> {
System.err.println(i);
});
}
}
...@@ -2,6 +2,8 @@ package net.wanji.utc.dto.ring; ...@@ -2,6 +2,8 @@ package net.wanji.utc.dto.ring;
import lombok.Data; import lombok.Data;
import java.util.List;
/** /**
* @author duanruiming * @author duanruiming
* @date 2025/03/28 14:41 * @date 2025/03/28 14:41
...@@ -9,8 +11,18 @@ import lombok.Data; ...@@ -9,8 +11,18 @@ import lombok.Data;
@Data @Data
public class RingPhaseInfoDTO { public class RingPhaseInfoDTO {
private Integer schemeNo;
private Integer offset;
private Integer cycleLen;
private Integer ringNo;
private Integer phaseId; private Integer phaseId;
private Integer sort;
private Integer phaseTime; private Integer phaseTime;
private Integer redTime; private Integer redTime;
...@@ -23,6 +35,10 @@ public class RingPhaseInfoDTO { ...@@ -23,6 +35,10 @@ public class RingPhaseInfoDTO {
private Integer maxGTime; private Integer maxGTime;
/**
* 字段 Direction 和 ChannelDim 都表示相位的放行方向,但 Direction 不包含行人放行
* 信息,因此,建议使用 ChannelDim 字段,保留 Direction 字段仅为兼容之前版本。
*/
private Integer direction; private Integer direction;
private Integer channel; private Integer channel;
...@@ -30,4 +46,15 @@ public class RingPhaseInfoDTO { ...@@ -30,4 +46,15 @@ public class RingPhaseInfoDTO {
private Integer concurrent; private Integer concurrent;
private Integer phaseStatus; private Integer phaseStatus;
private List<DirTurn> dirTurnInfoList;
/**
* 转换后万集的方向转向,不包含行人
*/
@Data
public static class DirTurn {
private Integer dir;
private Integer turn;
}
} }
package net.wanji.utc.util;
import cn.hutool.core.util.HexUtil;
import freemarker.template.utility.StringUtil;
import net.wanji.common.utils.tool.ScheduleUtil;
import net.wanji.utc.common.typeenum.HisenseTurnEnum;
import net.wanji.utc.common.typeenum.HiseseDirEnum;
import java.util.ArrayList;
import java.util.List;
/**
* @author duanruiming
* @date 2023/06/20 15:07
*/
public class CommonUtils {
/**
* 将数组转化为16进制字符串
*
* @param array
* @return
*/
public static String getHex4Array(int[] array) {
StringBuilder sb = new StringBuilder();
for (int i : array) {
sb.append(i);
}
Integer binary = Integer.valueOf(sb.reverse().toString(), 2);
return HexUtil.toHex(binary);
}
/**
* 将时间转化为16进制 00:00 --> 061E0
*
* @param time
* @return
*/
public static String getHourMinuteHex(String time) {
StringBuffer sb = new StringBuffer();
String[] split = time.split(":");
String hour = String.format("%02x", Integer.valueOf(split[0]));
String minute = String.format("%02x", Integer.valueOf(split[1]));
return sb.append(hour).append(minute).toString();
}
/**
* 将相位转化为64位数组,在转化为16位的16进制
*
* @param param
* @return
*/
public static String getBinary(Integer param) {
int[] array = new int[64];
array[param - 1] = 1;
StringBuffer resultSb = new StringBuffer();
for (int i = 0; i < array.length / 8; i++) {
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 8; j++) {
sb.append(array[i * 8 + j]);
}
String hex = String.format("%02x", Integer.parseInt(sb.reverse().toString(), 2));
resultSb.insert(0, hex);
}
return StringUtil.leftPad(resultSb.toString(), 16, "0");
}
/**
* 将单个参数转化为4位二进制
*
* @param param
* @return
*/
public static Integer get4BinaryInteger(Integer param) {
int[] array = new int[4];
int index = param % 4;
if (param % 4 != 0) {
array[4 - index] = 1;
} else {
array[0] = 1;
}
StringBuffer sb = new StringBuffer();
for (int j = 0; j < 4; j++) {
sb.append(array[j]);
}
return Integer.parseInt(sb.toString(), 2);
}
/**
* 通过灯组编号获取灯组转向, 1 左转 2 直 3 右 20 行人
*
* @param lightId
* @return
*/
public static Integer getTurnByLightsId(Integer lightId) {
Integer turn = null;
if (lightId % 4 == 0) {
turn = 1;
}
if (lightId % 4 == 1) {
turn = 2;
}
if (lightId % 4 == 2) {
turn = 3;
}
if (lightId % 4 == 3) {
turn = 20;
}
return turn;
}
public static Integer getDirByLightsId(Integer lightsId) {
Integer dir = null;
if (lightsId < 4) {
dir = 1;
}
if (lightsId >= 4 && lightsId < 8) {
dir = 3;
}
if (lightsId >= 8 && lightsId < 12) {
dir = 5;
}
if (lightsId >= 12 && lightsId < 16) {
dir = 7;
}
return dir;
}
/**
* @Description 将字符串分成八个一组,不够的最前面补0
* @Param [input]
* @return java.util.List<java.lang.String>
**/
public static List<String> groupStringFromRight(String input) {
List<String> list = new ArrayList<>();
if (input == null || input.isEmpty()) {
return null;
}
// 计算需要多少个完整的8字符组
int fullGroups = input.length() / 8;
// 计算最后一个组中的字符数
int lastGroupSize = input.length() % 8;
StringBuilder result = new StringBuilder(input);
String str = "";
if (lastGroupSize > 0) {
// 计算需要补多少个0
int padding = 8 - lastGroupSize;
for (int i = 0; i < padding; i++) {
str = str+"0";
}
}
input = str+result.toString();
int size =input.length()/8;
for (int i = 0; i < size; i++) {
String substring = input.substring(i * 8, (i + 1) * 8);
list.add(substring);
}
return list;
}
public static void main(String[] args) {
int l = 6442253;
String binaryString = Integer.toBinaryString(l);
List<String> readUtf8Lines = groupStringFromRight(binaryString);
System.out.println(readUtf8Lines.size());
for (String readUtf8Line : readUtf8Lines) {
System.out.println(readUtf8Line);
String dir = readUtf8Line.substring(0, 3); // 高三位 方向
String turn = readUtf8Line.substring(3); // 低五位 转向
System.out.println(ScheduleUtil.binaryIntToDecimalism(dir)+"_"+ScheduleUtil.binaryIntToDecimalism(turn));
Integer wjLightsDir = HiseseDirEnum.getWjLightsDir(Integer.parseInt(dir, 2));
Integer wjLightsTurn = HisenseTurnEnum.getWjLightsTurn(Integer.parseInt(turn, 2));
System.out.println("wjLightsDir "+wjLightsDir);
System.out.println("wjLightsTurn "+wjLightsTurn);
System.out.println("======================================");
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment