private void preProcessTimeRef(final Collection<TypedCircularMessage> typedCircularMessages) { ticksPerNano = -1; long timeClock1 = -1; long timeClock2 = -1; long timeTicks1 = -1; long timeTicks2 = -1; long timeClocksPerSec = -1; for (final TypedCircularMessage msg : typedCircularMessages) { if (msg.getStruct().getId() != Message.TIME_REF.srlTypeId()) { continue; } final Long secondsSince1970 = (Long) msg.getValue("secondsSince1970"); if (secondsSince1970 != null) { // TODO: save timebase in header? } final Long clock = (Long) msg.getValue("clock"); if (clock == null) { continue; } final Long clocksPerSec = (Long) msg.getValue("clocksPerSec"); if (clocksPerSec == null || clocksPerSec < 1) { continue; } if (timeClock1 == -1) { timeClock1 = clock; timeTicks1 = ((CircularMessage) msg.getMessage()).getTs(); timeClock2 = -1; continue; } if (timeClock2 == -1) { timeClock2 = clock; timeTicks2 = ((CircularMessage) msg.getMessage()).getTs(); timeClocksPerSec = clocksPerSec; break; } } if (timeClock1 == -1 || timeClock2 == -1) { return; } if (timeTicks1 == -1 || timeTicks2 == -1) { return; } if (timeClock1 > timeClock2) { long temp = timeClock2; timeClock2 = timeClock1; timeClock1 = temp; temp = timeTicks2; timeTicks2 = timeTicks1; timeTicks1 = temp; } if (timeClock1 >= timeClock2 || timeTicks1 >= timeTicks2) { return; } final double temp1 = timeClocksPerSec * (timeTicks2 - timeTicks1); final double temp2 = NANO_PER_SEC * (timeClock2 - timeClock1); ticksPerNano = temp1 / temp2; }
private void getEvents(final Collection<TypedCircularMessage> events) { final List<TypedCircularMessage> cmList = new ArrayList<TypedCircularMessage>(events); sort(cmList); boolean isFirstFunction = true; int functionIndex = 0; for (int i = 0; i < cmList.size(); i++) { final TypedCircularMessage message = cmList.get(i); final long ts = resolveTimeStamp(((CircularMessage) message.getMessage()).getTs()); final int id = message.getStruct().getId(); if (dummyRun && (id >= 0)) { continue; } if (id == Message.ROSE_RECEIVE.srlTypeId()) { getRoseReceive(message, ts); } else if (id == Message.ROSE_SEND.srlTypeId()) { final long receivedAt = findReceiveTime(message, cmList, i); getRoseSend(message, receivedAt, ts); } else if (id == Message.TASK_SWITCH.srlTypeId()) { getTaskSwitch(message, ts); } else if (id == Message.INT_BEGIN.srlTypeId()) { handleInterruptBegin(message, ts); } else if (id == Message.INT_END.srlTypeId()) { handleInterruptEnd(message, ts); } else if (id == Message.TASK_COMPLETE.srlTypeId()) { if (getTaskCompletion(message, ts)) {} } else if (id == Message.TASK_RELEASE.srlTypeId()) { if (getTaskRelease(message, cmList, i, ts)) {} } else if (id == Message.TIME_REF.srlTypeId()) { // nothing todo } else if (id == Message.UML_SEND.srlTypeId()) { final long receivedAt = findReceiveTime(message, cmList, i); getUMLSend(message, receivedAt, ts); } else if (id == Message.UML_RECEIVE.srlTypeId()) { getUMLreceive(message, ts); } else if (id == Message.FUNCTION_ENTER.srlTypeId()) { long endTime = -1; if (isFirstRun) { if (!isFirstFunction) { functionTimestamps.add(ts); } else { isFirstFunction = false; } } else { if (functionIndex < functionTimestamps.size()) { endTime = functionTimestamps.get(functionIndex++); } } getFunctionEnter(message, endTime, ts); } else if (id == Message.FUNCTION_EXIT.srlTypeId()) { long endTime = -1; if (isFirstRun) { if (!isFirstFunction) { functionTimestamps.add(ts); } else { isFirstFunction = false; } } else { if (functionIndex < functionTimestamps.size()) { endTime = functionTimestamps.get(functionIndex++); } } getFunctionExit(message, endTime, ts); } else if (id == Message.UML_EXAMPLE_DATA.srlTypeId()) { } else if (id < 0) { getUserEvent(message, ts); } else { throw new UnsupportedOperationException("Can not handle id = " + id); } } }