diff options
Diffstat (limited to 'ArduinoAddons/Arduino_1.6.x/libraries/TMC26XStepper/examples/TMC26XMotorTester/processing/TMC26XMotorTest/DataRendering.pde')
-rwxr-xr-x | ArduinoAddons/Arduino_1.6.x/libraries/TMC26XStepper/examples/TMC26XMotorTester/processing/TMC26XMotorTest/DataRendering.pde | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/ArduinoAddons/Arduino_1.6.x/libraries/TMC26XStepper/examples/TMC26XMotorTester/processing/TMC26XMotorTest/DataRendering.pde b/ArduinoAddons/Arduino_1.6.x/libraries/TMC26XStepper/examples/TMC26XMotorTester/processing/TMC26XMotorTest/DataRendering.pde new file mode 100755 index 000000000..56a08332f --- /dev/null +++ b/ArduinoAddons/Arduino_1.6.x/libraries/TMC26XStepper/examples/TMC26XMotorTester/processing/TMC26XMotorTest/DataRendering.pde @@ -0,0 +1,327 @@ +/* + TMC26XMotorTest.pde - - TMC26X Stepper Tester for Processing + + Copyright (c) 2011, Interactive Matter, Marcus Nowotny + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. + + */ + +//our graph dimensions +int plotBottom, plotTop; +int plotLeft, plotRight; + + +//we already know the minima and maxima of certain dates +int stallGuardMin = 0; +int stallGuardMax =1024; + +int positionMin = 0; +int positionMax = 1024; + +int dataPointsWidth = 3; +int dataLineWidth = 2; +int highLightWidth = 7; + +int numberOfDataPoints=1000; + +int legendTitleSize = 10; +int legendTextSize = 10; +int currentLabelInterval = 500; +int currentMinorTickInterval = 25; +DecimalFormat currentLabelFormat = new DecimalFormat("#0.0A"); + +int stallGuardLabelInterval = 100; +int stallGuardMinorTickInterval = 10; +int positionLabelInterval = 64; +int positionMinorTickInterval = 8; + +int coolStepActiveStroke = 2; +int coolStepInactiveStroke = 1; +int stallGuardHighLightDistance = 1; +int positionHighLightDistance = 3; +int currentHighLightDistance = 3; + +DataTable stallGuardTable = new DataTable(numberOfDataPoints); +DataTable positionTable = new DataTable(numberOfDataPoints); +DataTable currentTable = new DataTable(numberOfDataPoints); + +int logoLeft = 10; +int logoTop = 50; +int logoWidth = 75; +int logoHeight = 75; + +void setupData() { + plotBottom = height-50; + plotTop = 300; + + plotLeft = 150; + plotRight= width-50; + //recalculate the image dimension for the Logo + logoHeight = (int)((float)logoWidth/(float)TMCLogo.width*(float)TMCLogo.height); + logoTop = height - 10 - logoHeight; +} + +void drawData() { + + if (motor_connected && activeTab!=null && runTab.equals(activeTab)) { + fill(diagramBackgroundColor); + noStroke(); + rect(plotLeft, plotTop, plotRight, plotBottom); + noFill(); + rectMode(CORNERS); + noStroke(); + //rect(plotLeft, plotBottom, plotRight, plotTop); + + strokeWeight(dataLineWidth); + stroke(positionColor); + drawDataLine(positionTable, positionMin, positionMax); + drawDataHighLight(positionTable, positionMin, positionMax, positionHighLightDistance, labelColor, "Microstep Position", false); + + strokeWeight(dataLineWidth); + stroke(coolStepColor); + drawCurrentLine(currentTable); + drawCurrentHighLight(positionTable, currentHighLightDistance, labelColor, "Current Ratio", false); + + strokeWeight(dataPointsWidth); + stroke(stallGuardColor); + drawDataPoints(stallGuardTable, stallGuardMin, stallGuardMax); + drawDataHighLight(stallGuardTable, stallGuardMin, stallGuardMax, stallGuardHighLightDistance, labelColor, "Stall Guard", true); + + if (coolStepActive) { + strokeWeight(coolStepActiveStroke); + } else { + strokeWeight(coolStepInactiveStroke); + } + stroke(coolStepColor); + float coolStepMinHeight = map(coolStepMin, 0, stallGuardMax, plotBottom, plotTop); + line(plotLeft,coolStepMinHeight, plotRight, coolStepMinHeight); + float coolStepMaxHeight = map(coolStepMin+coolStepMax+1, 0, stallGuardMax, plotBottom, plotTop); + line(plotLeft,coolStepMaxHeight, plotRight, coolStepMaxHeight); + + textSize(legendTitleSize); + textAlign(RIGHT); + fill(coolStepColor); + text("Motor Current", plotLeft - 50, plotTop - 10); + textSize(legendTextSize); + textAlign(RIGHT); + strokeWeight(1); + stroke(coolStepColor); + int currentScaleMax = (int)(maxCurrent*1000.0); + for (int i=0; i<=currentScaleMax; i++) { + float y = map(i, 0, currentScaleMax, plotBottom, plotTop); + if (i % currentLabelInterval == 0) { + if (i==0) { + textAlign(RIGHT, BOTTOM); + } + else if (i==currentScaleMax) { + textAlign(RIGHT, TOP); + } + else { + textAlign(RIGHT, CENTER); + } + text(currentLabelFormat.format((float)i/1000.0), plotLeft-58, y); + line (plotLeft-55, y, plotLeft-50, y); + } + else if (i % currentMinorTickInterval == 0) { + line (plotLeft-53, y, plotLeft-50, y); + } + + } + + textSize(legendTitleSize); + textAlign(LEFT); + fill(stallGuardColor); + text("Stall Guard Reading", plotLeft - 30, plotTop - 10); + textSize(legendTextSize); + textAlign(RIGHT); + strokeWeight(1); + stroke(stallGuardColor); + for (int i=stallGuardMin; i<=stallGuardMax; i++) { + float y = map(i, stallGuardMin, stallGuardMax, plotBottom, plotTop); + if (i % stallGuardLabelInterval == 0) { + if (i==stallGuardMin) { + textAlign(RIGHT, BOTTOM); + } + else if (i==stallGuardMax) { + textAlign(RIGHT, TOP); + } + else { + textAlign(RIGHT, CENTER); + } + text(i, plotLeft-8, y); + line (plotLeft-5, y, plotLeft, y); + } + else if (i % stallGuardMinorTickInterval == 0) { + line (plotLeft-3, y, plotLeft, y); + } + } + + textSize(legendTitleSize); + fill(positionColor); + textAlign(RIGHT); + text("Position", plotRight + 30, plotTop - 10); + textSize(legendTextSize); + textAlign(LEFT); + strokeWeight(1); + stroke(positionColor); + for (int i=positionMin; i<=positionMax; i++) { + float y = map(i, positionMin, positionMax, plotBottom, plotTop); + if (i % positionLabelInterval == 0) { + if (i==positionMin) { + textAlign(LEFT, BOTTOM); + } + else if (i==stallGuardMax) { + textAlign(LEFT, TOP); + } + else { + textAlign(LEFT, CENTER); + } + text(i, plotRight+8, y); + line (plotRight, y, plotRight+5, y); + } + else if (i % positionMinorTickInterval == 0) { + line (plotRight, y, plotRight+3, y); + } + } + //draw the channel status + textSize(legendTextSize); + textAlign(CENTER); + strokeWeight(1); + int statusY = height - 20; + int channelAX = width/4; + int temperatureX = width/2; + int channelBX = width/4*3; + if (channelAStatus==null) { + fill(goodStatusColor); + text("Channel A: OK", channelAX, statusY); + } + else { + fill(badStatusColor); + text("Channel A: "+channelAStatus, channelAX, statusY); + } + if (channelBStatus==null) { + fill(goodStatusColor); + text("Channel B: OK", channelBX, statusY); + } + else { + fill(badStatusColor); + text("Channel B: "+channelBStatus, channelBX, statusY); + } + if (temperatureStatus==null) { + fill(goodStatusColor); + text("Temperature: OK", temperatureX, statusY); + } + else { + fill(badStatusColor); + text("Temperature: "+temperatureStatus, temperatureX, statusY); + } + } +} +void drawDataPoints(DataTable table, int minValue, int maxValue) { + int dataCount = table.getSize(); + for (int i=0; i<dataCount; i++) { + int value = table.getEntry(i); + float x = map(i, 0, numberOfDataPoints-1, plotLeft+dataPointsWidth, plotRight-dataPointsWidth); + float y = map(value, minValue, maxValue, plotBottom-dataPointsWidth, plotTop+dataPointsWidth); + point(x, y); + } +} + +void drawDataLine(DataTable table, int minValue, int maxValue) { + beginShape(); + int dataCount = table.getSize(); + for (int i=0; i<dataCount; i++) { + int value = table.getEntry(i); + float x = map(i, 0, numberOfDataPoints-1, plotLeft+dataPointsWidth, plotRight-dataPointsWidth); + float y = map(value, minValue, maxValue, plotBottom-dataPointsWidth, plotTop+dataPointsWidth); + vertex(x, y); + } + endShape(); +} + +void drawDataHighLight(DataTable table, int minValue, int maxValue, int distance, color textColor, String name, boolean top) { + int dataCount = table.getSize(); + for (int i=0; i<dataCount; i++) { + int value = table.getEntry(i); + float x = map(i, 0, numberOfDataPoints-1, plotLeft+dataPointsWidth, plotRight-dataPointsWidth); + float y = map(value, minValue, maxValue, plotBottom-dataPointsWidth, plotTop+dataPointsWidth); + if (dist(mouseX, mouseY, x, y) < distance) { + strokeWeight(highLightWidth); + point(x, y); + fill(textColor); + textSize(10); + textAlign(CENTER); + if (top) { + text(name+": "+value, x, y-8); + } + else { + text(name+": "+value, x, y+8); + } + } + } +} + +void drawCurrentLine(DataTable table) { + noFill(); + beginShape(); + int dataCount = table.getSize(); + for (int i=0; i<dataCount; i++) { + float value = (table.getEntry(i)+1)/1000.0; + float x = map(i, 0, numberOfDataPoints-1, plotLeft+dataPointsWidth, plotRight-dataPointsWidth); + float y = map(value, 0.0, maxCurrent, (float)plotBottom-dataPointsWidth, (float)plotTop+dataPointsWidth); + vertex(x, y); + } + endShape(); +} + +void drawCurrentHighLight(DataTable table, int distance, color textColor, String name, boolean top) { + int dataCount = table.getSize(); + for (int i=0; i<dataCount; i++) { + float value = (table.getEntry(i)+1)/1000.0; + float x = map(i, 0, numberOfDataPoints-1, plotLeft+dataPointsWidth, plotRight-dataPointsWidth); + float y = map(value, 0.0, maxCurrent, plotBottom-dataPointsWidth, plotTop+dataPointsWidth); + if (dist(mouseX, mouseY, x, y) < distance) { + strokeWeight(highLightWidth); + point(x, y); + fill(textColor); + textSize(10); + textAlign(CENTER); + if (top) { + text(name+": "+value, x, y-8); + } + else { + text(name+": "+value, x, y+8); + } + } + } +} + +void addStallGuardReading(int value) { + stallGuardTable.addData(value); +} + +void addPositionReading(int value) { + positionTable.addData(value); +} + +void addCurrentReading(int value) { + currentTable.addData(value); +} + |