diff --git a/PROVA.l32 b/PROVA.l32 new file mode 100644 index 0000000..a828a5b --- /dev/null +++ b/PROVA.l32 @@ -0,0 +1,5 @@ +#!/bin/sh + +APPDIR=$(readlink -f "$0") +APPDIR=$(dirname "$APPDIR") +java -Djna.nosys=true -Djava.library.path="$APPDIR:$APPDIR/lib" -cp "$APPDIR:$APPDIR/lib/PROVA.jar:$APPDIR/lib/core.jar:$APPDIR/lib/jogl-all.jar:$APPDIR/lib/gluegen-rt.jar:$APPDIR/lib/jogl-all-natives-linux-i586.jar:$APPDIR/lib/gluegen-rt-natives-linux-i586.jar:$APPDIR/lib/jssc.jar:$APPDIR/lib/serial.jar" PROVA "$@" diff --git a/PROVA.l64 b/PROVA.l64 new file mode 100644 index 0000000..1e6cab6 --- /dev/null +++ b/PROVA.l64 @@ -0,0 +1,5 @@ +#!/bin/sh + +APPDIR=$(readlink -f "$0") +APPDIR=$(dirname "$APPDIR") +java -Djna.nosys=true -Djava.library.path="$APPDIR:$APPDIR/lib" -cp "$APPDIR:$APPDIR/lib/PROVA.jar:$APPDIR/lib/core.jar:$APPDIR/lib/jogl-all.jar:$APPDIR/lib/gluegen-rt.jar:$APPDIR/lib/jogl-all-natives-linux-amd64.jar:$APPDIR/lib/gluegen-rt-natives-linux-amd64.jar:$APPDIR/lib/jssc.jar:$APPDIR/lib/serial.jar" PROVA "$@" diff --git a/PROVA.pde b/PROVA.pde new file mode 100644 index 0000000..fd3af8d --- /dev/null +++ b/PROVA.pde @@ -0,0 +1,326 @@ +import processing.serial.*; +import java.util.Arrays; +Serial p; + +float reducer = 8000.0; +boolean milliseconds = false; +int samples; +int event; +int initialState; +int save_initialState; +boolean first = false; +boolean dataComplete = false; +boolean graphShift = false; +int xShift; + +boolean textCovered; +int xEdge = 60; +int yEdge = 30; +int xEnd; +int yBottom = 370; +int yDiff; +float[] xPos = {0, 0, 0, 0, 0, 0}; +int yPos=yEdge; +float[] xTime; +int boxH; +int boxW; + +float[] usTime; +int[] changed; + +boolean [][] state; +boolean [] change = new boolean[6]; +boolean [] isLow = new boolean[6]; + +int buttonH = 20; +int button1W = 40; +int button2W = 100; +int button3W = 50; + +void setup () { + p = new Serial(this, "com3", 9600); + p.bufferUntil('\n'); + + size(1000, 450); + background(255); + smooth(3); + + boxH = height -50; + boxW = 30; +} + +void cleanScreen() { + + noStroke(); //no borders + fill(255); //white + rect(xEdge, 0, width, boxH); //cancel the graph + stroke(0); //border + fill(0); // black + Arrays.fill(xPos, 0); //reset start point of the graph + + if (graphShift==true) { + int b; + initialState = save_initialState; + for (int n=0; n<6; n++) { + b = initialState & 1; + isLow[n] = !boolean (b); + initialState >>= 1; + //println("islow: "+isLow[n]); + } + } +} + +void draw () { + + if (dataComplete==true || graphShift==true) { + cleanScreen(); + pushMatrix(); //move the coordinate reference + translate(xEdge, 0); + for (int i=0; iboxH && mouseY boxW && mouseX boxH && mouseY boxW+80 && mouseX boxH && mouseY boxW+230 && mouseX boxH && mouseY boxW && mouseX boxW+80 && mouseX >= 1; + //println("islow: "+isLow[n]); + } + + + // changes + for (int i=0; i>= 1; + //println(state[i][n]); + } + } + dataComplete = true; +} + + +float[] spacing = {5, 4}; //used for the dashline function, pixels + +void dashline(float x0, float y0, float x1, float y1, float[] spacing) { + + float distance = dist(x0, y0, x1, y1); + float [ ] xSpacing = new float[spacing.length]; + float [ ] ySpacing = new float[spacing.length]; + float drawn = 0.0; // amount of distance drawn + + if (distance > 0) + { + int i; + boolean drawLine = true; // alternate between dashes and gaps + + /* + Figure out x and y distances for each of the spacing values + I decided to trade memory for time; I'd rather allocate + a few dozen bytes than have to do a calculation every time + I draw. + */ + + for (i = 0; i < spacing.length; i++) + { + xSpacing[i] = lerp(0, (x1 - x0), spacing[i] / distance); + ySpacing[i] = lerp(0, (y1 - y0), spacing[i] / distance); + } + + i = 0; + while (drawn < distance) + { + if (drawLine) + { + line(x0, y0, x0 + xSpacing[i], y0 + ySpacing[i]); + } + x0 += xSpacing[i]; + y0 += ySpacing[i]; + /* Add distance "drawn" by this line or gap */ + drawn = drawn + mag(xSpacing[i], ySpacing[i]); + i = (i + 1) % spacing.length; // cycle through array + drawLine = !drawLine; // switch between dash and gap + } + } +} \ No newline at end of file diff --git a/PROVA.w32.exe b/PROVA.w32.exe new file mode 100644 index 0000000..63928f3 Binary files /dev/null and b/PROVA.w32.exe differ diff --git a/PROVA.w64.exe b/PROVA.w64.exe new file mode 100644 index 0000000..200b182 Binary files /dev/null and b/PROVA.w64.exe differ diff --git a/prova.ino b/prova.ino new file mode 100644 index 0000000..d74c150 --- /dev/null +++ b/prova.ino @@ -0,0 +1,94 @@ +#define samples 15 + +uint8_t state, old_state, initial; +uint8_t changed[samples]; +uint32_t timer[samples]; +uint16_t event = 0; + +volatile uint64_t overflow_count = 0; +volatile uint64_t total_count = 0; + + +int main(void) { + Serial.begin(9600); + + TCCR2B = TCCR2B & 0b11111000 | 0x02; + TIMSK2 |= (1 << TIMSK2); // enable Timer2 overflow interrupt + TCCR2A &= 0b11111100; // timer2 working parameters + TCCR2B &= 0b11110111; + + PORTC = (0 << 0); DDRC |= (1 << 0); // led A0 + DDRB |= 0x00; // pin 8-13 input + PORTB |= 0x3F; // pull-up + + start(); + + while (1) { + old_state = state; + state = PINB; + + if (old_state != state) { + timer[event] = get_time(); + changed[event] = old_state ^ state; + event++; + + if (event == samples) { + sendData(); + while (Serial.read() != 'G') ; //wait for the "go" + start(); + } + } + } +} + +void start() { + _delay_ms(1000); + + TCNT2 = 0; + overflow_count = 0; + event = 0; + + PORTC = (1 << 0); + initial = PINB; + state = initial; + + //in futuro potrei fare in modo che time[0] รจ impostato qui +} + + +void sendData() { + PORTC = (0 << 0); //turn off led + + //initial data + Serial.print("S"); Serial.println(""); + Serial.print(initial); Serial.print(":"); + Serial.println(samples); + + //data + for (int i = 0; i < samples; i++) { + Serial.print(changed[i]); Serial.print(":"); + Serial.println(timer[i]); + } +} + + +//timer: +uint32_t get_time() { + cli(); + uint8_t tcnt2_save = TCNT2; + boolean flag_save = TIMSK2 & (1 << TIFR2); //timer2 overflow flag + + if (flag_save) { + tcnt2_save = TCNT2; + overflow_count++; //manual increment of the overflow counter + TIFR2 = (1 << TIFR2); //reset overflow flag to prevent execution of the ISR + } + + total_count = (overflow_count * 256 + tcnt2_save) / 2; + sei(); + return total_count; +} + +ISR(TIMER2_OVF_vect) { + overflow_count++; +}