// Matthew Clapp // itsayellow@gmail.com // April 8, 2016 // // hbounds to restrict wave display between // mintick and maxtick (plus unavoidable after maxtick for period>1) (function () { function num_data_dropped( in_wave, minchar ) { var eq_count = 0; var i=0; // count eq-signs before slice for (i=minchar-1; i >= 0; i-- ) { if (in_wave[i]==="=" || in_wave[i]==="3" || in_wave[i]==="4" || in_wave[i]==="5") { eq_count++; } } // if first char of slice is ., see if prev char to . // is a data char, and if so, eq_count-- if (in_wave[minchar] === ".") { for (i=minchar-1; i >= 0; i-- ) { if (in_wave[i] !== ".") { // first non-. char before . if (in_wave[i]==="=" || in_wave[i]==="3" || in_wave[i]==="4" || in_wave[i]==="5") { eq_count--; } break; } } } return eq_count; } function process_signal(signal_obj, mintick, maxtick) { var remove_data_items; var period; var minchar_data; var maxchar; var phase_adj; if ( "period" in signal_obj ) { period = signal_obj.period; } else { period = 1.0; // default if not present } // earliest char shown, that the data can be applied to minchar_data = Math.floor(mintick/period); // last char to make sure is included maxchar = Math.ceil(maxtick/period); // how much to shift the phase to remove beginning part phase_adj = mintick; //console.log( "minchar_data: "+ minchar_data + ", maxchar: " + maxchar + ", phase_adj: " + phase_adj ); // manage list-based data property if ( "data" in signal_obj ) { // find number of starting data items to remove from beginning of data // if we phase shift =,3,4,5 off screen we need to remove from data list remove_data_items = num_data_dropped( signal_obj.wave, minchar_data ); signal_obj.data.splice(0,remove_data_items); } // slice all character-based properties if ( "wave" in signal_obj ) { signal_obj.wave = signal_obj.wave.slice(0, maxchar); } if ( "node" in signal_obj ) { signal_obj.node = signal_obj.node.slice(0, maxchar); } // adjust phase if ( phase_adj !== 0 ) { if ( "phase" in signal_obj ) { signal_obj.phase = signal_obj.phase + phase_adj; } else { signal_obj.phase = phase_adj; } } return signal_obj; } function hbounds(wave_obj, mintick, maxtick) { for (var i=0; i < wave_obj.signal.length; i++) { if ( wave_obj.signal[i] instanceof Array ) { // element 0 is name of group, so start with 1 for (var j=1; j < wave_obj.signal[i].length; j++) { wave_obj.signal[i][j] = process_signal(wave_obj.signal[i][j], mintick, maxtick); } } else { wave_obj.signal[i] = process_signal(wave_obj.signal[i], mintick, maxtick); } } // modify tick settings if they exist if ( "head" in wave_obj ) { if ( "tick" in wave_obj.head ) { wave_obj.head.tick = wave_obj.head.tick + mintick; } if ( "tock" in wave_obj.head ) { wave_obj.head.tock = wave_obj.head.tock + mintick; } } return wave_obj; } var wavedrom_obj = { signal: [ {name: 'signal2.0', wave: '0.=.1.=.0.=.1.=.0.=.1.', data: ["hi","you","guys","are","you"], period: 2.0 }, {name: 'signal1.0', wave: '0...=...1...=...0...=...1...=...0...=...1...', data: ["hi","you","guys","are","you"],}, {name: 'signal0.5', wave: '0.......=.......1.......=.......0.......=.......1.......=.......0.......=.......1.......', period: 0.5, data: ["hi","you","guys","are","you"],}, {name: 'signal0.25',wave: '0...............=...............1...............=...............0...............=...............1...............=...............0...............=...............1...............', period: 0.25, data: ["hi","you","guys","are","you"],}, [ 'testgroup', {name: 'signal2.0', wave: '0.=.1.=.0.=.1.=.0.=.1.', data: ["hi","you","guys","are","you"], period: 2.0 }, {name: 'signal1.0', wave: '0...=...1...=...0...=...1...=...0...=...1...', data: ["hi","you","guys","are","you"],}, {name: 'signal0.5', wave: '0.......=.......1.......=.......0.......=.......1.......=.......0.......=.......1.......', period: 0.5, data: ["hi","you","guys","are","you"],}, ], ], head: { text:"hbounds test Timing", tick:0, }, }; // shift and clip waveform wavedrom_obj = hbounds(wavedrom_obj, 6, 26); // output waveform obj to wavedrom return wavedrom_obj; })() // vim: nowrap