///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Script for viewing signals ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Host.ReportOut("\n"); // Consts var iChannels; var numberOfSamples = Host.NumberOfSamples; var frequency = Host.Frequency; var channels = Host.Channels; var colors = [0xff4040, 0xaf8f00, 0x008f00, 0x00afdf, 0x5050ff, 0xdf00df, 0x00007f, 0x5f4f00]; // , 0x007f00, 0x7f0000, 0x006f6f, 0x6f006f]; // var Colors = [0xf01010, 0x10f010, 0x1010f0, 0xb0b010, 0xb010b0, 0x10b0b0, 0x800000, 0x008000]; var maxDrawPoint = 50000; //todo make 3 speed (5000, 50000, 500000) var minAmplitudeLevel = 0.15; // If signal level too low then expand //var averageTime = 0.01; // Minimum time in seconds for drawing graphics var averageTime = (NumberOfSamples / maxDrawPoint < 1) ? 1 : (NumberOfSamples / maxDrawPoint) / frequency; // if averageTime < 1scan // Strings var strings = {}; strings.channel = "Channel"; strings.mode = [ { name: "None", unit: "", func: DrawNothing }, { name: "Amplitude Average", unit: "\nV", func: DrawAmplitudeAverage }, //{name: "PWM", unit: "\n%", func: DrawPWM}, { name: "PWM Average", unit: "\n%", func: DrawPWMAverage }, //{name: "Frequency", unit: "@Hz", func: DrawFrequency}, { name: "Frequency Average", unit: "@Hz", func: DrawFrequencyAverage }, //{name: "Duration", unit: "@s", func: DrawDuration}, { name: "Duration Average", unit: "@s", func: DrawDurationAverage } ]; var graphicType = 0; // line:0, point:1, lineAndPoint:2 strings.averageTime = "Average time"; var allModes = strings.mode[0].name; for (var m = 1; m < strings.mode.length; m++) { allModes += "\n" + strings.mode[m].name } pntr = DrawNothing; pntr(); strings.channelsNames = []; for (var iChannels = 1; iChannels <= channels; iChannels++) { strings.channelsNames[iChannels] = strings.channel + " " + iChannels + " (" + Host.GetChannelName(iChannels) + ")"; } // General settings //setup.AddItem(strings.averageTime , averageTime); var setup = Host.CreateConfigure("Config"); for (var iChannels = 1; iChannels <= channels; iChannels++) { setup.AddItemEx(strings.channelsNames[iChannels], "ch" + iChannels + "_mode_index", allModes); } if (setup.Configure()) { var graphViewObj = Host.CreateGraphicView("Graphics"); graphViewObj.AddGraphic(Host.CreateGraphic("", "", 0)); //add empty graphic for viewing only one channel graphic (bug) graphViewObj.MainAxisName = "Time:" + "\n" + "s"; //averageTime = Number(setup.GetValue(strings.averageTime)); var startTime = 0; var endTime = averageTime * maxDrawPoint; if (endTime > NumberOfSamples / Frequency) { endTime = NumberOfSamples / Frequency; } for (iChannels = 1; iChannels <= channels; iChannels++) { var obj = strings.mode[setup.GetValue(strings.channelsNames[iChannels])]; Host.ReportOut(strings.channelsNames[iChannels] + ": " + obj.name + "\n"); var graphic = Host.CreateGraphic(strings.channelsNames[iChannels] + ", " + obj.name, obj.unit, colors[iChannels]); if (obj.func(iChannels, graphic, startTime, endTime, averageTime)) { graphViewObj.AddGraphicEx(graphic, graphicType, colors[iChannels]); } } graphViewObj.Update(); graphViewObj.Show(); Host.ReportOut("Done"); } else { Host.ReportOut("Canceled"); } // functions function DrawNothing(inpChannel, graph, sTime, eTime, aveTime) { return false; } function DrawAmplitudeAverage(inpChannel, graph, sTime, eTime, aveTime) { var time = sTime; var minValue = 0; var maxValue = 0; minValue = maxValue = AveValueAt(inpChannel, time * frequency, aveTime * frequency); while (time < eTime) { var value = AveValueAt(inpChannel, time * frequency, aveTime * frequency); if (maxValue < value) { maxValue = value; } if (minValue > value) { minValue = value; } graph.AddPoint(time, value); time += aveTime; } var minLimit = minValue - (maxValue - minValue) * ((1 / minAmplitudeLevel - 1) / 2); var maxLimit = maxValue + (maxValue - minValue) * ((1 / minAmplitudeLevel - 1) / 2); if (maxLimit > GetFullScale(inpChannel)) { maxLimit = GetFullScale(inpChannel); } if (minLimit < -GetFullScale(inpChannel)) { minLimit = -GetFullScale(inpChannel); } graph.SetLimits(minLimit, maxLimit); return true; } function DrawPWM(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeRising = Host.SynchBy(inpChannel, 1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeRising > 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeRising * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { graph.AddPoint(timeRising, 100 * (timeRising - timeLast) / (timeFalling - timeLast)); timeLast = timeFalling; } else { timeLast = -1; } } else { timeLast = -1; } } graph.SetLimits(0, 100); return true; } function DrawPWMAverage(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var PWMSumm = 0; var PWMCount = 0; var PWMDrawTime = 0; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeRising = Host.SynchBy(inpChannel, 1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeRising > 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeRising * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { PWMSumm += 100 * (timeRising - timeLast) / (timeFalling - timeLast); PWMCount++; timeLast = timeFalling; if (timeFalling - PWMDrawTime > aveTime) { PWMDrawTime = timeFalling; graph.AddPoint(timeRising, PWMSumm / PWMCount); PWMSumm = 0; PWMCount = 0; } } else { timeLast = -1; } } else { timeLast = -1; } } graph.SetLimits(0, 100); return true; } function DrawFrequency(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var maxValue = 0; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { var value = 1 / (timeFalling - timeLast); if (maxValue < value) { maxValue = value; } graph.AddPoint((timeFalling + timeLast) / 2, value); timeLast = timeFalling; } else { timeLast = -1; } } graph.SetLimits(0, maxValue); return true; } function DrawFrequencyAverage(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var maxValue = 0; var FrequencySumm = 0; var FrequencyCount = 0; var FrequencyDrawTime = 0; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { FrequencySumm += 1 / (timeFalling - timeLast); FrequencyCount++; timeLast = timeFalling; if (timeFalling - FrequencyDrawTime > aveTime) { FrequencyDrawTime = timeFalling; var value = FrequencySumm / FrequencyCount; if (maxValue < value) { maxValue = value; } graph.AddPoint(timeFalling, value); FrequencySumm = 0; FrequencyCount = 0; } } else { timeLast = -1; } } graph.SetLimits(0, maxValue); return true; } function DrawDuration(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var maxValue = 0; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { var timeRising = Host.SynchBy(inpChannel, 1, synchLevel, timeFalling * frequency, (eTime - timeLast) * frequency) / frequency; if (timeRising > 0) { var value = (timeRising - timeFalling); if (maxValue < value) { maxValue = value; } graph.AddPoint(timeFalling, value); timeLast = timeRising; } else { timeLast = -1; } } else { timeLast = -1; } } graph.SetLimits(0, maxValue); return true; } function DrawDurationAverage(inpChannel, graph, sTime, eTime, aveTime) { var timeLast = sTime; var maxValue = 0; var DurationSumm = 0; var DurationCount = 0; var DurationDrawTime = 0; var synchLevel = GetSyncLevel(inpChannel); while (timeLast >= 0) { var timeFalling = Host.SynchBy(inpChannel, -1, synchLevel, timeLast * frequency, (eTime - timeLast) * frequency) / frequency; if (timeFalling > 0) { var timeRising = Host.SynchBy(inpChannel, 1, synchLevel, timeFalling * frequency, (eTime - timeLast) * frequency) / frequency; if (timeRising > 0) { DurationSumm += (timeRising - timeFalling); DurationCount++; timeLast = timeRising; if (timeRising - DurationDrawTime > aveTime) { DurationDrawTime = timeRising; var value = DurationSumm / DurationCount; if (maxValue < value) { maxValue = value; } graph.AddPoint(timeFalling, value); DurationSumm = 0; DurationCount = 0; } } else { timeLast = -1; } } else { timeLast = -1; } } graph.SetLimits(0, maxValue); return true; } function GetSyncLevel(inpChannel) { return Host.AveValueAt(inpChannel, numberOfSamples / 2, numberOfSamples); }