Skip to content

Instantly share code, notes, and snippets.

@neosarchizo
Created March 7, 2022 07:29
Show Gist options
  • Save neosarchizo/7e6d5a6211a0be4cd7a948c08d2b267b to your computer and use it in GitHub Desktop.
Save neosarchizo/7e6d5a6211a0be4cd7a948c08d2b267b to your computer and use it in GitHub Desktop.
[Processing] PM2008 packet to CSV
import java.util.ArrayList;
class Packet {
static final int PACKET_STX = 0xAB;
static final int PACKET_ETX = 0x7D;
static final int PACKET_CMD_GET_PM2008 = 0;
static final int PACKET_POS_STX = 0;
static final int PACKET_POS_LEN = 1;
static final int PACKET_POS_CMD = 2;
static final int PACKET_POS_DAT = 3;
private ArrayList<Integer> buffer = new ArrayList<Integer>();
Packet() {
}
Packet(int[] rxBuffer) {
for (int b : rxBuffer) {
buffer.add(b);
}
}
private void clear() {
buffer.clear();
}
public void generate(int cmd, int[] data) {
clear();
buffer.add(PACKET_STX);
// (STX), (LEN), CMD, D.., CS, ETX
buffer.add(data.length + 3);
buffer.add(cmd);
for (int b : data) {
buffer.add(b);
}
int cs = buffer.get(PACKET_POS_STX);
for (int i=1; i<buffer.size(); i++) {
cs ^= buffer.get(i);
}
buffer.add(cs);
buffer.add(PACKET_ETX);
}
public boolean check() {
if (buffer.get(PACKET_POS_STX) != PACKET_STX) {
return false;
}
if (buffer.get(buffer.size() -1) != PACKET_ETX) {
return false;
}
if (buffer.get(PACKET_POS_LEN) + 2 != buffer.size()) {
return false;
}
switch (buffer.get(PACKET_POS_CMD)) {
case PACKET_CMD_GET_PM2008:
{
break;
}
default:
return false;
}
int cs = buffer.get(PACKET_POS_STX);
for (int i=1; i<buffer.size() - 2; i++) {
cs ^= buffer.get(i);
}
if (cs != buffer.get(buffer.size() -2)) {
return false;
}
return true;
}
public int getDataLength() {
return buffer.size() - 5;
}
public int getCmd() {
return buffer.get(PACKET_POS_CMD);
}
public int[] getData() {
int dataLength = getDataLength();
if (dataLength == 0) {
return new int[0];
}
int[] result = new int [dataLength];
for (int i=0; i<dataLength; i++) {
result[i] = buffer.get(PACKET_POS_DAT +i);
}
return result;
}
public byte[] getBytes() {
byte[] bytes = new byte[buffer.size()];
for (int i=0; i<buffer.size(); i++) {
bytes[i] = buffer.get(i).byteValue();
}
return bytes;
}
}
import processing.serial.*;
PrintWriter output;
Serial myPort;
ArrayList<Integer> rxBuffer = new ArrayList<Integer>();
int idxBuffer = 0;
int rearLength = 0;
Packet txPacket = new Packet();
void setup() {
//printArray(Serial.list());
// "/dev/tty.usbmodem113201"
Packet packet = new Packet();
// packet.check();
packet.generate(Packet.PACKET_CMD_GET_PM2008, new int[0]);
myPort = new Serial(this, "/dev/tty.usbmodem113201", 9600);
output = createWriter("data.csv");
// PM 1.0 (GRIMM)/PM 2.5 (GRIMM)/PM 10 (GRIMM)/
// PM 1.0 (TSI)/PM 2.5 (TSI)/PM 10 (TSI)/
// 0.3 um/0.5 um/1 um/2.5 um/5 um/10 um
output.println("PM 1.0 (GRIMM),PM 2.5 (GRIMM),PM 10 (GRIMM),PM 1.0 (TSI),PM 2.5 (TSI),PM 10 (TSI),0.3 um,0.5 um,1 um,2.5 um,5 um,10 um");
frameRate(1);
txPacket.generate(Packet.PACKET_CMD_GET_PM2008, new int[0]);
}
void draw() {
myPort.write(txPacket.getBytes());
}
void serialEvent(Serial port) {
while (port.available() > 0) {
int b = port.read();
if (b < 0) {
continue;
}
switch(idxBuffer) {
case 0: // STX
{
if (b != Packet.PACKET_STX) {
idxBuffer = 0;
rxBuffer.clear();
break;
}
rxBuffer.add(b);
++idxBuffer;
break;
}
case 1: // LEN
{
if (b < 3) {
idxBuffer = 0;
rxBuffer.clear();
break;
}
rxBuffer.add(b);
++idxBuffer;
rearLength = b;
break;
}
case 2: // CMD
{
if (b != Packet.PACKET_CMD_GET_PM2008) {
idxBuffer = 0;
rxBuffer.clear();
break;
}
rxBuffer.add(b);
++idxBuffer;
break;
}
default:
{
rxBuffer.add(b);
++idxBuffer;
if (idxBuffer >= rearLength + 2) {
int[] bytes = rxBuffer.stream().mapToInt(i -> i).toArray();
idxBuffer = 0;
rxBuffer.clear();
if (b != Packet.PACKET_ETX) {
break;
}
Packet packet = new Packet(bytes);
if (!packet.check())
{
break;
}
int dataLength = packet.getDataLength();
int cmd = packet.getCmd();
int[] data = packet.getData();
switch(cmd) {
case Packet.PACKET_CMD_GET_PM2008:
{
if (dataLength != 25) {
break;
}
if (data[0] != 0) {
break;
}
for(int i=0; i<12; i++) {
output.print((data[2*i+1] + (data[2*(i+1)] << 8)));
if (i <11){
output.print(",");
} else {
output.println();
}
}
println("added!!");
break;
}
default:
break;
}
}
break;
}
}
}
}
void keyPressed() {
output.flush();
output.close();
exit();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment