fullipsori / autoever-str

0 stars 0 forks source link

체크 로직 #4

Open fullipsori opened 1 year ago

fullipsori commented 1 year ago
public static Object EvalCAN(TriggerParser trigger, Tuple canmsg) {
    try {
        byte[] rawdata = Base64.decode(canmsg.getString("DATA"));
        long baseTime = canmsg.getLong("BaseTime");
        int rawvalue = 0;
        int startbyte = trigger.sigstartbit >> 3;
        int lastbyte = (trigger.sigstartbit + trigger.siglength -1) >> 3;

        trigger.time = canmsg.getLong("DeltaTime");

        /** fullipsori: java 에서 동작하는지 확인 필요함 **/
        if("Little".equalsIgnoreCase(trigger.sigendian)) {

            for(int i=lastbyte; i > startbyte-1; i--) {
                rawvalue = rawvalue*256 + rawdata[i];
            }
            rawvalue = rawvalue >> (trigger.sigstartbit % 8);
            /**
            byteBuffer = ByteBuffer.wrap(rawdata, startbyte, lastbyte-startbyte+1).order(ByteOrder.LITTLE_ENDIAN);
            rawvalue = byteBuffer.getInt();
            rawvalue = rawvalue>> (trigger.sigstartbit % 8);
            **/
        }else {

            for(int i=startbyte; i<lastbyte+1; i++) {
                rawvalue = rawvalue * 256 + rawdata[i];
            }
            rawvalue = rawvalue >> ((8000 - trigger.sigstartbit - trigger.siglength) % 8);
            /**
            byteBuffer = ByteBuffer.wrap(rawdata, startbyte, lastbyte-startbyte+1).order(ByteOrder.BIG_ENDIAN);
            rawvalue = byteBuffer.getInt();
            rawvalue = rawvalue>> ((8000 - trigger.sigstartbit - trigger.siglength) % 8);
            **/
        }
        /*
        rawvalue = rawvalue & ((int)Math.pow(2,trigger.siglength) -1);
        if("signed".equals(trigger.sigtype)) {
            if((rawvalue & (1<<(trigger.siglength-1))) != 0) {
                rawvalue = (-(((~rawvalue) & ((int)Math.pow(2, trigger.siglength) -1)) + 1));
            }
        }
        */
        rawvalue = rawvalue & (int)(((long)1<< trigger.siglength) - 1);
        if((rawvalue & (int)(((long)1)<<(trigger.siglength - 1))) != 0)
            rawvalue = (-(((~rawvalue) & (int)(((long)1)<<trigger.siglength - 1)) + 1));

        double value = rawvalue * trigger.sigfactor + trigger.sigoffset;
        boolean rvalue = false;

        switch(trigger.conditionformula) {
            case "GE": {
                if(value >= trigger.conditionvalue)
                    rvalue = true;
                break;
            }
            case "GT": {
                if(value > trigger.conditionvalue)
                    rvalue = true;
                break;
            }
            case "LE": {
                if(value <= trigger.conditionvalue)
                    rvalue = true;
                break;
            }
            case "LT": {
                if(value < trigger.conditionvalue)
                    rvalue = true;
                break;
            }
            case "EQ": {
                if(value == trigger.conditionvalue) 
                    rvalue = true;
                break;
            }
            case "NEQ": {
                if(value != trigger.conditionvalue)
                    rvalue = true;
                break;
            }
            case "DIFF": {
                if(trigger.lastvalue == null) {
                    trigger.lastvalue = value;
                }else if(value != trigger.lastvalue) {
                    trigger.status = true;
                    trigger.lastvalue = value;
                    return trigger.eventCallback.OnCalled(trigger.time, true, String.valueOf(value));
                }
                return trigger.eventCallback.OnCalled(trigger.time, null, String.valueOf(value));
            }
        }

        if(trigger.status != rvalue) {
            if(trigger.conditionTime + trigger.conditionduration <= trigger.time + baseTime) {
                trigger.status = rvalue;
                trigger.conditionTime = trigger.time + baseTime;
                if(!"DIFF".equals(trigger.conditionformula)) {
                    //fullipsori check second parm (trigger.time)
                    return trigger.eventCallback.OnCalled(trigger.time, false, String.valueOf(value));
                }
            }
        }else {
            trigger.status = rvalue;
            if(trigger.conditionTime == 0) {
                trigger.conditionTime = trigger.time + baseTime;
                if(!"DIFF".equals(trigger.conditionformula)) {
                    return trigger.eventCallback.OnCalled(trigger.time, false, String.valueOf(value));
                }
            }
        }
        return trigger.eventCallback.OnCalled(trigger.time, null, String.valueOf(value));

    } catch (Exception e) {
        System.out.println("Exception:" + e.getMessage());
        return null;
    }
}

public static Object EvalDM1(TriggerParser trigger, Tuple dm1msg) {
    try {
        byte[] rawdata = Base64.decode(dm1msg.getString("DATA"));
        int dataID= dm1msg.getInt("DataID");
        trigger.time = dm1msg.getLong("DeltaTime");

        if(trigger.id == (dataID & 0x00FFFFFF)) {
            if(rawdata[5] == (byte)0xCA && rawdata[6] == (byte)0xFE) {
                trigger.nowDmSize = (rawdata[2] & (byte)0xF) * 256 + rawdata[1];
                trigger.dm1Data = rawdata;
            }else {
                trigger.dm1Data = null;
            }
        }else if(trigger.tpdtID == (dataID & 0x00FFFFFF) && trigger.lamp.equals("False")) {
            if(trigger.dm1Data != null && rawdata[0] == 1) {
                if(trigger.lastDmSize == 0) {
                    trigger.lastDmSize = trigger.nowDmSize;
                }else {
                    if(trigger.nowDmSize != trigger.lastDmSize) {
                        trigger.status = true;
                        trigger.lastDmSize = trigger.nowDmSize;
                        trigger.lastDm1 = StringUtils.mergeByteArray(Arrays.copyOfRange(rawdata, 3, 6), Arrays.copyOfRange(rawdata, 7, rawdata.length));
                        trigger.dm1Data = null;
                        return trigger.eventCallback.OnCalled(trigger.time, true, null); 
                    }
                }

                if(trigger.lastDm1 == null) {
                    trigger.status = true;
                    trigger.lastDm1 = StringUtils.mergeByteArray(Arrays.copyOfRange(rawdata, 3, 6), Arrays.copyOfRange(rawdata, 7, rawdata.length));
                    trigger.dm1Data = null;
                    return trigger.eventCallback.OnCalled(trigger.time, true, null);
                }else {
                    if(!Arrays.equals(trigger.lastDm1, StringUtils.mergeByteArray(Arrays.copyOfRange(rawdata, 3, 6), Arrays.copyOfRange(rawdata, 7, rawdata.length)))) {
                        trigger.status = true;
                        trigger.lastDm1 = StringUtils.mergeByteArray(Arrays.copyOfRange(rawdata, 3, 6), Arrays.copyOfRange(rawdata, 7, rawdata.length));
                        trigger.dm1Data = null;
                        return trigger.eventCallback.OnCalled(trigger.time, true, null);
                    }
                }
            }
        }else if(trigger.tpdtID == (dataID & 0x00FFFFFF) && "AWL".equals(trigger.lamp)) {
            if(trigger.dm1Data != null && rawdata[0] == 1) {
                boolean rvalue = false;
                int awlStatus = (rawdata[1] & (byte)0B00001100) >> 2;
                if(awlStatus == 1) {
                    rvalue = true;
                }
                trigger.status = rvalue;
                return trigger.eventCallback.OnCalled(trigger.time, false, null);
            }
        }else if(trigger.tpdtID == (dataID & 0x00FFFFFF) && "RSL".equals(trigger.lamp)) {
            if(trigger.dm1Data != null && rawdata[0] == 1) {
                boolean rvalue = false;
                int awlStatus = (rawdata[1] & 0B00110000) >> 4;
                if(awlStatus == 1) {
                    rvalue = true;
                }
                trigger.status = rvalue;
                return trigger.eventCallback.OnCalled(trigger.time, false, null);
            }
        }
        return trigger.eventCallback.OnCalled(trigger.time, null, null);

    }catch(Exception e) {
        System.out.println("Exception:" + e.getMessage());
        return null;
    }
}

public static Object EvalUDS(TriggerParser trigger, Tuple udsmsg) {
    try {
        byte[] rawdata = Base64.decode(udsmsg.getString("DATA"));
        int frameType = ((int)rawdata[0]) >> 4;;
        int length;

        trigger.time = udsmsg.getLong("DeltaTime");

        if(frameType == 0) {
            length = rawdata[0] & (byte)0xF;
            if(rawdata[1] == (byte)0x59 || rawdata[1] == (byte)0x58) {
                if(trigger.lastLength == 0) {
                    trigger.lastLength = length;
                    if(length > 3) {
                        trigger.status = true;
                        return trigger.eventCallback.OnCalled(trigger.time, true, null);
                    }
                }else {
                    if(trigger.lastLength != length && length > 3) {
                        trigger.status = true;
                        trigger.lastLength = length;
                        return trigger.eventCallback.OnCalled(trigger.time, true, null);
                    }else if(trigger.lastLength != length && length <= 3) {
                        trigger.status = false;
                        trigger.lastLength = length;
                        return trigger.eventCallback.OnCalled(trigger.time, true, null);
                    }
                }
            }
        }else if(frameType == 1) {
            length = (rawdata[0] & (byte)0xF) * 256 + rawdata[1];
            if(rawdata[2] == (byte)0x59 || rawdata[2] == (byte)0x58) {
                if(trigger.lastLength != length) {
                    trigger.status = true;
                    trigger.lastLength = length;
                    return trigger.eventCallback.OnCalled(trigger.time, true, null);
                }
            }
        }

        return trigger.eventCallback.OnCalled(trigger.time, null, null);

    }catch(Exception e) {
        System.out.println("Exception:" + e.getMessage());
        return null;
    }
}