/******************************************************************************* * sdrtrunk * Copyright (C) 2014-2017 Dennis Sheirer * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/> * ******************************************************************************/ package module.decode.event; import alias.Alias; import alias.AliasList; import module.decode.DecoderType; import java.text.SimpleDateFormat; import java.util.Date; public abstract class CallEvent implements Comparable<CallEvent> { protected long mEventStart = System.currentTimeMillis(); protected long mEventEnd; private SimpleDateFormat DATE_FORMATTER = new SimpleDateFormat("yyyyMMdd"); private SimpleDateFormat TIME_FORMATTER = new SimpleDateFormat("HHmmss"); protected DecoderType mDecoderType; protected CallEventType mCallEventType; protected AliasList mAliasList; protected String mFromID; protected String mToID; protected String mDetails; private boolean mValid = true; public CallEvent(DecoderType decoder, CallEventType callEventType, AliasList aliasList, String fromID, String toID, String details) { mDecoderType = decoder; mCallEventType = callEventType; mAliasList = aliasList; mFromID = fromID; mToID = toID; mDetails = details; } /** * Indicates if this event is valid. Use this method to mark a previously * dispatched event as invalid and resend it so that any downstream * processing can remove the invalid event. */ public void setValid(boolean valid) { mValid = valid; } public boolean isValid() { return mValid; } public void setEnd(long end) { mEventEnd = end; } public void end() { setEnd(System.currentTimeMillis()); } public DecoderType getDecoderType() { return mDecoderType; } public CallEventType getCallEventType() { return mCallEventType; } public void setCallEventType(CallEventType type) { mCallEventType = type; } public AliasList getAliasList() { return mAliasList; } public void setAliasList(AliasList aliasList) { mAliasList = aliasList; } public boolean hasAliasList() { return mAliasList != null; } public long getEventStartTime() { return mEventStart; } public long getEventEndTime() { return mEventEnd; } public String getFromID() { return mFromID; } public boolean hasFromID() { return mFromID != null; } public void setFromID(String id) { mFromID = id; } public String getToID() { return mToID; } public boolean hasToID() { return mToID != null; } public void setToID(String id) { mToID = id; } public String getDetails() { return mDetails; } public void setDetails(String details) { mDetails = details; } public abstract Alias getFromIDAlias(); public abstract Alias getToIDAlias(); public abstract String getChannel(); public abstract long getFrequency(); public static String getCSVHeader() { return "START_DATE,START_TIME,END_DATE,END_TIME,DECODER,EVENT,FROM,FROM_ALIAS,TO,TO_ALIAS,CHANNEL," + "FREQUENCY,DETAILS"; } public String toCSV() { StringBuilder sb = new StringBuilder(); sb.append("'"); Date eventStart = new Date(getEventStartTime()); sb.append(DATE_FORMATTER.format(eventStart)); sb.append("','"); sb.append(TIME_FORMATTER.format(eventStart)); sb.append("','"); if(mEventEnd != 0) { Date eventEnd = new Date(getEventEndTime()); sb.append(DATE_FORMATTER.format(eventEnd)); sb.append("','"); sb.append(TIME_FORMATTER.format(eventEnd)); sb.append("','"); } else { sb.append("','',"); } sb.append("','"); sb.append(getDecoderType().toString()); sb.append("','"); sb.append(getCallEventType().toString()); sb.append("',"); if(getFromID() != null) { sb.append("'"); sb.append(getFromID()); sb.append("'"); } sb.append(","); Alias fromAlias = getFromIDAlias(); if(fromAlias != null) { sb.append("'"); sb.append(fromAlias.getName()); sb.append("'"); } sb.append(","); if(getToID() != null) { sb.append("'"); sb.append(getToID()); sb.append("'"); } sb.append(","); Alias toAlias = getToIDAlias(); if(toAlias != null) { sb.append("'"); sb.append(toAlias.getName()); sb.append("'"); } sb.append(",'"); sb.append(getChannel()); sb.append("','"); sb.append(getFrequency()); sb.append("',"); if(getDetails() != null) { sb.append("'"); sb.append(getDetails()); sb.append("'"); } return sb.toString(); } public enum CallEventType { ANNOUNCEMENT("Announcement"), CALL("Call"), CALL_ALERT("Call Alert"), CALL_DETECT("Call Detect"), CALL_DO_NOT_MONITOR("Call-Do Not Monitor"), CALL_END("Call End"), CALL_UNIQUE_ID("UID Call"), CALL_NO_TUNER("Call - No Tuner"), CALL_TIMEOUT("Call Timeout"), COMMAND("Command"), DATA_CALL("Data Call"), DEREGISTER("Deregister"), EMERGENCY("EMERGENCY"), ENCRYPTED_CALL("Encrypted Call"), FUNCTION("Function"), GPS("GPS"), GROUP_CALL("Group Call"), ID_ANI("ANI"), ID_UNIQUE("Unique ID"), NOTIFICATION("Notification"), PAGE("Page"), PATCH_GROUP_ADD("Patch Group Add"), PATCH_GROUP_CALL("Patch Group Call"), PATCH_GROUP_DELETE("Patch Group Delete"), QUERY("Query"), REGISTER("Register"), REGISTER_ESN("ESN"), RESPONSE("Response"), SDM("Short Data Message"), STATION_ID("Station ID"), STATUS("Status"), TELEPHONE_INTERCONNECT("Telephone Interconnect"), UNIT_TO_UNIT_CALL("Unit To Unit Call"), UNKNOWN("Unknown"), INVALID("Invalid"); private String mLabel; private CallEventType(String label) { mLabel = label; } public String getLabel() { return mLabel; } public String toString() { return mLabel; } } @Override public int compareTo(CallEvent other) { if(other != null && other == this) { return 0; } return Long.compare(mEventStart, other.getEventStartTime()); } }