LaundrySorcery

Log | Files | Refs

commit f8e45147139fdf6ef42b23c8a8be4ed1dfffdb79
parent cc02190335a6465cfa1be235ba12f61502fa0bc0
Author: Dominik Schmidt <das1993@hotmail.com>
Date:   Fri,  8 Jun 2018 14:17:38 +0000

Implement polling instead of ISRs

This prevents preemption of our worker thread and hence assures that we don't get a lot of timing variance.
We used to run into that problem because when the time required to charge the capacitor was high, we would have a huge variance.

Diffstat:
src/laundrysorcery.c | 28+++++++++++++++++++++++-----
1 file changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/laundrysorcery.c b/src/laundrysorcery.c @@ -131,19 +131,24 @@ void edge(void) { rising_edge(); } +unsigned long microseconds_since(struct timespec ts){ + struct timespec now; + clock_gettime(CLOCK_MONOTONIC, &now); + return (unsigned long)(now.tv_sec - ts.tv_sec)*1000000 + (unsigned long)(now.tv_nsec - ts.tv_nsec)/1000; +} + int main(int argc, char **argv) { wiringPiSetup () ; pinMode (0, OUTPUT) ; - //pinMode (1, INPUT) ; + pinMode (1, INPUT) ; if(argc != 2){ printf("Usage: %s </path/to/onfile>\n", argv[0]); return 0; } on_file=argv[1]; - wiringPiISR(1, INT_EDGE_BOTH, &edge); digitalWrite (0, LOW); delay(5); digitalWrite (0, HIGH); @@ -152,10 +157,23 @@ int main(int argc, char **argv) char buffer[512]; const char* arr[]={buffer}; + struct timespec secondtimer; + clock_gettime(CLOCK_MONOTONIC, &secondtimer); while(1) { - delay(1000); - snprintf(buffer,sizeof(buffer),"%lu:%e:%e:%e:%e:%e:%d",(unsigned long)time(NULL),running_mean,g_off.mean,g_off.variance,g_on.mean,g_on.variance,on); - rrd_update_r("database.rrd", NULL, 1, arr); + while(digitalRead(1)==0){ + ; + } + rising_edge(); + while(digitalRead(1)==1){ + ; + } + falling_edge(); + if(microseconds_since(secondtimer)>1000000){ + //delay(1000); + snprintf(buffer,sizeof(buffer),"%lu:%e:%e:%e:%e:%e:%d",(unsigned long)time(NULL),running_mean,g_off.mean,g_off.variance,g_on.mean,g_on.variance,on); + rrd_update_r("database.rrd", NULL, 1, arr); + clock_gettime(CLOCK_MONOTONIC, &secondtimer); + } } return 0; }