Skip to content

Formula zh

deng_ran edited this page Jul 8, 2021 · 1 revision

English | 中文

FastProto支持自定义数据变换公式,通过任意数据类型注解的afterDecode字段指定解码公式,FastProto会先按照数据类型解码,然后将解码得到的数值送入变换公式, 最后把变换公式的结果赋给被注解修饰的字段。同理,通过任意数据类型注解的beforeEncode字段指定编码公式,FastProto会先获取被修饰字段的数值,然后送入编码公式, 最后把编码公式的结果按照数据类型写入二进制报文。

例如压力信号对应一个换算公式,需要将解码后的数值乘以0.1,这种变换在物联网很常见。

Byte Offset Bit Offset Data Type(C/C++) Signal Name Unit Formula
14-17 unsigned int pressure Pa p * 0.1

解码公式

解码公式必须实现java.lang.function.Function接口, 且保证公式的输入类型与注解数据类型一致,输出类型与字段类型一致,否则会抛出DecodeFormulaException异常。

public class PressureDecodeFormula implements Function<Long, Double> {
    @Override
    public Double apply(Long value) {
        return value * 0.1;
    }
}
@UInteger32Type(value = 14, afterDecode = PressureDecodeFormula.class)
double pressure;

编码公式

编码公式必须实现java.lang.function.Function接口,且保证输入类型与字段类型一致,输出类型与注解类型一致,否则会抛出EncodeFormulaException异常。

public class PressureEncodeFormula implements Function<Double, Long> {
    @Override
    public Long apply(Double value) {
        return (long) (value * 10);
    }
}
@UInteger32Type(value = 14, afterDecode = PressureDecodeFormula.class, beforeEncode = PressureEncodeFormula.class)
double pressure;
Clone this wiki locally