Message0202.java 5.43 KB
package com.bsth.socket.protocol;

import com.bsth.constant.Constant;
import com.bsth.util.ConvertUtil;

import java.util.ArrayList;
import java.util.List;

/**
 * @author Hill
 * 驱动电机数据
 */
public class Message0202 implements IMessageBody02 {

	/**
	 * 信息类型
	 * 默认应该为0x02
	 */
	private byte infoType;

	/**
     * 驱动电机数量 1-253
	 */
	private byte electricMotorQuantity;

	private List<ElectricMotor> electricMotorList = new ArrayList<>();

	@Override
	public void read(byte[] bytes, int idx) {
		// TODO Auto-generated method stub
		infoType = bytes[idx]; idx++;
		electricMotorQuantity = bytes[idx]; idx++;
		int quantity = electricMotorQuantity & Constant.BYTE_INT;
		if (idx + quantity * ElectricMotor.BYTE_LEN < bytes.length - 1) {
			for (int i = 0;i < quantity;i ++) {
				ElectricMotor electricMotor = new ElectricMotor();
				electricMotor.read(bytes, idx); idx += ElectricMotor.BYTE_LEN;
				electricMotorList.add(electricMotor);
			}
		} else {
			throw new IllegalArgumentException("异常的驱动电机数据");
		}
	}

	public byte getInfoType() {
		return infoType;
	}

	public void setInfoType(byte infoType) {
		this.infoType = infoType;
	}

	public byte getElectricMotorQuantity() {
		return electricMotorQuantity;
	}

	public void setElectricMotorQuantity(byte electricMotorQuantity) {
		this.electricMotorQuantity = electricMotorQuantity;
	}

	public List<ElectricMotor> getElectricMotorList() {
		return electricMotorList;
	}

	public void setElectricMotorList(List<ElectricMotor> electricMotorList) {
		this.electricMotorList = electricMotorList;
	}

	@Override
	public int getByteLen() {
		return electricMotorList.size() * ElectricMotor.BYTE_LEN + 2;
	}

	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder();
		sb.append(" 信息类型: ").append(String.format("%02x", infoType))
		.append(" 驱动电机数量: ").append(electricMotorQuantity);

		for (ElectricMotor electricMotor : electricMotorList) {
			sb.append(electricMotor.toString());
		}

		return sb.toString();
	}

	public static class ElectricMotor {

		private final static int BYTE_LEN = 12;

		/**
		 * 驱动电机序号 1-253
		 */
		private byte serialNo;

		/**
		 * 驱动电机状态 1-253
		 * 0x01 耗电
		 * 0x02 发电
		 * 0x03 关闭
		 * 0x04 准备
		 * 0xFE 异常
		 * 0xFF 无效
		 */
		private byte state;

		/**
		 * 驱动电机控制器温度 0-250
		 * 分辨率1℃ 偏移量-40
		 * 0xFE 异常
		 * 0xFF 无效
		 */
		private byte controllerTemperature;

		/**
		 * 电机转速 0-65531
		 * 分辨率1r/min 偏移量-20000
		 * 0xFF 0xFE 异常
		 * 0xFF 0xFF 无效
		 */
		private short speed;

		/**
		 * 电机扭矩 0-65531
		 * 分辨率0.1N.m 偏移量-20000
		 * 0xFF 0xFE 异常
		 * 0xFF 0xFF 无效
		 */
		private short torsion;

		/**
		 * 驱动电机温度 0-250
		 * 分辨率1℃ 偏移量-40
		 * 0xFE 异常
		 * 0xFF 无效
		 */
		private byte temperature;

		/**
		 * 电机控制器电压 0-60000
		 * 分辨率0.1v
		 * 0xFF 0xFE 异常
		 * 0xFF 0xFF 无效
		 */
		private short controllerVoltage;

		/**
		 * 电机控制器电流 0-20000
		 * 分辨率0.1a
		 * 0xFF 0xFE 异常
		 * 0xFF 0xFF 无效
		 */
		private short controllerCurrent;

		public void read(byte[] bytes, int idx) {
			serialNo = bytes[idx]; idx ++;
			state = bytes[idx]; idx ++;
			controllerTemperature = bytes[idx]; idx ++;
			speed = (short) ConvertUtil.bytes2int(bytes, idx, 2); idx += 2;
			torsion = (short) ConvertUtil.bytes2int(bytes, idx, 2); idx += 2;
			temperature = bytes[idx]; idx ++;
			controllerVoltage = (short) ConvertUtil.bytes2int(bytes, idx, 2); idx += 2;
			controllerCurrent = (short) ConvertUtil.bytes2int(bytes, idx, 2); idx += 2;
		}

		public byte getSerialNo() {
			return serialNo;
		}

		public void setSerialNo(byte serialNo) {
			this.serialNo = serialNo;
		}

		public byte getState() {
			return state;
		}

		public void setState(byte state) {
			this.state = state;
		}

		public byte getControllerTemperature() {
			return controllerTemperature;
		}

		public void setControllerTemperature(byte controllerTemperature) {
			this.controllerTemperature = controllerTemperature;
		}

		public short getSpeed() {
			return speed;
		}

		public void setSpeed(short speed) {
			this.speed = speed;
		}

		public short getTorsion() {
			return torsion;
		}

		public void setTorsion(short torsion) {
			this.torsion = torsion;
		}

		public byte getTemperature() {
			return temperature;
		}

		public void setTemperature(byte temperature) {
			this.temperature = temperature;
		}

		public short getControllerVoltage() {
			return controllerVoltage;
		}

		public void setControllerVoltage(short controllerVoltage) {
			this.controllerVoltage = controllerVoltage;
		}

		public short getControllerCurrent() {
			return controllerCurrent;
		}

		public void setControllerCurrent(short controllerCurrent) {
			this.controllerCurrent = controllerCurrent;
		}

		@Override
		public String toString() {
			StringBuilder sb = new StringBuilder();
			sb.append(" 驱动电机序号: ").append(serialNo)
			.append(" 驱动电机状态: ").append(state)
			.append(" 驱动控制器温度: ").append(controllerTemperature)
			.append(" 驱动电机转速: ").append(speed)
			.append(" 电机扭矩: ").append(torsion)
			.append(" 驱动电机温度: ").append(temperature)
			.append(" 控制器电压: ").append(controllerVoltage)
			.append(" 控制器电流: ").append(controllerCurrent)
			.append(" \n");

			return sb.toString();
		}
	}
}