summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorErich Eckner <git@eckner.net>2020-11-14 20:52:01 +0100
committerErich Eckner <git@eckner.net>2020-11-14 20:52:01 +0100
commitcfadf5d51d550f4eed5179ecf13cdc72c52405ab (patch)
tree24ca496f64d16e6a8cdfaf6e4bd0e4d062b61107
parent223c8f41a8c0e41199ea9344180603ad403aa26b (diff)
downloadraspi-sensor-cfadf5d51d550f4eed5179ecf13cdc72c52405ab.tar.xz
CLOCK_MONOTONIC_RAW nehmen statt Zyklen zählen
-rw-r--r--sensor.c56
1 files changed, 38 insertions, 18 deletions
diff --git a/sensor.c b/sensor.c
index f279c87..5da4dee 100644
--- a/sensor.c
+++ b/sensor.c
@@ -31,42 +31,62 @@ int main() {
drop_privileges();
- // start bit
- digitalWrite(8, HIGH);
- usleep(18000);
- digitalWrite(8, LOW);
- int bit = -3;
char data[5];
- memset(&data[0], 0, 5);
int trials = 3;
+ int bit = 0;
while ((bit != 40) || ((data[0]+data[1]+data[2]+data[3]-data[4]) % 255 != 0) || ((data[0]|data[1]|data[2]|data[3]|data[4]) == 0)) {
trials--;
if (trials < 0) {
fprintf(stderr, "Failed to obtain valid reading within 3 trials.\n");
return -1;
}
- sleep(2);
- if (bit > -3)
- fprintf(stderr, ".");
+ if (trials < 2)
+ sleep(2);
+
+ memset(&data[0], 0, 5);
+
// start bit
digitalWrite(8, HIGH);
usleep(18000);
digitalWrite(8, LOW);
- long int cycles = 0;
- int last_state = digitalRead(9);
- // ignore 2 bits: reaction on command + "official" start bit
- bit = -2;
- memset(&data[0], 0, 5);
- while (cycles < 100000) {
- cycles++;
+
+ struct timespec start_time, stop_time;
+ int last_state = 1;
+ long int low_ns = 0;
+ // ignore first bit
+ bit = -1;
+ if (clock_gettime(CLOCK_MONOTONIC_RAW, &start_time) != 0) {
+ perror("clock_gettime start_time failed");
+ return -1;
+ }
+ if (clock_gettime(CLOCK_MONOTONIC_RAW, &stop_time) != 0) {
+ perror("clock_gettime stop_time failed");
+ return -1;
+ }
+ while ((!digitalRead(9)) && (stop_time.tv_sec - start_time.tv_sec + (stop_time.tv_nsec - start_time.tv_nsec) / 1000000000. < 0.0002)) {
+ if (clock_gettime(CLOCK_MONOTONIC_RAW, &stop_time) != 0) {
+ perror("clock_gettime stop_time failed");
+ return -1;
+ }
+ }
+ start_time.tv_sec = stop_time.tv_sec;
+ start_time.tv_nsec = stop_time.tv_nsec;
+ while (stop_time.tv_sec - start_time.tv_sec + (stop_time.tv_nsec - start_time.tv_nsec) / 1000000000. < 0.0002) {
+ if (clock_gettime(CLOCK_MONOTONIC_RAW, &stop_time) != 0) {
+ perror("clock_gettime stop_time failed");
+ return -1;
+ }
if (last_state == digitalRead(9))
continue;
if (last_state == 1) {
- if ((bit >= 0) && (cycles>300))
+ if ((bit >= 0) && ((stop_time.tv_sec - start_time.tv_sec) * 1000000000 + stop_time.tv_nsec - start_time.tv_nsec > low_ns))
data[bit / 8] |= 1 << 7 - (bit % 8);
bit++;
+ } else {
+ low_ns = (stop_time.tv_sec - start_time.tv_sec) * 1000000000 + stop_time.tv_nsec - start_time.tv_nsec;
}
- cycles = 0;
+ start_time.tv_sec = stop_time.tv_sec;
+ start_time.tv_nsec = stop_time.tv_nsec;
last_state = 1-last_state;
}
}