public void processSerialData() { byte[] inBuf = new byte[20]; switch (serial.read()) { case 'A': // wait for all data arrived while (serial.available() < 16) {} // read all data serial.readBytes(inBuf); Acc_RAW = (inBuf[1] << 8) + (inBuf[0] & 0xFF); Gyro_RAW = (inBuf[3] << 8) + (inBuf[2] & 0xFF); // int intbit = 0; // intbit = (inBuf[7] << 24) | ((inBuf[6] & 0xFF) << 16) | ((inBuf[5] & 0xFF) << 8) | // (inBuf[4] & 0xFF); // Angle = Float.intBitsToFloat(intbit); int AngleInt = (inBuf[5] << 8) + (inBuf[4] & 0xFF); Angle = PApplet.parseFloat(AngleInt) / 10; Acc_Angle = (inBuf[7] << 8) + (inBuf[6] & 0xFF); Gyro_Rate = (inBuf[9] << 8) + (inBuf[8] & 0xff); Drive = (inBuf[11] << 8) + (inBuf[10] & 0xFF); statusFlag = (inBuf[13] << 8) + (inBuf[12] & 0xFF); int BatLevelInt = (inBuf[15] << 8) + (inBuf[14] & 0xFF); Steer = (inBuf[17] << 8) + (inBuf[16] & 0xFF); BatLevel = PApplet.parseFloat(BatLevelInt) / 10; println( "Acc=" + Acc_RAW + " Gyro=" + Gyro_RAW + " Angle=" + Angle + " Acc_Angle=" + Acc_Angle + " Gyro_Rate=" + Gyro_Rate + " Drive=" + Drive + " Status=" + statusFlag); break; case 'E': // wait for all data arrived while (serial.available() < 6) {} // read all data serial.readBytes(inBuf); int P = (inBuf[1] << 8) + (inBuf[0] & 0xFF); int I = (inBuf[3] << 8) + (inBuf[2] & 0xFF); int D = (inBuf[5] << 8) + (inBuf[4] & 0xFF); conf_KP.setValue(P); conf_KI.setValue(I); conf_KD.setValue(D); println("P=" + P + " I=" + I + " D=" + D); break; } serial.clear(); }
public void draw() { background(0); // Strings composition textFont(createFont("Arial bold", 24)); fill(c_red); stroke(255); text("OpenWheels GUI V1.0", 20, 30); textSize(16); // textAlign(CENTER); fill(c_azure); text("Acc_RAW: " + Acc_RAW, 150, 65); AccSlider.setValue(Acc_RAW); text("Gyro_RAW: " + Gyro_RAW, 150, 90); GyroSlider.setValue(Gyro_RAW); text("Acc_Angle: " + Acc_Angle + "\u00b0", 150, 115); text("Gyro_Rate: " + Gyro_Rate + "\u00b0/sec", 150, 140); text("Drive: " + Drive, 150, 165); text("Steer: " + Steer, 150, 190); text("BatLevel: " + nf(BatLevel, 1, 1) + "V", 150, 215); text("Status: " + statusFlag, 150, 240); graphGauge(); graphGrid(); // call the function that plot the angular of acc, with few screen settings graphRoll(PApplet.parseFloat(Acc_Angle), VideoBuffer2, c_red); // xPos, YPos, YSpan // call the function that plot the estimate angular, with few screen settings graphRoll(Angle, VideoBuffer1, c_yellow); // xPos, YPos, YSpan // call arduino for data every timePolling [msec] int timePolling = 50; // 50msec=20Hz time1 = millis(); if (init_com == 1) { while (serial.available() > 0) processSerialData(); if ((time1 - time2) > timePolling) { if (requestPID == true) { serial.write('E'); requestPID = false; } else if (writePID == true) { int P = PApplet.parseInt(conf_KP.value()); int I = PApplet.parseInt(conf_KI.value()); int D = PApplet.parseInt(conf_KD.value()); char data[] = {0, 0, 0, 0, 0}; data[0] = 'W'; data[1] = PApplet.parseChar(P); data[2] = PApplet.parseChar(I); data[3] = PApplet.parseChar(D); data[4] = ' '; String str = new String(data); serial.write(str); println(str); // println(" P=" + P + " I=" + I + " D=" + D); writePID = false; } // else if (RUN==true ) {serial.write('A');} else { serial.write('A'); } time2 = time1; } } }
public int[] getPacket() { boolean gotAPacket = false; // whether the first byte was 0x7E int packetLength = -1; // length of the dataArray int[] thisdataArray = null; // the dataArray to return int checksum = -1; // the checksum as received int localChecksum = -1; // the chacksum as we calculate it // read bytes until you get a 0x7E port.clear(); // flush the buffer so that no old data comes in while (port.available() < 1) {; // do nothing while we wait for the buffer to fill } // this is a good header. Get ready to read a packet if (port.read() == 0x7E) { gotAPacket = true; } // if the header byte is good, try the rest: if (gotAPacket) { // read two bytes while (port.available() < 2) {; // wait until you get two bytes of length } int lengthMSB = port.read(); // high byte for length of packet int lengthLSB = port.read(); // low byte for length of packet // convert to length value packetLength = (lengthLSB + (lengthMSB << 8)); // sanity check: if the packet is too long, bail. if (packetLength > 200) { System.out.println("Length (" + packetLength + ") too long, discarding packet."); return null; } if (DEBUG) System.out.print("> [" + packetLength + "]: "); // read bytes until you've reached the length while (port.available() < packetLength) {; // do nothing while we wait for the buffer to fill } // make an array to hold the data frame: thisdataArray = new int[packetLength]; // read all the bytes except the last one into the dataArray array: for (int thisByte = 0; thisByte < packetLength; thisByte++) { thisdataArray[thisByte] = port.read(); if (DEBUG) System.out.print(parent.hex(thisdataArray[thisByte], 2) + " "); } while (port.available() < 1) {; // do nothing while we wait for the buffer to fill } // get the checksum: checksum = port.read(); // calculate the checksum of the received dataArray: localChecksum = checkSum(thisdataArray); // if they're not the same, we have bad data: if (localChecksum != checksum) { if (DEBUG) System.out.println(); System.out.print( "Bad checksum, discarding packet. Local: " + parent.hex(localChecksum % 256)); System.out.println(", Remote: " + parent.hex(checksum) + ", Length: " + packetLength); // if the checksums don't add up, clear the dataArray array: thisdataArray = null; } } // makes a nice printing for debugging: if (DEBUG) System.out.println("!"); // return the data frame. If it's null, you got a bad packet. return thisdataArray; }