/** Generate the pattern. */ public void BuildPattern( int length ) { // Are there any events ? if (layout.EventTimes.Count == 0) throw new PatternBuildException("No events to build pattern for."); // Is that big enough ? if ( length < layout.LastEventTime + 1 ) throw new PatternBuildException("Pattern will not fit in array of requested length.\n" + "Pattern length is " + layout.LastEventTime + ". Array length is " + length); // make the pattern array pattern = new UInt32[length]; // Get the event times and fill in the gaps ArrayList times = layout.EventTimes; int numberOfEvents = times.Count; // first the time before the first event, if there is any for (int i = 0 ; i < (int)times[0] ; i++ ) { pattern[i] = 0; } int endTime = 0; for (int j = 1 ; j < numberOfEvents ; j++ ) { int startTime = (int)times[j-1]; endTime = (int)times[j]; EdgeSet es = layout.GetEdgeSet(startTime); UInt32 nextInt; if (startTime != 0) { // middle of a pattern UInt32 previousInt = pattern[startTime - 1]; nextInt = GenerateNextInt( previousInt, es, true, startTime ); } else { // start of a pattern, special case UInt32 previousInt = 0; nextInt = GenerateNextInt( previousInt, es, false, startTime ); } // fill in the pattern for ( int i = startTime ; i < endTime ; i++ ) { pattern[i] = nextInt; } } // pad up to the end UInt32 padInt; if (endTime == 0) padInt = 0; else padInt = GenerateNextInt( pattern[endTime-1], layout.GetEdgeSet(endTime), true, endTime ); for (int i = endTime ; i < length ; i++ ) { pattern[i] = padInt; } GenerateInt16Pattern(); GenerateBytePattern(); }
public override String ToString() { StringBuilder sb = new StringBuilder(); // work out how many tabs are needed after the time field int maxTime = LastEventTime; int maxTimeLength = maxTime.ToString().Length; int maxTabs = maxTimeLength / 4 + 1; // Header sb.Append("t"); for (int i = 0; i < maxTabs; i++) { sb.Append("\t"); } for (int i = 0; i < channels; i++) { sb.Append(i + "\t"); } sb.Append("\n"); // Events foreach (DictionaryEntry ev in EventList) { int time = (int)ev.Key; EdgeSet es = (EdgeSet)ev.Value; // display this event sb.Append(time); // pad with tabs int timeLength = time.ToString().Length; int numTabs = maxTabs - (timeLength / 4); for (int i = 0; i < numTabs; i++) { sb.Append("\t"); } for (int i = 0; i < channels; i++) { EdgeSense sense = es.GetEdge(i); if (sense == EdgeSense.NC) { sb.Append("-\t"); } if (sense == EdgeSense.UP) { sb.Append("U\t"); } if (sense == EdgeSense.DOWN) { sb.Append("D\t"); } } sb.Append("\n"); } return(sb.ToString()); }
public void AddEdge( int channel, int time, bool sense ) { EdgeSet edgeSet = (EdgeSet)eventList[time]; // is there already an edgeSet at this time ? if (edgeSet == null) { // If not add a new one edgeSet = new EdgeSet(channels); edgeSet.AddEdge(channel, sense); eventList[time] = edgeSet; } else { // else add the edge to the existing one edgeSet.AddEdge(channel, sense); } }
public void AddEdge(int channel, int time, bool sense) { EdgeSet edgeSet = (EdgeSet)EventList[time]; // is there already an edgeSet at this time ? if (edgeSet == null) { // If not add a new one edgeSet = new EdgeSet(channels); edgeSet.AddEdge(channel, sense); EventList[time] = edgeSet; } else { // else add the edge to the existing one edgeSet.AddEdge(channel, sense); } }
private UInt32 GenerateNextInt( UInt32 previousInt, EdgeSet es, bool throwError, int time) { // build a bit mask for the upwards edges UInt32 upMask = 0; for (int i = 0 ; i < 32 ; i++) if (es.GetEdge(i) == EdgeSense.UP) upMask = upMask | bitValues[i]; // and the downwards edges UInt32 downMask = 0; for (int i = 0 ; i < 32 ; i++) if (es.GetEdge(i) == EdgeSense.DOWN) downMask = downMask | bitValues[i]; // error checking if (throwError) { if ( (upMask & previousInt) != 0 ) throw new PatternBuildException("Edge conflict on upward edge at time " + time); if ( (downMask & ~previousInt) != 0 ) throw new PatternBuildException("Edge conflict on downward edge at time " + time); } UInt32 returnInt = previousInt | upMask; returnInt = ~(~returnInt | downMask); return returnInt; }