From cfadf5d51d550f4eed5179ecf13cdc72c52405ab Mon Sep 17 00:00:00 2001 From: Erich Eckner Date: Sat, 14 Nov 2020 20:52:01 +0100 Subject: CLOCK_MONOTONIC_RAW nehmen statt Zyklen zählen MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sensor.c | 56 ++++++++++++++++++++++++++++++++++++++------------------ 1 file 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; } } -- cgit v1.2.3-54-g00ecf