-
Notifications
You must be signed in to change notification settings - Fork 22
/
Dust.cpp
82 lines (80 loc) · 1.64 KB
/
Dust.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
//
// FILE: dust.ino
// AUTHOR: Kyuho Kim ([email protected])
// CREATED: September 4, 2017
// Released to the public domain
//
#include "Dust.h"
byte header[2] = { 0x42, 0x4d };
byte old_b=0, chksum=0, sum=0;
int bi=0, flen, pm25, pm10;
void Dust::do_char(char b, void (*function)(int, int)) {
if (bi > 2 && old_b == header[0] && b == header[1]) {
Serial.print("\n D Discard bi="+String(bi)+" ");
bi = 1;
}
switch(bi) {
case 0:
if (b == header[0]) {
bi++;
//Serial.println();
chksum = b;
}
break;
case 1:
if (b == header[1]) {
bi++;
chksum += b;
} else bi = 0;
break;
case 2:
chksum += b; bi++;
flen = b*256;
break;
case 3:
chksum += b; bi++;
flen += b;
break;
case 4:
chksum += b;
pm25 = b*256; bi++;
break;
case 5:
chksum += b;
pm25 += b; bi++;
break;
case 8:
chksum += b;
pm10 = b*256; bi++;
break;
case 9:
chksum += b;
pm10 += b; bi++;
break;
default:
if (bi == flen+2) {
sum = b*256;
bi++;
} else if (bi == flen+3) {
sum += b;
if (chksum == sum) {
function(pm25, pm10);
bi = 0;
old_b = b;
} else {
Serial.print(" Checksum Error: PMA3003 ");
Serial.print(chksum, HEX);
Serial.print("!=");
Serial.print(sum, HEX);
Serial.print("\n");
bi = 0;
}
} else if (bi > flen+3) {
bi = 0;
} else {
bi++;
chksum += b;
}
}
old_b = b;
}